\");\r\n });\r\n\r\n var template =\r\n '
' +\r\n '
' +\r\n '{0}
' +\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 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 }\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 `;\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 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 {\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 this._saopServicesCore.afterDone = function(response){\r\n $(contentId).html(response);\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 //\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 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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IiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9hbGVydGlmeS9pbmRleC5kLnRzXCIgLz5cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBnbG9iYWwge1xyXG4gICAgcHVibGljIHN0YXRpYyBkZWJ1Z01vZGU6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgc3RhdGljIHNpdGVCYXNlVXJsOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDb25zb2xlTG9nRGVndWcobWVzc2FnZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWdNb2RlKSBjb25zb2xlLmxvZyhtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldENsaWVudExvZ01vZGVTdG9yYWdlS2V5VmFsdWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gXCJTYW9wTW9qSW5mby5nbG9iYWxDbGllbnRMb2dNb2RlVmFsXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBkZWJ1Z01vZGVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIGRlYnVnTW9kZVN0cmluZ1ZhbCA9IHRoaXMuUmVhZFZhcmlhYmxlRnJvbVN0b3JhZ2UoZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlS2V5VmFsdWUoKSk7XHJcblxyXG4gICAgICAgIGxldCBkZWJ1Z01vZGVWYWwgPSBkZWJ1Z01vZGVEZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgaWYgKGRlYnVnTW9kZVN0cmluZ1ZhbCkge1xyXG4gICAgICAgICAgICBkZWJ1Z01vZGVWYWwgPSBkZWJ1Z01vZGVTdHJpbmdWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRlYnVnTW9kZVZhbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGxvZ01vZGUgPSB0aGlzLkdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxuICAgICAgICB0aGlzLldyaXRlVmFyaWFibGVUb1N0b3JhZ2UoZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlS2V5VmFsdWUoKSwgIWxvZ01vZGUpO1xyXG5cclxuICAgICAgICBhbGVydGlmeS5tZXNzYWdlKFwiQ2xpZW50IGxvZyBtb2RlIGVuYWJsZWQ6IFwiICsgIWxvZ01vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2l0ZUJhc2VVcmwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJChcIiNzaXRlQmFzZVVybFwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzZXRIZWxwTGluaygpOiB2b2lkIHtcclxuICAgICAgICAvL25hc3RhdmkgaGVscCBsaW5rLCB2IG9kdmlzbm9zdGkgb2QgbG9rYWxpemFjaWplXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgc3ZnSGVscDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nhb3AtaGVscCcpO1xyXG5cclxuICAgICAgICBpZihzdmdIZWxwICE9IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2UgPSBzdmdIZWxwLmdldEF0dHJpYnV0ZShcImRhdGEtbGFuZ3VhZ2VcIik7XHJcblxyXG4gICAgICAgICAgICAvL3BvxI1ha2FtbyBkYSBzZSBnbmVzemRlbmkgb2JqZWt0IG5hbG/FvmlcclxuICAgICAgICAgICAgc3ZnSGVscC5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3ZnSGVscExpbmsgPSBzdmdIZWxwLmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNhb3AtaGVscC1saW5rXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzVW5EZWZpbmVkKHN2Z0hlbHBMaW5rKSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZSA9PSBcImhyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ZnSGVscExpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImh0dHA6Ly9oZWxwLnNhb3AuaHIvaHIvbW9qaW5mb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ3VhZ2UgPT0gXCJzclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN2Z0hlbHBMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgXCJodHRwOi8vd3d3LnNhb3AucnMvaWNlbnRlci8xMDAvdXB1dHN0dmEtemEtdXBvdHJlYnUvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ZnSGVscExpbmsuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBcImh0dHBzOi8vc2ktaWNlbnRlci5rbm93bGVkZ2Vvd2wuY29tL2hlbHAvbW9qaW5mby1uYXZvZGlsYS16YS11cG9yYWJvLXByZW5vdmxqZW5lZ2EtcG9ydGFsYVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy96YXJhZGkgYnJhc2thbG5payAtIG1vemlsbGEgZmlyZWZveCAtIGl6Z2xlZGEsIGRhIGplIG9iamVjdCAnJ2xvYWRlZCcnIHByZWRlbiBtdSBkb2RhbW8gb24gbG9hZGVkXHJcbiAgICAgICAgICAgIGlmKCQoJyNzYW9wLWhlbHAtbGluaycpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdsb2FkJyk7XHJcbiAgICAgICAgICAgICAgICBzdmdIZWxwLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdG8yID0gKG46IG51bWJlcik6IHN0cmluZyA9PiAoKE1hdGguYWJzKG4pIDwgMTAgPyAnMCcgOiAnJykgKyBNYXRoLmFicyhuKSk7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9beWRtaF0rL2dpLCAobWF0Y2g6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3l5eXknOiByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkJzogcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkZCc6IHJldHVybiB0bzIoZGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbSc6IHJldHVybiAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ21tJzogcmV0dXJuIHRvMihkYXRlLmdldE1vbnRoKCkgKyAxKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0gnOiByZXR1cm4gZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdISCc6IHJldHVybiB0bzIoZGF0ZS5nZXRIb3VycygpKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ01NJzogcmV0dXJuIHRvMihkYXRlLmdldE1pbnV0ZXMoKSk7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZzJEYXRlKHN0cmluZ0RhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpOiBEYXRlIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY29udmVydFN0cmluZzJEYXRlXCIpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiZGQubW0ueXl5eVwiOlxyXG4gICAgICAgICAgICAgICAgbGV0IGRheSA9IHN0cmluZ0RhdGUuc3Vic3RyaW5nKDAsIDIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoMywgNSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgeWVhciA9IHN0cmluZ0RhdGUuc3Vic3RyaW5nKDYsIDEwKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoK3llYXIsICttb250aCAtIDEsICtkYXkpO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbnZlcnRTdHJpbmcyTnVtYmVyKHN0cmluZ1ZhbDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY29udmVydFN0cmluZzJOdW1iZXJcIik7XHJcblxyXG4gICAgICAgIGxldCBudW1iZXJWYWwgPSBwYXJzZUludChzdHJpbmdWYWwpXHJcblxyXG4gICAgICAgIGlmIChpc05hTihudW1iZXJWYWwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bWJlclZhbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldE1vZGFsRm9ybVpJbmRleChtb2RhbEZvcm1JZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNldE1vZGFsRm9ybVpJbmRleFwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW9kYWxGb3JtSWQ6XCIgKyBtb2RhbEZvcm1JZCk7XHJcbiAgICAgICAgdmFyIHpJbmRleCA9IDEwNTAgKyAoMTAgKiAkKCcubW9kYWw6dmlzaWJsZScpLmxlbmd0aCk7XHJcblxyXG4gICAgICAgICQobW9kYWxGb3JtSWQpLmNzcygnei1pbmRleCcsIHpJbmRleCk7XHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQoJy5tb2RhbC1iYWNrZHJvcCcpLm5vdCgnLm1vZGFsLXN0YWNrJykuY3NzKCd6LWluZGV4JywgekluZGV4IC0gMSkuYWRkQ2xhc3MoJ21vZGFsLXN0YWNrJyk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc0VtcHR5KHN0cjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuICghc3RyIHx8IHN0ci5sZW5ndGggPT09IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNVbkRlZmluZWQoX29iajogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuICghX29iaiB8fCBfb2JqID09PSBudWxsIHx8IHR5cGVvZiBfb2JqID09PSBcInVuZGVmaW5lZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFJlYWRWYXJpYWJsZUZyb21TdG9yYWdlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odmFyaWFibGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFdyaXRlVmFyaWFibGVUb1N0b3JhZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh2YXJpYWJsZU5hbWUsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGZpbHRlclRhYmxlUm93cyhmaWx0ZXJWYWw6IHN0cmluZywgaWRUYWJsZUVsZW1lbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJmaWx0ZXJUYWJsZVJvd3NcIik7XHJcblxyXG4gICAgICAgIGxldCB2YWwgPSAkLnRyaW0oZmlsdGVyVmFsKS5yZXBsYWNlKC8gKy9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgbGV0IHJvd3MgPSAkKGlkVGFibGVFbGVtZW50ICsgXCIgdHI6aGFzKHRkKVwiKTtcclxuXHJcbiAgICAgICAgcm93cy5zaG93KCkuZmlsdGVyKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHRleHQgPSAkKHRoaXMpLnRleHQoKS5yZXBsYWNlKC9cXHMrL2csICcgJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuICF+dGV4dC5pbmRleE9mKHZhbCk7XHJcbiAgICAgICAgfSkuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXMoZm9ybUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXNcIik7XHJcblxyXG4gICAgICAgIC8vIGJyZXogdGltZW91dCBmdW5rY2lqZSBmb2N1cyBuZSBkZWxhIDooXHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBmaXJzdEZvcm1Db250cm9sID0gJChmb3JtSWQgKyBcIiAuZm9ybS1jb250cm9sOnZpc2libGU6bm90KDpkaXNhYmxlZCk6Zmlyc3RcIik7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdEZvcm1Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdEZvcm1Db250cm9sLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVsYXRpdmVTaXRlVVJMKGNvbnRyb2xsZXI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IF91cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICBsZXQgaUMgPSBfdXJsLmluZGV4T2YoY29udHJvbGxlcik7XHJcbiAgICAgICAgaWYgKGlDID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gX3VybC5zdWJzdHJpbmcoMCwgaUMpICsgY29udHJvbGxlcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2l0ZUFic29sdXRlVVJMKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgY29udHJvbGxlciA9IHJlbGF0aXZlUGF0aC5zcGxpdChcIi9cIilbMF07XHJcbiAgICAgICAgbGV0IG1ldGhvZCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKGNvbnRyb2xsZXIsIFwiXCIpLnJlcGxhY2UoXCIvL1wiLCBcIlwiKTtcclxuXHJcbiAgICAgICAgLy8gxI1lIHJlbGF0aXZlIHBhdGggxb5lIHZzZWJ1amUgaHR0cCwgZ2EgbmUgZG9kYW1vXHJcbiAgICAgICAgaWYgKHJlbGF0aXZlUGF0aC5pbmRleE9mKFwiaHR0cFwiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZ2xvYmFsLmdldFNpdGVCYXNlVXJsKCkgKyBcIi9cIiArIGNvbnRyb2xsZXIgKyBtZXRob2Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyByZWxvZGVDdXJyZW50UGFnZSgpOiB2b2lkIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRIdG1sSW5wdXRTdHJpbmdWYWx1ZShwYXJlbnRJZDogc3RyaW5nLCBlbGVtZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRTZWxlY3RvciA9IHBhcmVudElkID09PSBudWxsID8gZWxlbWVudElkIDogcGFyZW50SWQgKyBcIiBcIiArIGVsZW1lbnRJZDtcclxuXHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKGVsZW1lbnRTZWxlY3RvcilcclxuICAgICAgICByZXR1cm4gZWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SHRtbElucHV0TnVtZXJpY1ZhbHVlKHBhcmVudElkOiBzdHJpbmcsIGVsZW1lbnRJZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMuZ2V0SHRtbElucHV0U3RyaW5nVmFsdWUocGFyZW50SWQsIGVsZW1lbnRJZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SHRtbElucHV0Qm9vbGVhblZhbHVlKHBhcmVudElkOiBzdHJpbmcsIGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SHRtbElucHV0U3RyaW5nVmFsdWUocGFyZW50SWQsIGVsZW1lbnRJZCkudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEpRdWVyeUlucHV0U3RyaW5nVmFsdWUoZWxlbWVudDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoZWxlbWVudC52YWwoKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SlF1ZXJ5SW5wdXROdW1lcmljVmFsdWUoZWxlbWVudDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+KTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc3RyVmFsID0gdGhpcy5nZXRKUXVlcnlJbnB1dFN0cmluZ1ZhbHVlKGVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChzdHJWYWwgPT0gbnVsbCB8fCB0aGlzLmlzRW1wdHkoc3RyVmFsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcihzdHJWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SlF1ZXJ5VGV4dEFyZWFTdHJpbmdWYWx1ZShlbGVtZW50OiBKUXVlcnk8SFRNTFRleHRBcmVhRWxlbWVudD4pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbCgpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRKUXVlcnlTZWxlY3RWYWx1ZShlbGVtZW50OiBKUXVlcnk8SFRNTFNlbGVjdEVsZW1lbnQ+KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoZWxlbWVudC52YWwoKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbWVudC52YWwoKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmdWYWx1ZUluU3RyaW5nVmFsdWVMaXN0KHN0cmluZ1ZhbHVlOiBzdHJpbmcsIHN0cmluZ1ZhbHVlTGlzdDogc3RyaW5nW10pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHN0cmluZ1ZhbHVlTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBzdHJpbmdWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0VmFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmV0VmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SlF1ZXJ5U2VsZWN0VGV4dChlbGVtZW50OiBKUXVlcnk8SFRNTFNlbGVjdEVsZW1lbnQ+KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoZWxlbWVudC52YWwoKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbWVudC5maW5kKFwib3B0aW9uOnNlbGVjdGVkXCIpLnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY29weVRvQ2xpcGJvYXJkKGNvcHlUZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb3B5VGV4dCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wQ2hlY2tib3hTd2l0Y2gge1xyXG5cclxuICAgIGluaXQocGFyZW50RWxlbWVudDogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHRoaXMuY2hlY2tib3hTd2l0Y2hPbkNsaWNrKHBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoTGFiZWxPbkNsaWNrKHBhcmVudEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrYm94U3dpdGNoT25DbGljayhwYXJlbnRFbGVtZW50OiBzdHJpbmcpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1zd2l0Y2gtY2hlY2tib3guLi5cIik7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3Atc3dpdGNoLWNoZWNrYm94IHBhcmVudEVsZW1lbnQ6IFwiICsgcGFyZW50RWxlbWVudCk7XHJcblxyXG4gICAgICAgIGxldCBfZnJhbWUgPSAkKFwiXCIgKyBwYXJlbnRFbGVtZW50ICsgXCIgKj4uc2FvcC1zd2l0Y2gtY2hlY2tib3hcIik7XHJcbiAgICAgICAgX2ZyYW1lLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgIF9mcmFtZS5jbGljayhmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICBsZXQgX2NoZWNrQm94ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgICBsZXQgX2F0clBhcmVudCA9IFwiI1wiKyQoX2NoZWNrQm94KS5hdHRyKFwiZm9yXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2NoZWNrQm94UCA9ICQoXCJcIiArIHBhcmVudEVsZW1lbnQgKyBcIiAqPlwiICsgX2F0clBhcmVudCk7XHJcbiAgICAgICAgICAgIGxldCBfbGFiZWwxID0gX2NoZWNrQm94UC5maW5kKFwiI3Nhb3Atc3dpdGNoLWxhYmVsMVwiKTtcclxuICAgICAgICAgICAgbGV0IF9sYWJlbDIgPSBfY2hlY2tCb3hQLmZpbmQoXCIjc2FvcC1zd2l0Y2gtbGFiZWwyXCIpO1xyXG4gICAgICAgICAgICBpZiAoX2NoZWNrQm94LmNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjaGVja2VkXCIpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMS5yZW1vdmVDbGFzcygnc3dpdGNoLWxhYmVsLW9uJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwxLmFkZENsYXNzKCdzd2l0Y2gtbGFiZWwtb2ZmJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwyLnJlbW92ZUNsYXNzKCdzd2l0Y2gtbGFiZWwtb2ZmJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwyLmFkZENsYXNzKCdzd2l0Y2gtbGFiZWwtb24nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJ1bmNoZWNrZWRcIik7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwxLnJlbW92ZUNsYXNzKCdzd2l0Y2gtbGFiZWwtb2ZmJyk7XHJcbiAgICAgICAgICAgICAgICBfbGFiZWwxLmFkZENsYXNzKCdzd2l0Y2gtbGFiZWwtb24nKTtcclxuICAgICAgICAgICAgICAgIF9sYWJlbDIucmVtb3ZlQ2xhc3MoJ3N3aXRjaC1sYWJlbC1vbicpO1xyXG4gICAgICAgICAgICAgICAgX2xhYmVsMi5hZGRDbGFzcygnc3dpdGNoLWxhYmVsLW9mZicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoTGFiZWxPbkNsaWNrKHBhcmVudEVsZW1lbnQ6IHN0cmluZykge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzYW9wLXN3aXRjaC1sYWJlbC4uLlwiKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1zd2l0Y2gtbGFiZWwgcGFyZW50RWxlbWVudDogXCIgKyBwYXJlbnRFbGVtZW50KTtcclxuXHJcbiAgICAgICAgbGV0IF9mcmFtZSA9ICQoXCJcIiArIHBhcmVudEVsZW1lbnQgKyBcIiAqPi5zYW9wLXN3aXRjaC1sYWJlbFwiKTtcclxuICAgICAgICBfZnJhbWUub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgX2ZyYW1lLmNsaWNrKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgIGxldCBfc3dpdGNoTGFiZWwgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBfYXRyQ2hlY2tCb3ggPSBcIiNcIiskKF9zd2l0Y2hMYWJlbCkuYXR0cihcImZvclwiKTtcclxuICAgICAgICAgICAgbGV0IF9jaGVja0JveCA9ICQoX2F0ckNoZWNrQm94KTtcclxuICAgICAgICAgICAgJChfY2hlY2tCb3gpLnByb3AoICdjaGVja2VkJywgJ2ZsYXNlJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEZsb2F0aW5nTGFiZWwge1xyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9mZihcImZvY3VzXCIsX3RoaXMuc2FvcElucHV0T25Gb2N1cyk7XHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vbihcImZvY3VzXCIsX3RoaXMuc2FvcElucHV0T25Gb2N1cyk7XHJcblxyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub2ZmKFwiYmx1clwiLF90aGlzLnNhb3BJbnB1dE9uQmx1cik7XHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vbihcImJsdXJcIixfdGhpcy5zYW9wSW5wdXRPbkJsdXIpO1xyXG4gICAgXHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vZmYoXCJmb2N1c291dFwiLF90aGlzLnNhb3BJbnB1dE9uQ2hhbmdlKTtcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9uKFwiZm9jdXNvdXRcIixfdGhpcy5zYW9wSW5wdXRPbkNoYW5nZSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHNhb3BJbnB1dE9uQ2hhbmdlKGU6YW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3AtZmxvYXRpbmctbGFiZWwuLi5zYW9wSW5wdXRPbkNoYW5nZVwiKTtcclxuICAgICAgICBsZXQgaHRtbEVsZW1lbnQgPSBlLnRhcmdldDtcclxuICAgICAgICBsZXQgX25vZGUgPSAkKFwiI1wiK2h0bWxFbGVtZW50LmlkKTtcclxuICAgICAgICBpZiAoX25vZGUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGxldCBfcGFyZW50TiA9IF9ub2RlLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoX3BhcmVudE4ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBfcGFyZW50Ti5yZW1vdmVDbGFzcyhcInNhb3AtZXJyb3ItaW5wdXRcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2xhYmVsID0gX3BhcmVudE4uZmluZChcIi50ZXh0LWRhbmdlclwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChfbGFiZWwubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgX2xhYmVsLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSAgICBcclxuXHJcbiAgICBzYW9wSW5wdXRPbkZvY3VzKGU6YW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3AtZmxvYXRpbmctbGFiZWwuLi5cIik7XHJcbiAgICAgICAgLy9iYXJ2YW5qZSBcImZsb2F0aW5nIGxhYmVsXCJcclxuICAgICAgICBsZXQgaHRtbEVsZW1lbnQgPSBlLnRhcmdldDtcclxuICAgICAgICBodG1sRWxlbWVudC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zYW9wLWZsb2F0aW5nLWxhYmVsJykuY2xhc3NMaXN0LmFkZChcInNhb3AtdHh0LXByaW1hcnlcIik7XHJcbiAgICB9XHJcbiAgICAgICAgXHJcbiAgICBzYW9wSW5wdXRPbkJsdXIoZTphbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1mbG9hdGluZy1sYWJlbC4uLlwiKTtcclxuICAgICAgICAvL2JhcnZhbmplIFwiZmxvYXRpbmcgbGFiZWxcIiBvbiBpbnB1dCBibHVyIChmb2N1cyBsb3N0KSBuYXphaiB2IHNpdm8gKHJlbW92ZSByYXpyZWQgXCJzYW9wLXR4dC1wcmltYXJ5XCIpXHJcbiAgICAgICAgbGV0IGh0bWxFbGVtZW50ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2FvcC1mbG9hdGluZy1sYWJlbCcpLmNsYXNzTGlzdC5yZW1vdmUoXCJzYW9wLXR4dC1wcmltYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzZXRDYXB0aW9uQXNSZXF1aXJlZChsYWJlbElkOnN0cmluZyxyZXF1aXJlZDpib29sZWFuKTp2b2lke1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQobGFiZWxJZCk7XHJcbiAgICAgICAgbGV0IF9lbGVtZW50VmFsID0gX2VsZW1lbnQudGV4dCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgX2VsZW1lbnRWYWwgPSBfZWxlbWVudFZhbC5yZXBsYWNlKFwiKlwiLFwiXCIpO1xyXG4gICAgICAgIGlmIChyZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBfZWxlbWVudC50ZXh0KF9lbGVtZW50VmFsK1wiKlwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfZWxlbWVudC50ZXh0KF9lbGVtZW50VmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9ICBcclxuXHJcbiAgICAvL1xyXG59Iiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlcy5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuY2xhc3Mgc2VsZWN0SXRlbSB7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5jbGFzcyBFZGl0YWJsZUNvbHVtbkRhdGEge1xyXG4gICAgdGlwOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RJdGVtczogc2VsZWN0SXRlbVtdO1xyXG4gICAgbnVtZXJpY01pblZhbHVlOiBudW1iZXI7XHJcbiAgICBudW1lcmljTWF4VmFsdWU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BXZWJHcmlkRWRpdCB7XHJcbiAgICBwdWJsaWMgbGliTmFtZTogc3RyaW5nOyAgXHJcblxyXG4gICAgcHJpdmF0ZSBfRWRpdGFibGVDb2x1bW5EYXRhOiBFZGl0YWJsZUNvbHVtbkRhdGE7XHJcbiAgICBwcml2YXRlIF90ZEVsZW1lbnQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICB9ICBcclxuXHJcbiAgICBzaG93V2ViR3JpZEVkaXRhYmxlQ29sdW1uRWRpdENvbnRyb2wodGRFbGVtZW50OiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuc2hvd1dlYkdyaWRFZGl0YWJsZUNvbHVtbkVkaXRDb250cm9sXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl90ZEVsZW1lbnQgPSB0ZEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHRkRWxlbWVudEh0bWwgPSB0aGlzLl90ZEVsZW1lbnQuaW5uZXJIVE1MO1xyXG5cclxuICAgICAgICBpZiAodGRFbGVtZW50SHRtbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyXCIpID49IDApIHtcclxuICAgICAgICAgICAgLy8gZWRpdCBrb250cm9sYSB6ZSBvYnN0YWphXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YSA9IHRoaXMuZ2V0RGF0YUF0dHJpYnV0ZSh0aGlzLl90ZEVsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLkFkZEVkaXRhYmxlQ29sdW1uRWRpdEh0bWwodGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhLnRpcCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSh0ZEVsZW1lbnQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5vbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IEVkaXRhYmxlQ29sdW1uRGF0YSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5nZXREYXRhQXR0cmlidXRlXCIpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IG5ldyBFZGl0YWJsZUNvbHVtbkRhdGEoKTtcclxuXHJcbiAgICAgICAgZGF0YS50aXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWRpdC10eXBlXCIpO1xyXG4gICAgICAgIGRhdGEuc2VsZWN0SXRlbXMgPSAkLnBhcnNlSlNPTihlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWRpdC1zZWxlY3QtaXRlbXNcIikpO1xyXG4gICAgICAgIGRhdGEubnVtZXJpY01pblZhbHVlID0gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXQtbnVtYmVyLW1pblwiKSk7XHJcbiAgICAgICAgZGF0YS5udW1lcmljTWF4VmFsdWUgPSBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWRpdC1udW1iZXItbWF4XCIpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBBZGRFZGl0YWJsZUNvbHVtbkVkaXRIdG1sKHRpcDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC5BZGRFZGl0YWJsZUNvbHVtbkVkaXRIdG1sXCIpO1xyXG5cclxuICAgICAgICBsZXQgdGRFbGVtZW50VGV4dCA9IHRoaXMuX3RkRWxlbWVudC5pbm5lclRleHQ7XHJcblxyXG4gICAgICAgIGxldCBpbnB1dCA9IHRoaXMuZ2V0SW5wdXRFbGVtZW50KHRpcCwgdGRFbGVtZW50VGV4dCk7XHJcblxyXG4gICAgICAgIGxldCBjb250YWluZXJDZWxsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgY29udGFpbmVyQ2VsbERpdi5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci1jZWxsXCIpO1xyXG4gICAgICAgIGNvbnRhaW5lckNlbGxEaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xyXG5cclxuICAgICAgICBsZXQgY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgY29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChjb250YWluZXJDZWxsRGl2KTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGRFbGVtZW50LmlubmVySFRNTCA9IGNvbnRhaW5lckRpdi5vdXRlckhUTUw7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0SW5wdXRFbGVtZW50QWZ0ZXJJbml0KHRpcCwgdGRFbGVtZW50VGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJbnB1dEVsZW1lbnQodGlwOiBzdHJpbmcsIGlucHV0VmFsdWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdldElucHV0RWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgc3dpdGNoICh0aXApIHtcclxuICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZW5lcmF0ZVRleHRIdG1sKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuZ2VuZXJhdGVUZXh0YXJlYUh0bWwoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuZ2VuZXJhdGVTZWxlY3RIdG1sKGlucHV0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZW5lcmF0ZU51bWJlckh0bWwoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0aGlzLmdlbmVyYXRlVGV4dEh0bWwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlVGV4dEh0bWwoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuZ2VuZXJhdGVUZXh0SHRtbFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICAgICAgICBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgaW5wdXQudHlwZSA9IFwidGV4dFwiO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGwtaW5wdXRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlVGV4dGFyZWFIdG1sKCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdlbmVyYXRlVGV4dGFyZWFIdG1sXCIpO1xyXG5cclxuICAgICAgICBsZXQgaW5wdXQ6IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcclxuICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwic2FvcC10YWJsZS1lZGl0LWNvbnRhaW5lci1jZWxsLWlucHV0XCIpO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGwtaW5wdXQtdGV4dGFyZWFcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH0gXHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVNlbGVjdEh0bWwoc2VsZWN0VmFsdWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LmdlbmVyYXRlU2VsZWN0SHRtbFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGlucHV0OiBIVE1MU2VsZWN0RWxlbWVudDtcclxuXHJcbiAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzYW9wLXRhYmxlLWVkaXQtY29udGFpbmVyLWNlbGwtaW5wdXRcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YS5zZWxlY3RJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlucHV0Lm9wdGlvbnMuYWRkKG5ldyBPcHRpb24oaXRlbS50ZXh0LCBpdGVtLnZhbHVlLCBzZWxlY3RWYWx1ZSA9PT0gaXRlbS52YWx1ZSkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZU51bWJlckh0bWwoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQuZ2VuZXJhdGVOdW1iZXJIdG1sXCIpO1xyXG5cclxuICAgICAgICBsZXQgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgICBpbnB1dC50eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgICBpZiAodGhpcy5fRWRpdGFibGVDb2x1bW5EYXRhLm51bWVyaWNNaW5WYWx1ZSkge1xyXG4gICAgICAgICAgICBpbnB1dC5taW4gPSB0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEubnVtZXJpY01pblZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9FZGl0YWJsZUNvbHVtbkRhdGEubnVtZXJpY01heFZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlucHV0Lm1heCA9IHRoaXMuX0VkaXRhYmxlQ29sdW1uRGF0YS5udW1lcmljTWF4VmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXItY2VsbC1pbnB1dFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0SW5wdXRFbGVtZW50QWZ0ZXJJbml0KHRpcDogc3RyaW5nLCB0ZEVsZW1lbnRUZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LnNldElucHV0RWxlbWVudEFmdGVySW5pdFwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRpcCA9PT0gXCJ0ZXh0XCIpIHtcclxuICAgICAgICAgICAgbGV0IHRkRWxlbWVudElucHV0ID0gdGhpcy5fdGRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF07XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LnZhbHVlID0gdGRFbGVtZW50VGV4dDtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQuZm9jdXMoKTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQub25ibHVyID0gdGhpcy53cml0ZUlucHV0VmFsdWVUb1RERWxlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aXAgPT09IFwidGV4dGFyZWFcIikge1xyXG4gICAgICAgICAgICBsZXQgdGRFbGVtZW50SW5wdXQgPSB0aGlzLl90ZEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZXh0YXJlYVwiKVswXTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQudmFsdWUgPSB0ZEVsZW1lbnRUZXh0O1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5vbmJsdXIgPSB0aGlzLndyaXRlVGV4dEFyZWFWYWx1ZVRvVERFbGVtZW50LmJpbmQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRpcCA9PT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgICBsZXQgdGRFbGVtZW50SW5wdXQgPSB0aGlzLl90ZEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzZWxlY3RcIilbMF07XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0Lm9uYmx1ciA9IHRoaXMud3JpdGVTZWxlY3RWYWx1ZVRvVERFbGVtZW50LmJpbmQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRpcCA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICBsZXQgdGRFbGVtZW50SW5wdXQgPSB0aGlzLl90ZEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKVswXTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQudmFsdWUgPSB0ZEVsZW1lbnRUZXh0O1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0ZEVsZW1lbnRJbnB1dC5vbmJsdXIgPSB0aGlzLndyaXRlTnVtYmVyVmFsdWVUb1RERWxlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRkRWxlbWVudElucHV0ID0gdGhpcy5fdGRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF07XHJcbiAgICAgICAgICAgIHRkRWxlbWVudElucHV0LnZhbHVlID0gdGRFbGVtZW50VGV4dDtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQuZm9jdXMoKTtcclxuICAgICAgICAgICAgdGRFbGVtZW50SW5wdXQub25ibHVyID0gdGhpcy53cml0ZUlucHV0VmFsdWVUb1RERWxlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHdyaXRlVmFsdWVUb1RERWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgaW5wdXRWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wV2ViR3JpZEVkaXQud3JpdGVWYWx1ZVRvVERFbGVtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGVtcEVsZW1lbnQgPSBlbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQgZWxlbWVudCwga2kgaW1hIGNsYXNzIHNhb3AtdGFibGUtZWRpdC1jb250YWluZXIuIE5qZWdvdiBwYXJlbnQgamUgVEQgZWxlbWVudC5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRlbXBFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInNhb3AtdGFibGUtZWRpdC1jb250YWluZXJcIikpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZEVsZW1lbnQgPSB0ZW1wRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgdGRFbGVtZW50LmlubmVySFRNTCA9IGlucHV0VmFsO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSh0aGlzLl90ZEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGVtcEVsZW1lbnQgPSB0ZW1wRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHdyaXRlSW5wdXRWYWx1ZVRvVERFbGVtZW50KHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC53cml0ZUlucHV0VmFsdWVUb1RERWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHRhcmdldDogSFRNTElucHV0RWxlbWVudCA9IHNlbmRlci50YXJnZXQ7XHJcbiAgICAgICAgbGV0IGlucHV0VmFsID0gdGFyZ2V0LnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBwb2lzY2VtbyBwYXJlbnQsIGtpIGplIFREIGVsZW1lbnQgaW4gdiBpbm5lcmh0bWwgdnBpc2VtbyB0ZXh0IHZhbHVlXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZVRvVERFbGVtZW50KHBhcmVudCwgaW5wdXRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd3JpdGVUZXh0QXJlYVZhbHVlVG9UREVsZW1lbnQoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFdlYkdyaWRFZGl0LndyaXRlVGV4dEFyZWFWYWx1ZVRvVERFbGVtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0OiBIVE1MVGV4dEFyZWFFbGVtZW50ID0gc2VuZGVyLnRhcmdldDtcclxuICAgICAgICBsZXQgaW5wdXRWYWwgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCwga2kgamUgVEQgZWxlbWVudCBpbiB2IGlubmVyIGh0bWwgdnBpc2VtbyB0ZXh0IHZhbHVlXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZVRvVERFbGVtZW50KHBhcmVudCwgaW5wdXRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd3JpdGVTZWxlY3RWYWx1ZVRvVERFbGVtZW50KHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC53cml0ZVNlbGVjdFZhbHVlVG9UREVsZW1lbnRcIik7XHJcblxyXG4gICAgICAgIGxldCB0YXJnZXQ6IEhUTUxTZWxlY3RFbGVtZW50ID0gc2VuZGVyLnRhcmdldDtcclxuICAgICAgICBsZXQgaW5wdXRWYWwgPSB0YXJnZXQudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjZW1vIHBhcmVudCwga2kgamUgVEQgZWxlbWVudCBpbiB2IGlubmVyIGh0bWwgdnBpc2VtbyB0ZXh0IHZhbHVlXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZVRvVERFbGVtZW50KHBhcmVudCwgaW5wdXRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd3JpdGVOdW1iZXJWYWx1ZVRvVERFbGVtZW50KHNlbmRlcjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BXZWJHcmlkRWRpdC53cml0ZU51bWJlclZhbHVlVG9UREVsZW1lbnRcIik7XHJcblxyXG4gICAgICAgIGxldCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBzZW5kZXIudGFyZ2V0O1xyXG4gICAgICAgIGxldCBpbnB1dFZhbCA9IHRhcmdldC52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBqZSBURCBlbGVtZW50IGluIHYgaW5uZXIgaHRtbCB2cGlzZW1vIHRleHQgdmFsdWVcclxuICAgICAgICBsZXQgcGFyZW50ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlVG9UREVsZW1lbnQocGFyZW50LCBpbnB1dFZhbCk7XHJcbiAgICB9XHJcbiAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2RhdGEtdGFibGVzL3R5cGVzLmQudHNcIiAvPlxyXG5pbXBvcnQgeyBTYW9wSW5wdXRXRkwsU2FvcElucHV0V0ZMUHJvcGVydGllcyB9IGZyb20gJy4vc2FvcC1pbnB1dC13ZmwnXHJcbmltcG9ydCB7IFNhb3BzZWxlY3RXRkwgfSBmcm9tICcuL3Nhb3Atc2VsZWN0LXdmbCdcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wV2ViR3JpZEZpbHRlciB7XHJcbiAgcHVibGljIGlkOnN0cmluZyA9IFwid2dmMVwiO1xyXG4gIHB1YmxpYyBtb2RhbEZpbHRlckFycmF5OiBhbnkgPSBbXTtcclxuICAvL1RoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGNvbnRlbnQgaW5zaWRlIHRoZSBmaWx0ZXIgbW9kYWxcclxuICBjb25maWdGaWx0ZXIobGliTmFtZTpzdHJpbmcsaHRtbFRhYmxlOiBhbnksIGNvbEFycmF5OiBhbnkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRhYmxlTmFtZSA9IGh0bWxUYWJsZVswXS5pZDtcclxuICAgICAgdmFyIGNvbHVtbnMgPSBodG1sVGFibGUuYXBpKCkuY29sdW1ucygpO1xyXG4gICAgICAkLmVhY2goY29sQXJyYXksIGZ1bmN0aW9uIChpLCBhcmcpIHtcclxuICAgICAgICBsZXQgX2NvbE5vID0gYXJnLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgJCgnIycgKyB0YWJsZU5hbWUgKyAnIHRoOmVxKCcgKyBfY29sTm8gKyAnKScpLmF0dHIoXCJpZFwiLFwiY29sdW1uLWhlYWRlci1cIisgX2NvbE5vICtcIlwiKTtcclxuICAgICAgICAkKCcjJyArIHRhYmxlTmFtZSArICcgdGg6ZXEoJyArIF9jb2xObyArICcpJykuYXBwZW5kKCc8c3BhbiBpZD1cImNvbHVtbi1oZWFkZXItJysgX2NvbE5vICsnLWZpbHRlclwiIGNsYXNzPVwic2FvcC1pbWctZmlsdGVyIHNpLXhzXCIgb25jbGljaz1cIicrbGliTmFtZSsnLndlYkdyaWRGaWx0ZXIuc2hvd0ZpbHRlcihldmVudCxcXCcnICsgdGFibGVOYW1lICsgJ18nICsgX2NvbE5vICsgJ1xcJyk7XCI+PC9zcGFuPicpO1xyXG4gICAgICAgICQoJyMnICsgdGFibGVOYW1lICsgJyB0aDplcSgnICsgX2NvbE5vICsgJyknKS5hcHBlbmQoXCI8c3BhbiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2NvbE5vICtcIi1zb3J0JyBjbGFzcz0nJz4mbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+XCIpO1xyXG4gICAgICAgICQoJyMnICsgdGFibGVOYW1lICsgJyB0aDplcSgnICsgX2NvbE5vICsgJyknKS5hcHBlbmQoXCI8ZGl2IGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfY29sTm8gK1wiLXNpemVyJz5cIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdmFyIHRlbXBsYXRlID1cclxuICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsRmlsdGVyXCI+JyArXHJcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+JyArXHJcbiAgICAgICAgJ3swfTwvZGl2PicgK1xyXG4gICAgICAgICc8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+JyArXHJcbiAgICAgICAgJzxhIGhyZWY9XCIjIVwiIG9uY2xpY2s9XCInK2xpYk5hbWUrJy53ZWJHcmlkRmlsdGVyLnBlcmZvcm1GaWx0ZXIodGhpcywgezF9LCBcXCd7Mn1cXCcpO1wiICBjbGFzcz1cIiBidG4gcmlnaHQgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0XCI+ViByZWR1PC9hPicgKyAgICAgICAgXHJcbiAgICAgICAgJzxhIGhyZWY9XCIjIVwiIG9uY2xpY2s9XCInK2xpYk5hbWUrJy53ZWJHcmlkRmlsdGVyLmNsZWFyRmlsdGVyKHRoaXMsIHsxfSwgXFwnezJ9XFwnKTtcIiAgY2xhc3M9XCIgYnRuIGxlZnQgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0XCI+WmJyacWhaTwvYT4nICtcclxuICAgICAgICAnPGEgaHJlZj1cIiMhXCIgb25jbGljaz1cIicrbGliTmFtZSsnLndlYkdyaWRGaWx0ZXIuaGlkZUZpbHRlcigpO1wiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgY2xhc3M9XCIgYnRuIGxlZnQgd2F2ZXMtZWZmZWN0IHdhdmVzLWxpZ2h0XCI+UHJla2xpxI1pPC9hPicgK1xyXG4gICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAnPC9kaXY+JztcclxuXHJcbiAgICAgICQuZWFjaChjb2xBcnJheSwgZnVuY3Rpb24gKGluZGV4OiBhbnksIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBjb2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChpOiBhbnkpIHtcclxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gaSkge1xyXG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcywgXHJcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnJzsvLyc8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZpbHRlclNlYXJjaFRleHRcIiBvbmtleXVwPVwiZmlsdGVyVmFsdWVzKHRoaXMpXCIgLz4gPGJyLz4nO1xyXG4gICAgICAgICAgICB2YXIgY29sdW1uTmFtZSA9ICQodGhpcy5oZWFkZXIoKSkudGV4dCgpLnJlcGxhY2UoL1xccysvZywgXCJfXCIpO1xyXG4gICAgICAgICAgICB2YXIgZGlzdGluY3RBcnJheTogYW55W10gPSBbXTtcclxuICAgICAgICAgICAgY29sdW1uLmRhdGEoKS5lYWNoKGZ1bmN0aW9uIChkOiBzdHJpbmcsIGo6IGFueSkge1xyXG4gICAgICAgICAgICAgIGlmIChkaXN0aW5jdEFycmF5LmluZGV4T2YoZCkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpZCA9IHRhYmxlTmFtZSArIFwiX1wiICsgY29sdW1uTmFtZSArIFwiX1wiICsgajsgLy8gb25jaGFuZ2U9XCJmb3JtYXRWYWx1ZXModGhpcywnICsgdmFsdWUgKyAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJzxkaXY+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwiJyArIGQgKyAnXCIgIGlkPVwiJyArIGlkICsgJ1wiLz48bGFiZWwgZm9yPVwiJyArIGlkICsgJ1wiPiAnICsgZCArICc8L2xhYmVsPjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICBkaXN0aW5jdEFycmF5LnB1c2goZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTsgXHJcbiAgICAgICAgICAgIHZhciBuZXdUZW1wbGF0ZSA9ICQodGVtcGxhdGUucmVwbGFjZSgnezB9JywgY29udGVudCkucmVwbGFjZSgnezF9JywgdmFsdWUpLnJlcGxhY2UoJ3sxfScsIHZhbHVlKS5yZXBsYWNlKCd7Mn0nLCB0YWJsZU5hbWUpLnJlcGxhY2UoJ3syfScsIHRhYmxlTmFtZSkpO1xyXG4gICAgICAgICAgICAkKCdib2R5JykuYXBwZW5kKG5ld1RlbXBsYXRlKTtcclxuICAgICAgICAgICAgX3RoaXMubW9kYWxGaWx0ZXJBcnJheVt0YWJsZU5hbWUgKyBcIl9cIiArIHZhbHVlXSA9IG5ld1RlbXBsYXRlO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgNTApO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvL1VzZXIgdG8gc2hvdyB0aGUgZmlsdGVyIG1vZGFsXHJcbiAgc2hvd0ZpbHRlcihlOiBhbnksIGluZGV4OiBhbnkpIHtcclxuICAgICQoJy5tb2RhbEZpbHRlcicpLmhpZGUoKTtcclxuICAgICQodGhpcy5tb2RhbEZpbHRlckFycmF5W2luZGV4XSkuY3NzKHsgbGVmdDogMCwgdG9wOiAwIH0pO1xyXG4gICAgdmFyIHRoID0gJChlLnRhcmdldCkucGFyZW50KCk7XHJcbiAgICB2YXIgcG9zID0gdGgub2Zmc2V0KCk7XHJcbiAgICBsZXQgYXJyYXlJdGVtID0gdGhpcy5tb2RhbEZpbHRlckFycmF5W2luZGV4XTtcclxuICAgIC8vJCh0aGlzLm1vZGFsRmlsdGVyQXJyYXlbaW5kZXhdKS53aWR0aCh0aC53aWR0aCgpICogMC43NSk7XHJcbiAgICAkKGFycmF5SXRlbSkuY3NzKHsgJ2xlZnQnOiBwb3MubGVmdCwgJ3RvcCc6IHBvcy50b3AsICdtaW4td2lkdGgnOih0aC53aWR0aCgpICogMC43NSkgfSk7XHJcbiAgICAkKGFycmF5SXRlbSkuc2hvdygpO1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRhYmxlSGVhZGVyU3RhdHVzKHRhYmxlSWQ6c3RyaW5nLGNvbHVtbklkOnN0cmluZyxhY3RpdmVGaWx0ZXI6Ym9vbGVhbil7XHJcbiAgICBsZXQgX2NvbEZpbHRlcklkID0gY29sdW1uSWQrXCItZmlsdGVyXCI7XHJcbiAgICBsZXQgX2NvbEZpbHRlciA9ICQodGFibGVJZCkuZmluZChfY29sRmlsdGVySWQpWzBdO1xyXG4gICAgbGV0IF9jb2xGaWx0ZXJBdHIgPSBfY29sRmlsdGVyLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xyXG4gICAgaWYoYWN0aXZlRmlsdGVyKXtcclxuICAgICAgICBfY29sRmlsdGVyQXRyLnJlcGxhY2UoXCJzYW9wLWltZy1maWx0ZXJcIiwgXCJzYW9wLWltZy1maWx0ZXIgc2FvcC1jbC1ibHVlXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBfY29sRmlsdGVyQXRyLnJlcGxhY2UoXCJzYW9wLWltZy1maWx0ZXIgc2FvcC1jbC1ibHVlXCIsIFwic2FvcC1pbWctZmlsdGVyXCIpO1xyXG4gICBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vVGhpcyBmdW5jdGlvbiBpcyB0byB1c2UgdGhlIHNlYXJjaGJveCB0byBmaWx0ZXIgdGhlIGNoZWNrYm94XHJcbiAgZmlsdGVyVmFsdWVzKG5vZGU6IGFueSkge1xyXG4gICAgdmFyIHNlYXJjaFN0cmluZyA9ICQobm9kZSkudmFsKCkudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLnRyaW0oKTtcclxuICAgIHZhciByb290Tm9kZSA9ICQobm9kZSkucGFyZW50KCk7XHJcbiAgICBpZiAoc2VhcmNoU3RyaW5nID09ICcnKSB7XHJcbiAgICAgIHJvb3ROb2RlLmZpbmQoJ2RpdicpLnNob3coKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJvb3ROb2RlLmZpbmQoXCJkaXZcIikuaGlkZSgpO1xyXG4gICAgICByb290Tm9kZS5maW5kKFwiZGl2OmNvbnRhaW5zKCdcIiArIHNlYXJjaFN0cmluZyArIFwiJylcIikuc2hvdygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9FeGVjdXRlIHRoZSBmaWx0ZXIgb24gdGhlIHRhYmxlIGZvciBhIGdpdmVuIGNvbHVtblxyXG4gIHBlcmZvcm1GaWx0ZXIobm9kZTogYW55LCBpOiBhbnksIHRhYmxlSWQ6IGFueSkge1xyXG4gICAgdmFyIHJvb3ROb2RlID0gJChub2RlKS5wYXJlbnQoKS5wYXJlbnQoKTtcclxuICAgIHZhciBzZWFyY2hTdHJpbmcgPSAnJywgY291bnRlciA9IDA7XHJcblxyXG4gICAgcm9vdE5vZGUuZmluZCgnaW5wdXQ6Y2hlY2tib3gnKS5lYWNoKGZ1bmN0aW9uIChpbmRleDogYW55LCBjaGVja2JveDogYW55KSB7XHJcbiAgICAgIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICAgICAgc2VhcmNoU3RyaW5nICs9IChjb3VudGVyID09IDApID8gY2hlY2tib3gudmFsdWUgOiAnfCcgKyBjaGVja2JveC52YWx1ZTtcclxuICAgICAgICBjb3VudGVyKys7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBfY29sSWQgPSBcIiNjb2x1bW4taGVhZGVyLVwiK2kudG9TdHJpbmcoKTtcclxuICAgIGlmKGNvdW50ZXIgPiAwKXtcclxuICAgICAgdGhpcy51cGRhdGVUYWJsZUhlYWRlclN0YXR1cygnIycgK3RhYmxlSWQsX2NvbElkLHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51cGRhdGVUYWJsZUhlYWRlclN0YXR1cygnIycgK3RhYmxlSWQsX2NvbElkLGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAkKCcjJyArIHRhYmxlSWQpLkRhdGFUYWJsZSgpLmNvbHVtbihpKS5zZWFyY2goXHJcbiAgICAgIHNlYXJjaFN0cmluZyxcclxuICAgICAgdHJ1ZSwgZmFsc2VcclxuICAgICkuZHJhdygpO1xyXG4gICAgcm9vdE5vZGUuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgLy9SZW1vdmVzIHRoZSBmaWx0ZXIgZnJvbSB0aGUgdGFibGUgZm9yIGEgZ2l2ZW4gY29sdW1uXHJcbiAgY2xlYXJGaWx0ZXIobm9kZTogYW55LCBpOiBhbnksIHRhYmxlSWQ6IGFueSkge1xyXG4gICAgdmFyIHJvb3ROb2RlID0gJChub2RlKS5wYXJlbnQoKS5wYXJlbnQoKTtcclxuICAgIHJvb3ROb2RlLmZpbmQoXCIuZmlsdGVyU2VhcmNoVGV4dFwiKS52YWwoJycpO1xyXG4gICAgcm9vdE5vZGUuZmluZCgnaW5wdXQ6Y2hlY2tib3gnKS5lYWNoKGZ1bmN0aW9uIChpbmRleDogYW55LCBjaGVja2JveDogYW55KSB7XHJcbiAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgJChjaGVja2JveCkucGFyZW50KCkuc2hvdygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IF9jb2xJZCA9IFwiI2NvbHVtbi1oZWFkZXItXCIraS50b1N0cmluZygpO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUhlYWRlclN0YXR1cygnIycgK3RhYmxlSWQsX2NvbElkLGZhbHNlKTtcclxuXHJcbiAgICAkKCcjJyArIHRhYmxlSWQpLkRhdGFUYWJsZSgpLmNvbHVtbihpKS5zZWFyY2goXHJcbiAgICAgICcnLFxyXG4gICAgICB0cnVlLCBmYWxzZVxyXG4gICAgKS5kcmF3KCk7XHJcbiAgICByb290Tm9kZS5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICBoaWRlRmlsdGVyKG5vZGU6IGFueSwgaTogYW55LCB0YWJsZUlkOiBhbnkpIHtcclxuICAgICQoJy5tb2RhbEZpbHRlcicpLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIHNldFJlc2l6ZUV2ZW50KGdyaWRJZDpzdHJpbmcpe1xyXG4gICAgdmFyIF90YWJsZURpdiA9ICQoXCJ0YWJsZVwiK2dyaWRJZCtcIiB0aFwiKSBhcyBhbnk7XHJcblx0ICB2YXIgdGhIZWlnaHQgPSAkKFwidGFibGVcIitncmlkSWQrXCIgdGg6Zmlyc3RcIikuaGVpZ2h0KCk7XHJcblx0ICBfdGFibGVEaXYucmVzaXphYmxlKHtcclxuXHRcdCAgaGFuZGxlczogXCJlXCIsXHJcblx0XHQgIG1pbkhlaWdodDogdGhIZWlnaHQsXHJcblx0XHQgIG1heEhlaWdodDogdGhIZWlnaHQsXHJcblx0XHQgIG1pbldpZHRoOiA0MCxcclxuXHRcdCAgcmVzaXplOiBmdW5jdGlvbiAoZXZlbnQ6YW55LCB1aTphbnkpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInJlc2l6ZS4uLlwiKTtcclxuICAgICAgICB2YXIgc2l6ZXJpZCA9IFwiI1wiICsgJChldmVudC50YXJnZXQpLmF0dHIoXCJpZFwiKSArIFwiLXNpemVyXCI7XHJcbiAgICAgICAgJChzaXplcmlkKS53aWR0aCh1aS5zaXplLndpZHRoKTtcclxuXHRcdCAgfVxyXG5cdCAgfSk7ICAgIFxyXG4gIH1cclxuXHJcbiAgc2V0U29ydEVsZW1lbnRFdmVudChncmlkSWQ6IHN0cmluZyk6dm9pZHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAkKGdyaWRJZCkub24oJ2NsaWNrJywgJ3RoJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICBfdGhpcy5zZXRTb3J0RWxlbWVudChncmlkSWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIHNldFNvcnRFbGVtZW50KGdyaWRJZDogc3RyaW5nKTp2b2lkIHtcclxuICAgICAgJChcIlwiICsgZ3JpZElkICsgXCIgdGhlYWQ6Zmlyc3QgdGhcIikuZWFjaChmdW5jdGlvbiAoaSwgdGgpIHtcclxuICAgICAgICBsZXQgX2NvbCA9ICQodGgpO1xyXG4gICAgICAgIGxldCBfY29sSWQgPSBcIiNcIitfY29sLmF0dHIoJ2lkJyk7XHJcbiAgICAgICAgLy9sZXQgX3NvcnRUeXBlID0gX2NvbC5hdHRyKFwiY29sdW1uLXNvcnRcIik7XHJcbiAgICAgICAgbGV0IF9jb2xJY29uSWRVcCA9IF9jb2xJZCtcIi1pY29uLXVwXCI7XHJcbiAgICAgICAgbGV0IF9jb2xJY29uSWQgPSBfY29sSWQrXCItaWNvblwiO1xyXG4gICAgICAgIGxldCBfY29sSWNvblVwRWxlbWVudCA9ICQoZ3JpZElkKycgJytfY29sSWNvbklkVXApO1xyXG4gICAgICAgIGxldCBfY29sSWNvbkVsZW1lbnQgPSAkKGdyaWRJZCsnICcrX2NvbEljb25JZCk7XHJcbiAgICAgICAgbGV0IGNscyA9ICQodGgpLmF0dHIoJ2NsYXNzJyk7XHJcblxyXG4gICAgICAgIC8vaWYgKF9zb3J0VHlwZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoY2xzICE9IG51bGwgJiYgY2xzLmluZGV4T2YoXCJuby1zb3J0XCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTsgICAgICAgICBcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1jbC1ibHVlXCIpOyAgICAgICAgICAgICBcclxuICAgICAgICAgIH0gICAgICAgICAgXHJcbiAgICAgICAgICBlbHNlIGlmIChjbHMgIT0gbnVsbCAmJiBjbHMuaW5kZXhPZihcInNvcnRpbmdfYXNjXCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cCBzYW9wLWNsLWJsdWVcIik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNscyAhPSBudWxsICYmIGNscy5pbmRleE9mKFwic29ydGluZ19kZXNjXCIpID49IDApIHtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LmFkZENsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93biBzYW9wLWNsLWJsdWVcIik7ICAgICAgICAgICAgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1pbWctYXJyb3ctZG93blwiKTsgICAgICAgICBcclxuICAgICAgICAgICAgX2NvbEljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwic2FvcC1jbC1ibHVlXCIpOyAgIFxyXG4gICAgICAgICAgICBfY29sSWNvbkVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy11cFwiKTtcclxuICAgICAgICAgICAgX2NvbEljb25VcEVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWltZy1hcnJvdy1kb3duXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIC8vfVxyXG4gICAgICB9KTtcclxuICB9IFxyXG5cclxuICBjb25maWdTaW1wbGVGaWx0ZXIoZGF0YVRhYmxlOiBhbnkpOnZvaWQge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCB0YWJsZUlkID0gXCIjXCIrZGF0YVRhYmxlWzBdLmlkO1xyXG4gICAgbGV0IF9pQ291bnQgPSAwO1xyXG4gICAgdmFyIF9maWx0ZXJFbmFibGUgPSBmYWxzZTtcclxuICAgIGxldCBfdGhfY29sdW1ucyA9ICQodGFibGVJZCkuZmluZCgndGgnKTtcclxuICAgIF90aF9jb2x1bW5zLmVhY2goIFxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgX2lDb3VudCA9IF9pQ291bnQgKyAxO1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcyk7XHJcbiAgICAgICAgbGV0IF9maWx0ZXJUeXBlID0gX2VsZW1lbnQuYXR0cihcImNvbHVtbi1maWx0ZXJcIik7ICAgXHJcbiAgICAgICAgbGV0IF9ub3NvcnQgPSBfZWxlbWVudC5oYXNDbGFzcyhcIm5vLXNvcnRcIik7XHJcbiAgICAgICAgbGV0IF9hY3Rpb25Db2x1bW4gPSBfZWxlbWVudC5oYXNDbGFzcyhcInNhb3AtdGFibGUtdGgtbGFzdFwiKTtcclxuICAgICAgICBfZWxlbWVudC5hdHRyKFwiaWRcIixcImNvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiXCIpO1xyXG4gICAgICAgIF9lbGVtZW50LmNzcyhcIm91dGxpbmVcIixcIm5vbmVcIik7XHJcbiAgICAgICAgbGV0IGNvbF90aXRsZSA9IF9lbGVtZW50LnRleHQoKTtcclxuICAgICAgICAvL2xldCBjb2xfbWF4X3dpZHRoID0gY29sX3RpdGxlLmxlbmd0aCAqIDc7XHJcbiAgICAgICAgX2VsZW1lbnQudGV4dChcIlwiKTtcclxuXHJcbiAgICAgICAgLy9fZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGNsYXNzPSdzYW9wLXRhYmxlLWhlYWRlci1jYXB0aW9uIHNhb3AtdGFibGUtdGV4dC10cnVuY2F0ZScgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWNhcHRpb24nIHN0eWxlPSdtYXgtd2lkdGg6XCIrY29sX21heF93aWR0aC50b1N0cmluZygpK1wicHggIWltcG9ydGFudDsnPlwiK2NvbF90aXRsZStcIjwvZGl2PlwiKTtcclxuICAgICAgICBfZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGNsYXNzPSdzYW9wLXRhYmxlLWhlYWRlci1jYXB0aW9uIHNhb3AtdGFibGUtdGV4dC10cnVuY2F0ZScgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWNhcHRpb24nPlwiK2NvbF90aXRsZStcIjwvZGl2PlwiKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoX2ZpbHRlclR5cGUgIT0gbnVsbCAmJiBfZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpID09IFwidGV4dFwiKXtcclxuICAgICAgICAgIF9maWx0ZXJFbmFibGUgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoX2ZpbHRlclR5cGUgIT0gbnVsbCAmJiBfZmlsdGVyVHlwZS50b0xvd2VyQ2FzZSgpID09IFwiZHJvcGRvd25cIil7XHJcbiAgICAgICAgICBfZmlsdGVyRW5hYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfYWN0aW9uQ29sdW1uICE9IG51bGwgJiYgX2FjdGlvbkNvbHVtbiA9PSB0cnVlKXtcclxuICAgICAgICAgIF9ub3NvcnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF9ub3NvcnQgPT0gbnVsbCB8fF9ub3NvcnQgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgX2VsZW1lbnQuYXBwZW5kKFwiPGRpdiBpZD0nY29sdW1uLWhlYWRlci1cIisgX2lDb3VudCArXCItaWNvbicgc3R5bGU9J2Zsb2F0OiByaWdodDtoZWlnaHQ6IDIwcHg7d2lkdGg6IDIwcHg7ZGlzcGxheTogaW5saW5lLWZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjsnPlwiKTtcclxuICAgICAgICAgIF9lbGVtZW50LmFwcGVuZChcIjxkaXYgaWQ9J2NvbHVtbi1oZWFkZXItXCIrIF9pQ291bnQgK1wiLWljb24tdXAnIHN0eWxlPSdmbG9hdDogcmlnaHQ7aGVpZ2h0OiAyMHB4O3dpZHRoOiA1cHg7ZGlzcGxheTogaW5saW5lLWZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjsnPlwiKTsgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBfZWxlbWVudC5hcHBlbmQoXCI8ZGl2IGlkPSdjb2x1bW4taGVhZGVyLVwiKyBfaUNvdW50ICtcIi1zaXplcic+XCIpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGlmIChfZmlsdGVyRW5hYmxlKSB7XHJcbiAgICAgICQodGFibGVJZCsnIHRoZWFkIHRyJylcclxuICAgICAgLmNsb25lKHRydWUpXHJcbiAgICAgIC5hZGRDbGFzcygnZmlsdGVycycpXHJcbiAgICAgIC5hcHBlbmRUbyh0YWJsZUlkKycgdGhlYWQnKTtcclxuXHJcbiAgICAgIC8vIFNldHVwIC0gYWRkIGEgdGV4dCBpbnB1dCB0byBlYWNoIGZvb3RlciBjZWxsXHJcbiAgICAgIGxldCBfZmlsdGVycyA9ICQodGFibGVJZCkuZmluZCgnLmZpbHRlcnMnKTtcclxuICAgICAgbGV0IF9maWx0ZXJzX3RoID0gX2ZpbHRlcnMuZmluZCgndGgnKTtcclxuICAgICAgX2lDb3VudCA9IDA7XHJcbiAgICAgIF9maWx0ZXJzX3RoLmVhY2goIFxyXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIF9pQ291bnQgPSBfaUNvdW50ICsgMTtcclxuICAgICAgICAgIGxldCBfZWxlbWVudCA9ICQodGhpcyk7XHJcbiAgICAgICAgICBfZWxlbWVudC5vZmYoKTtcclxuXHJcbiAgICAgICAgICBfZWxlbWVudC5odG1sKFwiXCIpO1xyXG5cclxuICAgICAgICAgIGxldCBfZmlsdGVyVHlwZSA9IF9lbGVtZW50LmF0dHIoXCJjb2x1bW4tZmlsdGVyXCIpO1xyXG5cclxuICAgICAgICAgIHdoaWxlKF9lbGVtZW50WzBdLmF0dHJpYnV0ZXMubGVuZ3RoID4gMClcclxuICAgICAgICAgIF9lbGVtZW50WzBdLnJlbW92ZUF0dHJpYnV0ZShfZWxlbWVudFswXS5hdHRyaWJ1dGVzWzBdLm5hbWUpO1xyXG5cclxuICAgICAgICAgIGxldCBfY29sSWQgPSBcImNvbF9cIitfaUNvdW50LnRvU3RyaW5nKCk7ICAgICAgICBcclxuICAgICAgICAgIF9lbGVtZW50LmF0dHIoXCJpZFwiLF9jb2xJZCk7XHJcbiAgICAgICAgICBsZXQgX2lucHV0SWQgPSBfY29sSWQrXCJfZmlsdGVyXCI7ICAgICAgICBcclxuICAgICAgICAgIGxldCB0aXRsZSA9IF9lbGVtZW50LnRleHQoKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYgKF9maWx0ZXJUeXBlICE9IG51bGwgJiYgX2ZpbHRlclR5cGUudG9Mb3dlckNhc2UoKSA9PSBcInRleHRcIil7XHJcbiAgICAgICAgICAgIGxldCBfaW5wdXRFID0gbmV3IFNhb3BJbnB1dFdGTCh7aWQ6X2lucHV0SWQsY2FwdGlvbjp0aXRsZSxwbGFjZWhvbGRlcjp0aXRsZX0pLmdldElubmVySHRtbCgpO1xyXG4gICAgICAgICAgICBfZWxlbWVudC5odG1sKF9pbnB1dEUpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChfZmlsdGVyVHlwZSAhPSBudWxsICYmIF9maWx0ZXJUeXBlLnRvTG93ZXJDYXNlKCkgPT0gXCJkcm9wZG93blwiKXtcclxuICAgICAgICAgICAgbGV0IF9zZWxlY3RJZCA9IF9jb2xJZCtcIl9zZWxlY3RcIjsgICBcclxuICAgICAgICAgICAgbGV0IHNlbGVjdEh0bWwgPSBuZXcgU2FvcHNlbGVjdFdGTCh7aWQ6X3NlbGVjdElkLGNhcHRpb246XCJcIixwbGFjZWhvbGRlcjpcIlwifSkuZ2V0SW5uZXJIdG1sKCk7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3QgPSAkKHNlbGVjdEh0bWwpOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL1xyXG5cclxuICAgICAgICAgICAgbGV0IF9pbmRleCA9IF9pQ291bnQ7XHJcbiAgICAgICAgICAgIF9pbmRleCA9IF9pbmRleCAtIDE7XHJcblxyXG4gICAgICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLmRhdGEoKVxyXG4gICAgICAgICAgICAudW5pcXVlKClcclxuICAgICAgICAgICAgLnNvcnQoKVxyXG4gICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZDphbnksIGo6YW55KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGQubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2NvbnRlbnQgPSBkO1xyXG4gICAgICAgICAgICAgICAgbGV0IF9maXJzdENoYXIgPSBfY29udGVudFswXTtcclxuICAgICAgICAgICAgICAgIGlmIChfZmlyc3RDaGFyLmNoYXJDb2RlQXQoMCkgPiAxMDAwKSB7X2NvbnRlbnQgPSBfY29udGVudC5yZXBsYWNlKF9maXJzdENoYXIrXCIgXCIsXCJcIik7fVxyXG4gICAgICAgICAgICAgICAgc2VsZWN0LmZpbmQoJ3NlbGVjdCcpLmxhc3QoKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCInICsgZCArICdcIj4nICsgX2NvbnRlbnQgKyAnPC9vcHRpb24+Jyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIF9lbGVtZW50LmFwcGVuZChzZWxlY3QpO1xyXG4gICAgICAgICAgfSAgICBcclxuICAgICAgICB9IFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gQXBwbHkgdGhlIGZpbHRlclxyXG4gICAgICAkKHRhYmxlSWQrXCIgdGhlYWQgaW5wdXRcIikub24oICdrZXl1cCBjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IF9pbmRleCA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkuaW5kZXgoKTtcclxuICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLnNlYXJjaCggdGFyZ2V0LnZhbHVlIClcclxuICAgICAgICAgICAgLmRyYXcoKTtcclxuXHJcbiAgICAgICAgLy92YXIgdmFsID0gJC5mbi5kYXRhVGFibGUudXRpbC5lc2NhcGVSZWdleCh0YXJnZXQudmFsdWUpO1xyXG4gICAgICAgIC8vZGF0YVRhYmxlLkRhdGFUYWJsZSgpLnNlYXJjaCh2YWwgPyAnXicgKyB2YWwgKyAnJCcgOiAnJywgdHJ1ZSwgZmFsc2UpLmRyYXcoKTtcclxuXHJcbiAgICAgIH0gKTsgICAgXHJcbiBcclxuICAgICAgLy8gQXBwbHkgdGhlIGRyb3Bkb3duIGZpbHRlclxyXG4gICAgICAkKHRhYmxlSWQrXCIgdGhlYWQgc2VsZWN0XCIpLm9uKCAnY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGxldCBfaW5kZXggPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLmluZGV4KCk7XHJcbiAgICAgICAgdmFyIHZhbCA9ICQuZm4uZGF0YVRhYmxlLnV0aWwuZXNjYXBlUmVnZXgodGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICBkYXRhVGFibGUuRGF0YVRhYmxlKClcclxuICAgICAgICAgICAgLmNvbHVtbihfaW5kZXgrJzp2aXNpYmxlJylcclxuICAgICAgICAgICAgLnNlYXJjaCh2YWwgPyAnXicgKyB2YWwgKyAnJCcgOiAnJywgdHJ1ZSwgZmFsc2UpXHJcbiAgICAgICAgICAgIC5kcmF3KCk7XHJcbiAgICAgIH0gKTsgIFxyXG5cclxuICAgICAgLy9cclxuICAgIH1cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgY29uZmlnU2ltcGxlU29ydChncmlkSWQ6IHN0cmluZyk6dm9pZCB7XHJcbiAgICB0aGlzLnNldFNvcnRFbGVtZW50KGdyaWRJZCk7XHJcbiAgICB0aGlzLnNldFNvcnRFbGVtZW50RXZlbnQoZ3JpZElkKTtcclxuICB9XHJcblxyXG4gIC8vXHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9kYXRhLXRhYmxlcy90eXBlcy5kLnRzXCIgLz5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZEZpbHRlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtZ3JpZC1maWx0ZXJcIjtcclxuaW1wb3J0IHsgRGF0YVRhYmxlcyB9IGZyb20gXCIuLi9AdHlwZXMvZGF0YS10YWJsZXMvdHlwZXNcIjtcclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZEVkaXQgfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLWdyaWQtZWRpdFwiO1xyXG5cclxuXHJcbi8vIGZ1bmN0aW9uIHN0YXR1c0Zvcm1hdHRlcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyLCB2YWx1ZTogYW55LCBjb2x1bW5EZWY6IFNsaWNrLkNvbHVtbjxTbGljay5TbGlja0RhdGE+LCBkYXRhQ29udGV4dDogU2xpY2suU2xpY2tEYXRhKSB7XHJcbi8vICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHtcclxuLy8gICAgIHJldHVybiBcIi1cIjtcclxuLy8gICB9IGVsc2UgaWYgKHZhbHVlIDwgNTApIHtcclxuLy8gICAgIHJldHVybiBcIjxzcGFuIHN0eWxlPSdjb2xvcjpyZWQ7Zm9udC13ZWlnaHQ6Ym9sZDsnPlwiICsgdmFsdWUgKyBcIiU8L3NwYW4+XCI7XHJcbi8vICAgfSBlbHNlIHtcclxuLy8gICAgIHJldHVybiBcIjxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+XCIgKyB2YWx1ZSArIFwiJTwvc3Bhbj5cIjtcclxuLy8gICB9XHJcbi8vIH1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdlYkdyaWRUb29sYmFyIHtcclxuICBpZD86c3RyaW5nLFxyXG4gIGNhcHRpb246c3RyaW5nLFxyXG4gIGJ1dHRvbnM/OlNhb3BXZWJHcmlkVG9vbGJhckJ1dHRvbltdXHJcbiAgaXRlbXNUZW1wbGF0ZUlkPzogc3RyaW5nO1xyXG59IFxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViR3JpZFRvb2xiYXJCdXR0b24ge1xyXG4gIGlkOnN0cmluZyxcclxuICBjYXB0aW9uIDpzdHJpbmcsICBcclxuICBjbGFzcz8gOnN0cmluZyxcclxuICBhdHRyaWJ1dGVzPzpzdHJpbmcsXHJcbiAgb25DbGlja0V2ZW50PzpzdHJpbmcsXHJcbiAgdGVtcGxhdGU/OiBzdHJpbmc7XHJcbn0gXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZWJHcmlkVG9nZ2xlUGFuZWwge1xyXG4gIGVuYWJsZWQ6Ym9vbGVhblxyXG59IFxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ViR3JpZFByb3BlcnRpZXMge1xyXG4gIGdyaWRJZDpzdHJpbmdcclxuICAsY3NzPzpzdHJpbmdcclxuICAsdG9nZ2xlUGFuZWw/OlNhb3BXZWJHcmlkVG9nZ2xlUGFuZWxcclxuICAsdG9vbGJhcj86U2FvcFdlYkdyaWRUb29sYmFyICBcclxuICAsZGF0YVRhYmxlPzpTYW9wV2ViRGF0YVRhYmxlXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFdlYkRhdGFUYWJsZSB7XHJcbiAgZW5hYmxlZDpib29sZWFuXHJcbiAgLGNvbHVtbkRlZnNTZXR0aW5ncz86IERhdGFUYWJsZXMuQ29sdW1uRGVmc1NldHRpbmdzW11cclxuICAsb3JkZXJpbmc/OmJvb2xlYW5cclxuICAsY29sdW1ucz86YW55W11cclxuICAsZGF0YT86IGFueVxyXG4gICxvcmRlcj86IEFycmF5PChudW1iZXIgfCBzdHJpbmcpPiB8IEFycmF5PEFycmF5PChudW1iZXIgfCBzdHJpbmcpPj5cclxuICAsZWRpdGFibGU/OmJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BXZWJHcmlkIHtcclxuICBwcml2YXRlIF9wcm9wZXJ0aWVzOlNhb3BXZWJHcmlkUHJvcGVydGllc1xyXG4gIHByaXZhdGUgX3RhYmxlRGl2OkhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gIHByaXZhdGUgX3Nhb3BXZWJHcmlkRWRpdDogU2FvcFdlYkdyaWRFZGl0O1xyXG4gIC8vXHJcbiAgcHVibGljIGxpYk5hbWU6IHN0cmluZzsgIFxyXG4gIHB1YmxpYyB3ZWJHcmlkRmlsdGVyOlNhb3BXZWJHcmlkRmlsdGVyO1xyXG4gIHB1YmxpYyBkYXRhVGFibGU6IERhdGFUYWJsZXMuQXBpPGFueT47XHJcbiAgcHVibGljIG1hcmtlZENvbHVtbkNoZWNrYm94OiBKUXVlcnk8SFRNTElucHV0RWxlbWVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuICAgIHRoaXMud2ViR3JpZEZpbHRlciA9IG5ldyBTYW9wV2ViR3JpZEZpbHRlcigpO1xyXG4gICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgIHRoaXMuX3Nhb3BXZWJHcmlkRWRpdCA9IG5ldyBTYW9wV2ViR3JpZEVkaXQoXCJfc2FvcFdlYkdyaWRFZGl0XCIpOyAgICBcclxuICAgIHRoaXMuX3Nhb3BXZWJHcmlkRWRpdC5vbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlID0gdGhpcy5vbldyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlLmJpbmQodGhpcyk7XHJcbiAgfSAgXHJcblxyXG4gIHNldFRlcm1pbm9sb2d5TGlzdCgpe1xyXG4gICAgbGV0IF90ZXJtaW5vbG9neTogc3RyaW5nW10gPSBbJ05pIHBvZGF0a292IHphIHByaWthei4nXTtcclxuICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS5zZXRUcmFuc2xhdGlvbnNMaXN0KF90ZXJtaW5vbG9neSk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIGluaXQoZ3JpZFByb3A6U2FvcFdlYkdyaWRQcm9wZXJ0aWVzKSB7XHJcbiAgICB0aGlzLl9wcm9wZXJ0aWVzID0gZ3JpZFByb3A7XHJcbiAgICB0aGlzLl90YWJsZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZ3JpZFByb3AuZ3JpZElkKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgLy9cclxuICAgIGxldCBfdG9nZ2xlUGFuZWxEZWZhdWx0ID0ge2VuYWJsZWQ6dHJ1ZX07XHJcbiAgICBncmlkUHJvcC50b2dnbGVQYW5lbCA9IHsuLi5fdG9nZ2xlUGFuZWxEZWZhdWx0LCAuLi5ncmlkUHJvcC50b2dnbGVQYW5lbH1cclxuICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoZ3JpZFByb3AudG9nZ2xlUGFuZWwpKXtcclxuICAgICAgZ3JpZFByb3AudG9nZ2xlUGFuZWwgPSBfdG9nZ2xlUGFuZWxEZWZhdWx0O1xyXG4gICAgfSAgICAgIFxyXG4gICAgLy9cclxuXHJcbiAgICB0aGlzLndlYkdyaWRGaWx0ZXIuaWQgPSBncmlkUHJvcC5ncmlkSWQrXCJmaWx0ZXJcIjtcclxuICAgIHRoaXMuZ2VuZXJhdGVIdG1sVGFibGUoKTtcclxuICAgIHRoaXMuYWRkR3JpZFRvb2xiYXIoKTtcclxuICAgIC8vIGRldCBkZWZhdWx0c1xyXG4gICAgbGV0IF9Nc2dfZW1wdHlUYWJsZSA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJOaSBwb2RhdGtvdiB6YSBwcmlrYXouXCIpXHJcblxyXG4gICAgbGV0IF9kYXRhVGFibGVEZWYgPSB7ZW5hYmxlZDp0cnVlLG9yZGVyaW5nOnRydWV9O1xyXG4gICAgZ3JpZFByb3AuZGF0YVRhYmxlID0gey4uLl9kYXRhVGFibGVEZWYsIC4uLmdyaWRQcm9wLmRhdGFUYWJsZX1cclxuXHJcbiAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKGdyaWRQcm9wLmRhdGFUYWJsZSkpe1xyXG4gICAgICBncmlkUHJvcC5kYXRhVGFibGUgPSBncmlkUHJvcC5kYXRhVGFibGU7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGxldCBfY29sdW1uRGVmc1NldHRpbmdzRGVmID0gW3tvcmRlcmFibGU6IHRydWUsIHRhcmdldHM6ICBcIm5vLXNvcnRcIn1dO1xyXG4gICAgZ3JpZFByb3AuZGF0YVRhYmxlLmNvbHVtbkRlZnNTZXR0aW5ncyA9IHsuLi5fY29sdW1uRGVmc1NldHRpbmdzRGVmLC4uLmdyaWRQcm9wLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3N9XHJcblxyXG4gICAgaWYgKGdsb2JhbC5pc1VuRGVmaW5lZChncmlkUHJvcC5kYXRhVGFibGUuY29sdW1uRGVmc1NldHRpbmdzKSl7XHJcbiAgICAgIGdyaWRQcm9wLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3MgPSBfY29sdW1uRGVmc1NldHRpbmdzRGVmO1xyXG4gICAgfVxyXG4gICAgLy9cclxuICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlKSBcclxuICAgICAgJiYgdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZW5hYmxlZFxyXG4gICAgICApe1xyXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICB0aGlzLmRhdGFUYWJsZSA9IFxyXG4gICAgICAgICQoZ3JpZFByb3AuZ3JpZElkKS5EYXRhVGFibGUoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJwYWdpbmdcIjogZmFsc2VcclxuICAgICAgICAgICAgICAsIFwic2VhcmNoaW5nXCI6IHRydWVcclxuICAgICAgICAgICAgICAsXCJhdXRvV2lkdGhcIjogdHJ1ZVxyXG4gICAgICAgICAgICAgICxvcmRlckNlbGxzVG9wOiB0cnVlXHJcbiAgICAgICAgICAgICAgLy8sIFwiZG9tXCI6IFwiUmxmcnRpcFwiXHJcbiAgICAgICAgICAgICAgLCBpbml0Q29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChncmlkUHJvcC5kYXRhVGFibGUub3JkZXJpbmcpe1xyXG4gICAgICAgICAgICAgICAgICBfdGhpcy53ZWJHcmlkRmlsdGVyLmNvbmZpZ1NpbXBsZUZpbHRlcih0aGlzKTsgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdTaW1wbGVTb3J0KF90aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCk7ICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2lmKCFpc1VuRGVmaW5lZChfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZmlsdGVycykpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgX3RoaXMud2ViR3JpZEZpbHRlci5jb25maWdGaWx0ZXIoX3RoaXMubGliTmFtZSx0aGlzLCBfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLG9yZGVyOiBfdGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUub3JkZXJcclxuICAgICAgICAgICAgICAvLyAsYWpheDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrLCBzZXR0aW5ncykge1xyXG4gICAgICAgICAgICAgIC8vICAgY2FsbGJhY2soeyBkYXRhOiBkYXRhIH0pIC8vcmVsb2FkcyBkYXRhIFxyXG4gICAgICAgICAgICAgIC8vIH0gXHJcbiAgICAgICAgICAgICAgLGNvbHVtbkRlZnM6IF90aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2x1bW5EZWZzU2V0dGluZ3MgXHJcbiAgICAgICAgICAgICAgLG9yZGVyaW5nIDogZ3JpZFByb3AuZGF0YVRhYmxlLm9yZGVyaW5nIFxyXG4gICAgICAgICAgICAgICxsYW5ndWFnZSA6IHtlbXB0eVRhYmxlOl9Nc2dfZW1wdHlUYWJsZSx6ZXJvUmVjb3JkczpfTXNnX2VtcHR5VGFibGV9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTsgICAgXHJcbiAgICAgIC8vXHJcbiAgICAgICQoZ3JpZFByb3AuZ3JpZElkK1wiX2ZpbHRlclwiKS5yZW1vdmUoKTtcclxuICAgICAgJChncmlkUHJvcC5ncmlkSWQrXCJfaW5mb1wiKS5yZW1vdmUoKTsgXHJcbiAgICAgIHRoaXMud2ViR3JpZEZpbHRlci5zZXRSZXNpemVFdmVudCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCk7XHJcbiAgICAgIC8vXHJcbiAgICB9XHJcbiAgIFxyXG4gICAgLy9cclxuICAgIGlmICh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5lZGl0YWJsZSkge1xyXG4gICAgICB0aGlzLmluaXRXZWJHcmlkRWRpdGFibGVDb2x1bW5DbGlja0V2ZW50cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVG9vbGJhckJ1dHRvbnMoZ3JpZFBhbmVsOiBKUXVlcnk8SFRNTEVsZW1lbnQ+LGJ1dHRvbnM6U2FvcFdlYkdyaWRUb29sYmFyQnV0dG9uW10pe1xyXG4gICAgaWYoZ2xvYmFsLmlzVW5EZWZpbmVkKGJ1dHRvbnMpID09IGZhbHNlKXtcclxuICAgICAgYnV0dG9ucy5mb3JFYWNoKF9idXR0b24gPT4ge1xyXG4gICAgICAgIHZhciBidXR0b25UZW1wbGF0ZSA9IFxyXG4gICAgICAgIGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXktYXV0b1wiIHN0eWxlPVwicGFkZGluZy1sZWZ0OjIxcHg7XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHNhb3AtYnV0dG9uLXByaW1hcnkgbXgtYXV0byBkLWJsb2NrXCIgaWQ9XCIke19idXR0b24uaWR9XCIgdHlwZT1cInN1Ym1pdFwiIG9uY2xpY2s9XCIke19idXR0b24ub25DbGlja0V2ZW50fVwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OjEwcHg7XCI+PHNwYW4gY2xhc3M9XCJzYW9wLWltZy1wbHVzXCI+PC9zcGFuPiR7X2J1dHRvbi5jYXB0aW9ufTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PiAgICBcclxuICAgICAgICBgO1xyXG5cclxuICAgICAgICBpZiAoX2J1dHRvbi50ZW1wbGF0ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBidXR0b25UZW1wbGF0ZSA9IF9idXR0b24udGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBncmlkUGFuZWwuZmluZChcIiN0b29sYmFyQnV0dG9uc1wiKS5hcHBlbmQoYnV0dG9uVGVtcGxhdGUpOyAgICAgIFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdlbmVyYXRlSHRtbFRhYmxlKCkge1xyXG4gICAgdGhpcy5nZW5lcmF0ZVRhYmxlQm9keSgpOyAgICAgICAgXHJcbiAgICB0aGlzLmdlbmVyYXRlVGFibGVIZWFkKCk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVRhYmxlSGVhZCgpIHtcclxuICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuZGF0YVRhYmxlKSl7XHJcbiAgICAgIGlmKCFnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy5kYXRhVGFibGUuY29sdW1ucykpe1xyXG4gICAgICAgIGxldCB0aGVhZCA9IHRoaXMuX3RhYmxlRGl2LmNyZWF0ZVRIZWFkKCk7XHJcbiAgICAgICAgbGV0IHJvdyA9IHRoZWFkLmluc2VydFJvdygpO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBvZiB0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5jb2x1bW5zKSB7XHJcbiAgICAgICAgICBsZXQgdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGhcIik7XHJcbiAgICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleS5uYW1lKTtcclxuICAgICAgICAgIHRoLmFwcGVuZENoaWxkKHRleHQpO1xyXG4gICAgICAgICAgcm93LmFwcGVuZENoaWxkKHRoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgZ2VuZXJhdGVUYWJsZUJvZHkoKSB7XHJcbiAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZSkpe1xyXG4gICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5kYXRhKSl7XHJcbiAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiB0aGlzLl9wcm9wZXJ0aWVzLmRhdGFUYWJsZS5kYXRhKSB7XHJcbiAgICAgICAgICBsZXQgcm93ID0gdGhpcy5fdGFibGVEaXYuaW5zZXJ0Um93KCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZWxlbWVudCkge1xyXG4gICAgICAgICAgICBsZXQgY2VsbCA9IHJvdy5pbnNlcnRDZWxsKCk7XHJcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZWxlbWVudFtrZXldKTtcclxuICAgICAgICAgICAgY2VsbC5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEdyaWRUb29sYmFyKCkge1xyXG4gICAgbGV0IGdyaWRQYW5lbDogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIGxldCBfY3NzID0gZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMuY3NzKSA9PSBmYWxzZSA/IHRoaXMuX3Byb3BlcnRpZXMuY3NzIDpcIlwiO1xyXG5cclxuICAgIGxldCBncmlkUGFuZWxUZW1wbGF0ZSA9IGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2FvcC10YWJsZS1maXhoZWFkICR7X2Nzc31cIj5cclxuICAgICAgICAgIDx0YWJsZSBpZD1cIiNzbGlja0dyaWQjXCI+PC90YWJsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIGA7XHJcbiAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIpKSB7XHJcbiAgICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQodGhpcy5fcHJvcGVydGllcy50b29sYmFyLmlkKSkge1xyXG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pZCA9IHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkK1wiVEJcIjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZ3JpZFRvZ2dsZVBhbmVsID0gYGA7XHJcbiAgICAgIGxldCBncmlkVG9nZ2xlUGFuZWxDbGFzcyA9IFwiXCI7XHJcbiAgICAgIGxldCBncmlkQm9yZGVyQm90dG9tID0gXCJcIjtcclxuICAgICAgaWYodGhpcy5fcHJvcGVydGllcy50b2dnbGVQYW5lbC5lbmFibGVkKSB7XHJcbiAgICAgICAgZ3JpZFRvZ2dsZVBhbmVsQ2xhc3MgPSBcImNvbGxhcHNlIHNob3dcIjtcclxuICAgICAgICBncmlkQm9yZGVyQm90dG9tID0gXCJzYW9wLWJvcmRlci1ib3R0b21cIjtcclxuXHJcbiAgICAgICAgZ3JpZFRvZ2dsZVBhbmVsID0gXHJcbiAgICAgICAgICBgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2FvcC1mb3JtLXBhbmVsLWhlYWRpbmcgc2FvcC10b2dnbGUtcGFuZWxcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzYW9wLXR4dC0zIG0tMFwiIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIiBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiIGRhdGEtdGFyZ2V0PVwiI2NvbGxhcHNlJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWR9XCI+XHJcbiAgICAgICAgICAgICR7dGhpcy5fcHJvcGVydGllcy50b29sYmFyLmNhcHRpb259IDxzcGFuIGNsYXNzPVwic2FvcC1pbWctZG93biBzaS1tIHNhb3AtdG9nZ2xlLWFycm93IHJpZ2h0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIGA7ICAgICAgXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBfdG9vbGJhckl0ZW1zID0gYGA7XHJcbiAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5pdGVtc1RlbXBsYXRlSWQpKXtcclxuICAgICAgICBsZXQgX3Rvb2xiYXJJdGVtc1RlbXBsYXRlID0gJCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaXRlbXNUZW1wbGF0ZUlkKTtcclxuICAgICAgICBpZiAoX3Rvb2xiYXJJdGVtc1RlbXBsYXRlLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgX3Rvb2xiYXJJdGVtcyA9IF90b29sYmFySXRlbXNUZW1wbGF0ZS5odG1sKCk7XHJcbiAgICAgICAgICBfdG9vbGJhckl0ZW1zVGVtcGxhdGUucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBncmlkUGFuZWxUZW1wbGF0ZSA9IGBcclxuICAgICAgICA8ZGl2IGlkPVwiJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWR9XCIgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0ICR7Z3JpZEJvcmRlckJvdHRvbX1cIj5cclxuICAgICAgICAgICR7Z3JpZFRvZ2dsZVBhbmVsfVxyXG4gICAgICAgICAgPGRpdiBpZD1cImNvbGxhcHNlJHt0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIuaWR9XCIgY2xhc3M9XCJzYW9wLWZvcm0tcGFuZWwtYm9keSAke2dyaWRUb2dnbGVQYW5lbENsYXNzfVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiZ3JpZC10b29sYmFyXCIgY2xhc3M9XCJzYW9wLXRhYmxlLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGlkPVwidG9vbGJhckJ1dHRvbnNcIiBjbGFzcz1cInJvdyBtci0wIG1sLTAganVzdGlmeS1jb250ZW50LXN0YXJ0XCIgc3R5bGU9XCJoZWlnaHQ6MTAwJTtcIj5cclxuICAgICAgICAgICAgICAke190b29sYmFySXRlbXN9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2FvcC10YWJsZS1maXhoZWFkICR7X2Nzc31cIj5cclxuICAgICAgICAgICAgICA8dGFibGUgaWQ9XCIjc2xpY2tHcmlkI1wiPjwvdGFibGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIGA7XHJcbiAgICB9XHJcbiAgICBncmlkUGFuZWxUZW1wbGF0ZSA9IGdyaWRQYW5lbFRlbXBsYXRlLnJlcGxhY2UoXCIjc2xpY2tHcmlkI1wiLHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkLnJlcGxhY2UoXCIjXCIsXCJcIikpO1xyXG4gICAgZ3JpZFBhbmVsID0gJChncmlkUGFuZWxUZW1wbGF0ZSk7XHJcbiAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZCh0aGlzLl9wcm9wZXJ0aWVzLnRvb2xiYXIpKSB7XHJcbiAgICAgIHRoaXMuYWRkVG9vbGJhckJ1dHRvbnMoZ3JpZFBhbmVsLHRoaXMuX3Byb3BlcnRpZXMudG9vbGJhci5idXR0b25zKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgX3RhYmxlSHRtbCA9IHRoaXMuX3RhYmxlRGl2O1xyXG5cclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQpLnJlcGxhY2VXaXRoKGdyaWRQYW5lbCk7XHJcblxyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCkucmVwbGFjZVdpdGgoX3RhYmxlSHRtbCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoRGF0YShkYXRhOmFueSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCk7XHJcbiAgICBkYXRhLmVhY2goZnVuY3Rpb24oIGluZGV4OmFueSwgdHI6c3RyaW5nICkge1xyXG4gICAgICBfdGhpcy5kYXRhVGFibGUucm93LmFkZCgkKHRyKSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTsgICAgXHJcbiAgfVxyXG5cclxuICByZXBsYWNlR3JpZFJvd3MoaHRtbENvbnRlbnQ6c3RyaW5nKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdGhpcy5kYXRhVGFibGUuY2xlYXIoKTtcclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQrXCIgPiB0Ym9keSA+IHRyXCIsICQoaHRtbENvbnRlbnQpKS5lYWNoKFxyXG4gICAgICBmdW5jdGlvbihpbmRleDphbnksdHI6YW55KSB7XHJcbiAgICAgICAgX3RoaXMuZGF0YVRhYmxlLnJvdy5hZGQoJCh0cikpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5kYXRhVGFibGUuZHJhdygpOyAgICBcclxuICB9ICBcclxuXHJcbiAgc2V0VGFiZWxGb290aGVyKCk6dm9pZCB7XHJcbiAgICAkKHRoaXMuX3Byb3BlcnRpZXMuZ3JpZElkKycgYm9keScpICBcclxuICB9XHJcblxyXG4gIGluaXRXZWJHcmlkQ29sdW1uQ2hlY2tib3hCaW5kQ2xpY2tFdmVudCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0aGlzLm1hcmtlZENvbHVtbkNoZWNrYm94ID0gbnVsbDtcclxuXHJcbiAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMuX3RhYmxlRGl2KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgJChcIiNcIiArIHRoaXMuX3RhYmxlRGl2LmlkICsgXCIgLnNhb3AtdGQtaW5wdXQtY2hlY2tib3hcIikub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgJChcIiNcIiArIHRoaXMuX3RhYmxlRGl2LmlkICsgXCIgLnNhb3AtdGQtaW5wdXQtY2hlY2tib3hcIikub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgX3RoaXMubWFya2VkQ29sdW1uQ2hlY2tib3ggPSAkKFwiI1wiICsgX3RoaXMuX3RhYmxlRGl2LmlkICsgXCIgI1wiICsgcm93LmN1cnJlbnRUYXJnZXQuaWQpO1xyXG5cclxuICAgICAgLy8gb2R6bmFjaW1vIHZzZSBvc3RhbGUgY2hlY2tib3hlXHJcbiAgICAgICQoXCIjXCIgKyBfdGhpcy5fdGFibGVEaXYuaWQgKyBcIiBpbnB1dC5zYW9wLXRkLWlucHV0LWNoZWNrYm94Om5vdCgjXCIgKyByb3cuY3VycmVudFRhcmdldC5pZCArIFwiKVwiKS5lYWNoKFxyXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICQoXCIjXCIgKyBfdGhpcy5fdGFibGVEaXYuaWQgKyBcIiAjXCIgKyB0aGlzLmlkKS5wcm9wKFwiY2hlY2tlZFwiLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICBfdGhpcy5hZnRlckNvbHVtbkNoZWNrYm94Q2hhbmdlZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZnRlckNvbHVtbkNoZWNrYm94Q2hhbmdlZCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBpbml0V2ViR3JpZEVkaXRhYmxlQ29sdW1uQ2xpY2tFdmVudHMoKTogdm9pZCB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICQodGhpcy5fcHJvcGVydGllcy5ncmlkSWQpLm9mZihcImNsaWNrXCIsIFwidGJvZHkgdGRbZGF0YS1lZGl0YWJsZT0ndHJ1ZSddXCIpO1xyXG4gICAgJCh0aGlzLl9wcm9wZXJ0aWVzLmdyaWRJZCkub24oXCJjbGlja1wiLCBcInRib2R5IHRkW2RhdGEtZWRpdGFibGU9J3RydWUnXVwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBfdGhpcy5fc2FvcFdlYkdyaWRFZGl0LnNob3dXZWJHcmlkRWRpdGFibGVDb2x1bW5FZGl0Q29udHJvbCh0aGlzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAgIFxyXG4gIHByaXZhdGUgb25Xcml0ZVZhbHVlVG9UREVsZW1lbnRDb21wbGV0ZSh0ZEVsZW1lbnQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMub25FZGl0VGRDZWxsV3JpdGVWYWx1ZVRvVERFbGVtZW50Q29tcGxldGUodGRFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG9uRWRpdFRkQ2VsbFdyaXRlVmFsdWVUb1RERWxlbWVudENvbXBsZXRlKHRkRWxlbWVudDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIC8vIG1ldG9kYSB6YSBleHRlcm5vIHVwb3JhYm9cclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/XHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcElucHV0V0ZMUHJvcGVydGllcyB7XHJcbiAgICBpZDpzdHJpbmc7XHJcbiAgICBwbGFjZWhvbGRlcjpzdHJpbmc7XHJcbiAgICBjYXB0aW9uOnN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BJbnB1dFdGTCB7XHJcbiAgICBwcml2YXRlIF9pbnB1dFRlbXBsYXRlOnN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6U2FvcElucHV0V0ZMUHJvcGVydGllcykge1xyXG4gICAgICAgIHRoaXMuX2lucHV0VGVtcGxhdGUgPSBcclxuICAgICAgICBgXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYW9wLWNvbC1maWx0ZXItZ3JvdXBcIj5cclxuICAgICAgICAgICAgPGlucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNoYWRvdy1ub25lIHNhb3AtY29udHJvbCBzYW9wLWNvbnRyb2wtbGlzdEJveCBzYW9wLWNvbC1maWx0ZXItaW5wdXRcIiBzdHlsZT1cIndpZHRoOjk1JSAhaW1wb3J0YW50O1wiIGlkPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIG5hbWU9XCIke3Byb3BlcnRpZXMuaWR9XCIgcGxhY2Vob2xkZXI9XCIke3Byb3BlcnRpZXMucGxhY2Vob2xkZXJ9XCIgdGFiaW5kZXg9XCIwXCIgdHlwZT1cInRleHRcIiB2YWx1ZT1cIlwiPlxyXG4gICAgICAgICAgICA8aSBpZD1cInNlYXJjaEljb25cIiBjbGFzcz1cInNhb3AtaW1nLXNlYXJjaCBzaS1zIGZvcm0tY29udHJvbC1mZWVkYmFja1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7dG9wOjVweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OiBjYWxjKDEwMCUgLSA0MHB4KSAhaW1wb3J0YW50O1wiLz5cclxuICAgICAgICA8L3NwYW4+ICAgICAgICBcclxuICAgICAgICBgOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgLy8gdGhpcy5faW5wdXRUZW1wbGF0ZSA9IFxyXG4gICAgICAgIC8vIGBcclxuICAgICAgICAvLyA8c3BhbiBjbGFzcz1cImhhcy1mbG9hdC1sYWJlbFwiPlxyXG4gICAgICAgIC8vICAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2hhZG93LW5vbmUgc2FvcC1jb250cm9sIHNhb3AtY29udHJvbC1saXN0Qm94XCIgZGF0YS1pbnB1dG1hc2stYWxpYXM9XCJkZC5tbS55eXl5IGhoOm1tXCIgaWQ9XCIke3Byb3BlcnRpZXMuaWR9XCIgbmFtZT1cIiR7cHJvcGVydGllcy5pZH1cIiBwbGFjZWhvbGRlcj1cIiR7cHJvcGVydGllcy5wbGFjZWhvbGRlcn1cIiB0YWJpbmRleD1cIjBcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgZGlzYWJsZWQ9XCJcIj5cclxuICAgICAgICAvLyAgICAgPGxhYmVsIGNsYXNzPVwic2FvcC1mbG9hdGluZy1sYWJlbCBzYW9wLXR4dC03XCIgZm9yPVwiJHtwcm9wZXJ0aWVzLmlkfVwiPiR7cHJvcGVydGllcy5jYXB0aW9ufTwvbGFiZWw+XHJcbiAgICAgICAgLy8gICAgIDxpIGlkPVwiY2FsZW5kYXJJY29uXCIgY2xhc3M9XCJzYW9wLWltZy1jYWxlbmRhciBzaS1zIGZvcm0tY29udHJvbC1mZWVkYmFja1wiIHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7bGVmdDoyMzBweDt0b3A6NXB4O3Bvc2l0aW9uOmFic29sdXRlO1wiLz5cclxuICAgICAgICAvLyA8L3NwYW4+ICAgICAgICBcclxuICAgICAgICAvLyBgOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RWxlbWVudCgpOkpRdWVyeTxIVE1MRWxlbWVudD57XHJcbiAgICAgICAgbGV0IF9lbGVtZW50ID0gJCh0aGlzLl9pbnB1dFRlbXBsYXRlKTtcclxuICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5uZXJIdG1sKCk6c3RyaW5ne1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dFRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v1xyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9pbmRleC5kLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0LnRzXCIgLz5cclxuXHJcbmltcG9ydCB7ICBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZWxlY3RpemVTZWxlY3QgfSBmcm9tIFwiLi9zYW9wLXNlbGVjdGl6ZS1zZWxlY3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wSW5wdXRNYXNrIHtcclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXQuLi5cIik7XHJcbiAgICAgICAgdmFyIGlucHV0RGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdpbnB1dFtkYXRhLWlucHV0bWFzay1hbGlhc10nKTtcclxuICAgICAgICBJbnB1dG1hc2soKS5tYXNrKGlucHV0RGl2cyk7XHJcblxyXG4gICAgICAgICQoXCIuc2FvcC1kZWNpbWFsLTJcIikuaW5wdXRtYXNrKHtcclxuICAgICAgICAgICAgJ2FsaWFzJzogJ2RlY2ltYWwnLFxyXG4gICAgICAgICAgICAncmFkaXhQb2ludCc6ICcsJyxcclxuICAgICAgICAgICAgJ2RpZ2l0cyc6IDIsXHJcbiAgICAgICAgICAgICdkaWdpdHNPcHRpb25hbCc6IGZhbHNlLFxyXG4gICAgICAgICAgICAncGxhY2Vob2xkZXInOiAnMCwwMCdcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcIi5zYW9wLWRlY2ltYWwtM1wiKS5pbnB1dG1hc2soe1xyXG4gICAgICAgICAgICAnYWxpYXMnOiAnZGVjaW1hbCcsXHJcbiAgICAgICAgICAgICdyYWRpeFBvaW50JzogJywnLFxyXG4gICAgICAgICAgICAnZGlnaXRzJzogMyxcclxuICAgICAgICAgICAgJ2RpZ2l0c09wdGlvbmFsJzogZmFsc2UsXHJcbiAgICAgICAgICAgICdwbGFjZWhvbGRlcic6ICcwLDAwMCdcclxuICAgICAgICB9KTsgIFxyXG5cclxuICAgICAgICBpbnB1dERpdnMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVsZW1lbnQuaW5pdC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cIiArIGVsZW1lbnQuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNwYW5EaXY6YW55O1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudEF0cnIgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWlucHV0bWFzay1hbGlhc1wiKTtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5pc0VtcHR5KGVsZW1lbnRBdHJyKSkge3JldHVybjt9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKGVsZW1lbnRBdHJyKTtcclxuICAgICAgICAgICAgc3BhbkRpdiA9ICQoZWxlbWVudCkucGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2ID09PSBudWxsKSB7IHJldHVybjt9O1xyXG4gICAgICAgICAgICBpZiAoc3BhbkRpdi5oYXNDbGFzcyhcImhhcy1mbG9hdC1sYWJlbFwiKT09PWZhbHNlKSB7IHJldHVybjt9O1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHNwYW5EaXYuZ2V0KDApLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZUF0cnIgPSAoU3RyaW5nKSgkKFwiI3NpdGVMYW5ndWFnZVwiKS52YWwoKSk7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsYW5ndWFnZTpcIitsYW5ndWFnZUF0cnIpO1xyXG4gICAgICAgICAgICBsYW5ndWFnZUF0cnIgPSBnbG9iYWwuaXNFbXB0eShsYW5ndWFnZUF0cnIpID8gXCJzbFwiIDpsYW5ndWFnZUF0cnI7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJsYW5ndWFnZTpcIitsYW5ndWFnZUF0cnIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRBdHJyID09PSBcImhoOm1tOnNzXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI3RpbWVJY29uXCIpO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjbG9jay5ibHVyLmluaXQ6XCIgKyBlbGVtZW50LmlkKTtcclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuYmx1cihmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxsLmNsb2NrLmJsdXI6XCIgKyBldmVudC50YXJnZXQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250cm9sVmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZS5pbmNsdWRlcyhcImhcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUgPSBjb250cm9sVmFsdWUucmVwbGFjZShcIm1tXCIsIFwiMDBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnJlcGxhY2UoXCJtXCIsIFwiMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUgPSBjb250cm9sVmFsdWUucmVwbGFjZShcInNzXCIsIFwiMDBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnJlcGxhY2UoXCJzXCIsIFwiMFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBjb250cm9sVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvemltbyBpbnB1dCBldmVuLCBrZXIgc21vIHZwaXNhbGkgbm92byB2cmVkbm9zdCBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IEV2ZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2suY2xpY2suaW5pdDpcIiArIGVsZW1lbnQuaWQpO1xyXG4gICAgICAgICAgICAgICAgJChpY29uQnRuKS5jbGljayhmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjbG9ja0ljb24uY2xpY2tlZDpcIiArIGVsZW1lbnQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjdHJsSW5wdXRDdHJsID0gJChlbGVtZW50KS5nZXQoMCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY3RybElucHV0Q3RybFN0ckxlbmd0aCA9IGN0cmxJbnB1dEN0cmwudmFsdWUubGVuZ3RoICogMjtcclxuICAgICAgICAgICAgICAgICAgICBjdHJsSW5wdXRDdHJsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3RybElucHV0Q3RybC5zZXRTZWxlY3Rpb25SYW5nZShjdHJsSW5wdXRDdHJsU3RyTGVuZ3RoLCBjdHJsSW5wdXRDdHJsU3RyTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXlcIiBcclxuICAgICAgICAgICAgICAgIC8vIHx8IGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXkgaGg6bW1cIiBcclxuICAgICAgICAgICAgICAgIC8vIHx8IGVsZW1lbnRBdHJyID09PSBcImRkLm1tLnl5eXkgaGg6bW06c3NcIlxyXG4gICAgICAgICAgICApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiNjYWxlbmRhckljb25cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBkYXRlcGlja2VyU3RhcnREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWVuYWJsZS1zZWxlY3QtcGFzdGRhdGVzXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSkudG9Mb3dlckNhc2UoKSA9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VyU3RhcnREYXRlMSA9ICQoZWxlbWVudCkuYXR0cihcImRhdGEtbWluLXN0YXJ0LWRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlclN0YXJ0RGF0ZTEsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZXBpY2tlckVuZERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1tYXgtZW5kLWRhdGVcIik7ICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSBnbG9iYWwuY29udmVydFN0cmluZzJEYXRlKGRhdGVwaWNrZXJFbmREYXRlLCBcImRkLm1tLnl5eXlcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRlcGlja2VyKHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGU6IGRhdGVwaWNrZXJTdGFydERhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogZGF0ZXBpY2tlckVuZERhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2Nsb3NlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgd2Vla1N0YXJ0OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZC5tbS55eXl5XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjogXCJib3R0b20gcmlnaHRcIixcclxuICAgICAgICAgICAgICAgICAgICBzaG93T25Gb2N1czpmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vZm9yY2VQYXJzZTpmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0pOyAgIFxyXG5cclxuICAgICAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24oKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5jbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGggPSBkYXRlcGlja2VySW5wdXRDdHJsLnZhbHVlLmxlbmd0aCAqIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9kYXRlcGlja2VySW5wdXRDdHJsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRlcGlja2VyKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VySW5wdXRDdHJsLnNldFNlbGVjdGlvblJhbmdlKGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGgsIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGgpXHJcbiAgICAgICAgICAgICAgICB9KTsgIFxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbVwiKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGF0ZXRpbWVwaWNrZXIgaGg6bW0gLi4uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiNjYWxlbmRhckljb25cIik7XHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgLmJpbmQoJ2tleWRvd24nLGZ1bmN0aW9uKGUpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAuZGF0ZXRpbWVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ0RELk1NLllZWVkgSDptbScsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBsYW5ndWFnZUF0cnIsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd1RvZGF5QnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5vZmYoXCJmb2N1c1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uKCkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRhKFwiRGF0ZVRpbWVQaWNrZXJcIikuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICBcclxuICBcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5IGhoOm1tOnNzXCIpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkYXRldGltZXBpY2tlciBoaDptbTpzcyAuLi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAuYmluZCgna2V5ZG93bicsZnVuY3Rpb24oZSl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC5kYXRldGltZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnREQuTU0uWVlZWSBIOm1tOnNzJyxcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgICAgICBzaG93VG9kYXlCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLm9mZihcImZvY3VzXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8kKGVsZW1lbnQpLm9mZihcImtleWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICAvLyAub24oJ2RwLmhpZGUnLCBmdW5jdGlvbihlKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnZHAuaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB9KSAgIFxyXG4gICAgICAgICAgICAgICAgLy8gLm9uKCdkcC5zaG93JywgZnVuY3Rpb24oZSl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coJ2RwLnNob3cnKTtcclxuICAgICAgICAgICAgICAgIC8vIH0pOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uKCkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCQoZG9jdW1lbnQpLmZpbmQoXCIuZGF0ZXBpY2tlci1kcm9wZG93blwiKS5pcyhcIjp2aXNpYmxlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRhKFwiRGF0ZVRpbWVQaWNrZXJcIikuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyAkKGVsZW1lbnQpLmZvY3VzKGZ1bmN0aW9uIChldmVudDogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgJChlbGVtZW50KS5kYXRhKFwiRGF0ZVRpbWVQaWNrZXJcIikuaGlkZSgpOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyB9KTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm5vdCBpbXBsZW1lbnRlZC4uLlwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0TXVsdGlEYXRlU2VsZWN0RGF0ZXBpY2tlcigpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRTZWxlY3RpemVTZWxlY3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aXplTXVsdGlzZWxlY3RTZWxlY3QoKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImluaXRJbnB1dHMuLi5kb25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdE11bHRpRGF0ZVNlbGVjdERhdGVwaWNrZXIoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdE11bHRpRGF0ZVNlbGVjdERhdGVwaWNrZXIuLi5cIik7XHJcblxyXG4gICAgICAgIHZhciBpbnB1dERpdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignaW5wdXRbZGF0YS1pemJvci12ZWMtZG5pXScpO1xyXG5cclxuICAgICAgICBpbnB1dERpdnMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVsZW1lbnQuaW5pdC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cIiArIGVsZW1lbnQuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNwYW5EaXY6IGFueTtcclxuICAgICAgICAgICAgc3BhbkRpdiA9ICQoZWxlbWVudCkucGFyZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2ID09PSBudWxsKSB7IHJldHVybjsgfTtcclxuICAgICAgICAgICAgaWYgKHNwYW5EaXYuaGFzQ2xhc3MoXCJoYXMtZmxvYXQtbGFiZWxcIikgPT09IGZhbHNlKSB7IHJldHVybjsgfTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhzcGFuRGl2LmdldCgwKS5pZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFuZ3VhZ2VBdHJyID0gKFN0cmluZykoJChcIiNzaXRlTGFuZ3VhZ2VcIikudmFsKCkpO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibGFuZ3VhZ2U6XCIgKyBsYW5ndWFnZUF0cnIpO1xyXG4gICAgICAgICAgICBsYW5ndWFnZUF0cnIgPSBnbG9iYWwuaXNFbXB0eShsYW5ndWFnZUF0cnIpID8gXCJzbFwiIDogbGFuZ3VhZ2VBdHJyO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibGFuZ3VhZ2U6XCIgKyBsYW5ndWFnZUF0cnIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjY2FsZW5kYXJJY29uXCIpO1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJTdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSkudG9Mb3dlckNhc2UoKSA9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyU3RhcnREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWluLXN0YXJ0LWRhdGVcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlclN0YXJ0RGF0ZTEgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlclN0YXJ0RGF0ZTEsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJFbmREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1heC1lbmQtZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gZ2xvYmFsLmNvbnZlcnRTdHJpbmcyRGF0ZShkYXRlcGlja2VyRW5kRGF0ZSwgXCJkZC5tbS55eXl5XCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlOiBkYXRlcGlja2VyU3RhcnREYXRlLFxyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZTogZGF0ZXBpY2tlckVuZERhdGUsXHJcbiAgICAgICAgICAgICAgICBhdXRvY2xvc2U6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbXVsdGlkYXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHdlZWtTdGFydDogMSxcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZC5tbS55eXl5XCIsXHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VBdHJyLFxyXG4gICAgICAgICAgICAgICAgb3JpZW50YXRpb246IFwiYm90dG9tIHJpZ2h0XCJcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmwgPSAkKGVsZW1lbnQpLmdldCgwKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGggPSBkYXRlcGlja2VySW5wdXRDdHJsLnZhbHVlLmxlbmd0aCAqIDI7XHJcbiAgICAgICAgICAgICAgICBkYXRlcGlja2VySW5wdXRDdHJsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBkYXRlcGlja2VySW5wdXRDdHJsLnNldFNlbGVjdGlvblJhbmdlKGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGgsIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGgpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdE11bHRpRGF0ZVNlbGVjdERhdGVwaWNrZXIuLi5kb25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNlbGVjdGl6ZVNlbGVjdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0U2VsZWN0aXplU2VsZWN0Li4uXCIpO1xyXG5cclxuICAgICAgICAkKCcuc2VsZWN0aXplU2VsZWN0JykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBzYW9wU2VsZWN0ZWxlbWVudCA9IG5ldyBTYW9wU2VsZWN0aXplU2VsZWN0KCk7XHJcbiAgICAgICAgICAgIHNhb3BTZWxlY3RlbGVtZW50LmluaXRDb250cm9sQnlIdG1sKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0U2VsZWN0aXplU2VsZWN0Li4uZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRTZWxlY3RpemVNdWx0aXNlbGVjdFNlbGVjdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0U2VsZWN0aXplTXVsdGlzZWxlY3RTZWxlY3QuLi5cIik7XHJcblxyXG4gICAgICAgICQoJy5zZWxlY3RpemVNdWx0aXNlbGVjdCcpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgc2FvcFNlbGVjdGVsZW1lbnQgPSBuZXcgU2FvcFNlbGVjdGl6ZVNlbGVjdCgpO1xyXG4gICAgICAgICAgICBzYW9wU2VsZWN0ZWxlbWVudC5pbml0TXVsdGlzZWxlY3RDb250cm9sQnlIdG1sKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbml0U2VsZWN0aXplTXVsdGlzZWxlY3RTZWxlY3QuLi5kb25lXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wUG9wb3ZlciB9IGZyb20gXCIuLi9Db21wb25lbnRzL3Nhb3AtcG9wb3ZlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTaWRlYmFyIHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NvbGxFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByb3RlY3RlZCBfZXhwRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9tZW51U2lkZWJhclBvcG92ZXI6IFNhb3BQb3BvdmVyO1xyXG5cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmluaXQuLi5cIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbGxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2xsYXBzZS1pY29uLWNvbGxcIik7XHJcbiAgICAgICAgdGhpcy5fZXhwRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29sbGFwc2UtaWNvbi1leHBcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbGxFbGVtZW50ICE9IG51bGwpIHRoaXMuX2NvbGxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBpZiAodGhpcy5fZXhwRWxlbWVudCAhPSBudWxsKSB0aGlzLl9leHBFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIEV4cGFuZCBpY29uIGNsaWNrXHJcbiAgICAgICAgJChcIiNjb2xsYXBzZS1pY29uLWV4cFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiI2NvbGxhcHNlLWljb24tZXhwXCIpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmNvbGxhcHNlLWljb24tZXhwLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5lbmFibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENvbGxhcHNlIGljb24gY2xpY2tcclxuICAgICAgICAkKFwiI2NvbGxhcHNlLWljb24tY29sbFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAkKFwiI2NvbGxhcHNlLWljb24tY29sbFwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5jb2xsYXBzZS1pY29uLWNvbGwuY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmRpc2FibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENvbGxhcHNlIGNsaWNrXHJcbiAgICAgICAgJCgnW2RhdGEtdG9nZ2xlPXNpZGViYXItY29sYXBzZV0nKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2lkZWJhckNvbGxhcHNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvL21lbnUgaXRlbSBjbGlja1xyXG4gICAgICAgICQoXCIuc2FvcC1iZy1pdGVtXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1wcmV2aW91cy1pdGVtLWlkXCIsIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtaXRlbS1pZFwiKSk7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIiwgdGhpcy5pZCk7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXN1Yml0ZW0taWRcIiwgXCIwXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG5cclxuICAgICAgICAvL21lbnUgc3ViLWl0ZW0gY2xpY2tcclxuICAgICAgICAkKFwiLnNhb3AtYmctc3ViaXRlbVwiKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtc3ViaXRlbS1pZFwiLCB0aGlzLmlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWVudS1zaWRlYmFyXCIpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMuR2V0U2Vzc2lvblN0b3JhZ2VWYWx1ZXMoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlU2Vzc2lvblN0b3JhZ2VWYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0TWVudVNpZGViYXJQb3BvdmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNpZGViYXJDb2xsYXBzZSgpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5zaWRlYmFyQ29sbGFwc2VcIik7XHJcbiAgICAgICAgJCgnI21lbnVUb3BJY29uTGFyZ2UnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnI21lbnVUb3BJY29uU21hbGwnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnLnNpZGViYXItbWVudS1jYXB0aW9uJykudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpO1xyXG4gICAgICAgICQoJyNzaWRlYmFyLWNvbnRhaW5lcicpLnRvZ2dsZUNsYXNzKCdzaWRlYmFyLWV4cGFuZGVkIHNpZGViYXItY29sbGFwc2VkJyk7XHJcbiAgICAgICAgJCgnLnNhb3AtYmctc3ViaXRlbXMnKS50b2dnbGVDbGFzcygnZC1ub25lJyk7XHJcbiAgICAgICAgJCgnI21lbnVDbG9zZUJ1dHRvbicpLnRvZ2dsZUNsYXNzKCdkLW5vbmUnKTtcclxuICAgICAgICB2YXIgU2VwYXJhdG9yVGl0bGUgPSAkKCcjc2lkZWJhci1jb250YWluZXInKTtcclxuICAgICAgICBpZiAoU2VwYXJhdG9yVGl0bGUuaGFzQ2xhc3MoJ3NpZGViYXItY29sbGFwc2VkJykpIHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIsIFwidHJ1ZVwiKVxyXG4gICAgICAgICAgICB0aGlzLl9jb2xsRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG4gICAgICAgICAgICB0aGlzLl9leHBFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIiwgXCJmYWxzZVwiKVxyXG4gICAgICAgICAgICB0aGlzLl9jb2xsRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4cEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1lbnVJdGVtQ29sbGFwc2UoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLm1lbnVJdGVtQ29sbGFwc2VcIik7XHJcbiAgICAgICAgdmFyIHByZXZpb3VzSXRlbUlEID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIpO1xyXG4gICAgICAgIHZhciBpdGVtSUQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIik7XHJcbiAgICAgICAgdmFyIHN1Yml0ZW1zSUQgPSBpdGVtSUQrXCItY29sbGFwc2VcIjtcclxuICAgICAgICB2YXIgc3ViaXRlbUlEID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIpO1xyXG5cclxuICAgICAgICB2YXIgcHJldmlvdXMgPSAkKFwiI1wiICsgcHJldmlvdXNJdGVtSUQpO1xyXG4gICAgICAgIHZhciBpdGVtID0gJCgnIycraXRlbUlEKTtcclxuICAgICAgICB2YXIgc3ViaXRlbXMgPSAkKFwiI1wiICsgc3ViaXRlbXNJRCk7XHJcbiAgICAgICAgdmFyIHN1Yml0ZW0gPSAkKFwiI1wiK3N1Yml0ZW1zSUQrXCI+I1wiK3N1Yml0ZW1JRCk7XHJcblxyXG4gICAgICAgIHByZXZpb3VzLnJlbW92ZUNsYXNzKFwic2FvcC1iZy1pdGVtLXNlbGVjdGVkXCIpOy8vJ3VuLWNvbG9yJyBwcmV2aW91cyBpdGVtXHJcbiAgICAgICAgcHJldmlvdXNbMF0uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBcImZhbHNlXCIpO1xyXG4gICAgICAgIGl0ZW1bMF0uc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBcInRydWVcIik7XHJcbiAgICAgICAgaXRlbS5hZGRDbGFzcyhcInNhb3AtYmctaXRlbS1zZWxlY3RlZFwiKTsvL2NvbG9yIGl0ZW1cclxuICAgICAgICBzdWJpdGVtcy5hZGRDbGFzcygnc2hvdycpOy8vZXhwYW5kIGNvbGxhcHNlXHJcbiAgICAgICAgc3ViaXRlbS5hZGRDbGFzcyhcInNhb3AtYmctc3ViaXRlbS1zZWxlY3RlZFwiKTsvL2NvbG9yIHN1Yml0ZW1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgR2V0U2Vzc2lvblN0b3JhZ2VWYWx1ZXMoKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiTWVudVNpZGViYXIuR2V0U2Vzc2lvblN0b3JhZ2VWYWx1ZXNcIik7XHJcbiAgICAgICAgLy9kZWZhdWx0c1xyXG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIikgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwic2FvcC1tZW51LXNpZGViYXItZXhwYW5kZWRcIiwgbnVsbCk7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJzYW9wLW1lbnUtcHJldmlvdXMtaXRlbS1pZFwiLCBudWxsKTtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1pdGVtLWlkXCIsIFwibmFtaXpqZVwiKTtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIsIFwiMFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc2lkZWJhciBleHBhbmRlZC9jb250cmFjdGVkXHJcbiAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzYW9wLW1lbnUtc2lkZWJhci1leHBhbmRlZFwiKSA9PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNpZGViYXJDb2xsYXBzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9zZWxlY3RlZC1tZW51IGl0ZW1cclxuICAgICAgICB0aGlzLm1lbnVJdGVtQ29sbGFwc2UoKVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBEZWxldGVTZXNzaW9uU3RvcmFnZVZhbHVlcygpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJNZW51U2lkZWJhci5EZWxldGVTZXNzaW9uU3RvcmFnZVZhbHVlc1wiKTtcclxuXHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1zaWRlYmFyLWV4cGFuZGVkXCIpO1xyXG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oXCJzYW9wLW1lbnUtcHJldmlvdXMtaXRlbS1pZFwiKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFwic2FvcC1tZW51LWl0ZW0taWRcIik7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShcInNhb3AtbWVudS1zdWJpdGVtLWlkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRNZW51U2lkZWJhclBvcG92ZXIoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIk1lbnVTaWRlYmFyLmluaXRNZW51U2lkZWJhclBvcG92ZXJcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3ZlciA9IG5ldyBTYW9wUG9wb3ZlcihcIi5tZW51LXBvcHVwXCIpO1xyXG4gICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5pbml0U2VsZkNvbnRhaW5lclBvcG92ZXIoKTtcclxuICAgICAgICB0aGlzLl9tZW51U2lkZWJhclBvcG92ZXIuZGlzYWJsZVBvcG92ZXIoKTtcclxuXHJcbiAgICAgICAgdmFyIGVsZW1lbnRWaXNpYmxlID0gJChcIiNjb2xsYXBzZS1pY29uLWNvbGxcIikuaXMoJzp2aXNpYmxlJyk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnRWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lbnVTaWRlYmFyUG9wb3Zlci5lbmFibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVudVNpZGViYXJQb3BvdmVyLmRpc2FibGVQb3BvdmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgZW51bSBTYW9wTXNnRGxnVHlwZSB7XHJcbiAgICBtdEluZm9ybWF0aW9uID0gMVxyXG4gICAgLG10V2FybmluZyA9IDJcclxuICAgICxtdEVycm9yID0gM1xyXG4gICAgLy8sIG10Q29uZmlybWF0aW9uLCBtdEN1c3RvbVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wTXNnRGxnQnV0dG9uIHtcclxuICAgIG1iTm9uZSA9IDBcclxuICAgICxtYk9LID0gMVxyXG4gICAgLG1iQ2FuY2VsID0gMlxyXG4gICAgLG1iWWVzID0gM1xyXG4gICAgLG1iTm8gPSA0XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcE1zZ0RsZ0V2ZW50IHtcclxuICAgIHBhcmVudDphbnk7XHJcbiAgICBkYXRhOmFueTtcclxufVxyXG5cclxudHlwZSBTYW9wTXNnRGxnQnV0dG9ucyA9IEFycmF5PFNhb3BNc2dEbGdCdXR0b24+O1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE1lc3NhZ2VEbGcge1xyXG4gICAgcHJpdmF0ZSBfc2VuZGVyOlNhb3BNc2dEbGdFdmVudDtcclxuICAgIHB1YmxpYyBvbk9rOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbkNhbmNlbDogKHNlbmRlcjphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25ZZXM6IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uTm86IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHNlbmRlcjpTYW9wTXNnRGxnRXZlbnQpe1xyXG4gICAgICAgIHRoaXMuX3NlbmRlciA9IHNlbmRlcjtcclxuICAgIH1cclxuXHJcbiAgICBTaG93KE1zZzpzdHJpbmcsVGl0bGU6c3RyaW5nLERsZ1R5cGU6U2FvcE1zZ0RsZ1R5cGUgPSBTYW9wTXNnRGxnVHlwZS5tdEluZm9ybWF0aW9uLEJ1dHRvbnM6U2FvcE1zZ0RsZ0J1dHRvbnMgPSBbU2FvcE1zZ0RsZ0J1dHRvbi5tYk9LXSk6U2FvcE1zZ0RsZ0J1dHRvbntcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm1lc3NhZ2U6XCIrTXNnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInRpdGxlOlwiK1RpdGxlKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBsZXQgdGl0bGVEaXYgPSAkKCcjYWxlcnQtbW9kYWwtdGl0bGUtZGl2Jyk7XHJcbiAgICAgICAgbGV0IGJvZHlUYWcgPSAkKCcjYWxlcnQtbW9kYWwtYm9keScpO1xyXG5cclxuICAgICAgICBpZiAoRGxnVHlwZSA9PSBTYW9wTXNnRGxnVHlwZS5tdEluZm9ybWF0aW9uKXtcclxuICAgICAgICAgICAgJChcIiNhbGVydC1tb2RhbC10aXRsZS1kaXZcIikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLFwid2hpdGVcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChEbGdUeXBlID09IFNhb3BNc2dEbGdUeXBlLm10RXJyb3IpIHtcclxuICAgICAgICAgICAgJChcIiNhbGVydC1tb2RhbC10aXRsZS1kaXZcIikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLFwiI0Q4MkMyNVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKFwiI2FsZXJ0LW1vZGFsLXRpdGxlLWRpdlwiKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsXCJzaWx2ZXJcIik7ICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWdsb2JhbC5pc0VtcHR5KFRpdGxlKSl7XHJcbiAgICAgICAgICAgIHRpdGxlRGl2Lmh0bWwoVGl0bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBib2R5VGFnLmh0bWwoTXNnKTtcclxuXHJcbiAgICAgICAgaWYgKEJ1dHRvbnMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iT0sgPSBCdXR0b25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50ID09PSBTYW9wTXNnRGxnQnV0dG9uLm1iT0spO1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKF9lbGVtZW50X21iT0spKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZChfdGhpcy5vbk9rKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbk9rKF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iT0s7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iQ2FuY2VsID0gQnV0dG9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gU2FvcE1zZ0RsZ0J1dHRvbi5tYkNhbmNlbCk7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJDYW5jZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Q2FuY2VsXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydENhbmNlbFwiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRDYW5jZWxcIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZChfdGhpcy5vbkNhbmNlbCkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25DYW5jZWwoX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJDYW5jZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBfZWxlbWVudF9tYlllcyA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJZZXMpO1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmlzVW5EZWZpbmVkKF9lbGVtZW50X21iWWVzKSkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwuaXNVbkRlZmluZWQoX3RoaXMub25ZZXMpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uWWVzKF90aGlzLl9zZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iWWVzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX2VsZW1lbnRfbWJObyA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJObyk7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJObykpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKF90aGlzLm9uTm8pKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uTm8oX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJObztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJChcIiNidG5BbGVydE9LXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Q2FuY2VsXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Tm9cIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBTYW9wTXNnRGxnQnV0dG9uLm1iTm9uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICQoJyNhbGVydC1tb2RhbCcpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAkKFwiI2FsZXJ0LW1vZGFsLWJ0bi1va1wiKS51bmJpbmQoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgJCh0aGlzKS5tb2RhbCgnZGlzcG9zZScpO1xyXG4gICAgICAgIH0pXHJcbiAgICBcclxuICAgICAgICAkKCcjYWxlcnQtbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgIGdsb2JhbC5zZXRNb2RhbEZvcm1aSW5kZXgoJyNhbGVydC1tb2RhbCcpOyBcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/Ly8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9ib290c3RyYXAtbXVsdGlzZWxlY3QvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuXHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcE11bHRpc2VsZWN0UGFyYW1zIHtcclxuICAgIHRhcmdldDpzdHJpbmcsXHJcbiAgICBzZWxlY3RBbGw/OmJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wTXVsdGlzZWxlY3RPcHRpb25zIHtcclxuICAgIHRlbXBsYXRlc0J1dHRvbj86IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE11bHRpc2VsZWN0IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBfY2FwdGlvbjogc3RyaW5nID0gXCJTa3VwaW5hXCI7XHJcbiAgICBwcml2YXRlIF9tdWx0aVNlbGVjdE9iamVjdDogYW55O1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogU2FvcE11bHRpc2VsZWN0T3B0aW9ucztcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgbXNDb250YWluZXI6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHB1YmxpYyBtc0J1dHRvbjogSlF1ZXJ5PEhUTUxCdXR0b25FbGVtZW50PjtcclxuICAgIHB1YmxpYyBtc1BvcHVwQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHVibGljIG1zQ29udGFpbmVyTGFiZWw6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHB1YmxpYyBzZWxlY3RlZENCOmFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihsaWJOYW1lOnN0cmluZyA9IFwiXCIsIG9wdGlvbnM6U2FvcE11bHRpc2VsZWN0T3B0aW9ucyA9IG51bGwpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0XCIpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgfSBcclxuXHJcbiAgICBzZXRPcHRpb25zKG9wdGlvbnM6IFNhb3BNdWx0aXNlbGVjdE9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgICAvLyBmaXJzdCBzZXQgZGVmYXVsdCBvcHRpb25zXHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGVzQnV0dG9uOiAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtdWx0aXNlbGVjdCBkcm9wZG93bi10b2dnbGUgcHItMFwiIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIj48c3BhbiBjbGFzcz1cIm11bHRpc2VsZWN0LXNlbGVjdGVkLXRleHRcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJzYW9wLWltZy1kb3duIHNpLXMgZmxvYXQtcmlnaHRcIj48L3NwYW4+PC9idXR0b24+J1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGVtcGxhdGVzQnV0dG9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMudGVtcGxhdGVzQnV0dG9uID0gb3B0aW9ucy50ZW1wbGF0ZXNCdXR0b247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGVybWlub2xvZ3lMaXN0KCkge1xyXG4gICAgICAgIGxldCBfdGVybWlub2xvZ3k6IHN0cmluZ1tdID0gWydJxaHEjWknLCAnVnNpJywgJ0l6YmVyaSBwcmlrYXphbmUnLCAnaXpicmFuaWgnXTtcclxuICAgICAgICBpZiAoIWdsb2JhbC5pc0VtcHR5KHRoaXMuX2NhcHRpb24pKSB7XHJcbiAgICAgICAgICAgIF90ZXJtaW5vbG9neSA9IFsnScWhxI1pJywgJ1ZzaScsICdJemJlcmkgcHJpa2F6YW5lJywgJ2l6YnJhbmloJywgdGhpcy5fY2FwdGlvbl07XHJcbiAgICAgICAgfSBcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChfdGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmREaXYoZWxlbWV0OmFueSl7XHJcbiAgICAgICAgdGhpcy5tc0NvbnRhaW5lciA9ICQoZWxlbWV0LiRjb250YWluZXIpO1xyXG4gICAgICAgIHRoaXMubXNCdXR0b24gPSAkKGVsZW1ldC4kYnV0dG9uKTtcclxuICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwgPSB0aGlzLm1zQ29udGFpbmVyLmZpbmQoXCIjY29udGFpbmVyTGFiZWxcIik7XHJcbiAgICAgICAgdGhpcy5tc1BvcHVwQ29udGFpbmVyID0gJChlbGVtZXQuJHBvcHVwQ29udGFpbmVyKTtcclxuICAgICAgICAvL3RoaXMuc2VsZWN0ZWRDQiA9IGVsZW1ldC4kc2VsZWN0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENCLnZhbCgpLmxlbmd0aCl7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TXNGbG9hdGluZ0xhYmVsKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1zRmxvYXRpbmdMYWJlbCh0cnVlKTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBzZXRNc0Zsb2F0aW5nTGFiZWwoaXNFbXByeTpib29sZWFuKXtcclxuICAgICAgICBpZiAoaXNFbXByeSl7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5hZGRDbGFzcygnbXMtZmxvYXQtbGFiZWwtZW1wdHknKTtcclxuICAgICAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsLnJlbW92ZUNsYXNzKCdtcy1mbG9hdC1sYWJlbC1zZWxlY3RlZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubXNDb250YWluZXJMYWJlbC5yZW1vdmVDbGFzcygnbXMtZmxvYXQtbGFiZWwtZW1wdHknKTtcclxuICAgICAgICAgICAgdGhpcy5tc0NvbnRhaW5lckxhYmVsLmFkZENsYXNzKCdtcy1mbG9hdC1sYWJlbC1zZWxlY3RlZCcpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIG9uSW5pdGlhbGl6ZWRDb250cm9sKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTXVsdGlzZWxlY3Qub25Jbml0aWFsaXplZENvbnRyb2xcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ0IuaGFzQ2xhc3MoXCJpbnB1dC12YWxpZGF0aW9uLWVycm9yXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXNCdXR0b24uYWRkQ2xhc3MoXCJzYW9wLWVycm9yLWlucHV0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLm1zQ29udGFpbmVyTGFiZWwuYWRkQ2xhc3MoXCJzYW9wLWVycm9yLWlucHV0LXRleHRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkb2RhbW8gc3RpY2t5IGNzcyB6YSBwcnZpIGVsZW1lbnRcclxuICAgICAgICB0aGlzLmFkZFN0aWNreUNsYXNzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuYWZ0ZXJJbml0aWFsaXplZENvbnRyb2woZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkU3RpY2t5Q2xhc3MoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNdWx0aXNlbGVjdC5hZGRTdGlja3lDbGFzc1wiKTtcclxuXHJcbiAgICAgICAgbGV0IHNlem5hbSA9IHRoaXMubXNDb250YWluZXIuZmluZChcImJ1dHRvbi5tdWx0aXNlbGVjdC1vcHRpb24uZHJvcGRvd24taXRlbVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleDogbnVtYmVyLCBlbGVtOiBhbnkpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdEl0ZW0gPSAkKGVsZW0pO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0SXRlbS50ZXh0KCkgPT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdEl0ZW0uYWRkQ2xhc3MoXCJzYW9wLW11bHRpc2VsZWN0LWl0ZW0tc3RpY2t5XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCh0YXJnZXQ6IHN0cmluZyA9IFwiXCIsIGNhcHRpb24gPSBcIlwiICl7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNdWx0aXNlbGVjdC5pbml0XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9jYXB0aW9uID0gY2FwdGlvbjtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcHJldm9kZSAodHVkaSB6YSB0aGlzLl9jYXB0aW9uKVxyXG4gICAgICAgIHRoaXMuc2V0VGVybWlub2xvZ3lMaXN0KCk7XHJcblxyXG4gICAgICAgIGlmIChnbG9iYWwuaXNFbXB0eSh0YXJnZXQpKSB7dGFyZ2V0ID0gXCIuc2FvcC1tdWx0aXNlbGVjdFwiO31cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCID0gJCh0YXJnZXQpO1xyXG5cclxuICAgICAgICAvLyBhbGkgaW1hIHNlbGVjdGVkQ0IgZGF0YS1jYXB0aW9uXHJcbiAgICAgICAgbGV0IHNlbGVjdENhcHRpb24gPSBcIlwiO1xyXG4gICAgICAgIGlmICghZ2xvYmFsLmlzRW1wdHkodGhpcy5fY2FwdGlvbikpIHtcclxuICAgICAgICAgICAgc2VsZWN0Q2FwdGlvbiA9IHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUodGhpcy5fY2FwdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkYXRhQ2FwdGlvbiA9IHRoaXMuc2VsZWN0ZWRDQi5hdHRyKFwiZGF0YS1jYXB0aW9uXCIpO1xyXG4gICAgICAgIGlmICghZ2xvYmFsLmlzRW1wdHkoZGF0YUNhcHRpb24pKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdENhcHRpb24gPSBkYXRhQ2FwdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQodGFyZ2V0KS5tdWx0aXNlbGVjdCh7XHJcbiAgICAgICAgICAgIG1heEhlaWdodDogMzUwLCAgXHJcbiAgICAgICAgICAgIGVuYWJsZUZpbHRlcmluZzogdHJ1ZSxcclxuICAgICAgICAgICAgaW5jbHVkZVNlbGVjdEFsbE9wdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgZW5hYmxlQ2FzZUluc2Vuc2l0aXZlRmlsdGVyaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBlbmFibGVGdWxsVmFsdWVGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICBmaWx0ZXJQbGFjZWhvbGRlcjogdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIknFocSNaVwiKSxcclxuICAgICAgICAgICAgbm9uU2VsZWN0ZWRUZXh0OiAnJyxcclxuICAgICAgICAgICAgYWxsU2VsZWN0ZWRUZXh0OnRoaXMuX3RyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJWc2lcIiksXHJcbiAgICAgICAgICAgIHNlbGVjdEFsbFRleHQ6dGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIkl6YmVyaSBwcmlrYXphbmVcIiksXHJcbiAgICAgICAgICAgIG5TZWxlY3RlZFRleHQ6dGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShcIml6YnJhbmloXCIpLFxyXG4gICAgICAgICAgICBpbmNsdWRlRmlsdGVyQ2xlYXJCdG46IHRydWUsXHJcbiAgICAgICAgICAgIGRpc2FibGVJZkVtcHR5OiBmYWxzZSxcclxuICAgICAgICAgICAgbnVtYmVyRGlzcGxheWVkOiAyLFxyXG4gICAgICAgICAgICBidXR0b25XaWR0aDogJzIwMHB4JyxcclxuICAgICAgICAgICAgYnV0dG9uQ2xhc3MgOidzYW9wLWNvbnRyb2wgZm9ybS1jb250cm9sIHNoYWRvdy1ub25lIG1zLWltYWdlLWRvd24gcHItMCcsXHJcbiAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lcjogJzxkaXYgaWQ9XCJzZWxlY3RlZC1wYXJlbnRzLWNvbnRhaW5lclwiPjxsYWJlbCBpZCA9XCJjb250YWluZXJMYWJlbFwiIGNsYXNzPVwibXMtZmxvYXQtbGFiZWwgbXMtZmxvYXQtbGFiZWwtc2VsZWN0ZWQgc2FvcC10eHQtN1wiIGZvcj1cIk5hbWVcIj4nK3NlbGVjdENhcHRpb24rJzwvbGFiZWw+PC9kaXY+JyxcclxuICAgICAgICAgICAgb25TZWxlY3RBbGw6IGZ1bmN0aW9uIChzZWxlY3RlZE9wdGlvbnM6IEpRdWVyeSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyU2VsZWN0QWxsKHNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuJHNlbGVjdCk7XHJcbiAgICAgICAgICAgIH0sICAgICAgICBcclxuICAgICAgICAgICAgb25EZXNlbGVjdEFsbDogZnVuY3Rpb24oc2VsZWN0ZWRPcHRpb25zOkpRdWVyeSl7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5iaW5kRGl2KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJEZXNlbGVjdEFsbChzZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCh0aGlzLiRzZWxlY3QpO1xyXG4gICAgICAgICAgICB9LCAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24ob3B0aW9uOiBKUXVlcnksIGNoZWNrZWQ6IGJvb2xlYW4pe1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyQ2hhbmdlKG9wdGlvbiwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZnRlckNoYW5nZUNvbW1vbkV2ZW50KHRoaXMuJHNlbGVjdCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IGZ1bmN0aW9uICgkc2VsZWN0LCAkY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fbXVsdGlTZWxlY3RPYmplY3QgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYmluZERpdih0aGlzKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uSW5pdGlhbGl6ZWRDb250cm9sKHRoaXMpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZXM6IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbjogdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZXNCdXR0b24sXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6ICc8bGkgY2xhc3M9XCJtdWx0aXNlbGVjdC1pdGVtIG11bHRpc2VsZWN0LWZpbHRlclwiPjxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0zXCI+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIG11bHRpc2VsZWN0LXNlYXJjaFwiIHR5cGU9XCJ0ZXh0XCIgLz48ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtcHJlcGVuZFwiPjxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dCBzYW9wLWltZy1zZWFyY2ggc2kteHNcIj48L3NwYW4+PC9kaXY+PC9kaXY+PC9saT4nLFxyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgfSlcclxuICAgICAgICAubXVsdGlzZWxlY3QoJ3NlbGVjdEFsbCcsIGZhbHNlLCB0cnVlKVxyXG4gICAgICAgIC5tdWx0aXNlbGVjdCgndXBkYXRlQnV0dG9uVGV4dCcpO1xyXG4gICAgICAgIDsgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlYnVpbGQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdyZWJ1aWxkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJTZWxlY3RBbGwoc2VsZWN0ZWRPcHRpb25zOiBKUXVlcnkpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJEZXNlbGVjdEFsbChzZWxlY3RlZE9wdGlvbnM6SlF1ZXJ5KXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJDaGFuZ2Uob3B0aW9uOiBKUXVlcnksIGNoZWNrZWQ6IGJvb2xlYW4pe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhZnRlckNoYW5nZUNvbW1vbkV2ZW50KGVsZW1lbnQ6YW55KXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJJbml0aWFsaXplZENvbnRyb2woZWxlbWVudDogYW55KXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE11bHRpc2VsZWN0LmFmdGVySW5pdGlhbGl6ZWRDb250cm9sXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNlbGVjdFZhbHVlcyB2cmVkbm9zdGlcclxuICAgIHNldFNlbGVjdFZhbHVlcyhzZWxlY3RWYWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgLy8gb2R6bmFjaW1vIHZzZSB6YXBvc2xlbmVcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ2Rlc2VsZWN0QWxsJyk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RWYWx1ZXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBvem5hY2ltbyBpemJyYW5lXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDQi5tdWx0aXNlbGVjdCgnc2VsZWN0Jywgc2VsZWN0VmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCLm11bHRpc2VsZWN0KCdyZWZyZXNoJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9tdWx0aVNlbGVjdE9iamVjdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmluZERpdih0aGlzLl9tdWx0aVNlbGVjdE9iamVjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJDaGFuZ2VDb21tb25FdmVudCh0aGlzLl9tdWx0aVNlbGVjdE9iamVjdC4kc2VsZWN0KTtcclxuICAgICAgICB9IFxyXG4gICAgfVxyXG5cclxuICAgIGNsZWFySHRtbE9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENCXHJcbiAgICAgICAgICAgIC5maW5kKCdvcHRpb24nKVxyXG4gICAgICAgICAgICAucmVtb3ZlKClcclxuICAgICAgICAgICAgLmVuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hIdG1sT3B0aW9ucyhvcHRpb25MaXN0OiBTZWxlY3RPcHRpb25bXSwgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLmNsZWFySHRtbE9wdGlvbnMoKTtcclxuICAgICAgICBpZiAob3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbkxpc3QuZm9yRWFjaChlbGVtZW50ID0+IF90aGlzLnNlbGVjdGVkQ0IuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPVwiJyArIGVsZW1lbnQudmFsdWUgKyAnXCI+JyArIGVsZW1lbnQudGV4dCArICc8L29wdGlvbj4nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVidWlsZCgpO1xyXG4gICAgICAgIHRoaXMuYWRkU3RpY2t5Q2xhc3MoKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdEFsbCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ0IubXVsdGlzZWxlY3QoJ3NlbGVjdEFsbCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDQi52YWwoKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TXNGbG9hdGluZ0xhYmVsKGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TXNGbG9hdGluZ0xhYmVsKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IFNhb3BQaW5jaFpvb20gfSBmcm9tIFwiLi4vQ29tcG9uZW50cy9zYW9wLXBpbmNoLWFuZC16b29tXCI7XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUGRmUHJldmlldyB7XHJcbiAgICBwcml2YXRlIF9wZGZqc0xpYjphbnk7XHJcbiAgICBwcml2YXRlIF9jYW52YXM6YW55O1xyXG4gICAgcHJpdmF0ZSBfdmlld2VyOmFueTtcclxuICAgIHByaXZhdGUgX3BkZjphbnk7XHJcbiAgICBwcml2YXRlIF9zY2FsZSA9IDE7XHJcbiAgICAvL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRJZDpzdHJpbmc7XHJcbiAgICBwcml2YXRlIF91cmw6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfZmlsZU5hbWU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfYmFzZTY0OnN0cmluZztcclxuICAgIHByaXZhdGUgX3R5cGU6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc2FvcFBpbmNoWm9vbTpTYW9wUGluY2hab29tO1xyXG5cclxuICAgIGxvYWRwZGZqc0xpYihwZGZqc0xpYjphbnkpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fcGRmanNMaWIgPSBwZGZqc0xpYjtcclxuICAgICAgICB0aGlzLl9zYW9wUGluY2hab29tID0gIG5ldyBTYW9wUGluY2hab29tKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyUGFnZShwYWdlTnVtYmVyOmFueSwgY2FudmFzOmFueSk6dm9pZCB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9wZGYuZ2V0UGFnZShwYWdlTnVtYmVyKS50aGVuKGZ1bmN0aW9uKHBhZ2U6YW55KSB7XHJcbiAgICAgICAgX3RoaXMuX3ZpZXdlciA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogX3RoaXMuX3NjYWxlIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gICBsZXQgX3ZpZXdlck9mZnNldCA9ICQoJy5wZGYtdmlld2VyLWlubmVyJykub2Zmc2V0KCk7XHJcbiAgICAgICAgICAgIC8vICAgbGV0IF93ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gX3ZpZXdlck9mZnNldC5sZWZ0LCB3aW5kb3cuaW5uZXJXaWR0aCAtIF92aWV3ZXJPZmZzZXQubGVmdCAtMjcyIHx8IDApXHJcblxyXG4gICAgICAgICAgICAvLyBsZXQgX3cgPSAkKCcjcGRmLXZpZXdlcicpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIC8vIGNhbnZhcy5oZWlnaHQgPSBfdGhpcy5fdmlld2VyLmhlaWdodDtcclxuICAgICAgICAgICAgLy8gY2FudmFzLndpZHRoID0gX3cgLSAxMDtcclxuICAgICAgICAgICAgbGV0IF93ID0gKF90aGlzLl92aWV3ZXIud2lkdGggYXMgc3RyaW5nKSsncHgnXHJcbiAgICAgICAgICAgICQoJy5zYW9wLWNvbC12aWV3JykuY3NzKCdtaW4td2lkdGgnLCBfdyk7XHJcblxyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gX3RoaXMuX3ZpZXdlci5oZWlnaHQgLSAxMDtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gX3RoaXMuX3ZpZXdlci53aWR0aCAtIDEwOyAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIHBhZ2UucmVuZGVyKHtjYW52YXNDb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSwgdmlld3BvcnQ6IF90aGlzLl92aWV3ZXJ9KS5wcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUGFnZSByZW5kZXJpbmcgY29tcGxldGUuJyk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fc2FvcFBpbmNoWm9vbS5pbml0KFwicGRmLXZpZXdlclwiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHNldERlZmF1bHRTY2FsZShzY2FsZTpudW1iZXIpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fc2FvcFBpbmNoWm9vbS5zZXREZWZhdWx0U2NhbGUoc2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGJhc2U2NFRvVWludDhBcnJheShiYXNlNjQ6c3RyaW5nKTphbnl7XHJcbiAgICAgICAgdmFyIHJhdyA9IGF0b2IoYmFzZTY0KTtcclxuICAgICAgICB2YXIgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHJhdy5sZW5ndGgpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHVpbnQ4QXJyYXlbaV0gPSByYXcuY2hhckNvZGVBdChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVpbnQ4QXJyYXk7XHJcbiAgICB9ICAgXHJcblxyXG4gICAgbG9hZGluZ1BkZlRhc2sobG9hZGluZ1Rhc2s6YW55KTp2b2lke1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uKHBkZjphbnkpIHtcclxuICAgICAgICAgICAgX3RoaXMuX3BkZiA9IHBkZjtcclxuICAgICAgICAgICAgX3RoaXMuX3ZpZXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZGYtdmlld2VyJyk7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvcihsZXQgcGFnZSA9IDE7IHBhZ2UgPD0gcGRmLm51bVBhZ2VzOyBwYWdlKyspIHtcclxuICAgICAgICAgICAgICAgIFxyXG4gXHJcbiAgICAgICAgICAgICAgX3RoaXMuX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7ICAgIFxyXG4gICAgICAgICAgICAgIF90aGlzLl9jYW52YXMuY2xhc3NOYW1lID0gJ3BkZi1wYWdlLWNhbnZhcyc7IFxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIGxldCBfcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgICBfcm93LmNsYXNzTmFtZSA9ICdyb3cgbS0wIHAtMCc7IFxyXG5cclxuICAgICAgICAgICAgICBsZXQgX2NvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgICAgX2NvbC5jbGFzc05hbWUgPSAnY29sIG0tMCBwLTAgc2FvcC1jb2wtdmlldyc7IFxyXG5cclxuICAgICAgICAgICAgICBfY29sLmFwcGVuZENoaWxkKF90aGlzLl9jYW52YXMpOyBcclxuXHJcbiAgICAgICAgICAgICAgX3Jvdy5hcHBlbmRDaGlsZChfY29sKTsgXHJcblxyXG4gICAgICAgICAgICAgIF90aGlzLl92aWV3ZXIuYXBwZW5kQ2hpbGQoX3Jvdyk7XHJcbiAgICAgICAgICAgICAgX3RoaXMucmVuZGVyUGFnZShwYWdlLCBfdGhpcy5fY2FudmFzKTtcclxuICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgIC8vbmV3IFNhb3BQaW5jaFpvb20oKS5pbml0KFwicGRmLXZpZXdlclwiKTtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gX3RoaXMuX3Nhb3BQaW5jaFpvb20uaW5pdChcInBkZi12aWV3ZXJcIik7XHJcbiAgICAgICAgICAgIC8vICQoJy5wZGYtcGFnZS1jYW52YXMnKS5hdHRyKFwib25sb2FkXCIsXCJzYW9wUGRmUHJldmlldy5zZXREZWZhdWx0U2NhbGUoMC42KTtcIik7XHJcbiAgICAgICAgICAgIC8vICQoJ2RpdltvbmxvYWRdJykudHJpZ2dlcignb25sb2FkJyk7XHJcbiAgICAgICAgfSk7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWxlTmFtZUJ5VXJsKHVybDpzdHJpbmcpOnZvaWQge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgdHlwZTogXCJIRUFEXCIsXHJcbiAgICAgICAgICAgIHVybDogdXJsLCAgICAgICAgIFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihtZXNzYWdlLCB0ZXh0LCByZXNwb25zZSl7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fdHlwZSA9IHJlc3BvbnNlLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmRvY3VtZW50UmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7ICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW5kZXJFcnJvckRpdigpOnZvaWR7XHJcbiAgICAgICAgLy8kKCcjcGRmLXZpZXdlcicpLmh0bWwoJzxkaXY+TmkgZG9rdW1lbnRvdiB6YSBwcmlrYXo8L2Rpdj4nKTtcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudFByZXZpZXcoKTp2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucmVuZGVyRXJyb3JEaXYoKTtcclxuICAgICAgICB0aGlzLl9kb2N1bWVudElkID0gJChcIiNteU1vZGVsX0RvY3VtZW50SWRcIikudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuX3VybCA9ICQoXCIjbXlNb2RlbF9GaWxlVXJsXCIpLnZhbCgpIGFzIHN0cmluZztcclxuICAgICAgICB0aGlzLl9maWxlTmFtZSA9ICQoXCIjbXlNb2RlbF9GaWxlTmFtZVwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICAgICAgdGhpcy5fYmFzZTY0ID0gJChcIiNteU1vZGVsX0Jhc2U2NFN0cmluZ1wiKS52YWwoKSBhcyBzdHJpbmc7XHJcblxyXG4gICAgICAgIGxldCBfdyA9IHNjcmVlbi53aWR0aDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3VybC5sZW5ndGggPiAwICYmIHRoaXMuX2ZpbGVOYW1lLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RmlsZU5hbWVCeVVybCh0aGlzLl91cmwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2Jhc2U2NC5sZW5ndGggPT0gMCkge3JldHVybjt9XHJcblxyXG4gICAgICAgIGxldCBfZmlsZUV4dGVuc2lvbiA9IHRoaXMuX2ZpbGVOYW1lLnNwbGl0KCcuJykucG9wKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKF9maWxlRXh0ZW5zaW9uLmxlbmd0aCA9PSAwKSB7cmV0dXJuO31cclxuXHJcbiAgICAgICAgdGhpcy5fdHlwZSA9IFwiaW1hZ2UvcG5nXCI7XHJcbiAgICAgICAgaWYgKF9maWxlRXh0ZW5zaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3BkZicpe1xyXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gXCJhcHBsaWNhdGlvbi9wZGZcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gXCJpbWFnZS9cIitfZmlsZUV4dGVuc2lvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRSZW5kZXIoKTtcclxuXHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGRvY3VtZW50UmVuZGVyKCk6dm9pZCB7XHJcbiAgICAgICBsZXQgX3cgPSBzY3JlZW4ud2lkdGg7XHJcblxyXG4gICAgICAgIGlmKF93IDw9IDgwMCAmJiB0aGlzLl90eXBlLmluY2x1ZGVzKFwicGRmXCIpID09IHRydWUpe1xyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVQZGZOb2RlcygpO1xyXG4gICAgICAgICAgICBsZXQgbG9hZGluZ1Rhc2s6YW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYmFzZTY0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBfYXJyYXkgPSB0aGlzLmJhc2U2NFRvVWludDhBcnJheSh0aGlzLl9iYXNlNjQpO1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZ1Rhc2sgPSB0aGlzLl9wZGZqc0xpYi5nZXREb2N1bWVudChfYXJyYXkpOyAgIFxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZ1Rhc2sgPSB0aGlzLl9wZGZqc0xpYi5nZXREb2N1bWVudCh0aGlzLl91cmwpOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdQZGZUYXNrKGxvYWRpbmdUYXNrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYmFzZTY0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICQoJyNwZGYtdmlld2VyJykuaHRtbCgnPGVtYmVkIFNyYz1cImRhdGE6Jyt0aGlzLl90eXBlKyc7YmFzZTY0LCcrdGhpcy5fYmFzZTY0KydcIiBjbGFzcz1cIm14LWF1dG8gZC1mbGV4IGgtMTAwIHctMTAwXCIgdHlwZT1cIicrdGhpcy5fdHlwZSsnXCI+PC9lbWJlZD4nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoJyNwZGYtdmlld2VyJykuaHRtbCgnPGVtYmVkIFNyYz1cIicrdGhpcy5fdXJsKydcIiBjbGFzcz1cIm14LWF1dG8gZC1mbGV4IGgtMTAwIHctMTAwXCIgdHlwZT1cIicrdGhpcy5fdHlwZSsnXCJcIj48L2VtYmVkPicpOyAgICAgICAgXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgfSAgICBcclxuXHJcbiAgICBwcml2YXRlIHByZXBhcmVQZGZOb2RlcygpOnZvaWR7XHJcbiAgICAgICAgbGV0IF9wYXJlbnQgPSAkKCcjcGRmLXZpZXdlcicpLnBhcmVudCgpO1xyXG5cclxuICAgICAgICBsZXQgX21haW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIF9tYWluLmNsYXNzTmFtZSA9ICdwZGYtdmlld2VyLW1haW4nOyBcclxuXHJcbiAgICAgICAgbGV0IF9pbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgX2lubmVyLmNsYXNzTmFtZSA9ICdwZGYtdmlld2VyLWlubmVyJztcclxuXHJcbiAgICAgICAgbGV0IF92aWV3ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIF92aWV3ZXIuaWQgPSAncGRmLXZpZXdlcic7ICAgICAgICAgICAgXHJcblxyXG4gICAgICAgIF9pbm5lci5hcHBlbmRDaGlsZChfdmlld2VyKTtcclxuXHJcbiAgICAgICAgX21haW4uYXBwZW5kQ2hpbGQoX2lubmVyKTtcclxuXHJcbiAgICAgICAgX3BhcmVudC5odG1sKF9tYWluKTsgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGxvYWRCYXNlNjRQZGYoKTp2b2lke1xyXG4gICAgLy8gICAgIGxldCBfYmFzZTY0ID0gJChcIiNteU1vZGVsX0Jhc2U2NFN0cmluZ1wiKS52YWwoKSBhcyBzdHJpbmc7XHJcblxyXG4gICAgLy8gICAgIGlmIChfYmFzZTY0Lmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgbGV0IF9maWxlTmFtZSA9ICQoXCIjbXlNb2RlbF9GaWxlTmFtZVwiKS52YWwoKSBhcyBzdHJpbmc7XHJcbiAgICAvLyAgICAgICAgIGxldCBfZmlsZUV4dGVuc2lvbiA9IF9maWxlTmFtZS5zcGxpdCgnLicpLnBvcCgpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAvLyAgICAgICAgIGxldCBfdyA9IHNjcmVlbi53aWR0aDtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmKF93IDw9IDgwMCAmJiBfZmlsZUV4dGVuc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpID09IFwicGRmXCIpe1xyXG4gICAgLy8gICAgICAgICAgICAgLy9cclxuICAgIC8vICAgICAgICAgICAgIHRoaXMucHJlcGFyZVBkZk5vZGVzKCk7XHJcbiAgICAvLyAgICAgICAgICAgICBsZXQgX2FycmF5ID0gdGhpcy5iYXNlNjRUb1VpbnQ4QXJyYXkoX2Jhc2U2NCk7XHJcbiAgICAvLyAgICAgICAgICAgICB2YXIgbG9hZGluZ1Rhc2sgPSB0aGlzLl9wZGZqc0xpYi5nZXREb2N1bWVudChfYXJyYXkpOyAgIFxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5sb2FkaW5nUGRmVGFzayhsb2FkaW5nVGFzayk7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsZXQgX3R5cGUgPSBcImltYWdlL3BuZ1wiO1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKF9maWxlRXh0ZW5zaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3BkZicpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIF90eXBlID0gXCJhcHBsaWNhdGlvbi9wZGZcIjtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgX3R5cGUgPSBcImltYWdlL1wiK19maWxlRXh0ZW5zaW9uO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgICQoJyNwZGYtdmlld2VyJykuaHRtbCgnPGVtYmVkIFNyYz1cImRhdGE6JytfdHlwZSsnO2Jhc2U2NCwnK19iYXNlNjQrJ1wiIGNsYXNzPVwibXgtYXV0byBkLWZsZXggaC0xMDAgdy0xMDBcIiB0eXBlPVwiJytfdHlwZSsnXCI+PC9lbWJlZD4nKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvL1xyXG4gIFxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvaGFtbWVyanMvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUGluY2hab29tIHtcclxuXHRwcml2YXRlIF9pbml0aWFsaXplZDpib29sZWFuID0gZmFsc2U7XHJcblx0Ly8gcHJpdmF0ZSBfZGVmYXVsdFNldCA9IHt4OiAtNjAsIHk6IC01Myx6OiAwLjZ9O1xyXG5cdHByaXZhdGUgX2RlZmF1bHRTZXQgPSB7eDogMCwgeTogMCx6OiAwLjZ9O1xyXG5cdHByaXZhdGUgX2VsZW1lbnQgOmFueTtcclxuXHRwcml2YXRlIF9oYW1tZXJ0aW1lIDphbnk7XHJcblxyXG5cdHByaXZhdGUgX2ZpeEhhbW1lcmpzRGVsdGFJc3N1ZSA6YW55O1xyXG5cdHByaXZhdGUgX3BpbmNoU3RhcnQgOmFueTtcclxuXHRwcml2YXRlIF9sYXN0RXZlbnQgOmFueTtcclxuXHRcclxuXHRwcml2YXRlIF9vcmlnaW5hbFNpemUgOmFueTtcdFxyXG5cdHByaXZhdGUgX2N1cnJlbnQgOmFueTtcclxuXHRwcml2YXRlIF9sYXN0IDphbnk7XHRcclxuXHRwcml2YXRlIF9waW5jaFpvb21PcmlnaW4gOmFueTtcclxuXHRcclxuXHQvL1xyXG5cdFxyXG5cdHNsZWVwKG1pbGxpc2Vjb25kczpudW1iZXIpOnZvaWQge1xyXG5cdFx0Y29uc3QgZGF0ZSA9IERhdGUubm93KCk7XHJcblx0XHRsZXQgY3VycmVudERhdGUgPSBudWxsO1xyXG5cdFx0ZG8ge1xyXG5cdFx0XHRjdXJyZW50RGF0ZSA9IERhdGUubm93KCk7XHJcblx0XHR9IHdoaWxlIChjdXJyZW50RGF0ZSAtIGRhdGUgPCBtaWxsaXNlY29uZHMpO1xyXG5cdH1cclxuXHJcblx0aW5pdChpZDpzdHJpbmcpe1xyXG5cdFx0Y29uc29sZS5sb2coXCJpbml0Li4uXCIpO1xyXG5cdFx0dGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHJcblx0XHQvLyBsZXQgX3cgPSAkKCB3aW5kb3cgKS53aWR0aCgpOy8vdGhpcy5fZWxlbWVudC5vZmZzZXRXaWR0aDtcclxuXHRcdC8vIC8vbGV0IF9wZGZXID0gcGFyc2VJbnQoJChcIi5wZGYtcGFnZS1jYW52YXNcIikud2lkdGgoKSkpICogMC42O1xyXG5cdFx0Ly8gbGV0IF9wZGZXID0gJChcIi5wZGYtcGFnZS1jYW52YXNcIikud2lkdGgoKSAqIDAuNjtcclxuXHRcdC8vIHRoaXMuX2RlZmF1bHRTZXQueCA9ICggX3cgLSBfcGRmVykgLyAyO1xyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lID0gbmV3IEhhbW1lcih0aGlzLl9lbGVtZW50LCB7fSk7XHRcdFxyXG5cdFx0XHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLmdldCgncGluY2gnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7XHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLmdldCgncGFuJykuc2V0KHsgdGhyZXNob2xkOiAwIH0pO1xyXG5cclxuICAgIFx0dGhpcy5fcGluY2hTdGFydCA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuXHRcdHRoaXMuX29yaWdpbmFsU2l6ZSA9IHt3aWR0aDogMjAwLCBoZWlnaHQ6IDMwMH07XHRcclxuXHRcdHRoaXMuX2N1cnJlbnQgPSB7eDogMCwgeTogMCwgejogMCwgem9vbWluZzogZmFsc2UsIHdpZHRoOiB0aGlzLl9vcmlnaW5hbFNpemUud2lkdGggKiAxLCBoZWlnaHQ6IHRoaXMuX29yaWdpbmFsU2l6ZS5oZWlnaHQgKiAxfTtcdFxyXG5cdFx0dGhpcy5fbGFzdCA9IHt4OiB0aGlzLl9jdXJyZW50LngsIHk6dGhpcy5fY3VycmVudC55LCB6OnRoaXMuX2N1cnJlbnQuen1cdFx0XHJcblxyXG5cdFx0dGhpcy5pbml0RXZlbnRzKCk7XHJcblxyXG5cdFx0dGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cdFx0XHJcblx0XHR0aGlzLnNldERlZmF1bHRTY2FsZSh0aGlzLl9kZWZhdWx0U2V0LnopO1xyXG5cdH1cclxuXHJcblx0c2V0RGVmYXVsdFNjYWxlKHNjYWxlOm51bWJlcikge1xyXG5cdFx0Y29uc29sZS5sb2coXCJzY2FsZTpcIitzY2FsZS50b1N0cmluZygpKTtcclxuXHRcdGlmICh0aGlzLl9pbml0aWFsaXplZCA9PSBmYWxzZSkge3JldHVybjsgfTtcclxuXHRcdC8vdGhpcy5zbGVlcCg1MDApO1xyXG5cclxuXHRcdGxldCBfdGhpcyA9IHRoaXM7XHJcblx0XHQvL1xyXG5cdFx0dGhpcy5fZGVmYXVsdFNldC56ID0gc2NhbGU7XHJcblx0XHQvL1xyXG5cdFx0dGhpcy5fY3VycmVudCA9IHt4OiAwLCB5OiAwLCB6OiB0aGlzLl9kZWZhdWx0U2V0LnosIHpvb21pbmc6IGZhbHNlLCB3aWR0aDogdGhpcy5fb3JpZ2luYWxTaXplLndpZHRoICogMSwgaGVpZ2h0OiB0aGlzLl9vcmlnaW5hbFNpemUuaGVpZ2h0ICogMX07XHRcclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblx0XHQvL1xyXG5cdFx0bGV0IF9zY3JlZW5XaWR0aCA9ICQoIHdpbmRvdyApLndpZHRoKCk7XHJcbiAgICBcdGxldCBfcGRmV2lkdGggPSBwYXJzZUludCgkKFwiLnBkZi1wYWdlLWNhbnZhc1wiKS5hdHRyKFwid2lkdGhcIikpO1xyXG5cdFx0X3BkZldpZHRoID0gX3BkZldpZHRoICogdGhpcy5fZGVmYXVsdFNldC56O1xyXG5cdFx0bGV0IF9sZWZ0Q2FudmFzID0gKF9zY3JlZW5XaWR0aCAtIChfc2NyZWVuV2lkdGggKiB0aGlzLl9kZWZhdWx0U2V0LnopKSAvIDI7XHJcblx0XHRsZXQgX2RpZmZMZWZ0ID0gKF9zY3JlZW5XaWR0aCAtIF9wZGZXaWR0aCkgLyAyO1xyXG5cdFx0dGhpcy5fZGVmYXVsdFNldC54ID0gKF9sZWZ0Q2FudmFzIC0gX2RpZmZMZWZ0ICsgNSkgKiAoLTEpO1xyXG5cdFx0Ly8gLy9cclxuXHRcdGxldCBfcGRmRG9jSGVpZ2h0ID0gJChcIiNkb2N1bWVudC1wcmV2aWV3XCIpLmhlaWdodCgpO1xyXG5cdFx0aWYgKF9wZGZEb2NIZWlnaHQgPD0gMCApIHtcclxuXHRcdFx0X3BkZkRvY0hlaWdodCA9IDI4MDtcclxuXHRcdH1cclxuXHRcdHRoaXMuX2RlZmF1bHRTZXQueSA9ICgoX3BkZkRvY0hlaWdodCAtIChfcGRmRG9jSGVpZ2h0ICogdGhpcy5fZGVmYXVsdFNldC56KSkvMikgKiAoLTEpO1x0XHRcclxuXHRcdC8vXHJcblx0XHRcclxuXHRcdHRoaXMuX2N1cnJlbnQueCA9IHRoaXMuX2RlZmF1bHRTZXQueFxyXG5cdFx0dGhpcy5fY3VycmVudC55ID0gdGhpcy5fZGVmYXVsdFNldC55O1xyXG5cdFx0dGhpcy5fY3VycmVudC56ID0gdGhpcy5fZGVmYXVsdFNldC56O1xyXG5cclxuXHRcdHRoaXMuX2xhc3QueCA9IHRoaXMuX2RlZmF1bHRTZXQueFxyXG5cdFx0dGhpcy5fbGFzdC55ID0gdGhpcy5fZGVmYXVsdFNldC55O1xyXG5cdFx0dGhpcy5fbGFzdC56ID0gdGhpcy5fZGVmYXVsdFNldC56O1xyXG5cclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblx0fVxyXG5cclxuXHR1cGRhdGUoKTp2b2lkIHtcclxuXHQgIHRoaXMuX2N1cnJlbnQuaGVpZ2h0ID0gdGhpcy5fb3JpZ2luYWxTaXplLmhlaWdodCAqIHRoaXMuX2N1cnJlbnQuejtcclxuXHQgIHRoaXMuX2N1cnJlbnQud2lkdGggPSB0aGlzLl9vcmlnaW5hbFNpemUud2lkdGggKiB0aGlzLl9jdXJyZW50Lno7XHJcblx0ICB0aGlzLl9lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IFwidHJhbnNsYXRlM2QoXCIgKyB0aGlzLl9jdXJyZW50LnggKyBcInB4LCBcIiArIHRoaXMuX2N1cnJlbnQueSArIFwicHgsIDApIHNjYWxlKFwiICsgdGhpcy5fY3VycmVudC56ICsgXCIpXCI7XHJcblx0fVxyXG5cclxuXHRnZXRDb29yZHMoZWxlbTphbnkpOmFueSB7IC8vIGNyb3NzYnJvd3NlciB2ZXJzaW9uXHJcblx0ICB2YXIgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcblx0ICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XHJcblx0ICB2YXIgZG9jRWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcblxyXG5cdCAgdmFyIHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2NFbC5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3A7XHJcblx0ICB2YXIgc2Nyb2xsTGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2NFbC5zY3JvbGxMZWZ0IHx8IGJvZHkuc2Nyb2xsTGVmdDtcclxuXHJcblx0ICB2YXIgY2xpZW50VG9wID0gZG9jRWwuY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XHJcblx0ICB2YXIgY2xpZW50TGVmdCA9IGRvY0VsLmNsaWVudExlZnQgfHwgYm9keS5jbGllbnRMZWZ0IHx8IDA7XHJcblxyXG5cdCAgdmFyIHRvcCAgPSBib3gudG9wICsgIHNjcm9sbFRvcCAtIGNsaWVudFRvcDtcclxuXHQgIHZhciBsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDtcclxuXHJcblx0ICByZXR1cm4geyB4OiBNYXRoLnJvdW5kKGxlZnQpLCB5OiBNYXRoLnJvdW5kKHRvcCkgfTtcclxuXHR9XHJcblxyXG5cclxuXHRnZXRDb29yZGluYXRlU2hpZnREdWVUb1NjYWxlKHNpemU6YW55LCBzY2FsZTphbnkpOmFueXtcclxuXHQgIHZhciBuZXdXaWR0aCA9IHNjYWxlICogc2l6ZS53aWR0aDtcclxuXHQgIHZhciBuZXdIZWlnaHQgPSBzY2FsZSAqIHNpemUuaGVpZ2h0O1xyXG5cdCAgdmFyIGR4ID0gKG5ld1dpZHRoIC0gc2l6ZS53aWR0aCkgLyAyO1xyXG5cdCAgdmFyIGR5ID0gKG5ld0hlaWdodCAtIHNpemUuaGVpZ2h0KSAvIDI7XHJcblx0ICByZXR1cm4ge1xyXG5cdFx0eDogZHgsXHJcblx0XHR5OiBkeVxyXG5cdCAgfTtcclxuXHR9XHJcblxyXG5cdHNjYWxlRnJvbSh6b29tT3JpZ2luOmFueSwgY3VycmVudFNjYWxlOmFueSwgbmV3U2NhbGU6YW55KTphbnkge1xyXG5cdCAgdmFyIGN1cnJlbnRTaGlmdCA9IHRoaXMuZ2V0Q29vcmRpbmF0ZVNoaWZ0RHVlVG9TY2FsZSh0aGlzLl9vcmlnaW5hbFNpemUsIGN1cnJlbnRTY2FsZSk7XHJcblx0ICB2YXIgbmV3U2hpZnQgPSB0aGlzLmdldENvb3JkaW5hdGVTaGlmdER1ZVRvU2NhbGUodGhpcy5fb3JpZ2luYWxTaXplLCBuZXdTY2FsZSk7XHJcblxyXG5cdCAgdmFyIHpvb21EaXN0YW5jZSA9IG5ld1NjYWxlIC0gY3VycmVudFNjYWxlXHJcblx0ICBcclxuXHQgIHZhciBzaGlmdCA9IHtcclxuXHRcdHg6IGN1cnJlbnRTaGlmdC54IC0gbmV3U2hpZnQueCxcclxuXHRcdHk6IGN1cnJlbnRTaGlmdC55IC0gbmV3U2hpZnQueSxcclxuXHQgIH1cclxuXHJcblx0ICB2YXIgb3V0cHV0ID0ge1xyXG5cdFx0eDogem9vbU9yaWdpbi54ICogc2hpZnQueCxcclxuXHRcdHk6IHpvb21PcmlnaW4ueSAqIHNoaWZ0LnksXHJcblx0XHR6OiB6b29tRGlzdGFuY2VcclxuXHQgIH1cclxuXHQgIHJldHVybiBvdXRwdXQ7XHJcblx0fVxyXG5cclxuXHRnZXRSZWxhdGl2ZVBvc2l0aW9uKGVsZW1lbnQ6YW55LCBwb2ludDphbnksIG9yaWdpbmFsU2l6ZTphbnksIHNjYWxlOmFueSk6YW55IHtcclxuXHQgIHZhciBkb21Db29yZHMgPSB0aGlzLmdldENvb3JkcyhlbGVtZW50KTtcclxuXHJcblx0ICB2YXIgZWxlbWVudFggPSBwb2ludC54IC0gZG9tQ29vcmRzLng7XHJcblx0ICB2YXIgZWxlbWVudFkgPSBwb2ludC55IC0gZG9tQ29vcmRzLnk7XHJcblxyXG5cdCAgdmFyIHJlbGF0aXZlWCA9IGVsZW1lbnRYIC8gKG9yaWdpbmFsU2l6ZS53aWR0aCAqIHNjYWxlIC8gMikgLSAxO1xyXG5cdCAgdmFyIHJlbGF0aXZlWSA9IGVsZW1lbnRZIC8gKG9yaWdpbmFsU2l6ZS5oZWlnaHQgKiBzY2FsZSAvIDIpIC0gMTtcclxuXHQgIHJldHVybiB7IHg6IHJlbGF0aXZlWCwgeTogcmVsYXRpdmVZIH1cclxuXHR9XHJcblxyXG5cdGluaXRFdmVudHMoKTp2b2lkIHtcclxuXHRcdGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5vbigncGFuZW5kJywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwicGFuZW5kXCIpO1xyXG5cdFx0ICBpZiAodGhpcy5fY3VycmVudC5zY2FsZSAhPSB0aGlzLl9sYXN0LnNjYWxlKSB7XHJcblx0XHQgIFx0dGhpcy5fbGFzdC54ID0gdGhpcy5fY3VycmVudC54O1xyXG5cdFx0ICB9XHJcblx0XHQgIHRoaXMuX2xhc3QueSA9IHRoaXMuX2N1cnJlbnQueTtcclxuXHRcdCAgdGhpcy5fbGFzdEV2ZW50ID0gJ3BhbmVuZCc7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTtcclxuXHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdwaW5jaGVuZCcsIChmdW5jdGlvbihlOmFueSkge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcInBpbmNoZW5kXCIpO1xyXG5cdFx0ICB0aGlzLl9sYXN0LnggPSB0aGlzLl9jdXJyZW50Lng7XHJcblx0XHQgIHRoaXMuX2xhc3QueSA9IHRoaXMuX2N1cnJlbnQueTtcclxuXHRcdCAgdGhpcy5fbGFzdC56ID0gdGhpcy5fY3VycmVudC56O1xyXG5cdFx0ICB0aGlzLl9sYXN0RXZlbnQgPSAncGluY2hlbmQnO1xyXG5cdFx0fSkuYmluZCh0aGlzKSk7XHRcclxuXHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdwaW5jaHN0YXJ0JywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHQgIHRoaXMuX3BpbmNoU3RhcnQueCA9IGUuY2VudGVyLng7XHJcblx0XHQgIHRoaXMuX3BpbmNoU3RhcnQueSA9IGUuY2VudGVyLnk7XHJcblx0XHQgIHRoaXMuX3BpbmNoWm9vbU9yaWdpbiA9IHRoaXMuZ2V0UmVsYXRpdmVQb3NpdGlvbih0aGlzLl9lbGVtZW50LCB7IHg6IHRoaXMuX3BpbmNoU3RhcnQueCwgeTogdGhpcy5fcGluY2hTdGFydC55IH0sIHRoaXMuX29yaWdpbmFsU2l6ZSwgdGhpcy5fY3VycmVudC56KTtcclxuXHRcdCAgdGhpcy5fbGFzdEV2ZW50ID0gJ3BpbmNoc3RhcnQnO1xyXG5cdFx0fSkuYmluZCh0aGlzKSk7XHJcblx0XHRcclxuXHRcdHRoaXMuX2hhbW1lcnRpbWUub24oJ3BpbmNoJywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHQgIGNvbnNvbGUubG9nKFwicGluY2hcIik7XHJcblx0XHQgIHZhciBkID0gdGhpcy5zY2FsZUZyb20odGhpcy5fcGluY2hab29tT3JpZ2luLCB0aGlzLl9sYXN0LnosIHRoaXMuX2xhc3QueiAqIGUuc2NhbGUpXHJcblx0ICAgICAgdGhpcy5fY3VycmVudC54ID0gZC54ICsgdGhpcy5fbGFzdC54ICsgZS5kZWx0YVg7XHJcblx0XHQgIHRoaXMuX2N1cnJlbnQueSA9IGQueSArIHRoaXMuX2xhc3QueSArIGUuZGVsdGFZO1xyXG5cdFx0ICB0aGlzLl9jdXJyZW50LnogPSBkLnogKyB0aGlzLl9sYXN0Lno7XHJcblx0XHQgIHRoaXMuX2xhc3RFdmVudCA9ICdwaW5jaCc7XHJcblx0XHQgIHRoaXMudXBkYXRlKCk7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5faGFtbWVydGltZS5vbignZG91YmxldGFwJywgKGZ1bmN0aW9uKGU6YW55KSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwiZG91YmxldGFwXCIpO1xyXG5cdFx0XHR0aGlzLnNldERlZmF1bHRTY2FsZSh0aGlzLl9kZWZhdWx0U2V0LnopO1xyXG5cclxuXHRcdC8vICAgdmFyIF90aGlzID0gdGhpczsgXHJcblx0XHQvLyAgIHZhciBzY2FsZUZhY3RvciA9IDE7XHJcblx0XHQvLyAgIGlmICh0aGlzLl9jdXJyZW50Lnpvb21pbmcgPT09IGZhbHNlKSB7XHJcblx0XHQvLyBcdHRoaXMuX2N1cnJlbnQuem9vbWluZyA9IHRydWU7XHJcblx0XHQvLyAgIH0gZWxzZSB7XHJcblx0XHQvLyBcdHRoaXMuX2N1cnJlbnQuem9vbWluZyA9IGZhbHNlO1xyXG5cdFx0Ly8gXHRzY2FsZUZhY3RvciA9IC1zY2FsZUZhY3RvcjtcclxuXHRcdC8vICAgfVxyXG5cclxuXHRcdC8vICAgdGhpcy5fZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gXCIwLjNzXCI7XHJcblx0XHQvLyAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHQvLyBcdF90aGlzLl9lbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSBcIm5vbmVcIjtcclxuXHRcdC8vICAgfSwgMzAwKVxyXG5cclxuXHRcdC8vICAgdmFyIHpvb21PcmlnaW4gPSB0aGlzLmdldFJlbGF0aXZlUG9zaXRpb24odGhpcy5fZWxlbWVudCwgeyB4OiBlLmNlbnRlci54LCB5OiBlLmNlbnRlci55IH0sIHRoaXMuX29yaWdpbmFsU2l6ZSwgdGhpcy5fY3VycmVudC56KTtcclxuXHRcdC8vICAgdmFyIGQgPSB0aGlzLnNjYWxlRnJvbSh6b29tT3JpZ2luLCB0aGlzLl9jdXJyZW50LnosIHRoaXMuX2N1cnJlbnQueiArIHNjYWxlRmFjdG9yKVxyXG5cdFx0Ly8gICB0aGlzLl9jdXJyZW50LnggKz0gZC54O1xyXG5cdFx0Ly8gICB0aGlzLl9jdXJyZW50LnkgKz0gZC55O1xyXG5cdFx0Ly8gICB0aGlzLl9jdXJyZW50LnogKz0gZC56O1xyXG5cclxuXHRcdC8vICAgdGhpcy5fbGFzdC54ID0gdGhpcy5fY3VycmVudC54O1xyXG5cdFx0Ly8gICB0aGlzLl9sYXN0LnkgPSB0aGlzLl9jdXJyZW50Lnk7XHJcblx0XHQvLyAgIHRoaXMuX2xhc3QueiA9IHRoaXMuX2N1cnJlbnQuejtcclxuXHJcblx0XHQvLyAgIHRoaXMudXBkYXRlKCk7XHJcblx0XHR9KS5iaW5kKHRoaXMpKTtcclxuXHRcdFxyXG5cdFx0XHJcblx0XHR0aGlzLl9oYW1tZXJ0aW1lLm9uKCdwYW4nLCAoZnVuY3Rpb24oZTphbnkpIHtcclxuXHRcdCAgY29uc29sZS5sb2coXCJwYW5cIik7XHJcblx0XHQgIGlmICh0aGlzLl9sYXN0RXZlbnQgIT09ICdwYW4nKSB7XHJcblx0XHRcdHRoaXMuX2ZpeEhhbW1lcmpzRGVsdGFJc3N1ZSA9IHtcclxuXHRcdFx0ICB4OiBlLmRlbHRhWCxcclxuXHRcdFx0ICB5OiBlLmRlbHRhWVxyXG5cdFx0XHR9O1xyXG5cdFx0ICB9O1xyXG5cclxuXHRcdCAgaWYgKHRoaXMuX2N1cnJlbnQueiAhPSB0aGlzLl9kZWZhdWx0U2V0Lnope1xyXG5cdFx0XHR0aGlzLl9jdXJyZW50LnggPSB0aGlzLl9sYXN0LnggKyBlLmRlbHRhWCAtIHRoaXMuX2ZpeEhhbW1lcmpzRGVsdGFJc3N1ZS54O1xyXG5cdFx0ICB9XHJcblx0XHQgIFxyXG5cdFx0ICB0aGlzLl9jdXJyZW50LnkgPSB0aGlzLl9sYXN0LnkgKyBlLmRlbHRhWSAtIHRoaXMuX2ZpeEhhbW1lcmpzRGVsdGFJc3N1ZS55O1xyXG5cdFx0ICB0aGlzLl9sYXN0RXZlbnQgPSAncGFuJztcclxuXHRcdCAgdGhpcy51cGRhdGUoKTtcclxuXHRcdH0pLmJpbmQodGhpcykpOyBcclxuXHRcdFxyXG4gICAgLy8gICAgJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbiAoKSB7XHJcblx0Ly8gXHRcdFByb2dyZXNzRXZlbnQ7XHJcbiAgICAvLyAgICAgICAgX3RoaXMuc2V0RGVmYXVsdFNjYWxlKCk7XHJcbiAgICAvLyAgICB9KS5yZXNpemUoKTtcdFx0XHJcblxyXG5cdH1cclxuXHJcblx0XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBvcG92ZXIge1xyXG4gICAgcHJpdmF0ZSBfcXVlcnlTZWxlY3Rvcjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHF1ZXJ5U2VsZWN0b3I6IHN0cmluZyA9IFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpIHtcclxuICAgICAgICB0aGlzLl9xdWVyeVNlbGVjdG9yID0gcXVlcnlTZWxlY3RvcjtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kUG9wb3ZlckV2ZW50cygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuYmluZFBvcG92ZXJFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgJChcIltkYXRhLXRvZ2dsZT1wb3BvdmVyXVwiKS5wb3BvdmVyKHtcclxuICAgICAgICAgICAgaHRtbDogdHJ1ZSxcclxuICAgICAgICAgICAgc2FuaXRpemU6IGZhbHNlLFxyXG4gICAgICAgICAgICB0cmlnZ2VyOiAnY2xpY2snLFxyXG4gICAgICAgICAgICBjb250ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9ICQodGhpcykuYXR0cihcImRhdGEtcG9wb3Zlci1jb250ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoY29udGVudCkuY2hpbGRyZW4oXCIucG9wb3Zlci1ib2R5XCIpLmh0bWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKCdodG1sJykub24oJ21vdXNldXAnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW91c2V1cCFcIik7XHJcbiAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuY2xvc2VzdCgnLnBvcG92ZXInKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJtb3VzZXVwLnBvcG92ZXIhXCIpO1xyXG4gICAgICAgICAgICAgICAgJCgnLnBvcG92ZXInKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW91c2V1cC5wb3BvdmVyLmhpZGUhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vJCh0aGlzLnByZXZpb3VzU2libGluZykucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoX3RoaXMuX3F1ZXJ5U2VsZWN0b3IpLnBvcG92ZXIoJ2hpZGUnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHdoZW4gcG9wb3ZlcidzIGNvbnRlbnQgaXMgc2hvd25cclxuICAgICAgICAkKFwiW2RhdGEtdG9nZ2xlPXBvcG92ZXJdXCIpLm9uKCdzaG93bi5icy5wb3BvdmVyJywgZnVuY3Rpb24gKGU6IGFueSkge1xyXG4gICAgICAgICAgICAvLyBzZXQgd2hhdCBoYXBwZW5zIHdoZW4gdXNlciBjbGlja3Mgb24gdGhlIGJ1dHRvblxyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0IVwiKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmFmdGVyUG9wb3ZlclNob3codGhpcyk7XHJcblxyXG4gICAgICAgICAgICAkKFwiLnBvcG92ZXJMaW5rXCIpLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgJChcIi5wb3BvdmVyTGlua1wiKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicG9wb3ZlckxpbmsgY2xpY2tlZCEhIVwiKTtcclxuICAgICAgICAgICAgICAgICQoXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoXCIucG9wb3ZlckNsb3NlXCIpLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgJChcIi5wb3BvdmVyQ2xvc2VcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkNsb3NlIHBvcG92ZXIgY2xpY2tlZCEhIVwiKTtcclxuICAgICAgICAgICAgICAgICQoXCJbZGF0YS10b2dnbGU9cG9wb3Zlcl1cIikucG9wb3ZlcignaGlkZScpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJQb3BvdmVyU2hvdyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5hZnRlclBvcG92ZXJTaG93XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRTZWxmQ29udGFpbmVyUG9wb3ZlcigpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFBvcG92ZXIuaW5pdFNlbGZDb250YWluZXJQb3BvdmVyXCIpO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3F1ZXJ5U2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgJGVsZW0gPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICBsZXQgZWxlbSA9IHRoaXM7XHJcbiAgICAgICAgICAgICRlbGVtLnBvcG92ZXIoe1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBlbGVtLFxyXG4gICAgICAgICAgICAgICAgc2FuaXRpemU6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZVBvcG92ZXIoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BQb3BvdmVyLmVuYWJsZVBvcG92ZXJcIik7XHJcblxyXG4gICAgICAgICQodGhpcy5fcXVlcnlTZWxlY3RvcikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCAkZWxlbSA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgICRlbGVtLnBvcG92ZXIoJ2VuYWJsZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGVQb3BvdmVyKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUG9wb3Zlci5kaXNhYmxlUG9wb3ZlclwiKTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl9xdWVyeVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0ICRlbGVtID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgJGVsZW0ucG9wb3ZlcignZGlzYWJsZScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUG9wdXBEaWFsb2dPcHRpb25zIHtcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICBib2R5OiBzdHJpbmc7XHJcbiAgICBzaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuO1xyXG4gICAgY29uZmlybUJ1dHRvbkNhcHRpb246IHN0cmluZztcclxuICAgIGNhbmNlbEJ1dHRvbkNhcHRpb246IHN0cmluZztcclxuICAgIGNvbmZpcm1BY3Rpb246IHN0cmluZztcclxuICAgIGNvbmZpcm1BY3Rpb25kYXRhOiBvYmplY3Q7XHJcbiAgICBvblN1Y2Nlc3M6IChwYXJhbXM6YW55KSA9PiBhbnk7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnRpdGxlID0gXCJcIjtcclxuICAgICAgICB0aGlzLmJvZHkgPSBcImJvZHkgdGV4dFwiO1xyXG4gICAgICAgIHRoaXMuc2hvd0NhbmNlbEJ1dHRvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jb25maXJtQnV0dG9uQ2FwdGlvbiA9IFwiT2tcIjtcclxuICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbkNhcHRpb24gPSBcIkNhbmNlbFwiO1xyXG4gICAgICAgIHRoaXMuY29uZmlybUFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5jb25maXJtQWN0aW9uZGF0YSA9IHt9O1xyXG4gICAgICAgIHRoaXMub25TdWNjZXNzID0gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQb3B1cERpYWxvZyB7XHJcbiAgICBwcml2YXRlIF9vcHRpb25zOlNhb3BQb3B1cERpYWxvZ09wdGlvbnM7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6U2FvcFBvcHVwRGlhbG9nT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgfSAgICBcclxuICAgIFxyXG4gICAgc2F2ZShjYWxsYmFjazogKG46IG51bWJlcikgPT4gYW55KSA6IHZvaWQge1xyXG4gICAgICAgIGNhbGxiYWNrKDQyKTtcclxuICAgIH1cclxuXHJcbiAgICBTaG93TG9hZGluZ1Nhb3AoKSB7XHJcbiAgICAgICAgdmFyIG9iaiA9ICQoXCIjc2FvcExvYWRpbmdcIik7XHJcbiAgICAgICAgaWYgKG9iai5sZW5ndGgpXHJcbiAgICAgICAgICAgIG9iai5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgSGlkZUxvYWRpbmdTYW9wKCkge1xyXG4gICAgICAgIHZhciBvYmogPSAkKFwiI3Nhb3BMb2FkaW5nXCIpO1xyXG4gICAgICAgIGlmIChvYmoubGVuZ3RoKVxyXG4gICAgICAgICAgICBvYmouaGlkZSgpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBTaG93UG9wdXBEaWFsb2coKTp2b2lkIHtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIC8vIERpc3BsYXkgaW5mbyBtZXNzYWdlIHRvIHRoZSB1c2VyIGluIGEgbW9kYWxcclxuICAgICAgICBsZXQgdGl0bGVEaXYgPSAkKCcjaW5mby1tb2RhbC10aXRsZS1kaXYnKTtcclxuICAgICAgICBsZXQgdGl0bGVIID0gJCgnI2luZm8tbW9kYWwtdGl0bGUnKTtcclxuICAgICAgICBsZXQgY29uZmlybUJ1dHRvbiA9ICQoJyNpbmZvLW1vZGFsLWJ0bi1vaycpO1xyXG4gICAgICAgIGxldCBjYW5jZWxCdXR0b24gPSAkKCcjaW5mby1tb2RhbC1idG4tY2FuY2VsJyk7XHJcblxyXG4gICAgICAgIGNhbmNlbEJ1dHRvbi5odG1sKHRoaXMuX29wdGlvbnMuY2FuY2VsQnV0dG9uQ2FwdGlvbik7XHJcblxyXG4gICAgICAgIC8vIHNob3cgb3IgaGlkZSBoZWFkZXIgZGl2IGJhc2VkIG9uIHRpdGxlIHByb3BlcnR5XHJcbiAgICAgICAgdGl0bGVEaXYuY3NzKFwiZGlzcGxheVwiLCBcIlwiKTtcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy50aXRsZSkge1xyXG4gICAgICAgICAgICB0aXRsZUguaHRtbCh0aGlzLl9vcHRpb25zLnRpdGxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRpdGxlRGl2LmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY29uZmlybUJ1dHRvbkNhcHRpb24pe1xyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uLmh0bWwodGhpcy5fb3B0aW9ucy5jb25maXJtQnV0dG9uQ2FwdGlvbik7XHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIlwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuc2hvd0NhbmNlbEJ1dHRvbikge1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uaHRtbCh0aGlzLl9vcHRpb25zLmNhbmNlbEJ1dHRvbkNhcHRpb24pO1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIlwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24uY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkKCcjaW5mby1tb2RhbC1ib2R5JykuaHRtbCh0aGlzLl9vcHRpb25zLmJvZHkpO1xyXG5cclxuICAgICAgICAkKFwiI2luZm8tbW9kYWwtYnRuLW9rXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5wb3B1cERpYWxvZ0NvbmZpcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICQoJyNpbmZvLW1vZGFsJykub24oJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICQoXCIjaW5mby1tb2RhbC1idG4tb2tcIikudW5iaW5kKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICQodGhpcykubW9kYWwoJ2Rpc3Bvc2UnKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAkKCcjaW5mby1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgZ2xvYmFsLnNldE1vZGFsRm9ybVpJbmRleCgnI2luZm8tbW9kYWwnKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgcG9wdXBEaWFsb2dDb25maXJtKCkge1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGNhbmNlbEJ1dHRvbiA9ICQoJyNpbmZvLW1vZGFsLWJ0bi1jYW5jZWwnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY29uZmlybUFjdGlvbiAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiB0aGlzLl9vcHRpb25zLmNvbmZpcm1BY3Rpb24sXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuX29wdGlvbnMuY29uZmlybUFjdGlvbmRhdGEsXHJcbiAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7IF90aGlzLlNob3dMb2FkaW5nU2FvcCgpOyB9LFxyXG4gICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHsgX3RoaXMuSGlkZUxvYWRpbmdTYW9wKCk7IH0sXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgZGlhbG9nXHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnRyaWdnZXIoXCJjbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoX3RoaXMuX29wdGlvbnMub25TdWNjZXNzICE9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX29wdGlvbnMub25TdWNjZXNzKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgZGlhbG9nXHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnRyaWdnZXIoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBhbGVydChyZXNwb25zZS5yZXNwb25zZUpTT04ubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9jbG9zZSBkaWFsb2dcclxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnRyaWdnZXIoXCJjbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm9uU3VjY2VzcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm9uU3VjY2VzcyhudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5leHBvcnQgZW51bSBTYW9wUmlnaHRTaWRlYmFyVmlldyB7XHJcbiAgICBEYXNoYm9hcmQgPSAwXHJcbiAgICAsQWJzZW5jZSA9IDFcclxuICAgICxBdHRlbmRhbmNlRGF5ID0gMlxyXG4gICAgLEF0dGVuZGFuY2VNb250aCA9IDMgICAgXHJcbiAgICAsVHJhdmVsT3JkZXJzID0gNFxyXG4gICAgLEludGVybmFsT3JkZXJzID0gNVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFJpZ2h0U2lkZWJhciB7XHJcbiAgICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlIDpTYW9wU2VydmljZXNDb3JlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBiaW5kQ2Fyb3VzZWxEaXYoY29udGVudElkOnN0cmluZyx2aWV3OlNhb3BSaWdodFNpZGViYXJWaWV3KXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5iaW5kRGl2XCIpOyBcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUmlnaHRTaWRlQmFyL0dldENhcm91c2VsVmlldz92aWV3PVwiK3ZpZXcudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCJcclxuICAgICAgICAgICAgLGFzeW5jOmZhbHNlXHJcbiAgICAgICAgfSk7ICAgICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoRG9wdXN0WmFLb3Jpc2NlbmplU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc3Bpbm5lckRpdklkOiBzdHJpbmcgPSBcIiNzYW9wTG9hZGluZ1NpZGViYXJyXCIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoRG9wdXN0WmFLb3Jpc2NlbmplU3VtbWFyeVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbihyZXNwb25zZSl7XHJcbiAgICAgICAgICAgICQoY29udGVudElkKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjpcIlJpZ2h0U2lkZUJhci9Eb3B1c3RaYUtvcmlzY2VuamVTdW1tYXJ5UGFydGlhbFwiXHJcbiAgICAgICAgICAgICxkYXRhOm51bGxcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOiBzcGlubmVyRGl2SWRcclxuICAgICAgICB9KTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hVcmVaYUtvcmlzY2VuamVTdW1tYXJ5KGNvbnRlbnRJZDogc3RyaW5nLCBzcGlubmVyRGl2SWQ6IHN0cmluZyA9IFwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wUmlnaHRTaWRlYmFyLnJlZnJlc2hVcmVaYUtvcmlzY2VuamVTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUmlnaHRTaWRlQmFyL1VyZVphS29yaXNjZW5qZVN1bW1hcnlQYXJ0aWFsXCJcclxuICAgICAgICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAgICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICAgICAgICxzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hSZWdVcmFEb2dvZGtpU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc2VsZWN0ZWRQZXJpb2Q6c3RyaW5nLCBzcGlubmVyRGl2SWQ6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BSaWdodFNpZGViYXIucmVmcmVzaFJlZ1VyYURvZ29ka2lTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiUmlnaHRTaWRlQmFyL1JlZ1VyYURvZ29ka2lTdW1tYXJ5UGFydGlhbD9zZWxlY3RlZFBlcmlvZD1cIitzZWxlY3RlZFBlcmlvZFxyXG4gICAgICAgICAgICAsZGF0YTpudWxsXHJcbiAgICAgICAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgICAgICAgLHNwaW5uZXJEaXZJZDpzcGlubmVyRGl2SWRcclxuICAgICAgICAgICAgLy8sc3Bpbm5lckRpdklkOlwiI3Nhb3BMb2FkaW5nU2lkZWJhcnJcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hSZWdPUE5Qb3RuaU5hbG9naVN1bW1hcnkoY29udGVudElkOiBzdHJpbmcsIHNwaW5uZXJEaXZJZDpzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoUmVnT1BOUG90bmlOYWxvZ2lTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKXtcclxuICAgICAgICAgICAgJChjb250ZW50SWQpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOlwiVHJhdmVsT3JkZXIvVHJhdmVsT3JkZXJzU3VtbWFyeVwiXHJcbiAgICAgICAgICAgICxkYXRhOm51bGxcclxuICAgICAgICAgICAgLHR5cGU6XCJHRVRcIlxyXG4gICAgICAgICAgICAsc3Bpbm5lckRpdklkOnNwaW5uZXJEaXZJZFxyXG4gICAgICAgICAgICAvLyxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaE5ka0ludGVybmFsT3JkZXJzU3VtbWFyeShjb250ZW50SWQ6IHN0cmluZywgc3Bpbm5lckRpdklkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFJpZ2h0U2lkZWJhci5yZWZyZXNoTmRrSW50ZXJuYWxPcmRlcnNTdW1tYXJ5XCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAkKGNvbnRlbnRJZCkuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiUmlnaHRTaWRlQmFyL0ludGVybmFsT3JkZXJzU3VtbWFyeVwiXHJcbiAgICAgICAgICAgICwgZGF0YTogbnVsbFxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZFxyXG4gICAgICAgICAgICAvLyxzcGlubmVyRGl2SWQ6XCIjc2FvcExvYWRpbmdTaWRlYmFyclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/XHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcElucHV0V0ZMUHJvcGVydGllcyB7XHJcbiAgICBpZDpzdHJpbmc7XHJcbiAgICBwbGFjZWhvbGRlcjpzdHJpbmc7XHJcbiAgICBjYXB0aW9uOnN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BzZWxlY3RXRkwge1xyXG4gICAgcHJpdmF0ZSBfaW5wdXRUZW1wbGF0ZTpzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOlNhb3BJbnB1dFdGTFByb3BlcnRpZXMpIHtcclxuICAgICAgICB0aGlzLl9pbnB1dFRlbXBsYXRlID0gXHJcbiAgICAgICAgYFxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGFzLWZsb2F0LWxhYmVsIHNhb3AtZHJvcGRvd24gc2VsZWN0RWxlbWVudFwiPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIHNoYWRvdy1ub25lIHNhb3AtY29udHJvbCBzYW9wLWNoaWxkLXNlbGVjdFwiIGRhdGEtY2hvc2VuPVwiVFwiIGlkPVwiJHtwcm9wZXJ0aWVzLmlkfVwiIG5hbWU9XCIke3Byb3BlcnRpZXMuaWR9XCIgdGFiaW5kZXg9XCIwXCIgc3R5bGU9XCJoZWlnaHQ6IDMwcHg7cGFkZGluZzogMC4wNzVyZW0gMC43NXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIi8+XHJcbiAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzYW9wLWZsb2F0aW5nLWxhYmVsXCIgZm9yPVwiJHtwcm9wZXJ0aWVzLmlkfVwiPiR7cHJvcGVydGllcy5jYXB0aW9ufTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwic2VsZWN0LWRyb3Bkb3duIHNhb3AtaW1nLWRvd24gc2ktc1wiLz5cclxuICAgICAgICA8L3NwYW4+ICAgICBcclxuICAgICAgICBgOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RWxlbWVudCgpOkpRdWVyeTxIVE1MRWxlbWVudD57XHJcbiAgICAgICAgbGV0IF9lbGVtZW50ID0gJCh0aGlzLl9pbnB1dFRlbXBsYXRlKTtcclxuICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5uZXJIdG1sKCk6c3RyaW5ne1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dFRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vIGtuaml6bmljYTogaHR0cHM6Ly9zZWxlY3RpemUuZGV2L1xyXG5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9zZWxlY3RpemUtc2VsZWN0L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyAgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTZWxlY3RPcHRpb24gfSBmcm9tIFwiLi9zYW9wLW11bHRpc2VsZWN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlbGVjdGl6ZVNlbGVjdCB7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3ZpZXdJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX3NlbGVjdGl6ZUNvbnRyb2w6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nID0gXCJcIiwgaWQ6IHN0cmluZyA9IFwiXCIsIGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLmxpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdJZCA9IHZpZXdJZDtcclxuICAgICAgICB0aGlzLl9pZCA9IGlkO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faWQgIT0gXCJcIikge1xyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sID0gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX2lkKVswXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC5pbml0XCIpO1xyXG5cclxuICAgICAgICB0aGlzLmluaWNpYWxpemVCaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdENvbnRyb2xCeUpRdWVyeShlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aXplU2VsZWN0KGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb250cm9sQnlIdG1sKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0aXplU2VsZWN0KCQoZWxlbWVudCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRNdWx0aXNlbGVjdENvbnRyb2xCeUh0bWwoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmluaXRTZWxlY3RpemVNdWx0aXNlbGVjdCgkKGVsZW1lbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmdldFZhbHVlXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gJCh0aGlzLl92aWV3SWQgKyBcIiBcIiArIHRoaXMuX2lkKS5hdHRyKFwiZGF0YS1jaG9zZW5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TXVsdGlzZWxlY3RWYWx1ZXMoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmdldE11bHRpc2VsZWN0VmFsdWVzXCIpO1xyXG5cclxuICAgICAgICBsZXQgcmV0VmFsdWU6IHN0cmluZ1tdID0gW107IFxyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5faWQgKyBcIiBvcHRpb246c2VsZWN0ZWRcIikuZWFjaChmdW5jdGlvbiAodmFsKSB7XHJcbiAgICAgICAgICAgIHJldFZhbHVlLnB1c2goJCh0aGlzKS52YWwoKS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJldFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNlbGVjdGl6ZVNlbGVjdChlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pdFNlbGVjdGl6ZVNlbGVjdC4uLlwiKTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5zZWxlY3RpemUoe1xyXG4gICAgICAgICAgICBzb3J0RmllbGQ6ICd0ZXh0JyxcclxuICAgICAgICAgICAgYWxsb3dFbXB0eU9wdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgcmVuZGVyOiB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb246IGZ1bmN0aW9uIChpdGVtOiBhbnksIGVzY2FwZTogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gaXRlbS50ZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYXB0aW9uID0gaXRlbS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCI8ZGl2PlwiICsgJzxzcGFuIGNsYXNzPVwibGFiZWxcIiBzdHlsZT1cInBhZGRpbmctbGVmdDoxM3B4XCI+JyArIGVzY2FwZShsYWJlbCkgKyBcIjwvc3Bhbj5cIiArIFwiPC9kaXY+XCI7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkZvY3VzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kaW5wdXQudmFsKCkgPT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pdFNlbGVjdGl6ZVNlbGVjdC4uLmRvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2VsZWN0aXplTXVsdGlzZWxlY3QoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmluaXRTZWxlY3RpemVNdWx0aXNlbGVjdC4uLlwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgZWxlbWVudC5zZWxlY3RpemUoe1xyXG4gICAgICAgICAgICBkZWxpbWl0ZXI6IFwifFwiLFxyXG4gICAgICAgICAgICBwZXJzaXN0OiBmYWxzZSxcclxuICAgICAgICAgICAgbWF4SXRlbXM6IG51bGwsXHJcbiAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKGlucHV0OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGlucHV0LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25Gb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbHVlcyA9IHRoaXMuaXRlbXM7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2UgamUgc2FtbyBlbiBlbGVtZW50IGluIHRhIFwiP1wiLCB6YnJpc2VtbyBzZXpuYW0sIGRhIHNlIGZsb2F0aW5nIGxhYmVsIHVtYWtuZSBpeiB2dm5vc25lIGtvbnRyb2xlXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsVmFsdWVzLmxlbmd0aCA9PSAxICYmIHNlbFZhbHVlc1swXS50cmltKCkgPT09IFwiP1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSAgICAgICAgICAgXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LmluaXRTZWxlY3RpemVTZWxlY3QuLi5kb25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pY2lhbGl6ZUJpbmRFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuaW5pY2lhbGl6ZUJpbmRFdmVudHNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7IFxyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIFwiICsgdGhpcy5faWQpLmNoYW5nZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gJCh0aGlzKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBfdGhpcy52YWx1ZUNoYW5nZWQoZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsdWVDaGFuZ2VkKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlbGVjdGl6ZVNlbGVjdC52YWx1ZUNoYW5nZWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LnNldFZhbHVlXCIpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGl6ZUNvbnRyb2wuc2VsZWN0aXplLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRWYWx1ZXModmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VsZWN0aXplU2VsZWN0LnNldFZhbHVlc1wiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5zZXRWYWx1ZSh2YWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyVmFsdWUoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuY2xlYXJWYWx1ZVwiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hPcHRpb25zKG9wdGlvbkxpc3Q6IFNlbGVjdE9wdGlvbltdKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QucmVmcmVzaE9wdGlvbnNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIC8vIHpicmlzZW1vIGl6YnJhbm8gb3BjaWpvLCBkcnVnYWNlIG9zdGFuZSBub3RyaSBrb3Qgb3BjaWphXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aXplQ29udHJvbC5zZWxlY3RpemUuY2xlYXJPcHRpb25zKCk7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb3B0aW9uTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT5cclxuICAgICAgICAgICAgICAgIF90aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5hZGRPcHRpb24oeyB2YWx1ZTogZWxlbWVudC52YWx1ZSwgdGV4dDogZWxlbWVudC50ZXh0IH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZWxlY3RpemVTZWxlY3QuZGlzYWJsZVwiKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RpemVDb250cm9sLnNlbGVjdGl6ZS5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRvZ2dsZVBhbmVsIHtcclxuXHJcbiAgICBpbml0KCk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRvZ2dsZVBhbmVsLmluaXQuLi5cIik7XHJcbiAgICAgICAgdGhpcy5zZXRDbGlja0V2ZW50T25GcmFtZShcImJvZHlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q2xpY2tFdmVudE9uRnJhbWUoZnJhbWVOYW1lOnN0cmluZyA9IFwiYm9keVwiKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRvZ2dsZVBhbmVsLnNldENsaWNrRXZlbnRPbkZyYW1lLi4uXCIpO1xyXG5cclxuICAgICAgICBsZXQgX2ZyYW1lID0gJChcIlwiK2ZyYW1lTmFtZStcIiAqPiAuc2FvcC10b2dnbGUtcGFuZWxcIik7XHJcbiAgICAgICAgX2ZyYW1lLm9mZihcImNsaWNrXCIpO1xyXG4gICAgICAgIF9mcmFtZS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vbmEga2xpayBzZSBwdcWhxI1pY2Egb2JybmUgZ29yIC8gZG9sXHJcbiAgICAgICAgICAgIHZhciBhcnJvd0RpdiA9ICQodGhpcykuZmluZChcIi5zYW9wLXRvZ2dsZS1hcnJvd1wiKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyb3dEaXYubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChhcnJvd0RpdltpXS5jbGFzc0xpc3QuY29udGFpbnMoXCJzYW9wLWltZy1kb3duXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dEaXZbaV0uY2xhc3NMaXN0LnJlbW92ZShcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dEaXZbaV0uY2xhc3NMaXN0LmFkZChcInNhb3AtaW1nLXVwXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJvd0RpdltpXS5jbGFzc0xpc3QucmVtb3ZlKFwic2FvcC1pbWctdXBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyb3dEaXZbaV0uY2xhc3NMaXN0LmFkZChcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvZGF0YS10YWJsZXMvdHlwZXMuZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gXCIuL3Nhb3AtbWVzc2FnZS1kbGdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVHJlZXZpZXcge1xyXG4gICAgcHJpdmF0ZSBfdmlld0lkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGxpYk5hbWU6IHN0cmluZzsgIFxyXG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRpb25TZXJ2aWNlOiBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl92aWV3SWQgPSB2aWV3SWQ7XHJcbiAgICAgICAgdGhpcy5saWJOYW1lID0gbGliTmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25TZXJ2aWNlID0gbmV3IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UoKTtcclxuICAgIH0gIFxyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5pbml0XCIpO1xyXG5cclxuICAgICAgICAvLyBwcmV2YWphbmplXHJcbiAgICAgICAgdGhpcy5zZXRGb3JtVGVybWlub2xvZ3lMaXN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50TGlzdG5lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEZvcm1UZXJtaW5vbG9neUxpc3QoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zZXRGb3JtVGVybWlub2xvZ3lMaXN0XCIpO1xyXG5cclxuICAgICAgICBsZXQgdGVybWlub2xvZ3kgPSBbXCJOaSBwb2RhdGtvdiB6YSBwcmlrYXouXCIsIFwiQnJpc2FuamVcIiwgXCJBbGkgc3RlIHByZXByacSNYW5pLCBkYSDFvmVsaXRlIGl6YnJpc2F0aSBlbGVtZW50P1wiXTtcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdCh0ZXJtaW5vbG9neSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RXZlbnRMaXN0bmVycygpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmluaXRFdmVudExpc3RuZXJzXCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub2ZmKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVwiKTsgXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWV4cGFuZC1jb2xhcHNlLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLnRyZWV2aWV3RXhwYW5kQ29sYXBzZSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1kZWxldGVcIik7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1pdGVtLWRlbGV0ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWl0ZW0tZGVsZXRlLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmRlbGV0ZVRyZWV2aWV3SXRlbSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1hZGRTdWJJdGVtXCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vbihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1hZGRTdWJJdGVtXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNhb3AtdHJlZXZpZXctaXRlbS1hZGRTdWJJdGVtLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmFkZFRyZWV2aWV3U3ViSXRlbSh0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9mZihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1pbnNlcnRJdGVtXCIpO1xyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vbihcImNsaWNrXCIsIFwiLnNhb3AtdHJlZXZpZXctaXRlbS1pbnNlcnRJdGVtXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LnNhb3AtdHJlZXZpZXctaXRlbS1pbnNlcnRJdGVtLmNsaWNrXCIpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmluc2VydEl0ZW0odGhpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkKS5vZmYoXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0tZWRpdFwiKTtcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub24oXCJjbGlja1wiLCBcIi5zYW9wLXRyZWV2aWV3LWl0ZW0tZWRpdFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5zYW9wLXRyZWV2aWV3LWl0ZW0tZWRpdC5jbGlja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBfdGhpcy5lZGl0VHJlZXZpZXdJdGVtKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCkub2ZmKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1hZGQtaXRlbS1idG5cIik7XHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQpLm9uKFwiY2xpY2tcIiwgXCIuc2FvcC10cmVldmlldy1hZGQtaXRlbS1idG5cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuc2FvcC10cmVldmlldy1hZGQtaXRlbS1idG4uY2xpY2tcIik7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgX3RoaXMuYWRkVHJlZXZpZXdJdGVtKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdHJlZXZpZXdFeHBhbmRDb2xhcHNlKGVsZW06IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcudHJlZXZpZXdFeHBhbmRDb2xhcHNlXCIpO1xyXG5cclxuICAgICAgICBsZXQgaWQgPSAkKGVsZW0pLmF0dHIoXCJkYXRhLXRvb2dsZWVsZW1lbnRzaWRcIik7XHJcbiAgICAgICAgbGV0IGNvbGxhcHNlSXRlbXMgPSAkKGVsZW0pLmhhc0NsYXNzKFwic2FvcC1pbWctZG93blwiKTtcclxuXHJcbiAgICAgICAgJChlbGVtKS50b2dnbGVDbGFzcyhcInNhb3AtaW1nLWRvd25cIik7XHJcbiAgICAgICAgJChlbGVtKS50b2dnbGVDbGFzcyhcInNhb3AtaW1nLXJpZ2h0XCIpO1xyXG5cclxuICAgICAgICAvLyBzaG93L2hpZGVcclxuICAgICAgICAkKHRoaXMuX3ZpZXdJZCArIFwiIGRpdi5zYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyW2RhdGEtcGFyZW50aWQ9J1wiICsgaWQgKyBcIiddXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4OiBudW1iZXIsIGNoaWxkRWxlbTogYW55KSB7XHJcbiAgICAgICAgICAgIGlmIChjb2xsYXBzZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAkKGNoaWxkRWxlbSkuaGlkZShcImZhc3RcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKGNoaWxkRWxlbSkuc2hvdyhcImZhc3RcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWxldGVUcmVldmlld0l0ZW0oZWxlbTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmRlbGV0ZVRyZWV2aWV3SXRlbVwiKTtcclxuXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgZGVsZXRlVGl0bGUgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQnJpc2FuamVcIik7XHJcbiAgICAgICAgbGV0IGRlbGV0ZU1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiQWxpIHN0ZSBwcmVwcmnEjWFuaSwgZGEgxb5lbGl0ZSBpemJyaXNhdGkgZWxlbWVudD9cIik7XHJcblxyXG4gICAgICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyhudWxsKTtcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5vblllcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50IHoga2xhc29tIHNhb3AtdHJlZXZpZXctaXRlbS1jb250YWluZXIgaW4gZ2Egb2RzdHJhbmltbyB0ZXIgdnNlIGNoaWxkcmVlblxyXG4gICAgICAgICAgICBsZXQgdGVtcEVsZW1lbnQgPSBlbGVtO1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50aWQgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJzYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50aWQgPSBnbG9iYWwuY29udmVydFN0cmluZzJOdW1iZXIodGVtcEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1wYXJlbnRpZFwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb2RzdHJhbmltbyBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcEVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjsgXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0ZW1wRWxlbWVudCA9IHRlbXBFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcmVudGlkICE9IG51bGwgJiYgcGFyZW50aWQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhbGkgamUgc2Uga2FqIG9zdGFsaWggY2hpbGQgZWxlbWVudG92IHogaXN0aW0gcGFyZW50SWQ/XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZWVuQ291bnQgPSAkKF90aGlzLl92aWV3SWQgKyAnIGRpdi5zYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyW2RhdGEtcGFyZW50aWQ9XCInICsgcGFyZW50aWQgKyAnXCJdJykubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVlbkNvdW50ID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB6YnJpc2FsaSB6YWRuamVnYSBjaGlsZCBlbGVtZW50LCBza3JpamVtbyBleHBhbmQvY29sbGFwc2UgaWtvbm8gcGFyZW50IGVsZW1lbnRhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSAkKF90aGlzLl92aWV3SWQgKyAnIGRpdi5zYW9wLXRyZWV2aWV3LWl0ZW1bZGF0YS1pZD1cIicgKyBwYXJlbnRpZCArICdcIl0nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHBhbmRDb2xsYXBzZUVsZW0gPSAkKHBhcmVudEVsZW1lbnQpLmZpbmQoXCIuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZENvbGxhcHNlRWxlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRDb2xsYXBzZUVsZW0uaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5TaG93KGRlbGV0ZU1lc3NhZ2UsIGRlbGV0ZVRpdGxlLCAxLCBbU2FvcE1zZ0RsZ0J1dHRvbi5tYlllcywgU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRUcmVldmlld1N1Ykl0ZW0oYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld1N1Ykl0ZW1cIik7XHJcblxyXG4gICAgICAgIC8vIHByaWthemVtbyBleHBhbmQvY29sbGFwc2UgaWtvbm86XHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBpbWEga2xhcyBzYW9wLXRyZWV2aWV3LWl0ZW0taW5mbyxcclxuICAgICAgICBsZXQgcGFyZW50RWxlbSA9IGFkZFN1Ykl0ZW1CdXR0b25FbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtLmNsYXNzTGlzdC5jb250YWlucyhcInNhb3AtdHJlZXZpZXctaXRlbS1pbmZvXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwb2lzY2VtbyBuamVnb3YgY2hpbGQsIGtpIGltYSBrbGFzIHNhb3AtdHJlZXZpZXctZXhwYW5kLWNvbGFwc2VcclxuICAgICAgICAgICAgICAgIGxldCBleHBhbmRDb2xsYXBzZUVsZW0gPSAkKHBhcmVudEVsZW0pLmZpbmQoXCIuc2FvcC10cmVldmlldy1leHBhbmQtY29sYXBzZVwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChleHBhbmRDb2xsYXBzZUVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZENvbGxhcHNlRWxlbS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJlbnRFbGVtID0gcGFyZW50RWxlbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9pc2NpIG1heCBJZCBUcmVldmlld3MgaW4gZ2EgcG92ZWNhbW8gemEgMVxyXG4gICAgICAgIGxldCBuZXdTdWJJdGVtSWQgPSB0aGlzLmdldE1heFRyZWV2aWV3SWQoKSArIDE7XHJcbiAgICAgICAgLy8gcGFyZW50IElkXHJcbiAgICAgICAgbGV0IG5ld1N1Ykl0ZW1QYXJlbnRJZCA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMk51bWJlcigkKGFkZFN1Ykl0ZW1CdXR0b25FbGVtZW50KS5hdHRyKFwiZGF0YS1wYXJlbnRpZFwiKSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkVHJlZXZpZXdTdWJJdGVtRXh0ZXJuYWwoYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQsIG5ld1N1Ykl0ZW1JZCwgbmV3U3ViSXRlbVBhcmVudElkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1heFRyZWV2aWV3SWQoKTogbnVtYmVyIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmdldE1heFRyZWV2aWV3SWRcIik7XHJcblxyXG4gICAgICAgIGxldCBtYXhJZCA9IDBcclxuXHJcbiAgICAgICAgJCh0aGlzLl92aWV3SWQgKyBcIiAuc2FvcC10cmVldmlldy1pdGVtXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBodG1sVHJlZXZpZXdJdGVtKSB7XHJcbiAgICAgICAgICAgIGxldCBpZCA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMk51bWJlcihodG1sVHJlZXZpZXdJdGVtLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikpO1xyXG4gICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZCA+IG1heElkKSB7XHJcbiAgICAgICAgICAgICAgICBtYXhJZCA9IGlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBtYXhJZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkVHJlZXZpZXdTdWJJdGVtRXh0ZXJuYWwoYWRkU3ViSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50LCBuZXdTdWJJdGVtSWQ6IG51bWJlciwgbmV3U3ViSXRlbVBhcmVudElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmFkZFRyZWV2aWV3U3ViSXRlbUV4dGVybmFsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG1ldG9kbyB1cG9yYWJsamEgY2xpZW50LCB2cm5lIGNvbnRlbnQsIGtpIGpvIGRvZGFtbyB2IHRyZWV2aWV3XHJcbiAgICBwdWJsaWMgYWRkVHJlZXZpZXdTdWJJdGVtQ29udGVudChhZGRTdWJJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQsIG5ld1N1Ykl0ZW1JZDogbnVtYmVyLCBuZXdTdWJJdGVtUGFyZW50SWQ6IG51bWJlciwgaHRtbENvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuYWRkVHJlZXZpZXdTdWJJdGVtQ29udGVudFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGVsZW1QYXJlbnQgPSAkKHRoaXMuX3ZpZXdJZCArICcgZGl2LnNhb3AtdHJlZXZpZXctaXRlbVtkYXRhLWlkPVwiJyArIG5ld1N1Ykl0ZW1QYXJlbnRJZCArICdcIl0nKTtcclxuICAgICAgICBlbGVtUGFyZW50LmFwcGVuZChodG1sQ29udGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRUcmVldmlld0l0ZW0oYWRkSXRlbUJ1dHRvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld0l0ZW1cIik7XHJcblxyXG4gICAgICAgIC8vIHBvaXNjaSBtYXggSWQgVHJlZXZpZXdzIGluIGdhIHBvdmVjYW1vIHphIDFcclxuICAgICAgICBsZXQgbmV3SXRlbUlkID0gdGhpcy5nZXRNYXhUcmVldmlld0lkKCkgKyAxO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFRyZWV2aWV3SXRlbUV4dGVybmFsKGFkZEl0ZW1CdXR0b25FbGVtZW50LCBuZXdJdGVtSWQsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRUcmVldmlld0l0ZW1FeHRlcm5hbChhZGRJdGVtQnV0dG9uRWxlbWVudDogSFRNTEVsZW1lbnQsIG5ld0l0ZW1JZDogbnVtYmVyLCBuZXdJdGVtUGFyZW50SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuYWRkVHJlZXZpZXdJdGVtRXh0ZXJuYWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWV0b2RvIHVwb3JhYmxqYSBjbGllbnQsIHZybmUgY29udGVudCwga2kgam8gZG9kYW1vIHYgdHJlZXZpZXdcclxuICAgIHB1YmxpYyBhZGRUcmVldmlld0l0ZW1Db250ZW50KGFkZEl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCwgbmV3SXRlbUlkOiBudW1iZXIsIG5ld0l0ZW1QYXJlbnRJZDogbnVtYmVyLCBodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5hZGRUcmVldmlld0l0ZW1Db250ZW50XCIpO1xyXG5cclxuICAgICAgICAvLyBvZHN0cmFuaW1vIGFkZCBpdGVtIGh0bWwsIGtlciBnYSBibyB6ZSBkb2RhbCBodG1sQ29udGVudFxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgLnNhb3AtdHJlZXZpZXctYWRkLWl0ZW0tY29udGFpbmVyXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBodG1sVHJlZXZpZXdBZGRJdGVtKSB7XHJcbiAgICAgICAgICAgIGh0bWxUcmVldmlld0FkZEl0ZW0ucmVtb3ZlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBlbGVtUGFyZW50ID0gJCh0aGlzLl92aWV3SWQpO1xyXG4gICAgICAgIGVsZW1QYXJlbnQuYXBwZW5kKGh0bWxDb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVkaXRUcmVldmlld0l0ZW0oZWxlbTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3LmVkaXRUcmVldmlld0l0ZW1cIik7XHJcblxyXG4gICAgICAgIC8vIG9kc3RyYW5pbW8gY3NzIGtsYXMgemEgb2Jyb2JvIHZzZW0gZWxlbWVudG9tIGluIGpvIGRvZGFtbyBpemJyYW5lbXVcclxuICAgICAgICB0aGlzLmNsZWFyVHJlZXZpZXdJdGVtc1NlbGVjdGVkQ3NzKCk7XHJcbiAgICAgICAgJChlbGVtKS5hZGRDbGFzcyhcInNhb3AtdHJlZXZpZXctaXRlbS1zZWxlY3RlZFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0VHJlZXZpZXdJdGVtRXh0ZXJuYWwoZWxlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gemEgZXh0ZXJubyB1cG9yYWJvXHJcbiAgICBwdWJsaWMgZWRpdFRyZWV2aWV3SXRlbUV4dGVybmFsKGVsZW06IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5lZGl0VHJlZXZpZXdJdGVtRXh0ZXJuYWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyVHJlZXZpZXdJdGVtc1NlbGVjdGVkQ3NzKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuY2xlYXJUcmVldmlld0l0ZW1zU2VsZWN0ZWRDc3NcIik7XHJcblxyXG4gICAgICAgICQodGhpcy5fdmlld0lkICsgXCIgLnNhb3AtdHJlZXZpZXctaXRlbS1pbmZvXCIpLnJlbW92ZUNsYXNzKFwic2FvcC10cmVldmlldy1pdGVtLXNlbGVjdGVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVsZW0gamUgaXN0aSBrb3QgZ2EgcG9udWphIGVkaXRUcmVldmlld0l0ZW0gb3ouIGVkaXRUcmVldmlld0l0ZW1FeHRlcm5hbFxyXG4gICAgcHVibGljIHJlZnJlc2hUcmVldmlld0l0ZW1IZWFkZXIoZWxlbTogSFRNTEVsZW1lbnQsIGhlYWRlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5yZWZyZXNoVHJlZXZpZXdJdGVtSGVhZGVyXCIpO1xyXG5cclxuICAgICAgICAkKGVsZW0pLmZpbmQoXCIuc2FvcC10cmVldmlldy1pdGVtLWhlYWRlclwiKS50ZXh0KGhlYWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbnNlcnRJdGVtKGluc2VydEl0ZW1CdXR0b25FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wVHJlZXZpZXcuaW5zZXJ0SXRlbVwiKTtcclxuXHJcbiAgICAgICAgLy8gcG9pc2NlbW8gcGFyZW50LCBraSBpbWEga2xhcyBzYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyLFxyXG4gICAgICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgbGV0IHBhcmVudEVsZW0gPSBpbnNlcnRJdGVtQnV0dG9uRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50RWxlbS5jbGFzc0xpc3QuY29udGFpbnMoXCJzYW9wLXRyZWV2aWV3LWl0ZW0tY29udGFpbmVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJlbnRFbGVtID0gcGFyZW50RWxlbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudEZvdW5kKSB7XHJcbiAgICAgICAgICAgIC8vIHBvaXNjaSBtYXggSWQgVHJlZXZpZXdzIGluIGdhIHBvdmVjYW1vIHphIDFcclxuICAgICAgICAgICAgbGV0IG5ld0l0ZW1JZCA9IHRoaXMuZ2V0TWF4VHJlZXZpZXdJZCgpICsgMTtcclxuICAgICAgICAgICAgLy8gcGFyZW50SWRcclxuICAgICAgICAgICAgbGV0IG5ld0l0ZW1QYXJlbnRJZCA9IGdsb2JhbC5jb252ZXJ0U3RyaW5nMk51bWJlcigkKHBhcmVudEVsZW0pLmF0dHIoXCJkYXRhLXBhcmVudGlkXCIpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VHJlZXZpZXdJdGVtRXh0ZXJuYWwocGFyZW50RWxlbSwgbmV3SXRlbUlkLCBuZXdJdGVtUGFyZW50SWQpO1xyXG4gICAgICAgIH0gICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5zZXJ0VHJlZXZpZXdJdGVtRXh0ZXJuYWwoaXRlbVRvQXBwZW5kVG86IEhUTUxFbGVtZW50LCBuZXdJdGVtSWQ6IG51bWJlciwgbmV3SXRlbVBhcmVudElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFRyZWV2aWV3Lmluc2VydFRyZWV2aWV3SXRlbUV4dGVybmFsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbnNlcnRUcmVldmlld0l0ZW1Db250ZW50KGl0ZW1Ub0FwcGVuZFRvOiBIVE1MRWxlbWVudCwgbmV3SXRlbUlkOiBudW1iZXIsIG5ld0l0ZW1QYXJlbnRJZDogbnVtYmVyLCBodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BUcmVldmlldy5pbnNlcnRUcmVldmlld0l0ZW1Db250ZW50XCIpO1xyXG5cclxuICAgICAgICAkKGl0ZW1Ub0FwcGVuZFRvKS5hZnRlcihodG1sQ29udGVudCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld1NwaW5uZXIge1xyXG5cclxuICBnZW5lcmF0ZVNwaW5uZXJEaXYoc3Bpbm5lcklkOiBzdHJpbmcgPSAnI3Nhb3BMb2FkaW5nJyk6IHN0cmluZyB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZ2VuZXJhdGVTcGlubmVyRGl2IFwiICsgc3Bpbm5lcklkKTtcclxuICAgIGxldCBzcGlubnJEaXYgPVxyXG4gICAgICAnPGRpdiBpZD1cIicgKyBzcGlubmVySWQgKyAnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGNsYXNzPVwiXCI+ICdcclxuICAgICAgKyAnXHQ8ZGl2IGlkPVwiJyArIHNwaW5uZXJJZCArICdTcGlubmVyQmFja2dyb3VuZ1wiIGNsYXNzPVwic3Bpbm5lci1iYWNrZ3JvdW5kIFwiLz4gJ1xyXG4gICAgICArICdcdDxkaXYgaWQ9XCInICsgc3Bpbm5lcklkICsgJ1NwaW5uZXJcIiBjbGFzcz1cInNwaW5uZXIgc3Bpbm5lci1jZW50ZXItZGFzaGJvYXJkU2lkZWJhcnJcIj4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdDwvZGl2PiAnXHJcbiAgICAgICsgJzwvZGl2PiAnO1xyXG5cclxuICAgIHJldHVybiBzcGlubnJEaXY7XHJcbiAgfVxyXG5cclxuICBzaG93TG9hZGluZ1Nhb3AoZWxlbWVudElkOiBzdHJpbmcgPSBcIiNzYW9wTG9hZGluZ1wiKSB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2hvd0xvYWRpbmdTYW9wIFwiICsgZWxlbWVudElkKTtcclxuICAgIHZhciBvYmogPSAkKGVsZW1lbnRJZCk7XHJcbiAgICBpZiAob2JqLmxlbmd0aCkge1xyXG4gICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2hvdy4uLiBcIik7XHJcbiAgICAgIG9iai5zaG93KCk7XHJcbiAgICAgIC8vc2V0TW9kYWxGb3JtWkluZGV4KGVsZW1lbnRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoaWRlTG9hZGluZ1Nhb3AoZWxlbWVudElkOiBzdHJpbmcgPSBcIiNzYW9wTG9hZGluZ1wiKSB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaGlkZUxvYWRpbmdTYW9wIFwiICsgZWxlbWVudElkKTtcclxuICAgIHZhciBvYmogPSAkKGVsZW1lbnRJZCk7XHJcbiAgICBpZiAob2JqLmxlbmd0aClcclxuICAgICAgb2JqLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIC8vIHNob3dMb2FkaW5nU2FvcChlbGVtZW50SWQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAvLyAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93TG9hZGluZ1Nhb3AgXCIgKyBlbGVtZW50SWQpO1xyXG4gIC8vICAgaWYgKCFpc0VtcHR5KGVsZW1lbnRJZCkpIHtcclxuICAvLyAgICAgbGV0IGVsZW1lbnREaXYgPSAkKGVsZW1lbnRJZCk7XHJcbiAgLy8gICAgIGlmIChlbGVtZW50RGl2Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgIGxldCBzcGlubmVySUQgPSBlbGVtZW50SWQgKyBcIkxvYWRpbmdcIjtcclxuICAvLyAgICAgICBzcGlubmVySUQgPSBzcGlubmVySUQucmVwbGFjZShcIiNcIixcIlwiKTtcclxuICAvLyAgICAgICBsZXQgc3Bpbm5lckRpdiA9ICQoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICBpZiAoIXNwaW5uZXJEaXYubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgICBsZXQgX2RpdiA9IHRoaXMuZ2VuZXJhdGVTcGlubmVyRGl2KHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgICBlbGVtZW50RGl2LmFwcGVuZChfZGl2KTtcclxuICAvLyAgICAgICAgIHNwaW5uZXJEaXYgPSAkKHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHNwaW5uZXJEaXYuc2hvdygpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBoaWRlTG9hZGluZ1Nhb3AoZWxlbWVudElkOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgLy8gICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaGlkZUxvYWRpbmdTYW9wIFwiICsgZWxlbWVudElkKTtcclxuICAvLyAgIGlmICghaXNFbXB0eShlbGVtZW50SWQpKSB7XHJcbiAgLy8gICAgIGxldCBlbGVtZW50RGl2ID0gJChlbGVtZW50SWQpO1xyXG4gIC8vICAgICBpZiAoZWxlbWVudERpdi5sZW5ndGgpIHtcclxuICAvLyAgICAgICBsZXQgc3Bpbm5lcklEID0gZWxlbWVudElkICsgXCJMb2FkaW5nXCI7XHJcbiAgLy8gICAgICAgbGV0IHNwaW5uZXJEaXYgPSAkKHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgaWYgKCFzcGlubmVyRGl2Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgZWxlbWVudERpdi5hcHBlbmQodGhpcy5nZW5lcmF0ZVNwaW5uZXJEaXYoc3Bpbm5lcklEKSk7XHJcbiAgLy8gICAgICAgICBzcGlubmVyRGl2ID0gJChzcGlubmVySUQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBzcGlubmVyRGl2LmhpZGUoKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICAvLyAvL1xyXG59XHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdTcGlubmVyIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLXZpZXctc3Bpbm5lcidcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFNlcnZpY2VzQ29yZVBhcmFtcyB7XHJcbiAgYWN0aW9uOnN0cmluZztcclxuICBhc3luYz86Ym9vbGVhblxyXG4gIHR5cGU/OnN0cmluZztcclxuICBkYXRhPzphbnk7XHJcbiAgc3Bpbm5lckRpdklkPzpzdHJpbmc7XHJcbiAgLy8gY29udGVudFR5cGU/OiBzdHJpbmcgfCBmYWxzZSB8IHVuZGVmaW5lZDtcclxuICAvLyBkYXRhVHlwZT86ICd4bWwnIHwgJ2h0bWwnIHwgJ3NjcmlwdCcgfCAnanNvbicgfCAnanNvbnAnIHwgJ3RleHQnIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHByb2Nlc3NEYXRhPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdCB7XHJcbiAgc3VjY2VzcyA9IDFcclxuICAsIGVycm9yID0gMlxyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wU2VydmljZXNDb3JlSFRUUFJlc3VsdFN0YXR1c0NvZGUge1xyXG4gIG9rID0gMjAwLFxyXG4gIHVuYXV0aG9yaXplZCA9IDQwMSxcclxuICBpbnRlcm5hbFNlcnZlckVycm9yID0gNTAwXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlIHtcclxuICByZXNwb25zZTogU2FvcFNlcnZpY2VzQ29yZVJlc3VsdDtcclxuICBkYXRhOiBhbnk7XHJcbn07XHJcblxyXG4vLyBmdW5jdGlvbiBzeW5jRGVsYXkobWlsbGlzZWNvbmRzOmFueSl7XHJcbi8vICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbi8vICAgdmFyIGVuZD0wO1xyXG4vLyAgIHdoaWxlKCAoZW5kLXN0YXJ0KSA8IG1pbGxpc2Vjb25kcyl7XHJcbi8vICAgICAgIGVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4vLyAgIH1cclxuLy8gIH1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2VydmljZXNDb3JlIHtcclxuICBwcml2YXRlIF9zYW9wVmlld1NwaW5uZXI6U2FvcFZpZXdTcGlubmVyID0gbmV3IFNhb3BWaWV3U3Bpbm5lcigpO1xyXG4gIHByaXZhdGUgX3BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRQYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcztcclxuICAvLyAgXHJcbiAgLy9wdWJsaWMgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyAgXHJcblxyXG4gIGNvbnN0cnVjdG9yKCl7XHJcbiAgICB0aGlzLl9kZWZhdWx0UGFyYW1zID0ge1xyXG4gICAgICBhY3Rpb246XCJcIlxyXG4gICAgICAsdHlwZTpcIkdFVFwiXHJcbiAgICAgICxhc3luYzp0cnVlXHJcbiAgICAgICxkYXRhOm51bGxcclxuICAgICAgLHNwaW5uZXJEaXZJZDpcIlwiXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkRvbmUocmVzdWx0OmFueSl7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5vbkRvbmVcIik7XHJcbiAgICB0aGlzLmFmdGVyRG9uZShyZXN1bHQpO1xyXG4gICAgLy90aGlzLl9zYW9wVmlld1NwaW5uZXIuaGlkZUxvYWRpbmdTYW9wKHRoaXMuX3BhcmFtcy5zcGlubmVyRGl2SWQpOyAgICAgIFxyXG4gIH1cclxuXHJcbiAgYWZ0ZXJEb25lKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmVcIik7XHJcbiAgfSAgXHJcblxyXG4gIHByaXZhdGUgb25TdWNjZXNzKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5zdWNjZXNzXCIpO1xyXG4gICAgbGV0IF9yZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlID0ge3Jlc3BvbnNlOm51bGwsZGF0YTpudWxsfTsgXHJcbiAgICBpZiAodHlwZW9mIHJlc3VsdC5zdWNjZXNzID09PSBcInVuZGVmaW5lZFwiIHx8IHJlc3VsdC5zdWNjZXNzID09PSBudWxsKSB7XHJcbiAgICAgIF9yZXN1bHQucmVzcG9uc2UgPSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfcmVzdWx0LnJlc3BvbnNlID0gcmVzdWx0LnN1Y2Nlc3MgPT0gdHJ1ZSA/IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2VzcyA6IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3I7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9yZXN1bHQuZGF0YSA9IHJlc3VsdDtcclxuICAgIHRoaXMuYWZ0ZXJTdWNjZXNzKF9yZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJTdWNjZXNzKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3NcIik7XHJcbiAgfSAgXHJcblxyXG4gIHByaXZhdGUgb25FcnJvcihyZXN1bHQ6YW55KTp2b2lke1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUuZXJyb3JcIik7XHJcbiAgICBcclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS51bmF1dGhvcml6ZWQpIHtcclxuICAgICAgLy8gcmVkaXJlY3QgdG8gbG9naW5cclxuICAgICAgdGhpcy51bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS5pbnRlcm5hbFNlcnZlckVycm9yICYmICFnbG9iYWwuaXNVbkRlZmluZWQocmVzdWx0LnJlc3BvbnNlVGV4dCkpIHtcclxuICAgICAgYWxlcnQoXCJJbnRlcm5hbCBlcnJvciFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IF9yZXN1bHQ6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlID0ge3Jlc3BvbnNlOm51bGwsZGF0YTpudWxsfTsgXHJcbiAgICBfcmVzdWx0LnJlc3BvbnNlID0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5lcnJvcjtcclxuICAgIF9yZXN1bHQuZGF0YSA9IHJlc3VsdDtcclxuICAgIHRoaXMuYWZ0ZXJFcnJvcihfcmVzdWx0KTtcclxuICB9XHJcblxyXG4gIGFmdGVyRXJyb3IocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2Vzc1wiKTtcclxuICB9IFxyXG5cclxuICBFeGVjdXRlQWN0aW9uKHBhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zKTp2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb25cIik7XHJcbiAgICBsZXQgb3B0aW9ucyA9IHsgLi4udGhpcy5fZGVmYXVsdFBhcmFtcywgLi4ucGFyYW1zIH07XHJcbiAgICBwYXJhbXMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBfYWpheEFjdGlvbiA9IGdsb2JhbC5nZXRTaXRlQWJzb2x1dGVVUkwocGFyYW1zLmFjdGlvbik7XHJcblxyXG4gICAgLy9AVXJsLkFjdGlvbihcImNyZWFyQ2FtcE1hbnVhbFwiLCBcIkRQU1wiKVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICQuYWpheCh7XHJcbiAgICAgICAgYXN5bmM6IHBhcmFtcy5hc3luYyxcclxuICAgICAgICB1cmw6IF9hamF4QWN0aW9uLFxyXG4gICAgICAgIHR5cGU6ICFnbG9iYWwuaXNFbXB0eShwYXJhbXMudHlwZSkgPyBwYXJhbXMudHlwZSA6IFwiUE9TVFwiLFxyXG4gICAgICAgIGRhdGE6IHBhcmFtcy5kYXRhLFxyXG4gICAgICAgIC8vIGNvbnRlbnRUeXBlOiBwYXJhbXMuY29udGVudFR5cGUgPT0gbnVsbCA/ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnIDogcGFyYW1zLmNvbnRlbnRUeXBlLFxyXG4gICAgICAgIC8vIGRhdGFUeXBlOiBwYXJhbXMudHlwZSA9PSBudWxsID8gJ0ludGVsbGlnZW50IEd1ZXNzICh4bWwsIGpzb24sIHNjcmlwdCwgb3IgaHRtbCknIDogcGFyYW1zLnR5cGUsICBcclxuICAgICAgICAvLyBwcm9jZXNzRGF0YSA6IHBhcmFtcy5wcm9jZXNzRGF0YSA9PSBudWxsID8gdHJ1ZSA6IHBhcmFtcy5wcm9jZXNzRGF0YSwgXHJcbiAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2FvcFZpZXdTcGlubmVyLnNob3dMb2FkaW5nU2FvcChwYXJhbXMuc3Bpbm5lckRpdklkKTsgfSxcclxuICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgeyBfdGhpcy5fc2FvcFZpZXdTcGlubmVyLmhpZGVMb2FkaW5nU2FvcChwYXJhbXMuc3Bpbm5lckRpdklkKTsgfSxcclxuICAgICAgICBzdWNjZXNzOiB0aGlzLm9uU3VjY2Vzcy5iaW5kKF90aGlzKSxcclxuICAgICAgICBlcnJvcjogdGhpcy5vbkVycm9yLmJpbmQoX3RoaXMpXHJcbiAgICAgIH0pLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEb25lLi4uXCIpO1xyXG4gICAgICAgIF90aGlzLm9uRG9uZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoKGVycikge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH0gICAgXHJcblxyXG4gIFxyXG4gIH1cclxuXHJcbiAgRXhlY3V0ZUJsb2JBY3Rpb24ocGFyYW1zOiBTYW9wU2VydmljZXNDb3JlUGFyYW1zKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQmxvYkFjdGlvblwiKTtcclxuICAgIGxldCBvcHRpb25zID0geyAuLi50aGlzLl9kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcclxuICAgIHBhcmFtcyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IF9hamF4QWN0aW9uID0gZ2xvYmFsLmdldFNpdGVBYnNvbHV0ZVVSTChwYXJhbXMuYWN0aW9uKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAkLmFqYXgoe1xyXG4gICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgIHVybDogX2FqYXhBY3Rpb24sXHJcbiAgICAgICAgZGF0YTogcGFyYW1zLmRhdGEsXHJcbiAgICAgICAgeGhyRmllbGRzOiB7XHJcbiAgICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJyAvLyB0byBhdm9pZCBiaW5hcnkgZGF0YSBiZWluZyBtYW5nbGVkIG9uIGNoYXJzZXQgY29udmVyc2lvblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGJsb2IsIHN0YXR1cywgeGhyKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhIGZpbGVuYW1lXHJcbiAgICAgICAgICAgIHZhciBmaWxlbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHZhciBkaXNwb3NpdGlvbiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoZGlzcG9zaXRpb24gJiYgZGlzcG9zaXRpb24uaW5kZXhPZignYXR0YWNobWVudCcpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpbGVuYW1lUmVnZXggPSAvZmlsZW5hbWVbXjs9XFxuXSo9KChbJ1wiXSkuKj9cXDJ8W147XFxuXSopLztcclxuICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gZmlsZW5hbWVSZWdleC5leGVjKGRpc3Bvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlc1sxXSkgZmlsZW5hbWUgPSBtYXRjaGVzWzFdLnJlcGxhY2UoL1snXCJdL2csICcnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9pZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLy8gICAgLy8gSUUgd29ya2Fyb3VuZCBmb3IgXCJIVE1MNzAwNzogT25lIG9yIG1vcmUgYmxvYiBVUkxzIHdlcmUgcmV2b2tlZCBieSBjbG9zaW5nIHRoZSBibG9iIGZvciB3aGljaCB0aGV5IHdlcmUgY3JlYXRlZC4gVGhlc2UgVVJMcyB3aWxsIG5vIGxvbmdlciByZXNvbHZlIGFzIHRoZSBkYXRhIGJhY2tpbmcgdGhlIFVSTCBoYXMgYmVlbiBmcmVlZC5cIlxyXG4gICAgICAgICAgICAvLyAgICB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAvL30gZWxzZVxyXG4gICAgICAgICAgICAvL3tcclxuICAgICAgICAgICAgdmFyIFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDtcclxuICAgICAgICAgICAgdmFyIGRvd25sb2FkVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXNlIEhUTUw1IGFbZG93bmxvYWRdIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGZpbGVuYW1lXHJcbiAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHlldFxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhLmRvd25sb2FkID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGEuaHJlZiA9IGRvd25sb2FkVXJsO1xyXG4gICAgICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKGRvd25sb2FkVXJsKTsgfSwgMTAwKTsgLy8gY2xlYW51cFxyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiB0aGlzLm9uRXJyb3IuYmluZChfdGhpcylcclxuICAgICAgICB9KS5kb25lKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJEb25lLi4uXCIpO1xyXG4gICAgICAgICAgX3RoaXMub25Eb25lKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycikge1xyXG4gICAgICBhbGVydChcIkludGVybmFsIGVycm9yIVwiKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgcHVibGljIGhhbmRsZVN1Ym1pdEVycm9yKHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLkhhbmRsZVN1Ym1pdEVycm9yXCIpO1xyXG5cclxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gU2FvcFNlcnZpY2VzQ29yZUhUVFBSZXN1bHRTdGF0dXNDb2RlLnVuYXV0aG9yaXplZCkge1xyXG4gICAgICAgIHRoaXMudW5BdXRob3JpemVkUmVkaXJlY3RUb0xvZ2luUGFnZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkaXNwbGF5IGVycm9yXHJcbiAgICBjb25zb2xlLmxvZyhcInJlc3BvbnNlXCIsIHJlc3BvbnNlKTtcclxuICAgIGFsZXJ0KHJlc3BvbnNlLnN0YXR1c1RleHQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVuQXV0aG9yaXplZFJlZGlyZWN0VG9Mb2dpblBhZ2UoKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5yZWRpcmVjdFRvTG9naW5QYWdlXCIpO1xyXG5cclxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICB9XHJcbiBcclxuICAvL1xyXG59XHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuaW1wb3J0IHsgU2FvcFNlcnZpY2VzQ29yZSB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmFuc2xhdGlvbiB7XHJcbiAgcHVibGljIGtleTogc3RyaW5nID0gXCIjXCI7XHJcbiAgcHVibGljIHRyYW5zbGF0aW9uOiBzdHJpbmcgPSBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9ucyB7XHJcbiAgcHVibGljIHRyYW5zbGF0aW9uc0xpc3Q6W1Nhb3BUcmFuc2xhdGlvbj9dID0gW107XHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BUcmFuc2xhdGlvblNlcnZpY2VQYXJhbXMge1xyXG4gIGNvbnRyb2xsZXI6c3RyaW5nLFxyXG4gIGFjdGlvbjpzdHJpbmcsXHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBfcGFyYW1zOlNhb3BUcmFuc2xhdGlvblNlcnZpY2VQYXJhbXM7XHJcbiAgcHJpdmF0ZSBfc2FvcFNlcnZpY2VzQ29yZTogU2FvcFNlcnZpY2VzQ29yZTtcclxuICAvL1xyXG4gIHB1YmxpYyBfdGVybWlub2xvZ3k6U2FvcFRyYW5zbGF0aW9ucztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczpTYW9wVHJhbnNsYXRpb25TZXJ2aWNlUGFyYW1zID0gbnVsbCl7XHJcbiAgICBpZighZ2xvYmFsLmlzVW5EZWZpbmVkKHBhcmFtcykpe1xyXG4gICAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9wYXJhbXMgPSB7Y29udHJvbGxlcjpcIlRyYW5zbGF0aW9uXCIsYWN0aW9uOlwiR2V0VHJhbnNsYXRpb25zXCJ9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgIHRoaXMuX3Rlcm1pbm9sb2d5ID0gbmV3IFNhb3BUcmFuc2xhdGlvbnMoKTtcclxuICB9XHJcbiAgXHJcbiAgc2V0VHJhbnNsYXRpb25zTGlzdCh0cmFuc2xhdGlvbnM6c3RyaW5nW10pOmFueXtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICB0cmFuc2xhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgX3RoaXMuX3Rlcm1pbm9sb2d5LnRyYW5zbGF0aW9uc0xpc3QucHVzaCh7a2V5OnZhbHVlLHRyYW5zbGF0aW9uOnZhbHVlfSk7ICBcclxuICAgIH0pOyAgIFxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb25zKHRoaXMuX3Rlcm1pbm9sb2d5KTtcclxuICB9XHJcblxyXG4gIGdldFRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnM6U2FvcFRyYW5zbGF0aW9ucyk6YW55e1xyXG4gICAgbGV0IGpzb25EYXRhID0gSlNPTi5zdHJpbmdpZnkodHJhbnNsYXRpb25zKTtcclxuICAgIGxldCBfZGF0YSA9IHtqc29uSW5wdXQ6anNvbkRhdGF9O1xyXG4gICAgbGV0IF9yZXNwb25zZTphbnk7XHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICBfcmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgIH07XHJcbiAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgIGFjdGlvbjogdGhpcy5fcGFyYW1zLmNvbnRyb2xsZXIrXCIvXCIrdGhpcy5fcGFyYW1zLmFjdGlvbitcIlwiXHJcbiAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAsIGFzeW5jOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl90ZXJtaW5vbG9neS50cmFuc2xhdGlvbnNMaXN0ID0gX3Jlc3BvbnNlLnRyYW5zbGF0aW9uc0xpc3Q7XHJcbiAgICByZXR1cm4gX3Jlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlKGtleTpzdHJpbmcpOnN0cmluZ3tcclxuICAgIGxldCBfdHIgPSB0aGlzLl90ZXJtaW5vbG9neS50cmFuc2xhdGlvbnNMaXN0LmZpbmQoZSA9PiBlLmtleSA9PSBrZXkpIGFzIGFueTtcclxuICAgIGlmIChnbG9iYWwuaXNVbkRlZmluZWQoX3RyKSkgeyBcclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBfdHIudHJhbnNsYXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvdHlwaW5ncy5kLnRzXCIgLz5cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVXRpbHMge1xyXG4gICAgY2hlY2tDb21wYXRpYmlsaXR5KCk6Ym9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIFNhb3BDb21tb24uY2hlY2tDb21wYXRpYmlsaXR5KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUsU2FvcFNlcnZpY2VzQ29yZVBhcmFtcywgU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlLCBTYW9wU2VydmljZXNDb3JlUmVzdWx0IH0gZnJvbSAnLi9zYW9wLXNlcnZpY2VzLWNvcmUnXHJcbmltcG9ydCB7IFNhb3BNZXNzYWdlRGxnLCBTYW9wTXNnRGxnQnV0dG9uIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLW1lc3NhZ2UtZGxnJztcclxuaW1wb3J0IHsgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQge1Nhb3BGbG9hdGluZ0xhYmVsIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9zYW9wLWZsb2F0aW5nLWxhYmVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFcnJvciB7XHJcbiAgICBwdWJsaWMgQ29kZTogc3RyaW5nO1xyXG4gICAgcHVibGljIE1lc3NhZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU2FvcFdmQWN0aW9uIHtcclxuICAgIHdmYU5vbmUgPSAwXHJcbiAgICAsd2ZhQWRkUmVjb3JkID0gMVxyXG4gICAgLHdmYUVkaXRSZWNvcmQgPSAyXHJcbiAgICAsd2ZhRGVsZXRlUmVjb3JkID0gM1xyXG4gICAgLHdmYVJlY29yZERlc3RhaWxzID0gNFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNhb3BXZlN1Ym1pdFJlc3VsdCB7XHJcbiAgICBzdWNjZXNzOmJvb2xlYW47XHJcbiAgICB2aWV3Q29udGVudDpzdHJpbmc7XHJcbiAgICByZWRpcmVjdFRvOnN0cmluZztcclxuICAgIGFsZXJ0TWVzc2FnZTpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld0Zvcm0ge1xyXG4gICAgcHJpdmF0ZSBfdmlld01vZGFsRnJhbWU6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdNb2RhbEJvZHk6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfdGl0bGU6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfYnRuT2s6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfYnRuQ2FuY2VsOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlc1BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zID0ge2FjdGlvbjpudWxsLGRhdGE6bnVsbCx0eXBlOlwiUE9TVFwifTtcclxuICAgIHByaXZhdGUgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXTtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgX2xpYk5hbWU6c3RyaW5nO1xyXG4gICAgcHVibGljIHNhb3BTZXJ2aWNlc0NvcmU6U2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICBwdWJsaWMgdHJhbnNsYXRpb25TZXJ2aWNlOlNhb3BUcmFuc2xhdGlvblNlcnZpY2U7XHJcbiAgICBwdWJsaWMgY29udGVudEVsZW1lbnRJZCA9IFwiLnNhb3AtbW9kYWwtYm9keS1lbGVtZW50XCI7XHJcbiAgICBwdWJsaWMgYWRkUmVjb3JkRW5kcG9pbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgZWRpdFJlY29yZEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGRlbGV0ZVJlY29yZEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG1hbnVhbGx5U3VibWl0RW5kcG9pbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgc2FvcEZsb2F0aW5nTGFiZWw6IFNhb3BGbG9hdGluZ0xhYmVsO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyBvblN1Y2NjZXNzQ2FsbGJhY2s6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgb25FcnJvckNhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9uRmFpbHVyZUNhbGxiYWNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgLy8gICAgXHJcbiAgICBwdWJsaWMgaWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIHRpdGxlOnN0cmluZztcclxuICAgIHB1YmxpYyBmdWxsU2NyZWVuOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25DbG9zZTogKHBhcmFtczphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25TdWJtaXQ6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uRXJyb3I6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFZpZXdGb3JtLi4uXCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJ2aWV3SWQ6XCIrdmlld0lkKTtcclxuICAgICAgICB0aGlzLmlkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrID0gbGliTmFtZStcIi5vblN1Ym1pdFN1Y2Nlc3MoZGF0YSxcIitsaWJOYW1lK1wiKTtcIjtcclxuICAgICAgICB0aGlzLm9uRXJyb3JDYWxsYmFjayA9IGxpYk5hbWUgKyBcIi5vblN1Ym1pdEVycm9yKGRhdGEsXCIgKyBsaWJOYW1lICsgXCIpO1wiO1xyXG4gICAgICAgIHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgPSBsaWJOYW1lICsgXCIub25TdWJtaXRGYWlsdXJlKHhocixcIiArIGxpYk5hbWUgKyBcIik7XCI7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgU2FvcFRyYW5zbGF0aW9uU2VydmljZSgpO1xyXG4gICAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwgPSBuZXcgU2FvcEZsb2F0aW5nTGFiZWwoKTtcclxuICAgICAgICAvLyAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFRlcm1pbm9sb2d5TGlzdChkaWN0aW9uYXJ5OiBzdHJpbmdbXSA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl90ZXJtaW5vbG9neSA9IFtcIlVyZWRpXCIsXCJOb3Ygdm5vc1wiLFwiUG9kcm9ibm9zdGlcIixcIkJyaXNhbmplXCJdO1xyXG4gICAgICAgIGlmIChkaWN0aW9uYXJ5ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGVybWlub2xvZ3kgPSB0aGlzLl90ZXJtaW5vbG9neS5jb25jYXQoZGljdGlvbmFyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldFRyYW5zbGF0aW9uc0xpc3QodGhpcy5fdGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkJ0bk9rQ2xpY2soc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25CdG5Pa0NsaWNrLi4uXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkJ0bkNhbmNlbChzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkJ0bkNhbmNlbC4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmVmb3JlVmlld1Nob3coc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQrXCIuYmVmb3JlVmlld1Nob3coKVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUgPSAkKHRoaXMuaWQpO1xyXG4gICAgICAgIGlmICh0aGlzLl92aWV3TW9kYWxGcmFtZSA9PSBudWxsKSB7IGNvbnNvbGUubG9nKHRoaXMuaWQrXCIgbm90IGZvdW5kIVwiKTt9O1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdmFyIGNvbnRlbnRTZWwgPSB0aGlzLmlkICsgXCIgXCIgKyB0aGlzLmNvbnRlbnRFbGVtZW50SWQ7XHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsQm9keSA9ICQoY29udGVudFNlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFmdGVyVmlld1Nob3coc2VuZGVyOmFueSx3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24pOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkK1wiLmFmdGVyVmlld1Nob3coKVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuT2sgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjYnRuT2tcIik7XHJcbiAgICAgICAgdGhpcy5fdmlld19idG5DYW5jZWwgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjYnRuQ2FuY2VsXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjZXhhbXBsZU1vZGFsTG9uZ1RpdGxlXCIpO1xyXG4gICAgICAgIC8vXHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZnRlclZpZXdTaG93IHRpdGxlOlwiKyB0aGlzLnRpdGxlKTtcclxuXHJcbiAgICAgICAgaWYgKCFnbG9iYWwuaXNFbXB0eSh0aGlzLnRpdGxlKSl7XHJcbiAgICAgICAgICAgIGxldCBfdGl0bGUgPSBcIlwiO1xyXG4gICAgICAgICAgICBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCl7XHJcbiAgICAgICAgICAgICAgICBfdGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJOb3Ygdm5vc1wiKStcIjogXCIrdGhpcy50aXRsZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCl7XHJcbiAgICAgICAgICAgICAgICBfdGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJVcmVkaVwiKStcIjogXCIrdGhpcy50aXRsZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhUmVjb3JkRGVzdGFpbHMpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiUG9kcm9ibm9zdGlcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhZnRlclZpZXdTaG93IF90aXRsZTpcIisgX3RpdGxlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUuaHRtbChfdGl0bGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhQWRkUmVjb3JkKXtcclxuICAgICAgICAgICAgICAgIGxldCBkZWZhdWx0VGl0bGVBZGQgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjYWRkVGl0bGVcIikudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUuaHRtbChkZWZhdWx0VGl0bGVBZGQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRUaXRsZUVkaXQgPSAkKFwiXCIrdGhpcy5pZCtcIiAqPiAjZWRpdFRpdGxlXCIpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3X3RpdGxlLmh0bWwoZGVmYXVsdFRpdGxlRWRpdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudmlld1Nob3dDb21wbGV0ZShzZW5kZXIsIHdmQWN0aW9uKTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmJpbmRCdXR0b25zKHNlbmRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuYmluZFZpZXdFdmVudHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICBnbG9iYWwuc2V0TW9kYWxGb3JtWkluZGV4KHRoaXMuaWQpO1xyXG4gICAgICAgIGdsb2JhbC5zZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1cyh0aGlzLmlkKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQgKyBcIi5hZnRlclZpZXdTaG93U3VjY2VzcygpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2aWV3U2hvd0NvbXBsZXRlKHNlbmRlcjogYW55LCB3ZkFjdGlvbjogU2FvcFdmQWN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkICsgXCIudmlld1Nob3dDb21wbGV0ZSgpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmluZEJ1dHRvbnMoc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYmluZEJ1dHRvbnNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5fdmlld19idG5PayA9ICQoXCJcIiArIHRoaXMuaWQgKyBcIiAqPiAjYnRuT2tcIik7XHJcbiAgICAgICAgdGhpcy5fdmlld19idG5Pay5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25CdG5Pa0NsaWNrKHNlbmRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl92aWV3X2J0bkNhbmNlbCA9ICQoXCJcIiArIHRoaXMuaWQgKyBcIiAqPiAjYnRuQ2FuY2VsXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkJ0bkNhbmNlbChzZW5kZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmluZFZpZXdFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImJpbmRWaWV3RXZlbnRzXCIpO1xyXG5cclxuICAgICAgICBsZXQgZGl2Rm9ybSA9IHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmZpbmQoXCJmb3JtXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LXN1Y2Nlc3NcIiwgdGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vbkVycm9yQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LWVycm9yXCIsIHRoaXMub25FcnJvckNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LWZhaWx1cmVcIiwgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuc2FvcEZsb2F0aW5nTGFiZWwuaW5pdCgpOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW5kZXJFcnJvcnNCYW5uZXIoZXJyb3JzOkVycm9yW10pOlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2U7XHJcbiAgICAgICAgcmVzdWx0ID0ge3Jlc3BvbnNlOlNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3IsZGF0YTpudWxsfTsgXHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQganNvbkRhdGEgPSBKU09OLnN0cmluZ2lmeShlcnJvcnMpO1xyXG4gICAgICAgIGxldCBfZGF0YSA9IHtqc29uSW5wdXQ6anNvbkRhdGF9OyAgICAgICAgXHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uIChyZXNwb25zZTpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2U7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBfc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIkVycm9ycy9SZW5kZXJFcnJvcnNCYW5uZXJcIlxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiUE9TVFwiXHJcbiAgICAgICAgICAgICwgZGF0YTogX2RhdGFcclxuICAgICAgICAgICAgLCBhc3luYzogZmFsc2VcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVuZGVyRXJyb3IoZXJyTWVzc2FnZTpzdHJpbmcpOnZvaWR7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFqYXguYWZ0ZXJFcnJvclwiKTtcclxuICAgICAgICAgICAgbGV0IF9lcnJvcnM6RXJyb3JbXTtcclxuICAgICAgICAgICAgX2Vycm9ycyA9IFt7Q29kZTpcIlwiLE1lc3NhZ2U6ZXJyTWVzc2FnZX1dO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IF9wYXJlbnRWaWV3ID0gJCh0aGlzLmlkKS5wYXJlbnQoKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBfZXJyb3JCYW5uZXJJZCA9IHRoaXMuaWQrXCJFcnJvckJhbm5lclwiO1xyXG4gICAgICAgICAgICAvL2xldCBfdmlld19iYW5uZXIgPSB0aGlzLl92aWV3TW9kYWxCb2R5LmZpbmQoX2Vycm9yQmFubmVySWQpO1xyXG4gICAgICAgICAgICBsZXQgX3ZpZXdfYmFubmVyID0gX3BhcmVudFZpZXcuZmluZChfZXJyb3JCYW5uZXJJZCk7XHJcbiAgICAgICAgICAgIGlmICggZ2xvYmFsLmlzVW5EZWZpbmVkKF92aWV3X2Jhbm5lcikgfHwgX3ZpZXdfYmFubmVyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBfdmlld19iYW5uZXIgPSBfcGFyZW50Vmlldy5hcHBlbmQoXCI8ZGl2IGlkPVwiK19lcnJvckJhbm5lcklkK1wiPjwvZGl2PlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgX2Jhbm5lclJlc3VsdCA9IHRoaXMucmVuZGVyRXJyb3JzQmFubmVyKF9lcnJvcnMpO1xyXG4gICAgICAgICAgICBfdmlld19iYW5uZXIuaHRtbChfYmFubmVyUmVzdWx0LmRhdGEudmlld0NvbnRlbnQpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2goZXJyKSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KGVyci5tZXNzYWdlKTtcclxuICAgICAgICB9ICBcclxuICAgIH1cclxuICAgIC8vcHVibGljIGxvYWRWaWV3Qm9keSh3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24sZGF0YTphbnksc2VuZGVyOmFueSk6U2FvcFNlcnZpY2VzQ29yZVJlc3VsdHtcclxuICAgIHB1YmxpYyBsb2FkVmlld0JvZHkod2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxvYWRWaWV3Qm9keVwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuYmVmb3JlVmlld1Nob3coc2VuZGVyKTtcclxuXHJcbiAgICAgICAgbGV0IF9hamF4QWN0aW9uID0gd2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCA/IHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgOiB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludDtcclxuICAgICAgICAvL19hamF4QWN0aW9uID0gZ2V0U2l0ZUFic29sdXRlVVJMKF9hamF4QWN0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7YWN0aW9uOl9hamF4QWN0aW9uLGRhdGE6ZGF0YSx0eXBlOlwiUE9TVFwifTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uKF9hamF4UmVzdWx0KXtcclxuICAgICAgICAgICAgaWYgKF9hamF4UmVzdWx0LnJlc3BvbnNlID09IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2Vzcyl7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWpheC5zdWNjZXNzXCIpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChfYWpheFJlc3VsdC5kYXRhKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmFmdGVyVmlld1Nob3coc2VuZGVyLHdmQWN0aW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhamF4LmVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKChnbG9iYWwuaXNVbkRlZmluZWQoX2FqYXhSZXN1bHQuZGF0YSkgJiYgZ2xvYmFsLmlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKSkgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2FqYXhSZXN1bHQuZGF0YS5yZXNwb25zZUpTT04gJiYgX2FqYXhSZXN1bHQuZGF0YS5yZXNwb25zZUpTT04ubWVzc2FnZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5yZXNwb25zZUpTT04ubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyRXJyb3IgPSBmdW5jdGlvbihfYWpheFJlc3VsdCl7XHJcbi8vIyMjXHJcbiAgICAgICAgICAgIGlmICgoZ2xvYmFsLmlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEpICYmIGdsb2JhbC5pc1VuRGVmaW5lZChfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSkpID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5hZnRlckV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3NDb21wbGV0ZShyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQub25TdWJtaXRTdWNjZXNzQ29tcGxldGVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0RXJyb3IocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0RXJyb3JcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0RmFpbHVyZShyZXN1bHQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQub25TdWJtaXRGYWlsdXJlXCIpO1xyXG4gICAgICAgIHZhciBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmhhbmRsZVN1Ym1pdEVycm9yKHJlc3VsdCk7XHJcbiAgICB9XHJcbiBcclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3MocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uRXhlY3V0ZVN1Y2Nlc3NcIik7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuc3VjY2Vzc1wiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm1vZGFsKCdoaWRlJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBqdXN0IGluIGNhc2U6IG9kc3RyYW5pLCDEjWUgamUgxaFlIHZlZG5vIHZpZG5vLCBhdnRvbWF0c2tvIHNlIG5lIHphcHJlIHZlZG5vIDooXHJcbiAgICAgICAgICAgICQoJy5tb2RhbC1iYWNrZHJvcCcpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuYWxlcnRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKHJlc3VsdC5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9ICBcclxuXHJcbiAgICAgICAgICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaERhdGEocmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5vblN1Ym1pdFN1Y2Nlc3NDb21wbGV0ZShyZXN1bHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuZXJyb3JcIik7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWxvYWQgdmlldyBmb3JtXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDb250ZW50KHJlc3VsdC52aWV3Q29udGVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdCk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoQ29udGVudCh2aWV3Q29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmlld01vZGFsQm9keS5odG1sKHZpZXdDb250ZW50KTtcclxuICAgICAgICB0aGlzLmJpbmRCdXR0b25zKG51bGwpO1xyXG4gICAgICAgIHRoaXMuYmluZFZpZXdFdmVudHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkFmdGVyUmVmcmVzaENvbnRlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25BZnRlclJlZnJlc2hDb250ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJvbkFmdGVyUmVmcmVzaENvbnRlbnRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRGVsZXRlUmVjb3JkKGRlbGV0ZURhdGE6YW55KTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25EZWxldGVSZWNvcmRcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlc1BhcmFtcyA9IHthY3Rpb246dGhpcy5kZWxldGVSZWNvcmRFbmRwb2ludCxkYXRhOmRlbGV0ZURhdGEsdHlwZTpcIlBPU1RcIn07XHJcblxyXG4gICAgICAgIHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3MgPSBmdW5jdGlvbihfYWpheFJlc3VsdCl7XHJcbiAgICAgICAgICAgIGlmIChfYWpheFJlc3VsdC5yZXNwb25zZSA9PSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5pc1VuRGVmaW5lZChfdGhpcy5yZWZyZXNoRGF0YSkpe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlZnJlc2hEYXRhKGRlbGV0ZURhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcblxyXG4gICAgICAgIC8vIGxldCBfYWpheFJlc3VsdCA9IHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHRoaXMuX3NlcnZpY2VzUGFyYW1zKTtcclxuICAgICAgICAvLyBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAvLyAgICAgYWxlcnRpZnkubWVzc2FnZShfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgLy8gICAgIGlmICghZ2xvYmFsLmlzVW5EZWZpbmVkKHRoaXMucmVmcmVzaERhdGEpKXtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMucmVmcmVzaERhdGEoZGVsZXRlRGF0YSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICBhbGVydGlmeS5lcnJvcihfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHJldHVybiBfYWpheFJlc3VsdC5yZXNwb25zZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIHJlZnJlc2hEYXRhKHNlbmRlcjphbnkpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJyZWZyZXNoRGF0YVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlUmVjb3JkKHRpdGxlOnN0cmluZyxtZXNzYWdlOnN0cmluZyxkZWxldGVEYXRhOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGVsZXRlUmVjb3JkLmJlZ2luXCIpO1xyXG4gICAgICAgIGxldCBzYW9wTWVzc2FnZURsZyA9IG5ldyBTYW9wTWVzc2FnZURsZyhkZWxldGVEYXRhKSAgXHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcub25ZZXMgPSB0aGlzLm9uRGVsZXRlUmVjb3JkLmJpbmQodGhpcyk7XHJcbiAgICAgICAgc2FvcE1lc3NhZ2VEbGcuU2hvdyhtZXNzYWdlLHRpdGxlLDEsW1Nhb3BNc2dEbGdCdXR0b24ubWJZZXMsU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vXSk7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImRlbGV0ZVJlY29yZC5lbmRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFJlY29yZChkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFkZFJlY29yZFwiKTtcclxuICAgICAgICBsZXQgX3Jlc3VsdCA9IHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQsZGF0YSxzZW5kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlZGl0UmVjb3JkKGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZWRpdFJlY29yZFwiKTtcclxuICAgICAgICB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY29yZERldGFpbHMoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlZGl0UmVjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscyxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1hbnVhbGx5U3VibWl0KHN1Ym1pdERhdGE6IGFueSwgc3Bpbm5lckRpdklkOiBzdHJpbmcgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm1hbnVhbGx5U3VibWl0XCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoZ2xvYmFsLmlzRW1wdHkoc3Bpbm5lckRpdklkKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlc1BhcmFtcyA9IHsgYWN0aW9uOiB0aGlzLm1hbnVhbGx5U3VibWl0RW5kcG9pbnQsIGRhdGE6IHN1Ym1pdERhdGEsIHR5cGU6IFwiUE9TVFwiIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlc1BhcmFtcyA9IHsgYWN0aW9uOiB0aGlzLm1hbnVhbGx5U3VibWl0RW5kcG9pbnQsIGRhdGE6IHN1Ym1pdERhdGEsIHR5cGU6IFwiUE9TVFwiLCBzcGlubmVyRGl2SWQ6IHNwaW5uZXJEaXZJZCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uIChfYWpheFJlc3VsdCkge1xyXG4gICAgICAgICAgICBfdGhpcy5vblN1Ym1pdFN1Y2Nlc3MoX2FqYXhSZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dWaWV3Rm9ybSh3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24sZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNob3dWaWV3Rm9ybVwiKTtcclxuICAgICAgICBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFJlY29yZChkYXRhLHNlbmRlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzKSB7ICBcclxuICAgICAgICAgICAgdGhpcy5yZWNvcmREZXRhaWxzKGRhdGEsc2VuZGVyKTsgICAgICAgICAgXHJcbiAgICAgICAgfSAgIFxyXG4gICAgICAgIHRoaXMuU2V0VG9GdWxsU2NyZWVuKCk7ICAgICAgXHJcbiAgICB9ICBcclxuXHJcbiAgICBwdWJsaWMgU2V0VG9GdWxsU2NyZWVuKCl7XHJcbiAgICAgICAgaWYgKHRoaXMuZnVsbFNjcmVlbiApe1xyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5hZGRDbGFzcyhcInNhb3AtbW9kYWwtZnVsbHNjcmVlbi1mb3JtXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2RpYWxvZ0RpdiA9IHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmZpbmQoXCIubW9kYWwtZGlhbG9nXCIpO1xyXG4gICAgICAgICAgICBfZGlhbG9nRGl2LnJlbW92ZUNsYXNzKCdtb2RhbC1kaWFsb2ctY2VudGVyZWQnKTtcclxuICAgICAgICAgICAgX2RpYWxvZ0Rpdi5hZGRDbGFzcygnbW9kYWwtZnVsbHNjcmVlbicpO1xyXG4gICAgICAgICAgICBfZGlhbG9nRGl2LnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcbiAgICBcclxuICAgICAgICAgICAgbGV0IF9jb250ZW50ID0gdGhpcy5fdmlld01vZGFsRnJhbWUuZmluZChcIi5tb2RhbC1jb250ZW50XCIpO1xyXG4gICAgICAgICAgICBfY29udGVudC5yZW1vdmVBdHRyKCdjbGFzcycpO1xyXG4gICAgICAgICAgICBfY29udGVudC5hZGRDbGFzcygnbW9kYWwtY29udGVudCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaEVsZW1lbnREYXRhKGh0bWxDb250ZW50OnN0cmluZyxlbGVtZW50SWQ6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlZnJlc2hFbGVtZW50RGF0YVwiKTtcclxuICAgICAgICBsZXQgX2RvY3VtZW50ID0gJChodG1sQ29udGVudCk7XHJcbiAgICAgICAgbGV0IF9jZWxsID0gX2RvY3VtZW50LmZpbmQoZWxlbWVudElkKTtcclxuICAgICAgICAkKGVsZW1lbnRJZCkucmVwbGFjZVdpdGgoX2NlbGwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgLy8gIFxyXG59XHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVXRpbHMgfSBmcm9tIFwiLi9Db3JlL3Nhb3AtdXRpbHNcIjtcclxuaW1wb3J0IHsgU2FvcFRvZ2dsZVBhbmVsIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLXRvZ2dsZS1wYW5lbFwiO1xyXG5pbXBvcnQgeyBTYW9wSW5wdXRNYXNrIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLWlucHV0bWFza1wiO1xyXG5pbXBvcnQgeyBTYW9wQ2hlY2tib3hTd2l0Y2ggfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtY2hlY2tib3gtc3dpdGNoXCI7XHJcbmltcG9ydCB7IFNhb3BNdWx0aXNlbGVjdCAgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtbXVsdGlzZWxlY3RcIjtcclxuaW1wb3J0IHsgU2FvcFZpZXdTcGlubmVyIH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3Atdmlldy1zcGlubmVyJztcclxuaW1wb3J0IHsgU2FvcFJpZ2h0U2lkZWJhciB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLXJpZ2h0LXNpZGViYXInO1xyXG5pbXBvcnQgeyBNZW51U2lkZWJhciB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1tZW51LXNpZGViYXJcIjtcclxuaW1wb3J0IHsgU2FvcE1lc3NhZ2VEbGcgfSBmcm9tIFwiLi9Db21wb25lbnRzL3Nhb3AtbWVzc2FnZS1kbGdcIjtcclxuaW1wb3J0IHsgU2FvcFBvcHVwRGlhbG9nIH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3AtcG9wdXAtZGlhbG9nJ1xyXG5pbXBvcnQgeyBTYW9wRmxvYXRpbmdMYWJlbCB9IGZyb20gXCIuL0NvbXBvbmVudHMvc2FvcC1mbG9hdGluZy1sYWJlbFwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSAnLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZSc7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuL0NvcmUvc2FvcC10cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBTYW9wV2ViR3JpZCB9IGZyb20gJy4vQ29tcG9uZW50cy9zYW9wLWdyaWQnO1xyXG5pbXBvcnQgeyBTYW9wVmlld0Zvcm0gfSBmcm9tICcuL0NvcmUvc2FvcC12aWV3LWZvcm0nO1xyXG5pbXBvcnQgeyBTYW9wVHJlZXZpZXcgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC10cmVldmlldyc7XHJcbmltcG9ydCB7IFNhb3BTZWxlY3RpemVTZWxlY3QgfSBmcm9tICcuL0NvbXBvbmVudHMvc2FvcC1zZWxlY3RpemUtc2VsZWN0JztcclxuaW1wb3J0IHsgU2FvcFBkZlByZXZpZXcgIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLXBkZi1wcmV2aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BQaW5jaFpvb20gIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLXBpbmNoLWFuZC16b29tXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZWNob1Rlc3QobXNnOnN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJlY2hvOiBcIittc2cpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDb21wYXRpYmlsaXR5KCk6IGJvb2xlYW4ge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNoZWNrQ29tcGF0aWJpbGl0eVwiKTtcclxuICAgIGxldCB1dGlscyA9IG5ldyBTYW9wVXRpbHMoKTtcclxuICAgIHJldHVybiB1dGlscy5jaGVja0NvbXBhdGliaWxpdHkoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDbGllbnRMb2dNb2RlVmFsdWUoKSB7XHJcbiAgICBnbG9iYWwuZGVidWdNb2RlID0gZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRTaXRlQmFzZVVybFZhbHVlKCkge1xyXG4gICAgZ2xvYmFsLnNpdGVCYXNlVXJsID0gZ2xvYmFsLmdldFNpdGVCYXNlVXJsKClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVTaXRlSlMoKSB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdGlhbGl6ZVNpdGVKU1wiKTtcclxuICAgIG5ldyBNZW51U2lkZWJhcigpLmluaXQoKTtcclxuICAgIG5ldyBTYW9wVG9nZ2xlUGFuZWwoKS5pbml0KCk7XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKGUuY3RybEtleSAmJiBlLmFsdEtleSAmJiBlLmtleUNvZGUgPT0gNzkpIHtcclxuICAgICAgICAgICAgLy8gQ1RSTCArIEFMVCArIE9cclxuICAgICAgICAgICAgZ2xvYmFsLlNldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLmRlYnVnTW9kZSA9IGdsb2JhbC5HZXRDbGllbnRMb2dNb2RlU3RvcmFnZVZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZ2xvYmFsLnNldEhlbHBMaW5rKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRGaXJzdENvbnRyb2xUb0ZvY3VzKGZvcm1JZDogc3RyaW5nKSB7XHJcbiAgICBnbG9iYWwuc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXMoZm9ybUlkKTtcclxufVxyXG5cclxuZXhwb3J0IHtnbG9iYWx9O1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRvZ2dsZVBhbmVsRXggZXh0ZW5kcyBTYW9wVG9nZ2xlUGFuZWx7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wSW5wdXRNYXNrRXggZXh0ZW5kcyBTYW9wSW5wdXRNYXNre307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcENoZWNrYm94U3dpdGNoRXggZXh0ZW5kcyBTYW9wQ2hlY2tib3hTd2l0Y2h7fTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTXVsdGlzZWxlY3RFeCBleHRlbmRzIFNhb3BNdWx0aXNlbGVjdHt9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BNZXNzYWdlRGxnRXggZXh0ZW5kcyBTYW9wTWVzc2FnZURsZ3t9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BQb3B1cERpYWxvZ0V4IGV4dGVuZHMgU2FvcFBvcHVwRGlhbG9ne307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdTcGlubmVyRVggZXh0ZW5kcyBTYW9wVmlld1NwaW5uZXIgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BSaWdodFNpZGViYXJFeCBleHRlbmRzIFNhb3BSaWdodFNpZGViYXIgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BGbG9hdGluZ0xhYmVsRXggZXh0ZW5kcyBTYW9wRmxvYXRpbmdMYWJlbCB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNlcnZpY2VzQ29yZUV4IGV4dGVuZHMgU2FvcFNlcnZpY2VzQ29yZSB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9uU2VydmljZUV4IGV4dGVuZHMgU2FvcFRyYW5zbGF0aW9uU2VydmljZSB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFdlYkdyaWRFeCBleHRlbmRzIFNhb3BXZWJHcmlkIHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVmlld0Zvcm1FeCBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFV0aWxzRXggZXh0ZW5kcyBTYW9wVXRpbHMgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BUcmVldmlld0V4IGV4dGVuZHMgU2FvcFRyZWV2aWV3IHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wU2VsZWN0aXplU2VsZWN0RXggZXh0ZW5kcyBTYW9wU2VsZWN0aXplU2VsZWN0IHsgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wUGRmUHJldmlld0V4IGV4dGVuZHMgU2FvcFBkZlByZXZpZXcge307XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFBpbmNoWm9vbUV4IGV4dGVuZHMgU2FvcFBpbmNoWm9vbSB7fTtcclxuLy9cclxuIl19"}