{"version":3,"sources":["node_modules/browser-pack/_prelude.js","TypeScripts/Common/saop-common.ts","TypeScripts/Components/saop-checkbox-switch.ts","TypeScripts/Components/saop-floating-label.ts","TypeScripts/Components/saop-grid-edit.ts","TypeScripts/Components/saop-grid-filter.ts","TypeScripts/Components/saop-grid.ts","TypeScripts/Components/saop-input-wfl.ts","TypeScripts/Components/saop-inputmask.ts","TypeScripts/Components/saop-menu-sidebar.ts","TypeScripts/Components/saop-message-dlg.ts","TypeScripts/Components/saop-multiselect.ts","TypeScripts/Components/saop-pdf-preview.ts","TypeScripts/Components/saop-pinch-and-zoom.ts","TypeScripts/Components/saop-popover.ts","TypeScripts/Components/saop-popup-dialog.ts","TypeScripts/Components/saop-right-sidebar.ts","TypeScripts/Components/saop-select-wfl.ts","TypeScripts/Components/saop-selectize-select.ts","TypeScripts/Components/saop-toggle-panel.ts","TypeScripts/Components/saop-treeview.ts","TypeScripts/Components/saop-view-spinner.ts","TypeScripts/Core/saop-services-core.ts","TypeScripts/Core/saop-translate.ts","TypeScripts/Core/saop-utils.ts","TypeScripts/Core/saop-view-form.ts","TypeScripts/main.ts"],"names":[],"mappings":"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","file":"saop_core_bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i\r\n\r\nexport abstract class global {\r\n public static debugMode: boolean;\r\n public static siteBaseUrl: string;\r\n\r\n public static ConsoleLogDegug(message: any): void {\r\n if (this.debugMode) console.log(message);\r\n }\r\n\r\n public static GetClientLogModeStorageKeyValue(): string {\r\n return \"SaopMojInfo.globalClientLogModeVal\";\r\n }\r\n\r\n public static GetClientLogModeStorageValue(): boolean {\r\n let debugModeDefaultValue = false;\r\n\r\n var debugModeStringVal = this.ReadVariableFromStorage(global.GetClientLogModeStorageKeyValue());\r\n\r\n let debugModeVal = debugModeDefaultValue;\r\n if (debugModeStringVal) {\r\n debugModeVal = debugModeStringVal === \"true\" ? true : false;\r\n }\r\n\r\n return debugModeVal;\r\n }\r\n\r\n public static SetClientLogModeStorageValue(): void {\r\n let logMode = this.GetClientLogModeStorageValue();\r\n this.WriteVariableToStorage(global.GetClientLogModeStorageKeyValue(), !logMode);\r\n\r\n alertify.message(\"Client log mode enabled: \" + !logMode);\r\n }\r\n\r\n public static getSiteBaseUrl(): string {\r\n return $(\"#siteBaseUrl\").val() as string;\r\n }\r\n\r\n public static setHelpLink(): void {\r\n //nastavi help link, v odvisnosti od lokalizacije\r\n let _this = this;\r\n let svgHelp: any = document.getElementById('saop-help');\r\n\r\n if(svgHelp != null)\r\n {\r\n let language = svgHelp.getAttribute(\"data-language\");\r\n\r\n //počakamo da se gneszdeni objekt naloži\r\n svgHelp.addEventListener(\"load\", function () {\r\n let svgHelpLink = svgHelp.contentDocument.getElementById(\"saop-help-link\");\r\n if (_this.isUnDefined(svgHelpLink) == false) {\r\n if (language == \"hr\") {\r\n svgHelpLink.setAttribute(\"href\", \"http://help.saop.hr/hr/mojinfo\");\r\n }\r\n else if (language == \"sr\") {\r\n svgHelpLink.setAttribute(\"href\", \"http://www.saop.rs/icenter/100/uputstva-za-upotrebu/\");\r\n }\r\n else {\r\n svgHelpLink.setAttribute(\"href\", \"https://si-icenter.knowledgeowl.com/help/mojinfo-navodila-za-uporabo-prenovljenega-portala\");\r\n }\r\n }\r\n });\r\n\r\n //zaradi braskalnik - mozilla firefox - izgleda, da je object ''loaded'' preden mu dodamo on loaded\r\n if($('#saop-help-link') != null)\r\n {\r\n const event = new Event('load');\r\n svgHelp.dispatchEvent(event);\r\n }\r\n }\r\n }\r\n\r\n public static formatDate(date: Date, format: string): string {\r\n const to2 = (n: number): string => ((Math.abs(n) < 10 ? '0' : '') + Math.abs(n));\r\n return format.replace(/[ydmh]+/gi, (match: string): string => {\r\n switch (match) {\r\n case 'yyyy': return date.getFullYear().toString();\r\n case 'd': return date.getDate().toString();\r\n case 'dd': return to2(date.getDate());\r\n case 'm': return (date.getMonth() + 1).toString();\r\n case 'mm': return to2(date.getMonth() + 1);\r\n case 'H': return date.getHours().toString();\r\n case 'HH': return to2(date.getHours());\r\n case 'MM': return to2(date.getMinutes());\r\n default:\r\n return match;\r\n }\r\n });\r\n }\r\n\r\n public static convertString2Date(stringDate: string, format: string): Date {\r\n global.ConsoleLogDegug(\"convertString2Date\");\r\n\r\n switch (format) {\r\n case \"dd.mm.yyyy\":\r\n let day = stringDate.substring(0, 2);\r\n let month = stringDate.substring(3, 5);\r\n let year = stringDate.substring(6, 10);\r\n\r\n return new Date(+year, +month - 1, +day);\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n public static convertString2Number(stringVal: string): number {\r\n global.ConsoleLogDegug(\"convertString2Number\");\r\n\r\n let numberVal = parseInt(stringVal)\r\n\r\n if (isNaN(numberVal)) {\r\n return null;\r\n }\r\n\r\n return numberVal;\r\n }\r\n\r\n public static setModalFormZIndex(modalFormId: string): void {\r\n global.ConsoleLogDegug(\"setModalFormZIndex\");\r\n global.ConsoleLogDegug(\"modalFormId:\" + modalFormId);\r\n var zIndex = 1050 + (10 * $('.modal:visible').length);\r\n\r\n $(modalFormId).css('z-index', zIndex);\r\n setTimeout(function () {\r\n $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');\r\n }, 0);\r\n }\r\n\r\n public static isEmpty(str: string) {\r\n return (!str || str.length === 0);\r\n }\r\n\r\n public static isUnDefined(_obj: any) {\r\n return (!_obj || _obj === null || typeof _obj === \"undefined\");\r\n }\r\n\r\n public static ReadVariableFromStorage(variableName: string): string {\r\n return localStorage.getItem(variableName);\r\n }\r\n\r\n public static WriteVariableToStorage(variableName: string, value: any): void {\r\n localStorage.setItem(variableName, value);\r\n }\r\n\r\n public static filterTableRows(filterVal: string, idTableElement: string): void {\r\n global.ConsoleLogDegug(\"filterTableRows\");\r\n\r\n let val = $.trim(filterVal).replace(/ +/g, ' ').toLowerCase();\r\n let rows = $(idTableElement + \" tr:has(td)\");\r\n\r\n rows.show().filter(function () {\r\n var text = $(this).text().replace(/\\s+/g, ' ').toLowerCase();\r\n return !~text.indexOf(val);\r\n }).hide();\r\n }\r\n\r\n public static setFirstFormControlToFocus(formId: string): void {\r\n global.ConsoleLogDegug(\"setFirstFormControlToFocus\");\r\n\r\n // brez timeout funkcije focus ne dela :(\r\n setTimeout(function () {\r\n var firstFormControl = $(formId + \" .form-control:visible:not(:disabled):first\");\r\n if (firstFormControl) {\r\n firstFormControl.focus();\r\n }\r\n }, 500);\r\n }\r\n\r\n public static getRelativeSiteURL(controller: string): string {\r\n let _url = window.location.href;\r\n let iC = _url.indexOf(controller);\r\n if (iC > 0) {\r\n return _url.substring(0, iC) + controller;\r\n } else {\r\n return window.location.href;\r\n }\r\n }\r\n\r\n public static getSiteAbsoluteURL(relativePath: string): string {\r\n let controller = relativePath.split(\"/\")[0];\r\n let method = relativePath.replace(controller, \"\").replace(\"//\", \"\");\r\n\r\n // če relative path že vsebuje http, ga ne dodamo\r\n if (relativePath.indexOf(\"http\") >= 0) {\r\n return relativePath;\r\n }\r\n\r\n return global.getSiteBaseUrl() + \"/\" + controller + method;\r\n }\r\n\r\n public static relodeCurrentPage(): void {\r\n window.location.reload();\r\n }\r\n\r\n public static getHtmlInputStringValue(parentId: string, elementId: string): string {\r\n let elementSelector = parentId === null ? elementId : parentId + \" \" + elementId;\r\n\r\n let element = $(elementSelector)\r\n return element.val().toString();\r\n }\r\n\r\n public static getHtmlInputNumericValue(parentId: string, elementId: string): number {\r\n return Number(this.getHtmlInputStringValue(parentId, elementId));\r\n }\r\n\r\n public static getHtmlInputBooleanValue(parentId: string, elementId: string): boolean {\r\n return this.getHtmlInputStringValue(parentId, elementId).toLowerCase() == \"true\" ? true : false;\r\n }\r\n\r\n public static getJQueryInputStringValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static getJQueryInputNumericValue(element: JQuery): number {\r\n let strVal = this.getJQueryInputStringValue(element);\r\n if (strVal == null || this.isEmpty(strVal)) {\r\n return null;\r\n }\r\n return Number(strVal);\r\n }\r\n\r\n public static getJQueryTextAreaStringValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static getJQuerySelectValue(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.val().toString();\r\n }\r\n\r\n public static isStringValueInStringValueList(stringValue: string, stringValueList: string[]): boolean {\r\n let retVal = false;\r\n\r\n stringValueList.forEach((item) => {\r\n if (item === stringValue) {\r\n retVal = true;\r\n }\r\n });\r\n\r\n return retVal;\r\n }\r\n\r\n public static getJQuerySelectText(element: JQuery): string {\r\n if (element.val() == null) {\r\n return null;\r\n }\r\n return element.find(\"option:selected\").text();\r\n }\r\n\r\n static copyToClipboard(copyText: string): void {\r\n navigator.clipboard.writeText(copyText);\r\n }\r\n}\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopCheckboxSwitch {\r\n\r\n init(parentElement: string = \"\") {\r\n this.checkboxSwitchOnClick(parentElement);\r\n this.switchLabelOnClick(parentElement);\r\n }\r\n\r\n checkboxSwitchOnClick(parentElement: string) {\r\n global.ConsoleLogDegug(\"saop-switch-checkbox...\");\r\n global.ConsoleLogDegug(\"saop-switch-checkbox parentElement: \" + parentElement);\r\n\r\n let _frame = $(\"\" + parentElement + \" *>.saop-switch-checkbox\");\r\n _frame.off(\"click\");\r\n _frame.click(function (event: any) {\r\n let _checkBox = event.target;\r\n let _atrParent = \"#\"+$(_checkBox).attr(\"for\");\r\n let _checkBoxP = $(\"\" + parentElement + \" *>\" + _atrParent);\r\n let _label1 = _checkBoxP.find(\"#saop-switch-label1\");\r\n let _label2 = _checkBoxP.find(\"#saop-switch-label2\");\r\n if (_checkBox.checked) {\r\n global.ConsoleLogDegug(\"checked\");\r\n _label1.removeClass('switch-label-on');\r\n _label1.addClass('switch-label-off');\r\n _label2.removeClass('switch-label-off');\r\n _label2.addClass('switch-label-on');\r\n } else {\r\n global.ConsoleLogDegug(\"unchecked\");\r\n _label1.removeClass('switch-label-off');\r\n _label1.addClass('switch-label-on');\r\n _label2.removeClass('switch-label-on');\r\n _label2.addClass('switch-label-off');\r\n }\r\n });\r\n }\r\n\r\n switchLabelOnClick(parentElement: string) {\r\n global.ConsoleLogDegug(\"saop-switch-label...\");\r\n global.ConsoleLogDegug(\"saop-switch-label parentElement: \" + parentElement);\r\n\r\n let _frame = $(\"\" + parentElement + \" *>.saop-switch-label\");\r\n _frame.off(\"click\");\r\n _frame.click(function (event: any) {\r\n let _switchLabel = event.target;\r\n let _atrCheckBox = \"#\"+$(_switchLabel).attr(\"for\");\r\n let _checkBox = $(_atrCheckBox);\r\n $(_checkBox).prop( 'checked', 'flase');\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopFloatingLabel {\r\n\r\n init() {\r\n let _this = this;\r\n $('.has-float-label > .form-control:not([readonly=\"readonly\"])').off(\"focus\",_this.saopInputOnFocus);\r\n $('.has-float-label > .form-control:not([readonly=\"readonly\"])').on(\"focus\",_this.saopInputOnFocus);\r\n\r\n $('.has-float-label > .form-control').off(\"blur\",_this.saopInputOnBlur);\r\n $('.has-float-label > .form-control').on(\"blur\",_this.saopInputOnBlur);\r\n \r\n $('.has-float-label > .form-control').off(\"focusout\",_this.saopInputOnChange);\r\n $('.has-float-label > .form-control').on(\"focusout\",_this.saopInputOnChange);\r\n\r\n }\r\n\r\n saopInputOnChange(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...saopInputOnChange\");\r\n let htmlElement = e.target;\r\n let _node = $(\"#\"+htmlElement.id);\r\n if (_node.length > 0){\r\n let _parentN = _node.parent();\r\n if (_parentN.length > 0){\r\n _parentN.removeClass(\"saop-error-input\");\r\n let _label = _parentN.find(\".text-danger\");\r\n if (_label.length > 0){\r\n _label.remove();\r\n }\r\n }\r\n }\r\n } \r\n\r\n saopInputOnFocus(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...\");\r\n //barvanje \"floating label\"\r\n let htmlElement = e.target;\r\n htmlElement.parentElement.querySelector('.saop-floating-label').classList.add(\"saop-txt-primary\");\r\n }\r\n \r\n saopInputOnBlur(e:any) {\r\n global.ConsoleLogDegug(\"saop-floating-label...\");\r\n //barvanje \"floating label\" on input blur (focus lost) nazaj v sivo (remove razred \"saop-txt-primary\")\r\n let htmlElement = e.target;\r\n htmlElement.parentElement.querySelector('.saop-floating-label').classList.remove(\"saop-txt-primary\");\r\n }\r\n\r\n\r\n setCaptionAsRequired(labelId:string,required:boolean):void{\r\n let _element = $(labelId);\r\n let _elementVal = _element.text().toString();\r\n _elementVal = _elementVal.replace(\"*\",\"\");\r\n if (required) {\r\n _element.text(_elementVal+\"*\");\r\n } else {\r\n _element.text(_elementVal);\r\n }\r\n } \r\n\r\n //\r\n}","/// \r\nimport { global } from \"../Common/saop-common\";\r\n\r\nclass selectItem {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nclass EditableColumnData {\r\n tip: string;\r\n selectItems: selectItem[];\r\n numericMinValue: number;\r\n numericMaxValue: number;\r\n}\r\n\r\nexport class SaopWebGridEdit {\r\n public libName: string; \r\n\r\n private _EditableColumnData: EditableColumnData;\r\n private _tdElement: HTMLTableCellElement;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n } \r\n\r\n showWebGridEditableColumnEditControl(tdElement: HTMLTableCellElement): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.showWebGridEditableColumnEditControl\");\r\n\r\n this._tdElement = tdElement;\r\n let tdElementHtml = this._tdElement.innerHTML;\r\n\r\n if (tdElementHtml.toLowerCase().indexOf(\"saop-table-edit-container\") >= 0) {\r\n // edit kontrola ze obstaja\r\n return;\r\n }\r\n\r\n this._EditableColumnData = this.getDataAttribute(this._tdElement);\r\n\r\n this.AddEditableColumnEditHtml(this._EditableColumnData.tip);\r\n }\r\n\r\n onWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.onWriteValueToTDElementComplete\");\r\n }\r\n\r\n private getDataAttribute(element: HTMLElement): EditableColumnData {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.getDataAttribute\");\r\n\r\n let data = new EditableColumnData();\r\n\r\n data.tip = element.getAttribute(\"data-edit-type\");\r\n data.selectItems = $.parseJSON(element.getAttribute(\"data-edit-select-items\"));\r\n data.numericMinValue = parseInt(element.getAttribute(\"data-edit-number-min\"));\r\n data.numericMaxValue = parseInt(element.getAttribute(\"data-edit-number-max\"));\r\n\r\n return data;\r\n }\r\n\r\n private AddEditableColumnEditHtml(tip: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.AddEditableColumnEditHtml\");\r\n\r\n let tdElementText = this._tdElement.innerText;\r\n\r\n let input = this.getInputElement(tip, tdElementText);\r\n\r\n let containerCellDiv = document.createElement('div');\r\n containerCellDiv.classList.add(\"saop-table-edit-container-cell\");\r\n containerCellDiv.appendChild(input);\r\n\r\n let containerDiv = document.createElement('div');\r\n containerDiv.classList.add(\"saop-table-edit-container\");\r\n containerDiv.appendChild(containerCellDiv);\r\n\r\n this._tdElement.innerHTML = containerDiv.outerHTML;\r\n\r\n this.setInputElementAfterInit(tip, tdElementText);\r\n }\r\n\r\n private getInputElement(tip: string, inputValue: string): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.getInputElement\");\r\n\r\n let input: HTMLElement;\r\n\r\n switch (tip) {\r\n case \"text\":\r\n input = this.generateTextHtml();\r\n break;\r\n case \"textarea\":\r\n input = this.generateTextareaHtml();\r\n break;\r\n case \"select\":\r\n input = this.generateSelectHtml(inputValue);\r\n break;\r\n case \"number\":\r\n input = this.generateNumberHtml();\r\n break;\r\n default:\r\n input = this.generateTextHtml();\r\n }\r\n\r\n return input;\r\n }\r\n\r\n private generateTextHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateTextHtml\");\r\n\r\n let input: HTMLInputElement;\r\n\r\n input = document.createElement('input');\r\n input.type = \"text\";\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n return input;\r\n }\r\n\r\n private generateTextareaHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateTextareaHtml\");\r\n\r\n let input: HTMLTextAreaElement;\r\n\r\n input = document.createElement('textarea');\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n input.classList.add(\"saop-table-edit-container-cell-input-textarea\");\r\n\r\n return input;\r\n } \r\n\r\n private generateSelectHtml(selectValue: string): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateSelectHtml\");\r\n\r\n let input: HTMLSelectElement;\r\n\r\n input = document.createElement(\"select\");\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n this._EditableColumnData.selectItems.forEach((item) => {\r\n input.options.add(new Option(item.text, item.value, selectValue === item.value));\r\n });\r\n\r\n return input;\r\n }\r\n\r\n private generateNumberHtml(): HTMLElement {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.generateNumberHtml\");\r\n\r\n let input: HTMLInputElement;\r\n\r\n input = document.createElement('input');\r\n input.type = \"number\";\r\n if (this._EditableColumnData.numericMinValue) {\r\n input.min = this._EditableColumnData.numericMinValue.toString();\r\n }\r\n if (this._EditableColumnData.numericMaxValue) {\r\n input.max = this._EditableColumnData.numericMaxValue.toString();\r\n }\r\n input.classList.add(\"saop-table-edit-container-cell-input\");\r\n\r\n return input;\r\n }\r\n\r\n private setInputElementAfterInit(tip: string, tdElementText: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.setInputElementAfterInit\");\r\n\r\n if (tip === \"text\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeInputValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"textarea\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"textarea\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeTextAreaValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"select\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"select\")[0];\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeSelectValueToTDElement.bind(this);\r\n }\r\n else if (tip === \"number\") {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeNumberValueToTDElement.bind(this);\r\n }\r\n else {\r\n let tdElementInput = this._tdElement.getElementsByTagName(\"input\")[0];\r\n tdElementInput.value = tdElementText;\r\n tdElementInput.focus();\r\n tdElementInput.onblur = this.writeInputValueToTDElement.bind(this);\r\n }\r\n }\r\n\r\n private writeValueToTDElement(element: HTMLElement, inputVal: string): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeValueToTDElement\");\r\n\r\n let tempElement = element;\r\n\r\n // poiscemo parent element, ki ima class saop-table-edit-container. Njegov parent je TD element.\r\n for (var i = 0; i < 10; i++) {\r\n if (tempElement.classList.contains(\"saop-table-edit-container\")) {\r\n let tdElement = tempElement.parentElement;\r\n tdElement.innerHTML = inputVal;\r\n\r\n this.onWriteValueToTDElementComplete(this._tdElement);\r\n break;\r\n }\r\n tempElement = tempElement.parentElement;\r\n }\r\n }\r\n\r\n private writeInputValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeInputValueToTDElement\");\r\n\r\n let target: HTMLInputElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v innerhtml vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeTextAreaValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeTextAreaValueToTDElement\");\r\n\r\n let target: HTMLTextAreaElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeSelectValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeSelectValueToTDElement\");\r\n\r\n let target: HTMLSelectElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n\r\n private writeNumberValueToTDElement(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopWebGridEdit.writeNumberValueToTDElement\");\r\n\r\n let target: HTMLInputElement = sender.target;\r\n let inputVal = target.value;\r\n\r\n // poiscemo parent, ki je TD element in v inner html vpisemo text value\r\n let parent = target.parentElement;\r\n this.writeValueToTDElement(parent, inputVal);\r\n }\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopInputWFL,SaopInputWFLProperties } from './saop-input-wfl'\r\nimport { SaopselectWFL } from './saop-select-wfl'\r\n\r\nexport class SaopWebGridFilter {\r\n public id:string = \"wgf1\";\r\n public modalFilterArray: any = [];\r\n //This function initializes the content inside the filter modal\r\n configFilter(libName:string,htmlTable: any, colArray: any) {\r\n let _this = this;\r\n setTimeout(function () {\r\n var tableName = htmlTable[0].id;\r\n var columns = htmlTable.api().columns();\r\n $.each(colArray, function (i, arg) {\r\n let _colNo = arg.toString();\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').attr(\"id\",\"column-header-\"+ _colNo +\"\");\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append('');\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append(\"   \");\r\n $('#' + tableName + ' th:eq(' + _colNo + ')').append(\"
\");\r\n });\r\n\r\n var template =\r\n '
' +\r\n '
' +\r\n '{0}
' +\r\n '
' +\r\n 'V redu' + \r\n 'Zbriši' +\r\n 'Prekliči' +\r\n '
' +\r\n '
';\r\n\r\n $.each(colArray, function (index: any, value: any) {\r\n columns.every(function (i: any) {\r\n if (value === i) {\r\n var column = this, \r\n content = '';//'
';\r\n var columnName = $(this.header()).text().replace(/\\s+/g, \"_\");\r\n var distinctArray: any[] = [];\r\n column.data().each(function (d: string, j: any) {\r\n if (distinctArray.indexOf(d) == -1) {\r\n var id = tableName + \"_\" + columnName + \"_\" + j; // onchange=\"formatValues(this,' + value + ');\r\n content += '
';\r\n distinctArray.push(d);\r\n }\r\n }); \r\n var newTemplate = $(template.replace('{0}', content).replace('{1}', value).replace('{1}', value).replace('{2}', tableName).replace('{2}', tableName));\r\n $('body').append(newTemplate);\r\n _this.modalFilterArray[tableName + \"_\" + value] = newTemplate;\r\n content = '';\r\n }\r\n });\r\n });\r\n }, 50);\r\n\r\n }\r\n\r\n\r\n //User to show the filter modal\r\n showFilter(e: any, index: any) {\r\n $('.modalFilter').hide();\r\n $(this.modalFilterArray[index]).css({ left: 0, top: 0 });\r\n var th = $(e.target).parent();\r\n var pos = th.offset();\r\n let arrayItem = this.modalFilterArray[index];\r\n //$(this.modalFilterArray[index]).width(th.width() * 0.75);\r\n $(arrayItem).css({ 'left': pos.left, 'top': pos.top, 'min-width':(th.width() * 0.75) });\r\n $(arrayItem).show();\r\n e.stopPropagation();\r\n }\r\n\r\n updateTableHeaderStatus(tableId:string,columnId:string,activeFilter:boolean){\r\n let _colFilterId = columnId+\"-filter\";\r\n let _colFilter = $(tableId).find(_colFilterId)[0];\r\n let _colFilterAtr = _colFilter.getAttribute(\"class\");\r\n if(activeFilter){\r\n _colFilterAtr.replace(\"saop-img-filter\", \"saop-img-filter saop-cl-blue\");\r\n } else {\r\n _colFilterAtr.replace(\"saop-img-filter saop-cl-blue\", \"saop-img-filter\");\r\n \r\n }\r\n }\r\n\r\n //This function is to use the searchbox to filter the checkbox\r\n filterValues(node: any) {\r\n var searchString = $(node).val().toString().toUpperCase().trim();\r\n var rootNode = $(node).parent();\r\n if (searchString == '') {\r\n rootNode.find('div').show();\r\n } else {\r\n rootNode.find(\"div\").hide();\r\n rootNode.find(\"div:contains('\" + searchString + \"')\").show();\r\n }\r\n }\r\n\r\n //Execute the filter on the table for a given column\r\n performFilter(node: any, i: any, tableId: any) {\r\n var rootNode = $(node).parent().parent();\r\n var searchString = '', counter = 0;\r\n\r\n rootNode.find('input:checkbox').each(function (index: any, checkbox: any) {\r\n if (checkbox.checked) {\r\n searchString += (counter == 0) ? checkbox.value : '|' + checkbox.value;\r\n counter++;\r\n }\r\n });\r\n\r\n let _colId = \"#column-header-\"+i.toString();\r\n if(counter > 0){\r\n this.updateTableHeaderStatus('#' +tableId,_colId,true);\r\n } else {\r\n this.updateTableHeaderStatus('#' +tableId,_colId,false);\r\n }\r\n\r\n $('#' + tableId).DataTable().column(i).search(\r\n searchString,\r\n true, false\r\n ).draw();\r\n rootNode.hide();\r\n }\r\n\r\n //Removes the filter from the table for a given column\r\n clearFilter(node: any, i: any, tableId: any) {\r\n var rootNode = $(node).parent().parent();\r\n rootNode.find(\".filterSearchText\").val('');\r\n rootNode.find('input:checkbox').each(function (index: any, checkbox: any) {\r\n checkbox.checked = false;\r\n $(checkbox).parent().show();\r\n });\r\n\r\n let _colId = \"#column-header-\"+i.toString();\r\n this.updateTableHeaderStatus('#' +tableId,_colId,false);\r\n\r\n $('#' + tableId).DataTable().column(i).search(\r\n '',\r\n true, false\r\n ).draw();\r\n rootNode.hide();\r\n }\r\n\r\n hideFilter(node: any, i: any, tableId: any) {\r\n $('.modalFilter').hide();\r\n }\r\n\r\n setResizeEvent(gridId:string){\r\n var _tableDiv = $(\"table\"+gridId+\" th\") as any;\r\n\t var thHeight = $(\"table\"+gridId+\" th:first\").height();\r\n\t _tableDiv.resizable({\r\n\t\t handles: \"e\",\r\n\t\t minHeight: thHeight,\r\n\t\t maxHeight: thHeight,\r\n\t\t minWidth: 40,\r\n\t\t resize: function (event:any, ui:any) {\r\n console.log(\"resize...\");\r\n var sizerid = \"#\" + $(event.target).attr(\"id\") + \"-sizer\";\r\n $(sizerid).width(ui.size.width);\r\n\t\t }\r\n\t }); \r\n }\r\n\r\n setSortElementEvent(gridId: string):void{\r\n let _this = this;\r\n $(gridId).on('click', 'th', function () {\r\n _this.setSortElement(gridId);\r\n });\r\n }\r\n \r\n setSortElement(gridId: string):void {\r\n $(\"\" + gridId + \" thead:first th\").each(function (i, th) {\r\n let _col = $(th);\r\n let _colId = \"#\"+_col.attr('id');\r\n //let _sortType = _col.attr(\"column-sort\");\r\n let _colIconIdUp = _colId+\"-icon-up\";\r\n let _colIconId = _colId+\"-icon\";\r\n let _colIconUpElement = $(gridId+' '+_colIconIdUp);\r\n let _colIconElement = $(gridId+' '+_colIconId);\r\n let cls = $(th).attr('class');\r\n\r\n //if (_sortType != null) {\r\n if (cls != null && cls.indexOf(\"no-sort\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\"); \r\n _colIconElement.removeClass(\"saop-cl-blue\"); \r\n } \r\n else if (cls != null && cls.indexOf(\"sorting_asc\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.addClass(\"saop-img-arrow-up saop-cl-blue\");\r\n } else if (cls != null && cls.indexOf(\"sorting_desc\") >= 0) {\r\n _colIconUpElement.removeClass(\"saop-img-arrow-down\");\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.addClass(\"saop-img-arrow-down saop-cl-blue\"); \r\n } else {\r\n _colIconElement.removeClass(\"saop-img-arrow-up\");\r\n _colIconElement.removeClass(\"saop-img-arrow-down\"); \r\n _colIconElement.removeClass(\"saop-cl-blue\"); \r\n _colIconElement.addClass(\"saop-img-arrow-up\");\r\n _colIconUpElement.addClass(\"saop-img-arrow-down\");\r\n }\r\n //}\r\n });\r\n } \r\n\r\n configSimpleFilter(dataTable: any):void {\r\n let _this = this;\r\n let tableId = \"#\"+dataTable[0].id;\r\n let _iCount = 0;\r\n var _filterEnable = false;\r\n let _th_columns = $(tableId).find('th');\r\n _th_columns.each( \r\n function () {\r\n _iCount = _iCount + 1;\r\n let _element = $(this);\r\n let _filterType = _element.attr(\"column-filter\"); \r\n let _nosort = _element.hasClass(\"no-sort\");\r\n let _actionColumn = _element.hasClass(\"saop-table-th-last\");\r\n _element.attr(\"id\",\"column-header-\"+ _iCount +\"\");\r\n _element.css(\"outline\",\"none\");\r\n let col_title = _element.text();\r\n //let col_max_width = col_title.length * 7;\r\n _element.text(\"\");\r\n\r\n //_element.append(\"
\"+col_title+\"
\");\r\n _element.append(\"
\"+col_title+\"
\");\r\n \r\n if (_filterType != null && _filterType.toLowerCase() == \"text\"){\r\n _filterEnable = true;\r\n } else if (_filterType != null && _filterType.toLowerCase() == \"dropdown\"){\r\n _filterEnable = true;\r\n }\r\n\r\n if (_actionColumn != null && _actionColumn == true){\r\n _nosort = true;\r\n }\r\n\r\n if (_nosort == null ||_nosort == false){\r\n _element.append(\"
\");\r\n _element.append(\"
\"); \r\n }\r\n _element.append(\"
\");\r\n }\r\n );\r\n\r\n if (_filterEnable) {\r\n $(tableId+' thead tr')\r\n .clone(true)\r\n .addClass('filters')\r\n .appendTo(tableId+' thead');\r\n\r\n // Setup - add a text input to each footer cell\r\n let _filters = $(tableId).find('.filters');\r\n let _filters_th = _filters.find('th');\r\n _iCount = 0;\r\n _filters_th.each( \r\n function () {\r\n _iCount = _iCount + 1;\r\n let _element = $(this);\r\n _element.off();\r\n\r\n _element.html(\"\");\r\n\r\n let _filterType = _element.attr(\"column-filter\");\r\n\r\n while(_element[0].attributes.length > 0)\r\n _element[0].removeAttribute(_element[0].attributes[0].name);\r\n\r\n let _colId = \"col_\"+_iCount.toString(); \r\n _element.attr(\"id\",_colId);\r\n let _inputId = _colId+\"_filter\"; \r\n let title = _element.text();\r\n \r\n if (_filterType != null && _filterType.toLowerCase() == \"text\"){\r\n let _inputE = new SaopInputWFL({id:_inputId,caption:title,placeholder:title}).getInnerHtml();\r\n _element.html(_inputE);\r\n } else if (_filterType != null && _filterType.toLowerCase() == \"dropdown\"){\r\n let _selectId = _colId+\"_select\"; \r\n let selectHtml = new SaopselectWFL({id:_selectId,caption:\"\",placeholder:\"\"}).getInnerHtml();\r\n let select = $(selectHtml); \r\n //\r\n\r\n let _index = _iCount;\r\n _index = _index - 1;\r\n\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .data()\r\n .unique()\r\n .sort()\r\n .each(function (d:any, j:any) {\r\n if (d.length > 0){\r\n let _content = d;\r\n let _firstChar = _content[0];\r\n if (_firstChar.charCodeAt(0) > 1000) {_content = _content.replace(_firstChar+\" \",\"\");}\r\n select.find('select').last().append('');\r\n }\r\n });\r\n\r\n _element.append(select);\r\n } \r\n } \r\n );\r\n\r\n // Apply the filter\r\n $(tableId+\" thead input\").on( 'keyup change', function () {\r\n const target = event.target as HTMLInputElement;\r\n let _index = $(this).parent().parent().index();\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .search( target.value )\r\n .draw();\r\n\r\n //var val = $.fn.dataTable.util.escapeRegex(target.value);\r\n //dataTable.DataTable().search(val ? '^' + val + '$' : '', true, false).draw();\r\n\r\n } ); \r\n \r\n // Apply the dropdown filter\r\n $(tableId+\" thead select\").on( 'change', function () {\r\n const target = event.target as HTMLInputElement;\r\n let _index = $(this).parent().parent().index();\r\n var val = $.fn.dataTable.util.escapeRegex(target.value);\r\n dataTable.DataTable()\r\n .column(_index+':visible')\r\n .search(val ? '^' + val + '$' : '', true, false)\r\n .draw();\r\n } ); \r\n\r\n //\r\n }\r\n\r\n\r\n }\r\n\r\n configSimpleSort(gridId: string):void {\r\n this.setSortElement(gridId);\r\n this.setSortElementEvent(gridId);\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopWebGridFilter } from \"../Components/saop-grid-filter\";\r\nimport { DataTables } from \"../@types/data-tables/types\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopWebGridEdit } from \"../Components/saop-grid-edit\";\r\n\r\n\r\n// function statusFormatter(row: number, cell: number, value: any, columnDef: Slick.Column, dataContext: Slick.SlickData) {\r\n// if (value == null || value === \"\") {\r\n// return \"-\";\r\n// } else if (value < 50) {\r\n// return \"\" + value + \"%\";\r\n// } else {\r\n// return \"\" + value + \"%\";\r\n// }\r\n// }\r\n\r\nexport interface SaopWebGridToolbar {\r\n id?:string,\r\n caption:string,\r\n buttons?:SaopWebGridToolbarButton[]\r\n itemsTemplateId?: string;\r\n} \r\n\r\nexport interface SaopWebGridToolbarButton {\r\n id:string,\r\n caption :string, \r\n class? :string,\r\n attributes?:string,\r\n onClickEvent?:string,\r\n template?: string;\r\n} \r\n\r\nexport interface SaopWebGridTogglePanel {\r\n enabled:boolean\r\n} \r\n\r\nexport interface SaopWebGridProperties {\r\n gridId:string\r\n ,css?:string\r\n ,togglePanel?:SaopWebGridTogglePanel\r\n ,toolbar?:SaopWebGridToolbar \r\n ,dataTable?:SaopWebDataTable\r\n}\r\n\r\nexport interface SaopWebDataTable {\r\n enabled:boolean\r\n ,columnDefsSettings?: DataTables.ColumnDefsSettings[]\r\n ,ordering?:boolean\r\n ,columns?:any[]\r\n ,data?: any\r\n ,order?: Array<(number | string)> | Array>\r\n ,editable?:boolean\r\n}\r\n\r\nexport class SaopWebGrid {\r\n private _properties:SaopWebGridProperties\r\n private _tableDiv:HTMLTableElement;\r\n private _translationService: SaopTranslationService;\r\n private _saopWebGridEdit: SaopWebGridEdit;\r\n //\r\n public libName: string; \r\n public webGridFilter:SaopWebGridFilter;\r\n public dataTable: DataTables.Api;\r\n public markedColumnCheckbox: JQuery;\r\n\r\n constructor(libName: string) {\r\n this.libName = libName;\r\n this.webGridFilter = new SaopWebGridFilter();\r\n this._translationService = new SaopTranslationService();\r\n this._saopWebGridEdit = new SaopWebGridEdit(\"_saopWebGridEdit\"); \r\n this._saopWebGridEdit.onWriteValueToTDElementComplete = this.onWriteValueToTDElementComplete.bind(this);\r\n } \r\n\r\n setTerminologyList(){\r\n let _terminology: string[] = ['Ni podatkov za prikaz.'];\r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n //\r\n init(gridProp:SaopWebGridProperties) {\r\n this._properties = gridProp;\r\n this._tableDiv = document.querySelector(gridProp.gridId) as HTMLTableElement;\r\n //\r\n let _togglePanelDefault = {enabled:true};\r\n gridProp.togglePanel = {..._togglePanelDefault, ...gridProp.togglePanel}\r\n if (global.isUnDefined(gridProp.togglePanel)){\r\n gridProp.togglePanel = _togglePanelDefault;\r\n } \r\n //\r\n\r\n this.webGridFilter.id = gridProp.gridId+\"filter\";\r\n this.generateHtmlTable();\r\n this.addGridToolbar();\r\n // det defaults\r\n let _Msg_emptyTable = this._translationService.translate(\"Ni podatkov za prikaz.\")\r\n\r\n let _dataTableDef = {enabled:true,ordering:true};\r\n gridProp.dataTable = {..._dataTableDef, ...gridProp.dataTable}\r\n\r\n if (global.isUnDefined(gridProp.dataTable)){\r\n gridProp.dataTable = gridProp.dataTable;\r\n } \r\n\r\n let _columnDefsSettingsDef = [{orderable: true, targets: \"no-sort\"}];\r\n gridProp.dataTable.columnDefsSettings = {..._columnDefsSettingsDef,...gridProp.dataTable.columnDefsSettings}\r\n\r\n if (global.isUnDefined(gridProp.dataTable.columnDefsSettings)){\r\n gridProp.dataTable.columnDefsSettings = _columnDefsSettingsDef;\r\n }\r\n //\r\n if (!global.isUnDefined(this._properties.dataTable) \r\n && this._properties.dataTable.enabled\r\n ){\r\n let _this = this;\r\n this.dataTable = \r\n $(gridProp.gridId).DataTable(\r\n {\r\n \"paging\": false\r\n , \"searching\": true\r\n ,\"autoWidth\": true\r\n ,orderCellsTop: true\r\n //, \"dom\": \"Rlfrtip\"\r\n , initComplete: function () {\r\n if (gridProp.dataTable.ordering){\r\n _this.webGridFilter.configSimpleFilter(this); \r\n _this.webGridFilter.configSimpleSort(_this._properties.gridId); \r\n }\r\n //if(!isUnDefined(_this._properties.dataTable.filters)) {\r\n // _this.webGridFilter.configFilter(_this.libName,this, _this._properties.dataTable.filters);\r\n //}\r\n }\r\n ,order: _this._properties.dataTable.order\r\n // ,ajax: function (data, callback, settings) {\r\n // callback({ data: data }) //reloads data \r\n // } \r\n ,columnDefs: _this._properties.dataTable.columnDefsSettings \r\n ,ordering : gridProp.dataTable.ordering \r\n ,language : {emptyTable:_Msg_emptyTable,zeroRecords:_Msg_emptyTable}\r\n }\r\n ); \r\n //\r\n $(gridProp.gridId+\"_filter\").remove();\r\n $(gridProp.gridId+\"_info\").remove(); \r\n this.webGridFilter.setResizeEvent(this._properties.gridId);\r\n //\r\n }\r\n \r\n //\r\n if (this._properties.dataTable.editable) {\r\n this.initWebGridEditableColumnClickEvents();\r\n }\r\n }\r\n\r\n addToolbarButtons(gridPanel: JQuery,buttons:SaopWebGridToolbarButton[]){\r\n if(global.isUnDefined(buttons) == false){\r\n buttons.forEach(_button => {\r\n var buttonTemplate = \r\n `\r\n
\r\n \r\n
\r\n `;\r\n\r\n if (_button.template != null) {\r\n buttonTemplate = _button.template;\r\n }\r\n\r\n gridPanel.find(\"#toolbarButtons\").append(buttonTemplate); \r\n });\r\n }\r\n }\r\n\r\n generateHtmlTable() {\r\n this.generateTableBody(); \r\n this.generateTableHead();\r\n }\r\n\r\n generateTableHead() {\r\n if (!global.isUnDefined(this._properties.dataTable)){\r\n if(!global.isUnDefined(this._properties.dataTable.columns)){\r\n let thead = this._tableDiv.createTHead();\r\n let row = thead.insertRow();\r\n for (let key of this._properties.dataTable.columns) {\r\n let th = document.createElement(\"th\");\r\n let text = document.createTextNode(key.name);\r\n th.appendChild(text);\r\n row.appendChild(th);\r\n }\r\n }\r\n }\r\n }\r\n \r\n generateTableBody() {\r\n if (!global.isUnDefined(this._properties.dataTable)){\r\n if (!global.isUnDefined(this._properties.dataTable.data)){\r\n for (let element of this._properties.dataTable.data) {\r\n let row = this._tableDiv.insertRow();\r\n for (let key in element) {\r\n let cell = row.insertCell();\r\n let text = document.createTextNode(element[key]);\r\n cell.appendChild(text);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n addGridToolbar() {\r\n let gridPanel: JQuery;\r\n let _css = global.isUnDefined(this._properties.css) == false ? this._properties.css :\"\";\r\n\r\n let gridPanelTemplate = `\r\n
\r\n
\r\n
\r\n `;\r\n if (!global.isUnDefined(this._properties.toolbar)) {\r\n if (global.isUnDefined(this._properties.toolbar.id)) {\r\n this._properties.toolbar.id = this._properties.gridId+\"TB\";\r\n }\r\n let gridTogglePanel = ``;\r\n let gridTogglePanelClass = \"\";\r\n let gridBorderBottom = \"\";\r\n if(this._properties.togglePanel.enabled) {\r\n gridTogglePanelClass = \"collapse show\";\r\n gridBorderBottom = \"saop-border-bottom\";\r\n\r\n gridTogglePanel = \r\n `\r\n
\r\n

\r\n ${this._properties.toolbar.caption} \r\n

\r\n
\r\n `; \r\n }\r\n\r\n let _toolbarItems = ``;\r\n if (!global.isUnDefined(this._properties.toolbar.itemsTemplateId)){\r\n let _toolbarItemsTemplate = $(this._properties.toolbar.itemsTemplateId);\r\n if (_toolbarItemsTemplate.length > 0){\r\n _toolbarItems = _toolbarItemsTemplate.html();\r\n _toolbarItemsTemplate.remove();\r\n }\r\n }\r\n\r\n gridPanelTemplate = `\r\n
\r\n ${gridTogglePanel}\r\n
\r\n
\r\n
\r\n ${_toolbarItems}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n `;\r\n }\r\n gridPanelTemplate = gridPanelTemplate.replace(\"#slickGrid#\",this._properties.gridId.replace(\"#\",\"\"));\r\n gridPanel = $(gridPanelTemplate);\r\n if (!global.isUnDefined(this._properties.toolbar)) {\r\n this.addToolbarButtons(gridPanel,this._properties.toolbar.buttons);\r\n }\r\n\r\n let _tableHtml = this._tableDiv;\r\n\r\n $(this._properties.gridId).replaceWith(gridPanel);\r\n\r\n $(this._properties.gridId).replaceWith(_tableHtml);\r\n }\r\n\r\n refreshData(data:any) {\r\n let _this = this;\r\n this.dataTable.clear();\r\n data.each(function( index:any, tr:string ) {\r\n _this.dataTable.row.add($(tr));\r\n });\r\n this.dataTable.draw(); \r\n }\r\n\r\n replaceGridRows(htmlContent:string) {\r\n let _this = this;\r\n this.dataTable.clear();\r\n $(this._properties.gridId+\" > tbody > tr\", $(htmlContent)).each(\r\n function(index:any,tr:any) {\r\n _this.dataTable.row.add($(tr));\r\n }\r\n );\r\n this.dataTable.draw(); \r\n } \r\n\r\n setTabelFoother():void {\r\n $(this._properties.gridId+' body') \r\n }\r\n\r\n initWebGridColumnCheckboxBindClickEvent() {\r\n let _this = this;\r\n this.markedColumnCheckbox = null;\r\n\r\n if (global.isUnDefined(this._tableDiv)) {\r\n return;\r\n }\r\n\r\n $(\"#\" + this._tableDiv.id + \" .saop-td-input-checkbox\").off(\"change\");\r\n $(\"#\" + this._tableDiv.id + \" .saop-td-input-checkbox\").on('change', function (row) {\r\n _this.markedColumnCheckbox = $(\"#\" + _this._tableDiv.id + \" #\" + row.currentTarget.id);\r\n\r\n // odznacimo vse ostale checkboxe\r\n $(\"#\" + _this._tableDiv.id + \" input.saop-td-input-checkbox:not(#\" + row.currentTarget.id + \")\").each(\r\n function () {\r\n $(\"#\" + _this._tableDiv.id + \" #\" + this.id).prop(\"checked\", false);\r\n }\r\n );\r\n\r\n _this.afterColumnCheckboxChanged();\r\n });\r\n }\r\n\r\n afterColumnCheckboxChanged(): void {\r\n\r\n }\r\n\r\n initWebGridEditableColumnClickEvents(): void {\r\n let _this = this;\r\n\r\n $(this._properties.gridId).off(\"click\", \"tbody td[data-editable='true']\");\r\n $(this._properties.gridId).on(\"click\", \"tbody td[data-editable='true']\", function (e) {\r\n _this._saopWebGridEdit.showWebGridEditableColumnEditControl(this);\r\n });\r\n }\r\n \r\n private onWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n this.onEditTdCellWriteValueToTDElementComplete(tdElement);\r\n }\r\n\r\n onEditTdCellWriteValueToTDElementComplete(tdElement: HTMLTableCellElement): void {\r\n // metoda za externo uporabo\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\nexport interface SaopInputWFLProperties {\r\n id:string;\r\n placeholder:string;\r\n caption:string;\r\n}\r\n\r\nexport class SaopInputWFL {\r\n private _inputTemplate:string;\r\n constructor(properties:SaopInputWFLProperties) {\r\n this._inputTemplate = \r\n `\r\n \r\n \r\n \r\n \r\n `; \r\n // this._inputTemplate = \r\n // `\r\n // \r\n // \r\n // \r\n // \r\n // \r\n // `; \r\n }\r\n\r\n getElement():JQuery{\r\n let _element = $(this._inputTemplate);\r\n return _element;\r\n }\r\n\r\n getInnerHtml():string{\r\n return this._inputTemplate;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","\r\n/// \r\n/// \r\n\r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopSelectizeSelect } from \"./saop-selectize-select\";\r\n\r\nexport class SaopInputMask {\r\n\r\n init() {\r\n global.ConsoleLogDegug(\"SaopInputMask.init...\");\r\n var inputDivs = document.querySelectorAll('input[data-inputmask-alias]');\r\n Inputmask().mask(inputDivs);\r\n\r\n $(\".saop-decimal-2\").inputmask({\r\n 'alias': 'decimal',\r\n 'radixPoint': ',',\r\n 'digits': 2,\r\n 'digitsOptional': false,\r\n 'placeholder': '0,00'\r\n });\r\n\r\n $(\".saop-decimal-3\").inputmask({\r\n 'alias': 'decimal',\r\n 'radixPoint': ',',\r\n 'digits': 3,\r\n 'digitsOptional': false,\r\n 'placeholder': '0,000'\r\n }); \r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let spanDiv:any;\r\n let elementAtrr = $(element).attr(\"data-inputmask-alias\");\r\n if (global.isEmpty(elementAtrr)) {return;};\r\n global.ConsoleLogDegug(elementAtrr);\r\n spanDiv = $(element).parent();\r\n if (spanDiv === null) { return;};\r\n if (spanDiv.hasClass(\"has-float-label\")===false) { return;};\r\n global.ConsoleLogDegug(spanDiv.get(0).id);\r\n\r\n let languageAtrr = (String)($(\"#siteLanguage\").val());\r\n global.ConsoleLogDegug(\"language:\"+languageAtrr);\r\n languageAtrr = global.isEmpty(languageAtrr) ? \"sl\" :languageAtrr;\r\n global.ConsoleLogDegug(\"language:\"+languageAtrr);\r\n\r\n if (elementAtrr === \"hh:mm:ss\") {\r\n let iconBtn = $(spanDiv).find(\"#timeIcon\");\r\n global.ConsoleLogDegug(\"clock...\");\r\n\r\n global.ConsoleLogDegug(\"clock.blur.init:\" + element.id);\r\n $(element).blur(function (event: any) {\r\n global.ConsoleLogDegug(\"call.clock.blur:\" + event.target.id);\r\n var controlValue = event.target.value;\r\n if (controlValue.includes(\"h\")) {\r\n event.target.value = \"\";\r\n return;\r\n }\r\n controlValue = controlValue.replace(\"mm\", \"00\");\r\n controlValue = controlValue.replace(\"m\", \"0\");\r\n controlValue = controlValue.replace(\"ss\", \"00\");\r\n controlValue = controlValue.replace(\"s\", \"0\");\r\n event.target.value = controlValue;\r\n // prozimo input even, ker smo vpisali novo vrednost \r\n const e = new Event(\"input\");\r\n event.target.dispatchEvent(e);\r\n });\r\n\r\n global.ConsoleLogDegug(\"clock.click.init:\" + element.id);\r\n $(iconBtn).click(function (event: any) {\r\n global.ConsoleLogDegug(\"clockIcon.clicked:\" + element.id);\r\n var ctrlInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var ctrlInputCtrlStrLength = ctrlInputCtrl.value.length * 2;\r\n ctrlInputCtrl.focus();\r\n ctrlInputCtrl.setSelectionRange(ctrlInputCtrlStrLength, ctrlInputCtrlStrLength);\r\n });\r\n } else if (elementAtrr === \"dd.mm.yyyy\" \r\n // || elementAtrr === \"dd.mm.yyyy hh:mm\" \r\n // || elementAtrr === \"dd.mm.yyyy hh:mm:ss\"\r\n ) {\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n\r\n global.ConsoleLogDegug(\"calendar...\");\r\n\r\n let datepickerStartDate = new Date();\r\n if ($(element).attr(\"data-enable-select-pastdates\") != undefined) {\r\n if (($(element).attr(\"data-enable-select-pastdates\")).toLowerCase() == 'true') {\r\n datepickerStartDate = null;\r\n }\r\n }\r\n\r\n if ($(element).attr(\"data-min-start-date\") != undefined) {\r\n var datepickerStartDate1 = $(element).attr(\"data-min-start-date\");\r\n datepickerStartDate = global.convertString2Date(datepickerStartDate1, \"dd.mm.yyyy\");\r\n }\r\n\r\n let datepickerEndDate = null;\r\n if ($(element).attr(\"data-max-end-date\") != undefined) {\r\n datepickerEndDate = $(element).attr(\"data-max-end-date\"); \r\n datepickerEndDate = global.convertString2Date(datepickerEndDate, \"dd.mm.yyyy\");\r\n }\r\n\r\n $(element).datepicker({\r\n startDate: datepickerStartDate,\r\n endDate: datepickerEndDate,\r\n autoclose: true,\r\n keyboardNavigation: false,\r\n weekStart: 1,\r\n format: \"dd.mm.yyyy\",\r\n language: languageAtrr,\r\n orientation: \"bottom right\",\r\n showOnFocus:false\r\n //forceParse:false,\r\n }); \r\n\r\n $(iconBtn).click(function() \r\n {\r\n global.ConsoleLogDegug(\"calendar...click\");\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var datepickerInputCtrlStrLength = datepickerInputCtrl.value.length * 2;\r\n //datepickerInputCtrl.focus();\r\n $(element).datepicker(\"show\");\r\n datepickerInputCtrl.setSelectionRange(datepickerInputCtrlStrLength, datepickerInputCtrlStrLength)\r\n }); \r\n \r\n } else if (elementAtrr === \"dd.mm.yyyy hh:mm\") {\r\n global.ConsoleLogDegug(\"datetimepicker hh:mm ...\");\r\n \r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n //\r\n $(element)\r\n .bind('keydown',function(e){\r\n\r\n e.stopImmediatePropagation();\r\n }) \r\n .datetimepicker({\r\n format: 'DD.MM.YYYY H:mm',\r\n locale: languageAtrr,\r\n showTodayButton: true,\r\n });\r\n\r\n $(element).off(\"focus\");\r\n\r\n $(iconBtn).click(function() \r\n {\r\n $(element).data(\"DateTimePicker\").show();\r\n }); \r\n \r\n } else if (elementAtrr === \"dd.mm.yyyy hh:mm:ss\") {\r\n global.ConsoleLogDegug(\"datetimepicker hh:mm:ss ...\");\r\n \r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n //\r\n $(element)\r\n .bind('keydown',function(e){\r\n\r\n e.stopImmediatePropagation();\r\n }) \r\n .datetimepicker({\r\n format: 'DD.MM.YYYY H:mm:ss',\r\n locale: languageAtrr,\r\n showTodayButton: true,\r\n });\r\n\r\n $(element).off(\"focus\");\r\n //$(element).off(\"keydown\");\r\n // .on('dp.hide', function(e){\r\n // console.log('dp.hide');\r\n // }) \r\n // .on('dp.show', function(e){\r\n // console.log('dp.show');\r\n // }); \r\n //\r\n $(iconBtn).click(function() \r\n {\r\n // global.ConsoleLogDegug(\"calendar...click\");\r\n // if ($(document).find(\".datepicker-dropdown\").is(\":visible\")) {\r\n $(element).data(\"DateTimePicker\").show();\r\n }); \r\n \r\n // $(element).focus(function (event: any) {\r\n // $(element).data(\"DateTimePicker\").hide(); \r\n // }); \r\n } else {\r\n console.log(\"not implemented...\");\r\n }\r\n\r\n });\r\n\r\n this.initMultiDateSelectDatepicker();\r\n\r\n this.initSelectizeSelect();\r\n\r\n this.initSelectizeMultiselectSelect();\r\n\r\n global.ConsoleLogDegug(\"initInputs...done\");\r\n }\r\n\r\n private initMultiDateSelectDatepicker(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initMultiDateSelectDatepicker...\");\r\n\r\n var inputDivs = document.querySelectorAll('input[data-izbor-vec-dni]');\r\n\r\n inputDivs.forEach(element => {\r\n global.ConsoleLogDegug(\"element.init......................\" + element.id);\r\n\r\n let spanDiv: any;\r\n spanDiv = $(element).parent();\r\n if (spanDiv === null) { return; };\r\n if (spanDiv.hasClass(\"has-float-label\") === false) { return; };\r\n global.ConsoleLogDegug(spanDiv.get(0).id);\r\n\r\n let languageAtrr = (String)($(\"#siteLanguage\").val());\r\n global.ConsoleLogDegug(\"language:\" + languageAtrr);\r\n languageAtrr = global.isEmpty(languageAtrr) ? \"sl\" : languageAtrr;\r\n global.ConsoleLogDegug(\"language:\" + languageAtrr);\r\n\r\n let iconBtn = $(spanDiv).find(\"#calendarIcon\");\r\n\r\n global.ConsoleLogDegug(\"calendar...\");\r\n\r\n let datepickerStartDate = new Date();\r\n if ($(element).attr(\"data-enable-select-pastdates\") != undefined) {\r\n if (($(element).attr(\"data-enable-select-pastdates\")).toLowerCase() == 'true') {\r\n datepickerStartDate = null;\r\n }\r\n }\r\n\r\n if ($(element).attr(\"data-min-start-date\") != undefined) {\r\n var datepickerStartDate1 = $(element).attr(\"data-min-start-date\");\r\n datepickerStartDate = global.convertString2Date(datepickerStartDate1, \"dd.mm.yyyy\");\r\n }\r\n\r\n let datepickerEndDate = null;\r\n if ($(element).attr(\"data-max-end-date\") != undefined) {\r\n datepickerEndDate = $(element).attr(\"data-max-end-date\");\r\n datepickerEndDate = global.convertString2Date(datepickerEndDate, \"dd.mm.yyyy\");\r\n }\r\n\r\n $(element).datepicker({\r\n startDate: datepickerStartDate,\r\n endDate: datepickerEndDate,\r\n autoclose: false,\r\n multidate: true,\r\n keyboardNavigation: false,\r\n weekStart: 1,\r\n format: \"dd.mm.yyyy\",\r\n language: languageAtrr,\r\n orientation: \"bottom right\"\r\n });\r\n\r\n $(iconBtn).click(function () {\r\n global.ConsoleLogDegug(\"calendar...click\");\r\n var datepickerInputCtrl = $(element).get(0) as HTMLInputElement;\r\n var datepickerInputCtrlStrLength = datepickerInputCtrl.value.length * 2;\r\n datepickerInputCtrl.focus();\r\n datepickerInputCtrl.setSelectionRange(datepickerInputCtrlStrLength, datepickerInputCtrlStrLength)\r\n });\r\n\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initMultiDateSelectDatepicker...done\");\r\n }\r\n\r\n private initSelectizeSelect(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeSelect...\");\r\n\r\n $('.selectizeSelect').each(function () {\r\n let saopSelectelement = new SaopSelectizeSelect();\r\n saopSelectelement.initControlByHtml(this);\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeSelect...done\");\r\n }\r\n\r\n private initSelectizeMultiselectSelect(): void {\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeMultiselectSelect...\");\r\n\r\n $('.selectizeMultiselect').each(function () {\r\n let saopSelectelement = new SaopSelectizeSelect();\r\n saopSelectelement.initMultiselectControlByHtml(this);\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopInputMask.initSelectizeMultiselectSelect...done\");\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopPopover } from \"../Components/saop-popover\";\r\n\r\nexport class MenuSidebar {\r\n\r\n protected _collElement: HTMLElement;\r\n protected _expElement: HTMLElement;\r\n private _menuSidebarPopover: SaopPopover;\r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.init...\");\r\n\r\n this._collElement = document.getElementById(\"collapse-icon-coll\");\r\n this._expElement = document.getElementById(\"collapse-icon-exp\");\r\n if (this._collElement != null) this._collElement.style.display = \"none\";\r\n if (this._expElement != null) this._expElement.style.display = \"block\";\r\n\r\n let _this = this;\r\n\r\n // Expand icon click\r\n $(\"#collapse-icon-exp\").off(\"click\");\r\n $(\"#collapse-icon-exp\").on('click', function () {\r\n global.ConsoleLogDegug(\"MenuSidebar.collapse-icon-exp.click\");\r\n\r\n _this._menuSidebarPopover.enablePopover();\r\n });\r\n\r\n // Collapse icon click\r\n $(\"#collapse-icon-coll\").off(\"click\");\r\n $(\"#collapse-icon-coll\").on('click', function () {\r\n global.ConsoleLogDegug(\"MenuSidebar.collapse-icon-coll.click\");\r\n\r\n _this._menuSidebarPopover.disablePopover();\r\n });\r\n\r\n // Collapse click\r\n $('[data-toggle=sidebar-colapse]').click(\r\n function () {\r\n _this.sidebarCollapse();\r\n }\r\n );\r\n\r\n //menu item click\r\n $(\".saop-bg-item\").click(\r\n function () {\r\n //sessionStorage.setItem(\"saop-menu-previous-item-id\", sessionStorage.getItem(\"saop-menu-item-id\"));\r\n //sessionStorage.setItem(\"saop-menu-item-id\", this.id);\r\n //sessionStorage.setItem(\"saop-menu-subitem-id\", \"0\");\r\n }\r\n )\r\n\r\n //menu sub-item click\r\n //$(\".saop-bg-subitem\").click(\r\n // function(){\r\n // sessionStorage.setItem(\"saop-menu-subitem-id\", this.id);\r\n // }\r\n //)\r\n\r\n if (document.getElementById(\"menu-sidebar\") != null)\r\n this.GetSessionStorageValues();\r\n else\r\n this.DeleteSessionStorageValues();\r\n\r\n this.initMenuSidebarPopover();\r\n }\r\n\r\n protected sidebarCollapse(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.sidebarCollapse\");\r\n $('#menuTopIconLarge').toggleClass('d-none');\r\n $('#menuTopIconSmall').toggleClass('d-none');\r\n $('.sidebar-menu-caption').toggleClass('d-none');\r\n $('#sidebar-container').toggleClass('sidebar-expanded sidebar-collapsed');\r\n $('.saop-bg-subitems').toggleClass('d-none');\r\n $('#menuCloseButton').toggleClass('d-none');\r\n var SeparatorTitle = $('#sidebar-container');\r\n if (SeparatorTitle.hasClass('sidebar-collapsed')) {\r\n sessionStorage.setItem(\"saop-menu-sidebar-expanded\", \"true\")\r\n this._collElement.style.display = \"block\";\r\n this._expElement.style.display = \"none\";\r\n } else {\r\n sessionStorage.setItem(\"saop-menu-sidebar-expanded\", \"false\")\r\n this._collElement.style.display = \"none\";\r\n this._expElement.style.display = \"block\";\r\n }\r\n }\r\n\r\n protected menuItemCollapse(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.menuItemCollapse\");\r\n //var previousItemID = sessionStorage.getItem(\"saop-menu-item-id\");\r\n //var itemID = sessionStorage.getItem(\"saop-menu-item-id\");\r\n //var subitemsID = itemID+\"-collapse\";\r\n //var subitemID = sessionStorage.getItem(\"saop-menu-subitem-id\");\r\n\r\n //var previous = $(\"#\" + previousItemID);\r\n //var item = $('#'+itemID);\r\n //var subitems = $(\"#\" + subitemsID);\r\n //var subitem = $(\"#\"+subitemsID+\">#\"+subitemID);\r\n\r\n //previous.removeClass(\"saop-bg-item-selected\");//'un-color' previous item\r\n //previous[0].setAttribute(\"aria-expanded\", \"false\");\r\n //item[0].setAttribute(\"aria-expanded\", \"true\");\r\n //item.addClass(\"saop-bg-item-selected\");//color item\r\n //subitems.addClass('show');//expand collapse\r\n //subitem.addClass(\"saop-bg-subitem-selected\");//color subitem\r\n }\r\n\r\n protected GetSessionStorageValues(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.GetSessionStorageValues\");\r\n //defaults\r\n //if (sessionStorage.getItem(\"saop-menu-item-id\") == null) {\r\n //sessionStorage.setItem(\"saop-menu-sidebar-expanded\", null);\r\n // sessionStorage.setItem(\"saop-menu-previous-item-id\", null);\r\n // sessionStorage.setItem(\"saop-menu-item-id\", \"namizje\");\r\n // sessionStorage.setItem(\"saop-menu-subitem-id\", \"0\");\r\n //}\r\n\r\n //sidebar expanded/contracted\r\n if (sessionStorage.getItem(\"saop-menu-sidebar-expanded\") == \"true\") {\r\n this.sidebarCollapse();\r\n }\r\n\r\n //selected-menu item\r\n this.menuItemCollapse()\r\n }\r\n\r\n protected DeleteSessionStorageValues(): void {\r\n global.ConsoleLogDegug(\"MenuSidebar.DeleteSessionStorageValues\");\r\n\r\n sessionStorage.removeItem(\"saop-menu-sidebar-expanded\");\r\n //sessionStorage.removeItem(\"saop-menu-previous-item-id\");\r\n //sessionStorage.removeItem(\"saop-menu-item-id\");\r\n //sessionStorage.removeItem(\"saop-menu-subitem-id\");\r\n }\r\n\r\n initMenuSidebarPopover() {\r\n global.ConsoleLogDegug(\"MenuSidebar.initMenuSidebarPopover\");\r\n\r\n this._menuSidebarPopover = new SaopPopover(\".menu-popup\");\r\n this._menuSidebarPopover.initSelfContainerPopover();\r\n this._menuSidebarPopover.disablePopover();\r\n\r\n var elementVisible = $(\"#collapse-icon-coll\").is(':visible');\r\n if (elementVisible) {\r\n this._menuSidebarPopover.enablePopover();\r\n } else {\r\n this._menuSidebarPopover.disablePopover();\r\n }\r\n\r\n }\r\n}\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport enum SaopMsgDlgType {\r\n mtInformation = 1\r\n ,mtWarning = 2\r\n ,mtError = 3\r\n //, mtConfirmation, mtCustom\r\n}\r\n\r\nexport enum SaopMsgDlgButton {\r\n mbNone = 0\r\n ,mbOK = 1\r\n ,mbCancel = 2\r\n ,mbYes = 3\r\n ,mbNo = 4\r\n}\r\n\r\nexport interface SaopMsgDlgEvent {\r\n parent:any;\r\n data:any;\r\n}\r\n\r\ntype SaopMsgDlgButtons = Array;\r\n\r\n\r\n\r\nexport class SaopMessageDlg {\r\n private _sender:SaopMsgDlgEvent;\r\n public onOk: (sender:any) => any = null;\r\n public onCancel: (sender:any) => any = null;\r\n public onYes: (sender:any) => any = null;\r\n public onNo: (sender:any) => any = null;\r\n\r\n constructor(sender:SaopMsgDlgEvent){\r\n this._sender = sender;\r\n }\r\n\r\n Show(Msg:string,Title:string,DlgType:SaopMsgDlgType = SaopMsgDlgType.mtInformation,Buttons:SaopMsgDlgButtons = [SaopMsgDlgButton.mbOK]):SaopMsgDlgButton{\r\n console.log(\"message:\"+Msg);\r\n console.log(\"title:\"+Title);\r\n let _this = this;\r\n\r\n let titleDiv = $('#alert-modal-title-div');\r\n let bodyTag = $('#alert-modal-body');\r\n\r\n if (DlgType == SaopMsgDlgType.mtInformation){\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"white\");\r\n } else if (DlgType == SaopMsgDlgType.mtError) {\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"#D82C25\");\r\n } else {\r\n $(\"#alert-modal-title-div\").css(\"background-color\",\"silver\"); \r\n }\r\n\r\n if (!global.isEmpty(Title)){\r\n titleDiv.html(Title);\r\n }\r\n \r\n bodyTag.html(Msg);\r\n\r\n if (Buttons !== null) {\r\n let _element_mbOK = Buttons.find(element => element === SaopMsgDlgButton.mbOK);\r\n if (global.isUnDefined(_element_mbOK)) {\r\n $(\"#btnAlertOK\").remove();\r\n } else {\r\n $(\"#btnAlertOK\").off(\"click\");\r\n $(\"#btnAlertOK\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onOk)){\r\n _this.onOk(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbOK;\r\n }\r\n ); \r\n }\r\n //\r\n let _element_mbCancel = Buttons.find(element => element === SaopMsgDlgButton.mbCancel);\r\n if (global.isUnDefined(_element_mbCancel)) {\r\n $(\"#btnAlertCancel\").remove();\r\n } else {\r\n $(\"#btnAlertCancel\").off(\"click\");\r\n $(\"#btnAlertCancel\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onCancel)){\r\n _this.onCancel(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbCancel;\r\n }\r\n ); \r\n }\r\n //\r\n let _element_mbYes = Buttons.find(element => element === SaopMsgDlgButton.mbYes);\r\n if (global.isUnDefined(_element_mbYes)) {\r\n $(\"#btnAlertYes\").remove();\r\n } else {\r\n $(\"#btnAlertYes\").off(\"click\");\r\n $(\"#btnAlertYes\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onYes)){\r\n _this.onYes(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbYes;\r\n }\r\n ); \r\n } \r\n //\r\n let _element_mbNo = Buttons.find(element => element === SaopMsgDlgButton.mbNo);\r\n if (global.isUnDefined(_element_mbNo)) {\r\n $(\"#btnAlertNo\").remove();\r\n } else {\r\n $(\"#btnAlertNo\").off(\"click\");\r\n $(\"#btnAlertNo\").click(\r\n function () {\r\n if (!global.isUnDefined(_this.onNo)){\r\n _this.onNo(_this._sender);\r\n }\r\n return SaopMsgDlgButton.mbNo;\r\n }\r\n ); \r\n } \r\n } else {\r\n $(\"#btnAlertOK\").remove();\r\n $(\"#btnAlertCancel\").remove();\r\n $(\"#btnAlertYes\").remove();\r\n $(\"#btnAlertNo\").remove();\r\n return SaopMsgDlgButton.mbNone;\r\n }\r\n\r\n $('#alert-modal').on('hidden.bs.modal', function (e) {\r\n $(\"#alert-modal-btn-ok\").unbind(\"click\");\r\n $(this).modal('dispose');\r\n })\r\n \r\n $('#alert-modal').modal('show');\r\n global.setModalFormZIndex('#alert-modal'); \r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\n\r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport interface SaopMultiselectParams {\r\n target:string,\r\n selectAll?:boolean\r\n}\r\n\r\nexport interface SaopMultiselectOptions {\r\n templatesButton?: string\r\n}\r\n\r\nexport interface SelectOption {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nexport class SaopMultiselect {\r\n private _libName:string;\r\n private _translationService: SaopTranslationService;\r\n private _caption: string = \"Skupina\";\r\n private _multiSelectObject: any;\r\n private _options: SaopMultiselectOptions;\r\n //\r\n public msContainer:JQuery;\r\n public msButton: JQuery;\r\n public msPopupContainer: JQuery;\r\n public msContainerLabel:JQuery;\r\n public selectedCB:any;\r\n\r\n constructor(libName:string = \"\", options:SaopMultiselectOptions = null) {\r\n global.ConsoleLogDegug(\"SaopMultiselect\");\r\n this._translationService = new SaopTranslationService();\r\n this.setOptions(options);\r\n } \r\n\r\n setOptions(options: SaopMultiselectOptions): void {\r\n // first set default options\r\n this._options = {\r\n templatesButton: ''\r\n }\r\n\r\n if (options != null) {\r\n this._options = options;\r\n if (options.templatesButton != null) {\r\n this._options.templatesButton = options.templatesButton;\r\n }\r\n }\r\n }\r\n\r\n setTerminologyList() {\r\n let _terminology: string[] = ['Išči', 'Vsi', 'Izberi prikazane', 'izbranih'];\r\n if (!global.isEmpty(this._caption)) {\r\n _terminology = ['Išči', 'Vsi', 'Izberi prikazane', 'izbranih', this._caption];\r\n } \r\n this._translationService.setTranslationsList(_terminology);\r\n }\r\n\r\n bindDiv(elemet:any){\r\n this.msContainer = $(elemet.$container);\r\n this.msButton = $(elemet.$button);\r\n this.msContainerLabel = this.msContainer.find(\"#containerLabel\");\r\n this.msPopupContainer = $(elemet.$popupContainer);\r\n //this.selectedCB = elemet.$select;\r\n\r\n if (this.selectedCB.val().length){\r\n this.setMsFloatingLabel(false);\r\n } else {\r\n this.setMsFloatingLabel(true);\r\n } \r\n }\r\n\r\n setMsFloatingLabel(isEmpry:boolean){\r\n if (isEmpry){\r\n this.msContainerLabel.addClass('ms-float-label-empty');\r\n this.msContainerLabel.removeClass('ms-float-label-selected');\r\n } else {\r\n this.msContainerLabel.removeClass('ms-float-label-empty');\r\n this.msContainerLabel.addClass('ms-float-label-selected'); \r\n } \r\n }\r\n\r\n onInitializedControl(element: any) {\r\n global.ConsoleLogDegug(\"SaopMultiselect.onInitializedControl\");\r\n\r\n if (this.selectedCB.hasClass(\"input-validation-error\")) {\r\n this.msButton.addClass(\"saop-error-input\");\r\n this.msContainerLabel.addClass(\"saop-error-input-text\");\r\n }\r\n\r\n // dodamo sticky css za prvi element\r\n this.addStickyClass();\r\n\r\n this.afterInitializedControl(element);\r\n }\r\n\r\n addStickyClass(): void {\r\n global.ConsoleLogDegug(\"SaopMultiselect.addStickyClass\");\r\n\r\n let seznam = this.msContainer.find(\"button.multiselect-option.dropdown-item\").each(function (index: number, elem: any) {\r\n let selectItem = $(elem);\r\n if (selectItem.text() === \"\") {\r\n selectItem.addClass(\"saop-multiselect-item-sticky\");\r\n }\r\n });\r\n }\r\n\r\n init(target: string = \"\", caption = \"\" ){\r\n global.ConsoleLogDegug(\"SaopMultiselect.init\");\r\n\r\n this._caption = caption;\r\n\r\n // poiscemo prevode (tudi za this._caption)\r\n this.setTerminologyList();\r\n\r\n if (global.isEmpty(target)) {target = \".saop-multiselect\";}\r\n\r\n this.selectedCB = $(target);\r\n\r\n // ali ima selectedCB data-caption\r\n let selectCaption = \"\";\r\n if (!global.isEmpty(this._caption)) {\r\n selectCaption = this._translationService.translate(this._caption);\r\n }\r\n let dataCaption = this.selectedCB.attr(\"data-caption\");\r\n if (!global.isEmpty(dataCaption)) {\r\n selectCaption = dataCaption;\r\n }\r\n\r\n let _this = this;\r\n\r\n $(target).multiselect({\r\n maxHeight: 350, \r\n enableFiltering: true,\r\n includeSelectAllOption: true,\r\n enableCaseInsensitiveFiltering: true,\r\n enableFullValueFiltering: false,\r\n filterPlaceholder: this._translationService.translate(\"Išči\"),\r\n nonSelectedText: '',\r\n allSelectedText:this._translationService.translate(\"Vsi\"),\r\n selectAllText:this._translationService.translate(\"Izberi prikazane\"),\r\n nSelectedText:this._translationService.translate(\"izbranih\"),\r\n includeFilterClearBtn: true,\r\n disableIfEmpty: false,\r\n numberDisplayed: 2,\r\n buttonWidth: '200px',\r\n buttonClass :'saop-control form-control shadow-none ms-image-down pr-0',\r\n buttonContainer: '
',\r\n onSelectAll: function (selectedOptions: JQuery) {\r\n _this.bindDiv(this);\r\n _this.afterSelectAll(selectedOptions);\r\n _this.afterChangeCommonEvent(this.$select);\r\n }, \r\n onDeselectAll: function(selectedOptions:JQuery){\r\n _this.bindDiv(this);\r\n _this.afterDeselectAll(selectedOptions);\r\n _this.afterChangeCommonEvent(this.$select);\r\n }, \r\n onChange: function(option: JQuery, checked: boolean){\r\n _this.bindDiv(this);\r\n _this.afterChange(option, checked);\r\n _this.afterChangeCommonEvent(this.$select);\r\n },\r\n onInitialized: function ($select, $container) {\r\n _this._multiSelectObject = this;\r\n _this.bindDiv(this);\r\n _this.onInitializedControl(this);\r\n },\r\n templates: {\r\n button: this._options.templatesButton,\r\n filter: '
  • ',\r\n } \r\n })\r\n .multiselect('selectAll', false, true)\r\n .multiselect('updateButtonText');\r\n ; \r\n }\r\n\r\n rebuild(): void {\r\n this.selectedCB.multiselect('rebuild');\r\n }\r\n\r\n afterSelectAll(selectedOptions: JQuery) {\r\n\r\n }\r\n\r\n afterDeselectAll(selectedOptions:JQuery){\r\n\r\n }\r\n\r\n afterChange(option: JQuery, checked: boolean){\r\n\r\n }\r\n\r\n afterChangeCommonEvent(element:any){\r\n\r\n }\r\n\r\n afterInitializedControl(element: any){\r\n global.ConsoleLogDegug(\"SaopMultiselect.afterInitializedControl\");\r\n }\r\n\r\n // selectValues vrednosti\r\n setSelectValues(selectValues: string[]): void {\r\n // odznacimo vse zaposlene\r\n this.selectedCB.multiselect('deselectAll');\r\n\r\n if (selectValues != null) {\r\n // oznacimo izbrane\r\n this.selectedCB.multiselect('select', selectValues);\r\n }\r\n this.selectedCB.multiselect('refresh');\r\n\r\n if (this._multiSelectObject != null) {\r\n this.bindDiv(this._multiSelectObject);\r\n this.afterChangeCommonEvent(this._multiSelectObject.$select);\r\n } \r\n }\r\n\r\n clearHtmlOptions(): void {\r\n this.selectedCB\r\n .find('option')\r\n .remove()\r\n .end();\r\n }\r\n\r\n refreshHtmlOptions(optionList: SelectOption[], selectAll: boolean = false): void {\r\n let _this = this;\r\n\r\n this.clearHtmlOptions();\r\n if (optionList.length > 0) {\r\n optionList.forEach(element => _this.selectedCB.append(''));\r\n }\r\n this.rebuild();\r\n this.addStickyClass();\r\n\r\n if (selectAll) {\r\n this.selectedCB.multiselect('selectAll');\r\n\r\n if (this.selectedCB.val().length) {\r\n this.setMsFloatingLabel(false);\r\n } else {\r\n this.setMsFloatingLabel(true);\r\n }\r\n }\r\n }\r\n \r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { SaopPinchZoom } from \"../Components/saop-pinch-and-zoom\";\r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPdfPreview {\r\n private _pdfjsLib:any;\r\n private _canvas:any;\r\n private _viewer:any;\r\n private _pdf:any;\r\n private _scale = 1;\r\n //\r\n private _documentId:string;\r\n private _url:string;\r\n private _fileName:string;\r\n private _base64:string;\r\n private _type:string;\r\n private _saopPinchZoom:SaopPinchZoom;\r\n\r\n loadpdfjsLib(pdfjsLib:any):void{\r\n this._pdfjsLib = pdfjsLib;\r\n this._saopPinchZoom = new SaopPinchZoom();\r\n }\r\n\r\n renderPage(pageNumber:any, canvas:any):void {\r\n let _this = this;\r\n this._pdf.getPage(pageNumber).then(function(page:any) {\r\n _this._viewer = page.getViewport({ scale: _this._scale });\r\n\r\n // let _viewerOffset = $('.pdf-viewer-inner').offset();\r\n // let _w = Math.max(document.documentElement.clientWidth - _viewerOffset.left, window.innerWidth - _viewerOffset.left -272 || 0)\r\n\r\n // let _w = $('#pdf-viewer').width();\r\n // canvas.height = _this._viewer.height;\r\n // canvas.width = _w - 10;\r\n let _w = (_this._viewer.width as string)+'px'\r\n $('.saop-col-view').css('min-width', _w);\r\n\r\n canvas.height = _this._viewer.height - 10;\r\n canvas.width = _this._viewer.width - 10; \r\n\r\n page.render({canvasContext: canvas.getContext('2d'), viewport: _this._viewer}).promise.then(function() {\r\n console.log('Page rendering complete.');\r\n _this._saopPinchZoom.init(\"pdf-viewer\");\r\n });\r\n });\r\n } \r\n\r\n setDefaultScale(scale:number):void{\r\n this._saopPinchZoom.setDefaultScale(scale);\r\n }\r\n\r\n base64ToUint8Array(base64:string):any{\r\n var raw = atob(base64);\r\n var uint8Array = new Uint8Array(raw.length);\r\n for (var i = 0; i < raw.length; i++) {\r\n uint8Array[i] = raw.charCodeAt(i);\r\n }\r\n return uint8Array;\r\n } \r\n\r\n loadingPdfTask(loadingTask:any):void{\r\n let _this = this;\r\n loadingTask.promise.then(function(pdf:any) {\r\n _this._pdf = pdf;\r\n _this._viewer = document.getElementById('pdf-viewer');\r\n \r\n for(let page = 1; page <= pdf.numPages; page++) {\r\n \r\n \r\n _this._canvas = document.createElement(\"canvas\"); \r\n _this._canvas.className = 'pdf-page-canvas'; \r\n \r\n let _row = document.createElement(\"div\");\r\n _row.className = 'row m-0 p-0'; \r\n\r\n let _col = document.createElement(\"div\");\r\n _col.className = 'col m-0 p-0 saop-col-view'; \r\n\r\n _col.appendChild(_this._canvas); \r\n\r\n _row.appendChild(_col); \r\n\r\n _this._viewer.appendChild(_row);\r\n _this.renderPage(page, _this._canvas);\r\n //\r\n //new SaopPinchZoom().init(\"pdf-viewer\");\r\n \r\n }\r\n\r\n // _this._saopPinchZoom.init(\"pdf-viewer\");\r\n // $('.pdf-page-canvas').attr(\"onload\",\"saopPdfPreview.setDefaultScale(0.6);\");\r\n // $('div[onload]').trigger('onload');\r\n }); \r\n }\r\n\r\n getFileNameByUrl(url:string):void {\r\n let _this = this;\r\n $.ajax({\r\n type: \"HEAD\",\r\n url: url, \r\n success: function(message, text, response){\r\n _this._type = response.getResponseHeader('Content-Type');\r\n _this.documentRender();\r\n },\r\n }); \r\n }\r\n\r\n getFileContentByUrl(url:string):void {\r\n let _this = this;\r\n $.ajax({\r\n type: \"GET\",\r\n url: url, \r\n success: function(message, text, response){\r\n let _container = $('
    ');\r\n _container.html(response.responseText);\r\n _container.append(_container);\r\n $('#pdf-viewer').append(_container);\r\n },\r\n }); \r\n }\r\n\r\n private renderErrorDiv():void{\r\n //$('#pdf-viewer').html('
    Ni dokumentov za prikaz
    ');\r\n }\r\n\r\n documentPreview():void {\r\n let _this = this;\r\n this.renderErrorDiv();\r\n this._documentId = $(\"#myModel_DocumentId\").val() as string;\r\n this._url = $(\"#myModel_FileUrl\").val() as string;\r\n this._fileName = $(\"#myModel_FileName\").val() as string;\r\n this._base64 = $(\"#myModel_Base64String\").val() as string;\r\n\r\n let _w = screen.width;\r\n\r\n if (this._url.length > 0 && this._fileName.length == 0) {\r\n this.getFileNameByUrl(this._url);\r\n }\r\n\r\n if (this._base64.length == 0) {return;}\r\n\r\n let _fileExtension = this._fileName.split('.').pop().toLocaleLowerCase();\r\n\r\n if (_fileExtension.length == 0) {return;}\r\n\r\n this._type = \"image/png\";\r\n if (_fileExtension.toLocaleLowerCase() == 'pdf'){\r\n this._type = \"application/pdf\";\r\n } else {\r\n this._type = \"image/\"+_fileExtension;\r\n }\r\n\r\n this.documentRender();\r\n\r\n } \r\n\r\n documentRender():void {\r\n let _w = screen.width;\r\n\r\n if(_w <= 800 && this._type.includes(\"pdf\") == true){\r\n //\r\n this.preparePdfNodes();\r\n let loadingTask:any;\r\n if (this._base64.length > 0) {\r\n let _array = this.base64ToUint8Array(this._base64);\r\n loadingTask = this._pdfjsLib.getDocument(_array); \r\n } else {\r\n loadingTask = this._pdfjsLib.getDocument(this._url); \r\n }\r\n this.loadingPdfTask(loadingTask);\r\n } else if (this._type.includes(\"text/html\")) { \r\n this.getFileContentByUrl(this._url)\r\n } else {\r\n if (this._base64.length > 0) {\r\n $('#pdf-viewer').html('');\r\n } else {\r\n $('#pdf-viewer').html(''); \r\n } \r\n }\r\n } \r\n\r\n private preparePdfNodes():void{\r\n let _parent = $('#pdf-viewer').parent();\r\n\r\n let _main = document.createElement(\"div\");\r\n _main.className = 'pdf-viewer-main'; \r\n\r\n let _inner = document.createElement(\"div\");\r\n _inner.className = 'pdf-viewer-inner';\r\n\r\n let _viewer = document.createElement(\"div\");\r\n _viewer.id = 'pdf-viewer'; \r\n\r\n _inner.appendChild(_viewer);\r\n\r\n _main.appendChild(_inner);\r\n\r\n _parent.html(_main); \r\n }\r\n\r\n // loadBase64Pdf():void{\r\n // let _base64 = $(\"#myModel_Base64String\").val() as string;\r\n\r\n // if (_base64.length > 0) {\r\n // let _fileName = $(\"#myModel_FileName\").val() as string;\r\n // let _fileExtension = _fileName.split('.').pop().toLocaleLowerCase();\r\n // let _w = screen.width;\r\n\r\n // if(_w <= 800 && _fileExtension.toLocaleLowerCase() == \"pdf\"){\r\n // //\r\n // this.preparePdfNodes();\r\n // let _array = this.base64ToUint8Array(_base64);\r\n // var loadingTask = this._pdfjsLib.getDocument(_array); \r\n // this.loadingPdfTask(loadingTask);\r\n // } else {\r\n // let _type = \"image/png\";\r\n // if (_fileExtension.toLocaleLowerCase() == 'pdf'){\r\n // _type = \"application/pdf\";\r\n // } else {\r\n // _type = \"image/\"+_fileExtension;\r\n // }\r\n\r\n // $('#pdf-viewer').html('');\r\n // }\r\n // }\r\n // }\r\n\r\n //\r\n \r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPinchZoom {\r\n\tprivate _initialized:boolean = false;\r\n\t// private _defaultSet = {x: -60, y: -53,z: 0.6};\r\n\tprivate _defaultSet = {x: 0, y: 0,z: 0.6};\r\n\tprivate _element :any;\r\n\tprivate _hammertime :any;\r\n\r\n\tprivate _fixHammerjsDeltaIssue :any;\r\n\tprivate _pinchStart :any;\r\n\tprivate _lastEvent :any;\r\n\t\r\n\tprivate _originalSize :any;\t\r\n\tprivate _current :any;\r\n\tprivate _last :any;\t\r\n\tprivate _pinchZoomOrigin :any;\r\n\t\r\n\t//\r\n\t\r\n\tsleep(milliseconds:number):void {\r\n\t\tconst date = Date.now();\r\n\t\tlet currentDate = null;\r\n\t\tdo {\r\n\t\t\tcurrentDate = Date.now();\r\n\t\t} while (currentDate - date < milliseconds);\r\n\t}\r\n\r\n\tinit(id:string){\r\n\t\tconsole.log(\"init...\");\r\n\t\tthis._element = document.getElementById(id);\r\n\r\n\t\t// let _w = $( window ).width();//this._element.offsetWidth;\r\n\t\t// //let _pdfW = parseInt($(\".pdf-page-canvas\").width())) * 0.6;\r\n\t\t// let _pdfW = $(\".pdf-page-canvas\").width() * 0.6;\r\n\t\t// this._defaultSet.x = ( _w - _pdfW) / 2;\r\n\t\t//\r\n\r\n\t\tthis._hammertime = new Hammer(this._element, {});\t\t\r\n\t\t\r\n\t\tthis._hammertime.get('pinch').set({ enable: true });\r\n\t\tthis._hammertime.get('pan').set({ threshold: 0 });\r\n\r\n \tthis._pinchStart = { x: 0, y: 0 };\r\n\r\n\t\tthis._originalSize = {width: 200, height: 300};\t\r\n\t\tthis._current = {x: 0, y: 0, z: 0, zooming: false, width: this._originalSize.width * 1, height: this._originalSize.height * 1};\t\r\n\t\tthis._last = {x: this._current.x, y:this._current.y, z:this._current.z}\t\t\r\n\r\n\t\tthis.initEvents();\r\n\r\n\t\tthis._initialized = true;\r\n\t\t\r\n\t\tthis.setDefaultScale(this._defaultSet.z);\r\n\t}\r\n\r\n\tsetDefaultScale(scale:number) {\r\n\t\tconsole.log(\"scale:\"+scale.toString());\r\n\t\tif (this._initialized == false) {return; };\r\n\t\t//this.sleep(500);\r\n\r\n\t\tlet _this = this;\r\n\t\t//\r\n\t\tthis._defaultSet.z = scale;\r\n\t\t//\r\n\t\tthis._current = {x: 0, y: 0, z: this._defaultSet.z, zooming: false, width: this._originalSize.width * 1, height: this._originalSize.height * 1};\t\r\n\t\tthis.update();\r\n\t\t//\r\n\t\tlet _screenWidth = $( window ).width();\r\n \tlet _pdfWidth = parseInt($(\".pdf-page-canvas\").attr(\"width\"));\r\n\t\t_pdfWidth = _pdfWidth * this._defaultSet.z;\r\n\t\tlet _leftCanvas = (_screenWidth - (_screenWidth * this._defaultSet.z)) / 2;\r\n\t\tlet _diffLeft = (_screenWidth - _pdfWidth) / 2;\r\n\t\tthis._defaultSet.x = (_leftCanvas - _diffLeft + 5) * (-1);\r\n\t\t// //\r\n\t\tlet _pdfDocHeight = $(\"#document-preview\").height();\r\n\t\tif (_pdfDocHeight <= 0 ) {\r\n\t\t\t_pdfDocHeight = 280;\r\n\t\t}\r\n\t\tthis._defaultSet.y = ((_pdfDocHeight - (_pdfDocHeight * this._defaultSet.z))/2) * (-1);\t\t\r\n\t\t//\r\n\t\t\r\n\t\tthis._current.x = this._defaultSet.x\r\n\t\tthis._current.y = this._defaultSet.y;\r\n\t\tthis._current.z = this._defaultSet.z;\r\n\r\n\t\tthis._last.x = this._defaultSet.x\r\n\t\tthis._last.y = this._defaultSet.y;\r\n\t\tthis._last.z = this._defaultSet.z;\r\n\r\n\t\tthis.update();\r\n\t}\r\n\r\n\tupdate():void {\r\n\t this._current.height = this._originalSize.height * this._current.z;\r\n\t this._current.width = this._originalSize.width * this._current.z;\r\n\t this._element.style.transform = \"translate3d(\" + this._current.x + \"px, \" + this._current.y + \"px, 0) scale(\" + this._current.z + \")\";\r\n\t}\r\n\r\n\tgetCoords(elem:any):any { // crossbrowser version\r\n\t var box = elem.getBoundingClientRect();\r\n\r\n\t var body = document.body;\r\n\t var docEl = document.documentElement;\r\n\r\n\t var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n\t var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n\r\n\t var clientTop = docEl.clientTop || body.clientTop || 0;\r\n\t var clientLeft = docEl.clientLeft || body.clientLeft || 0;\r\n\r\n\t var top = box.top + scrollTop - clientTop;\r\n\t var left = box.left + scrollLeft - clientLeft;\r\n\r\n\t return { x: Math.round(left), y: Math.round(top) };\r\n\t}\r\n\r\n\r\n\tgetCoordinateShiftDueToScale(size:any, scale:any):any{\r\n\t var newWidth = scale * size.width;\r\n\t var newHeight = scale * size.height;\r\n\t var dx = (newWidth - size.width) / 2;\r\n\t var dy = (newHeight - size.height) / 2;\r\n\t return {\r\n\t\tx: dx,\r\n\t\ty: dy\r\n\t };\r\n\t}\r\n\r\n\tscaleFrom(zoomOrigin:any, currentScale:any, newScale:any):any {\r\n\t var currentShift = this.getCoordinateShiftDueToScale(this._originalSize, currentScale);\r\n\t var newShift = this.getCoordinateShiftDueToScale(this._originalSize, newScale);\r\n\r\n\t var zoomDistance = newScale - currentScale\r\n\t \r\n\t var shift = {\r\n\t\tx: currentShift.x - newShift.x,\r\n\t\ty: currentShift.y - newShift.y,\r\n\t }\r\n\r\n\t var output = {\r\n\t\tx: zoomOrigin.x * shift.x,\r\n\t\ty: zoomOrigin.y * shift.y,\r\n\t\tz: zoomDistance\r\n\t }\r\n\t return output;\r\n\t}\r\n\r\n\tgetRelativePosition(element:any, point:any, originalSize:any, scale:any):any {\r\n\t var domCoords = this.getCoords(element);\r\n\r\n\t var elementX = point.x - domCoords.x;\r\n\t var elementY = point.y - domCoords.y;\r\n\r\n\t var relativeX = elementX / (originalSize.width * scale / 2) - 1;\r\n\t var relativeY = elementY / (originalSize.height * scale / 2) - 1;\r\n\t return { x: relativeX, y: relativeY }\r\n\t}\r\n\r\n\tinitEvents():void {\r\n\t\tlet _this = this;\r\n\r\n\t\tthis._hammertime.on('panend', (function(e:any) {\r\n\t\t\tconsole.log(\"panend\");\r\n\t\t if (this._current.scale != this._last.scale) {\r\n\t\t \tthis._last.x = this._current.x;\r\n\t\t }\r\n\t\t this._last.y = this._current.y;\r\n\t\t this._lastEvent = 'panend';\r\n\t\t}).bind(this));\r\n\r\n\t\tthis._hammertime.on('pinchend', (function(e:any) {\r\n\t\t\tconsole.log(\"pinchend\");\r\n\t\t this._last.x = this._current.x;\r\n\t\t this._last.y = this._current.y;\r\n\t\t this._last.z = this._current.z;\r\n\t\t this._lastEvent = 'pinchend';\r\n\t\t}).bind(this));\t\r\n\r\n\t\tthis._hammertime.on('pinchstart', (function(e:any) {\r\n\t\t this._pinchStart.x = e.center.x;\r\n\t\t this._pinchStart.y = e.center.y;\r\n\t\t this._pinchZoomOrigin = this.getRelativePosition(this._element, { x: this._pinchStart.x, y: this._pinchStart.y }, this._originalSize, this._current.z);\r\n\t\t this._lastEvent = 'pinchstart';\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\tthis._hammertime.on('pinch', (function(e:any) {\r\n\t\t console.log(\"pinch\");\r\n\t\t var d = this.scaleFrom(this._pinchZoomOrigin, this._last.z, this._last.z * e.scale)\r\n\t this._current.x = d.x + this._last.x + e.deltaX;\r\n\t\t this._current.y = d.y + this._last.y + e.deltaY;\r\n\t\t this._current.z = d.z + this._last.z;\r\n\t\t this._lastEvent = 'pinch';\r\n\t\t this.update();\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\tthis._hammertime.on('doubletap', (function(e:any) {\r\n\t\t\tconsole.log(\"doubletap\");\r\n\t\t\tthis.setDefaultScale(this._defaultSet.z);\r\n\r\n\t\t// var _this = this; \r\n\t\t// var scaleFactor = 1;\r\n\t\t// if (this._current.zooming === false) {\r\n\t\t// \tthis._current.zooming = true;\r\n\t\t// } else {\r\n\t\t// \tthis._current.zooming = false;\r\n\t\t// \tscaleFactor = -scaleFactor;\r\n\t\t// }\r\n\r\n\t\t// this._element.style.transition = \"0.3s\";\r\n\t\t// setTimeout(function() {\r\n\t\t// \t_this._element.style.transition = \"none\";\r\n\t\t// }, 300)\r\n\r\n\t\t// var zoomOrigin = this.getRelativePosition(this._element, { x: e.center.x, y: e.center.y }, this._originalSize, this._current.z);\r\n\t\t// var d = this.scaleFrom(zoomOrigin, this._current.z, this._current.z + scaleFactor)\r\n\t\t// this._current.x += d.x;\r\n\t\t// this._current.y += d.y;\r\n\t\t// this._current.z += d.z;\r\n\r\n\t\t// this._last.x = this._current.x;\r\n\t\t// this._last.y = this._current.y;\r\n\t\t// this._last.z = this._current.z;\r\n\r\n\t\t// this.update();\r\n\t\t}).bind(this));\r\n\t\t\r\n\t\t\r\n\t\tthis._hammertime.on('pan', (function(e:any) {\r\n\t\t console.log(\"pan\");\r\n\t\t if (this._lastEvent !== 'pan') {\r\n\t\t\tthis._fixHammerjsDeltaIssue = {\r\n\t\t\t x: e.deltaX,\r\n\t\t\t y: e.deltaY\r\n\t\t\t};\r\n\t\t };\r\n\r\n\t\t if (this._current.z != this._defaultSet.z){\r\n\t\t\tthis._current.x = this._last.x + e.deltaX - this._fixHammerjsDeltaIssue.x;\r\n\t\t }\r\n\t\t \r\n\t\t this._current.y = this._last.y + e.deltaY - this._fixHammerjsDeltaIssue.y;\r\n\t\t this._lastEvent = 'pan';\r\n\t\t this.update();\r\n\t\t}).bind(this)); \r\n\t\t\r\n // $(window).resize(function () {\r\n\t// \t\tProgressEvent;\r\n // _this.setDefaultScale();\r\n // }).resize();\t\t\r\n\r\n\t}\r\n\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPopover {\r\n private _querySelector: string;\r\n\r\n constructor(querySelector: string = \"[data-toggle=popover]\") {\r\n this._querySelector = querySelector;\r\n }\r\n\r\n bindPopoverEvents() {\r\n global.ConsoleLogDegug(\"SaopPopover.bindPopoverEvents\");\r\n let _this = this;\r\n\r\n $(\"[data-toggle=popover]\").popover({\r\n html: true,\r\n sanitize: false,\r\n trigger: 'click',\r\n content: function () {\r\n var content = $(this).attr(\"data-popover-content\");\r\n return $(content).children(\".popover-body\").html();\r\n }\r\n });\r\n\r\n $('html').on('mouseup', function (e) {\r\n global.ConsoleLogDegug(\"mouseup!\");\r\n if (!$(e.target).closest('.popover').length) {\r\n global.ConsoleLogDegug(\"mouseup.popover!\");\r\n $('.popover').each(function () {\r\n global.ConsoleLogDegug(\"mouseup.popover.hide!\");\r\n //$(this.previousSibling).popover('hide');\r\n $(_this._querySelector).popover('hide');\r\n });\r\n }\r\n });\r\n\r\n // when popover's content is shown\r\n $(\"[data-toggle=popover]\").on('shown.bs.popover', function (e: any) {\r\n // set what happens when user clicks on the button\r\n global.ConsoleLogDegug(\"set!\");\r\n\r\n _this.afterPopoverShow(this);\r\n\r\n $(\".popoverLink\").off('click');\r\n $(\".popoverLink\").on('click', function () {\r\n global.ConsoleLogDegug(\"popoverLink clicked!!!\");\r\n $(\"[data-toggle=popover]\").popover('hide');\r\n });\r\n\r\n $(\".popoverClose\").off('click');\r\n $(\".popoverClose\").on('click', function () {\r\n global.ConsoleLogDegug(\"Close popover clicked!!!\");\r\n $(\"[data-toggle=popover]\").popover('hide');\r\n });\r\n });\r\n\r\n }\r\n\r\n afterPopoverShow(element: HTMLElement) {\r\n global.ConsoleLogDegug(\"SaopPopover.afterPopoverShow\");\r\n }\r\n\r\n initSelfContainerPopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.initSelfContainerPopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n let elem = this;\r\n $elem.popover({\r\n container: elem,\r\n sanitize: false\r\n });\r\n });\r\n }\r\n\r\n enablePopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.enablePopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n $elem.popover('enable');\r\n });\r\n }\r\n\r\n disablePopover() {\r\n global.ConsoleLogDegug(\"SaopPopover.disablePopover\");\r\n\r\n $(this._querySelector).each(function () {\r\n let $elem = $(this);\r\n $elem.popover('disable');\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopPopupDialogOptions {\r\n title: string;\r\n body: string;\r\n showCancelButton: boolean;\r\n confirmButtonCaption: string;\r\n cancelButtonCaption: string;\r\n confirmAction: string;\r\n confirmActiondata: object;\r\n onSuccess: (params:any) => any;\r\n constructor() {\r\n this.title = \"\";\r\n this.body = \"body text\";\r\n this.showCancelButton = true;\r\n this.confirmButtonCaption = \"Ok\";\r\n this.cancelButtonCaption = \"Cancel\";\r\n this.confirmAction = \"\";\r\n this.confirmActiondata = {};\r\n this.onSuccess = null;\r\n }\r\n}\r\n\r\nexport class SaopPopupDialog {\r\n private _options:SaopPopupDialogOptions;\r\n\r\n\r\n constructor(options:SaopPopupDialogOptions) {\r\n this._options = options;\r\n } \r\n \r\n save(callback: (n: number) => any) : void {\r\n callback(42);\r\n }\r\n\r\n ShowLoadingSaop() {\r\n var obj = $(\"#saopLoading\");\r\n if (obj.length)\r\n obj.show();\r\n }\r\n\r\n HideLoadingSaop() {\r\n var obj = $(\"#saopLoading\");\r\n if (obj.length)\r\n obj.hide();\r\n } \r\n\r\n ShowPopupDialog():void {\r\n let _this = this;\r\n // Display info message to the user in a modal\r\n let titleDiv = $('#info-modal-title-div');\r\n let titleH = $('#info-modal-title');\r\n let confirmButton = $('#info-modal-btn-ok');\r\n let cancelButton = $('#info-modal-btn-cancel');\r\n\r\n cancelButton.html(this._options.cancelButtonCaption);\r\n\r\n // show or hide header div based on title property\r\n titleDiv.css(\"display\", \"\");\r\n if (this._options.title) {\r\n titleH.html(this._options.title);\r\n }\r\n else {\r\n titleDiv.css(\"display\", \"none\");\r\n }\r\n\r\n if (this._options.confirmButtonCaption){\r\n confirmButton.html(this._options.confirmButtonCaption);\r\n confirmButton.css(\"display\", \"\"); \r\n } else {\r\n confirmButton.css(\"display\", \"none\");\r\n }\r\n\r\n if (this._options.showCancelButton) {\r\n cancelButton.html(this._options.cancelButtonCaption);\r\n cancelButton.css(\"display\", \"\"); \r\n } else {\r\n cancelButton.css(\"display\", \"none\");\r\n }\r\n\r\n $('#info-modal-body').html(this._options.body);\r\n\r\n $(\"#info-modal-btn-ok\").click(\r\n function () {\r\n _this.popupDialogConfirm();\r\n }\r\n );\r\n\r\n $('#info-modal').on('hidden.bs.modal', function (e) {\r\n $(\"#info-modal-btn-ok\").unbind(\"click\");\r\n $(this).modal('dispose');\r\n })\r\n\r\n $('#info-modal').modal('show');\r\n global.setModalFormZIndex('#info-modal');\r\n } \r\n\r\n popupDialogConfirm() {\r\n let _this = this;\r\n let cancelButton = $('#info-modal-btn-cancel');\r\n\r\n if (this._options.confirmAction !== \"\") {\r\n $.ajax({\r\n url: this._options.confirmAction,\r\n type: \"POST\",\r\n data: this._options.confirmActiondata,\r\n beforeSend: function () { _this.ShowLoadingSaop(); },\r\n complete: function () { _this.HideLoadingSaop(); },\r\n success: function (result) {\r\n // close dialog\r\n cancelButton.trigger(\"click\");\r\n\r\n if(_this._options.onSuccess !== null){\r\n _this._options.onSuccess(result);\r\n }\r\n \r\n },\r\n error: function (response) {\r\n // close dialog\r\n cancelButton.trigger(\"click\");\r\n alert(response.responseJSON.message);\r\n }\r\n });\r\n }\r\n else {\r\n //close dialog\r\n cancelButton.trigger(\"click\");\r\n\r\n if (this._options.onSuccess != null) {\r\n this._options.onSuccess(null);\r\n }\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport enum SaopRightSidebarView {\r\n Dashboard = 0\r\n ,Absence = 1\r\n ,AttendanceDay = 2\r\n ,AttendanceMonth = 3 \r\n ,TravelOrders = 4\r\n ,InternalOrders = 5\r\n}\r\n\r\nexport class SaopRightSidebar {\r\n private _saopServicesCore :SaopServicesCore;\r\n\r\n constructor() {\r\n this._saopServicesCore = new SaopServicesCore();\r\n }\r\n\r\n\r\n bindCarouselDiv(contentId:string,view:SaopRightSidebarView){\r\n global.ConsoleLogDegug(\"SaopRightSidebar.bindDiv\"); \r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/GetCarouselView?view=\"+view.toString()\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:\"#saopLoadingSidebarr\"\r\n ,async:false\r\n }); \r\n }\r\n\r\n refreshDopustZaKoriscenjeSummary(contentId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshDopustZaKoriscenjeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/DopustZaKoriscenjeSummaryPartial\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId: spinnerDivId\r\n }); \r\n }\r\n\r\n refreshUreZaKoriscenjeSummary(contentId: string, spinnerDivId: string = \"#saopLoadingSidebarr\"): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshUreZaKoriscenjeSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/UreZaKoriscenjeSummaryPartial\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId: spinnerDivId\r\n });\r\n }\r\n\r\n refreshRegUraDogodkiSummary(contentId: string, selectedPeriod:string, spinnerDivId:string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshRegUraDogodkiSummary\");\r\n\r\n let _this = this;\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n _this.setHeight();\r\n window.onresize = function () {\r\n _this.setHeight();\r\n };\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"RightSideBar/RegUraDogodkiSummaryPartial?selectedPeriod=\"+selectedPeriod\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n refreshRegOPNPotniNalogiSummary(contentId: string, spinnerDivId:string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshRegOPNPotniNalogiSummary\");\r\n\r\n this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action:\"TravelOrder/TravelOrdersSummary\"\r\n ,data:null\r\n ,type:\"GET\"\r\n ,spinnerDivId:spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n refreshNdkInternalOrdersSummary(contentId: string, spinnerDivId: string): void {\r\n global.ConsoleLogDegug(\"SaopRightSidebar.refreshNdkInternalOrdersSummary\");\r\n\r\n this._saopServicesCore.afterDone = function (response) {\r\n $(contentId).html(response);\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"RightSideBar/InternalOrdersSummary\"\r\n , data: null\r\n , type: \"GET\"\r\n , spinnerDivId: spinnerDivId\r\n //,spinnerDivId:\"#saopLoadingSidebarr\"\r\n });\r\n }\r\n\r\n setHeight() {\r\n var header = $(\"#site-header\").height();\r\n var footer = $(\"#site-footer\").height();\r\n\r\n var visina_tab_lista = 0;\r\n if (window.location.pathname == '/REGAttendance')\r\n visina_tab_lista = 37;\r\n\r\n $(\"#reg-summary-container\").height(window.innerHeight - header - footer - 106 - visina_tab_lista);\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n","\r\nexport interface SaopInputWFLProperties {\r\n id:string;\r\n placeholder:string;\r\n caption:string;\r\n}\r\n\r\nexport class SaopselectWFL {\r\n private _inputTemplate:string;\r\n constructor(properties:SaopInputWFLProperties) {\r\n this._inputTemplate = \r\n `\r\n \r\n \r\n \r\n \r\n \r\n `; \r\n }\r\n\r\n getElement():JQuery{\r\n let _element = $(this._inputTemplate);\r\n return _element;\r\n }\r\n\r\n getInnerHtml():string{\r\n return this._inputTemplate;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","// knjiznica: https://selectize.dev/\r\n\r\n/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SelectOption } from \"./saop-multiselect\";\r\n\r\nexport class SaopSelectizeSelect {\r\n private libName: string;\r\n private _viewId: string;\r\n private _id: string;\r\n private _selectizeControl: HTMLElement;\r\n\r\n constructor(viewId: string = \"\", id: string = \"\", libName: string = \"\") {\r\n this.libName = libName;\r\n this._viewId = viewId;\r\n this._id = id;\r\n\r\n if (this._id != \"\") {\r\n this._selectizeControl = $(this._viewId + \" \" + this._id)[0];\r\n }\r\n }\r\n\r\n init(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.init\");\r\n\r\n this.inicializeBindEvents();\r\n }\r\n\r\n initControlByJQuery(element: JQuery): void {\r\n this.initSelectizeSelect(element);\r\n }\r\n\r\n initControlByHtml(element: HTMLElement): void {\r\n this.initSelectizeSelect($(element));\r\n }\r\n\r\n initMultiselectControlByHtml(element: HTMLElement): void {\r\n this.initSelectizeMultiselect($(element));\r\n }\r\n\r\n getValue(): string {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.getValue\");\r\n\r\n return $(this._viewId + \" \" + this._id).attr(\"data-chosen\");\r\n }\r\n\r\n getMultiselectValues(): string[] {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.getMultiselectValues\");\r\n\r\n let retValue: string[] = []; \r\n\r\n $(this._viewId + \" \" + this._id + \" option:selected\").each(function (val) {\r\n retValue.push($(this).val().toString());\r\n });\r\n\r\n return retValue;\r\n }\r\n\r\n private initSelectizeSelect(element: JQuery): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...\");\r\n\r\n element.selectize({\r\n sortField: 'text',\r\n allowEmptyOption: true,\r\n render: {\r\n option: function (item: any, escape: any) {\r\n var label = item.text;\r\n var caption = item.value;\r\n return \"
    \" + '' + escape(label) + \"\" + \"
    \";\r\n },\r\n },\r\n onFocus: function () {\r\n if (this.$input.val() === \"?\") {\r\n this.setValue(\"\");\r\n }\r\n },\r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...done\");\r\n }\r\n\r\n private initSelectizeMultiselect(element: JQuery): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeMultiselect...\");\r\n\r\n let _this = this;\r\n\r\n element.selectize({\r\n delimiter: \"|\",\r\n persist: false,\r\n maxItems: null,\r\n create: function (input: any) {\r\n return {\r\n value: input,\r\n text: input,\r\n };\r\n },\r\n onFocus: function () {\r\n let selValues = this.items;\r\n\r\n // ce je samo en element in ta \"?\", zbrisemo seznam, da se floating label umakne iz vvnosne kontrole\r\n if (selValues.length == 1 && selValues[0].trim() === \"?\") {\r\n this.setValue(\"\");\r\n }\r\n } \r\n });\r\n\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.initSelectizeSelect...done\");\r\n }\r\n\r\n private inicializeBindEvents(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.inicializeBindEvents\");\r\n\r\n let _this = this; \r\n\r\n $(this._viewId + \" \" + this._id).change(function () {\r\n var data = $(this).val().toString();\r\n _this.valueChanged(data);\r\n });\r\n }\r\n\r\n valueChanged(value: string): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.valueChanged\");\r\n }\r\n\r\n setValue(value: string): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.setValue\");\r\n this._selectizeControl.selectize.setValue(value);\r\n }\r\n\r\n setValues(values: string[]): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.setValues\");\r\n this._selectizeControl.selectize.setValue(values);\r\n }\r\n\r\n clearValue(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.clearValue\");\r\n this._selectizeControl.selectize.clear();\r\n }\r\n\r\n refreshOptions(optionList: SelectOption[]): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.refreshOptions\");\r\n\r\n let _this = this;\r\n\r\n // zbrisemo izbrano opcijo, drugace ostane notri kot opcija\r\n this._selectizeControl.selectize.clear();\r\n\r\n this._selectizeControl.selectize.clearOptions();\r\n\r\n if (optionList.length > 0) {\r\n optionList.forEach(element =>\r\n _this._selectizeControl.selectize.addOption({ value: element.value, text: element.text })\r\n );\r\n }\r\n }\r\n\r\n disable(): void {\r\n global.ConsoleLogDegug(\"SaopSelectizeSelect.disable\");\r\n this._selectizeControl.selectize.disable();\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\nexport class SaopTogglePanel {\r\n\r\n init():void{\r\n global.ConsoleLogDegug(\"SaopTogglePanel.init...\");\r\n this.setClickEventOnFrame(\"body\");\r\n }\r\n\r\n setClickEventOnFrame(frameName:string = \"body\"):void {\r\n global.ConsoleLogDegug(\"SaopTogglePanel.setClickEventOnFrame...\");\r\n\r\n let _frame = $(\"\"+frameName+\" *> .saop-toggle-panel\");\r\n _frame.off(\"click\");\r\n _frame.click(function () {\r\n //na klik se puščica obrne gor / dol\r\n var arrowDiv = $(this).find(\".saop-toggle-arrow\");\r\n\r\n for (var i = 0; i < arrowDiv.length; i++) {\r\n if (arrowDiv[i].classList.contains(\"saop-img-down\")) {\r\n arrowDiv[i].classList.remove(\"saop-img-down\");\r\n arrowDiv[i].classList.add(\"saop-img-up\");\r\n } else {\r\n arrowDiv[i].classList.remove(\"saop-img-up\");\r\n arrowDiv[i].classList.add(\"saop-img-down\");\r\n }\r\n }\r\n });\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from \"./saop-message-dlg\";\r\n\r\nexport class SaopTreeview {\r\n private _viewId: string;\r\n private libName: string; \r\n private _translationService: SaopTranslationService;\r\n\r\n constructor(viewId: string, libName: string) {\r\n this._viewId = viewId;\r\n this.libName = libName;\r\n\r\n this._translationService = new SaopTranslationService();\r\n } \r\n\r\n init() {\r\n global.ConsoleLogDegug(\"SaopTreeview.init\");\r\n\r\n // prevajanje\r\n this.setFormTerminologyList();\r\n\r\n this.initEventListners();\r\n }\r\n\r\n private setFormTerminologyList() {\r\n global.ConsoleLogDegug(\"SaopTreeview.setFormTerminologyList\");\r\n\r\n let terminology = [\"Ni podatkov za prikaz.\", \"Brisanje\", \"Ali ste prepričani, da želite izbrisati element?\"];\r\n this._translationService.setTranslationsList(terminology);\r\n }\r\n\r\n private initEventListners() {\r\n global.ConsoleLogDegug(\"SaopTreeview.initEventListners\");\r\n\r\n let _this = this;\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-expand-colapse\"); \r\n $(this._viewId).on(\"click\", \".saop-treeview-expand-colapse\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-expand-colapse.click\");\r\n\r\n event.stopPropagation();\r\n _this.treeviewExpandColapse(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-delete\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-delete\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-delete.click\");\r\n\r\n event.stopPropagation();\r\n _this.deleteTreeviewItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-addSubItem\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-addSubItem\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-addSubItem.click\");\r\n\r\n event.stopPropagation();\r\n _this.addTreeviewSubItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-insertItem\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-insertItem\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-insertItem.click\");\r\n\r\n event.stopPropagation();\r\n _this.insertItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-item-edit\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-item-edit\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-item-edit.click\");\r\n\r\n event.stopPropagation();\r\n _this.editTreeviewItem(this);\r\n });\r\n\r\n $(this._viewId).off(\"click\", \".saop-treeview-add-item-btn\");\r\n $(this._viewId).on(\"click\", \".saop-treeview-add-item-btn\", function (event) {\r\n global.ConsoleLogDegug(\"SaopTreeview.saop-treeview-add-item-btn.click\");\r\n\r\n event.stopPropagation();\r\n _this.addTreeviewItem(this);\r\n });\r\n }\r\n\r\n private treeviewExpandColapse(elem: any): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.treeviewExpandColapse\");\r\n\r\n let id = $(elem).attr(\"data-toogleelementsid\");\r\n let collapseItems = $(elem).hasClass(\"saop-img-down\");\r\n\r\n $(elem).toggleClass(\"saop-img-down\");\r\n $(elem).toggleClass(\"saop-img-right\");\r\n\r\n // show/hide\r\n $(this._viewId + \" div.saop-treeview-item-container[data-parentid='\" + id + \"']\").each(function (index: number, childElem: any) {\r\n if (collapseItems) {\r\n $(childElem).hide(\"fast\");\r\n }\r\n else {\r\n $(childElem).show(\"fast\");\r\n }\r\n }); \r\n }\r\n\r\n private deleteTreeviewItem(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.deleteTreeviewItem\");\r\n\r\n let _this = this;\r\n let deleteTitle = this._translationService.translate(\"Brisanje\");\r\n let deleteMessage = this._translationService.translate(\"Ali ste prepričani, da želite izbrisati element?\");\r\n\r\n let saopMessageDlg = new SaopMessageDlg(null);\r\n saopMessageDlg.onYes = function () {\r\n // poiscemo parent z klasom saop-treeview-item-container in ga odstranimo ter vse childreen\r\n let tempElement = elem;\r\n let parentid = 0;\r\n for (var i = 0; i < 10; i++) {\r\n if (tempElement.classList.contains(\"saop-treeview-item-container\")) {\r\n parentid = global.convertString2Number(tempElement.getAttribute(\"data-parentid\"));\r\n // odstranimo element\r\n tempElement.innerHTML = \"\"; \r\n tempElement.remove();\r\n break;\r\n }\r\n tempElement = tempElement.parentElement;\r\n }\r\n if (parentid != null && parentid > 0) {\r\n // ali je se kaj ostalih child elementov z istim parentId?\r\n let childreenCount = $(_this._viewId + ' div.saop-treeview-item-container[data-parentid=\"' + parentid + '\"]').length;\r\n if (childreenCount == 0) {\r\n // zbrisali zadnjega child element, skrijemo expand/collapse ikono parent elementa\r\n let parentElement = $(_this._viewId + ' div.saop-treeview-item[data-id=\"' + parentid + '\"]');\r\n if (parentElement != null) {\r\n let expandCollapseElem = $(parentElement).find(\".saop-treeview-expand-colapse\");\r\n if (expandCollapseElem != null) {\r\n expandCollapseElem.hide();\r\n }\r\n }\r\n }\r\n }\r\n };\r\n saopMessageDlg.Show(deleteMessage, deleteTitle, 1, [SaopMsgDlgButton.mbYes, SaopMsgDlgButton.mbNo]);\r\n }\r\n\r\n private addTreeviewSubItem(addSubItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItem\");\r\n\r\n // prikazemo expand/collapse ikono:\r\n // poiscemo parent, ki ima klas saop-treeview-item-info,\r\n let parentElem = addSubItemButtonElement.parentElement;\r\n for (var i = 0; i < 10; i++) {\r\n if (parentElem.classList.contains(\"saop-treeview-item-info\")) {\r\n // poiscemo njegov child, ki ima klas saop-treeview-expand-colapse\r\n let expandCollapseElem = $(parentElem).find(\".saop-treeview-expand-colapse\");\r\n if (expandCollapseElem != null) {\r\n expandCollapseElem.show();\r\n }\r\n break;\r\n }\r\n parentElem = parentElem.parentElement;\r\n }\r\n\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newSubItemId = this.getMaxTreeviewId() + 1;\r\n // parent Id\r\n let newSubItemParentId = global.convertString2Number($(addSubItemButtonElement).attr(\"data-parentid\"));\r\n\r\n this.addTreeviewSubItemExternal(addSubItemButtonElement, newSubItemId, newSubItemParentId);\r\n }\r\n\r\n private getMaxTreeviewId(): number {\r\n global.ConsoleLogDegug(\"SaopTreeview.getMaxTreeviewId\");\r\n\r\n let maxId = 0\r\n\r\n $(this._viewId + \" .saop-treeview-item\").each(function (index, htmlTreeviewItem) {\r\n let id = global.convertString2Number(htmlTreeviewItem.getAttribute(\"data-id\"));\r\n if (id != null && id > maxId) {\r\n maxId = id;\r\n }\r\n });\r\n\r\n return maxId;\r\n }\r\n\r\n public addTreeviewSubItemExternal(addSubItemButtonElement: HTMLElement, newSubItemId: number, newSubItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItemExternal\");\r\n }\r\n\r\n // metodo uporablja client, vrne content, ki jo dodamo v treeview\r\n public addTreeviewSubItemContent(addSubItemButtonElement: HTMLElement, newSubItemId: number, newSubItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewSubItemContent\");\r\n\r\n let elemParent = $(this._viewId + ' div.saop-treeview-item[data-id=\"' + newSubItemParentId + '\"]');\r\n elemParent.append(htmlContent);\r\n }\r\n\r\n private addTreeviewItem(addItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItem\");\r\n\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newItemId = this.getMaxTreeviewId() + 1;\r\n\r\n this.addTreeviewItemExternal(addItemButtonElement, newItemId, null);\r\n }\r\n\r\n public addTreeviewItemExternal(addItemButtonElement: HTMLElement, newItemId: number, newItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItemExternal\");\r\n }\r\n\r\n // metodo uporablja client, vrne content, ki jo dodamo v treeview\r\n public addTreeviewItemContent(addItemButtonElement: HTMLElement, newItemId: number, newItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.addTreeviewItemContent\");\r\n\r\n // odstranimo add item html, ker ga bo ze dodal htmlContent\r\n $(this._viewId + \" .saop-treeview-add-item-container\").each(function (index, htmlTreeviewAddItem) {\r\n htmlTreeviewAddItem.remove();\r\n });\r\n\r\n let elemParent = $(this._viewId);\r\n elemParent.append(htmlContent);\r\n }\r\n\r\n private editTreeviewItem(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.editTreeviewItem\");\r\n\r\n // odstranimo css klas za obrobo vsem elementom in jo dodamo izbranemu\r\n this.clearTreeviewItemsSelectedCss();\r\n $(elem).addClass(\"saop-treeview-item-selected\");\r\n\r\n this.editTreeviewItemExternal(elem);\r\n }\r\n\r\n // za externo uporabo\r\n public editTreeviewItemExternal(elem: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.editTreeviewItemExternal\");\r\n }\r\n\r\n public clearTreeviewItemsSelectedCss(): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.clearTreeviewItemsSelectedCss\");\r\n\r\n $(this._viewId + \" .saop-treeview-item-info\").removeClass(\"saop-treeview-item-selected\");\r\n }\r\n\r\n // elem je isti kot ga ponuja editTreeviewItem oz. editTreeviewItemExternal\r\n public refreshTreeviewItemHeader(elem: HTMLElement, header: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.refreshTreeviewItemHeader\");\r\n\r\n $(elem).find(\".saop-treeview-item-header\").text(header);\r\n }\r\n\r\n private insertItem(insertItemButtonElement: HTMLElement): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertItem\");\r\n\r\n // poiscemo parent, ki ima klas saop-treeview-item-container,\r\n let parentFound = false\r\n let parentElem = insertItemButtonElement.parentElement;\r\n for (var i = 0; i < 20; i++) {\r\n if (parentElem.classList.contains(\"saop-treeview-item-container\")) {\r\n parentFound = true;\r\n break;\r\n }\r\n parentElem = parentElem.parentElement;\r\n }\r\n\r\n if (parentFound) {\r\n // poisci max Id Treeviews in ga povecamo za 1\r\n let newItemId = this.getMaxTreeviewId() + 1;\r\n // parentId\r\n let newItemParentId = global.convertString2Number($(parentElem).attr(\"data-parentid\"));\r\n\r\n this.insertTreeviewItemExternal(parentElem, newItemId, newItemParentId);\r\n } \r\n }\r\n\r\n public insertTreeviewItemExternal(itemToAppendTo: HTMLElement, newItemId: number, newItemParentId: number): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertTreeviewItemExternal\");\r\n }\r\n\r\n public insertTreeviewItemContent(itemToAppendTo: HTMLElement, newItemId: number, newItemParentId: number, htmlContent: string): void {\r\n global.ConsoleLogDegug(\"SaopTreeview.insertTreeviewItemContent\");\r\n\r\n $(itemToAppendTo).after(htmlContent);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { global } from \"../Common/saop-common\";\r\n\r\n\r\nexport class SaopViewSpinner {\r\n\r\n generateSpinnerDiv(spinnerId: string = '#saopLoading'): string {\r\n global.ConsoleLogDegug(\"generateSpinnerDiv \" + spinnerId);\r\n let spinnrDiv =\r\n '
    '\r\n + '\t
    '\r\n + '\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t\t
    '\r\n + '\t
    '\r\n + '
    ';\r\n\r\n return spinnrDiv;\r\n }\r\n\r\n showLoadingSaop(elementId: string = \"#saopLoading\") {\r\n global.ConsoleLogDegug(\"showLoadingSaop \" + elementId);\r\n var obj = $(elementId);\r\n if (obj.length) {\r\n global.ConsoleLogDegug(\"Show... \");\r\n obj.show();\r\n //setModalFormZIndex(elementId);\r\n }\r\n }\r\n\r\n hideLoadingSaop(elementId: string = \"#saopLoading\") {\r\n global.ConsoleLogDegug(\"hideLoadingSaop \" + elementId);\r\n var obj = $(elementId);\r\n if (obj.length)\r\n obj.hide();\r\n }\r\n\r\n // showLoadingSaop(elementId: string = \"\") {\r\n // global.ConsoleLogDegug(\"showLoadingSaop \" + elementId);\r\n // if (!isEmpty(elementId)) {\r\n // let elementDiv = $(elementId);\r\n // if (elementDiv.length) {\r\n // let spinnerID = elementId + \"Loading\";\r\n // spinnerID = spinnerID.replace(\"#\",\"\");\r\n // let spinnerDiv = $(spinnerID);\r\n // if (!spinnerDiv.length) {\r\n // let _div = this.generateSpinnerDiv(spinnerID);\r\n // elementDiv.append(_div);\r\n // spinnerDiv = $(spinnerID);\r\n // }\r\n // spinnerDiv.show();\r\n // }\r\n // }\r\n // }\r\n\r\n // hideLoadingSaop(elementId: string = \"\") {\r\n // global.ConsoleLogDegug(\"hideLoadingSaop \" + elementId);\r\n // if (!isEmpty(elementId)) {\r\n // let elementDiv = $(elementId);\r\n // if (elementDiv.length) {\r\n // let spinnerID = elementId + \"Loading\";\r\n // let spinnerDiv = $(spinnerID);\r\n // if (!spinnerDiv.length) {\r\n // elementDiv.append(this.generateSpinnerDiv(spinnerID));\r\n // spinnerDiv = $(spinnerID);\r\n // }\r\n // spinnerDiv.hide();\r\n // }\r\n // }\r\n // }\r\n // //\r\n}\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopViewSpinner } from '../Components/saop-view-spinner'\r\n\r\nexport interface SaopServicesCoreParams {\r\n action:string;\r\n async?:boolean\r\n type?:string;\r\n data?:any;\r\n spinnerDivId?:string;\r\n // contentType?: string | false | undefined;\r\n // dataType?: 'xml' | 'html' | 'script' | 'json' | 'jsonp' | 'text' | string | undefined;\r\n // processData?: boolean | undefined;\r\n}\r\n\r\nexport enum SaopServicesCoreResult {\r\n success = 1\r\n , error = 2\r\n}\r\n\r\nexport enum SaopServicesCoreHTTPResultStatusCode {\r\n ok = 200,\r\n unauthorized = 401,\r\n internalServerError = 500\r\n}\r\n\r\nexport interface SaopServicesCoreResponse {\r\n response: SaopServicesCoreResult;\r\n data: any;\r\n};\r\n\r\n// function syncDelay(milliseconds:any){\r\n// var start = new Date().getTime();\r\n// var end=0;\r\n// while( (end-start) < milliseconds){\r\n// end = new Date().getTime();\r\n// }\r\n// }\r\n\r\nexport class SaopServicesCore {\r\n private _saopViewSpinner:SaopViewSpinner = new SaopViewSpinner();\r\n private _params:SaopServicesCoreParams;\r\n private _defaultParams:SaopServicesCoreParams;\r\n // \r\n //public _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n\r\n constructor(){\r\n this._defaultParams = {\r\n action:\"\"\r\n ,type:\"GET\"\r\n ,async:true\r\n ,data:null\r\n ,spinnerDivId:\"\"\r\n };\r\n }\r\n\r\n private onDone(result:any){\r\n global.ConsoleLogDegug(\"SaopServicesCore.onDone\");\r\n this.afterDone(result);\r\n //this._saopViewSpinner.hideLoadingSaop(this._params.spinnerDivId); \r\n }\r\n\r\n afterDone(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterDone\");\r\n } \r\n\r\n private onSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.success\");\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n if (typeof result.success === \"undefined\" || result.success === null) {\r\n _result.response = SaopServicesCoreResult.success;\r\n } else {\r\n _result.response = result.success == true ? SaopServicesCoreResult.success : SaopServicesCoreResult.error;\r\n }\r\n \r\n _result.data = result;\r\n this.afterSuccess(_result);\r\n }\r\n\r\n afterSuccess(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n private onError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.error\");\r\n \r\n if (result.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n // redirect to login\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n if (result.status = SaopServicesCoreHTTPResultStatusCode.internalServerError && !global.isUnDefined(result.responseText)) {\r\n alert(\"Internal error!\");\r\n }\r\n\r\n let _result:SaopServicesCoreResponse = {response:null,data:null}; \r\n _result.response = SaopServicesCoreResult.error;\r\n _result.data = result;\r\n this.afterError(_result);\r\n }\r\n\r\n afterError(result:any):void{\r\n global.ConsoleLogDegug(\"SaopServicesCore.afterSuccess\");\r\n } \r\n\r\n ExecuteAction(params:SaopServicesCoreParams):void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = global.getSiteAbsoluteURL(params.action);\r\n\r\n //@Url.Action(\"crearCampManual\", \"DPS\")\r\n\r\n try {\r\n $.ajax({\r\n async: params.async,\r\n url: _ajaxAction,\r\n type: !global.isEmpty(params.type) ? params.type : \"POST\",\r\n data: params.data,\r\n // contentType: params.contentType == null ? 'application/x-www-form-urlencoded; charset=UTF-8' : params.contentType,\r\n // dataType: params.type == null ? 'Intelligent Guess (xml, json, script, or html)' : params.type, \r\n // processData : params.processData == null ? true : params.processData, \r\n beforeSend: function () { _this._saopViewSpinner.showLoadingSaop(params.spinnerDivId); },\r\n complete: function () { _this._saopViewSpinner.hideLoadingSaop(params.spinnerDivId); },\r\n success: this.onSuccess.bind(_this),\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch(err) {\r\n alert(\"Internal error!\");\r\n } \r\n\r\n \r\n }\r\n\r\n ExecuteBlobAction(params: SaopServicesCoreParams): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.ExecuteBlobAction\");\r\n let options = { ...this._defaultParams, ...params };\r\n params = options;\r\n this._params = params;\r\n let _this = this;\r\n let _ajaxAction = global.getSiteAbsoluteURL(params.action);\r\n\r\n try {\r\n $.ajax({\r\n type: \"POST\",\r\n url: _ajaxAction,\r\n data: params.data,\r\n xhrFields: {\r\n responseType: 'blob' // to avoid binary data being mangled on charset conversion\r\n },\r\n beforeSend: function () { _this._saopViewSpinner.showLoadingSaop(params.spinnerDivId); },\r\n complete: function () { _this._saopViewSpinner.hideLoadingSaop(params.spinnerDivId); },\r\n success: function (blob, status, xhr) {\r\n // check for a filename\r\n var filename = \"\";\r\n var disposition = xhr.getResponseHeader('Content-Disposition');\r\n if (disposition && disposition.indexOf('attachment') !== -1) {\r\n var filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n var matches = filenameRegex.exec(disposition);\r\n if (matches != null && matches[1]) filename = matches[1].replace(/['\"]/g, '');\r\n }\r\n\r\n //if (typeof window.navigator.msSaveBlob !== 'undefined') {\r\n // // IE workaround for \"HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed.\"\r\n // window.navigator.msSaveBlob(blob, filename);\r\n //} else\r\n //{\r\n var URL = window.URL || window.webkitURL;\r\n var downloadUrl = URL.createObjectURL(blob);\r\n\r\n if (filename) {\r\n // use HTML5 a[download] attribute to specify filename\r\n var a = document.createElement(\"a\");\r\n // safari doesn't support this yet\r\n if (typeof a.download === 'undefined') {\r\n window.location.href = downloadUrl;\r\n } else {\r\n a.href = downloadUrl;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n }\r\n } else {\r\n window.location.href = downloadUrl;\r\n }\r\n\r\n setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup\r\n //}\r\n },\r\n error: this.onError.bind(_this)\r\n }).done(function (result) {\r\n global.ConsoleLogDegug(\"Done...\");\r\n _this.onDone(result);\r\n });\r\n }\r\n catch (err) {\r\n alert(\"Internal error!\");\r\n }\r\n }\r\n \r\n public handleSubmitError(response: any): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.HandleSubmitError\");\r\n\r\n if (response.status == SaopServicesCoreHTTPResultStatusCode.unauthorized) {\r\n this.unAuthorizedRedirectToLoginPage();\r\n return;\r\n }\r\n\r\n // display error\r\n console.log(\"response\", response);\r\n alert(response.statusText);\r\n }\r\n\r\n public unAuthorizedRedirectToLoginPage(): void {\r\n global.ConsoleLogDegug(\"SaopServicesCore.redirectToLoginPage\");\r\n\r\n window.location.reload();\r\n }\r\n \r\n //\r\n}\r\n","import { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore } from \"../Core/saop-services-core\";\r\n\r\nexport class SaopTranslation {\r\n public key: string = \"#\";\r\n public translation: string = null;\r\n}\r\n\r\nexport class SaopTranslations {\r\n public translationsList:[SaopTranslation?] = [];\r\n}\r\n\r\n\r\nexport interface SaopTranslationServiceParams {\r\n controller:string,\r\n action:string,\r\n}\r\n\r\n\r\nexport class SaopTranslationService {\r\n private _params:SaopTranslationServiceParams;\r\n private _saopServicesCore: SaopServicesCore;\r\n //\r\n public _terminology:SaopTranslations;\r\n\r\n\r\n constructor(params:SaopTranslationServiceParams = null){\r\n if(!global.isUnDefined(params)){\r\n this._params = params;\r\n } else {\r\n this._params = {controller:\"Translation\",action:\"GetTranslations\"};\r\n }\r\n \r\n this._saopServicesCore = new SaopServicesCore();\r\n this._terminology = new SaopTranslations();\r\n }\r\n \r\n setTranslationsList(translations:string[]):any{\r\n let _this = this;\r\n translations.forEach(function (value) {\r\n _this._terminology.translationsList.push({key:value,translation:value}); \r\n }); \r\n return this.getTranslations(this._terminology);\r\n }\r\n\r\n getTranslations(translations:SaopTranslations):any{\r\n let jsonData = JSON.stringify(translations);\r\n let _data = {jsonInput:jsonData};\r\n let _response:any;\r\n this._saopServicesCore.afterDone = function (response) {\r\n _response = response;\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: this._params.controller+\"/\"+this._params.action+\"\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n this._terminology.translationsList = _response.translationsList;\r\n return _response;\r\n }\r\n\r\n translate(key:string):string{\r\n let _tr = this._terminology.translationsList.find(e => e.key == key) as any;\r\n if (global.isUnDefined(_tr)) { \r\n return key;\r\n } else {\r\n return _tr.translation;\r\n }\r\n }\r\n\r\n //\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\n\r\nexport class SaopUtils {\r\n checkCompatibility():boolean {\r\n return SaopCommon.checkCompatibility();\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/// \r\nimport { global } from \"../Common/saop-common\";\r\nimport { SaopServicesCore,SaopServicesCoreParams, SaopServicesCoreResponse, SaopServicesCoreResult } from './saop-services-core'\r\nimport { SaopMessageDlg, SaopMsgDlgButton } from '../Components/saop-message-dlg';\r\nimport { SaopTranslationService } from '../Core/saop-translate';\r\nimport {SaopFloatingLabel } from '../Components/saop-floating-label';\r\n\r\nexport class Error {\r\n public Code: string;\r\n public Message: string;\r\n}\r\n\r\nexport enum SaopWfAction {\r\n wfaNone = 0\r\n ,wfaAddRecord = 1\r\n ,wfaEditRecord = 2\r\n ,wfaDeleteRecord = 3\r\n ,wfaRecordDestails = 4\r\n}\r\n\r\nexport interface SaopWfSubmitResult {\r\n success:boolean;\r\n viewContent:string;\r\n redirectTo:string;\r\n alertMessage:string;\r\n}\r\n\r\nexport class SaopViewForm {\r\n private _viewModalFrame:JQuery;\r\n private _viewModalBody:JQuery;\r\n private _view_title:JQuery;\r\n private _view_btnOk:JQuery;\r\n private _view_btnCancel:JQuery;\r\n private _servicesParams:SaopServicesCoreParams = {action:null,data:null,type:\"POST\"};\r\n private _terminology: string[];\r\n //\r\n public _libName:string;\r\n public saopServicesCore:SaopServicesCore = new SaopServicesCore();\r\n public translationService:SaopTranslationService;\r\n public contentElementId = \".saop-modal-body-element\";\r\n public addRecordEndpoint: string = \"\";\r\n public editRecordEndpoint: string = \"\";\r\n public deleteRecordEndpoint: string = \"\";\r\n public manuallySubmitEndpoint: string = \"\";\r\n public saopFloatingLabel: SaopFloatingLabel;\r\n //\r\n public onSucccessCallback: string = \"\";\r\n public onErrorCallback: string = \"\";\r\n public onFailureCallback: string = \"\";\r\n // \r\n public id:string;\r\n public title:string;\r\n public fullScreen:boolean = false;\r\n //\r\n public onClose: (params:any) => any = null;\r\n public onSubmit: (params:any) => any = null;\r\n public onError: (params:any) => any = null;\r\n\r\n constructor(viewId:string,libName:string = \"\"){\r\n global.ConsoleLogDegug(\"SaopViewForm...\");\r\n global.ConsoleLogDegug(\"viewId:\"+viewId);\r\n this.id = viewId;\r\n this._libName = libName;\r\n this.onSucccessCallback = libName+\".onSubmitSuccess(data,\"+libName+\");\";\r\n this.onErrorCallback = libName + \".onSubmitError(data,\" + libName + \");\";\r\n this.onFailureCallback = libName + \".onSubmitFailure(xhr,\" + libName + \");\";\r\n this.translationService = new SaopTranslationService();\r\n this.saopFloatingLabel = new SaopFloatingLabel();\r\n // \r\n }\r\n\r\n public setTerminologyList(dictionary: string[] = null) {\r\n this._terminology = [\"Uredi\",\"Nov vnos\",\"Podrobnosti\",\"Brisanje\"];\r\n if (dictionary != null) {\r\n this._terminology = this._terminology.concat(dictionary);\r\n }\r\n this.translationService.setTranslationsList(this._terminology);\r\n }\r\n\r\n public onBtnOkClick(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnOkClick...\");\r\n }\r\n\r\n public onBtnCancel(sender:any):void{\r\n global.ConsoleLogDegug(\"onBtnCancel...\");\r\n }\r\n\r\n public beforeViewShow(sender:any):void{\r\n global.ConsoleLogDegug(this.id+\".beforeViewShow()\");\r\n\r\n this._viewModalFrame = $(this.id);\r\n if (this._viewModalFrame == null) { console.log(this.id+\" not found!\");};\r\n //\r\n var contentSel = this.id + \" \" + this.contentElementId;\r\n this._viewModalBody = $(contentSel);\r\n }\r\n\r\n public afterViewShow(sender:any,wfAction:SaopWfAction):void{\r\n global.ConsoleLogDegug(this.id+\".afterViewShow()\");\r\n let _this = this;\r\n this._view_btnOk = $(\"\"+this.id+\" *> #btnOk\");\r\n this._view_btnCancel = $(\"\"+this.id+\" *> #btnCancel\");\r\n this._view_title = $(\"\"+this.id+\" *> #exampleModalLongTitle\");\r\n //\r\n\r\n global.ConsoleLogDegug(\"afterViewShow title:\"+ this.title);\r\n\r\n if (!global.isEmpty(this.title)){\r\n let _title = \"\";\r\n if (wfAction == SaopWfAction.wfaAddRecord){\r\n _title = this.translationService.translate(\"Nov vnos\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaEditRecord){\r\n _title = this.translationService.translate(\"Uredi\")+\": \"+this.title;\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails){\r\n _title = this.translationService.translate(\"Podrobnosti\")+\": \"+this.title;\r\n }\r\n\r\n global.ConsoleLogDegug(\"afterViewShow _title:\"+ _title);\r\n\r\n this._view_title.html(_title);\r\n } else {\r\n if (wfAction == SaopWfAction.wfaAddRecord){\r\n let defaultTitleAdd = $(\"\"+this.id+\" *> #addTitle\").val().toString();\r\n this._view_title.html(defaultTitleAdd);\r\n } else {\r\n let defaultTitleEdit = $(\"\"+this.id+\" *> #editTitle\").val().toString();\r\n this._view_title.html(defaultTitleEdit);\r\n }\r\n }\r\n\r\n this.viewShowComplete(sender, wfAction);\r\n\r\n //\r\n this.bindButtons(sender);\r\n\r\n this.bindViewEvents();\r\n\r\n this._viewModalFrame.modal('show');\r\n global.setModalFormZIndex(this.id);\r\n global.setFirstFormControlToFocus(this.id);\r\n //\r\n this.afterViewShowSuccess(sender);\r\n }\r\n\r\n public afterViewShowSuccess(sender:any):void{\r\n global.ConsoleLogDegug(this.id + \".afterViewShowSuccess()\");\r\n }\r\n\r\n public viewShowComplete(sender: any, wfAction: SaopWfAction): void {\r\n global.ConsoleLogDegug(this.id + \".viewShowComplete()\");\r\n }\r\n\r\n private bindButtons(sender: any): void {\r\n global.ConsoleLogDegug(\"bindButtons\");\r\n let _this = this;\r\n\r\n this._view_btnOk = $(\"\" + this.id + \" *> #btnOk\");\r\n this._view_btnOk.click(\r\n function () {\r\n _this.onBtnOkClick(sender);\r\n }\r\n );\r\n\r\n this._view_btnCancel = $(\"\" + this.id + \" *> #btnCancel\");\r\n this._view_btnCancel.click(\r\n function () {\r\n _this.onBtnCancel(sender);\r\n }\r\n );\r\n }\r\n\r\n public bindViewEvents(): void {\r\n global.ConsoleLogDegug(\"bindViewEvents\");\r\n\r\n let divForm = this._viewModalFrame.find(\"form\");\r\n\r\n if (this.onSucccessCallback !== null) {\r\n divForm.attr(\"data-ajax-success\", this.onSucccessCallback);\r\n }\r\n if (this.onErrorCallback !== null) {\r\n divForm.attr(\"data-ajax-error\", this.onErrorCallback);\r\n }\r\n if (this.onFailureCallback !== null) {\r\n divForm.attr(\"data-ajax-failure\", this.onFailureCallback);\r\n }\r\n \r\n this.saopFloatingLabel.init(); \r\n }\r\n\r\n private renderErrorsBanner(errors:Error[]):SaopServicesCoreResponse {\r\n let result:SaopServicesCoreResponse;\r\n result = {response:SaopServicesCoreResult.error,data:null}; \r\n //\r\n let jsonData = JSON.stringify(errors);\r\n let _data = {jsonInput:jsonData}; \r\n //\r\n let _saopServicesCore = new SaopServicesCore();\r\n _saopServicesCore.afterSuccess = function (response:SaopServicesCoreResponse) {\r\n result = response;\r\n };\r\n _saopServicesCore.ExecuteAction({\r\n action: \"Errors/RenderErrorsBanner\"\r\n , type: \"POST\"\r\n , data: _data\r\n , async: false\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public renderError(errMessage:string):void{\r\n try {\r\n global.ConsoleLogDegug(\"ajax.afterError\");\r\n let _errors:Error[];\r\n _errors = [{Code:\"\",Message:errMessage}];\r\n \r\n let _parentView = $(this.id).parent();\r\n\r\n let _errorBannerId = this.id+\"ErrorBanner\";\r\n //let _view_banner = this._viewModalBody.find(_errorBannerId);\r\n let _view_banner = _parentView.find(_errorBannerId);\r\n if ( global.isUnDefined(_view_banner) || _view_banner.length == 0) {\r\n _view_banner = _parentView.append(\"
    \");\r\n }\r\n let _bannerResult = this.renderErrorsBanner(_errors);\r\n _view_banner.html(_bannerResult.data.viewContent); \r\n }\r\n catch(err) {\r\n alert(err.message);\r\n } \r\n }\r\n //public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):SaopServicesCoreResult{\r\n public loadViewBody(wfAction:SaopWfAction,data:any,sender:any):void{\r\n global.ConsoleLogDegug(\"loadViewBody\");\r\n let _this = this;\r\n this.beforeViewShow(sender);\r\n\r\n let _ajaxAction = wfAction == SaopWfAction.wfaAddRecord ? this.addRecordEndpoint : this.editRecordEndpoint;\r\n //_ajaxAction = getSiteAbsoluteURL(_ajaxAction);\r\n\r\n this._servicesParams = {action:_ajaxAction,data:data,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n global.ConsoleLogDegug(\"ajax.success\");\r\n _this._viewModalBody.html(_ajaxResult.data);\r\n _this.afterViewShow(sender,wfAction);\r\n } else {\r\n global.ConsoleLogDegug(\"ajax.error\");\r\n if ((global.isUnDefined(_ajaxResult.data) && global.isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else if (_ajaxResult.data.responseJSON && _ajaxResult.data.responseJSON.message){\r\n alertify.error(_ajaxResult.data.responseJSON.message);\r\n } \r\n }\r\n \r\n };\r\n\r\n this.saopServicesCore.afterError = function(_ajaxResult){\r\n//###\r\n if ((global.isUnDefined(_ajaxResult.data) && global.isUnDefined(_ajaxResult.data.alertMessage)) == false){\r\n _this.renderError(_ajaxResult.data.alertMessage);\r\n } else {\r\n alert(\"Internal error!\");\r\n }\r\n };\r\n\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n } \r\n\r\n public afterSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.afterExecuteSuccess\");\r\n }\r\n\r\n public onSubmitSuccessComplete(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitSuccessComplete\");\r\n }\r\n\r\n public onSubmitError(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitError\");\r\n }\r\n\r\n public onSubmitFailure(result: any): void {\r\n global.ConsoleLogDegug(\"submit.onSubmitFailure\");\r\n var saopServicesCore = new SaopServicesCore();\r\n saopServicesCore.handleSubmitError(result);\r\n }\r\n \r\n public onSubmitSuccess(result: SaopWfSubmitResult): void {\r\n global.ConsoleLogDegug(\"submit.onExecuteSuccess\");\r\n if (result.success) {\r\n global.ConsoleLogDegug(\"submit.success\");\r\n\r\n this._viewModalFrame.modal('hide');\r\n\r\n // just in case: odstrani, če je še vedno vidno, avtomatsko se ne zapre vedno :(\r\n $('.modal-backdrop').remove();\r\n $(document.body).removeClass(\"modal-open\");\r\n\r\n if (result.alertMessage) {\r\n alertify.message(result.alertMessage);\r\n } \r\n\r\n if (!global.isUnDefined(this.refreshData)){\r\n this.refreshData(result);\r\n }\r\n\r\n this.onSubmitSuccessComplete(result);\r\n } else {\r\n global.ConsoleLogDegug(\"submit.error\");\r\n global.ConsoleLogDegug(\"reload view form\");\r\n this.refreshContent(result.viewContent);\r\n }\r\n this.afterSubmitSuccess(result);\r\n } \r\n\r\n public refreshContent(viewContent: string): void {\r\n this._viewModalBody.html(viewContent);\r\n this.bindButtons(null);\r\n this.bindViewEvents();\r\n\r\n this.onAfterRefreshContent();\r\n }\r\n\r\n public onAfterRefreshContent(): void {\r\n global.ConsoleLogDegug(\"onAfterRefreshContent\");\r\n }\r\n\r\n public onDeleteRecord(deleteData:any):void {\r\n global.ConsoleLogDegug(\"onDeleteRecord\");\r\n let _this = this;\r\n this._servicesParams = {action:this.deleteRecordEndpoint,data:deleteData,type:\"POST\"};\r\n\r\n this.saopServicesCore.afterSuccess = function(_ajaxResult){\r\n if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n alertify.message(_ajaxResult.data.alertMessage);\r\n if (!global.isUnDefined(_this.refreshData)){\r\n _this.refreshData(deleteData);\r\n }\r\n } else {\r\n alertify.error(_ajaxResult.data.alertMessage);\r\n }\r\n };\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n\r\n // let _ajaxResult = this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n // if (_ajaxResult.response == SaopServicesCoreResult.success){\r\n // alertify.message(_ajaxResult.data.alertMessage);\r\n // if (!global.isUnDefined(this.refreshData)){\r\n // this.refreshData(deleteData);\r\n // }\r\n // } else {\r\n // alertify.error(_ajaxResult.data.alertMessage);\r\n // }\r\n // return _ajaxResult.response;\r\n }\r\n \r\n public refreshData(sender:any):void {\r\n global.ConsoleLogDegug(\"refreshData\");\r\n }\r\n\r\n public deleteRecord(title:string,message:string,deleteData:any):void{\r\n global.ConsoleLogDegug(\"deleteRecord.begin\");\r\n let saopMessageDlg = new SaopMessageDlg(deleteData) \r\n saopMessageDlg.onYes = this.onDeleteRecord.bind(this);\r\n saopMessageDlg.Show(message,title,1,[SaopMsgDlgButton.mbYes,SaopMsgDlgButton.mbNo]);\r\n global.ConsoleLogDegug(\"deleteRecord.end\");\r\n }\r\n\r\n public addRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"addRecord\");\r\n let _result = this.loadViewBody(SaopWfAction.wfaAddRecord,data,sender);\r\n }\r\n\r\n public editRecord(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this.loadViewBody(SaopWfAction.wfaEditRecord,data,sender);\r\n }\r\n\r\n public recordDetails(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"editRecord\");\r\n this.loadViewBody(SaopWfAction.wfaRecordDestails,data,sender);\r\n }\r\n\r\n public manuallySubmit(submitData: any, spinnerDivId: string = null): void {\r\n global.ConsoleLogDegug(\"manuallySubmit\");\r\n\r\n let _this = this;\r\n\r\n if (global.isEmpty(spinnerDivId)) {\r\n this._servicesParams = { action: this.manuallySubmitEndpoint, data: submitData, type: \"POST\" };\r\n }\r\n else {\r\n this._servicesParams = { action: this.manuallySubmitEndpoint, data: submitData, type: \"POST\", spinnerDivId: spinnerDivId };\r\n }\r\n\r\n this.saopServicesCore.afterSuccess = function (_ajaxResult) {\r\n _this.onSubmitSuccess(_ajaxResult.data);\r\n };\r\n this.saopServicesCore.ExecuteAction(this._servicesParams);\r\n }\r\n\r\n public showViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n if (wfAction == SaopWfAction.wfaAddRecord) {\r\n this.addRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaEditRecord) {\r\n this.editRecord(data,sender);\r\n } else if (wfAction == SaopWfAction.wfaRecordDestails) { \r\n this.recordDetails(data,sender); \r\n } \r\n this.SetToFullScreen(); \r\n } \r\n\r\n public SetToFullScreen(){\r\n if (this.fullScreen ){\r\n this._viewModalFrame.addClass(\"saop-modal-fullscreen-form\");\r\n let _dialogDiv = this._viewModalFrame.find(\".modal-dialog\");\r\n _dialogDiv.removeClass('modal-dialog-centered');\r\n _dialogDiv.addClass('modal-fullscreen');\r\n _dialogDiv.removeAttr('style');\r\n \r\n let _content = this._viewModalFrame.find(\".modal-content\");\r\n _content.removeAttr('class');\r\n _content.addClass('modal-content');\r\n }\r\n }\r\n\r\n public refreshElementData(htmlContent:string,elementId:string): void {\r\n global.ConsoleLogDegug(\"refreshElementData\");\r\n let _document = $(htmlContent);\r\n let _cell = _document.find(elementId);\r\n $(elementId).replaceWith(_cell);\r\n }\r\n\r\n // \r\n}\r\n","import { global } from \"./Common/saop-common\";\r\nimport { SaopUtils } from \"./Core/saop-utils\";\r\nimport { SaopTogglePanel } from \"./Components/saop-toggle-panel\";\r\nimport { SaopInputMask } from \"./Components/saop-inputmask\";\r\nimport { SaopCheckboxSwitch } from \"./Components/saop-checkbox-switch\";\r\nimport { SaopMultiselect } from \"./Components/saop-multiselect\";\r\nimport { SaopViewSpinner } from './Components/saop-view-spinner';\r\nimport { SaopRightSidebar } from './Components/saop-right-sidebar';\r\nimport { MenuSidebar } from \"./Components/saop-menu-sidebar\";\r\nimport { SaopMessageDlg } from \"./Components/saop-message-dlg\";\r\nimport { SaopPopupDialog } from './Components/saop-popup-dialog'\r\nimport { SaopFloatingLabel } from \"./Components/saop-floating-label\";\r\nimport { SaopServicesCore } from './Core/saop-services-core';\r\nimport { SaopTranslationService } from './Core/saop-translate';\r\nimport { SaopWebGrid } from './Components/saop-grid';\r\nimport { SaopViewForm } from './Core/saop-view-form';\r\nimport { SaopTreeview } from './Components/saop-treeview';\r\nimport { SaopSelectizeSelect } from './Components/saop-selectize-select';\r\nimport { SaopPdfPreview } from \"./Components/saop-pdf-preview\";\r\nimport { SaopPinchZoom } from \"./Components/saop-pinch-and-zoom\";\r\n\r\nexport function echoTest(msg:string): void {\r\n console.log(\"echo: \"+msg);\r\n}\r\n\r\nexport function checkCompatibility(): boolean {\r\n global.ConsoleLogDegug(\"checkCompatibility\");\r\n let utils = new SaopUtils();\r\n return utils.checkCompatibility();\r\n}\r\n\r\nexport function initClientLogModeValue() {\r\n global.debugMode = global.GetClientLogModeStorageValue();\r\n}\r\n\r\nexport function initSiteBaseUrlValue() {\r\n global.siteBaseUrl = global.getSiteBaseUrl()\r\n}\r\n\r\nexport function initializeSiteJS() {\r\n global.ConsoleLogDegug(\"initializeSiteJS\");\r\n new MenuSidebar().init();\r\n new SaopTogglePanel().init();\r\n\r\n document.addEventListener('keydown', function (e) {\r\n if (e.ctrlKey && e.altKey && e.keyCode == 79) {\r\n // CTRL + ALT + O\r\n global.SetClientLogModeStorageValue();\r\n global.debugMode = global.GetClientLogModeStorageValue();\r\n }\r\n });\r\n\r\n global.setHelpLink();\r\n}\r\n\r\nexport function setFirstControlToFocus(formId: string) {\r\n global.setFirstFormControlToFocus(formId);\r\n}\r\n\r\nexport {global};\r\n\r\n\r\n\r\nexport class SaopTogglePanelEx extends SaopTogglePanel{};\r\n\r\nexport class SaopInputMaskEx extends SaopInputMask{};\r\n\r\nexport class SaopCheckboxSwitchEx extends SaopCheckboxSwitch{};\r\n\r\nexport class SaopMultiselectEx extends SaopMultiselect{};\r\n\r\nexport class SaopMessageDlgEx extends SaopMessageDlg{};\r\n\r\nexport class SaopPopupDialogEx extends SaopPopupDialog{};\r\n\r\nexport class SaopViewSpinnerEX extends SaopViewSpinner { };\r\n\r\nexport class SaopRightSidebarEx extends SaopRightSidebar { };\r\n\r\nexport class SaopFloatingLabelEx extends SaopFloatingLabel { };\r\n\r\nexport class SaopServicesCoreEx extends SaopServicesCore { };\r\n\r\nexport class SaopTranslationServiceEx extends SaopTranslationService { };\r\n\r\nexport class SaopWebGridEx extends SaopWebGrid { };\r\n\r\nexport class SaopViewFormEx extends SaopViewForm { };\r\n\r\nexport class SaopUtilsEx extends SaopUtils { };\r\n\r\nexport class SaopTreeviewEx extends SaopTreeview { };\r\n\r\nexport class SaopSelectizeSelectEx extends SaopSelectizeSelect { };\r\n\r\nexport class SaopPdfPreviewEx extends SaopPdfPreview {};\r\n\r\nexport class SaopPinchZoomEx extends SaopPinchZoom {};\r\n//\r\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJUeXBlU2NyaXB0cy9Db21tb24vc2FvcC1jb21tb24udHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtY2hlY2tib3gtc3dpdGNoLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWZsb2F0aW5nLWxhYmVsLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWdyaWQtZWRpdC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1ncmlkLWZpbHRlci50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1ncmlkLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWlucHV0LXdmbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1pbnB1dG1hc2sudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtbWVudS1zaWRlYmFyLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtZGxnLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBkZi1wcmV2aWV3LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBpbmNoLWFuZC16b29tLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXBvcG92ZXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3AtcG9wdXAtZGlhbG9nLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXIudHMiLCJUeXBlU2NyaXB0cy9Db21wb25lbnRzL3Nhb3Atc2VsZWN0LXdmbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0LnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLXRvZ2dsZS1wYW5lbC50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC10cmVldmlldy50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC12aWV3LXNwaW5uZXIudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3Atc2VydmljZXMtY29yZS50cyIsIlR5cGVTY3JpcHRzL0NvcmUvc2FvcC10cmFuc2xhdGUudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3AtdXRpbHMudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3Atdmlldy1mb3JtLnRzIiwiVHlwZVNjcmlwdHMvbWFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQzs7Ozs7Ozs7O0lBRXFCLE07Ozs7Ozs7d0NBSVksTyxFQUFZO0FBQ3RDLGdCQUFJLEtBQUssU0FBVCxFQUFvQixRQUFRLEdBQVIsQ0FBWSxPQUFaO0FBQ3ZCOzs7MERBRTRDO0FBQ3pDLG1CQUFPLG9DQUFQO0FBQ0g7Ozt1REFFeUM7QUFDdEMsZ0JBQUksd0JBQXdCLEtBQTVCO0FBRUEsZ0JBQUkscUJBQXFCLEtBQUssdUJBQUwsQ0FBNkIsT0FBTywrQkFBUCxFQUE3QixDQUF6QjtBQUVBLGdCQUFJLGVBQWUscUJBQW5CO0FBQ0EsZ0JBQUksa0JBQUosRUFBd0I7QUFDcEIsK0JBQWUsdUJBQXVCLE1BQXZCLEdBQWdDLElBQWhDLEdBQXVDLEtBQXREO0FBQ0g7QUFFRCxtQkFBTyxZQUFQO0FBQ0g7Ozt1REFFeUM7QUFDdEMsZ0JBQUksVUFBVSxLQUFLLDRCQUFMLEVBQWQ7QUFDQSxpQkFBSyxzQkFBTCxDQUE0QixPQUFPLCtCQUFQLEVBQTVCLEVBQXNFLENBQUMsT0FBdkU7QUFFQSxxQkFBUyxPQUFULENBQWlCLDhCQUE4QixDQUFDLE9BQWhEO0FBQ0g7Ozt5Q0FFMkI7QUFDeEIsbUJBQU8sRUFBRSxjQUFGLEVBQWtCLEdBQWxCLEVBQVA7QUFDSDs7O3NDQUV3QjtBQUNyQjtBQUNBLGdCQUFJLFFBQVEsSUFBWjtBQUNBLGdCQUFJLFVBQWUsU0FBUyxjQUFULENB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LGlCQUFBO0FBQXdEOztJQUUzQyxpQjs7Ozs7Ozs7OztFQUEwQixvQkFBQSxlOztBQUF2QyxRQUFBLGlCQUFBLEdBQUEsaUJBQUE7QUFBMEQ7O0lBRTdDLGtCOzs7Ozs7Ozs7O0VBQTJCLHFCQUFBLGdCOztBQUF4QyxRQUFBLGtCQUFBLEdBQUEsa0JBQUE7QUFBNEQ7O0lBRS9DLG1COzs7Ozs7Ozs7O0VBQTRCLHNCQUFBLGlCOztBQUF6QyxRQUFBLG1CQUFBLEdBQUEsbUJBQUE7QUFBOEQ7O0lBRWpELGtCOzs7Ozs7Ozs7O0VBQTJCLHFCQUFBLGdCOztBQUF4QyxRQUFBLGtCQUFBLEdBQUEsa0JBQUE7QUFBNEQ7O0lBRS9DLHdCOzs7Ozs7Ozs7O0VBQWlDLGlCQUFBLHNCOztBQUE5QyxRQUFBLHdCQUFBLEdBQUEsd0JBQUE7QUFBd0U7O0lBRTNELGE7Ozs7Ozs7Ozs7RUFBc0IsWUFBQSxXOztBQUFuQyxRQUFBLGFBQUEsR0FBQSxhQUFBO0FBQWtEOztJQUVyQyxjOzs7Ozs7Ozs7O0VBQXVCLGlCQUFBLFk7O0FBQXBDLFFBQUEsY0FBQSxHQUFBLGNBQUE7QUFBb0Q7O0lBRXZDLFc7Ozs7Ozs7Ozs7RUFBb0IsYUFBQSxTOztBQUFqQyxRQUFBLFdBQUEsR0FBQSxXQUFBO0FBQThDOztJQUVqQyxjOzs7Ozs7Ozs7O0VBQXVCLGdCQUFBLFk7O0FBQXBDLFFBQUEsY0FBQSxHQUFBLGNBQUE7QUFBb0Q7O0lBRXZDLHFCOzs7Ozs7Ozs7O0VBQThCLHdCQUFBLG1COztBQUEzQyxRQUFBLHFCQUFBLEdBQUEscUJBQUE7QUFBa0U7O0lBRXJELGdCOzs7Ozs7Ozs7O0VBQXlCLG1CQUFBLGM7O0FBQXRDLFFBQUEsZ0JBQUEsR0FBQSxnQkFBQTtBQUF1RDs7SUFFMUMsZTs7Ozs7Ozs7OztFQUF3QixzQkFBQSxhOztBQUFyQyxRQUFBLGVBQUEsR0FBQSxlQUFBO0FBQXFEO0FBQ3JEIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBnbG9iYWwge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWJ1Z01vZGU6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgc3RhdGljIHNpdGVCYXNlVXJsOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDb25zb2xlTG9nRGVndWcobWVzc2FnZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWdNb2RlKSBjb25zb2xlLmxvZyhtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldENsaWVudExvZ01vZGVTdG9yYWdlS2V5VmFsdWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gXCJTYW9wTW9qSW5mby5nbG9iYWxDbGllbnRMb2dNb2RlVmFsXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBkZWJ1Z01vZGVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIGRlYnVnTW9kZVN0cmluZ1ZhbCA9IHRoaXMuUmVhZFZhcmlhYmxlRnJvbVN0b3JhZ2UoZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlS2V5VmFsdWUoKSk7XHJcblxyXG4gICAgICAgIGxldCBkZWJ1Z01vZGVWYWwgPSBkZWJ1Z01vZGVEZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgaWYgKGRlYnVnTW9kZVN0cmluZ1ZhbCkge1xyXG4gICAgICAgICAgICBkZWJ1Z01vZGVWYWwgPSBkZWJ1Z01vZGVTdHJpbmdWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRlYnVnTW9kZVZhbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGxvZ01vZGUgPSB0aGlzLkdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxuICAgICAgICB0aGlzLldyaXRlVmFyaWFibGVUb1N0b3JhZ2UoZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlS2V5VmFsdWUoKSwgIWxvZ01vZGUpO1xyXG5cclxuICAgICAgICBhbGVydGlmeS5tZXNzYWdlKFwiQ2xpZW50IGxvZyBtb2RlIGVuYWJsZWQ6IFwiICsgIWxvZ01vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2l0ZUJhc2VVcmwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJChcIiNzaXRlQmFzZVVybFwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzZXRIZWxwTGluaygpOiB2b2lkIHtcclxuICAgICAgICAvL25hc3RhdmkgaGVscCBsaW5rLCB2IG9kdmlzbm9zdGkgb2QgbG9rYWxpemFjaWplXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc3ZnSGVscDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nhb3AtaGVscCcpO1xyXG5cclxuICAgICAgICBpZihzdmdIZWxwICE9IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2UgPSBzdmdIZWxwLmdldEF0dHJpYnV0ZShcImRhdGEtbGFuZ3VhZ2VcIik7XHJcblxyXG4gICAgICAgICAgICAvL3BvxI1ha2FtbyBkYSBzZSBnbmVzemRlbmkgb2JqZWt0IG5hbG/FvmlcclxuICAgICAgICAgICAgc3ZnSGVscC5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3ZnSGVscExpbmsgPSBzdmdIZWxwLmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNhb3AtaGVscC1saW5rXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzVW5EZWZpbmVkKHN2Z0hlbHBMaW5rKSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZSA9PSBcImhyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ZnSGVscExpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImh0dHA6Ly9oZWxwLnNhb3AuaHIvaHIvbW9qaW5mb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ3VhZ2UgPT0gXCJzclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN2Z0hlbHBMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgXCJodHRwOi8vd3d3LnNhb3AucnMvaWNlbnRlci8xMDAvdXB1dHN0dmEtemEtdXBvdHJlYnUvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ZnSGVscExpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImh0dHBzOi8vc2ktaWNlbnRlci5rbm93bGVkZ2Vvd2wuY29tL2hlbHAvbW9qaW5mby1uYXZvZGlsYS16YS11cG9yYWJvLXByZW5vdmxqZW5lZ2EtcG9ydGFsYVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy96YXJhZGkgYnJhc2thbG5payAtIG1vemlsbGEgZmlyZWZveCAtIGl6Z2xlZGEsIGRhIGplIG9iamVjdCAnJ2xvYWRlZCcnIHByZWRlbiBtdSBkb2RhbW8gb24gbG9hZGVkXHJcbiAgICAgICAgICAgIGlmKCQoJyNzYW9wLWhlbHAtbGluaycpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdsb2FkJyk7XHJcbiAgICAgICAgICAgICAgICBzdmdIZWxwLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdG8yID0gKG46IG51bWJlcik6IHN0cmluZyA9PiAoKE1hdGguYWJzKG4pIDwgMTAgPyAnMCcgOiAnJykgKyBNYXRoLmFicyhuKSk7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9beWRtaF0rL2dpLCAobWF0Y2g6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3l5eXknOiByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkJzogcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkZCc6IHJldHVybiB0bzIoZGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbSc6IHJldHVybiAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ21tJzogcmV0dXJuIHRvMihkYXRlLmdldE1vbnRoKCkgKyAxKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0gnOiByZXR1cm4gZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdISCc6IHJldHVybiB0bzIoZGF0ZS5nZXRIb3VycygpKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ01NJzogcmV0dXJuIHRvMihkYXRlLmdldE1pbnV0ZXMoKSk7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZzJEYXRlKHN0cmluZ0RhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpOiBEYXRlIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY29udmVydFN0cmluZzJEYXRlXCIpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiZGQubW0ueXl5eVwiOlxyXG4gICAgICAgICAgICAgICAgbGV0IGRheSA9IHN0cmluZ0RhdGUuc3Vic3RyaW5nKDAsIDIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoMywgNSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgeWVhciA9IHN0cmluZ0RhdGUuc3Vic3RyaW5nKDYsIDEwKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoK3llYXIsICttb250aCAtIDEsICtkYXkpO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbnZlcnRTdHJpbmcyTnVtYmVyKHN0cmluZ1ZhbDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY29udmVydFN0cmluZzJOdW1iZXJcIik7XHJcblxyXG4gICAgICAgIGxldCBudW1iZXJWYWwgPSBwYXJzZUludChzdHJpbmdWYWwpXHJcblxyXG4gICAgICAgIGlmIChpc05hTihudW1iZXJWYWwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bWJlclZhbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldE1vZGFsRm9ybVpJbmRleChtb2RhbEZvcm1JZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNldE1vZGFsRm9ybVpJbmRleFwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW9kYWxGb3JtSWQ6XCIgKyBtb2RhbEZvcm1JZCk7XHJcbiAgICAgICAgdmFyIHpJbmRleCA9IDEwNTAgKyAoMTAgKiAkKCcubW9kYWw6dmlzaWJsZScpLmxlbmd0aCk7XHJcblxyXG4gICAgICAgICQobW9kYWxGb3JtSWQpLmNzcygnei1pbmRleCcsIHpJbmRleCk7XHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQoJy5tb2RhbC1iYWNrZHJvcCcpLm5vdCgnLm1vZGFsLXN0YWNrJykuY3NzKCd6LWluZGV4JywgekluZGV4IC0gMSkuYWRkQ2xhc3MoJ21vZGFsLXN0YWNrJyk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc0VtcHR5KHN0cjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuICghc3RyIHx8IHN0ci5sZW5ndGggPT09IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNVbkRlZmluZWQoX29iajogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuICghX29iaiB8fCBfb2JqID09PSBudWxsIHx8IHR5cGVvZiBfb2JqID09PSBcInVuZGVmaW5lZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFJlYWRWYXJpYWJsZUZyb21TdG9yYWdlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odmFyaWFibGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFdyaXRlVmFyaWFibGVUb1N0b3JhZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh2YXJpYWJsZU5hbWUsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGZpbHRlclRhYmxlUm93cyhmaWx0ZXJWYWw6IHN0cmluZywgaWRUYWJsZUVsZW1lbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJmaWx0ZXJUYWJsZVJvd3NcIik7XHJcblxyXG4gICAgICAgIGxldCB2YWwgPSAkLnRyaW0oZmlsdGVyVmFsKS5yZXBsYWNlKC8gKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgbGV0IHJvd3MgPSAkKGlkVGFibGVFbGVtZW50ICsgXCIgdHI6aGFzKHRkKVwiKTtcclxuXHJcbiAgICAgICAgcm93cy5zaG93KCkuZmlsdGVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHRleHQgPSAkKHRoaXMpLnRleHQoKS5yZXBsYWNlKC9cXHMrL2csICcgJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuICF+dGV4dC5pbmRleE9mKHZhbCk7XHJcbiAgICAgICAgfSkuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXMoZm9ybUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXNcIik7XHJcblxyXG4gICAgICAgIC8vIGJyZXogdGltZW91dCBmdW5rY2lqZSBmb2N1cyBuZSBkZWxhIDooXHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBmaXJzdEZvcm1Db250cm9sID0gJChmb3JtSWQgKyBcIiAuZm9ybS1jb250cm9sOnZpc2libGU6bm90KDpkaXNhYmxlZCk6Zmlyc3RcIik7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdEZvcm1Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdEZvcm1Db250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVsYXRpdmVTaXRlVVJMKGNvbnRyb2xsZXI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IF91cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICBsZXQgaUMgPSBfdXJsLmluZGV4T2YoY29udHJvbGxlcik7XHJcbiAgICAgICAgaWYgKGlDID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3VybC5zdWJzdHJpbmcoMCwgaUMpICsgY29udHJvbGxlcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2l0ZUFic29sdXRlVVJMKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgY29udHJvbGxlciA9IHJlbGF0aXZlUGF0aC5zcGxpdChcIi9cIilbMF07XHJcbiAgICAgICAgbGV0IG1ldGhvZCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKGNvbnRyb2xsZXIsIFwiXCIpLnJlcGxhY2UoXCIvL1wiLCBcIlwiKTtcclxuXHJcbiAgICAgICAgLy8gxI1lIHJlbGF0aXZlIHBhdGggxb5lIHZzZWJ1amUgaHR0cCwgZ2EgbmUgZG9kYW1vXHJcbiAgICAgICAgaWYgKHJlbGF0aXZlUGF0aC5pbmRleE9mKFwiaHR0cFwiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZ2xvYmFsLmdldFNpdGVCYXNlVXJsKCkgKyBcIi9cIiArIGNvbnRyb2xsZXIgKyBtZXRob2Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyByZWxvZGVDdXJyZW50UGFnZSgpOiB2b2lkIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRIdG1sSW5wdXRTdHJpbmdWYWx1ZShwYXJlbnRJZDogc3RyaW5nLCBlbGVtZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRTZWxlY3RvciA9IHBhcmVudElkID09PSBudWxsID8gZWxlbWVudElkIDogcGFyZW50SWQgKyBcIiBcIiArIGVsZW1lbnRJZDtcclxuXHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKGVsZW1lbnRTZWxlY3RvcilcclxuICAgICAgICByZXR1cm4gZWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SHRtbElucHV0TnVtZXJpY1ZhbHVlKHBhcmVudElkOiBzdHJpbmcsIGVsZW1lbnRJZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMuZ2V0SHRtbElucHV0U3RyaW5nVmFsdWUocGFyZW50SWQsIGVsZW1lbnRJZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SHRtbElucHV0Qm9vbGVhblZhbHVlKHBhcmVudElkOiBzdHJpbmcsIGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SHRtbElucHV0U3RyaW5nVmFsdWUocGFyZW50SWQsIGVsZW1lbnRJZCkudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEpRdWVyeUlucHV0U3RyaW5nVmFsdWUoZWxlbWVudDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoZWxlbWVudC52YWwoKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SlF1ZXJ5SW5wdXROdW1lcmljVmFsdWUoZWxlbWVudDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+KTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc3RyVmFsID0gdGhpcy5nZXRKUXVlcnlJbnB1dFN0cmluZ1ZhbHVlKGVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChzdHJWYWwgPT0gbnVsbCB8fCB0aGlzLmlzRW1wdHkoc3RyVmFsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcihzdHJWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SlF1ZXJ5VGV4dEFyZWFTdHJpbmdWYWx1ZShlbGVtZW50OiBKUXVlcnk8SFRNTFRleHRBcmVhRWxlbWVudD4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbCgpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKUXVlcnlTZWxlY3RWYWx1ZShlbGVtZW50OiBKUXVlcnk8SFRNTFNlbGVjdEVsZW1lbnQ+KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoZWxlbWVudC52YWwoKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmdWYWx1ZUluU3RyaW5nVmFsdWVMaXN0KHN0cmluZ1ZhbHVlOiBzdHJpbmcsIHN0cmluZ1ZhbHVlTGlzdDogc3RyaW5nW10pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHN0cmluZ1ZhbHVlTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBzdHJpbmdWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0VmFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmV0VmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SlF1ZXJ5U2VsZWN0VGV4dChlbGVtZW50OiBKUXVlcnk8SFRNTFNlbGVjdEVsZW1lbnQ+KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoZWxlbWVudC52YWwoKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbWVudC5maW5kKFwib3B0aW9uOnNlbGVjdGVkXCIpLnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY29weVRvQ2xpcGJvYXJkKGNvcHlUZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb3B5VGV4dCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wQ2hlY2tib3hTd2l0Y2gge1xyXG5cclxuICAgIGluaXQocGFyZW50RWxlbWVudDogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuY2hlY2tib3hTd2l0Y2hPbkNsaWNrKHBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoTGFiZWxPbkNsaWNrKHBhcmVudEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrYm94U3dpdGNoT25DbGljayhwYXJlbnRFbGVtZW50OiBzdHJpbmcpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1zd2l0Y2gtY2hlY2tib3guLi5cIik7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3Atc3dpdGNoLWNoZWNrYm94IHBhcmVudEVsZW1lbnQ6IFwiICsgcGFyZW50RWxlbWVudCk7XHJcblxyXG4gICAgICAgIGxldCBfZnJhbWUgPSAkKFwiXCIgKyBwYXJlbnRFbGVtZW50ICsgXCIgKj4uc2FvcC1zd2l0Y2gtY2hlY2tib3hcIik7XHJcbiAgICAgICAgX2ZyYW1lLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgIF9mcmFtZS5jbGljayhmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICBsZXQgX2NoZWNrQm94ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICBsZXQgX2F0clBhcmVudCA9IFwiI1wiKyQoX2NoZWNrQm94KS5hdHRyKFwiZm9yXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2NoZWNrQm94UCA9ICQoXCJcIiArIHBhcmVudEVsZW1lbnQgKyBcIiAqPlwiICsgX2F0clBhcmVudCk7XHJcbiAgICAgICAgICAgIGxldCBfbGFiZWwxID0gX2NoZWNrQm94UC5maW5kKFwiI3Nhb3Atc3dpdGNoLWxhYmVsMVwiKTtcclxuICAgICAgICAgICAgbGV0IF9sYWJlbDIgPSBfY2hlY2tCb3hQLmZpbmQoXCIjc2FvcC1zd2l0Y2gtbGFiZWwyXCIpO1xyXG4gICAgICAgICAgICBpZiAoX2NoZWNrQm94LmNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjaGVja2VkXCIpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMS5yZW1vdmVDbGFzcygnc3dpdGNoLWxhYmVsLW9uJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwxLmFkZENsYXNzKCdzd2l0Y2gtbGFiZWwtb2ZmJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwyLnJlbW92ZUNsYXNzKCdzd2l0Y2gtbGFiZWwtb2ZmJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwyLmFkZENsYXNzKCdzd2l0Y2gtbGFiZWwtb24nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJ1bmNoZWNrZWRcIik7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwxLnJlbW92ZUNsYXNzKCdzd2l0Y2gtbGFiZWwtb2ZmJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwxLmFkZENsYXNzKCdzd2l0Y2gtbGFiZWwtb24nKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDIucmVtb3ZlQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vbicpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMi5hZGRDbGFzcygnc3dpdGNoLWxhYmVsLW9mZicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoTGFiZWxPbkNsaWNrKHBhcmVudEVsZW1lbnQ6IHN0cmluZykge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLXN3aXRjaC1sYWJlbC4uLlwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1zd2l0Y2gtbGFiZWwgcGFyZW50RWxlbWVudDogXCIgKyBwYXJlbnRFbGVtZW50KTtcclxuXHJcbiAgICAgICAgbGV0IF9mcmFtZSA9ICQoXCJcIiArIHBhcmVudEVsZW1lbnQgKyBcIiAqPi5zYW9wLXN3aXRjaC1sYWJlbFwiKTtcclxuICAgICAgICBfZnJhbWUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2ZyYW1lLmNsaWNrKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgIGxldCBfc3dpdGNoTGFiZWwgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBfYXRyQ2hlY2tCb3ggPSBcIiNcIiskKF9zd2l0Y2hMYWJlbCkuYXR0cihcImZvclwiKTtcclxuICAgICAgICAgICAgbGV0IF9jaGVja0JveCA9ICQoX2F0ckNoZWNrQm94KTtcclxuICAgICAgICAgICAgJChfY2hlY2tCb3gpLnByb3AoICdjaGVja2VkJywgJ2ZsYXNlJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEZsb2F0aW5nTGFiZWwge1xyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbDpub3QoW3JlYWRvbmx5PVwicmVhZG9ubHlcIl0pJykub2ZmKFwiZm9jdXNcIixfdGhpcy5zYW9wSW5wdXRPbkZvY3VzKTtcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbDpub3QoW3JlYWRvbmx5PVwicmVhZG9ubHlcIl0pJykub24oXCJmb2N1c1wiLF90aGlzLnNhb3BJbnB1dE9uRm9jdXMpO1xyXG5cclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9mZihcImJsdXJcIixfdGhpcy5zYW9wSW5wdXRPbkJsdXIpO1xyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub24oXCJibHVyXCIsX3RoaXMuc2FvcElucHV0T25CbHVyKTtcclxuICAgIFxyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub2ZmKFwiZm9jdXNvdXRcIixfdGhpcy5zYW9wSW5wdXRPbkNoYW5nZSk7XHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vbihcImZvY3Vzb3V0XCIsX3RoaXMuc2FvcElucHV0T25DaGFuZ2UpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBzYW9wSW5wdXRPbkNoYW5nZShlOmFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLWZsb2F0aW5nLWxhYmVsLi4uc2FvcElucHV0T25DaGFuZ2VcIik7XHJcbiAgICAgICAgbGV0IGh0bWxFbGVtZW50ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgbGV0IF9ub2RlID0gJChcIiNcIitodG1sRWxlbWVudC5pZCk7XHJcbiAgICAgICAgaWYgKF9ub2RlLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICBsZXQgX3BhcmVudE4gPSBfbm9kZS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgaWYgKF9wYXJlbnROLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgX3BhcmVudE4ucmVtb3ZlQ2xhc3MoXCJzYW9wLWVycm9yLWlucHV0XCIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9sYWJlbCA9IF9wYXJlbnROLmZpbmQoXCIudGV4dC1kYW5nZXJcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoX2xhYmVsLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIF9sYWJlbC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0gICAgXHJcblxyXG4gICAgc2FvcElucHV0T25Gb2N1cyhlOmFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLWZsb2F0aW5nLWxhYmVsLi4uXCIpO1xyXG4gICAgICAgIC8vYmFydmFuamUgXCJmbG9hdGluZyBsYWJlbFwiXHJcbiAgICAgICAgbGV0IGh0bWxFbGVtZW50ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2FvcC1mbG9hdGluZy1sYWJlbCcpLmNsYXNzTGlzdC5hZGQoXCJzYW9wLXR4dC1wcmltYXJ5XCIpO1xyXG4gICAgfVxyXG4gICAgICAgIFxyXG4gICAgc2FvcElucHV0T25CbHVyKGU6YW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3AtZmxvYXRpbmctbGFiZWwuLi5cIik7XHJcbiAgICAgICAgLy9iYXJ2YW5qZSBcImZsb2F0aW5nIGxhYmVsXCIgb24gaW5wdXQgYmx1ciAoZm9jdXMgbG9zdCkgbmF6YWogdiBzaXZvIChyZW1vdmUgcmF6cmVkIFwic2FvcC10eHQtcHJpbWFyeVwiKVxyXG4gICAgICAgIGxldCBodG1sRWxlbWVudCA9IGUudGFyZ2V0O1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNhb3AtZmxvYXRpbmctbGFiZWwnKS5jbGFzc0xpc3QucmVtb3ZlKFwic2FvcC10eHQtcHJpbWFyeVwiKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2V0Q2FwdGlvbkFzUmVxdWlyZWQobGFiZWxJZDpzdHJpbmcscmVxdWlyZWQ6Ym9vbGVhbik6dm9pZHtcclxuICAgICAgICBsZXQgX2VsZW1lbnQgPSAkKGxhYmVsSWQpO1xyXG4gICAgICAgIGxldCBfZWxlbWVudFZhbCA9IF9lbGVtZW50LnRleHQoKS50b1N0cmluZygpO1xyXG4gICAgICAgIF9lbGVtZW50VmFsID0gX2VsZW1lbnRWYWwucmVwbGFjZShcIipcIixcIlwiKTtcclxuICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgX2VsZW1lbnQudGV4dChfZWxlbWVudFZhbCtcIipcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX2VsZW1lbnQudGV4dChfZWxlbWVudFZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSAgXHJcblxyXG4gICAgLy9cclxufSIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvZGF0YS10YWJsZXMvdHlwZXMuZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmNsYXNzIHNlbGVjdEl0ZW0ge1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICAgIHRleHQ6IHN0cmluZztcclxufVxyXG5cclxuY2xhc3MgRWRpdGFibGVDb2x1bW5EYXRhIHtcclxuICAgIHRpcDogc3RyaW5nO1xyXG4gICAgc2VsZWN0SXRlbXM6IHNlbGVjdEl0ZW1bXTtcclxuICAgIG51bWVyaWNNaW5WYWx1ZTogbnVtYmVyO1xyXG4gICAgbnVtZXJpY01heFZhbHVlOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wV2ViR3JpZEVkaXQge1xyXG4gICAgcHVibGljIGxpYk5hbWU6IHN0cmluZzsgIFxyXG5cclxuICAgIHByaXZhdGUgX0VkaXRhYmxlQ29sdW1uRGF0YTogRWRpdGFibGVDb2x1bW5EYXRhO1xyXG4gICAgcHJpdmF0ZSBfdGRFbGVtZW50OiBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgfSAgXHJcblxyXG4gICAgc2hvd1dlYkdyaWRFZGl0YWJsZUNvbHVtbkVkaXRDb250cm9sKHRkRWxlbWVudDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LnNob3dXZWJHcmlkRWRpdGFibGVDb2x1bW5FZGl0Q29udHJvbFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGRFbGVtZW50ID0gdGRFbGVtZW50O1xyXG4gICAgICAgIGxldCB0ZEVsZW1lbnRIdG1sID0gdGhpcy5fdGRFbGVtZW50LmlubmVySFRNTDtcclxuXHJcbiAgICAgICAgaWYgKHRkRWxlbWVudEh0bWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lclwiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIGVkaXQga29udHJvbGEgemUgb2JzdGFqYVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEgPSB0aGlzLmdldERhdGFBdHRyaWJ1dGUodGhpcy5fdGRFbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5BZGRFZGl0YWJsZUNvbHVtbkVkaXRIdG1sKHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YS50aXApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGUodGRFbGVtZW50OiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQub25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldERhdGFBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBFZGl0YWJsZUNvbHVtbkRhdGEge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuZ2V0RGF0YUF0dHJpYnV0ZVwiKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgRWRpdGFibGVDb2x1bW5EYXRhKCk7XHJcblxyXG4gICAgICAgIGRhdGEudGlwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXQtdHlwZVwiKTtcclxuICAgICAgICBkYXRhLnNlbGVjdEl0ZW1zID0gJC5wYXJzZUpTT04oZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXQtc2VsZWN0LWl0ZW1zXCIpKTtcclxuICAgICAgICBkYXRhLm51bWVyaWNNaW5WYWx1ZSA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lZGl0LW51bWJlci1taW5cIikpO1xyXG4gICAgICAgIGRhdGEubnVtZXJpY01heFZhbHVlID0gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXQtbnVtYmVyLW1heFwiKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgQWRkRWRpdGFibGVDb2x1bW5FZGl0SHRtbCh0aXA6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuQWRkRWRpdGFibGVDb2x1bW5FZGl0SHRtbFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRkRWxlbWVudFRleHQgPSB0aGlzLl90ZEVsZW1lbnQuaW5uZXJUZXh0O1xyXG5cclxuICAgICAgICBsZXQgaW5wdXQgPSB0aGlzLmdldElucHV0RWxlbWVudCh0aXAsIHRkRWxlbWVudFRleHQpO1xyXG5cclxuICAgICAgICBsZXQgY29udGFpbmVyQ2VsbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGNvbnRhaW5lckNlbGxEaXYuY2xhc3NMaXN0LmFkZChcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXItY2VsbFwiKTtcclxuICAgICAgICBjb250YWluZXJDZWxsRGl2LmFwcGVuZENoaWxkKGlucHV0KTtcclxuXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lclwiKTtcclxuICAgICAgICBjb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoY29udGFpbmVyQ2VsbERpdik7XHJcblxyXG4gICAgICAgIHRoaXMuX3RkRWxlbWVudC5pbm5lckhUTUwgPSBjb250YWluZXJEaXYub3V0ZXJIVE1MO1xyXG5cclxuICAgICAgICB0aGlzLnNldElucHV0RWxlbWVudEFmdGVySW5pdCh0aXAsIHRkRWxlbWVudFRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SW5wdXRFbGVtZW50KHRpcDogc3RyaW5nLCBpbnB1dFZhbHVlOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5nZXRJbnB1dEVsZW1lbnRcIik7XHJcblxyXG4gICAgICAgIGxldCBpbnB1dDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodGlwKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuZ2VuZXJhdGVUZXh0SHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0aGlzLmdlbmVyYXRlVGV4dGFyZWFIdG1sKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0aGlzLmdlbmVyYXRlU2VsZWN0SHRtbChpbnB1dFZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuZ2VuZXJhdGVOdW1iZXJIdG1sKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZW5lcmF0ZVRleHRIdG1sKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVRleHRIdG1sKCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdlbmVyYXRlVGV4dEh0bWxcIik7XHJcblxyXG4gICAgICAgIGxldCBpbnB1dDogSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgIGlucHV0LnR5cGUgPSBcInRleHRcIjtcclxuICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci1jZWxsLWlucHV0XCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVRleHRhcmVhSHRtbCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5nZW5lcmF0ZVRleHRhcmVhSHRtbFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0OiBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG5cclxuICAgICAgICBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XHJcbiAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXItY2VsbC1pbnB1dFwiKTtcclxuICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci1jZWxsLWlucHV0LXRleHRhcmVhXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9IFxyXG5cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVTZWxlY3RIdG1sKHNlbGVjdFZhbHVlOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5nZW5lcmF0ZVNlbGVjdEh0bWxcIik7XHJcblxyXG4gICAgICAgIGxldCBpbnB1dDogSFRNTFNlbGVjdEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcclxuICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci1jZWxsLWlucHV0XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEuc2VsZWN0SXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpbnB1dC5vcHRpb25zLmFkZChuZXcgT3B0aW9uKGl0ZW0udGV4dCwgaXRlbS52YWx1ZSwgc2VsZWN0VmFsdWUgPT09IGl0ZW0udmFsdWUpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVOdW1iZXJIdG1sKCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdlbmVyYXRlTnVtYmVySHRtbFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICAgICAgICBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgaW5wdXQudHlwZSA9IFwibnVtYmVyXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YS5udW1lcmljTWluVmFsdWUpIHtcclxuICAgICAgICAgICAgaW5wdXQubWluID0gdGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhLm51bWVyaWNNaW5WYWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhLm51bWVyaWNNYXhWYWx1ZSkge1xyXG4gICAgICAgICAgICBpbnB1dC5tYXggPSB0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEubnVtZXJpY01heFZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGwtaW5wdXRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldElucHV0RWxlbWVudEFmdGVySW5pdCh0aXA6IHN0cmluZywgdGRFbGVtZW50VGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5zZXRJbnB1dEVsZW1lbnRBZnRlckluaXRcIik7XHJcblxyXG4gICAgICAgIGlmICh0aXAgPT09IFwidGV4dFwiKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZEVsZW1lbnRJbnB1dCA9IHRoaXMuX3RkRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpWzBdO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC52YWx1ZSA9IHRkRWxlbWVudFRleHQ7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0Lm9uYmx1ciA9IHRoaXMud3JpdGVJbnB1dFZhbHVlVG9UREVsZW1lbnQuYmluZCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGlwID09PSBcInRleHRhcmVhXCIpIHtcclxuICAgICAgICAgICAgbGV0IHRkRWxlbWVudElucHV0ID0gdGhpcy5fdGRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGV4dGFyZWFcIilbMF07XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LnZhbHVlID0gdGRFbGVtZW50VGV4dDtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQuZm9jdXMoKTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQub25ibHVyID0gdGhpcy53cml0ZVRleHRBcmVhVmFsdWVUb1RERWxlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aXAgPT09IFwic2VsZWN0XCIpIHtcclxuICAgICAgICAgICAgbGV0IHRkRWxlbWVudElucHV0ID0gdGhpcy5fdGRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2VsZWN0XCIpWzBdO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5vbmJsdXIgPSB0aGlzLndyaXRlU2VsZWN0VmFsdWVUb1RERWxlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aXAgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgbGV0IHRkRWxlbWVudElucHV0ID0gdGhpcy5fdGRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF07XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LnZhbHVlID0gdGRFbGVtZW50VGV4dDtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQuZm9jdXMoKTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQub25ibHVyID0gdGhpcy53cml0ZU51bWJlclZhbHVlVG9UREVsZW1lbnQuYmluZCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0ZEVsZW1lbnRJbnB1dCA9IHRoaXMuX3RkRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpWzBdO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC52YWx1ZSA9IHRkRWxlbWVudFRleHQ7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0Lm9uYmx1ciA9IHRoaXMud3JpdGVJbnB1dFZhbHVlVG9UREVsZW1lbnQuYmluZCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3cml0ZVZhbHVlVG9UREVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGlucHV0VmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LndyaXRlVmFsdWVUb1RERWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRlbXBFbGVtZW50ID0gZWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50IGVsZW1lbnQsIGtpIGltYSBjbGFzcyBzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLiBOamVnb3YgcGFyZW50IGplIFREIGVsZW1lbnQuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZW1wRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGRFbGVtZW50ID0gdGVtcEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIHRkRWxlbWVudC5pbm5lckhUTUwgPSBpbnB1dFZhbDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGUodGhpcy5fdGRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRlbXBFbGVtZW50ID0gdGVtcEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3cml0ZUlucHV0VmFsdWVUb1RERWxlbWVudChzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQud3JpdGVJbnB1dFZhbHVlVG9UREVsZW1lbnRcIik7XHJcblxyXG4gICAgICAgIGxldCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBzZW5kZXIudGFyZ2V0O1xyXG4gICAgICAgIGxldCBpbnB1dFZhbCA9IHRhcmdldC52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBqZSBURCBlbGVtZW50IGluIHYgaW5uZXJodG1sIHZwaXNlbW8gdGV4dCB2YWx1ZVxyXG4gICAgICAgIGxldCBwYXJlbnQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWVUb1RERWxlbWVudChwYXJlbnQsIGlucHV0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHdyaXRlVGV4dEFyZWFWYWx1ZVRvVERFbGVtZW50KHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC53cml0ZVRleHRBcmVhVmFsdWVUb1RERWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRhcmdldDogSFRNTFRleHRBcmVhRWxlbWVudCA9IHNlbmRlci50YXJnZXQ7XHJcbiAgICAgICAgbGV0IGlucHV0VmFsID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQsIGtpIGplIFREIGVsZW1lbnQgaW4gdiBpbm5lciBodG1sIHZwaXNlbW8gdGV4dCB2YWx1ZVxyXG4gICAgICAgIGxldCBwYXJlbnQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWVUb1RERWxlbWVudChwYXJlbnQsIGlucHV0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHdyaXRlU2VsZWN0VmFsdWVUb1RERWxlbWVudChzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQud3JpdGVTZWxlY3RWYWx1ZVRvVERFbGVtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0OiBIVE1MU2VsZWN0RWxlbWVudCA9IHNlbmRlci50YXJnZXQ7XHJcbiAgICAgICAgbGV0IGlucHV0VmFsID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQsIGtpIGplIFREIGVsZW1lbnQgaW4gdiBpbm5lciBodG1sIHZwaXNlbW8gdGV4dCB2YWx1ZVxyXG4gICAgICAgIGxldCBwYXJlbnQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWVUb1RERWxlbWVudChwYXJlbnQsIGlucHV0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHdyaXRlTnVtYmVyVmFsdWVUb1RERWxlbWVudChzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQud3JpdGVOdW1iZXJWYWx1ZVRvVERFbGVtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50ID0gc2VuZGVyLnRhcmdldDtcclxuICAgICAgICBsZXQgaW5wdXRWYWwgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCwga2kgamUgVEQgZWxlbWVudCBpbiB2IGlubmVyIGh0bWwgdnBpc2VtbyB0ZXh0IHZhbHVlXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZVRvVERFbGVtZW50KHBhcmVudCwgaW5wdXRWYWwpO1xyXG4gICAgfVxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlcy5kLnRzXCIgLz5cclxuaW1wb3J0IHsgU2FvcElucHV0V0ZMLFNhb3BJbnB1dFdGTFByb3BlcnRpZXMgfSBmcm9tICcuL3Nhb3AtaW5wdXQtd2ZsJ1xyXG5pbXBvcnQgeyBTYW9wc2VsZWN0V0ZMIH0gZnJvbSAnLi9zYW9wLXNlbGVjdC13ZmwnXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFdlYkdyaWRGaWx0ZXIge1xyXG4gIHB1YmxpYyBpZDpzdHJpbmcgPSBcIndnZjFcIjtcclxuICBwdWJsaWMgbW9kYWxGaWx0ZXJBcnJheTogYW55ID0gW107XHJcbiAgLy9UaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBjb250ZW50IGluc2lkZSB0aGUgZmlsdGVyIG1vZGFsXHJcbiAgY29uZmlnRmlsdGVyKGxpYk5hbWU6c3RyaW5nLGh0bWxUYWJsZTogYW55LCBjb2xBcnJheTogYW55KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0YWJsZU5hbWUgPSBodG1sVGFibGVbMF0uaWQ7XHJcbiAgICAgIHZhciBjb2x1bW5zID0gaHRtbFRhYmxlLmFwaSgpLmNvbHVtbnMoKTtcclxuICAgICAgJC5lYWNoKGNvbEFycmF5LCBmdW5jdGlvbiAoaSwgYXJnKSB7XHJcbiAgICAgICAgbGV0IF9jb2xObyA9IGFyZy50b1N0cmluZygpO1xyXG4gICAgICAgICQoJyMnICsgdGFibGVOYW1lICsgJyB0aDplcSgnICsgX2NvbE5vICsgJyknKS5hdHRyKFwiaWRcIixcImNvbHVtbi1oZWFkZXItXCIrIF9jb2xObyArXCJcIik7XHJcbiAgICAgICAgJCgnIycgKyB0YWJsZU5hbWUgKyAnIHRoOmVxKCcgKyBfY29sTm8gKyAnKScpLmFwcGVuZCgnPHNwYW4gaWQ9XCJjb2x1bW4taGVhZGVyLScrIF9jb2xObyArJy1maWx0ZXJcIiBjbGFzcz1cInNhb3AtaW1nLWZpbHRlciBzaS14c1wiIG9uY2xpY2s9XCInK2xpYk5hbWUrJy53ZWJHcmlkRmlsdGVyLnNob3dGaWx0ZXIoZXZlbnQsXFwnJyArIHRhYmxlTmFtZSArICdfJyArIF9jb2xObyArICdcXCcpO1wiPjwvc3Bhbj4nKTtcclxuICAgICAgICAkKCcjJyArIHRhYmxlTmFtZSArICcgdGg6ZXEoJyArIF9jb2xObyArICcpJykuYXBwZW5kKFwiPHNwYW4gaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9jb2xObyArXCItc29ydCcgY2xhc3M9Jyc+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPlwiKTtcclxuICAgICAgICAkKCcjJyArIHRhYmxlTmFtZSArICcgdGg6ZXEoJyArIF9jb2xObyArICcpJykuYXBwZW5kKFwiPGRpdiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2NvbE5vICtcIi1zaXplcic+XCIpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHZhciB0ZW1wbGF0ZSA9XHJcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJtb2RhbEZpbHRlclwiPicgK1xyXG4gICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPicgK1xyXG4gICAgICAgICd7MH08L2Rpdj4nICtcclxuICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPicgK1xyXG4gICAgICAgICc8YSBocmVmPVwiIyFcIiBvbmNsaWNrPVwiJytsaWJOYW1lKycud2ViR3JpZEZpbHRlci5wZXJmb3JtRmlsdGVyKHRoaXMsIHsxfSwgXFwnezJ9XFwnKTtcIiAgY2xhc3M9XCIgYnRuIHJpZ2h0IHdhdmVzLWVmZmVjdCB3YXZlcy1saWdodFwiPlYgcmVkdTwvYT4nICsgICAgICAgIFxyXG4gICAgICAgICc8YSBocmVmPVwiIyFcIiBvbmNsaWNrPVwiJytsaWJOYW1lKycud2ViR3JpZEZpbHRlci5jbGVhckZpbHRlcih0aGlzLCB7MX0sIFxcJ3syfVxcJyk7XCIgIGNsYXNzPVwiIGJ0biBsZWZ0IHdhdmVzLWVmZmVjdCB3YXZlcy1saWdodFwiPlpicmnFoWk8L2E+JyArXHJcbiAgICAgICAgJzxhIGhyZWY9XCIjIVwiIG9uY2xpY2s9XCInK2xpYk5hbWUrJy53ZWJHcmlkRmlsdGVyLmhpZGVGaWx0ZXIoKTtcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGNsYXNzPVwiIGJ0biBsZWZ0IHdhdmVzLWVmZmVjdCB3YXZlcy1saWdodFwiPlByZWtsacSNaTwvYT4nICtcclxuICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgJzwvZGl2Pic7XHJcblxyXG4gICAgICAkLmVhY2goY29sQXJyYXksIGZ1bmN0aW9uIChpbmRleDogYW55LCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgY29sdW1ucy5ldmVyeShmdW5jdGlvbiAoaTogYW55KSB7XHJcbiAgICAgICAgICBpZiAodmFsdWUgPT09IGkpIHtcclxuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMsIFxyXG4gICAgICAgICAgICBjb250ZW50ID0gJyc7Ly8nPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmaWx0ZXJTZWFyY2hUZXh0XCIgb25rZXl1cD1cImZpbHRlclZhbHVlcyh0aGlzKVwiIC8+IDxici8+JztcclxuICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSAkKHRoaXMuaGVhZGVyKCkpLnRleHQoKS5yZXBsYWNlKC9cXHMrL2csIFwiX1wiKTtcclxuICAgICAgICAgICAgdmFyIGRpc3RpbmN0QXJyYXk6IGFueVtdID0gW107XHJcbiAgICAgICAgICAgIGNvbHVtbi5kYXRhKCkuZWFjaChmdW5jdGlvbiAoZDogc3RyaW5nLCBqOiBhbnkpIHtcclxuICAgICAgICAgICAgICBpZiAoZGlzdGluY3RBcnJheS5pbmRleE9mKGQpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSB0YWJsZU5hbWUgKyBcIl9cIiArIGNvbHVtbk5hbWUgKyBcIl9cIiArIGo7IC8vIG9uY2hhbmdlPVwiZm9ybWF0VmFsdWVzKHRoaXMsJyArIHZhbHVlICsgJyk7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICc8ZGl2PjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cIicgKyBkICsgJ1wiICBpZD1cIicgKyBpZCArICdcIi8+PGxhYmVsIGZvcj1cIicgKyBpZCArICdcIj4gJyArIGQgKyAnPC9sYWJlbD48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgZGlzdGluY3RBcnJheS5wdXNoKGQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7IFxyXG4gICAgICAgICAgICB2YXIgbmV3VGVtcGxhdGUgPSAkKHRlbXBsYXRlLnJlcGxhY2UoJ3swfScsIGNvbnRlbnQpLnJlcGxhY2UoJ3sxfScsIHZhbHVlKS5yZXBsYWNlKCd7MX0nLCB2YWx1ZSkucmVwbGFjZSgnezJ9JywgdGFibGVOYW1lKS5yZXBsYWNlKCd7Mn0nLCB0YWJsZU5hbWUpKTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZChuZXdUZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgIF90aGlzLm1vZGFsRmlsdGVyQXJyYXlbdGFibGVOYW1lICsgXCJfXCIgKyB2YWx1ZV0gPSBuZXdUZW1wbGF0ZTtcclxuICAgICAgICAgICAgY29udGVudCA9ICcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0sIDUwKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy9Vc2VyIHRvIHNob3cgdGhlIGZpbHRlciBtb2RhbFxyXG4gIHNob3dGaWx0ZXIoZTogYW55LCBpbmRleDogYW55KSB7XHJcbiAgICAkKCcubW9kYWxGaWx0ZXInKS5oaWRlKCk7XHJcbiAgICAkKHRoaXMubW9kYWxGaWx0ZXJBcnJheVtpbmRleF0pLmNzcyh7IGxlZnQ6IDAsIHRvcDogMCB9KTtcclxuICAgIHZhciB0aCA9ICQoZS50YXJnZXQpLnBhcmVudCgpO1xyXG4gICAgdmFyIHBvcyA9IHRoLm9mZnNldCgpO1xyXG4gICAgbGV0IGFycmF5SXRlbSA9IHRoaXMubW9kYWxGaWx0ZXJBcnJheVtpbmRleF07XHJcbiAgICAvLyQodGhpcy5tb2RhbEZpbHRlckFycmF5W2luZGV4XSkud2lkdGgodGgud2lkdGgoKSAqIDAuNzUpO1xyXG4gICAgJChhcnJheUl0ZW0pLmNzcyh7ICdsZWZ0JzogcG9zLmxlZnQsICd0b3AnOiBwb3MudG9wLCAnbWluLXdpZHRoJzoodGgud2lkdGgoKSAqIDAuNzUpIH0pO1xyXG4gICAgJChhcnJheUl0ZW0pLnNob3coKTtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUYWJsZUhlYWRlclN0YXR1cyh0YWJsZUlkOnN0cmluZyxjb2x1bW5JZDpzdHJpbmcsYWN0aXZlRmlsdGVyOmJvb2xlYW4pe1xyXG4gICAgbGV0IF9jb2xGaWx0ZXJJZCA9IGNvbHVtbklkK1wiLWZpbHRlclwiO1xyXG4gICAgbGV0IF9jb2xGaWx0ZXIgPSAkKHRhYmxlSWQpLmZpbmQoX2NvbEZpbHRlcklkKVswXTtcclxuICAgIGxldCBfY29sRmlsdGVyQXRyID0gX2NvbEZpbHRlci5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcclxuICAgIGlmKGFjdGl2ZUZpbHRlcil7XHJcbiAgICAgICAgX2NvbEZpbHRlckF0ci5yZXBsYWNlKFwic2FvcC1pbWctZmlsdGVyXCIsIFwic2FvcC1pbWctZmlsdGVyIHNhb3AtY2wtYmx1ZVwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgX2NvbEZpbHRlckF0ci5yZXBsYWNlKFwic2FvcC1pbWctZmlsdGVyIHNhb3AtY2wtYmx1ZVwiLCBcInNhb3AtaW1nLWZpbHRlclwiKTtcclxuICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1RoaXMgZnVuY3Rpb24gaXMgdG8gdXNlIHRoZSBzZWFyY2hib3ggdG8gZmlsdGVyIHRoZSBjaGVja2JveFxyXG4gIGZpbHRlclZhbHVlcyhub2RlOiBhbnkpIHtcclxuICAgIHZhciBzZWFyY2hTdHJpbmcgPSAkKG5vZGUpLnZhbCgpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKCk7XHJcbiAgICB2YXIgcm9vdE5vZGUgPSAkKG5vZGUpLnBhcmVudCgpO1xyXG4gICAgaWYgKHNlYXJjaFN0cmluZyA9PSAnJykge1xyXG4gICAgICByb290Tm9kZS5maW5kKCdkaXYnKS5zaG93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByb290Tm9kZS5maW5kKFwiZGl2XCIpLmhpZGUoKTtcclxuICAgICAgcm9vdE5vZGUuZmluZChcImRpdjpjb250YWlucygnXCIgKyBzZWFyY2hTdHJpbmcgKyBcIicpXCIpLnNob3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRXhlY3V0ZSB0aGUgZmlsdGVyIG9uIHRoZSB0YWJsZSBmb3IgYSBnaXZlbiBjb2x1bW5cclxuICBwZXJmb3JtRmlsdGVyKG5vZGU6IGFueSwgaTogYW55LCB0YWJsZUlkOiBhbnkpIHtcclxuICAgIHZhciByb290Tm9kZSA9ICQobm9kZSkucGFyZW50KCkucGFyZW50KCk7XHJcbiAgICB2YXIgc2VhcmNoU3RyaW5nID0gJycsIGNvdW50ZXIgPSAwO1xyXG5cclxuICAgIHJvb3ROb2RlLmZpbmQoJ2lucHV0OmNoZWNrYm94JykuZWFjaChmdW5jdGlvbiAoaW5kZXg6IGFueSwgY2hlY2tib3g6IGFueSkge1xyXG4gICAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xyXG4gICAgICAgIHNlYXJjaFN0cmluZyArPSAoY291bnRlciA9PSAwKSA/IGNoZWNrYm94LnZhbHVlIDogJ3wnICsgY2hlY2tib3gudmFsdWU7XHJcbiAgICAgICAgY291bnRlcisrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgX2NvbElkID0gXCIjY29sdW1uLWhlYWRlci1cIitpLnRvU3RyaW5nKCk7XHJcbiAgICBpZihjb3VudGVyID4gMCl7XHJcbiAgICAgIHRoaXMudXBkYXRlVGFibGVIZWFkZXJTdGF0dXMoJyMnICt0YWJsZUlkLF9jb2xJZCx0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVGFibGVIZWFkZXJTdGF0dXMoJyMnICt0YWJsZUlkLF9jb2xJZCxmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgJCgnIycgKyB0YWJsZUlkKS5EYXRhVGFibGUoKS5jb2x1bW4oaSkuc2VhcmNoKFxyXG4gICAgICBzZWFyY2hTdHJpbmcsXHJcbiAgICAgIHRydWUsIGZhbHNlXHJcbiAgICApLmRyYXcoKTtcclxuICAgIHJvb3ROb2RlLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIC8vUmVtb3ZlcyB0aGUgZmlsdGVyIGZyb20gdGhlIHRhYmxlIGZvciBhIGdpdmVuIGNvbHVtblxyXG4gIGNsZWFyRmlsdGVyKG5vZGU6IGFueSwgaTogYW55LCB0YWJsZUlkOiBhbnkpIHtcclxuICAgIHZhciByb290Tm9kZSA9ICQobm9kZSkucGFyZW50KCkucGFyZW50KCk7XHJcbiAgICByb290Tm9kZS5maW5kKFwiLmZpbHRlclNlYXJjaFRleHRcIikudmFsKCcnKTtcclxuICAgIHJvb3ROb2RlLmZpbmQoJ2lucHV0OmNoZWNrYm94JykuZWFjaChmdW5jdGlvbiAoaW5kZXg6IGFueSwgY2hlY2tib3g6IGFueSkge1xyXG4gICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICQoY2hlY2tib3gpLnBhcmVudCgpLnNob3coKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBfY29sSWQgPSBcIiNjb2x1bW4taGVhZGVyLVwiK2kudG9TdHJpbmcoKTtcclxuICAgIHRoaXMudXBkYXRlVGFibGVIZWFkZXJTdGF0dXMoJyMnICt0YWJsZUlkLF9jb2xJZCxmYWxzZSk7XHJcblxyXG4gICAgJCgnIycgKyB0YWJsZUlkKS5EYXRhVGFibGUoKS5jb2x1bW4oaSkuc2VhcmNoKFxyXG4gICAgICAnJyxcclxuICAgICAgdHJ1ZSwgZmFsc2VcclxuICAgICkuZHJhdygpO1xyXG4gICAgcm9vdE5vZGUuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgaGlkZUZpbHRlcihub2RlOiBhbnksIGk6IGFueSwgdGFibGVJZDogYW55KSB7XHJcbiAgICAkKCcubW9kYWxGaWx0ZXInKS5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRSZXNpemVFdmVudChncmlkSWQ6c3RyaW5nKXtcclxuICAgIHZhciBfdGFibGVEaXYgPSAkKFwidGFibGVcIitncmlkSWQrXCIgdGhcIikgYXMgYW55O1xyXG5cdCAgdmFyIHRoSGVpZ2h0ID0gJChcInRhYmxlXCIrZ3JpZElkK1wiIHRoOmZpcnN0XCIpLmhlaWdodCgpO1xyXG5cdCAgX3RhYmxlRGl2LnJlc2l6YWJsZSh7XHJcblx0XHQgIGhhbmRsZXM6IFwiZVwiLFxyXG5cdFx0ICBtaW5IZWlnaHQ6IHRoSGVpZ2h0LFxyXG5cdFx0ICBtYXhIZWlnaHQ6IHRoSGVpZ2h0LFxyXG5cdFx0ICBtaW5XaWR0aDogNDAsXHJcblx0XHQgIHJlc2l6ZTogZnVuY3Rpb24gKGV2ZW50OmFueSwgdWk6YW55KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJyZXNpemUuLi5cIik7XHJcbiAgICAgICAgdmFyIHNpemVyaWQgPSBcIiNcIiArICQoZXZlbnQudGFyZ2V0KS5hdHRyKFwiaWRcIikgKyBcIi1zaXplclwiO1xyXG4gICAgICAgICQoc2l6ZXJpZCkud2lkdGgodWkuc2l6ZS53aWR0aCk7XHJcblx0XHQgIH1cclxuXHQgIH0pOyAgICBcclxuICB9XHJcblxyXG4gIHNldFNvcnRFbGVtZW50RXZlbnQoZ3JpZElkOiBzdHJpbmcpOnZvaWR7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgJChncmlkSWQpLm9uKCdjbGljaycsICd0aCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgX3RoaXMuc2V0U29ydEVsZW1lbnQoZ3JpZElkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuICBzZXRTb3J0RWxlbWVudChncmlkSWQ6IHN0cmluZyk6dm9pZCB7XHJcbiAgICAgICQoXCJcIiArIGdyaWRJZCArIFwiIHRoZWFkOmZpcnN0IHRoXCIpLmVhY2goZnVuY3Rpb24gKGksIHRoKSB7XHJcbiAgICAgICAgbGV0IF9jb2wgPSAkKHRoKTtcclxuICAgICAgICBsZXQgX2NvbElkID0gXCIjXCIrX2NvbC5hdHRyKCdpZCcpO1xyXG4gICAgICAgIC8vbGV0IF9zb3J0VHlwZSA9IF9jb2wuYXR0cihcImNvbHVtbi1zb3J0XCIpO1xyXG4gICAgICAgIGxldCBfY29sSWNvbklkVXAgPSBfY29sSWQrXCItaWNvbi11cFwiO1xyXG4gICAgICAgIGxldCBfY29sSWNvbklkID0gX2NvbElkK1wiLWljb25cIjtcclxuICAgICAgICBsZXQgX2NvbEljb25VcEVsZW1lbnQgPSAkKGdyaWRJZCsnICcrX2NvbEljb25JZFVwKTtcclxuICAgICAgICBsZXQgX2NvbEljb25FbGVtZW50ID0gJChncmlkSWQrJyAnK19jb2xJY29uSWQpO1xyXG4gICAgICAgIGxldCBjbHMgPSAkKHRoKS5hdHRyKCdjbGFzcycpO1xyXG5cclxuICAgICAgICAvL2lmIChfc29ydFR5cGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGNscyAhPSBudWxsICYmIGNscy5pbmRleE9mKFwibm8tc29ydFwiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIF9jb2xJY29uVXBFbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctdXBcIik7XHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LWRvd25cIik7ICAgICAgICAgXHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtY2wtYmx1ZVwiKTsgICAgICAgICAgICAgXHJcbiAgICAgICAgICB9ICAgICAgICAgIFxyXG4gICAgICAgICAgZWxzZSBpZiAoY2xzICE9IG51bGwgJiYgY2xzLmluZGV4T2YoXCJzb3J0aW5nX2FzY1wiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIF9jb2xJY29uVXBFbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LmFkZENsYXNzKFwic2FvcC1pbWctYXJyb3ctdXAgc2FvcC1jbC1ibHVlXCIpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjbHMgIT0gbnVsbCAmJiBjbHMuaW5kZXhPZihcInNvcnRpbmdfZGVzY1wiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIF9jb2xJY29uVXBFbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctdXBcIik7XHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5hZGRDbGFzcyhcInNhb3AtaW1nLWFycm93LWRvd24gc2FvcC1jbC1ibHVlXCIpOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctdXBcIik7XHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtaW1nLWFycm93LWRvd25cIik7ICAgICAgICAgXHJcbiAgICAgICAgICAgIF9jb2xJY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcInNhb3AtY2wtYmx1ZVwiKTsgICBcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LmFkZENsYXNzKFwic2FvcC1pbWctYXJyb3ctdXBcIik7XHJcbiAgICAgICAgICAgIF9jb2xJY29uVXBFbGVtZW50LmFkZENsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAvL31cclxuICAgICAgfSk7XHJcbiAgfSBcclxuXHJcbiAgY29uZmlnU2ltcGxlRmlsdGVyKGRhdGFUYWJsZTogYW55KTp2b2lkIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgdGFibGVJZCA9IFwiI1wiK2RhdGFUYWJsZVswXS5pZDtcclxuICAgIGxldCBfaUNvdW50ID0gMDtcclxuICAgIHZhciBfZmlsdGVyRW5hYmxlID0gZmFsc2U7XHJcbiAgICBsZXQgX3RoX2NvbHVtbnMgPSAkKHRhYmxlSWQpLmZpbmQoJ3RoJyk7XHJcbiAgICBfdGhfY29sdW1ucy5lYWNoKCBcclxuICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIF9pQ291bnQgPSBfaUNvdW50ICsgMTtcclxuICAgICAgICBsZXQgX2VsZW1lbnQgPSAkKHRoaXMpO1xyXG4gICAgICAgIGxldCBfZmlsdGVyVHlwZSA9IF9lbGVtZW50LmF0dHIoXCJjb2x1bW4tZmlsdGVyXCIpOyAgIFxyXG4gICAgICAgIGxldCBfbm9zb3J0ID0gX2VsZW1lbnQuaGFzQ2xhc3MoXCJuby1zb3J0XCIpO1xyXG4gICAgICAgIGxldCBfYWN0aW9uQ29sdW1uID0gX2VsZW1lbnQuaGFzQ2xhc3MoXCJzYW9wLXRhYmxlLXRoLWxhc3RcIik7XHJcbiAgICAgICAgX2VsZW1lbnQuYXR0cihcImlkXCIsXCJjb2x1bW4taGVhZGVyLVwiKyBfaUNvdW50ICtcIlwiKTtcclxuICAgICAgICBfZWxlbWVudC5jc3MoXCJvdXRsaW5lXCIsXCJub25lXCIpO1xyXG4gICAgICAgIGxldCBjb2xfdGl0bGUgPSBfZWxlbWVudC50ZXh0KCk7XHJcbiAgICAgICAgLy9sZXQgY29sX21heF93aWR0aCA9IGNvbF90aXRsZS5sZW5ndGggKiA3O1xyXG4gICAgICAgIF9lbGVtZW50LnRleHQoXCJcIik7XHJcblxyXG4gICAgICAgIC8vX2VsZW1lbnQuYXBwZW5kKFwiPGRpdiBjbGFzcz0nc2FvcC10YWJsZS1oZWFkZXItY2FwdGlvbiBzYW9wLXRhYmxlLXRleHQtdHJ1bmNhdGUnIGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfaUNvdW50ICtcIi1jYXB0aW9uJyBzdHlsZT0nbWF4LXdpZHRoOlwiK2NvbF9tYXhfd2lkdGgudG9TdHJpbmcoKStcInB4ICFpbXBvcnRhbnQ7Jz5cIitjb2xfdGl0bGUrXCI8L2Rpdj5cIik7XHJcbiAgICAgICAgX2VsZW1lbnQuYXBwZW5kKFwiPGRpdiBjbGFzcz0nc2FvcC10YWJsZS1oZWFkZXItY2FwdGlvbiBzYW9wLXRhYmxlLXRleHQtdHJ1bmNhdGUnIGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfaUNvdW50ICtcIi1jYXB0aW9uJz5cIitjb2xfdGl0bGUrXCI8L2Rpdj5cIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKF9maWx0ZXJUeXBlICE9IG51bGwgJiYgX2ZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSA9PSBcInRleHRcIil7XHJcbiAgICAgICAgICBfZmlsdGVyRW5hYmxlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKF9maWx0ZXJUeXBlICE9IG51bGwgJiYgX2ZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSA9PSBcImRyb3Bkb3duXCIpe1xyXG4gICAgICAgICAgX2ZpbHRlckVuYWJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoX2FjdGlvbkNvbHVtbiAhPSBudWxsICYmIF9hY3Rpb25Db2x1bW4gPT0gdHJ1ZSl7XHJcbiAgICAgICAgICBfbm9zb3J0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfbm9zb3J0ID09IG51bGwgfHxfbm9zb3J0ID09IGZhbHNlKXtcclxuICAgICAgICAgIF9lbGVtZW50LmFwcGVuZChcIjxkaXYgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWljb24nIHN0eWxlPSdmbG9hdDogcmlnaHQ7aGVpZ2h0OiAyMHB4O3dpZHRoOiAyMHB4O2Rpc3BsYXk6IGlubGluZS1mbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7Jz5cIik7XHJcbiAgICAgICAgICBfZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfaUNvdW50ICtcIi1pY29uLXVwJyBzdHlsZT0nZmxvYXQ6IHJpZ2h0O2hlaWdodDogMjBweDt3aWR0aDogNXB4O2Rpc3BsYXk6IGlubGluZS1mbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7Jz5cIik7ICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgX2VsZW1lbnQuYXBwZW5kKFwiPGRpdiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2lDb3VudCArXCItc2l6ZXInPlwiKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoX2ZpbHRlckVuYWJsZSkge1xyXG4gICAgICAkKHRhYmxlSWQrJyB0aGVhZCB0cicpXHJcbiAgICAgIC5jbG9uZSh0cnVlKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2ZpbHRlcnMnKVxyXG4gICAgICAuYXBwZW5kVG8odGFibGVJZCsnIHRoZWFkJyk7XHJcblxyXG4gICAgICAvLyBTZXR1cCAtIGFkZCBhIHRleHQgaW5wdXQgdG8gZWFjaCBmb290ZXIgY2VsbFxyXG4gICAgICBsZXQgX2ZpbHRlcnMgPSAkKHRhYmxlSWQpLmZpbmQoJy5maWx0ZXJzJyk7XHJcbiAgICAgIGxldCBfZmlsdGVyc190aCA9IF9maWx0ZXJzLmZpbmQoJ3RoJyk7XHJcbiAgICAgIF9pQ291bnQgPSAwO1xyXG4gICAgICBfZmlsdGVyc190aC5lYWNoKCBcclxuICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBfaUNvdW50ID0gX2lDb3VudCArIDE7XHJcbiAgICAgICAgICBsZXQgX2VsZW1lbnQgPSAkKHRoaXMpO1xyXG4gICAgICAgICAgX2VsZW1lbnQub2ZmKCk7XHJcblxyXG4gICAgICAgICAgX2VsZW1lbnQuaHRtbChcIlwiKTtcclxuXHJcbiAgICAgICAgICBsZXQgX2ZpbHRlclR5cGUgPSBfZWxlbWVudC5hdHRyKFwiY29sdW1uLWZpbHRlclwiKTtcclxuXHJcbiAgICAgICAgICB3aGlsZShfZWxlbWVudFswXS5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICBfZWxlbWVudFswXS5yZW1vdmVBdHRyaWJ1dGUoX2VsZW1lbnRbMF0uYXR0cmlidXRlc1swXS5uYW1lKTtcclxuXHJcbiAgICAgICAgICBsZXQgX2NvbElkID0gXCJjb2xfXCIrX2lDb3VudC50b1N0cmluZygpOyAgICAgICAgXHJcbiAgICAgICAgICBfZWxlbWVudC5hdHRyKFwiaWRcIixfY29sSWQpO1xyXG4gICAgICAgICAgbGV0IF9pbnB1dElkID0gX2NvbElkK1wiX2ZpbHRlclwiOyAgICAgICAgXHJcbiAgICAgICAgICBsZXQgdGl0bGUgPSBfZWxlbWVudC50ZXh0KCk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGlmIChfZmlsdGVyVHlwZSAhPSBudWxsICYmIF9maWx0ZXJUeXBlLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZXh0XCIpe1xyXG4gICAgICAgICAgICBsZXQgX2lucHV0RSA9IG5ldyBTYW9wSW5wdXRXRkwoe2lkOl9pbnB1dElkLGNhcHRpb246dGl0bGUscGxhY2Vob2xkZXI6dGl0bGV9KS5nZXRJbm5lckh0bWwoKTtcclxuICAgICAgICAgICAgX2VsZW1lbnQuaHRtbChfaW5wdXRFKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoX2ZpbHRlclR5cGUgIT0gbnVsbCAmJiBfZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpID09IFwiZHJvcGRvd25cIil7XHJcbiAgICAgICAgICAgIGxldCBfc2VsZWN0SWQgPSBfY29sSWQrXCJfc2VsZWN0XCI7ICAgXHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RIdG1sID0gbmV3IFNhb3BzZWxlY3RXRkwoe2lkOl9zZWxlY3RJZCxjYXB0aW9uOlwiXCIscGxhY2Vob2xkZXI6XCJcIn0pLmdldElubmVySHRtbCgpO1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ID0gJChzZWxlY3RIdG1sKTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgLy9cclxuXHJcbiAgICAgICAgICAgIGxldCBfaW5kZXggPSBfaUNvdW50O1xyXG4gICAgICAgICAgICBfaW5kZXggPSBfaW5kZXggLSAxO1xyXG5cclxuICAgICAgICAgICAgZGF0YVRhYmxlLkRhdGFUYWJsZSgpXHJcbiAgICAgICAgICAgIC5jb2x1bW4oX2luZGV4Kyc6dmlzaWJsZScpXHJcbiAgICAgICAgICAgIC5kYXRhKClcclxuICAgICAgICAgICAgLnVuaXF1ZSgpXHJcbiAgICAgICAgICAgIC5zb3J0KClcclxuICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGQ6YW55LCBqOmFueSkge1xyXG4gICAgICAgICAgICAgIGlmIChkLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgbGV0IF9jb250ZW50ID0gZDtcclxuICAgICAgICAgICAgICAgIGxldCBfZmlyc3RDaGFyID0gX2NvbnRlbnRbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0Q2hhci5jaGFyQ29kZUF0KDApID4gMTAwMCkge19jb250ZW50ID0gX2NvbnRlbnQucmVwbGFjZShfZmlyc3RDaGFyK1wiIFwiLFwiXCIpO31cclxuICAgICAgICAgICAgICAgIHNlbGVjdC5maW5kKCdzZWxlY3QnKS5sYXN0KCkuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPVwiJyArIGQgKyAnXCI+JyArIF9jb250ZW50ICsgJzwvb3B0aW9uPicpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBfZWxlbWVudC5hcHBlbmQoc2VsZWN0KTtcclxuICAgICAgICAgIH0gICAgXHJcbiAgICAgICAgfSBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIEFwcGx5IHRoZSBmaWx0ZXJcclxuICAgICAgJCh0YWJsZUlkK1wiIHRoZWFkIGlucHV0XCIpLm9uKCAna2V5dXAgY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGxldCBfaW5kZXggPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLmluZGV4KCk7XHJcbiAgICAgICAgZGF0YVRhYmxlLkRhdGFUYWJsZSgpXHJcbiAgICAgICAgICAgIC5jb2x1bW4oX2luZGV4Kyc6dmlzaWJsZScpXHJcbiAgICAgICAgICAgIC5zZWFyY2goIHRhcmdldC52YWx1ZSApXHJcbiAgICAgICAgICAgIC5kcmF3KCk7XHJcblxyXG4gICAgICAgIC8vdmFyIHZhbCA9ICQuZm4uZGF0YVRhYmxlLnV0aWwuZXNjYXBlUmVnZXgodGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAvL2RhdGFUYWJsZS5EYXRhVGFibGUoKS5zZWFyY2godmFsID8gJ14nICsgdmFsICsgJyQnIDogJycsIHRydWUsIGZhbHNlKS5kcmF3KCk7XHJcblxyXG4gICAgICB9ICk7ICAgIFxyXG4gXHJcbiAgICAgIC8vIEFwcGx5IHRoZSBkcm9wZG93biBmaWx0ZXJcclxuICAgICAgJCh0YWJsZUlkK1wiIHRoZWFkIHNlbGVjdFwiKS5vbiggJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBsZXQgX2luZGV4ID0gJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5pbmRleCgpO1xyXG4gICAgICAgIHZhciB2YWwgPSAkLmZuLmRhdGFUYWJsZS51dGlsLmVzY2FwZVJlZ2V4KHRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgZGF0YVRhYmxlLkRhdGFUYWJsZSgpXHJcbiAgICAgICAgICAgIC5jb2x1bW4oX2luZGV4Kyc6dmlzaWJsZScpXHJcbiAgICAgICAgICAgIC5zZWFyY2godmFsID8gJ14nICsgdmFsICsgJyQnIDogJycsIHRydWUsIGZhbHNlKVxyXG4gICAgICAgICAgICAuZHJhdygpO1xyXG4gICAgICB9ICk7ICBcclxuXHJcbiAgICAgIC8vXHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcblxyXG4gIGNvbmZpZ1NpbXBsZVNvcnQoZ3JpZElkOiBzdHJpbmcpOnZvaWQge1xyXG4gICAgdGhpcy5zZXRTb3J0RWxlbWVudChncmlkSWQpO1xyXG4gICAgdGhpcy5zZXRTb3J0RWxlbWVudEV2ZW50KGdyaWRJZCk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvZGF0YS10YWJsZXMvdHlwZXMuZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWRGaWx0ZXIgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWQtZmlsdGVyXCI7XHJcbmltcG9ydCB7IERhdGFUYWJsZXMgfSBmcm9tIFwiLi4vQHR5cGVzL2RhdGEtdGFibGVzL3R5cGVzXCI7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWRFZGl0IH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1ncmlkLWVkaXRcIjtcclxuXHJcblxyXG4vLyBmdW5jdGlvbiBzdGF0dXNGb3JtYXR0ZXIocm93OiBudW1iZXIsIGNlbGw6IG51bWJlciwgdmFsdWU6IGFueSwgY29sdW1uRGVmOiBTbGljay5Db2x1bW48U2xpY2suU2xpY2tEYXRhPiwgZGF0YUNvbnRleHQ6IFNsaWNrLlNsaWNrRGF0YSkge1xyXG4vLyAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XHJcbi8vICAgICByZXR1cm4gXCItXCI7XHJcbi8vICAgfSBlbHNlIGlmICh2YWx1ZSA8IDUwKSB7XHJcbi8vICAgICByZXR1cm4gXCI8c3BhbiBzdHlsZT0nY29sb3I6cmVkO2ZvbnQtd2VpZ2h0OmJvbGQ7Jz5cIiArIHZhbHVlICsgXCIlPC9zcGFuPlwiO1xyXG4vLyAgIH0gZWxzZSB7XHJcbi8vICAgICByZXR1cm4gXCI8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPlwiICsgdmFsdWUgKyBcIiU8L3NwYW4+XCI7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZWJHcmlkVG9vbGJhciB7XHJcbiAgaWQ/OnN0cmluZyxcclxuICBjYXB0aW9uOnN0cmluZyxcclxuICBidXR0b25zPzpTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b25bXVxyXG4gIGl0ZW1zVGVtcGxhdGVJZD86IHN0cmluZztcclxufSBcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uIHtcclxuICBpZDpzdHJpbmcsXHJcbiAgY2FwdGlvbiA6c3RyaW5nLCAgXHJcbiAgY2xhc3M/IDpzdHJpbmcsXHJcbiAgYXR0cmlidXRlcz86c3RyaW5nLFxyXG4gIG9uQ2xpY2tFdmVudD86c3RyaW5nLFxyXG4gIHRlbXBsYXRlPzogc3RyaW5nO1xyXG59IFxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViR3JpZFRvZ2dsZVBhbmVsIHtcclxuICBlbmFibGVkOmJvb2xlYW5cclxufSBcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdlYkdyaWRQcm9wZXJ0aWVzIHtcclxuICBncmlkSWQ6c3RyaW5nXHJcbiAgLGNzcz86c3RyaW5nXHJcbiAgLHRvZ2dsZVBhbmVsPzpTYW9wV2ViR3JpZFRvZ2dsZVBhbmVsXHJcbiAgLHRvb2xiYXI/OlNhb3BXZWJHcmlkVG9vbGJhciAgXHJcbiAgLGRhdGFUYWJsZT86U2FvcFdlYkRhdGFUYWJsZVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZWJEYXRhVGFibGUge1xyXG4gIGVuYWJsZWQ6Ym9vbGVhblxyXG4gICxjb2x1bW5EZWZzU2V0dGluZ3M/OiBEYXRhVGFibGVzLkNvbHVtbkRlZnNTZXR0aW5nc1tdXHJcbiAgLG9yZGVyaW5nPzpib29sZWFuXHJcbiAgLGNvbHVtbnM/OmFueVtdXHJcbiAgLGRhdGE/OiBhbnlcclxuICAsb3JkZXI/OiBBcnJheTwobnVtYmVyIHwgc3RyaW5nKT4gfCBBcnJheTxBcnJheTwobnVtYmVyIHwgc3RyaW5nKT4+XHJcbiAgLGVkaXRhYmxlPzpib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wV2ViR3JpZCB7XHJcbiAgcHJpdmF0ZSBfcHJvcGVydGllczpTYW9wV2ViR3JpZFByb3BlcnRpZXNcclxuICBwcml2YXRlIF90YWJsZURpdjpIVE1MVGFibGVFbGVtZW50O1xyXG4gIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuICBwcml2YXRlIF9zYW9wV2ViR3JpZEVkaXQ6IFNhb3BXZWJHcmlkRWRpdDtcclxuICAvL1xyXG4gIHB1YmxpYyBsaWJOYW1lOiBzdHJpbmc7ICBcclxuICBwdWJsaWMgd2ViR3JpZEZpbHRlcjpTYW9wV2ViR3JpZEZpbHRlcjtcclxuICBwdWJsaWMgZGF0YVRhYmxlOiBEYXRhVGFibGVzLkFwaTxhbnk+O1xyXG4gIHB1YmxpYyBtYXJrZWRDb2x1bW5DaGVja2JveDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICB0aGlzLndlYkdyaWRGaWx0ZXIgPSBuZXcgU2FvcFdlYkdyaWRGaWx0ZXIoKTtcclxuICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICB0aGlzLl9zYW9wV2ViR3JpZEVkaXQgPSBuZXcgU2FvcFdlYkdyaWRFZGl0KFwiX3Nhb3BXZWJHcmlkRWRpdFwiKTsgICAgXHJcbiAgICB0aGlzLl9zYW9wV2ViR3JpZEVkaXQub25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSA9IHRoaXMub25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZS5iaW5kKHRoaXMpO1xyXG4gIH0gIFxyXG5cclxuICBzZXRUZXJtaW5vbG9neUxpc3QoKXtcclxuICAgIGxldCBfdGVybWlub2xvZ3k6IHN0cmluZ1tdID0gWydOaSBwb2RhdGtvdiB6YSBwcmlrYXouJ107XHJcbiAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChfdGVybWlub2xvZ3kpO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICBpbml0KGdyaWRQcm9wOlNhb3BXZWJHcmlkUHJvcGVydGllcykge1xyXG4gICAgdGhpcy5fcHJvcGVydGllcyA9IGdyaWRQcm9wO1xyXG4gICAgdGhpcy5fdGFibGVEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGdyaWRQcm9wLmdyaWRJZCkgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgIC8vXHJcbiAgICBsZXQgX3RvZ2dsZVBhbmVsRGVmYXVsdCA9IHtlbmFibGVkOnRydWV9O1xyXG4gICAgZ3JpZFByb3AudG9nZ2xlUGFuZWwgPSB7Li4uX3RvZ2dsZVBhbmVsRGVmYXVsdCwgLi4uZ3JpZFByb3AudG9nZ2xlUGFuZWx9XHJcbiAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKGdyaWRQcm9wLnRvZ2dsZVBhbmVsKSl7XHJcbiAgICAgIGdyaWRQcm9wLnRvZ2dsZVBhbmVsID0gX3RvZ2dsZVBhbmVsRGVmYXVsdDtcclxuICAgIH0gICAgICBcclxuICAgIC8vXHJcblxyXG4gICAgdGhpcy53ZWJHcmlkRmlsdGVyLmlkID0gZ3JpZFByb3AuZ3JpZElkK1wiZmlsdGVyXCI7XHJcbiAgICB0aGlzLmdlbmVyYXRlSHRtbFRhYmxlKCk7XHJcbiAgICB0aGlzLmFkZEdyaWRUb29sYmFyKCk7XHJcbiAgICAvLyBkZXQgZGVmYXVsdHNcclxuICAgIGxldCBfTXNnX2VtcHR5VGFibGUgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiTmkgcG9kYXRrb3YgemEgcHJpa2F6LlwiKVxyXG5cclxuICAgIGxldCBfZGF0YVRhYmxlRGVmID0ge2VuYWJsZWQ6dHJ1ZSxvcmRlcmluZzp0cnVlfTtcclxuICAgIGdyaWRQcm9wLmRhdGFUYWJsZSA9IHsuLi5fZGF0YVRhYmxlRGVmLCAuLi5ncmlkUHJvcC5kYXRhVGFibGV9XHJcblxyXG4gICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZChncmlkUHJvcC5kYXRhVGFibGUpKXtcclxuICAgICAgZ3JpZFByb3AuZGF0YVRhYmxlID0gZ3JpZFByb3AuZGF0YVRhYmxlO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBsZXQgX2NvbHVtbkRlZnNTZXR0aW5nc0RlZiA9IFt7b3JkZXJhYmxlOiB0cnVlLCB0YXJnZXRzOiAgXCJuby1zb3J0XCJ9XTtcclxuICAgIGdyaWRQcm9wLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3MgPSB7Li4uX2NvbHVtbkRlZnNTZXR0aW5nc0RlZiwuLi5ncmlkUHJvcC5kYXRhVGFibGUuY29sdW1uRGVmc1NldHRpbmdzfVxyXG5cclxuICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoZ3JpZFByb3AuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5ncykpe1xyXG4gICAgICBncmlkUHJvcC5kYXRhVGFibGUuY29sdW1uRGVmc1NldHRpbmdzID0gX2NvbHVtbkRlZnNTZXR0aW5nc0RlZjtcclxuICAgIH1cclxuICAgIC8vXHJcbiAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZSkgXHJcbiAgICAgICYmIHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmVuYWJsZWRcclxuICAgICAgKXtcclxuICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgdGhpcy5kYXRhVGFibGUgPSBcclxuICAgICAgICAkKGdyaWRQcm9wLmdyaWRJZCkuRGF0YVRhYmxlKFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwicGFnaW5nXCI6IGZhbHNlXHJcbiAgICAgICAgICAgICAgLCBcInNlYXJjaGluZ1wiOiB0cnVlXHJcbiAgICAgICAgICAgICAgLFwiYXV0b1dpZHRoXCI6IHRydWVcclxuICAgICAgICAgICAgICAsb3JkZXJDZWxsc1RvcDogdHJ1ZVxyXG4gICAgICAgICAgICAgIC8vLCBcImRvbVwiOiBcIlJsZnJ0aXBcIlxyXG4gICAgICAgICAgICAgICwgaW5pdENvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JpZFByb3AuZGF0YVRhYmxlLm9yZGVyaW5nKXtcclxuICAgICAgICAgICAgICAgICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdTaW1wbGVGaWx0ZXIodGhpcyk7ICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLndlYkdyaWRGaWx0ZXIuY29uZmlnU2ltcGxlU29ydChfdGhpcy5fcHJvcGVydGllcy5ncmlkSWQpOyAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9pZighaXNVbkRlZmluZWQoX3RoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIF90aGlzLndlYkdyaWRGaWx0ZXIuY29uZmlnRmlsdGVyKF90aGlzLmxpYk5hbWUsdGhpcywgX3RoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICxvcmRlcjogX3RoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLm9yZGVyXHJcbiAgICAgICAgICAgICAgLy8gLGFqYXg6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaywgc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgICAvLyAgIGNhbGxiYWNrKHsgZGF0YTogZGF0YSB9KSAvL3JlbG9hZHMgZGF0YSBcclxuICAgICAgICAgICAgICAvLyB9IFxyXG4gICAgICAgICAgICAgICxjb2x1bW5EZWZzOiBfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuY29sdW1uRGVmc1NldHRpbmdzIFxyXG4gICAgICAgICAgICAgICxvcmRlcmluZyA6IGdyaWRQcm9wLmRhdGFUYWJsZS5vcmRlcmluZyBcclxuICAgICAgICAgICAgICAsbGFuZ3VhZ2UgOiB7ZW1wdHlUYWJsZTpfTXNnX2VtcHR5VGFibGUsemVyb1JlY29yZHM6X01zZ19lbXB0eVRhYmxlfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7ICAgIFxyXG4gICAgICAvL1xyXG4gICAgICAkKGdyaWRQcm9wLmdyaWRJZCtcIl9maWx0ZXJcIikucmVtb3ZlKCk7XHJcbiAgICAgICQoZ3JpZFByb3AuZ3JpZElkK1wiX2luZm9cIikucmVtb3ZlKCk7IFxyXG4gICAgICB0aGlzLndlYkdyaWRGaWx0ZXIuc2V0UmVzaXplRXZlbnQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQpO1xyXG4gICAgICAvL1xyXG4gICAgfVxyXG4gICBcclxuICAgIC8vXHJcbiAgICBpZiAodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZWRpdGFibGUpIHtcclxuICAgICAgdGhpcy5pbml0V2ViR3JpZEVkaXRhYmxlQ29sdW1uQ2xpY2tFdmVudHMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFRvb2xiYXJCdXR0b25zKGdyaWRQYW5lbDogSlF1ZXJ5PEhUTUxFbGVtZW50PixidXR0b25zOlNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdKXtcclxuICAgIGlmKGdsb2JhbC5pc1VuRGVmaW5lZChidXR0b25zKSA9PSBmYWxzZSl7XHJcbiAgICAgIGJ1dHRvbnMuZm9yRWFjaChfYnV0dG9uID0+IHtcclxuICAgICAgICB2YXIgYnV0dG9uVGVtcGxhdGUgPSBcclxuICAgICAgICBgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIG15LWF1dG9cIiBzdHlsZT1cInBhZGRpbmctbGVmdDoyMXB4O1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBzYW9wLWJ1dHRvbi1wcmltYXJ5IG14LWF1dG8gZC1ibG9ja1wiIGlkPVwiJHtfYnV0dG9uLmlkfVwiIHR5cGU9XCJzdWJtaXRcIiBvbmNsaWNrPVwiJHtfYnV0dG9uLm9uQ2xpY2tFdmVudH1cIiBzdHlsZT1cInBhZGRpbmctbGVmdDoxMHB4O1wiPjxzcGFuIGNsYXNzPVwic2FvcC1pbWctcGx1c1wiPjwvc3Bhbj4ke19idXR0b24uY2FwdGlvbn08L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj4gICAgXHJcbiAgICAgICAgYDtcclxuXHJcbiAgICAgICAgaWYgKF9idXR0b24udGVtcGxhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgYnV0dG9uVGVtcGxhdGUgPSBfYnV0dG9uLnRlbXBsYXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ3JpZFBhbmVsLmZpbmQoXCIjdG9vbGJhckJ1dHRvbnNcIikuYXBwZW5kKGJ1dHRvblRlbXBsYXRlKTsgICAgICBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUh0bWxUYWJsZSgpIHtcclxuICAgIHRoaXMuZ2VuZXJhdGVUYWJsZUJvZHkoKTsgICAgICAgIFxyXG4gICAgdGhpcy5nZW5lcmF0ZVRhYmxlSGVhZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVUYWJsZUhlYWQoKSB7XHJcbiAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZSkpe1xyXG4gICAgICBpZighZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlLmNvbHVtbnMpKXtcclxuICAgICAgICBsZXQgdGhlYWQgPSB0aGlzLl90YWJsZURpdi5jcmVhdGVUSGVhZCgpO1xyXG4gICAgICAgIGxldCByb3cgPSB0aGVhZC5pbnNlcnRSb3coKTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuY29sdW1ucykge1xyXG4gICAgICAgICAgbGV0IHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRoXCIpO1xyXG4gICAgICAgICAgbGV0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShrZXkubmFtZSk7XHJcbiAgICAgICAgICB0aC5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZCh0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGdlbmVyYXRlVGFibGVCb2R5KCkge1xyXG4gICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUpKXtcclxuICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZGF0YSkpe1xyXG4gICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZGF0YSkge1xyXG4gICAgICAgICAgbGV0IHJvdyA9IHRoaXMuX3RhYmxlRGl2Lmluc2VydFJvdygpO1xyXG4gICAgICAgICAgZm9yIChsZXQga2V5IGluIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuaW5zZXJ0Q2VsbCgpO1xyXG4gICAgICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVsZW1lbnRba2V5XSk7XHJcbiAgICAgICAgICAgIGNlbGwuYXBwZW5kQ2hpbGQodGV4dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRHcmlkVG9vbGJhcigpIHtcclxuICAgIGxldCBncmlkUGFuZWw6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBsZXQgX2NzcyA9IGdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmNzcykgPT0gZmFsc2UgPyB0aGlzLl9wcm9wZXJ0aWVzLmNzcyA6XCJcIjtcclxuXHJcbiAgICBsZXQgZ3JpZFBhbmVsVGVtcGxhdGUgPSBgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNhb3AtdGFibGUtZml4aGVhZCAke19jc3N9XCI+XHJcbiAgICAgICAgICA8dGFibGUgaWQ9XCIjc2xpY2tHcmlkI1wiPjwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICBgO1xyXG4gICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy50b29sYmFyKSkge1xyXG4gICAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pZCkpIHtcclxuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWQgPSB0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCtcIlRCXCI7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGdyaWRUb2dnbGVQYW5lbCA9IGBgO1xyXG4gICAgICBsZXQgZ3JpZFRvZ2dsZVBhbmVsQ2xhc3MgPSBcIlwiO1xyXG4gICAgICBsZXQgZ3JpZEJvcmRlckJvdHRvbSA9IFwiXCI7XHJcbiAgICAgIGlmKHRoaXMuX3Byb3BlcnRpZXMudG9nZ2xlUGFuZWwuZW5hYmxlZCkge1xyXG4gICAgICAgIGdyaWRUb2dnbGVQYW5lbENsYXNzID0gXCJjb2xsYXBzZSBzaG93XCI7XHJcbiAgICAgICAgZ3JpZEJvcmRlckJvdHRvbSA9IFwic2FvcC1ib3JkZXItYm90dG9tXCI7XHJcblxyXG4gICAgICAgIGdyaWRUb2dnbGVQYW5lbCA9IFxyXG4gICAgICAgICAgYFxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNhb3AtZm9ybS1wYW5lbC1oZWFkaW5nIHNhb3AtdG9nZ2xlLXBhbmVsXCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwic2FvcC10eHQtMyBtLTBcIiBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCIgYXJpYS1leHBhbmRlZD1cInRydWVcIiBkYXRhLXRhcmdldD1cIiNjb2xsYXBzZSR7dGhpcy5fcHJvcGVydGllcy50b29sYmFyLmlkfVwiPlxyXG4gICAgICAgICAgICAke3RoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5jYXB0aW9ufSA8c3BhbiBjbGFzcz1cInNhb3AtaW1nLWRvd24gc2ktbSBzYW9wLXRvZ2dsZS1hcnJvdyByaWdodFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICBgOyAgICAgIFxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgX3Rvb2xiYXJJdGVtcyA9IGBgO1xyXG4gICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaXRlbXNUZW1wbGF0ZUlkKSl7XHJcbiAgICAgICAgbGV0IF90b29sYmFySXRlbXNUZW1wbGF0ZSA9ICQodGhpcy5fcHJvcGVydGllcy50b29sYmFyLml0ZW1zVGVtcGxhdGVJZCk7XHJcbiAgICAgICAgaWYgKF90b29sYmFySXRlbXNUZW1wbGF0ZS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIF90b29sYmFySXRlbXMgPSBfdG9vbGJhckl0ZW1zVGVtcGxhdGUuaHRtbCgpO1xyXG4gICAgICAgICAgX3Rvb2xiYXJJdGVtc1RlbXBsYXRlLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZ3JpZFBhbmVsVGVtcGxhdGUgPSBgXHJcbiAgICAgICAgPGRpdiBpZD1cIiR7dGhpcy5fcHJvcGVydGllcy50b29sYmFyLmlkfVwiIGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdCAke2dyaWRCb3JkZXJCb3R0b219XCI+XHJcbiAgICAgICAgICAke2dyaWRUb2dnbGVQYW5lbH1cclxuICAgICAgICAgIDxkaXYgaWQ9XCJjb2xsYXBzZSR7dGhpcy5fcHJvcGVydGllcy50b29sYmFyLmlkfVwiIGNsYXNzPVwic2FvcC1mb3JtLXBhbmVsLWJvZHkgJHtncmlkVG9nZ2xlUGFuZWxDbGFzc31cIj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cImdyaWQtdG9vbGJhclwiIGNsYXNzPVwic2FvcC10YWJsZS10b29sYmFyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBpZD1cInRvb2xiYXJCdXR0b25zXCIgY2xhc3M9XCJyb3cgbXItMCBtbC0wIGp1c3RpZnktY29udGVudC1zdGFydFwiIHN0eWxlPVwiaGVpZ2h0OjEwMCU7XCI+XHJcbiAgICAgICAgICAgICAgJHtfdG9vbGJhckl0ZW1zfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNhb3AtdGFibGUtZml4aGVhZCAke19jc3N9XCI+XHJcbiAgICAgICAgICAgICAgPHRhYmxlIGlkPVwiI3NsaWNrR3JpZCNcIj48L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICBgO1xyXG4gICAgfVxyXG4gICAgZ3JpZFBhbmVsVGVtcGxhdGUgPSBncmlkUGFuZWxUZW1wbGF0ZS5yZXBsYWNlKFwiI3NsaWNrR3JpZCNcIix0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZC5yZXBsYWNlKFwiI1wiLFwiXCIpKTtcclxuICAgIGdyaWRQYW5lbCA9ICQoZ3JpZFBhbmVsVGVtcGxhdGUpO1xyXG4gICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy50b29sYmFyKSkge1xyXG4gICAgICB0aGlzLmFkZFRvb2xiYXJCdXR0b25zKGdyaWRQYW5lbCx0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuYnV0dG9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IF90YWJsZUh0bWwgPSB0aGlzLl90YWJsZURpdjtcclxuXHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKS5yZXBsYWNlV2l0aChncmlkUGFuZWwpO1xyXG5cclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQpLnJlcGxhY2VXaXRoKF90YWJsZUh0bWwpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaERhdGEoZGF0YTphbnkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5jbGVhcigpO1xyXG4gICAgZGF0YS5lYWNoKGZ1bmN0aW9uKCBpbmRleDphbnksIHRyOnN0cmluZyApIHtcclxuICAgICAgX3RoaXMuZGF0YVRhYmxlLnJvdy5hZGQoJCh0cikpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRhdGFUYWJsZS5kcmF3KCk7ICAgIFxyXG4gIH1cclxuXHJcbiAgcmVwbGFjZUdyaWRSb3dzKGh0bWxDb250ZW50OnN0cmluZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCk7XHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkK1wiID4gdGJvZHkgPiB0clwiLCAkKGh0bWxDb250ZW50KSkuZWFjaChcclxuICAgICAgZnVuY3Rpb24oaW5kZXg6YW55LHRyOmFueSkge1xyXG4gICAgICAgIF90aGlzLmRhdGFUYWJsZS5yb3cuYWRkKCQodHIpKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTsgICAgXHJcbiAgfSAgXHJcblxyXG4gIHNldFRhYmVsRm9vdGhlcigpOnZvaWQge1xyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCsnIGJvZHknKSAgXHJcbiAgfVxyXG5cclxuICBpbml0V2ViR3JpZENvbHVtbkNoZWNrYm94QmluZENsaWNrRXZlbnQoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdGhpcy5tYXJrZWRDb2x1bW5DaGVja2JveCA9IG51bGw7XHJcblxyXG4gICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl90YWJsZURpdikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgICQoXCIjXCIgKyB0aGlzLl90YWJsZURpdi5pZCArIFwiIC5zYW9wLXRkLWlucHV0LWNoZWNrYm94XCIpLm9mZihcImNoYW5nZVwiKTtcclxuICAgICQoXCIjXCIgKyB0aGlzLl90YWJsZURpdi5pZCArIFwiIC5zYW9wLXRkLWlucHV0LWNoZWNrYm94XCIpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgIF90aGlzLm1hcmtlZENvbHVtbkNoZWNrYm94ID0gJChcIiNcIiArIF90aGlzLl90YWJsZURpdi5pZCArIFwiICNcIiArIHJvdy5jdXJyZW50VGFyZ2V0LmlkKTtcclxuXHJcbiAgICAgIC8vIG9kem5hY2ltbyB2c2Ugb3N0YWxlIGNoZWNrYm94ZVxyXG4gICAgICAkKFwiI1wiICsgX3RoaXMuX3RhYmxlRGl2LmlkICsgXCIgaW5wdXQuc2FvcC10ZC1pbnB1dC1jaGVja2JveDpub3QoI1wiICsgcm93LmN1cnJlbnRUYXJnZXQuaWQgKyBcIilcIikuZWFjaChcclxuICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAkKFwiI1wiICsgX3RoaXMuX3RhYmxlRGl2LmlkICsgXCIgI1wiICsgdGhpcy5pZCkucHJvcChcImNoZWNrZWRcIiwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgX3RoaXMuYWZ0ZXJDb2x1bW5DaGVja2JveENoYW5nZWQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJDb2x1bW5DaGVja2JveENoYW5nZWQoKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgaW5pdFdlYkdyaWRFZGl0YWJsZUNvbHVtbkNsaWNrRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKS5vZmYoXCJjbGlja1wiLCBcInRib2R5IHRkW2RhdGEtZWRpdGFibGU9J3RydWUnXVwiKTtcclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQpLm9uKFwiY2xpY2tcIiwgXCJ0Ym9keSB0ZFtkYXRhLWVkaXRhYmxlPSd0cnVlJ11cIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgX3RoaXMuX3Nhb3BXZWJHcmlkRWRpdC5zaG93V2ViR3JpZEVkaXRhYmxlQ29sdW1uRWRpdENvbnRyb2wodGhpcyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgICBcclxuICBwcml2YXRlIG9uV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGUodGRFbGVtZW50OiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICB0aGlzLm9uRWRpdFRkQ2VsbFdyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlKHRkRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvbkVkaXRUZENlbGxXcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSh0ZEVsZW1lbnQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAvLyBtZXRvZGEgemEgZXh0ZXJubyB1cG9yYWJvXHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v1xyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BJbnB1dFdGTFByb3BlcnRpZXMge1xyXG4gICAgaWQ6c3RyaW5nO1xyXG4gICAgcGxhY2Vob2xkZXI6c3RyaW5nO1xyXG4gICAgY2FwdGlvbjpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wSW5wdXRXRkwge1xyXG4gICAgcHJpdmF0ZSBfaW5wdXRUZW1wbGF0ZTpzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOlNhb3BJbnB1dFdGTFByb3BlcnRpZXMpIHtcclxuICAgICAgICB0aGlzLl9pbnB1dFRlbXBsYXRlID0gXHJcbiAgICAgICAgYFxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2FvcC1jb2wtZmlsdGVyLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzaGFkb3ctbm9uZSBzYW9wLWNvbnRyb2wgc2FvcC1jb250cm9sLWxpc3RCb3ggc2FvcC1jb2wtZmlsdGVyLWlucHV0XCIgc3R5bGU9XCJ3aWR0aDo5NSUgIWltcG9ydGFudDtcIiBpZD1cIiR7cHJvcGVydGllcy5pZH1cIiBuYW1lPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIHBsYWNlaG9sZGVyPVwiJHtwcm9wZXJ0aWVzLnBsYWNlaG9sZGVyfVwiIHRhYmluZGV4PVwiMFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJcIj5cclxuICAgICAgICAgICAgPGkgaWQ9XCJzZWFyY2hJY29uXCIgY2xhc3M9XCJzYW9wLWltZy1zZWFyY2ggc2ktcyBmb3JtLWNvbnRyb2wtZmVlZGJhY2tcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO3RvcDo1cHg7cG9zaXRpb246YWJzb2x1dGU7bGVmdDogY2FsYygxMDAlIC0gNDBweCkgIWltcG9ydGFudDtcIi8+XHJcbiAgICAgICAgPC9zcGFuPiAgICAgICAgXHJcbiAgICAgICAgYDsgICAgICAgICAgICAgIFxyXG4gICAgICAgIC8vIHRoaXMuX2lucHV0VGVtcGxhdGUgPSBcclxuICAgICAgICAvLyBgXHJcbiAgICAgICAgLy8gPHNwYW4gY2xhc3M9XCJoYXMtZmxvYXQtbGFiZWxcIj5cclxuICAgICAgICAvLyAgICAgPGlucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNoYWRvdy1ub25lIHNhb3AtY29udHJvbCBzYW9wLWNvbnRyb2wtbGlzdEJveFwiIGRhdGEtaW5wdXRtYXNrLWFsaWFzPVwiZGQubW0ueXl5eSBoaDptbVwiIGlkPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIG5hbWU9XCIke3Byb3BlcnRpZXMuaWR9XCIgcGxhY2Vob2xkZXI9XCIke3Byb3BlcnRpZXMucGxhY2Vob2xkZXJ9XCIgdGFiaW5kZXg9XCIwXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIlwiIGRpc2FibGVkPVwiXCI+XHJcbiAgICAgICAgLy8gICAgIDxsYWJlbCBjbGFzcz1cInNhb3AtZmxvYXRpbmctbGFiZWwgc2FvcC10eHQtN1wiIGZvcj1cIiR7cHJvcGVydGllcy5pZH1cIj4ke3Byb3BlcnRpZXMuY2FwdGlvbn08L2xhYmVsPlxyXG4gICAgICAgIC8vICAgICA8aSBpZD1cImNhbGVuZGFySWNvblwiIGNsYXNzPVwic2FvcC1pbWctY2FsZW5kYXIgc2ktcyBmb3JtLWNvbnRyb2wtZmVlZGJhY2tcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO2xlZnQ6MjMwcHg7dG9wOjVweDtwb3NpdGlvbjphYnNvbHV0ZTtcIi8+XHJcbiAgICAgICAgLy8gPC9zcGFuPiAgICAgICAgXHJcbiAgICAgICAgLy8gYDsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGdldEVsZW1lbnQoKTpKUXVlcnk8SFRNTEVsZW1lbnQ+e1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcy5faW5wdXRUZW1wbGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldElubmVySHRtbCgpOnN0cmluZ3tcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRUZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvaW5kZXguZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db21wb25lbnRzL3Nhb3Atc2VsZWN0aXplLXNlbGVjdC50c1wiIC8+XHJcblxyXG5pbXBvcnQgeyAgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VsZWN0aXplU2VsZWN0IH0gZnJvbSBcIi4vc2FvcC1zZWxlY3RpemUtc2VsZWN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcElucHV0TWFzayB7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0Li4uXCIpO1xyXG4gICAgICAgIHZhciBpbnB1dERpdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignaW5wdXRbZGF0YS1pbnB1dG1hc2stYWxpYXNdJyk7XHJcbiAgICAgICAgSW5wdXRtYXNrKCkubWFzayhpbnB1dERpdnMpO1xyXG5cclxuICAgICAgICAkKFwiLnNhb3AtZGVjaW1hbC0yXCIpLmlucHV0bWFzayh7XHJcbiAgICAgICAgICAgICdhbGlhcyc6ICdkZWNpbWFsJyxcclxuICAgICAgICAgICAgJ3JhZGl4UG9pbnQnOiAnLCcsXHJcbiAgICAgICAgICAgICdkaWdpdHMnOiAyLFxyXG4gICAgICAgICAgICAnZGlnaXRzT3B0aW9uYWwnOiBmYWxzZSxcclxuICAgICAgICAgICAgJ3BsYWNlaG9sZGVyJzogJzAsMDAnXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIuc2FvcC1kZWNpbWFsLTNcIikuaW5wdXRtYXNrKHtcclxuICAgICAgICAgICAgJ2FsaWFzJzogJ2RlY2ltYWwnLFxyXG4gICAgICAgICAgICAncmFkaXhQb2ludCc6ICcsJyxcclxuICAgICAgICAgICAgJ2RpZ2l0cyc6IDMsXHJcbiAgICAgICAgICAgICdkaWdpdHNPcHRpb25hbCc6IGZhbHNlLFxyXG4gICAgICAgICAgICAncGxhY2Vob2xkZXInOiAnMCwwMDAnXHJcbiAgICAgICAgfSk7ICBcclxuXHJcbiAgICAgICAgaW5wdXREaXZzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlbGVtZW50LmluaXQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uXCIgKyBlbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzcGFuRGl2OmFueTtcclxuICAgICAgICAgICAgbGV0IGVsZW1lbnRBdHJyID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1pbnB1dG1hc2stYWxpYXNcIik7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWwuaXNFbXB0eShlbGVtZW50QXRycikpIHtyZXR1cm47fTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhlbGVtZW50QXRycik7XHJcbiAgICAgICAgICAgIHNwYW5EaXYgPSAkKGVsZW1lbnQpLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoc3BhbkRpdiA9PT0gbnVsbCkgeyByZXR1cm47fTtcclxuICAgICAgICAgICAgaWYgKHNwYW5EaXYuaGFzQ2xhc3MoXCJoYXMtZmxvYXQtbGFiZWxcIik9PT1mYWxzZSkgeyByZXR1cm47fTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhzcGFuRGl2LmdldCgwKS5pZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2VBdHJyID0gKFN0cmluZykoJChcIiNzaXRlTGFuZ3VhZ2VcIikudmFsKCkpO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibGFuZ3VhZ2U6XCIrbGFuZ3VhZ2VBdHJyKTtcclxuICAgICAgICAgICAgbGFuZ3VhZ2VBdHJyID0gZ2xvYmFsLmlzRW1wdHkobGFuZ3VhZ2VBdHJyKSA/IFwic2xcIiA6bGFuZ3VhZ2VBdHJyO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibGFuZ3VhZ2U6XCIrbGFuZ3VhZ2VBdHJyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50QXRyciA9PT0gXCJoaDptbTpzc1wiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiN0aW1lSWNvblwiKTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjbG9jay4uLlwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2suYmx1ci5pbml0OlwiICsgZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmJsdXIoZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsbC5jbG9jay5ibHVyOlwiICsgZXZlbnQudGFyZ2V0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udHJvbFZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sVmFsdWUuaW5jbHVkZXMoXCJoXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnJlcGxhY2UoXCJtbVwiLCBcIjAwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS5yZXBsYWNlKFwibVwiLCBcIjBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnJlcGxhY2UoXCJzc1wiLCBcIjAwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS5yZXBsYWNlKFwic1wiLCBcIjBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gY29udHJvbFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb3ppbW8gaW5wdXQgZXZlbiwga2VyIHNtbyB2cGlzYWxpIG5vdm8gdnJlZG5vc3QgXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBFdmVudChcImlucHV0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrLmNsaWNrLmluaXQ6XCIgKyBlbGVtZW50LmlkKTtcclxuICAgICAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2tJY29uLmNsaWNrZWQ6XCIgKyBlbGVtZW50LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY3RybElucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN0cmxJbnB1dEN0cmxTdHJMZW5ndGggPSBjdHJsSW5wdXRDdHJsLnZhbHVlLmxlbmd0aCAqIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgY3RybElucHV0Q3RybC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN0cmxJbnB1dEN0cmwuc2V0U2VsZWN0aW9uUmFuZ2UoY3RybElucHV0Q3RybFN0ckxlbmd0aCwgY3RybElucHV0Q3RybFN0ckxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5XCIgXHJcbiAgICAgICAgICAgICAgICAvLyB8fCBlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5IGhoOm1tXCIgXHJcbiAgICAgICAgICAgICAgICAvLyB8fCBlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5IGhoOm1tOnNzXCJcclxuICAgICAgICAgICAgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjY2FsZW5kYXJJY29uXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLlwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKCQoZWxlbWVudCkuYXR0cihcImRhdGEtZW5hYmxlLXNlbGVjdC1wYXN0ZGF0ZXNcIikpLnRvTG93ZXJDYXNlKCkgPT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJTdGFydERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1taW4tc3RhcnQtZGF0ZVwiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlclN0YXJ0RGF0ZTEgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJTdGFydERhdGUgPSBnbG9iYWwuY29udmVydFN0cmluZzJEYXRlKGRhdGVwaWNrZXJTdGFydERhdGUxLCBcImRkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJFbmREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1heC1lbmQtZGF0ZVwiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyRW5kRGF0ZSA9ICQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpOyAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyRGF0ZShkYXRlcGlja2VyRW5kRGF0ZSwgXCJkZC5tbS55eXl5XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZGF0ZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBkYXRlcGlja2VyU3RhcnREYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGU6IGRhdGVwaWNrZXJFbmREYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jbG9zZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHdlZWtTdGFydDogMSxcclxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiZGQubW0ueXl5eVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZUF0cnIsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb246IFwiYm90dG9tIHJpZ2h0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd09uRm9jdXM6ZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAvL2ZvcmNlUGFyc2U6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9KTsgICBcclxuXHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uKCkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmwgPSAkKGVsZW1lbnQpLmdldCgwKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoID0gZGF0ZXBpY2tlcklucHV0Q3RybC52YWx1ZS5sZW5ndGggKiAyO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZGF0ZXBpY2tlcklucHV0Q3RybC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZGF0ZXBpY2tlcihcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlcklucHV0Q3RybC5zZXRTZWxlY3Rpb25SYW5nZShkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoLCBkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgfSk7ICBcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXkgaGg6bW1cIikge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImRhdGV0aW1lcGlja2VyIGhoOm1tIC4uLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjY2FsZW5kYXJJY29uXCIpO1xyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudClcclxuICAgICAgICAgICAgICAgIC5iaW5kKCdrZXlkb3duJyxmdW5jdGlvbihlKXtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLmRhdGV0aW1lcGlja2VyKHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdERC5NTS5ZWVlZIEg6bW0nLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogbGFuZ3VhZ2VBdHJyLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dUb2RheUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkub2ZmKFwiZm9jdXNcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgJChpY29uQnRuKS5jbGljayhmdW5jdGlvbigpIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZGF0YShcIkRhdGVUaW1lUGlja2VyXCIpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgXHJcbiAgXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbTpzc1wiKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGF0ZXRpbWVwaWNrZXIgaGg6bW06c3MgLi4uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiNjYWxlbmRhckljb25cIik7XHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgLmJpbmQoJ2tleWRvd24nLGZ1bmN0aW9uKGUpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAuZGF0ZXRpbWVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ0RELk1NLllZWVkgSDptbTpzcycsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBsYW5ndWFnZUF0cnIsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd1RvZGF5QnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5vZmYoXCJmb2N1c1wiKTtcclxuICAgICAgICAgICAgICAgIC8vJChlbGVtZW50KS5vZmYoXCJrZXlkb3duXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gLm9uKCdkcC5oaWRlJywgZnVuY3Rpb24oZSl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ2RwLmhpZGUnKTtcclxuICAgICAgICAgICAgICAgIC8vICAgfSkgICBcclxuICAgICAgICAgICAgICAgIC8vIC5vbignZHAuc2hvdycsIGZ1bmN0aW9uKGUpe1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKCdkcC5zaG93Jyk7XHJcbiAgICAgICAgICAgICAgICAvLyB9KTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgJChpY29uQnRuKS5jbGljayhmdW5jdGlvbigpIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICgkKGRvY3VtZW50KS5maW5kKFwiLmRhdGVwaWNrZXItZHJvcGRvd25cIikuaXMoXCI6dmlzaWJsZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZGF0YShcIkRhdGVUaW1lUGlja2VyXCIpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gJChlbGVtZW50KS5mb2N1cyhmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICQoZWxlbWVudCkuZGF0YShcIkRhdGVUaW1lUGlja2VyXCIpLmhpZGUoKTsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gfSk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJub3QgaW1wbGVtZW50ZWQuLi5cIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdE11bHRpRGF0ZVNlbGVjdERhdGVwaWNrZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aXplU2VsZWN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFNlbGVjdGl6ZU11bHRpc2VsZWN0U2VsZWN0KCk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJpbml0SW5wdXRzLi4uZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRNdWx0aURhdGVTZWxlY3REYXRlcGlja2VyKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXRNdWx0aURhdGVTZWxlY3REYXRlcGlja2VyLi4uXCIpO1xyXG5cclxuICAgICAgICB2YXIgaW5wdXREaXZzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ2lucHV0W2RhdGEtaXpib3ItdmVjLWRuaV0nKTtcclxuXHJcbiAgICAgICAgaW5wdXREaXZzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlbGVtZW50LmluaXQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uXCIgKyBlbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzcGFuRGl2OiBhbnk7XHJcbiAgICAgICAgICAgIHNwYW5EaXYgPSAkKGVsZW1lbnQpLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoc3BhbkRpdiA9PT0gbnVsbCkgeyByZXR1cm47IH07XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2Lmhhc0NsYXNzKFwiaGFzLWZsb2F0LWxhYmVsXCIpID09PSBmYWxzZSkgeyByZXR1cm47IH07XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoc3BhbkRpdi5nZXQoMCkuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxhbmd1YWdlQXRyciA9IChTdHJpbmcpKCQoXCIjc2l0ZUxhbmd1YWdlXCIpLnZhbCgpKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxhbmd1YWdlOlwiICsgbGFuZ3VhZ2VBdHJyKTtcclxuICAgICAgICAgICAgbGFuZ3VhZ2VBdHJyID0gZ2xvYmFsLmlzRW1wdHkobGFuZ3VhZ2VBdHJyKSA/IFwic2xcIiA6IGxhbmd1YWdlQXRycjtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxhbmd1YWdlOlwiICsgbGFuZ3VhZ2VBdHJyKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuXHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLlwiKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXRlcGlja2VyU3RhcnREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtZW5hYmxlLXNlbGVjdC1wYXN0ZGF0ZXNcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKCQoZWxlbWVudCkuYXR0cihcImRhdGEtZW5hYmxlLXNlbGVjdC1wYXN0ZGF0ZXNcIikpLnRvTG93ZXJDYXNlKCkgPT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJTdGFydERhdGUxID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1taW4tc3RhcnQtZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJTdGFydERhdGUgPSBnbG9iYWwuY29udmVydFN0cmluZzJEYXRlKGRhdGVwaWNrZXJTdGFydERhdGUxLCBcImRkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBkYXRlcGlja2VyRW5kRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1heC1lbmQtZGF0ZVwiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1tYXgtZW5kLWRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICBkYXRlcGlja2VyRW5kRGF0ZSA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlckVuZERhdGUsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJChlbGVtZW50KS5kYXRlcGlja2VyKHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogZGF0ZXBpY2tlclN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IGRhdGVwaWNrZXJFbmREYXRlLFxyXG4gICAgICAgICAgICAgICAgYXV0b2Nsb3NlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG11bHRpZGF0ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB3ZWVrU3RhcnQ6IDEsXHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiZGQubW0ueXl5eVwiLFxyXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcImJvdHRvbSByaWdodFwiXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJChpY29uQnRuKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5jbGlja1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VySW5wdXRDdHJsID0gJChlbGVtZW50KS5nZXQoMCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoID0gZGF0ZXBpY2tlcklucHV0Q3RybC52YWx1ZS5sZW5ndGggKiAyO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlcklucHV0Q3RybC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlcklucHV0Q3RybC5zZXRTZWxlY3Rpb25SYW5nZShkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoLCBkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXRNdWx0aURhdGVTZWxlY3REYXRlcGlja2VyLi4uZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRTZWxlY3RpemVTZWxlY3QoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdFNlbGVjdGl6ZVNlbGVjdC4uLlwiKTtcclxuXHJcbiAgICAgICAgJCgnLnNlbGVjdGl6ZVNlbGVjdCcpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgc2FvcFNlbGVjdGVsZW1lbnQgPSBuZXcgU2FvcFNlbGVjdGl6ZVNlbGVjdCgpO1xyXG4gICAgICAgICAgICBzYW9wU2VsZWN0ZWxlbWVudC5pbml0Q29udHJvbEJ5SHRtbCh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdFNlbGVjdGl6ZVNlbGVjdC4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2VsZWN0aXplTXVsdGlzZWxlY3RTZWxlY3QoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdFNlbGVjdGl6ZU11bHRpc2VsZWN0U2VsZWN0Li4uXCIpO1xyXG5cclxuICAgICAgICAkKCcuc2VsZWN0aXplTXVsdGlzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IHNhb3BTZWxlY3RlbGVtZW50ID0gbmV3IFNhb3BTZWxlY3RpemVTZWxlY3QoKTtcclxuICAgICAgICAgICAgc2FvcFNlbGVjdGVsZW1lbnQuaW5pdE11bHRpc2VsZWN0Q29udHJvbEJ5SHRtbCh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdFNlbGVjdGl6ZU11bHRpc2VsZWN0U2VsZWN0Li4uZG9uZVwiKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFBvcG92ZXIgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXBvcG92ZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZW51U2lkZWJhciB7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jb2xsRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcm90ZWN0ZWQgX2V4cEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbWVudVNpZGViYXJQb3BvdmVyOiBTYW9wUG9wb3ZlcjtcclxuXHJcbiAgICBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5pbml0Li4uXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9jb2xsRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29sbGFwc2UtaWNvbi1jb2xsXCIpO1xyXG4gICAgICAgIHRoaXMuX2V4cEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbGxhcHNlLWljb24tZXhwXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jb2xsRWxlbWVudCAhPSBudWxsKSB0aGlzLl9jb2xsRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cEVsZW1lbnQgIT0gbnVsbCkgdGhpcy5fZXhwRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBFeHBhbmQgaWNvbiBjbGlja1xyXG4gICAgICAgICQoXCIjY29sbGFwc2UtaWNvbi1leHBcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIiNjb2xsYXBzZS1pY29uLWV4cFwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5jb2xsYXBzZS1pY29uLWV4cC5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuZW5hYmxlUG9wb3ZlcigpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDb2xsYXBzZSBpY29uIGNsaWNrXHJcbiAgICAgICAgJChcIiNjb2xsYXBzZS1pY29uLWNvbGxcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgJChcIiNjb2xsYXBzZS1pY29uLWNvbGxcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuY29sbGFwc2UtaWNvbi1jb2xsLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5kaXNhYmxlUG9wb3ZlcigpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDb2xsYXBzZSBjbGlja1xyXG4gICAgICAgICQoJ1tkYXRhLXRvZ2dsZT1zaWRlYmFyLWNvbGFwc2VdJykuY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNpZGViYXJDb2xsYXBzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy9tZW51IGl0ZW0gY2xpY2tcclxuICAgICAgICAkKFwiLnNhb3AtYmctaXRlbVwiKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgLy9zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXByZXZpb3VzLWl0ZW0taWRcIiwgc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpKTtcclxuICAgICAgICAgICAgICAgIC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIsIHRoaXMuaWQpO1xyXG4gICAgICAgICAgICAgICAgLy9zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXN1Yml0ZW0taWRcIiwgXCIwXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG5cclxuICAgICAgICAvL21lbnUgc3ViLWl0ZW0gY2xpY2tcclxuICAgICAgICAvLyQoXCIuc2FvcC1iZy1zdWJpdGVtXCIpLmNsaWNrKFxyXG4gICAgICAgIC8vICAgIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgLy8gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtc3ViaXRlbS1pZFwiLCB0aGlzLmlkKTtcclxuICAgICAgICAvLyAgICB9XHJcbiAgICAgICAgLy8pXHJcblxyXG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lbnUtc2lkZWJhclwiKSAhPSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLkdldFNlc3Npb25TdG9yYWdlVmFsdWVzKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZVNlc3Npb25TdG9yYWdlVmFsdWVzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdE1lbnVTaWRlYmFyUG9wb3ZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzaWRlYmFyQ29sbGFwc2UoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLnNpZGViYXJDb2xsYXBzZVwiKTtcclxuICAgICAgICAkKCcjbWVudVRvcEljb25MYXJnZScpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICAkKCcjbWVudVRvcEljb25TbWFsbCcpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICAkKCcuc2lkZWJhci1tZW51LWNhcHRpb24nKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnI3NpZGViYXItY29udGFpbmVyJykudG9nZ2xlQ2xhc3MoJ3NpZGViYXItZXhwYW5kZWQgc2lkZWJhci1jb2xsYXBzZWQnKTtcclxuICAgICAgICAkKCcuc2FvcC1iZy1zdWJpdGVtcycpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICAkKCcjbWVudUNsb3NlQnV0dG9uJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xyXG4gICAgICAgIHZhciBTZXBhcmF0b3JUaXRsZSA9ICQoJyNzaWRlYmFyLWNvbnRhaW5lcicpO1xyXG4gICAgICAgIGlmIChTZXBhcmF0b3JUaXRsZS5oYXNDbGFzcygnc2lkZWJhci1jb2xsYXBzZWQnKSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIiwgXCJ0cnVlXCIpXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbGxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4cEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtc2lkZWJhci1leHBhbmRlZFwiLCBcImZhbHNlXCIpXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbGxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgdGhpcy5fZXhwRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbWVudUl0ZW1Db2xsYXBzZSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIubWVudUl0ZW1Db2xsYXBzZVwiKTtcclxuICAgICAgICAvL3ZhciBwcmV2aW91c0l0ZW1JRCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiKTtcclxuICAgICAgICAvL3ZhciBpdGVtSUQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIik7XHJcbiAgICAgICAgLy92YXIgc3ViaXRlbXNJRCA9IGl0ZW1JRCtcIi1jb2xsYXBzZVwiO1xyXG4gICAgICAgIC8vdmFyIHN1Yml0ZW1JRCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtc3ViaXRlbS1pZFwiKTtcclxuXHJcbiAgICAgICAgLy92YXIgcHJldmlvdXMgPSAkKFwiI1wiICsgcHJldmlvdXNJdGVtSUQpO1xyXG4gICAgICAgIC8vdmFyIGl0ZW0gPSAkKCcjJytpdGVtSUQpO1xyXG4gICAgICAgIC8vdmFyIHN1Yml0ZW1zID0gJChcIiNcIiArIHN1Yml0ZW1zSUQpO1xyXG4gICAgICAgIC8vdmFyIHN1Yml0ZW0gPSAkKFwiI1wiK3N1Yml0ZW1zSUQrXCI+I1wiK3N1Yml0ZW1JRCk7XHJcblxyXG4gICAgICAgIC8vcHJldmlvdXMucmVtb3ZlQ2xhc3MoXCJzYW9wLWJnLWl0ZW0tc2VsZWN0ZWRcIik7Ly8ndW4tY29sb3InIHByZXZpb3VzIGl0ZW1cclxuICAgICAgICAvL3ByZXZpb3VzWzBdLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgXCJmYWxzZVwiKTtcclxuICAgICAgICAvL2l0ZW1bMF0uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBcInRydWVcIik7XHJcbiAgICAgICAgLy9pdGVtLmFkZENsYXNzKFwic2FvcC1iZy1pdGVtLXNlbGVjdGVkXCIpOy8vY29sb3IgaXRlbVxyXG4gICAgICAgIC8vc3ViaXRlbXMuYWRkQ2xhc3MoJ3Nob3cnKTsvL2V4cGFuZCBjb2xsYXBzZVxyXG4gICAgICAgIC8vc3ViaXRlbS5hZGRDbGFzcyhcInNhb3AtYmctc3ViaXRlbS1zZWxlY3RlZFwiKTsvL2NvbG9yIHN1Yml0ZW1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgR2V0U2Vzc2lvblN0b3JhZ2VWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLkdldFNlc3Npb25TdG9yYWdlVmFsdWVzXCIpO1xyXG4gICAgICAgIC8vZGVmYXVsdHNcclxuICAgICAgICAvL2lmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIikgPT0gbnVsbCkge1xyXG4gICAgICAgIC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIsIG51bGwpO1xyXG4gICAgICAgIC8vICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtcHJldmlvdXMtaXRlbS1pZFwiLCBudWxsKTtcclxuICAgICAgICAvLyAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIiwgXCJuYW1pemplXCIpO1xyXG4gICAgICAgIC8vICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtc3ViaXRlbS1pZFwiLCBcIjBcIik7XHJcbiAgICAgICAgLy99XHJcblxyXG4gICAgICAgIC8vc2lkZWJhciBleHBhbmRlZC9jb250cmFjdGVkXHJcbiAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtc2lkZWJhci1leHBhbmRlZFwiKSA9PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNpZGViYXJDb2xsYXBzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9zZWxlY3RlZC1tZW51IGl0ZW1cclxuICAgICAgICB0aGlzLm1lbnVJdGVtQ29sbGFwc2UoKVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBEZWxldGVTZXNzaW9uU3RvcmFnZVZhbHVlcygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuRGVsZXRlU2Vzc2lvblN0b3JhZ2VWYWx1ZXNcIik7XHJcblxyXG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oXCJzYW9wLW1lbnUtc2lkZWJhci1leHBhbmRlZFwiKTtcclxuICAgICAgICAvL3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oXCJzYW9wLW1lbnUtcHJldmlvdXMtaXRlbS1pZFwiKTtcclxuICAgICAgICAvL3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiKTtcclxuICAgICAgICAvL3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oXCJzYW9wLW1lbnUtc3ViaXRlbS1pZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0TWVudVNpZGViYXJQb3BvdmVyKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5pbml0TWVudVNpZGViYXJQb3BvdmVyXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9tZW51U2lkZWJhclBvcG92ZXIgPSBuZXcgU2FvcFBvcG92ZXIoXCIubWVudS1wb3B1cFwiKTtcclxuICAgICAgICB0aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuaW5pdFNlbGZDb250YWluZXJQb3BvdmVyKCk7XHJcbiAgICAgICAgdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmRpc2FibGVQb3BvdmVyKCk7XHJcblxyXG4gICAgICAgIHZhciBlbGVtZW50VmlzaWJsZSA9ICQoXCIjY29sbGFwc2UtaWNvbi1jb2xsXCIpLmlzKCc6dmlzaWJsZScpO1xyXG4gICAgICAgIGlmIChlbGVtZW50VmlzaWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuZW5hYmxlUG9wb3ZlcigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5kaXNhYmxlUG9wb3ZlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGVudW0gU2FvcE1zZ0RsZ1R5cGUge1xyXG4gICAgbXRJbmZvcm1hdGlvbiA9IDFcclxuICAgICxtdFdhcm5pbmcgPSAyXHJcbiAgICAsbXRFcnJvciA9IDNcclxuICAgIC8vLCBtdENvbmZpcm1hdGlvbiwgbXRDdXN0b21cclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcE1zZ0RsZ0J1dHRvbiB7XHJcbiAgICBtYk5vbmUgPSAwXHJcbiAgICAsbWJPSyA9IDFcclxuICAgICxtYkNhbmNlbCA9IDJcclxuICAgICxtYlllcyA9IDNcclxuICAgICxtYk5vID0gNFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BNc2dEbGdFdmVudCB7XHJcbiAgICBwYXJlbnQ6YW55O1xyXG4gICAgZGF0YTphbnk7XHJcbn1cclxuXHJcbnR5cGUgU2FvcE1zZ0RsZ0J1dHRvbnMgPSBBcnJheTxTYW9wTXNnRGxnQnV0dG9uPjtcclxuXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BNZXNzYWdlRGxnIHtcclxuICAgIHByaXZhdGUgX3NlbmRlcjpTYW9wTXNnRGxnRXZlbnQ7XHJcbiAgICBwdWJsaWMgb25PazogKHNlbmRlcjphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25DYW5jZWw6IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uWWVzOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbk5vOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihzZW5kZXI6U2FvcE1zZ0RsZ0V2ZW50KXtcclxuICAgICAgICB0aGlzLl9zZW5kZXIgPSBzZW5kZXI7XHJcbiAgICB9XHJcblxyXG4gICAgU2hvdyhNc2c6c3RyaW5nLFRpdGxlOnN0cmluZyxEbGdUeXBlOlNhb3BNc2dEbGdUeXBlID0gU2FvcE1zZ0RsZ1R5cGUubXRJbmZvcm1hdGlvbixCdXR0b25zOlNhb3BNc2dEbGdCdXR0b25zID0gW1Nhb3BNc2dEbGdCdXR0b24ubWJPS10pOlNhb3BNc2dEbGdCdXR0b257XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJtZXNzYWdlOlwiK01zZyk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ0aXRsZTpcIitUaXRsZSk7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgbGV0IHRpdGxlRGl2ID0gJCgnI2FsZXJ0LW1vZGFsLXRpdGxlLWRpdicpO1xyXG4gICAgICAgIGxldCBib2R5VGFnID0gJCgnI2FsZXJ0LW1vZGFsLWJvZHknKTtcclxuXHJcbiAgICAgICAgaWYgKERsZ1R5cGUgPT0gU2FvcE1zZ0RsZ1R5cGUubXRJbmZvcm1hdGlvbil7XHJcbiAgICAgICAgICAgICQoXCIjYWxlcnQtbW9kYWwtdGl0bGUtZGl2XCIpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIixcIndoaXRlXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoRGxnVHlwZSA9PSBTYW9wTXNnRGxnVHlwZS5tdEVycm9yKSB7XHJcbiAgICAgICAgICAgICQoXCIjYWxlcnQtbW9kYWwtdGl0bGUtZGl2XCIpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIixcIiNEODJDMjVcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJChcIiNhbGVydC1tb2RhbC10aXRsZS1kaXZcIikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLFwic2lsdmVyXCIpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFnbG9iYWwuaXNFbXB0eShUaXRsZSkpe1xyXG4gICAgICAgICAgICB0aXRsZURpdi5odG1sKFRpdGxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgYm9keVRhZy5odG1sKE1zZyk7XHJcblxyXG4gICAgICAgIGlmIChCdXR0b25zICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCBfZWxlbWVudF9tYk9LID0gQnV0dG9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gU2FvcE1zZ0RsZ0J1dHRvbi5tYk9LKTtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZChfZWxlbWVudF9tYk9LKSkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE9LXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE9LXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydE9LXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQoX3RoaXMub25Paykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25PayhfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYk9LO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBfZWxlbWVudF9tYkNhbmNlbCA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJDYW5jZWwpO1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKF9lbGVtZW50X21iQ2FuY2VsKSkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydENhbmNlbFwiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRDYW5jZWxcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Q2FuY2VsXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQoX3RoaXMub25DYW5jZWwpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uQ2FuY2VsKF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iQ2FuY2VsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX2VsZW1lbnRfbWJZZXMgPSBCdXR0b25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50ID09PSBTYW9wTXNnRGxnQnV0dG9uLm1iWWVzKTtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZChfZWxlbWVudF9tYlllcykpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKF90aGlzLm9uWWVzKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vblllcyhfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYlllcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iTm8gPSBCdXR0b25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50ID09PSBTYW9wTXNnRGxnQnV0dG9uLm1iTm8pO1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKF9lbGVtZW50X21iTm8pKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Tm9cIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Tm9cIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Tm9cIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZChfdGhpcy5vbk5vKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbk5vKF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iTm87XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnRPS1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChcIiNidG5BbGVydENhbmNlbFwiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChcIiNidG5BbGVydE5vXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkKCcjYWxlcnQtbW9kYWwnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgJChcIiNhbGVydC1tb2RhbC1idG4tb2tcIikudW5iaW5kKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICQodGhpcykubW9kYWwoJ2Rpc3Bvc2UnKTtcclxuICAgICAgICB9KVxyXG4gICAgXHJcbiAgICAgICAgJCgnI2FsZXJ0LW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICBnbG9iYWwuc2V0TW9kYWxGb3JtWkluZGV4KCcjYWxlcnQtbW9kYWwnKTsgXHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYm9vdHN0cmFwLW11bHRpc2VsZWN0L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZSc7XHJcblxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BNdWx0aXNlbGVjdFBhcmFtcyB7XHJcbiAgICB0YXJnZXQ6c3RyaW5nLFxyXG4gICAgc2VsZWN0QWxsPzpib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcE11bHRpc2VsZWN0T3B0aW9ucyB7XHJcbiAgICB0ZW1wbGF0ZXNCdXR0b24/OiBzdHJpbmdcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RPcHRpb24ge1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICAgIHRleHQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BNdWx0aXNlbGVjdCB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogU2FvcFRyYW5zbGF0aW9uU2VydmljZTtcclxuICAgIHByaXZhdGUgX2NhcHRpb246IHN0cmluZyA9IFwiU2t1cGluYVwiO1xyXG4gICAgcHJpdmF0ZSBfbXVsdGlTZWxlY3RPYmplY3Q6IGFueTtcclxuICAgIHByaXZhdGUgX29wdGlvbnM6IFNhb3BNdWx0aXNlbGVjdE9wdGlvbnM7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIG1zQ29udGFpbmVyOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwdWJsaWMgbXNCdXR0b246IEpRdWVyeTxIVE1MQnV0dG9uRWxlbWVudD47XHJcbiAgICBwdWJsaWMgbXNQb3B1cENvbnRhaW5lcjogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHB1YmxpYyBtc0NvbnRhaW5lckxhYmVsOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwdWJsaWMgc2VsZWN0ZWRDQjphbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGliTmFtZTpzdHJpbmcgPSBcIlwiLCBvcHRpb25zOlNhb3BNdWx0aXNlbGVjdE9wdGlvbnMgPSBudWxsKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNdWx0aXNlbGVjdFwiKTtcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcclxuICAgIH0gXHJcblxyXG4gICAgc2V0T3B0aW9ucyhvcHRpb25zOiBTYW9wTXVsdGlzZWxlY3RPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgICAgLy8gZmlyc3Qgc2V0IGRlZmF1bHQgb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlc0J1dHRvbjogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibXVsdGlzZWxlY3QgZHJvcGRvd24tdG9nZ2xlIHByLTBcIiBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCI+PHNwYW4gY2xhc3M9XCJtdWx0aXNlbGVjdC1zZWxlY3RlZC10ZXh0XCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwic2FvcC1pbWctZG93biBzaS1zIGZsb2F0LXJpZ2h0XCI+PC9zcGFuPjwvYnV0dG9uPidcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRlbXBsYXRlc0J1dHRvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLnRlbXBsYXRlc0J1dHRvbiA9IG9wdGlvbnMudGVtcGxhdGVzQnV0dG9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFRlcm1pbm9sb2d5TGlzdCgpIHtcclxuICAgICAgICBsZXQgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXSA9IFsnScWhxI1pJywgJ1ZzaScsICdJemJlcmkgcHJpa2F6YW5lJywgJ2l6YnJhbmloJ107XHJcbiAgICAgICAgaWYgKCFnbG9iYWwuaXNFbXB0eSh0aGlzLl9jYXB0aW9uKSkge1xyXG4gICAgICAgICAgICBfdGVybWlub2xvZ3kgPSBbJ0nFocSNaScsICdWc2knLCAnSXpiZXJpIHByaWthemFuZScsICdpemJyYW5paCcsIHRoaXMuX2NhcHRpb25dO1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QoX3Rlcm1pbm9sb2d5KTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRGl2KGVsZW1ldDphbnkpe1xyXG4gICAgICAgIHRoaXMubXNDb250YWluZXIgPSAkKGVsZW1ldC4kY29udGFpbmVyKTtcclxuICAgICAgICB0aGlzLm1zQnV0dG9uID0gJChlbGVtZXQuJGJ1dHRvbik7XHJcbiAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsID0gdGhpcy5tc0NvbnRhaW5lci5maW5kKFwiI2NvbnRhaW5lckxhYmVsXCIpO1xyXG4gICAgICAgIHRoaXMubXNQb3B1cENvbnRhaW5lciA9ICQoZWxlbWV0LiRwb3B1cENvbnRhaW5lcik7XHJcbiAgICAgICAgLy90aGlzLnNlbGVjdGVkQ0IgPSBlbGVtZXQuJHNlbGVjdDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDQi52YWwoKS5sZW5ndGgpe1xyXG4gICAgICAgICAgICB0aGlzLnNldE1zRmxvYXRpbmdMYWJlbChmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRNc0Zsb2F0aW5nTGFiZWwodHJ1ZSk7XHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TXNGbG9hdGluZ0xhYmVsKGlzRW1wcnk6Ym9vbGVhbil7XHJcbiAgICAgICAgaWYgKGlzRW1wcnkpe1xyXG4gICAgICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwuYWRkQ2xhc3MoJ21zLWZsb2F0LWxhYmVsLWVtcHR5Jyk7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5yZW1vdmVDbGFzcygnbXMtZmxvYXQtbGFiZWwtc2VsZWN0ZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwucmVtb3ZlQ2xhc3MoJ21zLWZsb2F0LWxhYmVsLWVtcHR5Jyk7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5hZGRDbGFzcygnbXMtZmxvYXQtbGFiZWwtc2VsZWN0ZWQnKTsgICAgICAgICAgICBcclxuICAgICAgICB9ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBvbkluaXRpYWxpemVkQ29udHJvbChlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0Lm9uSW5pdGlhbGl6ZWRDb250cm9sXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENCLmhhc0NsYXNzKFwiaW5wdXQtdmFsaWRhdGlvbi1lcnJvclwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLm1zQnV0dG9uLmFkZENsYXNzKFwic2FvcC1lcnJvci1pbnB1dFwiKTtcclxuICAgICAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsLmFkZENsYXNzKFwic2FvcC1lcnJvci1pbnB1dC10ZXh0XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZG9kYW1vIHN0aWNreSBjc3MgemEgcHJ2aSBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5hZGRTdGlja3lDbGFzcygpO1xyXG5cclxuICAgICAgICB0aGlzLmFmdGVySW5pdGlhbGl6ZWRDb250cm9sKGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFN0aWNreUNsYXNzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3QuYWRkU3RpY2t5Q2xhc3NcIik7XHJcblxyXG4gICAgICAgIGxldCBzZXpuYW0gPSB0aGlzLm1zQ29udGFpbmVyLmZpbmQoXCJidXR0b24ubXVsdGlzZWxlY3Qtb3B0aW9uLmRyb3Bkb3duLWl0ZW1cIikuZWFjaChmdW5jdGlvbiAoaW5kZXg6IG51bWJlciwgZWxlbTogYW55KSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RJdGVtID0gJChlbGVtKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdEl0ZW0udGV4dCgpID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RJdGVtLmFkZENsYXNzKFwic2FvcC1tdWx0aXNlbGVjdC1pdGVtLXN0aWNreVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQodGFyZ2V0OiBzdHJpbmcgPSBcIlwiLCBjYXB0aW9uID0gXCJcIiApe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3QuaW5pdFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2FwdGlvbiA9IGNhcHRpb247XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHByZXZvZGUgKHR1ZGkgemEgdGhpcy5fY2FwdGlvbilcclxuICAgICAgICB0aGlzLnNldFRlcm1pbm9sb2d5TGlzdCgpO1xyXG5cclxuICAgICAgICBpZiAoZ2xvYmFsLmlzRW1wdHkodGFyZ2V0KSkge3RhcmdldCA9IFwiLnNhb3AtbXVsdGlzZWxlY3RcIjt9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQiA9ICQodGFyZ2V0KTtcclxuXHJcbiAgICAgICAgLy8gYWxpIGltYSBzZWxlY3RlZENCIGRhdGEtY2FwdGlvblxyXG4gICAgICAgIGxldCBzZWxlY3RDYXB0aW9uID0gXCJcIjtcclxuICAgICAgICBpZiAoIWdsb2JhbC5pc0VtcHR5KHRoaXMuX2NhcHRpb24pKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdENhcHRpb24gPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKHRoaXMuX2NhcHRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZGF0YUNhcHRpb24gPSB0aGlzLnNlbGVjdGVkQ0IuYXR0cihcImRhdGEtY2FwdGlvblwiKTtcclxuICAgICAgICBpZiAoIWdsb2JhbC5pc0VtcHR5KGRhdGFDYXB0aW9uKSkge1xyXG4gICAgICAgICAgICBzZWxlY3RDYXB0aW9uID0gZGF0YUNhcHRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAkKHRhcmdldCkubXVsdGlzZWxlY3Qoe1xyXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IDM1MCwgIFxyXG4gICAgICAgICAgICBlbmFibGVGaWx0ZXJpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIGluY2x1ZGVTZWxlY3RBbGxPcHRpb246IHRydWUsXHJcbiAgICAgICAgICAgIGVuYWJsZUNhc2VJbnNlbnNpdGl2ZUZpbHRlcmluZzogdHJ1ZSxcclxuICAgICAgICAgICAgZW5hYmxlRnVsbFZhbHVlRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgZmlsdGVyUGxhY2Vob2xkZXI6IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJJxaHEjWlcIiksXHJcbiAgICAgICAgICAgIG5vblNlbGVjdGVkVGV4dDogJycsXHJcbiAgICAgICAgICAgIGFsbFNlbGVjdGVkVGV4dDp0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiVnNpXCIpLFxyXG4gICAgICAgICAgICBzZWxlY3RBbGxUZXh0OnRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJJemJlcmkgcHJpa2F6YW5lXCIpLFxyXG4gICAgICAgICAgICBuU2VsZWN0ZWRUZXh0OnRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJpemJyYW5paFwiKSxcclxuICAgICAgICAgICAgaW5jbHVkZUZpbHRlckNsZWFyQnRuOiB0cnVlLFxyXG4gICAgICAgICAgICBkaXNhYmxlSWZFbXB0eTogZmFsc2UsXHJcbiAgICAgICAgICAgIG51bWJlckRpc3BsYXllZDogMixcclxuICAgICAgICAgICAgYnV0dG9uV2lkdGg6ICcyMDBweCcsXHJcbiAgICAgICAgICAgIGJ1dHRvbkNsYXNzIDonc2FvcC1jb250cm9sIGZvcm0tY29udHJvbCBzaGFkb3ctbm9uZSBtcy1pbWFnZS1kb3duIHByLTAnLFxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXI6ICc8ZGl2IGlkPVwic2VsZWN0ZWQtcGFyZW50cy1jb250YWluZXJcIj48bGFiZWwgaWQgPVwiY29udGFpbmVyTGFiZWxcIiBjbGFzcz1cIm1zLWZsb2F0LWxhYmVsIG1zLWZsb2F0LWxhYmVsLXNlbGVjdGVkIHNhb3AtdHh0LTdcIiBmb3I9XCJOYW1lXCI+JytzZWxlY3RDYXB0aW9uKyc8L2xhYmVsPjwvZGl2PicsXHJcbiAgICAgICAgICAgIG9uU2VsZWN0QWxsOiBmdW5jdGlvbiAoc2VsZWN0ZWRPcHRpb25zOiBKUXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmJpbmREaXYodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlclNlbGVjdEFsbChzZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCh0aGlzLiRzZWxlY3QpO1xyXG4gICAgICAgICAgICB9LCAgICAgICAgXHJcbiAgICAgICAgICAgIG9uRGVzZWxlY3RBbGw6IGZ1bmN0aW9uKHNlbGVjdGVkT3B0aW9uczpKUXVlcnkpe1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyRGVzZWxlY3RBbGwoc2VsZWN0ZWRPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQodGhpcy4kc2VsZWN0KTtcclxuICAgICAgICAgICAgfSwgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKG9wdGlvbjogSlF1ZXJ5LCBjaGVja2VkOiBib29sZWFuKXtcclxuICAgICAgICAgICAgICAgIF90aGlzLmJpbmREaXYodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckNoYW5nZShvcHRpb24sIGNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCh0aGlzLiRzZWxlY3QpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkluaXRpYWxpemVkOiBmdW5jdGlvbiAoJHNlbGVjdCwgJGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX211bHRpU2VsZWN0T2JqZWN0ID0gdGhpcztcclxuICAgICAgICAgICAgICAgIF90aGlzLmJpbmREaXYodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkluaXRpYWxpemVkQ29udHJvbCh0aGlzKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVtcGxhdGVzOiB7XHJcbiAgICAgICAgICAgICAgICBidXR0b246IHRoaXMuX29wdGlvbnMudGVtcGxhdGVzQnV0dG9uLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyOiAnPGxpIGNsYXNzPVwibXVsdGlzZWxlY3QtaXRlbSBtdWx0aXNlbGVjdC1maWx0ZXJcIj48ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgbWItM1wiPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBtdWx0aXNlbGVjdC1zZWFyY2hcIiB0eXBlPVwidGV4dFwiIC8+PGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIj48c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHQgc2FvcC1pbWctc2VhcmNoIHNpLXhzXCI+PC9zcGFuPjwvZGl2PjwvZGl2PjwvbGk+JyxcclxuICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLm11bHRpc2VsZWN0KCdzZWxlY3RBbGwnLCBmYWxzZSwgdHJ1ZSlcclxuICAgICAgICAubXVsdGlzZWxlY3QoJ3VwZGF0ZUJ1dHRvblRleHQnKTtcclxuICAgICAgICA7ICBcclxuICAgIH1cclxuXHJcbiAgICByZWJ1aWxkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgncmVidWlsZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyU2VsZWN0QWxsKHNlbGVjdGVkT3B0aW9uczogSlF1ZXJ5KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyRGVzZWxlY3RBbGwoc2VsZWN0ZWRPcHRpb25zOkpRdWVyeSl7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyQ2hhbmdlKG9wdGlvbjogSlF1ZXJ5LCBjaGVja2VkOiBib29sZWFuKXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJDaGFuZ2VDb21tb25FdmVudChlbGVtZW50OmFueSl7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFmdGVySW5pdGlhbGl6ZWRDb250cm9sKGVsZW1lbnQ6IGFueSl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNdWx0aXNlbGVjdC5hZnRlckluaXRpYWxpemVkQ29udHJvbFwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzZWxlY3RWYWx1ZXMgdnJlZG5vc3RpXHJcbiAgICBzZXRTZWxlY3RWYWx1ZXMoc2VsZWN0VmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIC8vIG9kem5hY2ltbyB2c2UgemFwb3NsZW5lXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdkZXNlbGVjdEFsbCcpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0VmFsdWVzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gb3puYWNpbW8gaXpicmFuZVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ3NlbGVjdCcsIHNlbGVjdFZhbHVlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgncmVmcmVzaCcpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbXVsdGlTZWxlY3RPYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmJpbmREaXYodGhpcy5fbXVsdGlTZWxlY3RPYmplY3QpO1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyQ2hhbmdlQ29tbW9uRXZlbnQodGhpcy5fbXVsdGlTZWxlY3RPYmplY3QuJHNlbGVjdCk7XHJcbiAgICAgICAgfSBcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckh0bWxPcHRpb25zKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQlxyXG4gICAgICAgICAgICAuZmluZCgnb3B0aW9uJylcclxuICAgICAgICAgICAgLnJlbW92ZSgpXHJcbiAgICAgICAgICAgIC5lbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoSHRtbE9wdGlvbnMob3B0aW9uTGlzdDogU2VsZWN0T3B0aW9uW10sIHNlbGVjdEFsbDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5jbGVhckh0bWxPcHRpb25zKCk7XHJcbiAgICAgICAgaWYgKG9wdGlvbkxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvcHRpb25MaXN0LmZvckVhY2goZWxlbWVudCA9PiBfdGhpcy5zZWxlY3RlZENCLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT1cIicgKyBlbGVtZW50LnZhbHVlICsgJ1wiPicgKyBlbGVtZW50LnRleHQgKyAnPC9vcHRpb24+JykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlYnVpbGQoKTtcclxuICAgICAgICB0aGlzLmFkZFN0aWNreUNsYXNzKCk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RBbGwpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdzZWxlY3RBbGwnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ0IudmFsKCkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldE1zRmxvYXRpbmdMYWJlbChmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldE1zRmxvYXRpbmdMYWJlbCh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBTYW9wUGluY2hab29tIH0gZnJvbSBcIi4uL0NvbXBvbmVudHMvc2FvcC1waW5jaC1hbmQtem9vbVwiO1xyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBkZlByZXZpZXcge1xyXG4gICAgcHJpdmF0ZSBfcGRmanNMaWI6YW55O1xyXG4gICAgcHJpdmF0ZSBfY2FudmFzOmFueTtcclxuICAgIHByaXZhdGUgX3ZpZXdlcjphbnk7XHJcbiAgICBwcml2YXRlIF9wZGY6YW55O1xyXG4gICAgcHJpdmF0ZSBfc2NhbGUgPSAxO1xyXG4gICAgLy9cclxuICAgIHByaXZhdGUgX2RvY3VtZW50SWQ6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfdXJsOnN0cmluZztcclxuICAgIHByaXZhdGUgX2ZpbGVOYW1lOnN0cmluZztcclxuICAgIHByaXZhdGUgX2Jhc2U2NDpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF90eXBlOnN0cmluZztcclxuICAgIHByaXZhdGUgX3Nhb3BQaW5jaFpvb206U2FvcFBpbmNoWm9vbTtcclxuXHJcbiAgICBsb2FkcGRmanNMaWIocGRmanNMaWI6YW55KTp2b2lke1xyXG4gICAgICAgIHRoaXMuX3BkZmpzTGliID0gcGRmanNMaWI7XHJcbiAgICAgICAgdGhpcy5fc2FvcFBpbmNoWm9vbSA9ICBuZXcgU2FvcFBpbmNoWm9vbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclBhZ2UocGFnZU51bWJlcjphbnksIGNhbnZhczphbnkpOnZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fcGRmLmdldFBhZ2UocGFnZU51bWJlcikudGhlbihmdW5jdGlvbihwYWdlOmFueSkge1xyXG4gICAgICAgIF90aGlzLl92aWV3ZXIgPSBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IF90aGlzLl9zY2FsZSB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vICAgbGV0IF92aWV3ZXJPZmZzZXQgPSAkKCcucGRmLXZpZXdlci1pbm5lcicpLm9mZnNldCgpO1xyXG4gICAgICAgICAgICAvLyAgIGxldCBfdyA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAtIF92aWV3ZXJPZmZzZXQubGVmdCwgd2luZG93LmlubmVyV2lkdGggLSBfdmlld2VyT2Zmc2V0LmxlZnQgLTI3MiB8fCAwKVxyXG5cclxuICAgICAgICAgICAgLy8gbGV0IF93ID0gJCgnI3BkZi12aWV3ZXInKS53aWR0aCgpO1xyXG4gICAgICAgICAgICAvLyBjYW52YXMuaGVpZ2h0ID0gX3RoaXMuX3ZpZXdlci5oZWlnaHQ7XHJcbiAgICAgICAgICAgIC8vIGNhbnZhcy53aWR0aCA9IF93IC0gMTA7XHJcbiAgICAgICAgICAgIGxldCBfdyA9IChfdGhpcy5fdmlld2VyLndpZHRoIGFzIHN0cmluZykrJ3B4J1xyXG4gICAgICAgICAgICAkKCcuc2FvcC1jb2wtdmlldycpLmNzcygnbWluLXdpZHRoJywgX3cpO1xyXG5cclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IF90aGlzLl92aWV3ZXIuaGVpZ2h0IC0gMTA7XHJcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IF90aGlzLl92aWV3ZXIud2lkdGggLSAxMDsgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICBwYWdlLnJlbmRlcih7Y2FudmFzQ29udGV4dDogY2FudmFzLmdldENvbnRleHQoJzJkJyksIHZpZXdwb3J0OiBfdGhpcy5fdmlld2VyfSkucHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1BhZ2UgcmVuZGVyaW5nIGNvbXBsZXRlLicpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3Nhb3BQaW5jaFpvb20uaW5pdChcInBkZi12aWV3ZXJcIik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBzZXREZWZhdWx0U2NhbGUoc2NhbGU6bnVtYmVyKTp2b2lke1xyXG4gICAgICAgIHRoaXMuX3Nhb3BQaW5jaFpvb20uc2V0RGVmYXVsdFNjYWxlKHNjYWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0OnN0cmluZyk6YW55e1xyXG4gICAgICAgIHZhciByYXcgPSBhdG9iKGJhc2U2NCk7XHJcbiAgICAgICAgdmFyIHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShyYXcubGVuZ3RoKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB1aW50OEFycmF5W2ldID0gcmF3LmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1aW50OEFycmF5O1xyXG4gICAgfSAgIFxyXG5cclxuICAgIGxvYWRpbmdQZGZUYXNrKGxvYWRpbmdUYXNrOmFueSk6dm9pZHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxvYWRpbmdUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbihwZGY6YW55KSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9wZGYgPSBwZGY7XHJcbiAgICAgICAgICAgIF90aGlzLl92aWV3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGRmLXZpZXdlcicpO1xyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3IobGV0IHBhZ2UgPSAxOyBwYWdlIDw9IHBkZi5udW1QYWdlczsgcGFnZSsrKSB7XHJcbiAgICAgICAgICAgICAgICBcclxuIFxyXG4gICAgICAgICAgICAgIF90aGlzLl9jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpOyAgICBcclxuICAgICAgICAgICAgICBfdGhpcy5fY2FudmFzLmNsYXNzTmFtZSA9ICdwZGYtcGFnZS1jYW52YXMnOyBcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICBsZXQgX3JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgICAgX3Jvdy5jbGFzc05hbWUgPSAncm93IG0tMCBwLTAnOyBcclxuXHJcbiAgICAgICAgICAgICAgbGV0IF9jb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICAgIF9jb2wuY2xhc3NOYW1lID0gJ2NvbCBtLTAgcC0wIHNhb3AtY29sLXZpZXcnOyBcclxuXHJcbiAgICAgICAgICAgICAgX2NvbC5hcHBlbmRDaGlsZChfdGhpcy5fY2FudmFzKTsgXHJcblxyXG4gICAgICAgICAgICAgIF9yb3cuYXBwZW5kQ2hpbGQoX2NvbCk7IFxyXG5cclxuICAgICAgICAgICAgICBfdGhpcy5fdmlld2VyLmFwcGVuZENoaWxkKF9yb3cpO1xyXG4gICAgICAgICAgICAgIF90aGlzLnJlbmRlclBhZ2UocGFnZSwgX3RoaXMuX2NhbnZhcyk7XHJcbiAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAvL25ldyBTYW9wUGluY2hab29tKCkuaW5pdChcInBkZi12aWV3ZXJcIik7XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIF90aGlzLl9zYW9wUGluY2hab29tLmluaXQoXCJwZGYtdmlld2VyXCIpO1xyXG4gICAgICAgICAgICAvLyAkKCcucGRmLXBhZ2UtY2FudmFzJykuYXR0cihcIm9ubG9hZFwiLFwic2FvcFBkZlByZXZpZXcuc2V0RGVmYXVsdFNjYWxlKDAuNik7XCIpO1xyXG4gICAgICAgICAgICAvLyAkKCdkaXZbb25sb2FkXScpLnRyaWdnZXIoJ29ubG9hZCcpO1xyXG4gICAgICAgIH0pOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsZU5hbWVCeVVybCh1cmw6c3RyaW5nKTp2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiSEVBRFwiLFxyXG4gICAgICAgICAgICB1cmw6IHVybCwgICAgICAgICBcclxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24obWVzc2FnZSwgdGV4dCwgcmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3R5cGUgPSByZXNwb25zZS5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1UeXBlJyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5kb2N1bWVudFJlbmRlcigpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pOyAgIFxyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbGVDb250ZW50QnlVcmwodXJsOnN0cmluZyk6dm9pZCB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICB1cmw6IHVybCwgICAgICAgICBcclxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24obWVzc2FnZSwgdGV4dCwgcmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAgICAgbGV0IF9jb250YWluZXIgPSAkKCc8ZGl2IGNsYXNzPVwicGRmLXZpZXctY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjEwMCU7b3ZlcmZsb3cteTogYXV0bztcIj48L2Rpdj4nKTtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXIuaHRtbChyZXNwb25zZS5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lci5hcHBlbmQoX2NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAkKCcjcGRmLXZpZXdlcicpLmFwcGVuZChfY29udGFpbmVyKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTsgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbmRlckVycm9yRGl2KCk6dm9pZHtcclxuICAgICAgICAvLyQoJyNwZGYtdmlld2VyJykuaHRtbCgnPGRpdj5OaSBkb2t1bWVudG92IHphIHByaWthejwvZGl2PicpO1xyXG4gICAgfVxyXG5cclxuICAgIGRvY3VtZW50UHJldmlldygpOnZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJFcnJvckRpdigpO1xyXG4gICAgICAgIHRoaXMuX2RvY3VtZW50SWQgPSAkKFwiI215TW9kZWxfRG9jdW1lbnRJZFwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICAgICAgdGhpcy5fdXJsID0gJChcIiNteU1vZGVsX0ZpbGVVcmxcIikudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuX2ZpbGVOYW1lID0gJChcIiNteU1vZGVsX0ZpbGVOYW1lXCIpLnZhbCgpIGFzIHN0cmluZztcclxuICAgICAgICB0aGlzLl9iYXNlNjQgPSAkKFwiI215TW9kZWxfQmFzZTY0U3RyaW5nXCIpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgbGV0IF93ID0gc2NyZWVuLndpZHRoO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdXJsLmxlbmd0aCA+IDAgJiYgdGhpcy5fZmlsZU5hbWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRGaWxlTmFtZUJ5VXJsKHRoaXMuX3VybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fYmFzZTY0Lmxlbmd0aCA9PSAwKSB7cmV0dXJuO31cclxuXHJcbiAgICAgICAgbGV0IF9maWxlRXh0ZW5zaW9uID0gdGhpcy5fZmlsZU5hbWUuc3BsaXQoJy4nKS5wb3AoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICBpZiAoX2ZpbGVFeHRlbnNpb24ubGVuZ3RoID09IDApIHtyZXR1cm47fVxyXG5cclxuICAgICAgICB0aGlzLl90eXBlID0gXCJpbWFnZS9wbmdcIjtcclxuICAgICAgICBpZiAoX2ZpbGVFeHRlbnNpb24udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAncGRmJyl7XHJcbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSBcImFwcGxpY2F0aW9uL3BkZlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSBcImltYWdlL1wiK19maWxlRXh0ZW5zaW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFJlbmRlcigpO1xyXG5cclxuICAgIH0gICAgXHJcblxyXG4gICAgZG9jdW1lbnRSZW5kZXIoKTp2b2lkIHtcclxuICAgICAgIGxldCBfdyA9IHNjcmVlbi53aWR0aDtcclxuXHJcbiAgICAgICAgaWYoX3cgPD0gODAwICYmIHRoaXMuX3R5cGUuaW5jbHVkZXMoXCJwZGZcIikgPT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVBkZk5vZGVzKCk7XHJcbiAgICAgICAgICAgIGxldCBsb2FkaW5nVGFzazphbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9iYXNlNjQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IF9hcnJheSA9IHRoaXMuYmFzZTY0VG9VaW50OEFycmF5KHRoaXMuX2Jhc2U2NCk7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nVGFzayA9IHRoaXMuX3BkZmpzTGliLmdldERvY3VtZW50KF9hcnJheSk7ICAgXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nVGFzayA9IHRoaXMuX3BkZmpzTGliLmdldERvY3VtZW50KHRoaXMuX3VybCk7IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1BkZlRhc2sobG9hZGluZ1Rhc2spO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdHlwZS5pbmNsdWRlcyhcInRleHQvaHRtbFwiKSkgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmdldEZpbGVDb250ZW50QnlVcmwodGhpcy5fdXJsKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9iYXNlNjQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgJCgnI3BkZi12aWV3ZXInKS5odG1sKCc8ZW1iZWQgU3JjPVwiZGF0YTonK3RoaXMuX3R5cGUrJztiYXNlNjQsJyt0aGlzLl9iYXNlNjQrJ1wiIGNsYXNzPVwibXgtYXV0byBkLWZsZXggaC0xMDAgdy0xMDBcIiB0eXBlPVwiJyt0aGlzLl90eXBlKydcIj48L2VtYmVkPicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJCgnI3BkZi12aWV3ZXInKS5odG1sKCc8ZW1iZWQgU3JjPVwiJyt0aGlzLl91cmwrJ1wiIGNsYXNzPVwibXgtYXV0byBkLWZsZXggaC0xMDAgdy0xMDBcIiB0eXBlPVwiJyt0aGlzLl90eXBlKydcIlwiPjwvZW1iZWQ+Jyk7ICAgICAgICBcclxuICAgICAgICAgICAgfSAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHByaXZhdGUgcHJlcGFyZVBkZk5vZGVzKCk6dm9pZHtcclxuICAgICAgICBsZXQgX3BhcmVudCA9ICQoJyNwZGYtdmlld2VyJykucGFyZW50KCk7XHJcblxyXG4gICAgICAgIGxldCBfbWFpbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgX21haW4uY2xhc3NOYW1lID0gJ3BkZi12aWV3ZXItbWFpbic7IFxyXG5cclxuICAgICAgICBsZXQgX2lubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBfaW5uZXIuY2xhc3NOYW1lID0gJ3BkZi12aWV3ZXItaW5uZXInO1xyXG5cclxuICAgICAgICBsZXQgX3ZpZXdlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgX3ZpZXdlci5pZCA9ICdwZGYtdmlld2VyJzsgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgX2lubmVyLmFwcGVuZENoaWxkKF92aWV3ZXIpO1xyXG5cclxuICAgICAgICBfbWFpbi5hcHBlbmRDaGlsZChfaW5uZXIpO1xyXG5cclxuICAgICAgICBfcGFyZW50Lmh0bWwoX21haW4pOyAgXHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9hZEJhc2U2NFBkZigpOnZvaWR7XHJcbiAgICAvLyAgICAgbGV0IF9iYXNlNjQgPSAkKFwiI215TW9kZWxfQmFzZTY0U3RyaW5nXCIpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAvLyAgICAgaWYgKF9iYXNlNjQubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICBsZXQgX2ZpbGVOYW1lID0gJChcIiNteU1vZGVsX0ZpbGVOYW1lXCIpLnZhbCgpIGFzIHN0cmluZztcclxuICAgIC8vICAgICAgICAgbGV0IF9maWxlRXh0ZW5zaW9uID0gX2ZpbGVOYW1lLnNwbGl0KCcuJykucG9wKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgIC8vICAgICAgICAgbGV0IF93ID0gc2NyZWVuLndpZHRoO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYoX3cgPD0gODAwICYmIF9maWxlRXh0ZW5zaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJwZGZcIil7XHJcbiAgICAvLyAgICAgICAgICAgICAvL1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5wcmVwYXJlUGRmTm9kZXMoKTtcclxuICAgIC8vICAgICAgICAgICAgIGxldCBfYXJyYXkgPSB0aGlzLmJhc2U2NFRvVWludDhBcnJheShfYmFzZTY0KTtcclxuICAgIC8vICAgICAgICAgICAgIHZhciBsb2FkaW5nVGFzayA9IHRoaXMuX3BkZmpzTGliLmdldERvY3VtZW50KF9hcnJheSk7ICAgXHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmxvYWRpbmdQZGZUYXNrKGxvYWRpbmdUYXNrKTtcclxuICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgIGxldCBfdHlwZSA9IFwiaW1hZ2UvcG5nXCI7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoX2ZpbGVFeHRlbnNpb24udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAncGRmJyl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgX3R5cGUgPSBcImFwcGxpY2F0aW9uL3BkZlwiO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBfdHlwZSA9IFwiaW1hZ2UvXCIrX2ZpbGVFeHRlbnNpb247XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgJCgnI3BkZi12aWV3ZXInKS5odG1sKCc8ZW1iZWQgU3JjPVwiZGF0YTonK190eXBlKyc7YmFzZTY0LCcrX2Jhc2U2NCsnXCIgY2xhc3M9XCJteC1hdXRvIGQtZmxleCBoLTEwMCB3LTEwMFwiIHR5cGU9XCInK190eXBlKydcIj48L2VtYmVkPicpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vXHJcbiAgXHJcblxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9oYW1tZXJqcy9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQaW5jaFpvb20ge1xyXG5cdHByaXZhdGUgX2luaXRpYWxpemVkOmJvb2xlYW4gPSBmYWxzZTtcclxuXHQvLyBwcml2YXRlIF9kZWZhdWx0U2V0ID0ge3g6IC02MCwgeTogLTUzLHo6IDAuNn07XHJcblx0cHJpdmF0ZSBfZGVmYXVsdFNldCA9IHt4OiAwLCB5OiAwLHo6IDAuNn07XHJcblx0cHJpdmF0ZSBfZWxlbWVudCA6YW55O1xyXG5cdHByaXZhdGUgX2hhbW1lcnRpbWUgOmFueTtcclxuXHJcblx0cHJpdmF0ZSBfZml4SGFtbWVyanNEZWx0YUlzc3VlIDphbnk7XHJcblx0cHJpdmF0ZSBfcGluY2hTdGFydCA6YW55O1xyXG5cdHByaXZhdGUgX2xhc3RFdmVudCA6YW55O1xyXG5cdFxyXG5cdHByaXZhdGUgX29yaWdpbmFsU2l6ZSA6YW55O1x0XHJcblx0cHJpdmF0ZSBfY3VycmVudCA6YW55O1xyXG5cdHByaXZhdGUgX2xhc3QgOmFueTtcdFxyXG5cdHByaXZhdGUgX3BpbmNoWm9vbU9yaWdpbiA6YW55O1xyXG5cdFxyXG5cdC8vXHJcblx0XHJcblx0c2xlZXAobWlsbGlzZWNvbmRzOm51bWJlcik6dm9pZCB7XHJcblx0XHRjb25zdCBkYXRlID0gRGF0ZS5ub3coKTtcclxuXHRcdGxldCBjdXJyZW50RGF0ZSA9IG51bGw7XHJcblx0XHRkbyB7XHJcblx0XHRcdGN1cnJlbnREYXRlID0gRGF0ZS5ub3coKTtcclxuXHRcdH0gd2hpbGUgKGN1cnJlbnREYXRlIC0gZGF0ZSA8IG1pbGxpc2Vjb25kcyk7XHJcblx0fVxyXG5cclxuXHRpbml0KGlkOnN0cmluZyl7XHJcblx0XHRjb25zb2xlLmxvZyhcImluaXQuLi5cIik7XHJcblx0XHR0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cclxuXHRcdC8vIGxldCBfdyA9ICQoIHdpbmRvdyApLndpZHRoKCk7Ly90aGlzLl9lbGVtZW50Lm9mZnNldFdpZHRoO1xyXG5cdFx0Ly8gLy9sZXQgX3BkZlcgPSBwYXJzZUludCgkKFwiLnBkZi1wYWdlLWNhbnZhc1wiKS53aWR0aCgpKSkgKiAwLjY7XHJcblx0XHQvLyBsZXQgX3BkZlcgPSAkKFwiLnBkZi1wYWdlLWNhbnZhc1wiKS53aWR0aCgpICogMC42O1xyXG5cdFx0Ly8gdGhpcy5fZGVmYXVsdFNldC54ID0gKCBfdyAtIF9wZGZXKSAvIDI7XHJcblx0XHQvL1xyXG5cclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUgPSBuZXcgSGFtbWVyKHRoaXMuX2VsZW1lbnQsIHt9KTtcdFx0XHJcblx0XHRcclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUuZ2V0KCdwaW5jaCcpLnNldCh7IGVuYWJsZTogdHJ1ZSB9KTtcclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUuZ2V0KCdwYW4nKS5zZXQoeyB0aHJlc2hvbGQ6IDAgfSk7XHJcblxyXG4gICAgXHR0aGlzLl9waW5jaFN0YXJ0ID0geyB4OiAwLCB5OiAwIH07XHJcblxyXG5cdFx0dGhpcy5fb3JpZ2luYWxTaXplID0ge3dpZHRoOiAyMDAsIGhlaWdodDogMzAwfTtcdFxyXG5cdFx0dGhpcy5fY3VycmVudCA9IHt4OiAwLCB5OiAwLCB6OiAwLCB6b29taW5nOiBmYWxzZSwgd2lkdGg6IHRoaXMuX29yaWdpbmFsU2l6ZS53aWR0aCAqIDEsIGhlaWdodDogdGhpcy5fb3JpZ2luYWxTaXplLmhlaWdodCAqIDF9O1x0XHJcblx0XHR0aGlzLl9sYXN0ID0ge3g6IHRoaXMuX2N1cnJlbnQueCwgeTp0aGlzLl9jdXJyZW50LnksIHo6dGhpcy5fY3VycmVudC56fVx0XHRcclxuXHJcblx0XHR0aGlzLmluaXRFdmVudHMoKTtcclxuXHJcblx0XHR0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcblx0XHRcclxuXHRcdHRoaXMuc2V0RGVmYXVsdFNjYWxlKHRoaXMuX2RlZmF1bHRTZXQueik7XHJcblx0fVxyXG5cclxuXHRzZXREZWZhdWx0U2NhbGUoc2NhbGU6bnVtYmVyKSB7XHJcblx0XHRjb25zb2xlLmxvZyhcInNjYWxlOlwiK3NjYWxlLnRvU3RyaW5nKCkpO1xyXG5cdFx0aWYgKHRoaXMuX2luaXRpYWxpemVkID09IGZhbHNlKSB7cmV0dXJuOyB9O1xyXG5cdFx0Ly90aGlzLnNsZWVwKDUwMCk7XHJcblxyXG5cdFx0bGV0IF90aGlzID0gdGhpcztcclxuXHRcdC8vXHJcblx0XHR0aGlzLl9kZWZhdWx0U2V0LnogPSBzY2FsZTtcclxuXHRcdC8vXHJcblx0XHR0aGlzLl9jdXJyZW50ID0ge3g6IDAsIHk6IDAsIHo6IHRoaXMuX2RlZmF1bHRTZXQueiwgem9vbWluZzogZmFsc2UsIHdpZHRoOiB0aGlzLl9vcmlnaW5hbFNpemUud2lkdGggKiAxLCBoZWlnaHQ6IHRoaXMuX29yaWdpbmFsU2l6ZS5oZWlnaHQgKiAxfTtcdFxyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHRcdC8vXHJcblx0XHRsZXQgX3NjcmVlbldpZHRoID0gJCggd2luZG93ICkud2lkdGgoKTtcclxuICAgIFx0bGV0IF9wZGZXaWR0aCA9IHBhcnNlSW50KCQoXCIucGRmLXBhZ2UtY2FudmFzXCIpLmF0dHIoXCJ3aWR0aFwiKSk7XHJcblx0XHRfcGRmV2lkdGggPSBfcGRmV2lkdGggKiB0aGlzLl9kZWZhdWx0U2V0Lno7XHJcblx0XHRsZXQgX2xlZnRDYW52YXMgPSAoX3NjcmVlbldpZHRoIC0gKF9zY3JlZW5XaWR0aCAqIHRoaXMuX2RlZmF1bHRTZXQueikpIC8gMjtcclxuXHRcdGxldCBfZGlmZkxlZnQgPSAoX3NjcmVlbldpZHRoIC0gX3BkZldpZHRoKSAvIDI7XHJcblx0XHR0aGlzLl9kZWZhdWx0U2V0LnggPSAoX2xlZnRDYW52YXMgLSBfZGlmZkxlZnQgKyA1KSAqICgtMSk7XHJcblx0XHQvLyAvL1xyXG5cdFx0bGV0IF9wZGZEb2NIZWlnaHQgPSAkKFwiI2RvY3VtZW50LXByZXZpZXdcIikuaGVpZ2h0KCk7XHJcblx0XHRpZiAoX3BkZkRvY0hlaWdodCA8PSAwICkge1xyXG5cdFx0XHRfcGRmRG9jSGVpZ2h0ID0gMjgwO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5fZGVmYXVsdFNldC55ID0gKChfcGRmRG9jSGVpZ2h0IC0gKF9wZGZEb2NIZWlnaHQgKiB0aGlzLl9kZWZhdWx0U2V0LnopKS8yKSAqICgtMSk7XHRcdFxyXG5cdFx0Ly9cclxuXHRcdFxyXG5cdFx0dGhpcy5fY3VycmVudC54ID0gdGhpcy5fZGVmYXVsdFNldC54XHJcblx0XHR0aGlzLl9jdXJyZW50LnkgPSB0aGlzLl9kZWZhdWx0U2V0Lnk7XHJcblx0XHR0aGlzLl9jdXJyZW50LnogPSB0aGlzLl9kZWZhdWx0U2V0Lno7XHJcblxyXG5cdFx0dGhpcy5fbGFzdC54ID0gdGhpcy5fZGVmYXVsdFNldC54XHJcblx0XHR0aGlzLl9sYXN0LnkgPSB0aGlzLl9kZWZhdWx0U2V0Lnk7XHJcblx0XHR0aGlzLl9sYXN0LnogPSB0aGlzLl9kZWZhdWx0U2V0Lno7XHJcblxyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHR9XHJcblxyXG5cdHVwZGF0ZSgpOnZvaWQge1xyXG5cdCAgdGhpcy5fY3VycmVudC5oZWlnaHQgPSB0aGlzLl9vcmlnaW5hbFNpemUuaGVpZ2h0ICogdGhpcy5fY3VycmVudC56O1xyXG5cdCAgdGhpcy5fY3VycmVudC53aWR0aCA9IHRoaXMuX29yaWdpbmFsU2l6ZS53aWR0aCAqIHRoaXMuX2N1cnJlbnQuejtcclxuXHQgIHRoaXMuX2VsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUzZChcIiArIHRoaXMuX2N1cnJlbnQueCArIFwicHgsIFwiICsgdGhpcy5fY3VycmVudC55ICsgXCJweCwgMCkgc2NhbGUoXCIgKyB0aGlzLl9jdXJyZW50LnogKyBcIilcIjtcclxuXHR9XHJcblxyXG5cdGdldENvb3JkcyhlbGVtOmFueSk6YW55IHsgLy8gY3Jvc3Nicm93c2VyIHZlcnNpb25cclxuXHQgIHZhciBib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuXHQgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcclxuXHQgIHZhciBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuXHJcblx0ICB2YXIgc2Nyb2xsVG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY0VsLnNjcm9sbFRvcCB8fCBib2R5LnNjcm9sbFRvcDtcclxuXHQgIHZhciBzY3JvbGxMZWZ0ID0gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY0VsLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuXHQgIHZhciBjbGllbnRUb3AgPSBkb2NFbC5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMDtcclxuXHQgIHZhciBjbGllbnRMZWZ0ID0gZG9jRWwuY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcclxuXHJcblx0ICB2YXIgdG9wICA9IGJveC50b3AgKyAgc2Nyb2xsVG9wIC0gY2xpZW50VG9wO1xyXG5cdCAgdmFyIGxlZnQgPSBib3gubGVmdCArIHNjcm9sbExlZnQgLSBjbGllbnRMZWZ0O1xyXG5cclxuXHQgIHJldHVybiB7IHg6IE1hdGgucm91bmQobGVmdCksIHk6IE1hdGgucm91bmQodG9wKSB9O1xyXG5cdH1cclxuXHJcblxyXG5cdGdldENvb3JkaW5hdGVTaGlmdER1ZVRvU2NhbGUoc2l6ZTphbnksIHNjYWxlOmFueSk6YW55e1xyXG5cdCAgdmFyIG5ld1dpZHRoID0gc2NhbGUgKiBzaXplLndpZHRoO1xyXG5cdCAgdmFyIG5ld0hlaWdodCA9IHNjYWxlICogc2l6ZS5oZWlnaHQ7XHJcblx0ICB2YXIgZHggPSAobmV3V2lkdGggLSBzaXplLndpZHRoKSAvIDI7XHJcblx0ICB2YXIgZHkgPSAobmV3SGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIC8gMjtcclxuXHQgIHJldHVybiB7XHJcblx0XHR4OiBkeCxcclxuXHRcdHk6IGR5XHJcblx0ICB9O1xyXG5cdH1cclxuXHJcblx0c2NhbGVGcm9tKHpvb21PcmlnaW46YW55LCBjdXJyZW50U2NhbGU6YW55LCBuZXdTY2FsZTphbnkpOmFueSB7XHJcblx0ICB2YXIgY3VycmVudFNoaWZ0ID0gdGhpcy5nZXRDb29yZGluYXRlU2hpZnREdWVUb1NjYWxlKHRoaXMuX29yaWdpbmFsU2l6ZSwgY3VycmVudFNjYWxlKTtcclxuXHQgIHZhciBuZXdTaGlmdCA9IHRoaXMuZ2V0Q29vcmRpbmF0ZVNoaWZ0RHVlVG9TY2FsZSh0aGlzLl9vcmlnaW5hbFNpemUsIG5ld1NjYWxlKTtcclxuXHJcblx0ICB2YXIgem9vbURpc3RhbmNlID0gbmV3U2NhbGUgLSBjdXJyZW50U2NhbGVcclxuXHQgIFxyXG5cdCAgdmFyIHNoaWZ0ID0ge1xyXG5cdFx0eDogY3VycmVudFNoaWZ0LnggLSBuZXdTaGlmdC54LFxyXG5cdFx0eTogY3VycmVudFNoaWZ0LnkgLSBuZXdTaGlmdC55LFxyXG5cdCAgfVxyXG5cclxuXHQgIHZhciBvdXRwdXQgPSB7XHJcblx0XHR4OiB6b29tT3JpZ2luLnggKiBzaGlmdC54LFxyXG5cdFx0eTogem9vbU9yaWdpbi55ICogc2hpZnQueSxcclxuXHRcdHo6IHpvb21EaXN0YW5jZVxyXG5cdCAgfVxyXG5cdCAgcmV0dXJuIG91dHB1dDtcclxuXHR9XHJcblxyXG5cdGdldFJlbGF0aXZlUG9zaXRpb24oZWxlbWVudDphbnksIHBvaW50OmFueSwgb3JpZ2luYWxTaXplOmFueSwgc2NhbGU6YW55KTphbnkge1xyXG5cdCAgdmFyIGRvbUNvb3JkcyA9IHRoaXMuZ2V0Q29vcmRzKGVsZW1lbnQpO1xyXG5cclxuXHQgIHZhciBlbGVtZW50WCA9IHBvaW50LnggLSBkb21Db29yZHMueDtcclxuXHQgIHZhciBlbGVtZW50WSA9IHBvaW50LnkgLSBkb21Db29yZHMueTtcclxuXHJcblx0ICB2YXIgcmVsYXRpdmVYID0gZWxlbWVudFggLyAob3JpZ2luYWxTaXplLndpZHRoICogc2NhbGUgLyAyKSAtIDE7XHJcblx0ICB2YXIgcmVsYXRpdmVZID0gZWxlbWVudFkgLyAob3JpZ2luYWxTaXplLmhlaWdodCAqIHNjYWxlIC8gMikgLSAxO1xyXG5cdCAgcmV0dXJuIHsgeDogcmVsYXRpdmVYLCB5OiByZWxhdGl2ZVkgfVxyXG5cdH1cclxuXHJcblx0aW5pdEV2ZW50cygpOnZvaWQge1xyXG5cdFx0bGV0IF90aGlzID0gdGhpcztcclxuXHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdwYW5lbmQnLCAoZnVuY3Rpb24oZTphbnkpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coXCJwYW5lbmRcIik7XHJcblx0XHQgIGlmICh0aGlzLl9jdXJyZW50LnNjYWxlICE9IHRoaXMuX2xhc3Quc2NhbGUpIHtcclxuXHRcdCAgXHR0aGlzLl9sYXN0LnggPSB0aGlzLl9jdXJyZW50Lng7XHJcblx0XHQgIH1cclxuXHRcdCAgdGhpcy5fbGFzdC55ID0gdGhpcy5fY3VycmVudC55O1xyXG5cdFx0ICB0aGlzLl9sYXN0RXZlbnQgPSAncGFuZW5kJztcclxuXHRcdH0pLmJpbmQodGhpcykpO1xyXG5cclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUub24oJ3BpbmNoZW5kJywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwicGluY2hlbmRcIik7XHJcblx0XHQgIHRoaXMuX2xhc3QueCA9IHRoaXMuX2N1cnJlbnQueDtcclxuXHRcdCAgdGhpcy5fbGFzdC55ID0gdGhpcy5fY3VycmVudC55O1xyXG5cdFx0ICB0aGlzLl9sYXN0LnogPSB0aGlzLl9jdXJyZW50Lno7XHJcblx0XHQgIHRoaXMuX2xhc3RFdmVudCA9ICdwaW5jaGVuZCc7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTtcdFxyXG5cclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUub24oJ3BpbmNoc3RhcnQnLCAoZnVuY3Rpb24oZTphbnkpIHtcclxuXHRcdCAgdGhpcy5fcGluY2hTdGFydC54ID0gZS5jZW50ZXIueDtcclxuXHRcdCAgdGhpcy5fcGluY2hTdGFydC55ID0gZS5jZW50ZXIueTtcclxuXHRcdCAgdGhpcy5fcGluY2hab29tT3JpZ2luID0gdGhpcy5nZXRSZWxhdGl2ZVBvc2l0aW9uKHRoaXMuX2VsZW1lbnQsIHsgeDogdGhpcy5fcGluY2hTdGFydC54LCB5OiB0aGlzLl9waW5jaFN0YXJ0LnkgfSwgdGhpcy5fb3JpZ2luYWxTaXplLCB0aGlzLl9jdXJyZW50LnopO1xyXG5cdFx0ICB0aGlzLl9sYXN0RXZlbnQgPSAncGluY2hzdGFydCc7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5vbigncGluY2gnLCAoZnVuY3Rpb24oZTphbnkpIHtcclxuXHRcdCAgY29uc29sZS5sb2coXCJwaW5jaFwiKTtcclxuXHRcdCAgdmFyIGQgPSB0aGlzLnNjYWxlRnJvbSh0aGlzLl9waW5jaFpvb21PcmlnaW4sIHRoaXMuX2xhc3QueiwgdGhpcy5fbGFzdC56ICogZS5zY2FsZSlcclxuXHQgICAgICB0aGlzLl9jdXJyZW50LnggPSBkLnggKyB0aGlzLl9sYXN0LnggKyBlLmRlbHRhWDtcclxuXHRcdCAgdGhpcy5fY3VycmVudC55ID0gZC55ICsgdGhpcy5fbGFzdC55ICsgZS5kZWx0YVk7XHJcblx0XHQgIHRoaXMuX2N1cnJlbnQueiA9IGQueiArIHRoaXMuX2xhc3QuejtcclxuXHRcdCAgdGhpcy5fbGFzdEV2ZW50ID0gJ3BpbmNoJztcclxuXHRcdCAgdGhpcy51cGRhdGUoKTtcclxuXHRcdH0pLmJpbmQodGhpcykpO1xyXG5cdFx0XHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdkb3VibGV0YXAnLCAoZnVuY3Rpb24oZTphbnkpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coXCJkb3VibGV0YXBcIik7XHJcblx0XHRcdHRoaXMuc2V0RGVmYXVsdFNjYWxlKHRoaXMuX2RlZmF1bHRTZXQueik7XHJcblxyXG5cdFx0Ly8gICB2YXIgX3RoaXMgPSB0aGlzOyBcclxuXHRcdC8vICAgdmFyIHNjYWxlRmFjdG9yID0gMTtcclxuXHRcdC8vICAgaWYgKHRoaXMuX2N1cnJlbnQuem9vbWluZyA9PT0gZmFsc2UpIHtcclxuXHRcdC8vIFx0dGhpcy5fY3VycmVudC56b29taW5nID0gdHJ1ZTtcclxuXHRcdC8vICAgfSBlbHNlIHtcclxuXHRcdC8vIFx0dGhpcy5fY3VycmVudC56b29taW5nID0gZmFsc2U7XHJcblx0XHQvLyBcdHNjYWxlRmFjdG9yID0gLXNjYWxlRmFjdG9yO1xyXG5cdFx0Ly8gICB9XHJcblxyXG5cdFx0Ly8gICB0aGlzLl9lbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSBcIjAuM3NcIjtcclxuXHRcdC8vICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdC8vIFx0X3RoaXMuX2VsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IFwibm9uZVwiO1xyXG5cdFx0Ly8gICB9LCAzMDApXHJcblxyXG5cdFx0Ly8gICB2YXIgem9vbU9yaWdpbiA9IHRoaXMuZ2V0UmVsYXRpdmVQb3NpdGlvbih0aGlzLl9lbGVtZW50LCB7IHg6IGUuY2VudGVyLngsIHk6IGUuY2VudGVyLnkgfSwgdGhpcy5fb3JpZ2luYWxTaXplLCB0aGlzLl9jdXJyZW50LnopO1xyXG5cdFx0Ly8gICB2YXIgZCA9IHRoaXMuc2NhbGVGcm9tKHpvb21PcmlnaW4sIHRoaXMuX2N1cnJlbnQueiwgdGhpcy5fY3VycmVudC56ICsgc2NhbGVGYWN0b3IpXHJcblx0XHQvLyAgIHRoaXMuX2N1cnJlbnQueCArPSBkLng7XHJcblx0XHQvLyAgIHRoaXMuX2N1cnJlbnQueSArPSBkLnk7XHJcblx0XHQvLyAgIHRoaXMuX2N1cnJlbnQueiArPSBkLno7XHJcblxyXG5cdFx0Ly8gICB0aGlzLl9sYXN0LnggPSB0aGlzLl9jdXJyZW50Lng7XHJcblx0XHQvLyAgIHRoaXMuX2xhc3QueSA9IHRoaXMuX2N1cnJlbnQueTtcclxuXHRcdC8vICAgdGhpcy5fbGFzdC56ID0gdGhpcy5fY3VycmVudC56O1xyXG5cclxuXHRcdC8vICAgdGhpcy51cGRhdGUoKTtcclxuXHRcdH0pLmJpbmQodGhpcykpO1xyXG5cdFx0XHJcblx0XHRcclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUub24oJ3BhbicsIChmdW5jdGlvbihlOmFueSkge1xyXG5cdFx0ICBjb25zb2xlLmxvZyhcInBhblwiKTtcclxuXHRcdCAgaWYgKHRoaXMuX2xhc3RFdmVudCAhPT0gJ3BhbicpIHtcclxuXHRcdFx0dGhpcy5fZml4SGFtbWVyanNEZWx0YUlzc3VlID0ge1xyXG5cdFx0XHQgIHg6IGUuZGVsdGFYLFxyXG5cdFx0XHQgIHk6IGUuZGVsdGFZXHJcblx0XHRcdH07XHJcblx0XHQgIH07XHJcblxyXG5cdFx0ICBpZiAodGhpcy5fY3VycmVudC56ICE9IHRoaXMuX2RlZmF1bHRTZXQueil7XHJcblx0XHRcdHRoaXMuX2N1cnJlbnQueCA9IHRoaXMuX2xhc3QueCArIGUuZGVsdGFYIC0gdGhpcy5fZml4SGFtbWVyanNEZWx0YUlzc3VlLng7XHJcblx0XHQgIH1cclxuXHRcdCAgXHJcblx0XHQgIHRoaXMuX2N1cnJlbnQueSA9IHRoaXMuX2xhc3QueSArIGUuZGVsdGFZIC0gdGhpcy5fZml4SGFtbWVyanNEZWx0YUlzc3VlLnk7XHJcblx0XHQgIHRoaXMuX2xhc3RFdmVudCA9ICdwYW4nO1xyXG5cdFx0ICB0aGlzLnVwZGF0ZSgpO1xyXG5cdFx0fSkuYmluZCh0aGlzKSk7IFxyXG5cdFx0XHJcbiAgICAvLyAgICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuXHQvLyBcdFx0UHJvZ3Jlc3NFdmVudDtcclxuICAgIC8vICAgICAgICBfdGhpcy5zZXREZWZhdWx0U2NhbGUoKTtcclxuICAgIC8vICAgIH0pLnJlc2l6ZSgpO1x0XHRcclxuXHJcblx0fVxyXG5cclxuXHRcclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUG9wb3ZlciB7XHJcbiAgICBwcml2YXRlIF9xdWVyeVNlbGVjdG9yOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IocXVlcnlTZWxlY3Rvcjogc3RyaW5nID0gXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikge1xyXG4gICAgICAgIHRoaXMuX3F1ZXJ5U2VsZWN0b3IgPSBxdWVyeVNlbGVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRQb3BvdmVyRXZlbnRzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5iaW5kUG9wb3ZlckV2ZW50c1wiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAkKFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpLnBvcG92ZXIoe1xyXG4gICAgICAgICAgICBodG1sOiB0cnVlLFxyXG4gICAgICAgICAgICBzYW5pdGl6ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHRyaWdnZXI6ICdjbGljaycsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gJCh0aGlzKS5hdHRyKFwiZGF0YS1wb3BvdmVyLWNvbnRlbnRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJChjb250ZW50KS5jaGlsZHJlbihcIi5wb3BvdmVyLWJvZHlcIikuaHRtbCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoJ2h0bWwnKS5vbignbW91c2V1cCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtb3VzZXVwIVwiKTtcclxuICAgICAgICAgICAgaWYgKCEkKGUudGFyZ2V0KS5jbG9zZXN0KCcucG9wb3ZlcicpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm1vdXNldXAucG9wb3ZlciFcIik7XHJcbiAgICAgICAgICAgICAgICAkKCcucG9wb3ZlcicpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtb3VzZXVwLnBvcG92ZXIuaGlkZSFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8kKHRoaXMucHJldmlvdXNTaWJsaW5nKS5wb3BvdmVyKCdoaWRlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChfdGhpcy5fcXVlcnlTZWxlY3RvcikucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gd2hlbiBwb3BvdmVyJ3MgY29udGVudCBpcyBzaG93blxyXG4gICAgICAgICQoXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikub24oJ3Nob3duLmJzLnBvcG92ZXInLCBmdW5jdGlvbiAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIC8vIHNldCB3aGF0IGhhcHBlbnMgd2hlbiB1c2VyIGNsaWNrcyBvbiB0aGUgYnV0dG9uXHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzZXQhXCIpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuYWZ0ZXJQb3BvdmVyU2hvdyh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICQoXCIucG9wb3ZlckxpbmtcIikub2ZmKCdjbGljaycpO1xyXG4gICAgICAgICAgICAkKFwiLnBvcG92ZXJMaW5rXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJwb3BvdmVyTGluayBjbGlja2VkISEhXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIltkYXRhLXRvZ2dsZT1wb3BvdmVyXVwiKS5wb3BvdmVyKCdoaWRlJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJChcIi5wb3BvdmVyQ2xvc2VcIikub2ZmKCdjbGljaycpO1xyXG4gICAgICAgICAgICAkKFwiLnBvcG92ZXJDbG9zZVwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiQ2xvc2UgcG9wb3ZlciBjbGlja2VkISEhXCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIltkYXRhLXRvZ2dsZT1wb3BvdmVyXVwiKS5wb3BvdmVyKCdoaWRlJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlclBvcG92ZXJTaG93KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BQb3BvdmVyLmFmdGVyUG9wb3ZlclNob3dcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFNlbGZDb250YWluZXJQb3BvdmVyKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5pbml0U2VsZkNvbnRhaW5lclBvcG92ZXJcIik7XHJcblxyXG4gICAgICAgICQodGhpcy5fcXVlcnlTZWxlY3RvcikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCAkZWxlbSA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgIGxldCBlbGVtID0gdGhpcztcclxuICAgICAgICAgICAgJGVsZW0ucG9wb3Zlcih7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IGVsZW0sXHJcbiAgICAgICAgICAgICAgICBzYW5pdGl6ZTogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlUG9wb3ZlcigpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuZW5hYmxlUG9wb3ZlclwiKTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl9xdWVyeVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0ICRlbGVtID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgJGVsZW0ucG9wb3ZlcignZW5hYmxlJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZVBvcG92ZXIoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BQb3BvdmVyLmRpc2FibGVQb3BvdmVyXCIpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3F1ZXJ5U2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgJGVsZW0gPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICAkZWxlbS5wb3BvdmVyKCdkaXNhYmxlJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQb3B1cERpYWxvZ09wdGlvbnMge1xyXG4gICAgdGl0bGU6IHN0cmluZztcclxuICAgIGJvZHk6IHN0cmluZztcclxuICAgIHNob3dDYW5jZWxCdXR0b246IGJvb2xlYW47XHJcbiAgICBjb25maXJtQnV0dG9uQ2FwdGlvbjogc3RyaW5nO1xyXG4gICAgY2FuY2VsQnV0dG9uQ2FwdGlvbjogc3RyaW5nO1xyXG4gICAgY29uZmlybUFjdGlvbjogc3RyaW5nO1xyXG4gICAgY29uZmlybUFjdGlvbmRhdGE6IG9iamVjdDtcclxuICAgIG9uU3VjY2VzczogKHBhcmFtczphbnkpID0+IGFueTtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGl0bGUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuYm9keSA9IFwiYm9keSB0ZXh0XCI7XHJcbiAgICAgICAgdGhpcy5zaG93Q2FuY2VsQnV0dG9uID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNvbmZpcm1CdXR0b25DYXB0aW9uID0gXCJPa1wiO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uQ2FwdGlvbiA9IFwiQ2FuY2VsXCI7XHJcbiAgICAgICAgdGhpcy5jb25maXJtQWN0aW9uID0gXCJcIjtcclxuICAgICAgICB0aGlzLmNvbmZpcm1BY3Rpb25kYXRhID0ge307XHJcbiAgICAgICAgdGhpcy5vblN1Y2Nlc3MgPSBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBvcHVwRGlhbG9nIHtcclxuICAgIHByaXZhdGUgX29wdGlvbnM6U2FvcFBvcHVwRGlhbG9nT3B0aW9ucztcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczpTYW9wUG9wdXBEaWFsb2dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB9ICAgIFxyXG4gICAgXHJcbiAgICBzYXZlKGNhbGxiYWNrOiAobjogbnVtYmVyKSA9PiBhbnkpIDogdm9pZCB7XHJcbiAgICAgICAgY2FsbGJhY2soNDIpO1xyXG4gICAgfVxyXG5cclxuICAgIFNob3dMb2FkaW5nU2FvcCgpIHtcclxuICAgICAgICB2YXIgb2JqID0gJChcIiNzYW9wTG9hZGluZ1wiKTtcclxuICAgICAgICBpZiAob2JqLmxlbmd0aClcclxuICAgICAgICAgICAgb2JqLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICBIaWRlTG9hZGluZ1Nhb3AoKSB7XHJcbiAgICAgICAgdmFyIG9iaiA9ICQoXCIjc2FvcExvYWRpbmdcIik7XHJcbiAgICAgICAgaWYgKG9iai5sZW5ndGgpXHJcbiAgICAgICAgICAgIG9iai5oaWRlKCk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIFNob3dQb3B1cERpYWxvZygpOnZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy8gRGlzcGxheSBpbmZvIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW4gYSBtb2RhbFxyXG4gICAgICAgIGxldCB0aXRsZURpdiA9ICQoJyNpbmZvLW1vZGFsLXRpdGxlLWRpdicpO1xyXG4gICAgICAgIGxldCB0aXRsZUggPSAkKCcjaW5mby1tb2RhbC10aXRsZScpO1xyXG4gICAgICAgIGxldCBjb25maXJtQnV0dG9uID0gJCgnI2luZm8tbW9kYWwtYnRuLW9rJyk7XHJcbiAgICAgICAgbGV0IGNhbmNlbEJ1dHRvbiA9ICQoJyNpbmZvLW1vZGFsLWJ0bi1jYW5jZWwnKTtcclxuXHJcbiAgICAgICAgY2FuY2VsQnV0dG9uLmh0bWwodGhpcy5fb3B0aW9ucy5jYW5jZWxCdXR0b25DYXB0aW9uKTtcclxuXHJcbiAgICAgICAgLy8gc2hvdyBvciBoaWRlIGhlYWRlciBkaXYgYmFzZWQgb24gdGl0bGUgcHJvcGVydHlcclxuICAgICAgICB0aXRsZURpdi5jc3MoXCJkaXNwbGF5XCIsIFwiXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnRpdGxlKSB7XHJcbiAgICAgICAgICAgIHRpdGxlSC5odG1sKHRoaXMuX29wdGlvbnMudGl0bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGl0bGVEaXYuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jb25maXJtQnV0dG9uQ2FwdGlvbil7XHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b24uaHRtbCh0aGlzLl9vcHRpb25zLmNvbmZpcm1CdXR0b25DYXB0aW9uKTtcclxuICAgICAgICAgICAgY29uZmlybUJ1dHRvbi5jc3MoXCJkaXNwbGF5XCIsIFwiXCIpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5zaG93Q2FuY2VsQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi5odG1sKHRoaXMuX29wdGlvbnMuY2FuY2VsQnV0dG9uQ2FwdGlvbik7XHJcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi5jc3MoXCJkaXNwbGF5XCIsIFwiXCIpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICQoJyNpbmZvLW1vZGFsLWJvZHknKS5odG1sKHRoaXMuX29wdGlvbnMuYm9keSk7XHJcblxyXG4gICAgICAgICQoXCIjaW5mby1tb2RhbC1idG4tb2tcIikuY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLnBvcHVwRGlhbG9nQ29uZmlybSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgJCgnI2luZm8tbW9kYWwnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgJChcIiNpbmZvLW1vZGFsLWJ0bi1va1wiKS51bmJpbmQoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgJCh0aGlzKS5tb2RhbCgnZGlzcG9zZScpO1xyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgICQoJyNpbmZvLW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICBnbG9iYWwuc2V0TW9kYWxGb3JtWkluZGV4KCcjaW5mby1tb2RhbCcpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwb3B1cERpYWxvZ0NvbmZpcm0oKSB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgY2FuY2VsQnV0dG9uID0gJCgnI2luZm8tbW9kYWwtYnRuLWNhbmNlbCcpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jb25maXJtQWN0aW9uICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHRoaXMuX29wdGlvbnMuY29uZmlybUFjdGlvbixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5fb3B0aW9ucy5jb25maXJtQWN0aW9uZGF0YSxcclxuICAgICAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uICgpIHsgX3RoaXMuU2hvd0xvYWRpbmdTYW9wKCk7IH0sXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgeyBfdGhpcy5IaWRlTG9hZGluZ1Nhb3AoKTsgfSxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b24udHJpZ2dlcihcImNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZihfdGhpcy5fb3B0aW9ucy5vblN1Y2Nlc3MgIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fb3B0aW9ucy5vblN1Y2Nlc3MocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b24udHJpZ2dlcihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KHJlc3BvbnNlLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL2Nsb3NlIGRpYWxvZ1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24udHJpZ2dlcihcImNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMub25TdWNjZXNzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25TdWNjZXNzKG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BSaWdodFNpZGViYXJWaWV3IHtcclxuICAgIERhc2hib2FyZCA9IDBcclxuICAgICxBYnNlbmNlID0gMVxyXG4gICAgLEF0dGVuZGFuY2VEYXkgPSAyXHJcbiAgICAsQXR0ZW5kYW5jZU1vbnRoID0gMyAgICBcclxuICAgICxUcmF2ZWxPcmRlcnMgPSA0XHJcbiAgICAsSW50ZXJuYWxPcmRlcnMgPSA1XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmlnaHRTaWRlYmFyIHtcclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmUgOlNhb3BTZXJ2aWNlc0NvcmU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGJpbmRDYXJvdXNlbERpdihjb250ZW50SWQ6c3RyaW5nLHZpZXc6U2FvcFJpZ2h0U2lkZWJhclZpZXcpe1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmlnaHRTaWRlYmFyLmJpbmREaXZcIik7IFxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSaWdodFNpZGVCYXIvR2V0Q2Fyb3VzZWxWaWV3P3ZpZXc9XCIrdmlldy50b1N0cmluZygpXHJcbiAgICAgICAgICAgICxkYXRhOm51bGxcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOlwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIlxyXG4gICAgICAgICAgICAsYXN5bmM6ZmFsc2VcclxuICAgICAgICB9KTsgICAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEb3B1c3RaYUtvcmlzY2VuamVTdW1tYXJ5KGNvbnRlbnRJZDogc3RyaW5nLCBzcGlubmVyRGl2SWQ6IHN0cmluZyA9IFwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmlnaHRTaWRlYmFyLnJlZnJlc2hEb3B1c3RaYUtvcmlzY2VuamVTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUmlnaHRTaWRlQmFyL0RvcHVzdFphS29yaXNjZW5qZVN1bW1hcnlQYXJ0aWFsXCJcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZFxyXG4gICAgICAgIH0pOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFVyZVphS29yaXNjZW5qZVN1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNwaW5uZXJEaXZJZDogc3RyaW5nID0gXCIjc2FvcExvYWRpbmdTaWRlYmFyclwiKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIucmVmcmVzaFVyZVphS29yaXNjZW5qZVN1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24ocmVzcG9uc2Upe1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246XCJSaWdodFNpZGVCYXIvVXJlWmFLb3Jpc2NlbmplU3VtbWFyeVBhcnRpYWxcIlxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDogc3Bpbm5lckRpdklkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFJlZ1VyYURvZ29ka2lTdW1tYXJ5KGNvbnRlbnRJZDogc3RyaW5nLCBzZWxlY3RlZFBlcmlvZDpzdHJpbmcsIHNwaW5uZXJEaXZJZDpzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoUmVnVXJhRG9nb2RraVN1bW1hcnlcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMuc2V0SGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vbnJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNldEhlaWdodCgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUmlnaHRTaWRlQmFyL1JlZ1VyYURvZ29ka2lTdW1tYXJ5UGFydGlhbD9zZWxlY3RlZFBlcmlvZD1cIitzZWxlY3RlZFBlcmlvZFxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpzcGlubmVyRGl2SWRcclxuICAgICAgICAgICAgLy8sc3Bpbm5lckRpdklkOlwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hSZWdPUE5Qb3RuaU5hbG9naVN1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNwaW5uZXJEaXZJZDpzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoUmVnT1BOUG90bmlOYWxvZ2lTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiVHJhdmVsT3JkZXIvVHJhdmVsT3JkZXJzU3VtbWFyeVwiXHJcbiAgICAgICAgICAgICxkYXRhOm51bGxcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOnNwaW5uZXJEaXZJZFxyXG4gICAgICAgICAgICAvLyxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaE5ka0ludGVybmFsT3JkZXJzU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc3Bpbm5lckRpdklkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoTmRrSW50ZXJuYWxPcmRlcnNTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUmlnaHRTaWRlQmFyL0ludGVybmFsT3JkZXJzU3VtbWFyeVwiXHJcbiAgICAgICAgICAgICwgZGF0YTogbnVsbFxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZFxyXG4gICAgICAgICAgICAvLyxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SGVpZ2h0KCkge1xyXG4gICAgICAgIHZhciBoZWFkZXIgPSAkKFwiI3NpdGUtaGVhZGVyXCIpLmhlaWdodCgpO1xyXG4gICAgICAgIHZhciBmb290ZXIgPSAkKFwiI3NpdGUtZm9vdGVyXCIpLmhlaWdodCgpO1xyXG5cclxuICAgICAgICB2YXIgdmlzaW5hX3RhYl9saXN0YSA9IDA7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9PSAnL1JFR0F0dGVuZGFuY2UnKVxyXG4gICAgICAgICAgICB2aXNpbmFfdGFiX2xpc3RhID0gMzc7XHJcblxyXG4gICAgICAgICQoXCIjcmVnLXN1bW1hcnktY29udGFpbmVyXCIpLmhlaWdodCh3aW5kb3cuaW5uZXJIZWlnaHQgLSBoZWFkZXIgLSBmb290ZXIgLSAxMDYgLSB2aXNpbmFfdGFiX2xpc3RhKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wSW5wdXRXRkxQcm9wZXJ0aWVzIHtcclxuICAgIGlkOnN0cmluZztcclxuICAgIHBsYWNlaG9sZGVyOnN0cmluZztcclxuICAgIGNhcHRpb246c3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcHNlbGVjdFdGTCB7XHJcbiAgICBwcml2YXRlIF9pbnB1dFRlbXBsYXRlOnN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6U2FvcElucHV0V0ZMUHJvcGVydGllcykge1xyXG4gICAgICAgIHRoaXMuX2lucHV0VGVtcGxhdGUgPSBcclxuICAgICAgICBgXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoYXMtZmxvYXQtbGFiZWwgc2FvcC1kcm9wZG93biBzZWxlY3RFbGVtZW50XCI+XHJcbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2hhZG93LW5vbmUgc2FvcC1jb250cm9sIHNhb3AtY2hpbGQtc2VsZWN0XCIgZGF0YS1jaG9zZW49XCJUXCIgaWQ9XCIke3Byb3BlcnRpZXMuaWR9XCIgbmFtZT1cIiR7cHJvcGVydGllcy5pZH1cIiB0YWJpbmRleD1cIjBcIiBzdHlsZT1cImhlaWdodDogMzBweDtwYWRkaW5nOiAwLjA3NXJlbSAwLjc1cmVtO1wiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiLz5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNhb3AtZmxvYXRpbmctbGFiZWxcIiBmb3I9XCIke3Byb3BlcnRpZXMuaWR9XCI+JHtwcm9wZXJ0aWVzLmNhcHRpb259PC9sYWJlbD5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJzZWxlY3QtZHJvcGRvd24gc2FvcC1pbWctZG93biBzaS1zXCIvPlxyXG4gICAgICAgIDwvc3Bhbj4gICAgIFxyXG4gICAgICAgIGA7ICAgICAgICAgICAgICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBnZXRFbGVtZW50KCk6SlF1ZXJ5PEhUTUxFbGVtZW50PntcclxuICAgICAgICBsZXQgX2VsZW1lbnQgPSAkKHRoaXMuX2lucHV0VGVtcGxhdGUpO1xyXG4gICAgICAgIHJldHVybiBfZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbm5lckh0bWwoKTpzdHJpbmd7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0VGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8ga25qaXpuaWNhOiBodHRwczovL3NlbGVjdGl6ZS5kZXYvXHJcblxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL3NlbGVjdGl6ZS1zZWxlY3QvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7ICBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNlbGVjdE9wdGlvbiB9IGZyb20gXCIuL3Nhb3AtbXVsdGlzZWxlY3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2VsZWN0aXplU2VsZWN0IHtcclxuICAgIHByaXZhdGUgbGliTmFtZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfdmlld0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0aXplQ29udHJvbDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOiBzdHJpbmcgPSBcIlwiLCBpZDogc3RyaW5nID0gXCJcIiwgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICAgICAgdGhpcy5fdmlld0lkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2lkID0gaWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pZCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGl6ZUNvbnRyb2wgPSAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5faWQpWzBdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmluaXRcIik7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pY2lhbGl6ZUJpbmRFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29udHJvbEJ5SlF1ZXJ5KGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmluaXRTZWxlY3RpemVTZWxlY3QoZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdENvbnRyb2xCeUh0bWwoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmluaXRTZWxlY3RpemVTZWxlY3QoJChlbGVtZW50KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdE11bHRpc2VsZWN0Q29udHJvbEJ5SHRtbChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdFNlbGVjdGl6ZU11bHRpc2VsZWN0KCQoZWxlbWVudCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuZ2V0VmFsdWVcIik7XHJcblxyXG4gICAgICAgIHJldHVybiAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5faWQpLmF0dHIoXCJkYXRhLWNob3NlblwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNdWx0aXNlbGVjdFZhbHVlcygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuZ2V0TXVsdGlzZWxlY3RWYWx1ZXNcIik7XHJcblxyXG4gICAgICAgIGxldCByZXRWYWx1ZTogc3RyaW5nW10gPSBbXTsgXHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl9pZCArIFwiIG9wdGlvbjpzZWxlY3RlZFwiKS5lYWNoKGZ1bmN0aW9uICh2YWwpIHtcclxuICAgICAgICAgICAgcmV0VmFsdWUucHVzaCgkKHRoaXMpLnZhbCgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmV0VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2VsZWN0aXplU2VsZWN0KGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5pbml0U2VsZWN0aXplU2VsZWN0Li4uXCIpO1xyXG5cclxuICAgICAgICBlbGVtZW50LnNlbGVjdGl6ZSh7XHJcbiAgICAgICAgICAgIHNvcnRGaWVsZDogJ3RleHQnLFxyXG4gICAgICAgICAgICBhbGxvd0VtcHR5T3B0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICByZW5kZXI6IHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbjogZnVuY3Rpb24gKGl0ZW06IGFueSwgZXNjYXBlOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBpdGVtLnRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhcHRpb24gPSBpdGVtLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIjxkaXY+XCIgKyAnPHNwYW4gY2xhc3M9XCJsYWJlbFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OjEzcHhcIj4nICsgZXNjYXBlKGxhYmVsKSArIFwiPC9zcGFuPlwiICsgXCI8L2Rpdj5cIjtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiRpbnB1dC52YWwoKSA9PT0gXCI/XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5pbml0U2VsZWN0aXplU2VsZWN0Li4uZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRTZWxlY3RpemVNdWx0aXNlbGVjdChlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pdFNlbGVjdGl6ZU11bHRpc2VsZWN0Li4uXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBlbGVtZW50LnNlbGVjdGl6ZSh7XHJcbiAgICAgICAgICAgIGRlbGltaXRlcjogXCJ8XCIsXHJcbiAgICAgICAgICAgIHBlcnNpc3Q6IGZhbHNlLFxyXG4gICAgICAgICAgICBtYXhJdGVtczogbnVsbCxcclxuICAgICAgICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoaW5wdXQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogaW5wdXQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsVmFsdWVzID0gdGhpcy5pdGVtcztcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjZSBqZSBzYW1vIGVuIGVsZW1lbnQgaW4gdGEgXCI/XCIsIHpicmlzZW1vIHNlem5hbSwgZGEgc2UgZmxvYXRpbmcgbGFiZWwgdW1ha25lIGl6IHZ2bm9zbmUga29udHJvbGVcclxuICAgICAgICAgICAgICAgIGlmIChzZWxWYWx1ZXMubGVuZ3RoID09IDEgJiYgc2VsVmFsdWVzWzBdLnRyaW0oKSA9PT0gXCI/XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ICAgICAgICAgICBcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pdFNlbGVjdGl6ZVNlbGVjdC4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbmljaWFsaXplQmluZEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5pbmljaWFsaXplQmluZEV2ZW50c1wiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpczsgXHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgXCIgKyB0aGlzLl9pZCkuY2hhbmdlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIF90aGlzLnZhbHVlQ2hhbmdlZChkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YWx1ZUNoYW5nZWQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LnZhbHVlQ2hhbmdlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3Quc2V0VmFsdWVcIik7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFZhbHVlcyh2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3Quc2V0VmFsdWVzXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGl6ZUNvbnRyb2wuc2VsZWN0aXplLnNldFZhbHVlKHZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJWYWx1ZSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5jbGVhclZhbHVlXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGl6ZUNvbnRyb2wuc2VsZWN0aXplLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaE9wdGlvbnMob3B0aW9uTGlzdDogU2VsZWN0T3B0aW9uW10pOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5yZWZyZXNoT3B0aW9uc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gemJyaXNlbW8gaXpicmFubyBvcGNpam8sIGRydWdhY2Ugb3N0YW5lIG5vdHJpIGtvdCBvcGNpamFcclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5jbGVhcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5jbGVhck9wdGlvbnMoKTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbkxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvcHRpb25MaXN0LmZvckVhY2goZWxlbWVudCA9PlxyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3NlbGVjdGl6ZUNvbnRyb2wuc2VsZWN0aXplLmFkZE9wdGlvbih7IHZhbHVlOiBlbGVtZW50LnZhbHVlLCB0ZXh0OiBlbGVtZW50LnRleHQgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5kaXNhYmxlXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGl6ZUNvbnRyb2wuc2VsZWN0aXplLmRpc2FibGUoKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVG9nZ2xlUGFuZWwge1xyXG5cclxuICAgIGluaXQoKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVG9nZ2xlUGFuZWwuaW5pdC4uLlwiKTtcclxuICAgICAgICB0aGlzLnNldENsaWNrRXZlbnRPbkZyYW1lKFwiYm9keVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRDbGlja0V2ZW50T25GcmFtZShmcmFtZU5hbWU6c3RyaW5nID0gXCJib2R5XCIpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVG9nZ2xlUGFuZWwuc2V0Q2xpY2tFdmVudE9uRnJhbWUuLi5cIik7XHJcblxyXG4gICAgICAgIGxldCBfZnJhbWUgPSAkKFwiXCIrZnJhbWVOYW1lK1wiICo+IC5zYW9wLXRvZ2dsZS1wYW5lbFwiKTtcclxuICAgICAgICBfZnJhbWUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2ZyYW1lLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy9uYSBrbGlrIHNlIHB1xaHEjWljYSBvYnJuZSBnb3IgLyBkb2xcclxuICAgICAgICAgICAgdmFyIGFycm93RGl2ID0gJCh0aGlzKS5maW5kKFwiLnNhb3AtdG9nZ2xlLWFycm93XCIpO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJvd0Rpdi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFycm93RGl2W2ldLmNsYXNzTGlzdC5jb250YWlucyhcInNhb3AtaW1nLWRvd25cIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJvd0RpdltpXS5jbGFzc0xpc3QucmVtb3ZlKFwic2FvcC1pbWctZG93blwiKTtcclxuICAgICAgICAgICAgICAgICAgICBhcnJvd0RpdltpXS5jbGFzc0xpc3QuYWRkKFwic2FvcC1pbWctdXBcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycm93RGl2W2ldLmNsYXNzTGlzdC5yZW1vdmUoXCJzYW9wLWltZy11cFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBhcnJvd0RpdltpXS5jbGFzc0xpc3QuYWRkKFwic2FvcC1pbWctZG93blwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlcy5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXRyYW5zbGF0ZSc7XHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlRGxnLCBTYW9wTXNnRGxnQnV0dG9uIH0gZnJvbSBcIi4vc2FvcC1tZXNzYWdlLWRsZ1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmVldmlldyB7XHJcbiAgICBwcml2YXRlIF92aWV3SWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgbGliTmFtZTogc3RyaW5nOyAgXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGlvblNlcnZpY2U6IFNhb3BUcmFuc2xhdGlvblNlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOiBzdHJpbmcsIGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG5cclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgfSAgXHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmluaXRcIik7XHJcblxyXG4gICAgICAgIC8vIHByZXZhamFuamVcclxuICAgICAgICB0aGlzLnNldEZvcm1UZXJtaW5vbG9neUxpc3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnRMaXN0bmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Rm9ybVRlcm1pbm9sb2d5TGlzdCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNldEZvcm1UZXJtaW5vbG9neUxpc3RcIik7XHJcblxyXG4gICAgICAgIGxldCB0ZXJtaW5vbG9neSA9IFtcIk5pIHBvZGF0a292IHphIHByaWthei5cIiwgXCJCcmlzYW5qZVwiLCBcIkFsaSBzdGUgcHJlcHJpxI1hbmksIGRhIMW+ZWxpdGUgaXpicmlzYXRpIGVsZW1lbnQ/XCJdO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS5zZXRUcmFuc2xhdGlvbnNMaXN0KHRlcm1pbm9sb2d5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudExpc3RuZXJzKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuaW5pdEV2ZW50TGlzdG5lcnNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vZmYoXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWV4cGFuZC1jb2xhcHNlXCIpOyBcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub24oXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWV4cGFuZC1jb2xhcHNlXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNhb3AtdHJlZXZpZXctZXhwYW5kLWNvbGFwc2UuY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgX3RoaXMudHJlZXZpZXdFeHBhbmRDb2xhcHNlKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub2ZmKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWRlbGV0ZVwiKTtcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub24oXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0tZGVsZXRlXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNhb3AtdHJlZXZpZXctaXRlbS1kZWxldGUuY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgX3RoaXMuZGVsZXRlVHJlZXZpZXdJdGVtKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub2ZmKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWFkZFN1Ykl0ZW1cIik7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWFkZFN1Ykl0ZW1cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuc2FvcC10cmVldmlldy1pdGVtLWFkZFN1Ykl0ZW0uY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgX3RoaXMuYWRkVHJlZXZpZXdTdWJJdGVtKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub2ZmKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWluc2VydEl0ZW1cIik7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWluc2VydEl0ZW1cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuc2FvcC10cmVldmlldy1pdGVtLWluc2VydEl0ZW0uY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgX3RoaXMuaW5zZXJ0SXRlbSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1lZGl0XCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vbihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1lZGl0XCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNhb3AtdHJlZXZpZXctaXRlbS1lZGl0LmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmVkaXRUcmVldmlld0l0ZW0odGhpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vZmYoXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWFkZC1pdGVtLWJ0blwiKTtcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub24oXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWFkZC1pdGVtLWJ0blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWFkZC1pdGVtLWJ0bi5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBfdGhpcy5hZGRUcmVldmlld0l0ZW0odGhpcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cmVldmlld0V4cGFuZENvbGFwc2UoZWxlbTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy50cmVldmlld0V4cGFuZENvbGFwc2VcIik7XHJcblxyXG4gICAgICAgIGxldCBpZCA9ICQoZWxlbSkuYXR0cihcImRhdGEtdG9vZ2xlZWxlbWVudHNpZFwiKTtcclxuICAgICAgICBsZXQgY29sbGFwc2VJdGVtcyA9ICQoZWxlbSkuaGFzQ2xhc3MoXCJzYW9wLWltZy1kb3duXCIpO1xyXG5cclxuICAgICAgICAkKGVsZW0pLnRvZ2dsZUNsYXNzKFwic2FvcC1pbWctZG93blwiKTtcclxuICAgICAgICAkKGVsZW0pLnRvZ2dsZUNsYXNzKFwic2FvcC1pbWctcmlnaHRcIik7XHJcblxyXG4gICAgICAgIC8vIHNob3cvaGlkZVxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgZGl2LnNhb3AtdHJlZXZpZXctaXRlbS1jb250YWluZXJbZGF0YS1wYXJlbnRpZD0nXCIgKyBpZCArIFwiJ11cIikuZWFjaChmdW5jdGlvbiAoaW5kZXg6IG51bWJlciwgY2hpbGRFbGVtOiBhbnkpIHtcclxuICAgICAgICAgICAgaWYgKGNvbGxhcHNlSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICQoY2hpbGRFbGVtKS5oaWRlKFwiZmFzdFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoY2hpbGRFbGVtKS5zaG93KFwiZmFzdFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pOyAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlbGV0ZVRyZWV2aWV3SXRlbShlbGVtOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuZGVsZXRlVHJlZXZpZXdJdGVtXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGxldCBkZWxldGVUaXRsZSA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJCcmlzYW5qZVwiKTtcclxuICAgICAgICBsZXQgZGVsZXRlTWVzc2FnZSA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJBbGkgc3RlIHByZXByacSNYW5pLCBkYSDFvmVsaXRlIGl6YnJpc2F0aSBlbGVtZW50P1wiKTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BNZXNzYWdlRGxnID0gbmV3IFNhb3BNZXNzYWdlRGxnKG51bGwpO1xyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLm9uWWVzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQgeiBrbGFzb20gc2FvcC10cmVldmlldy1pdGVtLWNvbnRhaW5lciBpbiBnYSBvZHN0cmFuaW1vIHRlciB2c2UgY2hpbGRyZWVuXHJcbiAgICAgICAgICAgIGxldCB0ZW1wRWxlbWVudCA9IGVsZW07XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRpZCA9IDA7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlbXBFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInNhb3AtdHJlZXZpZXctaXRlbS1jb250YWluZXJcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRpZCA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMk51bWJlcih0ZW1wRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhcmVudGlkXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBvZHN0cmFuaW1vIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wRWxlbWVudC5pbm5lckhUTUwgPSBcIlwiOyBcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wRWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRlbXBFbGVtZW50ID0gdGVtcEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFyZW50aWQgIT0gbnVsbCAmJiBwYXJlbnRpZCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIGFsaSBqZSBzZSBrYWogb3N0YWxpaCBjaGlsZCBlbGVtZW50b3YgeiBpc3RpbSBwYXJlbnRJZD9cclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlZW5Db3VudCA9ICQoX3RoaXMuX3ZpZXdJZCArICcgZGl2LnNhb3AtdHJlZXZpZXctaXRlbS1jb250YWluZXJbZGF0YS1wYXJlbnRpZD1cIicgKyBwYXJlbnRpZCArICdcIl0nKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZWVuQ291bnQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHpicmlzYWxpIHphZG5qZWdhIGNoaWxkIGVsZW1lbnQsIHNrcmlqZW1vIGV4cGFuZC9jb2xsYXBzZSBpa29ubyBwYXJlbnQgZWxlbWVudGFcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9ICQoX3RoaXMuX3ZpZXdJZCArICcgZGl2LnNhb3AtdHJlZXZpZXctaXRlbVtkYXRhLWlkPVwiJyArIHBhcmVudGlkICsgJ1wiXScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV4cGFuZENvbGxhcHNlRWxlbSA9ICQocGFyZW50RWxlbWVudCkuZmluZChcIi5zYW9wLXRyZWV2aWV3LWV4cGFuZC1jb2xhcHNlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwYW5kQ29sbGFwc2VFbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZENvbGxhcHNlRWxlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLlNob3coZGVsZXRlTWVzc2FnZSwgZGVsZXRlVGl0bGUsIDEsIFtTYW9wTXNnRGxnQnV0dG9uLm1iWWVzLCBTYW9wTXNnRGxnQnV0dG9uLm1iTm9dKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFRyZWV2aWV3U3ViSXRlbShhZGRTdWJJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmFkZFRyZWV2aWV3U3ViSXRlbVwiKTtcclxuXHJcbiAgICAgICAgLy8gcHJpa2F6ZW1vIGV4cGFuZC9jb2xsYXBzZSBpa29ubzpcclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQsIGtpIGltYSBrbGFzIHNhb3AtdHJlZXZpZXctaXRlbS1pbmZvLFxyXG4gICAgICAgIGxldCBwYXJlbnRFbGVtID0gYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudEVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwic2FvcC10cmVldmlldy1pdGVtLWluZm9cIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIHBvaXNjZW1vIG5qZWdvdiBjaGlsZCwga2kgaW1hIGtsYXMgc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVxyXG4gICAgICAgICAgICAgICAgbGV0IGV4cGFuZENvbGxhcHNlRWxlbSA9ICQocGFyZW50RWxlbSkuZmluZChcIi5zYW9wLXRyZWV2aWV3LWV4cGFuZC1jb2xhcHNlXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuZENvbGxhcHNlRWxlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kQ29sbGFwc2VFbGVtLnNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmVudEVsZW0gPSBwYXJlbnRFbGVtLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb2lzY2kgbWF4IElkIFRyZWV2aWV3cyBpbiBnYSBwb3ZlY2FtbyB6YSAxXHJcbiAgICAgICAgbGV0IG5ld1N1Ykl0ZW1JZCA9IHRoaXMuZ2V0TWF4VHJlZXZpZXdJZCgpICsgMTtcclxuICAgICAgICAvLyBwYXJlbnQgSWRcclxuICAgICAgICBsZXQgbmV3U3ViSXRlbVBhcmVudElkID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyTnVtYmVyKCQoYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQpLmF0dHIoXCJkYXRhLXBhcmVudGlkXCIpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRUcmVldmlld1N1Ykl0ZW1FeHRlcm5hbChhZGRTdWJJdGVtQnV0dG9uRWxlbWVudCwgbmV3U3ViSXRlbUlkLCBuZXdTdWJJdGVtUGFyZW50SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TWF4VHJlZXZpZXdJZCgpOiBudW1iZXIge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuZ2V0TWF4VHJlZXZpZXdJZFwiKTtcclxuXHJcbiAgICAgICAgbGV0IG1heElkID0gMFxyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIC5zYW9wLXRyZWV2aWV3LWl0ZW1cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGh0bWxUcmVldmlld0l0ZW0pIHtcclxuICAgICAgICAgICAgbGV0IGlkID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyTnVtYmVyKGh0bWxUcmVldmlld0l0ZW0uZ2V0QXR0cmlidXRlKFwiZGF0YS1pZFwiKSk7XHJcbiAgICAgICAgICAgIGlmIChpZCAhPSBudWxsICYmIGlkID4gbWF4SWQpIHtcclxuICAgICAgICAgICAgICAgIG1heElkID0gaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1heElkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRUcmVldmlld1N1Ykl0ZW1FeHRlcm5hbChhZGRTdWJJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQsIG5ld1N1Ykl0ZW1JZDogbnVtYmVyLCBuZXdTdWJJdGVtUGFyZW50SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuYWRkVHJlZXZpZXdTdWJJdGVtRXh0ZXJuYWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWV0b2RvIHVwb3JhYmxqYSBjbGllbnQsIHZybmUgY29udGVudCwga2kgam8gZG9kYW1vIHYgdHJlZXZpZXdcclxuICAgIHB1YmxpYyBhZGRUcmVldmlld1N1Ykl0ZW1Db250ZW50KGFkZFN1Ykl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCwgbmV3U3ViSXRlbUlkOiBudW1iZXIsIG5ld1N1Ykl0ZW1QYXJlbnRJZDogbnVtYmVyLCBodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld1N1Ykl0ZW1Db250ZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgZWxlbVBhcmVudCA9ICQodGhpcy5fdmlld0lkICsgJyBkaXYuc2FvcC10cmVldmlldy1pdGVtW2RhdGEtaWQ9XCInICsgbmV3U3ViSXRlbVBhcmVudElkICsgJ1wiXScpO1xyXG4gICAgICAgIGVsZW1QYXJlbnQuYXBwZW5kKGh0bWxDb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFRyZWV2aWV3SXRlbShhZGRJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmFkZFRyZWV2aWV3SXRlbVwiKTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NpIG1heCBJZCBUcmVldmlld3MgaW4gZ2EgcG92ZWNhbW8gemEgMVxyXG4gICAgICAgIGxldCBuZXdJdGVtSWQgPSB0aGlzLmdldE1heFRyZWV2aWV3SWQoKSArIDE7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkVHJlZXZpZXdJdGVtRXh0ZXJuYWwoYWRkSXRlbUJ1dHRvbkVsZW1lbnQsIG5ld0l0ZW1JZCwgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFRyZWV2aWV3SXRlbUV4dGVybmFsKGFkZEl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCwgbmV3SXRlbUlkOiBudW1iZXIsIG5ld0l0ZW1QYXJlbnRJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld0l0ZW1FeHRlcm5hbFwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBtZXRvZG8gdXBvcmFibGphIGNsaWVudCwgdnJuZSBjb250ZW50LCBraSBqbyBkb2RhbW8gdiB0cmVldmlld1xyXG4gICAgcHVibGljIGFkZFRyZWV2aWV3SXRlbUNvbnRlbnQoYWRkSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50LCBuZXdJdGVtSWQ6IG51bWJlciwgbmV3SXRlbVBhcmVudElkOiBudW1iZXIsIGh0bWxDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmFkZFRyZWV2aWV3SXRlbUNvbnRlbnRcIik7XHJcblxyXG4gICAgICAgIC8vIG9kc3RyYW5pbW8gYWRkIGl0ZW0gaHRtbCwga2VyIGdhIGJvIHplIGRvZGFsIGh0bWxDb250ZW50XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiAuc2FvcC10cmVldmlldy1hZGQtaXRlbS1jb250YWluZXJcIikuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGh0bWxUcmVldmlld0FkZEl0ZW0pIHtcclxuICAgICAgICAgICAgaHRtbFRyZWV2aWV3QWRkSXRlbS5yZW1vdmUoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IGVsZW1QYXJlbnQgPSAkKHRoaXMuX3ZpZXdJZCk7XHJcbiAgICAgICAgZWxlbVBhcmVudC5hcHBlbmQoaHRtbENvbnRlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZWRpdFRyZWV2aWV3SXRlbShlbGVtOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuZWRpdFRyZWV2aWV3SXRlbVwiKTtcclxuXHJcbiAgICAgICAgLy8gb2RzdHJhbmltbyBjc3Mga2xhcyB6YSBvYnJvYm8gdnNlbSBlbGVtZW50b20gaW4gam8gZG9kYW1vIGl6YnJhbmVtdVxyXG4gICAgICAgIHRoaXMuY2xlYXJUcmVldmlld0l0ZW1zU2VsZWN0ZWRDc3MoKTtcclxuICAgICAgICAkKGVsZW0pLmFkZENsYXNzKFwic2FvcC10cmVldmlldy1pdGVtLXNlbGVjdGVkXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmVkaXRUcmVldmlld0l0ZW1FeHRlcm5hbChlbGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB6YSBleHRlcm5vIHVwb3JhYm9cclxuICAgIHB1YmxpYyBlZGl0VHJlZXZpZXdJdGVtRXh0ZXJuYWwoZWxlbTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmVkaXRUcmVldmlld0l0ZW1FeHRlcm5hbFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXJUcmVldmlld0l0ZW1zU2VsZWN0ZWRDc3MoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5jbGVhclRyZWV2aWV3SXRlbXNTZWxlY3RlZENzc1wiKTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiAuc2FvcC10cmVldmlldy1pdGVtLWluZm9cIikucmVtb3ZlQ2xhc3MoXCJzYW9wLXRyZWV2aWV3LWl0ZW0tc2VsZWN0ZWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZWxlbSBqZSBpc3RpIGtvdCBnYSBwb251amEgZWRpdFRyZWV2aWV3SXRlbSBvei4gZWRpdFRyZWV2aWV3SXRlbUV4dGVybmFsXHJcbiAgICBwdWJsaWMgcmVmcmVzaFRyZWV2aWV3SXRlbUhlYWRlcihlbGVtOiBIVE1MRWxlbWVudCwgaGVhZGVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnJlZnJlc2hUcmVldmlld0l0ZW1IZWFkZXJcIik7XHJcblxyXG4gICAgICAgICQoZWxlbSkuZmluZChcIi5zYW9wLXRyZWV2aWV3LWl0ZW0taGVhZGVyXCIpLnRleHQoaGVhZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluc2VydEl0ZW0oaW5zZXJ0SXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5pbnNlcnRJdGVtXCIpO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQsIGtpIGltYSBrbGFzIHNhb3AtdHJlZXZpZXctaXRlbS1jb250YWluZXIsXHJcbiAgICAgICAgbGV0IHBhcmVudEZvdW5kID0gZmFsc2VcclxuICAgICAgICBsZXQgcGFyZW50RWxlbSA9IGluc2VydEl0ZW1CdXR0b25FbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtLmNsYXNzTGlzdC5jb250YWlucyhcInNhb3AtdHJlZXZpZXctaXRlbS1jb250YWluZXJcIikpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudEZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmVudEVsZW0gPSBwYXJlbnRFbGVtLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyZW50Rm91bmQpIHtcclxuICAgICAgICAgICAgLy8gcG9pc2NpIG1heCBJZCBUcmVldmlld3MgaW4gZ2EgcG92ZWNhbW8gemEgMVxyXG4gICAgICAgICAgICBsZXQgbmV3SXRlbUlkID0gdGhpcy5nZXRNYXhUcmVldmlld0lkKCkgKyAxO1xyXG4gICAgICAgICAgICAvLyBwYXJlbnRJZFxyXG4gICAgICAgICAgICBsZXQgbmV3SXRlbVBhcmVudElkID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyTnVtYmVyKCQocGFyZW50RWxlbSkuYXR0cihcImRhdGEtcGFyZW50aWRcIikpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRUcmVldmlld0l0ZW1FeHRlcm5hbChwYXJlbnRFbGVtLCBuZXdJdGVtSWQsIG5ld0l0ZW1QYXJlbnRJZCk7XHJcbiAgICAgICAgfSAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbnNlcnRUcmVldmlld0l0ZW1FeHRlcm5hbChpdGVtVG9BcHBlbmRUbzogSFRNTEVsZW1lbnQsIG5ld0l0ZW1JZDogbnVtYmVyLCBuZXdJdGVtUGFyZW50SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuaW5zZXJ0VHJlZXZpZXdJdGVtRXh0ZXJuYWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluc2VydFRyZWV2aWV3SXRlbUNvbnRlbnQoaXRlbVRvQXBwZW5kVG86IEhUTUxFbGVtZW50LCBuZXdJdGVtSWQ6IG51bWJlciwgbmV3SXRlbVBhcmVudElkOiBudW1iZXIsIGh0bWxDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3Lmluc2VydFRyZWV2aWV3SXRlbUNvbnRlbnRcIik7XHJcblxyXG4gICAgICAgICQoaXRlbVRvQXBwZW5kVG8pLmFmdGVyKGh0bWxDb250ZW50KTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BWaWV3U3Bpbm5lciB7XHJcblxyXG4gIGdlbmVyYXRlU3Bpbm5lckRpdihzcGlubmVySWQ6IHN0cmluZyA9ICcjc2FvcExvYWRpbmcnKTogc3RyaW5nIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJnZW5lcmF0ZVNwaW5uZXJEaXYgXCIgKyBzcGlubmVySWQpO1xyXG4gICAgbGV0IHNwaW5uckRpdiA9XHJcbiAgICAgICc8ZGl2IGlkPVwiJyArIHNwaW5uZXJJZCArICdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgY2xhc3M9XCJcIj4gJ1xyXG4gICAgICArICdcdDxkaXYgaWQ9XCInICsgc3Bpbm5lcklkICsgJ1NwaW5uZXJCYWNrZ3JvdW5nXCIgY2xhc3M9XCJzcGlubmVyLWJhY2tncm91bmQgXCIvPiAnXHJcbiAgICAgICsgJ1x0PGRpdiBpZD1cIicgKyBzcGlubmVySWQgKyAnU3Bpbm5lclwiIGNsYXNzPVwic3Bpbm5lciBzcGlubmVyLWNlbnRlci1kYXNoYm9hcmRTaWRlYmFyclwiPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0PC9kaXY+ICdcclxuICAgICAgKyAnPC9kaXY+ICc7XHJcblxyXG4gICAgcmV0dXJuIHNwaW5uckRpdjtcclxuICB9XHJcblxyXG4gIHNob3dMb2FkaW5nU2FvcChlbGVtZW50SWQ6IHN0cmluZyA9IFwiI3Nhb3BMb2FkaW5nXCIpIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93TG9hZGluZ1Nhb3AgXCIgKyBlbGVtZW50SWQpO1xyXG4gICAgdmFyIG9iaiA9ICQoZWxlbWVudElkKTtcclxuICAgIGlmIChvYmoubGVuZ3RoKSB7XHJcbiAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTaG93Li4uIFwiKTtcclxuICAgICAgb2JqLnNob3coKTtcclxuICAgICAgLy9zZXRNb2RhbEZvcm1aSW5kZXgoZWxlbWVudElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhpZGVMb2FkaW5nU2FvcChlbGVtZW50SWQ6IHN0cmluZyA9IFwiI3Nhb3BMb2FkaW5nXCIpIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJoaWRlTG9hZGluZ1Nhb3AgXCIgKyBlbGVtZW50SWQpO1xyXG4gICAgdmFyIG9iaiA9ICQoZWxlbWVudElkKTtcclxuICAgIGlmIChvYmoubGVuZ3RoKVxyXG4gICAgICBvYmouaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gc2hvd0xvYWRpbmdTYW9wKGVsZW1lbnRJZDogc3RyaW5nID0gXCJcIikge1xyXG4gIC8vICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNob3dMb2FkaW5nU2FvcCBcIiArIGVsZW1lbnRJZCk7XHJcbiAgLy8gICBpZiAoIWlzRW1wdHkoZWxlbWVudElkKSkge1xyXG4gIC8vICAgICBsZXQgZWxlbWVudERpdiA9ICQoZWxlbWVudElkKTtcclxuICAvLyAgICAgaWYgKGVsZW1lbnREaXYubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgbGV0IHNwaW5uZXJJRCA9IGVsZW1lbnRJZCArIFwiTG9hZGluZ1wiO1xyXG4gIC8vICAgICAgIHNwaW5uZXJJRCA9IHNwaW5uZXJJRC5yZXBsYWNlKFwiI1wiLFwiXCIpO1xyXG4gIC8vICAgICAgIGxldCBzcGlubmVyRGl2ID0gJChzcGlubmVySUQpO1xyXG4gIC8vICAgICAgIGlmICghc3Bpbm5lckRpdi5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgIGxldCBfZGl2ID0gdGhpcy5nZW5lcmF0ZVNwaW5uZXJEaXYoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICAgIGVsZW1lbnREaXYuYXBwZW5kKF9kaXYpO1xyXG4gIC8vICAgICAgICAgc3Bpbm5lckRpdiA9ICQoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgc3Bpbm5lckRpdi5zaG93KCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGhpZGVMb2FkaW5nU2FvcChlbGVtZW50SWQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAvLyAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJoaWRlTG9hZGluZ1Nhb3AgXCIgKyBlbGVtZW50SWQpO1xyXG4gIC8vICAgaWYgKCFpc0VtcHR5KGVsZW1lbnRJZCkpIHtcclxuICAvLyAgICAgbGV0IGVsZW1lbnREaXYgPSAkKGVsZW1lbnRJZCk7XHJcbiAgLy8gICAgIGlmIChlbGVtZW50RGl2Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgIGxldCBzcGlubmVySUQgPSBlbGVtZW50SWQgKyBcIkxvYWRpbmdcIjtcclxuICAvLyAgICAgICBsZXQgc3Bpbm5lckRpdiA9ICQoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICBpZiAoIXNwaW5uZXJEaXYubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgICBlbGVtZW50RGl2LmFwcGVuZCh0aGlzLmdlbmVyYXRlU3Bpbm5lckRpdihzcGlubmVySUQpKTtcclxuICAvLyAgICAgICAgIHNwaW5uZXJEaXYgPSAkKHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHNwaW5uZXJEaXYuaGlkZSgpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIC8vIC8vXHJcbn1cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld1NwaW5uZXIgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3Atdmlldy1zcGlubmVyJ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wU2VydmljZXNDb3JlUGFyYW1zIHtcclxuICBhY3Rpb246c3RyaW5nO1xyXG4gIGFzeW5jPzpib29sZWFuXHJcbiAgdHlwZT86c3RyaW5nO1xyXG4gIGRhdGE/OmFueTtcclxuICBzcGlubmVyRGl2SWQ/OnN0cmluZztcclxuICAvLyBjb250ZW50VHlwZT86IHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGRhdGFUeXBlPzogJ3htbCcgfCAnaHRtbCcgfCAnc2NyaXB0JyB8ICdqc29uJyB8ICdqc29ucCcgfCAndGV4dCcgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLy8gcHJvY2Vzc0RhdGE/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wU2VydmljZXNDb3JlUmVzdWx0IHtcclxuICBzdWNjZXNzID0gMVxyXG4gICwgZXJyb3IgPSAyXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZSB7XHJcbiAgb2sgPSAyMDAsXHJcbiAgdW5hdXRob3JpemVkID0gNDAxLFxyXG4gIGludGVybmFsU2VydmVyRXJyb3IgPSA1MDBcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wU2VydmljZXNDb3JlUmVzcG9uc2Uge1xyXG4gIHJlc3BvbnNlOiBTYW9wU2VydmljZXNDb3JlUmVzdWx0O1xyXG4gIGRhdGE6IGFueTtcclxufTtcclxuXHJcbi8vIGZ1bmN0aW9uIHN5bmNEZWxheShtaWxsaXNlY29uZHM6YW55KXtcclxuLy8gICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuLy8gICB2YXIgZW5kPTA7XHJcbi8vICAgd2hpbGUoIChlbmQtc3RhcnQpIDwgbWlsbGlzZWNvbmRzKXtcclxuLy8gICAgICAgZW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbi8vICAgfVxyXG4vLyAgfVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZXJ2aWNlc0NvcmUge1xyXG4gIHByaXZhdGUgX3Nhb3BWaWV3U3Bpbm5lcjpTYW9wVmlld1NwaW5uZXIgPSBuZXcgU2FvcFZpZXdTcGlubmVyKCk7XHJcbiAgcHJpdmF0ZSBfcGFyYW1zOlNhb3BTZXJ2aWNlc0NvcmVQYXJhbXM7XHJcbiAgcHJpdmF0ZSBfZGVmYXVsdFBhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zO1xyXG4gIC8vICBcclxuICAvL3B1YmxpYyBfcmVzdWx0OlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSA9IHtyZXNwb25zZTpudWxsLGRhdGE6bnVsbH07ICBcclxuXHJcbiAgY29uc3RydWN0b3IoKXtcclxuICAgIHRoaXMuX2RlZmF1bHRQYXJhbXMgPSB7XHJcbiAgICAgIGFjdGlvbjpcIlwiXHJcbiAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgLGFzeW5jOnRydWVcclxuICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAsc3Bpbm5lckRpdklkOlwiXCJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRG9uZShyZXN1bHQ6YW55KXtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLm9uRG9uZVwiKTtcclxuICAgIHRoaXMuYWZ0ZXJEb25lKHJlc3VsdCk7XHJcbiAgICAvL3RoaXMuX3Nhb3BWaWV3U3Bpbm5lci5oaWRlTG9hZGluZ1Nhb3AodGhpcy5fcGFyYW1zLnNwaW5uZXJEaXZJZCk7ICAgICAgXHJcbiAgfVxyXG5cclxuICBhZnRlckRvbmUocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZVwiKTtcclxuICB9ICBcclxuXHJcbiAgcHJpdmF0ZSBvblN1Y2Nlc3MocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLnN1Y2Nlc3NcIik7XHJcbiAgICBsZXQgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyBcclxuICAgIGlmICh0eXBlb2YgcmVzdWx0LnN1Y2Nlc3MgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVzdWx0LnN1Y2Nlc3MgPT09IG51bGwpIHtcclxuICAgICAgX3Jlc3VsdC5yZXNwb25zZSA9IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2VzcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIF9yZXN1bHQucmVzcG9uc2UgPSByZXN1bHQuc3VjY2VzcyA9PSB0cnVlID8gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzIDogU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5lcnJvcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgX3Jlc3VsdC5kYXRhID0gcmVzdWx0O1xyXG4gICAgdGhpcy5hZnRlclN1Y2Nlc3MoX3Jlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBhZnRlclN1Y2Nlc3MocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2Vzc1wiKTtcclxuICB9ICBcclxuXHJcbiAgcHJpdmF0ZSBvbkVycm9yKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5lcnJvclwiKTtcclxuICAgIFxyXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT0gU2FvcFNlcnZpY2VzQ29yZUhUVFBSZXN1bHRTdGF0dXNDb2RlLnVuYXV0aG9yaXplZCkge1xyXG4gICAgICAvLyByZWRpcmVjdCB0byBsb2dpblxyXG4gICAgICB0aGlzLnVuQXV0aG9yaXplZFJlZGlyZWN0VG9Mb2dpblBhZ2UoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID0gU2FvcFNlcnZpY2VzQ29yZUhUVFBSZXN1bHRTdGF0dXNDb2RlLmludGVybmFsU2VydmVyRXJyb3IgJiYgIWdsb2JhbC5pc1VuRGVmaW5lZChyZXN1bHQucmVzcG9uc2VUZXh0KSkge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyBcclxuICAgIF9yZXN1bHQucmVzcG9uc2UgPSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LmVycm9yO1xyXG4gICAgX3Jlc3VsdC5kYXRhID0gcmVzdWx0O1xyXG4gICAgdGhpcy5hZnRlckVycm9yKF9yZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJFcnJvcihyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzXCIpO1xyXG4gIH0gXHJcblxyXG4gIEV4ZWN1dGVBY3Rpb24ocGFyYW1zOlNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMpOnZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvblwiKTtcclxuICAgIGxldCBvcHRpb25zID0geyAuLi50aGlzLl9kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcclxuICAgIHBhcmFtcyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IF9hamF4QWN0aW9uID0gZ2xvYmFsLmdldFNpdGVBYnNvbHV0ZVVSTChwYXJhbXMuYWN0aW9uKTtcclxuXHJcbiAgICAvL0BVcmwuQWN0aW9uKFwiY3JlYXJDYW1wTWFudWFsXCIsIFwiRFBTXCIpXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgJC5hamF4KHtcclxuICAgICAgICBhc3luYzogcGFyYW1zLmFzeW5jLFxyXG4gICAgICAgIHVybDogX2FqYXhBY3Rpb24sXHJcbiAgICAgICAgdHlwZTogIWdsb2JhbC5pc0VtcHR5KHBhcmFtcy50eXBlKSA/IHBhcmFtcy50eXBlIDogXCJQT1NUXCIsXHJcbiAgICAgICAgZGF0YTogcGFyYW1zLmRhdGEsXHJcbiAgICAgICAgLy8gY29udGVudFR5cGU6IHBhcmFtcy5jb250ZW50VHlwZSA9PSBudWxsID8gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCcgOiBwYXJhbXMuY29udGVudFR5cGUsXHJcbiAgICAgICAgLy8gZGF0YVR5cGU6IHBhcmFtcy50eXBlID09IG51bGwgPyAnSW50ZWxsaWdlbnQgR3Vlc3MgKHhtbCwganNvbiwgc2NyaXB0LCBvciBodG1sKScgOiBwYXJhbXMudHlwZSwgIFxyXG4gICAgICAgIC8vIHByb2Nlc3NEYXRhIDogcGFyYW1zLnByb2Nlc3NEYXRhID09IG51bGwgPyB0cnVlIDogcGFyYW1zLnByb2Nlc3NEYXRhLCBcclxuICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7IF90aGlzLl9zYW9wVmlld1NwaW5uZXIuc2hvd0xvYWRpbmdTYW9wKHBhcmFtcy5zcGlubmVyRGl2SWQpOyB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7IF90aGlzLl9zYW9wVmlld1NwaW5uZXIuaGlkZUxvYWRpbmdTYW9wKHBhcmFtcy5zcGlubmVyRGl2SWQpOyB9LFxyXG4gICAgICAgIHN1Y2Nlc3M6IHRoaXMub25TdWNjZXNzLmJpbmQoX3RoaXMpLFxyXG4gICAgICAgIGVycm9yOiB0aGlzLm9uRXJyb3IuYmluZChfdGhpcylcclxuICAgICAgfSkuZG9uZShmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRvbmUuLi5cIik7XHJcbiAgICAgICAgX3RoaXMub25Eb25lKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2goZXJyKSB7XHJcbiAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgXHJcbiAgfVxyXG5cclxuICBFeGVjdXRlQmxvYkFjdGlvbihwYXJhbXM6IFNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVCbG9iQWN0aW9uXCIpO1xyXG4gICAgbGV0IG9wdGlvbnMgPSB7IC4uLnRoaXMuX2RlZmF1bHRQYXJhbXMsIC4uLnBhcmFtcyB9O1xyXG4gICAgcGFyYW1zID0gb3B0aW9ucztcclxuICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgX2FqYXhBY3Rpb24gPSBnbG9iYWwuZ2V0U2l0ZUFic29sdXRlVVJMKHBhcmFtcy5hY3Rpb24pO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICQuYWpheCh7XHJcbiAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgdXJsOiBfYWpheEFjdGlvbixcclxuICAgICAgICBkYXRhOiBwYXJhbXMuZGF0YSxcclxuICAgICAgICB4aHJGaWVsZHM6IHtcclxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InIC8vIHRvIGF2b2lkIGJpbmFyeSBkYXRhIGJlaW5nIG1hbmdsZWQgb24gY2hhcnNldCBjb252ZXJzaW9uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7IF90aGlzLl9zYW9wVmlld1NwaW5uZXIuc2hvd0xvYWRpbmdTYW9wKHBhcmFtcy5zcGlubmVyRGl2SWQpOyB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7IF90aGlzLl9zYW9wVmlld1NwaW5uZXIuaGlkZUxvYWRpbmdTYW9wKHBhcmFtcy5zcGlubmVyRGl2SWQpOyB9LFxyXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChibG9iLCBzdGF0dXMsIHhocikge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgYSBmaWxlbmFtZVxyXG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBcIlwiO1xyXG4gICAgICAgICAgICB2YXIgZGlzcG9zaXRpb24gPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgaWYgKGRpc3Bvc2l0aW9uICYmIGRpc3Bvc2l0aW9uLmluZGV4T2YoJ2F0dGFjaG1lbnQnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlbmFtZVJlZ2V4ID0gL2ZpbGVuYW1lW147PVxcbl0qPSgoWydcIl0pLio/XFwyfFteO1xcbl0qKS87XHJcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGZpbGVuYW1lUmVnZXguZXhlYyhkaXNwb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAhPSBudWxsICYmIG1hdGNoZXNbMV0pIGZpbGVuYW1lID0gbWF0Y2hlc1sxXS5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vaWYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIC8vICAgIC8vIElFIHdvcmthcm91bmQgZm9yIFwiSFRNTDcwMDc6IE9uZSBvciBtb3JlIGJsb2IgVVJMcyB3ZXJlIHJldm9rZWQgYnkgY2xvc2luZyB0aGUgYmxvYiBmb3Igd2hpY2ggdGhleSB3ZXJlIGNyZWF0ZWQuIFRoZXNlIFVSTHMgd2lsbCBubyBsb25nZXIgcmVzb2x2ZSBhcyB0aGUgZGF0YSBiYWNraW5nIHRoZSBVUkwgaGFzIGJlZW4gZnJlZWQuXCJcclxuICAgICAgICAgICAgLy8gICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgLy99IGVsc2VcclxuICAgICAgICAgICAgLy97XHJcbiAgICAgICAgICAgIHZhciBVUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XHJcbiAgICAgICAgICAgIHZhciBkb3dubG9hZFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVzZSBIVE1MNSBhW2Rvd25sb2FkXSBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBmaWxlbmFtZVxyXG4gICAgICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICAgICAgICAgIC8vIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXRcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYS5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvd25sb2FkVXJsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhLmhyZWYgPSBkb3dubG9hZFVybDtcclxuICAgICAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICAgICAgICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvd25sb2FkVXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChkb3dubG9hZFVybCk7IH0sIDEwMCk7IC8vIGNsZWFudXBcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogdGhpcy5vbkVycm9yLmJpbmQoX3RoaXMpXHJcbiAgICAgICAgfSkuZG9uZShmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiRG9uZS4uLlwiKTtcclxuICAgICAgICAgIF90aGlzLm9uRG9uZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgYWxlcnQoXCJJbnRlcm5hbCBlcnJvciFcIik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHB1YmxpYyBoYW5kbGVTdWJtaXRFcnJvcihyZXNwb25zZTogYW55KTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5IYW5kbGVTdWJtaXRFcnJvclwiKTtcclxuXHJcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS51bmF1dGhvcml6ZWQpIHtcclxuICAgICAgICB0aGlzLnVuQXV0aG9yaXplZFJlZGlyZWN0VG9Mb2dpblBhZ2UoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGlzcGxheSBlcnJvclxyXG4gICAgY29uc29sZS5sb2coXCJyZXNwb25zZVwiLCByZXNwb25zZSk7XHJcbiAgICBhbGVydChyZXNwb25zZS5zdGF0dXNUZXh0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUucmVkaXJlY3RUb0xvZ2luUGFnZVwiKTtcclxuXHJcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgfVxyXG4gXHJcbiAgLy9cclxufVxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVHJhbnNsYXRpb24ge1xyXG4gIHB1YmxpYyBrZXk6IHN0cmluZyA9IFwiI1wiO1xyXG4gIHB1YmxpYyB0cmFuc2xhdGlvbjogc3RyaW5nID0gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvbnMge1xyXG4gIHB1YmxpYyB0cmFuc2xhdGlvbnNMaXN0OltTYW9wVHJhbnNsYXRpb24/XSA9IFtdO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlUGFyYW1zIHtcclxuICBjb250cm9sbGVyOnN0cmluZyxcclxuICBhY3Rpb246c3RyaW5nLFxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX3BhcmFtczpTYW9wVHJhbnNsYXRpb25TZXJ2aWNlUGFyYW1zO1xyXG4gIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmU6IFNhb3BTZXJ2aWNlc0NvcmU7XHJcbiAgLy9cclxuICBwdWJsaWMgX3Rlcm1pbm9sb2d5OlNhb3BUcmFuc2xhdGlvbnM7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihwYXJhbXM6U2FvcFRyYW5zbGF0aW9uU2VydmljZVBhcmFtcyA9IG51bGwpe1xyXG4gICAgaWYoIWdsb2JhbC5pc1VuRGVmaW5lZChwYXJhbXMpKXtcclxuICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcGFyYW1zID0ge2NvbnRyb2xsZXI6XCJUcmFuc2xhdGlvblwiLGFjdGlvbjpcIkdldFRyYW5zbGF0aW9uc1wifTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICB0aGlzLl90ZXJtaW5vbG9neSA9IG5ldyBTYW9wVHJhbnNsYXRpb25zKCk7XHJcbiAgfVxyXG4gIFxyXG4gIHNldFRyYW5zbGF0aW9uc0xpc3QodHJhbnNsYXRpb25zOnN0cmluZ1tdKTphbnl7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdHJhbnNsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgIF90aGlzLl90ZXJtaW5vbG9neS50cmFuc2xhdGlvbnNMaXN0LnB1c2goe2tleTp2YWx1ZSx0cmFuc2xhdGlvbjp2YWx1ZX0pOyAgXHJcbiAgICB9KTsgICBcclxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0aW9ucyh0aGlzLl90ZXJtaW5vbG9neSk7XHJcbiAgfVxyXG5cclxuICBnZXRUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zOlNhb3BUcmFuc2xhdGlvbnMpOmFueXtcclxuICAgIGxldCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRyYW5zbGF0aW9ucyk7XHJcbiAgICBsZXQgX2RhdGEgPSB7anNvbklucHV0Ompzb25EYXRhfTtcclxuICAgIGxldCBfcmVzcG9uc2U6YW55O1xyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgX3Jlc3BvbnNlID0gcmVzcG9uc2U7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICBhY3Rpb246IHRoaXMuX3BhcmFtcy5jb250cm9sbGVyK1wiL1wiK3RoaXMuX3BhcmFtcy5hY3Rpb24rXCJcIlxyXG4gICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAsIGRhdGE6IF9kYXRhXHJcbiAgICAgICAgLCBhc3luYzogZmFsc2VcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fdGVybWlub2xvZ3kudHJhbnNsYXRpb25zTGlzdCA9IF9yZXNwb25zZS50cmFuc2xhdGlvbnNMaXN0O1xyXG4gICAgcmV0dXJuIF9yZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZShrZXk6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICBsZXQgX3RyID0gdGhpcy5fdGVybWlub2xvZ3kudHJhbnNsYXRpb25zTGlzdC5maW5kKGUgPT4gZS5rZXkgPT0ga2V5KSBhcyBhbnk7XHJcbiAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKF90cikpIHsgXHJcbiAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gX3RyLnRyYW5zbGF0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL3R5cGluZ3MuZC50c1wiIC8+XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFV0aWxzIHtcclxuICAgIGNoZWNrQ29tcGF0aWJpbGl0eSgpOmJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBTYW9wQ29tbW9uLmNoZWNrQ29tcGF0aWJpbGl0eSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlLFNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMsIFNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSwgU2FvcFNlcnZpY2VzQ29yZVJlc3VsdCB9IGZyb20gJy4vc2FvcC1zZXJ2aWNlcy1jb3JlJ1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZyc7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuaW1wb3J0IHtTYW9wRmxvYXRpbmdMYWJlbCB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1mbG9hdGluZy1sYWJlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgRXJyb3Ige1xyXG4gICAgcHVibGljIENvZGU6IHN0cmluZztcclxuICAgIHB1YmxpYyBNZXNzYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BXZkFjdGlvbiB7XHJcbiAgICB3ZmFOb25lID0gMFxyXG4gICAgLHdmYUFkZFJlY29yZCA9IDFcclxuICAgICx3ZmFFZGl0UmVjb3JkID0gMlxyXG4gICAgLHdmYURlbGV0ZVJlY29yZCA9IDNcclxuICAgICx3ZmFSZWNvcmREZXN0YWlscyA9IDRcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ZTdWJtaXRSZXN1bHQge1xyXG4gICAgc3VjY2Vzczpib29sZWFuO1xyXG4gICAgdmlld0NvbnRlbnQ6c3RyaW5nO1xyXG4gICAgcmVkaXJlY3RUbzpzdHJpbmc7XHJcbiAgICBhbGVydE1lc3NhZ2U6c3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdGb3JtIHtcclxuICAgIHByaXZhdGUgX3ZpZXdNb2RhbEZyYW1lOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3TW9kYWxCb2R5OkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3X3RpdGxlOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3X2J0bk9rOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF92aWV3X2J0bkNhbmNlbDpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfc2VydmljZXNQYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcyA9IHthY3Rpb246bnVsbCxkYXRhOm51bGwsdHlwZTpcIlBPU1RcIn07XHJcbiAgICBwcml2YXRlIF90ZXJtaW5vbG9neTogc3RyaW5nW107XHJcbiAgICAvL1xyXG4gICAgcHVibGljIF9saWJOYW1lOnN0cmluZztcclxuICAgIHB1YmxpYyBzYW9wU2VydmljZXNDb3JlOlNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgcHVibGljIHRyYW5zbGF0aW9uU2VydmljZTpTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gICAgcHVibGljIGNvbnRlbnRFbGVtZW50SWQgPSBcIi5zYW9wLW1vZGFsLWJvZHktZWxlbWVudFwiO1xyXG4gICAgcHVibGljIGFkZFJlY29yZEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGVkaXRSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBkZWxldGVSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBtYW51YWxseVN1Ym1pdEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIHNhb3BGbG9hdGluZ0xhYmVsOiBTYW9wRmxvYXRpbmdMYWJlbDtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25TdWNjY2Vzc0NhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9uRXJyb3JDYWxsYmFjazogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBvbkZhaWx1cmVDYWxsYmFjazogc3RyaW5nID0gXCJcIjtcclxuICAgIC8vICAgIFxyXG4gICAgcHVibGljIGlkOnN0cmluZztcclxuICAgIHB1YmxpYyB0aXRsZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgZnVsbFNjcmVlbjpib29sZWFuID0gZmFsc2U7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIG9uQ2xvc2U6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uU3VibWl0OiAocGFyYW1zOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbkVycm9yOiAocGFyYW1zOmFueSkgPT4gYW55ID0gbnVsbDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6c3RyaW5nLGxpYk5hbWU6c3RyaW5nID0gXCJcIil7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BWaWV3Rm9ybS4uLlwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwidmlld0lkOlwiK3ZpZXdJZCk7XHJcbiAgICAgICAgdGhpcy5pZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9saWJOYW1lID0gbGliTmFtZTtcclxuICAgICAgICB0aGlzLm9uU3VjY2Nlc3NDYWxsYmFjayA9IGxpYk5hbWUrXCIub25TdWJtaXRTdWNjZXNzKGRhdGEsXCIrbGliTmFtZStcIik7XCI7XHJcbiAgICAgICAgdGhpcy5vbkVycm9yQ2FsbGJhY2sgPSBsaWJOYW1lICsgXCIub25TdWJtaXRFcnJvcihkYXRhLFwiICsgbGliTmFtZSArIFwiKTtcIjtcclxuICAgICAgICB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrID0gbGliTmFtZSArIFwiLm9uU3VibWl0RmFpbHVyZSh4aHIsXCIgKyBsaWJOYW1lICsgXCIpO1wiO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgICAgICB0aGlzLnNhb3BGbG9hdGluZ0xhYmVsID0gbmV3IFNhb3BGbG9hdGluZ0xhYmVsKCk7XHJcbiAgICAgICAgLy8gIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRUZXJtaW5vbG9neUxpc3QoZGljdGlvbmFyeTogc3RyaW5nW10gPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdGVybWlub2xvZ3kgPSBbXCJVcmVkaVwiLFwiTm92IHZub3NcIixcIlBvZHJvYm5vc3RpXCIsXCJCcmlzYW5qZVwiXTtcclxuICAgICAgICBpZiAoZGljdGlvbmFyeSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbm9sb2d5ID0gdGhpcy5fdGVybWlub2xvZ3kuY29uY2F0KGRpY3Rpb25hcnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5zZXRUcmFuc2xhdGlvbnNMaXN0KHRoaXMuX3Rlcm1pbm9sb2d5KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25CdG5Pa0NsaWNrKHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uQnRuT2tDbGljay4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25CdG5DYW5jZWwoc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25CdG5DYW5jZWwuLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJlZm9yZVZpZXdTaG93KHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkK1wiLmJlZm9yZVZpZXdTaG93KClcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lID0gJCh0aGlzLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5fdmlld01vZGFsRnJhbWUgPT0gbnVsbCkgeyBjb25zb2xlLmxvZyh0aGlzLmlkK1wiIG5vdCBmb3VuZCFcIik7fTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHZhciBjb250ZW50U2VsID0gdGhpcy5pZCArIFwiIFwiICsgdGhpcy5jb250ZW50RWxlbWVudElkO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkgPSAkKGNvbnRlbnRTZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZnRlclZpZXdTaG93KHNlbmRlcjphbnksd2ZBY3Rpb246U2FvcFdmQWN0aW9uKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCtcIi5hZnRlclZpZXdTaG93KClcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl92aWV3X2J0bk9rID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bk9rXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bkNhbmNlbFwiKTtcclxuICAgICAgICB0aGlzLl92aWV3X3RpdGxlID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2V4YW1wbGVNb2RhbExvbmdUaXRsZVwiKTtcclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJWaWV3U2hvdyB0aXRsZTpcIisgdGhpcy50aXRsZSk7XHJcblxyXG4gICAgICAgIGlmICghZ2xvYmFsLmlzRW1wdHkodGhpcy50aXRsZSkpe1xyXG4gICAgICAgICAgICBsZXQgX3RpdGxlID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiTm92IHZub3NcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiVXJlZGlcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzKXtcclxuICAgICAgICAgICAgICAgIF90aXRsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIlBvZHJvYm5vc3RpXCIpK1wiOiBcIit0aGlzLnRpdGxlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJWaWV3U2hvdyBfdGl0bGU6XCIrIF90aXRsZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92aWV3X3RpdGxlLmh0bWwoX3RpdGxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGVmYXVsdFRpdGxlQWRkID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2FkZFRpdGxlXCIpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3X3RpdGxlLmh0bWwoZGVmYXVsdFRpdGxlQWRkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBkZWZhdWx0VGl0bGVFZGl0ID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2VkaXRUaXRsZVwiKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld190aXRsZS5odG1sKGRlZmF1bHRUaXRsZUVkaXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnZpZXdTaG93Q29tcGxldGUoc2VuZGVyLCB3ZkFjdGlvbik7XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5iaW5kQnV0dG9ucyhzZW5kZXIpO1xyXG5cclxuICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgZ2xvYmFsLnNldE1vZGFsRm9ybVpJbmRleCh0aGlzLmlkKTtcclxuICAgICAgICBnbG9iYWwuc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXModGhpcy5pZCk7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmFmdGVyVmlld1Nob3dTdWNjZXNzKHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyVmlld1Nob3dTdWNjZXNzKHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkICsgXCIuYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3MoKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmlld1Nob3dDb21wbGV0ZShzZW5kZXI6IGFueSwgd2ZBY3Rpb246IFNhb3BXZkFjdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCArIFwiLnZpZXdTaG93Q29tcGxldGUoKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJpbmRCdXR0b25zKHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJpbmRCdXR0b25zXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuT2sgPSAkKFwiXCIgKyB0aGlzLmlkICsgXCIgKj4gI2J0bk9rXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuT2suY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uQnRuT2tDbGljayhzZW5kZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld19idG5DYW5jZWwgPSAkKFwiXCIgKyB0aGlzLmlkICsgXCIgKj4gI2J0bkNhbmNlbFwiKTtcclxuICAgICAgICB0aGlzLl92aWV3X2J0bkNhbmNlbC5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25CdG5DYW5jZWwoc2VuZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJpbmRWaWV3RXZlbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJiaW5kVmlld0V2ZW50c1wiKTtcclxuXHJcbiAgICAgICAgbGV0IGRpdkZvcm0gPSB0aGlzLl92aWV3TW9kYWxGcmFtZS5maW5kKFwiZm9ybVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1zdWNjZXNzXCIsIHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25FcnJvckNhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1lcnJvclwiLCB0aGlzLm9uRXJyb3JDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9uRmFpbHVyZUNhbGxiYWNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRpdkZvcm0uYXR0cihcImRhdGEtYWpheC1mYWlsdXJlXCIsIHRoaXMub25GYWlsdXJlQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnNhb3BGbG9hdGluZ0xhYmVsLmluaXQoKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVuZGVyRXJyb3JzQmFubmVyKGVycm9yczpFcnJvcltdKTpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2Uge1xyXG4gICAgICAgIGxldCByZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlO1xyXG4gICAgICAgIHJlc3VsdCA9IHtyZXNwb25zZTpTYW9wU2VydmljZXNDb3JlUmVzdWx0LmVycm9yLGRhdGE6bnVsbH07IFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IGpzb25EYXRhID0gSlNPTi5zdHJpbmdpZnkoZXJyb3JzKTtcclxuICAgICAgICBsZXQgX2RhdGEgPSB7anNvbklucHV0Ompzb25EYXRhfTsgICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IF9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbiAocmVzcG9uc2U6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJFcnJvcnMvUmVuZGVyRXJyb3JzQmFubmVyXCJcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IF9kYXRhXHJcbiAgICAgICAgICAgICwgYXN5bmM6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbmRlckVycm9yKGVyck1lc3NhZ2U6c3RyaW5nKTp2b2lke1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhamF4LmFmdGVyRXJyb3JcIik7XHJcbiAgICAgICAgICAgIGxldCBfZXJyb3JzOkVycm9yW107XHJcbiAgICAgICAgICAgIF9lcnJvcnMgPSBbe0NvZGU6XCJcIixNZXNzYWdlOmVyck1lc3NhZ2V9XTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBfcGFyZW50VmlldyA9ICQodGhpcy5pZCkucGFyZW50KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgX2Vycm9yQmFubmVySWQgPSB0aGlzLmlkK1wiRXJyb3JCYW5uZXJcIjtcclxuICAgICAgICAgICAgLy9sZXQgX3ZpZXdfYmFubmVyID0gdGhpcy5fdmlld01vZGFsQm9keS5maW5kKF9lcnJvckJhbm5lcklkKTtcclxuICAgICAgICAgICAgbGV0IF92aWV3X2Jhbm5lciA9IF9wYXJlbnRWaWV3LmZpbmQoX2Vycm9yQmFubmVySWQpO1xyXG4gICAgICAgICAgICBpZiAoIGdsb2JhbC5pc1VuRGVmaW5lZChfdmlld19iYW5uZXIpIHx8IF92aWV3X2Jhbm5lci5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgX3ZpZXdfYmFubmVyID0gX3BhcmVudFZpZXcuYXBwZW5kKFwiPGRpdiBpZD1cIitfZXJyb3JCYW5uZXJJZCtcIj48L2Rpdj5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IF9iYW5uZXJSZXN1bHQgPSB0aGlzLnJlbmRlckVycm9yc0Jhbm5lcihfZXJyb3JzKTtcclxuICAgICAgICAgICAgX3ZpZXdfYmFubmVyLmh0bWwoX2Jhbm5lclJlc3VsdC5kYXRhLnZpZXdDb250ZW50KTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoKGVycikge1xyXG4gICAgICAgICAgICBhbGVydChlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgfSAgXHJcbiAgICB9XHJcbiAgICAvL3B1YmxpYyBsb2FkVmlld0JvZHkod2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkpOlNhb3BTZXJ2aWNlc0NvcmVSZXN1bHR7XHJcbiAgICBwdWJsaWMgbG9hZFZpZXdCb2R5KHdmQWN0aW9uOlNhb3BXZkFjdGlvbixkYXRhOmFueSxzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsb2FkVmlld0JvZHlcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLmJlZm9yZVZpZXdTaG93KHNlbmRlcik7XHJcblxyXG4gICAgICAgIGxldCBfYWpheEFjdGlvbiA9IHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQgPyB0aGlzLmFkZFJlY29yZEVuZHBvaW50IDogdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQ7XHJcbiAgICAgICAgLy9fYWpheEFjdGlvbiA9IGdldFNpdGVBYnNvbHV0ZVVSTChfYWpheEFjdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlcnZpY2VzUGFyYW1zID0ge2FjdGlvbjpfYWpheEFjdGlvbixkYXRhOmRhdGEsdHlwZTpcIlBPU1RcIn07XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbihfYWpheFJlc3VsdCl7XHJcbiAgICAgICAgICAgIGlmIChfYWpheFJlc3VsdC5yZXNwb25zZSA9PSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFqYXguc3VjY2Vzc1wiKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl92aWV3TW9kYWxCb2R5Lmh0bWwoX2FqYXhSZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlclZpZXdTaG93KHNlbmRlcix3ZkFjdGlvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWpheC5lcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIGlmICgoZ2xvYmFsLmlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEpICYmIGdsb2JhbC5pc1VuRGVmaW5lZChfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSkpID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJFcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OICYmIF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OLm1lc3NhZ2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0aWZ5LmVycm9yKF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlckVycm9yID0gZnVuY3Rpb24oX2FqYXhSZXN1bHQpe1xyXG4vLyMjI1xyXG4gICAgICAgICAgICBpZiAoKGdsb2JhbC5pc1VuRGVmaW5lZChfYWpheFJlc3VsdC5kYXRhKSAmJiBnbG9iYWwuaXNVbkRlZmluZWQoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpKSA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJFcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHRoaXMuX3NlcnZpY2VzUGFyYW1zKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgcHVibGljIGFmdGVyU3VibWl0U3VjY2VzcyhyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuYWZ0ZXJFeGVjdXRlU3VjY2Vzc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TdWJtaXRTdWNjZXNzQ29tcGxldGUocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0U3VjY2Vzc0NvbXBsZXRlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdEVycm9yKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5vblN1Ym1pdEVycm9yXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdEZhaWx1cmUocmVzdWx0OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0RmFpbHVyZVwiKTtcclxuICAgICAgICB2YXIgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5oYW5kbGVTdWJtaXRFcnJvcihyZXN1bHQpO1xyXG4gICAgfVxyXG4gXHJcbiAgICBwdWJsaWMgb25TdWJtaXRTdWNjZXNzKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5vbkV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0LnN1Y2Nlc3NcIik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5tb2RhbCgnaGlkZScpO1xyXG5cclxuICAgICAgICAgICAgLy8ganVzdCBpbiBjYXNlOiBvZHN0cmFuaSwgxI1lIGplIMWhZSB2ZWRubyB2aWRubywgYXZ0b21hdHNrbyBzZSBuZSB6YXByZSB2ZWRubyA6KFxyXG4gICAgICAgICAgICAkKCcubW9kYWwtYmFja2Ryb3AnKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJChkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhcIm1vZGFsLW9wZW5cIik7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXN1bHQuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfSAgXHJcblxyXG4gICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLnJlZnJlc2hEYXRhKSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMub25TdWJtaXRTdWNjZXNzQ29tcGxldGUocmVzdWx0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0LmVycm9yXCIpO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVsb2FkIHZpZXcgZm9ybVwiKTtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29udGVudChyZXN1bHQudmlld0NvbnRlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyU3VibWl0U3VjY2VzcyhyZXN1bHQpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaENvbnRlbnQodmlld0NvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbCh2aWV3Q29udGVudCk7XHJcbiAgICAgICAgdGhpcy5iaW5kQnV0dG9ucyhudWxsKTtcclxuICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25BZnRlclJlZnJlc2hDb250ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQWZ0ZXJSZWZyZXNoQ29udGVudCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25BZnRlclJlZnJlc2hDb250ZW50XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRlbGV0ZVJlY29yZChkZWxldGVEYXRhOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uRGVsZXRlUmVjb3JkXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7YWN0aW9uOnRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQsZGF0YTpkZWxldGVEYXRhLHR5cGU6XCJQT1NUXCJ9O1xyXG5cclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzID0gZnVuY3Rpb24oX2FqYXhSZXN1bHQpe1xyXG4gICAgICAgICAgICBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQoX3RoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWZyZXNoRGF0YShkZWxldGVEYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5LmVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyBsZXQgX2FqYXhSZXN1bHQgPSB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcbiAgICAgICAgLy8gaWYgKF9hamF4UmVzdWx0LnJlc3BvbnNlID09IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2Vzcyl7XHJcbiAgICAgICAgLy8gICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLnJlZnJlc2hEYXRhKSl7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKGRlbGV0ZURhdGEpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyByZXR1cm4gX2FqYXhSZXN1bHQucmVzcG9uc2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyByZWZyZXNoRGF0YShzZW5kZXI6YW55KTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVmcmVzaERhdGFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZVJlY29yZCh0aXRsZTpzdHJpbmcsbWVzc2FnZTpzdHJpbmcsZGVsZXRlRGF0YTphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImRlbGV0ZVJlY29yZC5iZWdpblwiKTtcclxuICAgICAgICBsZXQgc2FvcE1lc3NhZ2VEbGcgPSBuZXcgU2FvcE1lc3NhZ2VEbGcoZGVsZXRlRGF0YSkgIFxyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLm9uWWVzID0gdGhpcy5vbkRlbGV0ZVJlY29yZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHNhb3BNZXNzYWdlRGxnLlNob3cobWVzc2FnZSx0aXRsZSwxLFtTYW9wTXNnRGxnQnV0dG9uLm1iWWVzLFNhb3BNc2dEbGdCdXR0b24ubWJOb10pO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkZWxldGVSZWNvcmQuZW5kXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRSZWNvcmQoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZGRSZWNvcmRcIik7XHJcbiAgICAgICAgbGV0IF9yZXN1bHQgPSB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkLGRhdGEsc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZWRpdFJlY29yZChkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVkaXRSZWNvcmRcIik7XHJcbiAgICAgICAgdGhpcy5sb2FkVmlld0JvZHkoU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQsZGF0YSxzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWNvcmREZXRhaWxzKGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWRpdFJlY29yZFwiKTtcclxuICAgICAgICB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhUmVjb3JkRGVzdGFpbHMsZGF0YSxzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtYW51YWxseVN1Ym1pdChzdWJtaXREYXRhOiBhbnksIHNwaW5uZXJEaXZJZDogc3RyaW5nID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtYW51YWxseVN1Ym1pdFwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKGdsb2JhbC5pc0VtcHR5KHNwaW5uZXJEaXZJZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7IGFjdGlvbjogdGhpcy5tYW51YWxseVN1Ym1pdEVuZHBvaW50LCBkYXRhOiBzdWJtaXREYXRhLCB0eXBlOiBcIlBPU1RcIiB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7IGFjdGlvbjogdGhpcy5tYW51YWxseVN1Ym1pdEVuZHBvaW50LCBkYXRhOiBzdWJtaXREYXRhLCB0eXBlOiBcIlBPU1RcIiwgc3Bpbm5lckRpdklkOiBzcGlubmVyRGl2SWQgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbiAoX2FqYXhSZXN1bHQpIHtcclxuICAgICAgICAgICAgX3RoaXMub25TdWJtaXRTdWNjZXNzKF9hamF4UmVzdWx0LmRhdGEpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93Vmlld0Zvcm0od2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93Vmlld0Zvcm1cIik7XHJcbiAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0UmVjb3JkKGRhdGEsc2VuZGVyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscykgeyAgXHJcbiAgICAgICAgICAgIHRoaXMucmVjb3JkRGV0YWlscyhkYXRhLHNlbmRlcik7ICAgICAgICAgIFxyXG4gICAgICAgIH0gICBcclxuICAgICAgICB0aGlzLlNldFRvRnVsbFNjcmVlbigpOyAgICAgIFxyXG4gICAgfSAgXHJcblxyXG4gICAgcHVibGljIFNldFRvRnVsbFNjcmVlbigpe1xyXG4gICAgICAgIGlmICh0aGlzLmZ1bGxTY3JlZW4gKXtcclxuICAgICAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUuYWRkQ2xhc3MoXCJzYW9wLW1vZGFsLWZ1bGxzY3JlZW4tZm9ybVwiKTtcclxuICAgICAgICAgICAgbGV0IF9kaWFsb2dEaXYgPSB0aGlzLl92aWV3TW9kYWxGcmFtZS5maW5kKFwiLm1vZGFsLWRpYWxvZ1wiKTtcclxuICAgICAgICAgICAgX2RpYWxvZ0Rpdi5yZW1vdmVDbGFzcygnbW9kYWwtZGlhbG9nLWNlbnRlcmVkJyk7XHJcbiAgICAgICAgICAgIF9kaWFsb2dEaXYuYWRkQ2xhc3MoJ21vZGFsLWZ1bGxzY3JlZW4nKTtcclxuICAgICAgICAgICAgX2RpYWxvZ0Rpdi5yZW1vdmVBdHRyKCdzdHlsZScpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGxldCBfY29udGVudCA9IHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmZpbmQoXCIubW9kYWwtY29udGVudFwiKTtcclxuICAgICAgICAgICAgX2NvbnRlbnQucmVtb3ZlQXR0cignY2xhc3MnKTtcclxuICAgICAgICAgICAgX2NvbnRlbnQuYWRkQ2xhc3MoJ21vZGFsLWNvbnRlbnQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZnJlc2hFbGVtZW50RGF0YShodG1sQ29udGVudDpzdHJpbmcsZWxlbWVudElkOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoRWxlbWVudERhdGFcIik7XHJcbiAgICAgICAgbGV0IF9kb2N1bWVudCA9ICQoaHRtbENvbnRlbnQpO1xyXG4gICAgICAgIGxldCBfY2VsbCA9IF9kb2N1bWVudC5maW5kKGVsZW1lbnRJZCk7XHJcbiAgICAgICAgJChlbGVtZW50SWQpLnJlcGxhY2VXaXRoKF9jZWxsKTtcclxuICAgICAgfVxyXG5cclxuICAgIC8vICBcclxufVxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFV0aWxzIH0gZnJvbSBcIi4vQ29yZS9zYW9wLXV0aWxzXCI7XHJcbmltcG9ydCB7IFNhb3BUb2dnbGVQYW5lbCB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC10b2dnbGUtcGFuZWxcIjtcclxuaW1wb3J0IHsgU2FvcElucHV0TWFzayB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1pbnB1dG1hc2tcIjtcclxuaW1wb3J0IHsgU2FvcENoZWNrYm94U3dpdGNoIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLWNoZWNrYm94LXN3aXRjaFwiO1xyXG5pbXBvcnQgeyBTYW9wTXVsdGlzZWxlY3QgIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLW11bHRpc2VsZWN0XCI7XHJcbmltcG9ydCB7IFNhb3BWaWV3U3Bpbm5lciB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLXZpZXctc3Bpbm5lcic7XHJcbmltcG9ydCB7IFNhb3BSaWdodFNpZGViYXIgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC1yaWdodC1zaWRlYmFyJztcclxuaW1wb3J0IHsgTWVudVNpZGViYXIgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtbWVudS1zaWRlYmFyXCI7XHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlRGxnIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtZGxnXCI7XHJcbmltcG9ydCB7IFNhb3BQb3B1cERpYWxvZyB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLXBvcHVwLWRpYWxvZydcclxuaW1wb3J0IHsgU2FvcEZsb2F0aW5nTGFiZWwgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWxcIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gJy4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmUnO1xyXG5pbXBvcnQgeyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgU2FvcFdlYkdyaWQgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC1ncmlkJztcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtIH0gZnJvbSAnLi9Db3JlL3Nhb3Atdmlldy1mb3JtJztcclxuaW1wb3J0IHsgU2FvcFRyZWV2aWV3IH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3AtdHJlZXZpZXcnO1xyXG5pbXBvcnQgeyBTYW9wU2VsZWN0aXplU2VsZWN0IH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3Atc2VsZWN0aXplLXNlbGVjdCc7XHJcbmltcG9ydCB7IFNhb3BQZGZQcmV2aWV3ICB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1wZGYtcHJldmlld1wiO1xyXG5pbXBvcnQgeyBTYW9wUGluY2hab29tICB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1waW5jaC1hbmQtem9vbVwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVjaG9UZXN0KG1zZzpzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKFwiZWNobzogXCIrbXNnKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29tcGF0aWJpbGl0eSgpOiBib29sZWFuIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjaGVja0NvbXBhdGliaWxpdHlcIik7XHJcbiAgICBsZXQgdXRpbHMgPSBuZXcgU2FvcFV0aWxzKCk7XHJcbiAgICByZXR1cm4gdXRpbHMuY2hlY2tDb21wYXRpYmlsaXR5KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0Q2xpZW50TG9nTW9kZVZhbHVlKCkge1xyXG4gICAgZ2xvYmFsLmRlYnVnTW9kZSA9IGdsb2JhbC5HZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0U2l0ZUJhc2VVcmxWYWx1ZSgpIHtcclxuICAgIGdsb2JhbC5zaXRlQmFzZVVybCA9IGdsb2JhbC5nZXRTaXRlQmFzZVVybCgpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplU2l0ZUpTKCkge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImluaXRpYWxpemVTaXRlSlNcIik7XHJcbiAgICBuZXcgTWVudVNpZGViYXIoKS5pbml0KCk7XHJcbiAgICBuZXcgU2FvcFRvZ2dsZVBhbmVsKCkuaW5pdCgpO1xyXG5cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmIChlLmN0cmxLZXkgJiYgZS5hbHRLZXkgJiYgZS5rZXlDb2RlID09IDc5KSB7XHJcbiAgICAgICAgICAgIC8vIENUUkwgKyBBTFQgKyBPXHJcbiAgICAgICAgICAgIGdsb2JhbC5TZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5kZWJ1Z01vZGUgPSBnbG9iYWwuR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGdsb2JhbC5zZXRIZWxwTGluaygpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Rmlyc3RDb250cm9sVG9Gb2N1cyhmb3JtSWQ6IHN0cmluZykge1xyXG4gICAgZ2xvYmFsLnNldEZpcnN0Rm9ybUNvbnRyb2xUb0ZvY3VzKGZvcm1JZCk7XHJcbn1cclxuXHJcbmV4cG9ydCB7Z2xvYmFsfTtcclxuXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUb2dnbGVQYW5lbEV4IGV4dGVuZHMgU2FvcFRvZ2dsZVBhbmVse307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcElucHV0TWFza0V4IGV4dGVuZHMgU2FvcElucHV0TWFza3t9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BDaGVja2JveFN3aXRjaEV4IGV4dGVuZHMgU2FvcENoZWNrYm94U3dpdGNoe307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE11bHRpc2VsZWN0RXggZXh0ZW5kcyBTYW9wTXVsdGlzZWxlY3R7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTWVzc2FnZURsZ0V4IGV4dGVuZHMgU2FvcE1lc3NhZ2VEbGd7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUG9wdXBEaWFsb2dFeCBleHRlbmRzIFNhb3BQb3B1cERpYWxvZ3t9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BWaWV3U3Bpbm5lckVYIGV4dGVuZHMgU2FvcFZpZXdTcGlubmVyIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUmlnaHRTaWRlYmFyRXggZXh0ZW5kcyBTYW9wUmlnaHRTaWRlYmFyIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wRmxvYXRpbmdMYWJlbEV4IGV4dGVuZHMgU2FvcEZsb2F0aW5nTGFiZWwgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZXJ2aWNlc0NvcmVFeCBleHRlbmRzIFNhb3BTZXJ2aWNlc0NvcmUgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvblNlcnZpY2VFeCBleHRlbmRzIFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BXZWJHcmlkRXggZXh0ZW5kcyBTYW9wV2ViR3JpZCB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdGb3JtRXggZXh0ZW5kcyBTYW9wVmlld0Zvcm0geyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BVdGlsc0V4IGV4dGVuZHMgU2FvcFV0aWxzIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVHJlZXZpZXdFeCBleHRlbmRzIFNhb3BUcmVldmlldyB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlbGVjdGl6ZVNlbGVjdEV4IGV4dGVuZHMgU2FvcFNlbGVjdGl6ZVNlbGVjdCB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBkZlByZXZpZXdFeCBleHRlbmRzIFNhb3BQZGZQcmV2aWV3IHt9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQaW5jaFpvb21FeCBleHRlbmRzIFNhb3BQaW5jaFpvb20ge307XHJcbi8vXHJcbiJdfQ=="}