'\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,isEmpty,getSiteAbsoluteURL, isUnDefined } 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 && !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 = 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: !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 = 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, isEmpty, isUnDefined } 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(!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 (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\nimport { global, setModalFormZIndex, isEmpty, isUnDefined, setFirstFormControlToFocus,getSiteAbsoluteURL } 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 ,wfaCustomHtml = 5\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 data: 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 private _prepareView:boolean = false;\r\n private _data:any;\r\n private _modalParent:boolean = false;\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 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 fullTitle: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 getData():any {\r\n return this._data;\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\r\n let _this = this;\r\n\r\n this.bindViewEvents(sender);\r\n\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 (this.fullTitle.length > 0) {\r\n this.title = this.fullTitle;\r\n }\r\n\r\n if (!isEmpty(this.title)){\r\n let _title = \"\";\r\n if (this.fullTitle.length > 0) {\r\n _title = this.title;\r\n }else 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 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._view_btnOk.click(\r\n // function () {\r\n // _this.onBtnOkClick(sender);\r\n // }\r\n // );\r\n\r\n // this._view_btnCancel.click(\r\n // function () {\r\n // _this.onBtnCancel(sender);\r\n // }\r\n // ); \r\n \r\n //this.bindViewEvents();\r\n\r\n this._modalParent = $(\"body\").hasClass(\"modal-open\");\r\n\r\n if (this._prepareView == false){\r\n this._viewModalFrame.modal('show');\r\n setModalFormZIndex(this.id); \r\n setFirstFormControlToFocus(this.id);\r\n }\r\n //\r\n this.afterViewShowSuccess(sender);\r\n\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 public viewShownComplete(sender: any): void {\r\n global.ConsoleLogDegug(this.id + \".viewShownComplete()\");\r\n }\r\n\r\n public bindViewEvents(sender:any): void {\r\n global.ConsoleLogDegug(\"bindViewEvents\");\r\n\r\n let _this = this;\r\n let divForm = this._viewModalFrame.find(\"form\");\r\n \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 this._view_btnOk.click(\r\n function () {\r\n _this.onBtnOkClick(sender);\r\n }\r\n );\r\n\r\n this._view_btnCancel.click(\r\n function () {\r\n _this.onBtnCancel(sender);\r\n }\r\n ); \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._viewModalFrame.on('hidden.bs.modal', function (e) { \r\n if (_this._modalParent) {\r\n $(\"body\").addClass(\"modal-open\");\r\n } \r\n })\r\n\r\n this._viewModalFrame.on('shown.bs.modal', function(e) { \r\n _this.viewShownComplete(e);\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 let _parentView = $(this.id).parent();\r\n let _errorBannerId = this.id+\"ErrorBanner\";\r\n let _view_banner = _parentView.find(_errorBannerId);\r\n if ( isUnDefined(_view_banner) || _view_banner.length == 0) {\r\n _parentView.append(\"\");\r\n _view_banner = _parentView.find(_errorBannerId);\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 if (wfAction != SaopWfAction.wfaCustomHtml) {\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 ((isUnDefined(_ajaxResult.data) && 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 ((isUnDefined(_ajaxResult.data) && 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 } else {\r\n if (!isUnDefined(data) && !isUnDefined(data.html)) {\r\n this._viewModalBody.html(data.html);\r\n }\r\n _this.afterViewShow(sender,wfAction);\r\n }\r\n\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 (!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._viewModalBody.html(result.viewContent);\r\n this.bindViewEvents(result);\r\n }\r\n this.afterSubmitSuccess(result);\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 (!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 (!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 this._data = data;\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._data = data;\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._data = data;\r\n this.loadViewBody(SaopWfAction.wfaRecordDestails,data,sender);\r\n }\r\n\r\n public custonHtmlBody(data:any,sender:any = null):void {\r\n global.ConsoleLogDegug(\"custonHtmlBody\");\r\n this._data = data;\r\n this.loadViewBody(SaopWfAction.wfaCustomHtml,data,sender);\r\n }\r\n\r\n // public recordPreview(data:any,sender:any = null):void {\r\n // global.ConsoleLogDegug(\"editRecord\");\r\n // this.loadViewBody(SaopWfAction.wfaPrepareView,data,sender);\r\n // } \r\n\r\n public showViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n this._data = data;\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 } else if (wfAction == SaopWfAction.wfaCustomHtml) {\r\n this.custonHtmlBody(data,sender); \r\n } \r\n this.SetToFullScreen(); \r\n } \r\n\r\n public prepareViewForm(wfAction:SaopWfAction,data:any,sender:any = null):void{\r\n global.ConsoleLogDegug(\"showViewForm\");\r\n this._data = data;\r\n this._prepareView = true;\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 } else if (wfAction == SaopWfAction.wfaCustomHtml) {\r\n this.custonHtmlBody(data,sender); \r\n } \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 public CloseViewForm(): void {\r\n this._viewModalFrame.modal('hide');\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\r\n public showModal():void {\r\n if (this._prepareView == false){\r\n this._viewModalFrame.modal('show');\r\n setModalFormZIndex(this.id); \r\n setFirstFormControlToFocus(this.id);\r\n } \r\n }\r\n \r\n // \r\n}\r\n","import { global } from '../Common/saop-common';\r\nimport { SaopViewForm } from \"../Core/saop-view-form\";\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\n\r\n\r\nexport class SaopMealApplicationBeneficiaryView extends SaopViewForm {\r\n private _formId: string;\r\n\r\n public sifraOtroka: string;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n super(viewId, libName);\r\n\r\n this.fullTitle = \"Prijava na šolsko prehrano\";\r\n\r\n this.addRecordEndpoint = \"\";\r\n this.editRecordEndpoint = \"MealApplication/Beneficiary\";\r\n this.deleteRecordEndpoint = \"\";\r\n\r\n }\r\n\r\n onBtnOkClick(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationBeneficiaryView.onBtnOkClick\");\r\n\r\n let selectedCode = $(\"#SelectedCode\").val().toString();\r\n\r\n this.sifraOtroka = selectedCode;\r\n //this.goStraightToForm(selectedCode);\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 SaopMealApplicationFormView {\r\n private _libName: string;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView\");\r\n\r\n this._libName = libName;\r\n }\r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.initView\");\r\n\r\n let _this = this;\r\n window.onresize = function () {\r\n _this.setTop();\r\n };\r\n }\r\n\r\n initViewControls() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.initViewControls\");\r\n let _this = this;\r\n $('#btnNext').on('click', function (e) {\r\n _this.submitForm(false);\r\n });\r\n $('#btnSubmit').on('click', function (e) {\r\n _this.submitForm(true);\r\n });\r\n $('#btnCancel').on('click', function (e) {\r\n _this.goToList();\r\n });\r\n }\r\n\r\n refreshForm(sifraOtroka: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.refreshForm\");\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n let _this = this;\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.ExecuteAction.MealApplication/Form.afterDone\");\r\n $(\"#mealApplicationDiv\").html(response);\r\n _this.setTop();\r\n _this.initViewControls();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"MealApplication/Form\"\r\n , data: {\r\n sifraOtroka: sifraOtroka\r\n }\r\n , type: \"GET\"\r\n , spinnerDivId: \"#mealApplicationLoading\"\r\n });\r\n }\r\n\r\n refreshFilledForm(idPrijave: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.refreshForm\");\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n let _this = this;\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.ExecuteAction.MealApplication/Form.afterDone\");\r\n $(\"#mealApplicationDiv\").html(response);\r\n _this.setTop();\r\n _this.initViewControls();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"MealApplication/FilledForm\"\r\n , data: {\r\n idPrijave: idPrijave\r\n }\r\n , type: \"GET\"\r\n , spinnerDivId: \"#mealApplicationLoading\"\r\n });\r\n }\r\n\r\n submitForm(skipPrview: boolean): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.submitForm\");\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n let _this = this;\r\n let data = $('form').serialize(); // or use the id of the form is you have given it one\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.ExecuteAction.MealApplication/SubmitForm.afterDone\");\r\n if (response.success) {\r\n let idPrijave = response.viewContent;\r\n if (skipPrview) {\r\n _this.submitMealApplication(idPrijave);\r\n }\r\n else {\r\n _this.goToPreview(idPrijave);\r\n }\r\n }\r\n else {\r\n $(\"#mealApplicationDiv\").html(response.viewContent);\r\n _this.setTop();\r\n _this.initViewControls();\r\n }\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"MealApplication/FormSubmit\"\r\n , data: data\r\n , type: \"POST\"\r\n , spinnerDivId: \"#mealApplicationLoading\"\r\n });\r\n }\r\n\r\n goToPreview(idPrijave: bigint): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.goToPreview\");\r\n }\r\n\r\n goToList(): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.goToList\");\r\n }\r\n\r\n setTop() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.setTop\");\r\n }\r\n\r\n submitMealApplication(idPrijave: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationFormView.submitMealApplication\");\r\n }\r\n}\r\n\r\n\r\n","import { global } from '../Common/saop-common';\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopServicesCore } from '../Core/saop-services-core'\r\nimport { SaopMealApplicationBeneficiaryView } from \"./saop-meal-application-beneficiary-view\";\r\nimport { param } from 'jquery';\r\n\r\nexport class SaopMealApplicationListView {\r\n private _libName: string;\r\n\r\n private _beneficiaryForm: SaopMealApplicationBeneficiaryView;\r\n public selectedCode: string;\r\n private idPrijave: string;\r\n\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView\");\r\n\r\n this._libName = libName;\r\n }\r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.initView\");\r\n\r\n this._beneficiaryForm = new SaopMealApplicationBeneficiaryView(\"#mealApplicationView001\", this._libName);\r\n this._beneficiaryForm.onBtnOkClick = this.onBtnOkClickEx.bind(this);\r\n\r\n let _this = this;\r\n window.onresize = function () {\r\n _this.setTop();\r\n _this.setTableHeight();\r\n };\r\n\r\n this.refreshList();\r\n }\r\n\r\n initViewControls() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.initViewControls\");\r\n let _this = this;\r\n $('#btnNew').on('click', function (e) {\r\n if ($(\"#SteviloOtrok\").val() > 1) {\r\n _this._beneficiaryForm.showViewForm(SaopWfAction.wfaEditRecord, {});\r\n }\r\n else {\r\n let selectedCode = $(\"#PrviOtrok\").val().toString();\r\n _this.goToForm(selectedCode);\r\n }\r\n \r\n });\r\n $('.btnDocument').on('click', function (e) {\r\n _this.idPrijave = this.getAttribute(\"data-prijava-id\");\r\n _this.refreshList();\r\n });\r\n\r\n $('.btnDocumentDownload').on('click', function (e) {\r\n _this.idPrijave = this.getAttribute(\"data-prijava-id\");\r\n _this.downloadDocument();\r\n });\r\n }\r\n\r\n refreshList(params: any = null): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.refreshList\");\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n let _this = this;\r\n\r\n params = {\r\n idPrijave : this.idPrijave\r\n }\r\n saopServicesCore.afterDone = function (response) {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.ExecuteAction.MealApplication/List.afterDone\");\r\n $(\"#mealApplicationDiv\").html(response);\r\n _this.setTop();\r\n _this.setTableHeight();\r\n _this.initViewControls();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"MealApplication/List\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#mealApplicationLoading\"\r\n });\r\n }\r\n\r\n downloadDocument(params: any = null): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.downloadDocument\");\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n let _this = this;\r\n\r\n params = {\r\n idPrijave: this.idPrijave\r\n }\r\n saopServicesCore.afterDone = function (response) {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.ExecuteAction.MealApplication/DownloadDoc.afterDone\");\r\n //$(\"#mealApplicationDiv\").html(response);\r\n //_this.setTop();\r\n //_this.setTableHeight();\r\n //_this.initViewControls();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"MealApplication/DownloadDoc\"\r\n , data: params\r\n , type: \"GET\"\r\n , spinnerDivId: \"#mealApplicationLoading\"\r\n });\r\n }\r\n\r\n goToForm(sifraOtroka: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.goToForm\");\r\n }\r\n\r\n setTop() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.setTop\");\r\n }\r\n\r\n setTableHeight() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.setTableHeight\");\r\n var _height1 = $('header').height();\r\n var _height2 = $('#mealApplicationDiv1').height();\r\n var remaining_height = window.innerHeight - _height1 - _height2 - 69;\r\n $('#mealApplicationList').css(\"height\", remaining_height);\r\n }\r\n\r\n public onBtnOkClickEx(sender: any): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationListView.onBtnOkClickEx\");\r\n\r\n let selectedCode = $(\"#SelectedCode\").val().toString();\r\n\r\n this.goToForm(selectedCode);\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 SaopMealApplicationPreviewView {\r\n private _libName: string;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView\");\r\n\r\n this._libName = libName;\r\n }\r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView.initView\");\r\n\r\n let _this = this;\r\n window.onresize = function () {\r\n _this.setTop();\r\n };\r\n }\r\n\r\n initViewControls() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView.initViewControls\");\r\n let _this = this;\r\n\r\n $('#btnSubmit').on('click', function (e) {\r\n let idPrijave = $(\"#IDPrijave\").val().toString();\r\n _this.submitMealApplication(idPrijave);\r\n });\r\n $('#btnPrevious').on('click', function (e) {\r\n let idPrijave = $(\"#IDPrijave\").val().toString();\r\n _this.goToFilledForm(idPrijave);\r\n });\r\n $('#btnCancel').on('click', function (e) {\r\n _this.goToList();\r\n });\r\n }\r\n\r\n refreshPreview(idPrijave: bigint): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView.refreshForm\");\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n let _this = this;\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView.ExecuteAction.MealApplication/Preview.afterDone\");\r\n $(\"#mealApplicationDiv\").html(response);\r\n _this.setTop();\r\n _this.initViewControls();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"MealApplication/Preview\"\r\n , data: {\r\n IDPrijave: idPrijave\r\n }\r\n , type: \"GET\"\r\n , spinnerDivId: \"#mealApplicationLoading\"\r\n });\r\n }\r\n\r\n goToList(): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView.goToList\");\r\n }\r\n\r\n goToFilledForm(idPrijave: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView.goToForm\");\r\n }\r\n\r\n setTop() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView.setTop\");\r\n }\r\n\r\n submitMealApplication(idPrijave: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationPreviewView.submitMealApplication\");\r\n }\r\n}\r\n\r\n\r\n","import { global } from '../Common/saop-common';\r\nimport { SaopWfAction } from \"../Core/saop-view-form\";\r\nimport { SaopServicesCore } from '../Core/saop-services-core'\r\nimport { SaopMealApplicationListView } from \"./saop-meal-application-list-view\";\r\nimport { SaopMealApplicationBeneficiaryView } from \"./saop-meal-application-beneficiary-view\";\r\nimport { SaopMealApplicationFormView } from \"./saop-meal-application-form-view\";\r\nimport { SaopMealApplicationPreviewView } from \"./saop-meal-application-preview-view\"; \r\n\r\nexport class SaopMealApplicationView {\r\n private _libName: string;\r\n\r\n //edit forma\r\n private _listView: SaopMealApplicationListView;\r\n private _formView: SaopMealApplicationFormView;\r\n private _previewView: SaopMealApplicationPreviewView;\r\n\r\n constructor(viewId: string, libName: string = \"\") {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView\");\r\n }\r\n\r\n initView() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.initView\");\r\n\r\n let _this = this;\r\n _this.setTop();\r\n window.onresize = function () {\r\n _this.setTop();\r\n };\r\n\r\n this.goToList();\r\n }\r\n\r\n goToList(): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.goToList\");\r\n\r\n this._listView = new SaopMealApplicationListView(\"#mealApplicationViewList\", this._libName);\r\n this._listView.setTop = this.setTop.bind(this);\r\n this._listView.initView();\r\n this._listView.goToForm = this.goToForm.bind(this);\r\n }\r\n\r\n goToForm(sifraOtroka: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.goToForm\");\r\n\r\n this._formView = new SaopMealApplicationFormView(\"#mealApplicationViewForm\", this._libName);\r\n this._formView.setTop = this.setTop.bind(this);\r\n this._formView.initView();\r\n this._formView.goToList = this.goToList.bind(this);\r\n this._formView.goToPreview = this.goToPreview.bind(this);\r\n this._formView.submitMealApplication = this.submitMealApplication.bind(this);\r\n this._formView.refreshForm(sifraOtroka);\r\n }\r\n\r\n goToPreview(idPrijave: bigint): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.goToPreview\");\r\n\r\n this._previewView = new SaopMealApplicationPreviewView(\"#mealApplicationViewPreview\", this._libName);\r\n this._previewView.setTop = this.setTop.bind(this);\r\n this._previewView.initView();\r\n this._previewView.goToList = this.goToList.bind(this);\r\n this._previewView.goToFilledForm = this.goToFilledForm.bind(this);\r\n this._previewView.submitMealApplication = this.submitMealApplication.bind(this);\r\n this._previewView.refreshPreview(idPrijave);\r\n }\r\n\r\n goToFilledForm(idPrijave: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.goToFilledForm\");\r\n\r\n this._formView = new SaopMealApplicationFormView(\"#mealApplicationViewForm\", this._libName);\r\n this._formView.setTop = this.setTop.bind(this);\r\n this._formView.initView();\r\n this._formView.submitMealApplication = this.submitMealApplication.bind(this);\r\n this._formView.goToList = this.goToList.bind(this);\r\n this._formView.goToPreview = this.goToPreview.bind(this);\r\n this._formView.refreshFilledForm(idPrijave);\r\n }\r\n\r\n setTop() {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.setTop\");\r\n var _top = $('header').height();\r\n $('.application-container').css(\"top\", _top);\r\n }\r\n\r\n //akcije\r\n submitMealApplication(idPrijave: string): void {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.submitMealApplication\");\r\n\r\n let saopServicesCore = new SaopServicesCore();\r\n let _this = this;\r\n\r\n saopServicesCore.afterDone = function (response) {\r\n global.ConsoleLogDegug(\"SaopMealApplicationView.ExecuteAction.MealApplication/DocumentSubmit.afterDone\");\r\n _this.goToList();\r\n };\r\n saopServicesCore.ExecuteAction({\r\n action: \"MealApplication/DocumentSubmit\"\r\n , data: {\r\n IDPrijave: idPrijave\r\n }\r\n , type: \"GET\"\r\n , spinnerDivId: \"#mealApplicationLoading\"\r\n });\r\n }\r\n}\r\n\r\n\r\n","/// \r\n/// \r\n/// \r\n/// \r\nimport * as SaopViewFormServices from \"../@types/saop_core/saopViewFormServices\"\r\nimport { SaopChangePwdView } from '../Account/saop-change-pwd-view'\r\n\r\nexport class SaopSettingsView { \r\n //\r\n private _saopServicesCore : icSaopCore.SaopServicesCoreEx;\r\n private _saopChangePwdView : SaopChangePwdView;\r\n\r\n constructor(viewId:string,libName:string = \"\") {\r\n \r\n this._saopServicesCore = new icSaopCore.SaopServicesCoreEx(); \r\n this._saopChangePwdView = new SaopChangePwdView(viewId,libName);\r\n }\r\n\r\n initView(): void {\r\n icSaopCore.global.ConsoleLogDegug(\"SaopSettingsView.initView\");\r\n\r\n this.bindViewEvents(); \r\n \r\n this.checkPasswordStrength();\r\n \r\n }\r\n\r\n bindViewEvents(){\r\n icSaopCore.global.ConsoleLogDegug(\"SaopSettingsView.bindGridEvents\");\r\n let _this = this;\r\n //\r\n $(\"#selectJezik\").off(\"change\");\r\n $(\"#selectJezik\").on('change', function (row) {\r\n _this.vrstaJezikaChanged();\r\n }); \r\n \r\n this._saopChangePwdView.bindViewEvents(); \r\n }\r\n\r\n vrstaJezikaChanged(): void {\r\n icSaopCore.global.ConsoleLogDegug(\"SaopSettingsView.vrstaJezikaChanged\");\r\n let _this = this;\r\n\r\n let vrstaJezikaElement = document.getElementById('selectJezik') as HTMLSelectElement;\r\n let jezik = vrstaJezikaElement.options[vrstaJezikaElement.selectedIndex].value;\r\n\r\n let idWebOperaterja = (document.getElementById('IDWebOperaterja') as HTMLInputElement).value;\r\n\r\n let data = { idweboperaterja: idWebOperaterja, jezik: jezik};\r\n\r\n this._saopServicesCore.afterDone = function (response:SaopViewFormServices.SaopWfSubmitResult) {\r\n if (response.alertMessage) {\r\n alertify.message(response.alertMessage);\r\n }\r\n\r\n if (response.viewContent) {\r\n $(\"#messageBanner\").html(response.viewContent);\r\n }\r\n\r\n if (response.success) {\r\n //reload current page \r\n icSaopCore.global.relodeCurrentPage();\r\n }\r\n else {\r\n $(\"#selectJezik\").val(response.jezik);\r\n }\r\n };\r\n this._saopServicesCore.ExecuteAction({\r\n action: \"Settings/UpdateSaopwebOperaterjiJezik\"\r\n , data: data\r\n , type: \"POST\"\r\n , spinnerDivId: \"#absenceConfirmationPendingLoading\"\r\n }); \r\n }\r\n\r\n public checkPasswordStrength():void{\r\n this._saopChangePwdView.checkPasswordStrength();\r\n }\r\n\r\n}\r\n\r\n\r\n","/// \r\n/// \r\n//import * as icSaopCore from \"./@types/saop_core/index\"\r\n//import * as icSaopCore from './@types/saop_core/index'\r\n//import * as saopCommonServices from \"./@types/saop_core/saopCommonServices\"\r\n\r\nimport { global } from './Common/saop-common';\r\nimport { SaopInputMask } from \"./Components/saop-inputmask\";\r\nimport { SaopSettingsView } from \"./Settings/saop-settings-view\";\r\nimport { SaopChangePwdView } from './Account/saop-change-pwd-view';\r\nimport { SaopViewSpinner } from './Components/saop-view-spinner';\r\nimport { SaopMealApplicationView } from './MealApplication/saop-meal-application-view';\r\n\r\n\r\n\r\nexport function echo(): void {\r\n icSaopCore.echoTest(\"test\");\r\n}\r\n\r\n// export function checkCompatibility(): boolean {\r\n// return icSaopCore.checkCompatibility();\r\n// }\r\n\r\n// export function initClientLogModeValue():void {\r\n// icSaopCore.initClientLogModeValue();\r\n// }\r\n\r\n// export function initSiteBaseUrlValue():void {\r\n// icSaopCore.initSiteBaseUrlValue();\r\n// }\r\n\r\n// export function initializeSiteJS():void {\r\n// icSaopCore.initializeSiteJS();\r\n// }\r\n\r\n// export function setFirstControlToFocus(formId: string):void {\r\n// icSaopCore.setFirstControlToFocus(formId);\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 initializeDebugMode() {\r\n global.ConsoleLogDegug(\"initializeDebugMode\");\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\r\nexport class SaopInputMaskEx extends SaopInputMask { };\r\n\r\nexport class SaopSettingsViewEx extends SaopSettingsView { };\r\n\r\nexport class SaopChangePwdViewEx extends SaopChangePwdView { };\r\n\r\nexport class SaopViewSpinnerEX extends SaopViewSpinner { };\r\n\r\nexport class SaopMealApplicationViewEx extends SaopMealApplicationView { };\r\n\r\n\r\n\r\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJUeXBlU2NyaXB0cy9BY2NvdW50L3Nhb3AtY2hhbmdlLXB3ZC12aWV3LnRzIiwiVHlwZVNjcmlwdHMvQ29tbW9uL3Nhb3AtY29tbW9uLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWZsb2F0aW5nLWxhYmVsLnRzIiwiVHlwZVNjcmlwdHMvQ29tcG9uZW50cy9zYW9wLWlucHV0bWFzay50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZy50cyIsIlR5cGVTY3JpcHRzL0NvbXBvbmVudHMvc2FvcC12aWV3LXNwaW5uZXIudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3Atc2VydmljZXMtY29yZS50cyIsIlR5cGVTY3JpcHRzL0NvcmUvc2FvcC10cmFuc2xhdGUudHMiLCJUeXBlU2NyaXB0cy9Db3JlL3Nhb3Atdmlldy1mb3JtLnRzIiwiVHlwZVNjcmlwdHMvTWVhbEFwcGxpY2F0aW9uL3Nhb3AtbWVhbC1hcHBsaWNhdGlvbi1iZW5lZmljaWFyeS12aWV3LnRzIiwiVHlwZVNjcmlwdHMvTWVhbEFwcGxpY2F0aW9uL3Nhb3AtbWVhbC1hcHBsaWNhdGlvbi1mb3JtLXZpZXcudHMiLCJUeXBlU2NyaXB0cy9NZWFsQXBwbGljYXRpb24vc2FvcC1tZWFsLWFwcGxpY2F0aW9uLWxpc3Qtdmlldy50cyIsIlR5cGVTY3JpcHRzL01lYWxBcHBsaWNhdGlvbi9zYW9wLW1lYWwtYXBwbGljYXRpb24tcHJldmlldy12aWV3LnRzIiwiVHlwZVNjcmlwdHMvTWVhbEFwcGxpY2F0aW9uL3Nhb3AtbWVhbC1hcHBsaWNhdGlvbi12aWV3LnRzIiwiVHlwZVNjcmlwdHMvU2V0dGluZ3Mvc2FvcC1zZXR0aW5ncy12aWV3LnRzIiwiVHlwZVNjcmlwdHMvbWFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQztBQUNEO0FBQ0E7Ozs7Ozs7OztJQWtCYSxp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b0JBQWhCLEdBQW9DO0FBQ2hDLGtCQUFBLE1BQUEsQ0FBTyxXQUFQLEdBQXFCLGNBQUEsTUFBQSxDQUFPLGNBQVAsRUFBckI7QUFDSDtBQUZELFFBQUEsb0JBQUEsR0FBQSxvQkFBQTtBQUlBLFNBQWdCLG1CQUFoQixHQUFtQztBQUMvQixrQkFBQSxNQUFBLENBQU8sZUFBUCxDQUF1QixxQkFBdkI7QUFFQSxhQUFTLGdCQUFULENBQTBCLFNBQTFCLEVBQXFDLFVBQVUsQ0FBVixFQUFXO0FBQzVDLFlBQUksRUFBRSxPQUFGLElBQWEsRUFBRSxNQUFmLElBQXlCLEVBQUUsT0FBRixJQUFhLEVBQTFDLEVBQThDO0FBQzFDO0FBQ0EsMEJBQUEsTUFBQSxDQUFPLDRCQUFQO0FBQ0EsMEJBQUEsTUFBQSxDQUFPLFNBQVAsR0FBbUIsY0FBQSxNQUFBLENBQU8sNEJBQVAsRUFBbkI7QUFDSDtBQUNKLEtBTkQ7QUFPSDtBQVZELFFBQUEsbUJBQUEsR0FBQSxtQkFBQTs7SUFZYSxlOzs7Ozs7Ozs7O0VBQXdCLGlCQUFBLGE7O0FBQXJDLFFBQUEsZUFBQSxHQUFBLGVBQUE7QUFBc0Q7O0lBRXpDLGtCOzs7Ozs7Ozs7O0VBQTJCLHFCQUFBLGdCOztBQUF4QyxRQUFBLGtCQUFBLEdBQUEsa0JBQUE7QUFBNEQ7O0lBRS9DLG1COzs7Ozs7Ozs7O0VBQTRCLHVCQUFBLGlCOztBQUF6QyxRQUFBLG1CQUFBLEdBQUEsbUJBQUE7QUFBOEQ7O0lBRWpELGlCOzs7Ozs7Ozs7O0VBQTBCLG9CQUFBLGU7O0FBQXZDLFFBQUEsaUJBQUEsR0FBQSxpQkFBQTtBQUEwRDs7SUFFN0MseUI7Ozs7Ozs7Ozs7RUFBa0MsNkJBQUEsdUI7O0FBQS9DLFFBQUEseUJBQUEsR0FBQSx5QkFBQTtBQUEwRSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvc2FvcF9jb3JlL3Nhb3BDb21tb25TZXJ2aWNlcy5kLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9zYW9wX2NvcmUvc2FvcENvcmVTZXJ2aWNlcy5kLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0B0eXBlcy9zYW9wX2NvcmUvc2FvcFRyYW5zbGF0aW9uc1NlcnZpY2VzLmQudHNcIiAvPlxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFBhc3N3b3JkQ3JpdGVyaWFzIHtcclxuICAgIHB3ZENoZWNrOmJvb2xlYW47XHJcbiAgICBwd2RMZW5ndGhDaGVjazpib29sZWFuO1xyXG4gICAgcHdkTGVuZ3RoU2V0dGluZzpudW1iZXI7XHJcbiAgICBwd2RDb21wbGV4aXR5Q2hlY2sgOmJvb2xlYW47XHJcbiAgICBwd2RNaW5MZW5ndGggOmJvb2xlYW47XHJcbiAgICBwd2RDb250YWluc1VwcGVyQ2FzZSA6Ym9vbGVhbjtcclxuICAgIHB3ZENvbnRhaW5zTG93ZXJDYXNlIDpib29sZWFuO1xyXG4gICAgcHdkQ29udGFpbnNOdW1iZXJzIDpib29sZWFuO1xyXG4gICAgcHdkQ29udGFpbnNTcGVjaWFsQ2hhcnMgOmJvb2xlYW47XHJcbiAgICBwd2ROb3RDb250YWluc1VzZXJEYXRhIDpib29sZWFuO1xyXG4gICAgcHdkSGlzdG9yeUNoZWNrOmJvb2xlYW47XHJcbiAgICBwd2ROb3RVc2VkWWV0IDpib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcENoYW5nZVB3ZFZpZXcge1xyXG4gICAgLy9cclxuICAgIHByaXZhdGUgX3RyYW5zbGF0aW9uU2VydmljZTogaWNTYW9wQ29yZS5TYW9wVHJhbnNsYXRpb25TZXJ2aWNlRXg7XHJcbiAgICBwcml2YXRlIF9jaGFuZ2VQYXNzd29yZEZvcm0gOkpRdWVyeTxIVE1MRWxlbWVudD47IFxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5fY2hhbmdlUGFzc3dvcmRGb3JtID0gJCh2aWV3SWQpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBpY1Nhb3BDb3JlLlNhb3BUcmFuc2xhdGlvblNlcnZpY2VFeChudWxsKTtcclxuICAgICAgICB0aGlzLnNldFRlcm1pbm9sb2d5TGlzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRlcm1pbm9sb2d5TGlzdCgpe1xyXG4gICAgICAgIGxldCBfdGVybWlub2xvZ3k6IHN0cmluZ1tdID0gWyd2c2FqIHswfSB6bmFrb3YnXTtcclxuICAgICAgICB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdChfdGVybWlub2xvZ3kpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGljU2FvcENvcmUuZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BDaGFuZ2VQd2RWaWV3LmluaXRWaWV3XCIpO1xyXG5cclxuICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKCk7ICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5jaGVja1Bhc3N3b3JkU3RyZW5ndGgoKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kVmlld0V2ZW50cygpe1xyXG4gICAgICAgIGljU2FvcENvcmUuZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BDaGFuZ2VQd2RWaWV3LmJpbmRHcmlkRXZlbnRzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy9cclxuICAgICAgICBsZXQgX05ld1Bhc3N3b3JkID0gdGhpcy5fY2hhbmdlUGFzc3dvcmRGb3JtLmZpbmQoXCIjTmV3UGFzc3dvcmRcIik7XHJcbiAgICAgICAgX05ld1Bhc3N3b3JkLm9mZihcImNoYW5nZVwiKTtcclxuICAgICAgICBfTmV3UGFzc3dvcmQub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgX3RoaXMuY2hlY2tQYXNzd29yZFN0cmVuZ3RoKCk7XHJcbiAgICAgICAgfSk7ICAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZnNldFB3ZENsYXNzKGNvbmRpdGlvbjpib29sZWFuLCBkaXZJZDpzdHJpbmcpOnZvaWQge1xyXG4gICAgICAgIGxldCBva1N0YXR1c0NzcyA9IFwibGVmdCBzYW9wLWNsLWdyZWVuIHNhb3AtaW1nLWNoZWNrLW1hcmstc29saWQgc2ktc1wiO1xyXG4gICAgICAgIGxldCB3YXJyaW5nU3RhdHVzQ3NzID0gXCJsZWZ0IHNhb3AtY2wtcmVkIHNhb3AtaW1nLWNsb3NlLXNvbGlkIHNpLXNcIjsgICAgICAgIFxyXG4gICAgICAgIGxldCBfdGFyZ2V0RGl2ID0gdGhpcy5fY2hhbmdlUGFzc3dvcmRGb3JtLmZpbmQoZGl2SWQpO1xyXG5cclxuICAgICAgICBfdGFyZ2V0RGl2LnJlbW92ZUF0dHIoIFwiY2xhc3NcIiApO1xyXG4gICAgICAgIC8vIF90YXJnZXREaXYucmVtb3ZlQ2xhc3MoZnVuY3Rpb24oKXtcclxuICAgICAgICAvLyAgICAgcmV0dXJuICQodGhpcykuYXR0ciggXCJjbGFzc1wiICk7XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIGlmIChjb25kaXRpb24gPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBfdGFyZ2V0RGl2LmFkZENsYXNzKG9rU3RhdHVzQ3NzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfdGFyZ2V0RGl2LmFkZENsYXNzKHdhcnJpbmdTdGF0dXNDc3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRQd2RDb21wbGV4aXR5RGl2VmFsKHNhb3BQYXNzd29yZENyaXRlcmlhczpTYW9wUGFzc3dvcmRDcml0ZXJpYXMpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5mc2V0UHdkQ2xhc3Moc2FvcFBhc3N3b3JkQ3JpdGVyaWFzLnB3ZE1pbkxlbmd0aCxcIiNwd2RNaW5MZW5ndGhcIik7XHJcbiAgICAgICAgdGhpcy5mc2V0UHdkQ2xhc3Moc2FvcFBhc3N3b3JkQ3JpdGVyaWFzLnB3ZENvbnRhaW5zVXBwZXJDYXNlLFwiI3B3ZENvbnRhaW5zVXBwZXJDYXNlXCIpO1xyXG4gICAgICAgIHRoaXMuZnNldFB3ZENsYXNzKHNhb3BQYXNzd29yZENyaXRlcmlhcy5wd2RDb250YWluc0xvd2VyQ2FzZSxcIiNwd2RDb250YWluc0xvd2VyQ2FzZVwiKTtcclxuICAgICAgICB0aGlzLmZzZXRQd2RDbGFzcyhzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkQ29udGFpbnNOdW1iZXJzLFwiI3B3ZENvbnRhaW5zTnVtYmVyc1wiKTtcclxuICAgICAgICB0aGlzLmZzZXRQd2RDbGFzcyhzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkQ29udGFpbnNTcGVjaWFsQ2hhcnMsXCIjcHdkQ29udGFpbnNTcGVjaWFsQ2hhcnNcIik7XHJcbiAgICAgICAgdGhpcy5mc2V0UHdkQ2xhc3Moc2FvcFBhc3N3b3JkQ3JpdGVyaWFzLnB3ZE5vdENvbnRhaW5zVXNlckRhdGEsXCIjcHdkTm90Q29udGFpbnNVc2VyRGF0YVwiKTtcclxuICAgICAgICB0aGlzLmZzZXRQd2RDbGFzcyhzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkTm90VXNlZFlldCxcIiNwd2ROb3RVc2VkWWV0XCIpO1xyXG4gICAgICAgIC8vXHJcblxyXG4gICAgICAgIGxldCBfcHdkQ2hlY2tEaXYgPSB0aGlzLl9jaGFuZ2VQYXNzd29yZEZvcm0uZmluZChcIiNwd2RDaGVja1wiKTtcclxuICAgICAgICBpZiAoX3B3ZENoZWNrRGl2Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHNhb3BQYXNzd29yZENyaXRlcmlhcy5wd2RDaGVjayA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICBfcHdkQ2hlY2tEaXYucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBfcHdkSGlzdG9yeUNoZWNrRGl2ID0gdGhpcy5fY2hhbmdlUGFzc3dvcmRGb3JtLmZpbmQoXCIjcHdkSGlzdG9yeUNoZWNrXCIpO1xyXG4gICAgICAgIGlmIChfcHdkSGlzdG9yeUNoZWNrRGl2Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHNhb3BQYXNzd29yZENyaXRlcmlhcy5wd2RIaXN0b3J5Q2hlY2sgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgX3B3ZEhpc3RvcnlDaGVja0Rpdi5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IF9wd2RDb21wbGV4aXR5RGl2ID0gdGhpcy5fY2hhbmdlUGFzc3dvcmRGb3JtLmZpbmQoXCIjcHdkQ29tcGxleGl0eVwiKTtcclxuICAgICAgICBpZiAoX3B3ZENvbXBsZXhpdHlEaXYubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoc2FvcFBhc3N3b3JkQ3JpdGVyaWFzLnB3ZENvbXBsZXhpdHlDaGVjayA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICBfcHdkQ29tcGxleGl0eURpdi5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IF9wd2RMZW5ndGhDaGVja0RpdiA9IHRoaXMuX2NoYW5nZVBhc3N3b3JkRm9ybS5maW5kKFwiI3B3ZExlbmd0aENoZWNrXCIpO1xyXG4gICAgICAgIGlmIChfcHdkTGVuZ3RoQ2hlY2tEaXYubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgX3B3ZExlbmd0aFNldHRpbmdEaXYgPSB0aGlzLl9jaGFuZ2VQYXNzd29yZEZvcm0uZmluZChcIiNwd2RMZW5ndGhTZXR0aW5nXCIpO1xyXG4gICAgICAgICAgICBpZiAoc2FvcFBhc3N3b3JkQ3JpdGVyaWFzLnB3ZExlbmd0aENoZWNrID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIF9wd2RMZW5ndGhDaGVja0Rpdi5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBfcHdkTGVuZ3RoU2V0dGluZ0NhcHRpb24gPSB0aGlzLl90cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwidnNhaiB7MH0gem5ha292XCIpLnJlcGxhY2UoXCJ7MH1cIixzYW9wUGFzc3dvcmRDcml0ZXJpYXMucHdkTGVuZ3RoU2V0dGluZy50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIF9wd2RMZW5ndGhTZXR0aW5nRGl2Lmh0bWwoX3B3ZExlbmd0aFNldHRpbmdDYXB0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGVja1Bhc3N3b3JkU3RyZW5ndGgoKTp2b2lke1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IF9uZXdQYXNzd29yZCA9IHRoaXMuX2NoYW5nZVBhc3N3b3JkRm9ybS5maW5kKFwiI05ld1Bhc3N3b3JkXCIpO1xyXG4gICAgICAgIGxldCBfcGFzc3dvcmQgPSBfbmV3UGFzc3dvcmQudmFsKCk7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0ge3Bhc3N3b3JkOiBfcGFzc3dvcmR9O1xyXG5cclxuICAgICAgICBsZXQgX3Nhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgaWNTYW9wQ29yZS5TYW9wU2VydmljZXNDb3JlRXgoKTsgXHJcbiAgICAgICAgX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzID0gZnVuY3Rpb24gKHJlc3BvbnNlOmljU2FvcENvcmUuU2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgbGV0IF9zYW9wUGFzc3dvcmRDcml0ZXJpYXMgPSByZXNwb25zZS5kYXRhIGFzIFNhb3BQYXNzd29yZENyaXRlcmlhcztcclxuICAgICAgICAgICBfdGhpcy5zZXRQd2RDb21wbGV4aXR5RGl2VmFsKF9zYW9wUGFzc3dvcmRDcml0ZXJpYXMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJTZXR0aW5ncy9DaGVja1Bhc3N3b3JkU3RyZW5ndGhcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IGRhdGFcclxuICAgICAgICAgICAgLCB0eXBlOiBcIlBPU1RcIlxyXG4gICAgICAgIH0pOyBcclxuICAgIH1cclxuICAgIC8vXHJcbn1cclxuXHJcblxyXG4iLCLvu79cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIGdsb2JhbCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRlYnVnTW9kZTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBzdGF0aWMgc2l0ZUJhc2VVcmw6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbnNvbGVMb2dEZWd1ZyhtZXNzYWdlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z01vZGUpIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VLZXlWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcIlNhb3BNb2pJbmZvLmdsb2JhbENsaWVudExvZ01vZGVWYWxcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGRlYnVnTW9kZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YXIgZGVidWdNb2RlU3RyaW5nVmFsID0gUmVhZFZhcmlhYmxlRnJvbVN0b3JhZ2UoZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlS2V5VmFsdWUoKSk7XHJcblxyXG4gICAgICAgIGxldCBkZWJ1Z01vZGVWYWwgPSBkZWJ1Z01vZGVEZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgaWYgKGRlYnVnTW9kZVN0cmluZ1ZhbCkge1xyXG4gICAgICAgICAgICBkZWJ1Z01vZGVWYWwgPSBkZWJ1Z01vZGVTdHJpbmdWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRlYnVnTW9kZVZhbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGxvZ01vZGUgPSB0aGlzLkdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxuICAgICAgICBXcml0ZVZhcmlhYmxlVG9TdG9yYWdlKGdsb2JhbC5HZXRDbGllbnRMb2dNb2RlU3RvcmFnZUtleVZhbHVlKCksICFsb2dNb2RlKTtcclxuXHJcbiAgICAgICAgYWxlcnRpZnkubWVzc2FnZShcIkNsaWVudCBsb2cgbW9kZSBlbmFibGVkOiBcIiArICFsb2dNb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFNpdGVCYXNlVXJsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICQoXCIjc2l0ZUJhc2VVcmxcIikudmFsKCkgYXMgc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0SGVscExpbmsoKTogdm9pZCB7XHJcbiAgICAgICAgLy9uYXN0YXZpIGhlbHAgbGluaywgdiBvZHZpc25vc3RpIG9kIGxva2FsaXphY2lqZVxyXG4gICAgICAgIGxldCBzdmdIZWxwOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2FvcC1oZWxwJyk7XHJcblxyXG4gICAgICAgIGlmKHN2Z0hlbHAgIT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZSA9IHN2Z0hlbHAuZ2V0QXR0cmlidXRlKFwiZGF0YS1sYW5ndWFnZVwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vcG/EjWFrYW1vIGRhIHNlIGduZXN6ZGVuaSBvYmpla3QgbmFsb8W+aVxyXG4gICAgICAgICAgICBzdmdIZWxwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdmdIZWxwLmNvbnRlbnREb2N1bWVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN2Z0hlbHBMaW5rID0gc3ZnSGVscC5jb250ZW50RG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYW9wLWhlbHAtbGlua1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNVbkRlZmluZWQoc3ZnSGVscExpbmspID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZSA9PSBcImhyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Z0hlbHBMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgXCJodHRwOi8vaGVscC5zYW9wLmhyL2hyL21vamluZm9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFuZ3VhZ2UgPT0gXCJzclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmdIZWxwTGluay5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIFwiaHR0cDovL3d3dy5zYW9wLnJzL2ljZW50ZXIvMTAwL3VwdXRzdHZhLXphLXVwb3RyZWJ1L1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Z0hlbHBMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgXCJodHRwczovL3NpLWljZW50ZXIua25vd2xlZGdlb3dsLmNvbS9oZWxwL21vamluZm8tbmF2b2RpbGEtemEtdXBvcmFiby1wcmVub3ZsamVuZWdhLXBvcnRhbGFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy96YXJhZGkgYnJhc2thbG5payAtIG1vemlsbGEgZmlyZWZveCAtIGl6Z2xlZGEsIGRhIGplIG9iamVjdCAnJ2xvYWRlZCcnIHByZWRlbiBtdSBkb2RhbW8gb24gbG9hZGVkXHJcbiAgICAgICAgICAgIGlmKCQoJyNzYW9wLWhlbHAtbGluaycpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdsb2FkJyk7XHJcbiAgICAgICAgICAgICAgICBzdmdIZWxwLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0bzIgPSAobjogbnVtYmVyKTogc3RyaW5nID0+ICgoTWF0aC5hYnMobikgPCAxMCA/ICcwJyA6ICcnKSArIE1hdGguYWJzKG4pKTtcclxuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgvW3lkbWhdKy9naSwgKG1hdGNoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcclxuICAgICAgICAgICAgY2FzZSAneXl5eSc6IHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgY2FzZSAnZCc6IHJldHVybiBkYXRlLmdldERhdGUoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjYXNlICdkZCc6IHJldHVybiB0bzIoZGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdtJzogcmV0dXJuIChkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjYXNlICdtbSc6IHJldHVybiB0bzIoZGF0ZS5nZXRNb250aCgpICsgMSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ0gnOiByZXR1cm4gZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGNhc2UgJ0hIJzogcmV0dXJuIHRvMihkYXRlLmdldEhvdXJzKCkpO1xyXG4gICAgICAgICAgICBjYXNlICdNTSc6IHJldHVybiB0bzIoZGF0ZS5nZXRNaW51dGVzKCkpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFN0cmluZzJEYXRlKHN0cmluZ0RhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpOiBEYXRlIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjb252ZXJ0U3RyaW5nMkRhdGVcIik7XHJcblxyXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcclxuICAgICAgICBjYXNlIFwiZGQubW0ueXl5eVwiOlxyXG4gICAgICAgICAgICBsZXQgZGF5ID0gc3RyaW5nRGF0ZS5zdWJzdHJpbmcoMCwgMik7XHJcbiAgICAgICAgICAgIGxldCBtb250aCA9IHN0cmluZ0RhdGUuc3Vic3RyaW5nKDMsIDUpO1xyXG4gICAgICAgICAgICBsZXQgeWVhciA9IHN0cmluZ0RhdGUuc3Vic3RyaW5nKDYsIDEwKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgreWVhciwgK21vbnRoIC0gMSwgK2RheSk7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0TW9kYWxGb3JtWkluZGV4KG1vZGFsRm9ybUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzZXRNb2RhbEZvcm1aSW5kZXhcIik7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibW9kYWxGb3JtSWQ6XCIgKyBtb2RhbEZvcm1JZCk7XHJcbiAgICB2YXIgekluZGV4ID0gMTA1MCArICgxMCAqICQoJy5tb2RhbDp2aXNpYmxlJykubGVuZ3RoKTtcclxuXHJcbiAgICAkKG1vZGFsRm9ybUlkKS5jc3MoJ3otaW5kZXgnLCB6SW5kZXgpO1xyXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJCgnLm1vZGFsLWJhY2tkcm9wJykubm90KCcubW9kYWwtc3RhY2snKS5jc3MoJ3otaW5kZXgnLCB6SW5kZXggLSAxKS5hZGRDbGFzcygnbW9kYWwtc3RhY2snKTtcclxuICAgIH0sIDApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShzdHI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuICghc3RyIHx8IHN0ci5sZW5ndGggPT09IDApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNVbkRlZmluZWQoX29iajogYW55KSB7XHJcbiAgICByZXR1cm4gKCFfb2JqIHx8IF9vYmogPT09IG51bGwgfHwgdHlwZW9mIF9vYmogPT09IFwidW5kZWZpbmVkXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RTZXQoX29iajogYW55KSB7XHJcbiAgICByZXR1cm4gKF9vYmogPT09IG51bGwgfHwgdHlwZW9mIF9vYmogPT09IFwidW5kZWZpbmVkXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmVhZFZhcmlhYmxlRnJvbVN0b3JhZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHZhcmlhYmxlTmFtZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBXcml0ZVZhcmlhYmxlVG9TdG9yYWdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh2YXJpYWJsZU5hbWUsIHZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclRhYmxlUm93cyhmaWx0ZXJWYWw6IHN0cmluZywgaWRUYWJsZUVsZW1lbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImZpbHRlclRhYmxlUm93c1wiKTtcclxuXHJcbiAgICBsZXQgdmFsID0gJC50cmltKGZpbHRlclZhbCkucmVwbGFjZSgvICsvZywgJyAnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgbGV0IHJvd3MgPSAkKGlkVGFibGVFbGVtZW50ICsgXCIgdHI6aGFzKHRkKVwiKTtcclxuXHJcbiAgICByb3dzLnNob3coKS5maWx0ZXIoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGV4dCA9ICQodGhpcykudGV4dCgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiAhfl90ZXh0LmluZGV4T2YodmFsKTtcclxuICAgIH0pLmhpZGUoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpcnN0Rm9ybUNvbnRyb2xUb0ZvY3VzKGZvcm1JZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXNcIik7XHJcblxyXG4gICAgLy8gYnJleiB0aW1lb3V0IGZ1bmtjaWplIGZvY3VzIG5lIGRlbGEgOihcclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBmaXJzdEZvcm1Db250cm9sID0gJChmb3JtSWQgKyBcIiAuZm9ybS1jb250cm9sOnZpc2libGU6bm90KDpkaXNhYmxlZCk6Zmlyc3RcIik7XHJcbiAgICAgICAgaWYgKGZpcnN0Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgZmlyc3RGb3JtQ29udHJvbC5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIDUwMCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWxhdGl2ZVNpdGVVUkwoY29udHJvbGxlcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBfdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICBsZXQgaUMgPSBfdXJsLmluZGV4T2YoY29udHJvbGxlcik7XHJcbiAgICBpZiAoaUMgPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIF91cmwuc3Vic3RyaW5nKDAsIGlDKSArIGNvbnRyb2xsZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpdGVBYnNvbHV0ZVVSTChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29udHJvbGxlciA9IHJlbGF0aXZlUGF0aC5zcGxpdChcIi9cIilbMF07XHJcbiAgICBsZXQgbWV0aG9kID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoY29udHJvbGxlciwgXCJcIikucmVwbGFjZShcIi8vXCIsIFwiXCIpO1xyXG5cclxuICAgIC8vIMSNZSByZWxhdGl2ZSBwYXRoIMW+ZSB2c2VidWplIGh0dHAsIGdhIG5lIGRvZGFtb1xyXG4gICAgaWYgKHJlbGF0aXZlUGF0aC5pbmRleE9mKFwiaHR0cFwiKSA+PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ2xvYmFsLnNpdGVCYXNlVXJsICsgXCIvXCIgKyBjb250cm9sbGVyICsgbWV0aG9kO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVsb2RlQ3VycmVudFBhZ2UoKTogdm9pZCB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbn0iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcEZsb2F0aW5nTGFiZWwge1xyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9mZihcImZvY3VzXCIsX3RoaXMuc2FvcElucHV0T25Gb2N1cyk7XHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vbihcImZvY3VzXCIsX3RoaXMuc2FvcElucHV0T25Gb2N1cyk7XHJcblxyXG4gICAgICAgICQoJy5oYXMtZmxvYXQtbGFiZWwgPiAuZm9ybS1jb250cm9sJykub2ZmKFwiYmx1clwiLF90aGlzLnNhb3BJbnB1dE9uQmx1cik7XHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vbihcImJsdXJcIixfdGhpcy5zYW9wSW5wdXRPbkJsdXIpO1xyXG4gICAgXHJcbiAgICAgICAgJCgnLmhhcy1mbG9hdC1sYWJlbCA+IC5mb3JtLWNvbnRyb2wnKS5vZmYoXCJmb2N1c291dFwiLF90aGlzLnNhb3BJbnB1dE9uQ2hhbmdlKTtcclxuICAgICAgICAkKCcuaGFzLWZsb2F0LWxhYmVsID4gLmZvcm0tY29udHJvbCcpLm9uKFwiZm9jdXNvdXRcIixfdGhpcy5zYW9wSW5wdXRPbkNoYW5nZSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHNhb3BJbnB1dE9uQ2hhbmdlKGU6YW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3AtZmxvYXRpbmctbGFiZWwuLi5zYW9wSW5wdXRPbkNoYW5nZVwiKTtcclxuICAgICAgICBsZXQgaHRtbEVsZW1lbnQgPSBlLnRhcmdldDtcclxuICAgICAgICBsZXQgX25vZGUgPSAkKFwiI1wiK2h0bWxFbGVtZW50LmlkKTtcclxuICAgICAgICBpZiAoX25vZGUubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGxldCBfcGFyZW50TiA9IF9ub2RlLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoX3BhcmVudE4ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICBfcGFyZW50Ti5yZW1vdmVDbGFzcyhcInNhb3AtZXJyb3ItaW5wdXRcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgX2xhYmVsID0gX3BhcmVudE4uZmluZChcIi50ZXh0LWRhbmdlclwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChfbGFiZWwubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgX2xhYmVsLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSAgICBcclxuXHJcbiAgICBzYW9wSW5wdXRPbkZvY3VzKGU6YW55KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNhb3AtZmxvYXRpbmctbGFiZWwuLi5cIik7XHJcbiAgICAgICAgLy9iYXJ2YW5qZSBcImZsb2F0aW5nIGxhYmVsXCJcclxuICAgICAgICBsZXQgaHRtbEVsZW1lbnQgPSBlLnRhcmdldDtcclxuICAgICAgICBodG1sRWxlbWVudC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zYW9wLWZsb2F0aW5nLWxhYmVsJykuY2xhc3NMaXN0LmFkZChcInNhb3AtdHh0LXByaW1hcnlcIik7XHJcbiAgICB9XHJcbiAgICAgICAgXHJcbiAgICBzYW9wSW5wdXRPbkJsdXIoZTphbnkpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2FvcC1mbG9hdGluZy1sYWJlbC4uLlwiKTtcclxuICAgICAgICAvL2JhcnZhbmplIFwiZmxvYXRpbmcgbGFiZWxcIiBvbiBpbnB1dCBibHVyIChmb2N1cyBsb3N0KSBuYXphaiB2IHNpdm8gKHJlbW92ZSByYXpyZWQgXCJzYW9wLXR4dC1wcmltYXJ5XCIpXHJcbiAgICAgICAgbGV0IGh0bWxFbGVtZW50ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2FvcC1mbG9hdGluZy1sYWJlbCcpLmNsYXNzTGlzdC5yZW1vdmUoXCJzYW9wLXR4dC1wcmltYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzZXRDYXB0aW9uQXNSZXF1aXJlZChsYWJlbElkOnN0cmluZyxyZXF1aXJlZDpib29sZWFuKTp2b2lke1xyXG4gICAgICAgIGxldCBfZWxlbWVudCA9ICQobGFiZWxJZCk7XHJcbiAgICAgICAgbGV0IF9lbGVtZW50VmFsID0gX2VsZW1lbnQudGV4dCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgX2VsZW1lbnRWYWwgPSBfZWxlbWVudFZhbC5yZXBsYWNlKFwiKlwiLFwiXCIpO1xyXG4gICAgICAgIGlmIChyZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBfZWxlbWVudC50ZXh0KF9lbGVtZW50VmFsK1wiKlwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfZWxlbWVudC50ZXh0KF9lbGVtZW50VmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9ICBcclxuXHJcbiAgICBzZXRWYWxpZGF0aW9uRXJyb3JCeUlkKGxhYmVsSWQ6c3RyaW5nLCB2YWxNZXNzYWdlOnN0cmluZyk6dm9pZHtcclxuICAgICAgICBsZXQgX2lucHV0RWxlbWVudCA9ICQobGFiZWxJZClbMF0gYXMgSFRNTElucHV0RWxlbWVudDsgLy9pbnB1dFxyXG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkVycm9yKF9pbnB1dEVsZW1lbnQsIHZhbE1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFZhbGlkYXRpb25FcnJvcihpbnB1dEVsZW1lbnQ6SFRNTElucHV0RWxlbWVudCwgdmFsTWVzc2FnZTpzdHJpbmcpOnZvaWR7XHJcbiAgICAgICAgbGV0IF9pbnB1dEVsZW1lbnQgPSAkKGlucHV0RWxlbWVudCk7XHJcbiAgICAgICAgbGV0IF9zcGFuRWxlbWVudCA9IF9pbnB1dEVsZW1lbnQucGFyZW50KCk7IC8vaGFzLWZsb2F0LWxhYmVsXHJcbiAgICAgICAgaWYgKF9zcGFuRWxlbWVudC5oYXNDbGFzcyhcInNhb3AtZXJyb3ItaW5wdXRcIikgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgbGV0IF9wbGFjZWhvbGRlciA9IF9pbnB1dEVsZW1lbnQuYXR0cihcInBsYWNlaG9sZGVyXCIpO1xyXG4gICAgICAgICAgICBfc3BhbkVsZW1lbnQuYWRkQ2xhc3MoXCJzYW9wLWVycm9yLWlucHV0XCIpO1xyXG4gICAgICAgICAgICBpZiAoX2lucHV0RWxlbWVudC5oYXNDbGFzcyhcImlucHV0LXZhbGlkYXRpb24tZXJyb3JcIikgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIF9pbnB1dEVsZW1lbnQuYWRkQ2xhc3MoXCJpbnB1dC12YWxpZGF0aW9uLWVycm9yXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBfbWVzc2FnZSA9IHZhbE1lc3NhZ2UucmVwbGFjZShcInswfVwiLF9wbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICAgIF9zcGFuRWxlbWVudC5hcHBlbmQoJzxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlciBzYW9wLXR4dC03XCI+JytfbWVzc2FnZSsnPC9kaXY+Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1xyXG59Iiwi77u/XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2luZGV4LmQudHNcIiAvPlxyXG5pbXBvcnQgeyBjb252ZXJ0U3RyaW5nMkRhdGUsIGdsb2JhbCxpc0VtcHR5IH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BJbnB1dE1hc2sge1xyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BJbnB1dE1hc2suaW5pdC4uLlwiKTtcclxuICAgICAgICB2YXIgaW5wdXREaXZzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ2lucHV0W2RhdGEtaW5wdXRtYXNrLWFsaWFzXScpO1xyXG4gICAgICAgIElucHV0bWFzaygpLm1hc2soaW5wdXREaXZzKTtcclxuXHJcbiAgICAgICAgJChcIi5zYW9wLWRlY2ltYWwtMlwiKS5pbnB1dG1hc2soe1xyXG4gICAgICAgICAgICAnYWxpYXMnOiAnZGVjaW1hbCcsXHJcbiAgICAgICAgICAgICdyYWRpeFBvaW50JzogJywnLFxyXG4gICAgICAgICAgICAnZGlnaXRzJzogMixcclxuICAgICAgICAgICAgJ2RpZ2l0c09wdGlvbmFsJzogZmFsc2UsXHJcbiAgICAgICAgICAgICdwbGFjZWhvbGRlcic6ICcwLDAwJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiLnNhb3AtZGVjaW1hbC0zXCIpLmlucHV0bWFzayh7XHJcbiAgICAgICAgICAgICdhbGlhcyc6ICdkZWNpbWFsJyxcclxuICAgICAgICAgICAgJ3JhZGl4UG9pbnQnOiAnLCcsXHJcbiAgICAgICAgICAgICdkaWdpdHMnOiAzLFxyXG4gICAgICAgICAgICAnZGlnaXRzT3B0aW9uYWwnOiBmYWxzZSxcclxuICAgICAgICAgICAgJ3BsYWNlaG9sZGVyJzogJzAsMDAwJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpbnB1dERpdnMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVsZW1lbnQuaW5pdC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cIiArIGVsZW1lbnQuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgbGV0IHNwYW5EaXY6YW55O1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudEF0cnIgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWlucHV0bWFzay1hbGlhc1wiKTtcclxuICAgICAgICAgICAgaWYgKGlzRW1wdHkoZWxlbWVudEF0cnIpKSB7cmV0dXJuO307XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoZWxlbWVudEF0cnIpO1xyXG4gICAgICAgICAgICBzcGFuRGl2ID0gJChlbGVtZW50KS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgaWYgKHNwYW5EaXYgPT09IG51bGwpIHsgcmV0dXJuO307XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2Lmhhc0NsYXNzKFwiaGFzLWZsb2F0LWxhYmVsXCIpPT09ZmFsc2UpIHsgcmV0dXJuO307XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoc3BhbkRpdi5nZXQoMCkuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxhbmd1YWdlQXRyciA9IChTdHJpbmcpKCQoXCIjc2l0ZUxhbmd1YWdlXCIpLnZhbCgpKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxhbmd1YWdlOlwiK2xhbmd1YWdlQXRycik7XHJcbiAgICAgICAgICAgIGxhbmd1YWdlQXRyciA9IGlzRW1wdHkobGFuZ3VhZ2VBdHJyKSA/IFwic2xcIiA6bGFuZ3VhZ2VBdHJyO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibGFuZ3VhZ2U6XCIrbGFuZ3VhZ2VBdHJyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50QXRyciA9PT0gXCJoaDptbTpzc1wiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkJ0biA9ICQoc3BhbkRpdikuZmluZChcIiN0aW1lSWNvblwiKTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjbG9jay4uLlwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2suZm9jdXMuaW5pdDpcIiArIGVsZW1lbnQuaWQpO1xyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5mb2N1cyhmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxsLmNsb2NrLmZvY3VzOlwiICsgZXZlbnQudGFyZ2V0LmlkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2UgamUgYmlsIGZva3VzaXJhbiB6IHRhYiwgZGFtbyBtYWxpIHRpbWVvdXQsIGtlciBkcnVnYWNlIG5lIGRlbGFcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZU91dCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLndhc1RhYlByZXNzZWQoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQgPSAyMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0Q3RybDogSFRNTElucHV0RWxlbWVudCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5wdXRTZWxlY3RBbGxUZXh0KGlucHV0Q3RybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgdGltZU91dCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2suYmx1ci5pbml0OlwiICsgZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmJsdXIoZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsbC5jbG9jay5ibHVyOlwiICsgZXZlbnQudGFyZ2V0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udHJvbFZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sVmFsdWUuaW5jbHVkZXMoXCJoXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnJlcGxhY2UoXCJtbVwiLCBcIjAwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS5yZXBsYWNlKFwibVwiLCBcIjBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnJlcGxhY2UoXCJzc1wiLCBcIjAwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS5yZXBsYWNlKFwic1wiLCBcIjBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gY29udHJvbFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb3ppbW8gaW5wdXQgZXZlbiwga2VyIHNtbyB2cGlzYWxpIG5vdm8gdnJlZG5vc3QgXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBFdmVudChcImlucHV0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KGUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNsb2NrLmNsaWNrLmluaXQ6XCIgKyBlbGVtZW50LmlkKTtcclxuICAgICAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2xvY2tJY29uLmNsaWNrZWQ6XCIgKyBlbGVtZW50LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY3RybElucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY3RybElucHV0Q3RybC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eVwiXHJcbiAgICAgICAgICAgICAgICAvLyB8fCBlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5IGhoOm1tXCIgXHJcbiAgICAgICAgICAgICAgICAvLyB8fCBlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5IGhoOm1tOnNzXCJcclxuICAgICAgICAgICAgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjY2FsZW5kYXJJY29uXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLlwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKCQoZWxlbWVudCkuYXR0cihcImRhdGEtZW5hYmxlLXNlbGVjdC1wYXN0ZGF0ZXNcIikpLnRvTG93ZXJDYXNlKCkgPT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJTdGFydERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1taW4tc3RhcnQtZGF0ZVwiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlclN0YXJ0RGF0ZTEgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJTdGFydERhdGUgPSBjb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlclN0YXJ0RGF0ZTEsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZXBpY2tlckVuZERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJFbmREYXRlID0gJChlbGVtZW50KS5hdHRyKFwiZGF0YS1tYXgtZW5kLWRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSBjb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlckVuZERhdGUsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGVwaWNrZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogZGF0ZXBpY2tlclN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBkYXRlcGlja2VyRW5kRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBhdXRvY2xvc2U6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICB3ZWVrU3RhcnQ6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcImRkLm1tLnl5eXlcIixcclxuICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VBdHJyLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcImJvdHRvbSByaWdodFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dPbkZvY3VzOmZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgLy9mb3JjZVBhcnNlOmZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5mb2N1cyhmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLmZvY3VzOlwiICsgZXZlbnQudGFyZ2V0LmlkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2UgamUgYmlsIGZva3VzaXJhbiB6IHRhYiwgZGFtbyBtYWxpIHRpbWVvdXQsIGtlciBkcnVnYWNlIG5lIGRlbGFcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZU91dCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLndhc1RhYlByZXNzZWQoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQgPSAyMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0Q3RybDogSFRNTElucHV0RWxlbWVudCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5wdXRTZWxlY3RBbGxUZXh0KGlucHV0Q3RybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgdGltZU91dCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGljb25CdG4pLmNsaWNrKGZ1bmN0aW9uKClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5jbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9kYXRlcGlja2VySW5wdXRDdHJsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5kYXRlcGlja2VyKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5pbnB1dFNlbGVjdEFsbFRleHQoZGF0ZXBpY2tlcklucHV0Q3RybCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudEF0cnIgPT09IFwiZGQubW0ueXl5eSBoaDptbVwiKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGF0ZXRpbWVwaWNrZXIgaGg6bW0gLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpY29uQnRuID0gJChzcGFuRGl2KS5maW5kKFwiI2NhbGVuZGFySWNvblwiKTtcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgLmJpbmQoJ2tleWRvd24nLGZ1bmN0aW9uKGUpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5kYXRldGltZXBpY2tlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ0RELk1NLllZWVkgSDptbScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogbGFuZ3VhZ2VBdHJyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93VG9kYXlCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJChlbGVtZW50KS5vbihcImRwLmNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuZGF0YShcIkRhdGVUaW1lUGlja2VyXCIpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZXBpY2tlcklucHV0Q3RybC5zZXRTZWxlY3Rpb25SYW5nZSgxMSwxNixcImZvcndhcmRcIik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLm9mZihcImZvY3VzXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24oKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZGF0YShcIkRhdGVUaW1lUGlja2VyXCIpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50QXRyciA9PT0gXCJkZC5tbS55eXl5IGhoOm1tOnNzXCIpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkYXRldGltZXBpY2tlciBoaDptbTpzcyAuLi5cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjY2FsZW5kYXJJY29uXCIpO1xyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAuYmluZCgna2V5ZG93bicsZnVuY3Rpb24oZSl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmRhdGV0aW1lcGlja2VyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnREQuTU0uWVlZWSBIOm1tOnNzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBsYW5ndWFnZUF0cnIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUb2RheUJ1dHRvbjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICQoZWxlbWVudCkub2ZmKFwiZm9jdXNcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gJChlbGVtZW50KS5vbihcImRwLmNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICQodGhpcykuZGF0YShcIkRhdGVUaW1lUGlja2VyXCIpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICAvL1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICQoZWxlbWVudCkuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICB2YXIgZGF0ZXBpY2tlcklucHV0Q3RybCA9ICQoZWxlbWVudCkuZ2V0KDApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdmFyIGRhdGVwaWNrZXJJbnB1dEN0cmxTdHJMZW5ndGggPSBkYXRlcGlja2VySW5wdXRDdHJsLnZhbHVlLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIC8vICAgICBkYXRlcGlja2VySW5wdXRDdHJsLnNldFNlbGVjdGlvblJhbmdlKDExLDMpOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyB9KTsgICAgICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNsaWNrKGZ1bmN0aW9uKClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyQoZWxlbWVudCkub2ZmKFwia2V5ZG93blwiKTtcclxuICAgICAgICAgICAgICAgIC8vIC5vbignZHAuaGlkZScsIGZ1bmN0aW9uKGUpe1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKCdkcC5oaWRlJyk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIH0pICAgXHJcbiAgICAgICAgICAgICAgICAvLyAub24oJ2RwLnNob3cnLCBmdW5jdGlvbihlKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnZHAuc2hvdycpO1xyXG4gICAgICAgICAgICAgICAgLy8gfSk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICQoaWNvbkJ0bikuY2xpY2soZnVuY3Rpb24oKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjYWxlbmRhci4uLmNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICgkKGRvY3VtZW50KS5maW5kKFwiLmRhdGVwaWNrZXItZHJvcGRvd25cIikuaXMoXCI6dmlzaWJsZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuZGF0YShcIkRhdGVUaW1lUGlja2VyXCIpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICQoZWxlbWVudCkuZm9jdXMoZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICAkKGVsZW1lbnQpLmRhdGEoXCJEYXRlVGltZVBpY2tlclwiKS5oaWRlKCk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIH0pOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibm90IGltcGxlbWVudGVkLi4uXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRNdWx0aURhdGVTZWxlY3REYXRlcGlja2VyKCk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJpbml0SW5wdXRzLi4uZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRNdWx0aURhdGVTZWxlY3REYXRlcGlja2VyKCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXRNdWx0aURhdGVTZWxlY3REYXRlcGlja2VyLi4uXCIpO1xyXG5cclxuICAgICAgICB2YXIgaW5wdXREaXZzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ2lucHV0W2RhdGEtaXpib3ItdmVjLWRuaV0nKTtcclxuXHJcbiAgICAgICAgaW5wdXREaXZzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlbGVtZW50LmluaXQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uXCIgKyBlbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzcGFuRGl2OiBhbnk7XHJcbiAgICAgICAgICAgIHNwYW5EaXYgPSAkKGVsZW1lbnQpLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoc3BhbkRpdiA9PT0gbnVsbCkgeyByZXR1cm47IH07XHJcbiAgICAgICAgICAgIGlmIChzcGFuRGl2Lmhhc0NsYXNzKFwiaGFzLWZsb2F0LWxhYmVsXCIpID09PSBmYWxzZSkgeyByZXR1cm47IH07XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoc3BhbkRpdi5nZXQoMCkuaWQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxhbmd1YWdlQXRyciA9IChTdHJpbmcpKCQoXCIjc2l0ZUxhbmd1YWdlXCIpLnZhbCgpKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImxhbmd1YWdlOlwiICsgbGFuZ3VhZ2VBdHJyKTtcclxuICAgICAgICAgICAgbGFuZ3VhZ2VBdHJyID0gaXNFbXB0eShsYW5ndWFnZUF0cnIpID8gXCJzbFwiIDogbGFuZ3VhZ2VBdHJyO1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibGFuZ3VhZ2U6XCIgKyBsYW5ndWFnZUF0cnIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGljb25CdG4gPSAkKHNwYW5EaXYpLmZpbmQoXCIjY2FsZW5kYXJJY29uXCIpO1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImNhbGVuZGFyLi4uXCIpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGVwaWNrZXJTdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1lbmFibGUtc2VsZWN0LXBhc3RkYXRlc1wiKSkudG9Mb3dlckNhc2UoKSA9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyU3RhcnREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkuYXR0cihcImRhdGEtbWluLXN0YXJ0LWRhdGVcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXBpY2tlclN0YXJ0RGF0ZTEgPSAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLW1pbi1zdGFydC1kYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlclN0YXJ0RGF0ZSA9IGNvbnZlcnRTdHJpbmcyRGF0ZShkYXRlcGlja2VyU3RhcnREYXRlMSwgXCJkZC5tbS55eXl5XCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0ZXBpY2tlckVuZERhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoJChlbGVtZW50KS5hdHRyKFwiZGF0YS1tYXgtZW5kLWRhdGVcIikgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlcGlja2VyRW5kRGF0ZSA9ICQoZWxlbWVudCkuYXR0cihcImRhdGEtbWF4LWVuZC1kYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlckVuZERhdGUgPSBjb252ZXJ0U3RyaW5nMkRhdGUoZGF0ZXBpY2tlckVuZERhdGUsIFwiZGQubW0ueXl5eVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJChlbGVtZW50KS5kYXRlcGlja2VyKHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogZGF0ZXBpY2tlclN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IGRhdGVwaWNrZXJFbmREYXRlLFxyXG4gICAgICAgICAgICAgICAgYXV0b2Nsb3NlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG11bHRpZGF0ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB3ZWVrU3RhcnQ6IDEsXHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiZGQubW0ueXl5eVwiLFxyXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlQXRycixcclxuICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcImJvdHRvbSByaWdodFwiXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJChpY29uQnRuKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiY2FsZW5kYXIuLi5jbGlja1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VySW5wdXRDdHJsID0gJChlbGVtZW50KS5nZXQoMCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoID0gZGF0ZXBpY2tlcklucHV0Q3RybC52YWx1ZS5sZW5ndGggKiAyO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlcklucHV0Q3RybC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZXBpY2tlcklucHV0Q3RybC5zZXRTZWxlY3Rpb25SYW5nZShkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoLCBkYXRlcGlja2VySW5wdXRDdHJsU3RyTGVuZ3RoKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLmluaXRNdWx0aURhdGVTZWxlY3REYXRlcGlja2VyLi4uZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlucHV0U2VsZWN0QWxsVGV4dChpbnB1dEN0cmw6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcElucHV0TWFzay5pbnB1dFNlbGVjdEFsbFRleHQuLi5cIik7XHJcblxyXG4gICAgICAgIGlucHV0Q3RybC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBpbnB1dEN0cmwudmFsdWUubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHdhc1RhYlByZXNzZWQoZXZlbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wSW5wdXRNYXNrLndhc1RhYlByZXNzZWQuLi5cIik7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IGNvZGUgPSAoZXZlbnQua2V5Q29kZSA/IGV2ZW50LmtleUNvZGUgOiBldmVudC53aGljaCk7XHJcbiAgICAgICAgaWYgKGNvZGUgPT0gOSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCwgc2V0TW9kYWxGb3JtWkluZGV4LGlzRW1wdHksaXNVbkRlZmluZWQgfSBmcm9tIFwiLi4vQ29tbW9uL3Nhb3AtY29tbW9uXCI7XHJcblxyXG5leHBvcnQgZW51bSBTYW9wTXNnRGxnVHlwZSB7XHJcbiAgICBtdEluZm9ybWF0aW9uID0gMVxyXG4gICAgLG10V2FybmluZyA9IDJcclxuICAgICxtdEVycm9yID0gM1xyXG4gICAgLy8sIG10Q29uZmlybWF0aW9uLCBtdEN1c3RvbVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wTXNnRGxnQnV0dG9uIHtcclxuICAgIG1iTm9uZSA9IDBcclxuICAgICxtYk9LID0gMVxyXG4gICAgLG1iQ2FuY2VsID0gMlxyXG4gICAgLG1iWWVzID0gM1xyXG4gICAgLG1iTm8gPSA0XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcE1zZ0RsZ0V2ZW50IHtcclxuICAgIHBhcmVudDphbnk7XHJcbiAgICBkYXRhOmFueTtcclxufVxyXG5cclxudHlwZSBTYW9wTXNnRGxnQnV0dG9ucyA9IEFycmF5PFNhb3BNc2dEbGdCdXR0b24+O1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE1lc3NhZ2VEbGcge1xyXG4gICAgcHJpdmF0ZSBfc2VuZGVyOlNhb3BNc2dEbGdFdmVudDtcclxuICAgIHByaXZhdGUgX21vZGFsUGFyZW50OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25PazogKHNlbmRlcjphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25DYW5jZWw6IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uWWVzOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbk5vOiAoc2VuZGVyOmFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvbkhpZGU6IChzZW5kZXI6YW55KSA9PiBhbnkgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHNlbmRlcjpTYW9wTXNnRGxnRXZlbnQpe1xyXG4gICAgICAgIHRoaXMuX3NlbmRlciA9IHNlbmRlcjtcclxuICAgIH1cclxuXHJcbiAgICBTaG93KE1zZzpzdHJpbmcsVGl0bGU6c3RyaW5nLERsZ1R5cGU6U2FvcE1zZ0RsZ1R5cGUgPSBTYW9wTXNnRGxnVHlwZS5tdEluZm9ybWF0aW9uLEJ1dHRvbnM6U2FvcE1zZ0RsZ0J1dHRvbnMgPSBbU2FvcE1zZ0RsZ0J1dHRvbi5tYk9LXSk6U2FvcE1zZ0RsZ0J1dHRvbntcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibWVzc2FnZTpcIitNc2cpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJ0aXRsZTpcIitUaXRsZSk7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fbW9kYWxQYXJlbnQgPSAkKFwiYm9keVwiKS5oYXNDbGFzcyhcIm1vZGFsLW9wZW5cIik7XHJcblxyXG4gICAgICAgIGxldCB0aXRsZURpdiA9ICQoJyNhbGVydC1tb2RhbC10aXRsZS1kaXYnKTtcclxuICAgICAgICBsZXQgYm9keVRhZyA9ICQoJyNhbGVydC1tb2RhbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgIGlmIChEbGdUeXBlID09IFNhb3BNc2dEbGdUeXBlLm10SW5mb3JtYXRpb24pe1xyXG4gICAgICAgICAgICAkKFwiI2FsZXJ0LW1vZGFsLXRpdGxlLWRpdlwiKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsXCJ3aGl0ZVwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKERsZ1R5cGUgPT0gU2FvcE1zZ0RsZ1R5cGUubXRFcnJvcikge1xyXG4gICAgICAgICAgICAkKFwiI2FsZXJ0LW1vZGFsLXRpdGxlLWRpdlwiKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsXCIjRDgyQzI1XCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQoXCIjYWxlcnQtbW9kYWwtdGl0bGUtZGl2XCIpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIixcInNpbHZlclwiKTsgICAgICAgICAgICBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXNFbXB0eShUaXRsZSkpe1xyXG4gICAgICAgICAgICB0aXRsZURpdi5odG1sKFRpdGxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgYm9keVRhZy5odG1sKE1zZyk7XHJcblxyXG4gICAgICAgIGlmIChCdXR0b25zICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCBfZWxlbWVudF9tYk9LID0gQnV0dG9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gU2FvcE1zZ0RsZ0J1dHRvbi5tYk9LKTtcclxuICAgICAgICAgICAgaWYgKGlzVW5EZWZpbmVkKF9lbGVtZW50X21iT0spKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF90aGlzLm9uT2spKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uT2soX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJPSztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICBsZXQgX2VsZW1lbnRfbWJDYW5jZWwgPSBCdXR0b25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50ID09PSBTYW9wTXNnRGxnQnV0dG9uLm1iQ2FuY2VsKTtcclxuICAgICAgICAgICAgaWYgKGlzVW5EZWZpbmVkKF9lbGVtZW50X21iQ2FuY2VsKSkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydENhbmNlbFwiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRDYW5jZWxcIikub2ZmKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0Q2FuY2VsXCIpLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdGhpcy5vbkNhbmNlbCkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25DYW5jZWwoX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJDYW5jZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIGxldCBfZWxlbWVudF9tYlllcyA9IEJ1dHRvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQgPT09IFNhb3BNc2dEbGdCdXR0b24ubWJZZXMpO1xyXG4gICAgICAgICAgICBpZiAoaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJZZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2J0bkFsZXJ0WWVzXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNidG5BbGVydFllc1wiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVW5EZWZpbmVkKF90aGlzLm9uWWVzKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vblllcyhfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYlllcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgbGV0IF9lbGVtZW50X21iTm8gPSBCdXR0b25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50ID09PSBTYW9wTXNnRGxnQnV0dG9uLm1iTm8pO1xyXG4gICAgICAgICAgICBpZiAoaXNVbkRlZmluZWQoX2VsZW1lbnRfbWJObykpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5vZmYoXCJjbGlja1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoX3RoaXMub25Obykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25ObyhfdGhpcy5fc2VuZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FvcE1zZ0RsZ0J1dHRvbi5tYk5vO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSAgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKFwiI2J0bkFsZXJ0T0tcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnRDYW5jZWxcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnRZZXNcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICQoXCIjYnRuQWxlcnROb1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFNhb3BNc2dEbGdCdXR0b24ubWJOb25lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnI2FsZXJ0LW1vZGFsJykub24oJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICQoXCIjYWxlcnQtbW9kYWwtYnRuLW9rXCIpLnVuYmluZChcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLm1vZGFsKCdkaXNwb3NlJyk7XHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoX3RoaXMub25IaWRlKSl7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkhpZGUoX3RoaXMuX3NlbmRlcik7XHJcbiAgICAgICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX21vZGFsUGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiYm9keVwiKS5hZGRDbGFzcyhcIm1vZGFsLW9wZW5cIik7XHJcbiAgICAgICAgICAgIH0gICAgXHJcbiAgICAgICAgfSlcclxuICAgIFxyXG4gICAgICAgICQoJyNhbGVydC1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XHJcbiAgICAgICAgc2V0TW9kYWxGb3JtWkluZGV4KCcjYWxlcnQtbW9kYWwnKTsgXHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gXCIuLi9Db21tb24vc2FvcC1jb21tb25cIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdTcGlubmVyIHtcclxuXHJcbiAgZ2VuZXJhdGVTcGlubmVyRGl2KHNwaW5uZXJJZDogc3RyaW5nID0gJyNzYW9wTG9hZGluZycpOiBzdHJpbmcge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImdlbmVyYXRlU3Bpbm5lckRpdiBcIiArIHNwaW5uZXJJZCk7XHJcbiAgICBsZXQgc3Bpbm5yRGl2ID1cclxuICAgICAgJzxkaXYgaWQ9XCInICsgc3Bpbm5lcklkICsgJ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBjbGFzcz1cIlwiPiAnXHJcbiAgICAgICsgJ1x0PGRpdiBpZD1cIicgKyBzcGlubmVySWQgKyAnU3Bpbm5lckJhY2tncm91bmdcIiBjbGFzcz1cInNwaW5uZXItYmFja2dyb3VuZCBcIi8+ICdcclxuICAgICAgKyAnXHQ8ZGl2IGlkPVwiJyArIHNwaW5uZXJJZCArICdTcGlubmVyXCIgY2xhc3M9XCJzcGlubmVyIHNwaW5uZXItY2VudGVyLWRhc2hib2FyZFNpZGViYXJyXCI+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJsYWRlXCIvPiAnXHJcbiAgICAgICsgJ1x0XHQ8ZGl2IGNsYXNzPVwic3Bpbm5lci1ibGFkZVwiLz4gJ1xyXG4gICAgICArICdcdFx0PGRpdiBjbGFzcz1cInNwaW5uZXItYmxhZGVcIi8+ICdcclxuICAgICAgKyAnXHQ8L2Rpdj4gJ1xyXG4gICAgICArICc8L2Rpdj4gJztcclxuXHJcbiAgICByZXR1cm4gc3Bpbm5yRGl2O1xyXG4gIH1cclxuXHJcbiAgc2hvd0xvYWRpbmdTYW9wKGVsZW1lbnRJZDogc3RyaW5nID0gXCIjc2FvcExvYWRpbmdcIikge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInNob3dMb2FkaW5nU2FvcCBcIiArIGVsZW1lbnRJZCk7XHJcbiAgICB2YXIgb2JqID0gJChlbGVtZW50SWQpO1xyXG4gICAgaWYgKG9iai5sZW5ndGgpIHtcclxuICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNob3cuLi4gXCIpO1xyXG4gICAgICBvYmouc2hvdygpO1xyXG4gICAgICAvL3NldE1vZGFsRm9ybVpJbmRleChlbGVtZW50SWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZUxvYWRpbmdTYW9wKGVsZW1lbnRJZDogc3RyaW5nID0gXCIjc2FvcExvYWRpbmdcIikge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImhpZGVMb2FkaW5nU2FvcCBcIiArIGVsZW1lbnRJZCk7XHJcbiAgICB2YXIgb2JqID0gJChlbGVtZW50SWQpO1xyXG4gICAgaWYgKG9iai5sZW5ndGgpXHJcbiAgICAgIG9iai5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBzaG93TG9hZGluZ1Nhb3AoZWxlbWVudElkOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgLy8gICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2hvd0xvYWRpbmdTYW9wIFwiICsgZWxlbWVudElkKTtcclxuICAvLyAgIGlmICghaXNFbXB0eShlbGVtZW50SWQpKSB7XHJcbiAgLy8gICAgIGxldCBlbGVtZW50RGl2ID0gJChlbGVtZW50SWQpO1xyXG4gIC8vICAgICBpZiAoZWxlbWVudERpdi5sZW5ndGgpIHtcclxuICAvLyAgICAgICBsZXQgc3Bpbm5lcklEID0gZWxlbWVudElkICsgXCJMb2FkaW5nXCI7XHJcbiAgLy8gICAgICAgc3Bpbm5lcklEID0gc3Bpbm5lcklELnJlcGxhY2UoXCIjXCIsXCJcIik7XHJcbiAgLy8gICAgICAgbGV0IHNwaW5uZXJEaXYgPSAkKHNwaW5uZXJJRCk7XHJcbiAgLy8gICAgICAgaWYgKCFzcGlubmVyRGl2Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgbGV0IF9kaXYgPSB0aGlzLmdlbmVyYXRlU3Bpbm5lckRpdihzcGlubmVySUQpO1xyXG4gIC8vICAgICAgICAgZWxlbWVudERpdi5hcHBlbmQoX2Rpdik7XHJcbiAgLy8gICAgICAgICBzcGlubmVyRGl2ID0gJChzcGlubmVySUQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBzcGlubmVyRGl2LnNob3coKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gaGlkZUxvYWRpbmdTYW9wKGVsZW1lbnRJZDogc3RyaW5nID0gXCJcIikge1xyXG4gIC8vICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImhpZGVMb2FkaW5nU2FvcCBcIiArIGVsZW1lbnRJZCk7XHJcbiAgLy8gICBpZiAoIWlzRW1wdHkoZWxlbWVudElkKSkge1xyXG4gIC8vICAgICBsZXQgZWxlbWVudERpdiA9ICQoZWxlbWVudElkKTtcclxuICAvLyAgICAgaWYgKGVsZW1lbnREaXYubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgbGV0IHNwaW5uZXJJRCA9IGVsZW1lbnRJZCArIFwiTG9hZGluZ1wiO1xyXG4gIC8vICAgICAgIGxldCBzcGlubmVyRGl2ID0gJChzcGlubmVySUQpO1xyXG4gIC8vICAgICAgIGlmICghc3Bpbm5lckRpdi5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgIGVsZW1lbnREaXYuYXBwZW5kKHRoaXMuZ2VuZXJhdGVTcGlubmVyRGl2KHNwaW5uZXJJRCkpO1xyXG4gIC8vICAgICAgICAgc3Bpbm5lckRpdiA9ICQoc3Bpbm5lcklEKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgc3Bpbm5lckRpdi5oaWRlKCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgLy8gLy9cclxufVxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwsaXNFbXB0eSxnZXRTaXRlQWJzb2x1dGVVUkwsIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wVmlld1NwaW5uZXIgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3Atdmlldy1zcGlubmVyJ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wU2VydmljZXNDb3JlUGFyYW1zIHtcclxuICBhY3Rpb246c3RyaW5nO1xyXG4gIGFzeW5jPzpib29sZWFuXHJcbiAgdHlwZT86c3RyaW5nO1xyXG4gIGRhdGE/OmFueTtcclxuICBzcGlubmVyRGl2SWQ/OnN0cmluZztcclxuICAvLyBjb250ZW50VHlwZT86IHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGRhdGFUeXBlPzogJ3htbCcgfCAnaHRtbCcgfCAnc2NyaXB0JyB8ICdqc29uJyB8ICdqc29ucCcgfCAndGV4dCcgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLy8gcHJvY2Vzc0RhdGE/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wU2VydmljZXNDb3JlUmVzdWx0IHtcclxuICBzdWNjZXNzID0gMVxyXG4gICwgZXJyb3IgPSAyXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZSB7XHJcbiAgb2sgPSAyMDAsXHJcbiAgdW5hdXRob3JpemVkID0gNDAxLFxyXG4gIGludGVybmFsU2VydmVyRXJyb3IgPSA1MDBcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wU2VydmljZXNDb3JlUmVzcG9uc2Uge1xyXG4gIHJlc3BvbnNlOiBTYW9wU2VydmljZXNDb3JlUmVzdWx0O1xyXG4gIGRhdGE6IGFueTtcclxufTtcclxuXHJcbi8vIGZ1bmN0aW9uIHN5bmNEZWxheShtaWxsaXNlY29uZHM6YW55KXtcclxuLy8gICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuLy8gICB2YXIgZW5kPTA7XHJcbi8vICAgd2hpbGUoIChlbmQtc3RhcnQpIDwgbWlsbGlzZWNvbmRzKXtcclxuLy8gICAgICAgZW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbi8vICAgfVxyXG4vLyAgfVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZXJ2aWNlc0NvcmUge1xyXG4gIHByaXZhdGUgX3Nhb3BWaWV3U3Bpbm5lcjpTYW9wVmlld1NwaW5uZXIgPSBuZXcgU2FvcFZpZXdTcGlubmVyKCk7XHJcbiAgcHJpdmF0ZSBfcGFyYW1zOlNhb3BTZXJ2aWNlc0NvcmVQYXJhbXM7XHJcbiAgcHJpdmF0ZSBfZGVmYXVsdFBhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zO1xyXG4gIC8vICBcclxuICAvL3B1YmxpYyBfcmVzdWx0OlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSA9IHtyZXNwb25zZTpudWxsLGRhdGE6bnVsbH07ICBcclxuXHJcbiAgY29uc3RydWN0b3IoKXtcclxuICAgIHRoaXMuX2RlZmF1bHRQYXJhbXMgPSB7XHJcbiAgICAgIGFjdGlvbjpcIlwiXHJcbiAgICAgICx0eXBlOlwiR0VUXCJcclxuICAgICAgLGFzeW5jOnRydWVcclxuICAgICAgLGRhdGE6bnVsbFxyXG4gICAgICAsc3Bpbm5lckRpdklkOlwiXCJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRG9uZShyZXN1bHQ6YW55KXtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLm9uRG9uZVwiKTtcclxuICAgIHRoaXMuYWZ0ZXJEb25lKHJlc3VsdCk7XHJcbiAgICAvL3RoaXMuX3Nhb3BWaWV3U3Bpbm5lci5oaWRlTG9hZGluZ1Nhb3AodGhpcy5fcGFyYW1zLnNwaW5uZXJEaXZJZCk7ICAgICAgXHJcbiAgfVxyXG5cclxuICBhZnRlckRvbmUocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZVwiKTtcclxuICB9ICBcclxuXHJcbiAgcHJpdmF0ZSBvblN1Y2Nlc3MocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLnN1Y2Nlc3NcIik7XHJcbiAgICBsZXQgX3Jlc3VsdDpTYW9wU2VydmljZXNDb3JlUmVzcG9uc2UgPSB7cmVzcG9uc2U6bnVsbCxkYXRhOm51bGx9OyBcclxuICAgIGlmICh0eXBlb2YgcmVzdWx0LnN1Y2Nlc3MgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVzdWx0LnN1Y2Nlc3MgPT09IG51bGwpIHtcclxuICAgICAgX3Jlc3VsdC5yZXNwb25zZSA9IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuc3VjY2VzcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIF9yZXN1bHQucmVzcG9uc2UgPSByZXN1bHQuc3VjY2VzcyA9PSB0cnVlID8gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzIDogU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5lcnJvcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgX3Jlc3VsdC5kYXRhID0gcmVzdWx0O1xyXG4gICAgdGhpcy5hZnRlclN1Y2Nlc3MoX3Jlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBhZnRlclN1Y2Nlc3MocmVzdWx0OmFueSk6dm9pZHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2Vzc1wiKTtcclxuICB9ICBcclxuXHJcbiAgcHJpdmF0ZSBvbkVycm9yKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5lcnJvclwiKTtcclxuICAgIFxyXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT0gU2FvcFNlcnZpY2VzQ29yZUhUVFBSZXN1bHRTdGF0dXNDb2RlLnVuYXV0aG9yaXplZCkge1xyXG4gICAgICAvLyByZWRpcmVjdCB0byBsb2dpblxyXG4gICAgICB0aGlzLnVuQXV0aG9yaXplZFJlZGlyZWN0VG9Mb2dpblBhZ2UoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQuc3RhdHVzID0gU2FvcFNlcnZpY2VzQ29yZUhUVFBSZXN1bHRTdGF0dXNDb2RlLmludGVybmFsU2VydmVyRXJyb3IgJiYgIWlzVW5EZWZpbmVkKHJlc3VsdC5yZXNwb25zZVRleHQpKSB7XHJcbiAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBfcmVzdWx0OlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSA9IHtyZXNwb25zZTpudWxsLGRhdGE6bnVsbH07IFxyXG4gICAgX3Jlc3VsdC5yZXNwb25zZSA9IFNhb3BTZXJ2aWNlc0NvcmVSZXN1bHQuZXJyb3I7XHJcbiAgICBfcmVzdWx0LmRhdGEgPSByZXN1bHQ7XHJcbiAgICB0aGlzLmFmdGVyRXJyb3IoX3Jlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBhZnRlckVycm9yKHJlc3VsdDphbnkpOnZvaWR7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5hZnRlclN1Y2Nlc3NcIik7XHJcbiAgfSBcclxuXHJcbiAgRXhlY3V0ZUFjdGlvbihwYXJhbXM6U2FvcFNlcnZpY2VzQ29yZVBhcmFtcyk6dm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uXCIpO1xyXG4gICAgbGV0IG9wdGlvbnMgPSB7IC4uLnRoaXMuX2RlZmF1bHRQYXJhbXMsIC4uLnBhcmFtcyB9O1xyXG4gICAgcGFyYW1zID0gb3B0aW9ucztcclxuICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgX2FqYXhBY3Rpb24gPSBnZXRTaXRlQWJzb2x1dGVVUkwocGFyYW1zLmFjdGlvbik7XHJcblxyXG4gICAgLy9AVXJsLkFjdGlvbihcImNyZWFyQ2FtcE1hbnVhbFwiLCBcIkRQU1wiKVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICQuYWpheCh7XHJcbiAgICAgICAgYXN5bmM6IHBhcmFtcy5hc3luYyxcclxuICAgICAgICB1cmw6IF9hamF4QWN0aW9uLFxyXG4gICAgICAgIHR5cGU6ICFpc0VtcHR5KHBhcmFtcy50eXBlKSA/IHBhcmFtcy50eXBlIDogXCJQT1NUXCIsXHJcbiAgICAgICAgZGF0YTogcGFyYW1zLmRhdGEsXHJcbiAgICAgICAgLy8gY29udGVudFR5cGU6IHBhcmFtcy5jb250ZW50VHlwZSA9PSBudWxsID8gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCcgOiBwYXJhbXMuY29udGVudFR5cGUsXHJcbiAgICAgICAgLy8gZGF0YVR5cGU6IHBhcmFtcy50eXBlID09IG51bGwgPyAnSW50ZWxsaWdlbnQgR3Vlc3MgKHhtbCwganNvbiwgc2NyaXB0LCBvciBodG1sKScgOiBwYXJhbXMudHlwZSwgIFxyXG4gICAgICAgIC8vIHByb2Nlc3NEYXRhIDogcGFyYW1zLnByb2Nlc3NEYXRhID09IG51bGwgPyB0cnVlIDogcGFyYW1zLnByb2Nlc3NEYXRhLCBcclxuICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7IF90aGlzLl9zYW9wVmlld1NwaW5uZXIuc2hvd0xvYWRpbmdTYW9wKHBhcmFtcy5zcGlubmVyRGl2SWQpOyB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7IF90aGlzLl9zYW9wVmlld1NwaW5uZXIuaGlkZUxvYWRpbmdTYW9wKHBhcmFtcy5zcGlubmVyRGl2SWQpOyB9LFxyXG4gICAgICAgIHN1Y2Nlc3M6IHRoaXMub25TdWNjZXNzLmJpbmQoX3RoaXMpLFxyXG4gICAgICAgIGVycm9yOiB0aGlzLm9uRXJyb3IuYmluZChfdGhpcylcclxuICAgICAgfSkuZG9uZShmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIkRvbmUuLi5cIik7XHJcbiAgICAgICAgX3RoaXMub25Eb25lKHJlc3VsdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2goZXJyKSB7XHJcbiAgICAgIGFsZXJ0KFwiSW50ZXJuYWwgZXJyb3IhXCIpO1xyXG4gICAgfSAgICBcclxuXHJcbiAgXHJcbiAgfVxyXG5cclxuICBFeGVjdXRlQmxvYkFjdGlvbihwYXJhbXM6IFNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMpOiB2b2lkIHtcclxuICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVCbG9iQWN0aW9uXCIpO1xyXG4gICAgbGV0IG9wdGlvbnMgPSB7IC4uLnRoaXMuX2RlZmF1bHRQYXJhbXMsIC4uLnBhcmFtcyB9O1xyXG4gICAgcGFyYW1zID0gb3B0aW9ucztcclxuICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgX2FqYXhBY3Rpb24gPSBnZXRTaXRlQWJzb2x1dGVVUkwocGFyYW1zLmFjdGlvbik7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgJC5hamF4KHtcclxuICAgICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgICB1cmw6IF9hamF4QWN0aW9uLFxyXG4gICAgICAgIGRhdGE6IHBhcmFtcy5kYXRhLFxyXG4gICAgICAgIHhockZpZWxkczoge1xyXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicgLy8gdG8gYXZvaWQgYmluYXJ5IGRhdGEgYmVpbmcgbWFuZ2xlZCBvbiBjaGFyc2V0IGNvbnZlcnNpb25cclxuICAgICAgICB9LFxyXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChibG9iLCBzdGF0dXMsIHhocikge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgYSBmaWxlbmFtZVxyXG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBcIlwiO1xyXG4gICAgICAgICAgICB2YXIgZGlzcG9zaXRpb24gPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgaWYgKGRpc3Bvc2l0aW9uICYmIGRpc3Bvc2l0aW9uLmluZGV4T2YoJ2F0dGFjaG1lbnQnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlbmFtZVJlZ2V4ID0gL2ZpbGVuYW1lW147PVxcbl0qPSgoWydcIl0pLio/XFwyfFteO1xcbl0qKS87XHJcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGZpbGVuYW1lUmVnZXguZXhlYyhkaXNwb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAhPSBudWxsICYmIG1hdGNoZXNbMV0pIGZpbGVuYW1lID0gbWF0Y2hlc1sxXS5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vaWYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIC8vICAgIC8vIElFIHdvcmthcm91bmQgZm9yIFwiSFRNTDcwMDc6IE9uZSBvciBtb3JlIGJsb2IgVVJMcyB3ZXJlIHJldm9rZWQgYnkgY2xvc2luZyB0aGUgYmxvYiBmb3Igd2hpY2ggdGhleSB3ZXJlIGNyZWF0ZWQuIFRoZXNlIFVSTHMgd2lsbCBubyBsb25nZXIgcmVzb2x2ZSBhcyB0aGUgZGF0YSBiYWNraW5nIHRoZSBVUkwgaGFzIGJlZW4gZnJlZWQuXCJcclxuICAgICAgICAgICAgLy8gICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgLy99IGVsc2VcclxuICAgICAgICAgICAgLy97XHJcbiAgICAgICAgICAgIHZhciBVUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XHJcbiAgICAgICAgICAgIHZhciBkb3dubG9hZFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVzZSBIVE1MNSBhW2Rvd25sb2FkXSBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBmaWxlbmFtZVxyXG4gICAgICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICAgICAgICAgIC8vIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXRcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYS5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvd25sb2FkVXJsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhLmhyZWYgPSBkb3dubG9hZFVybDtcclxuICAgICAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICAgICAgICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvd25sb2FkVXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChkb3dubG9hZFVybCk7IH0sIDEwMCk7IC8vIGNsZWFudXBcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogdGhpcy5vbkVycm9yLmJpbmQoX3RoaXMpXHJcbiAgICAgICAgfSkuZG9uZShmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiRG9uZS4uLlwiKTtcclxuICAgICAgICAgIF90aGlzLm9uRG9uZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgYWxlcnQoXCJJbnRlcm5hbCBlcnJvciFcIik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHB1YmxpYyBoYW5kbGVTdWJtaXRFcnJvcihyZXNwb25zZTogYW55KTogdm9pZCB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFNlcnZpY2VzQ29yZS5IYW5kbGVTdWJtaXRFcnJvclwiKTtcclxuXHJcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IFNhb3BTZXJ2aWNlc0NvcmVIVFRQUmVzdWx0U3RhdHVzQ29kZS51bmF1dGhvcml6ZWQpIHtcclxuICAgICAgICB0aGlzLnVuQXV0aG9yaXplZFJlZGlyZWN0VG9Mb2dpblBhZ2UoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGlzcGxheSBlcnJvclxyXG4gICAgY29uc29sZS5sb2coXCJyZXNwb25zZVwiLCByZXNwb25zZSk7XHJcbiAgICBhbGVydChyZXNwb25zZS5zdGF0dXNUZXh0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1bkF1dGhvcml6ZWRSZWRpcmVjdFRvTG9naW5QYWdlKCk6IHZvaWQge1xyXG4gICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXJ2aWNlc0NvcmUucmVkaXJlY3RUb0xvZ2luUGFnZVwiKTtcclxuXHJcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgfVxyXG4gXHJcbiAgLy9cclxufVxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwsIGlzRW1wdHksIGlzVW5EZWZpbmVkIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC1zZXJ2aWNlcy1jb3JlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFRyYW5zbGF0aW9uIHtcclxuICBwdWJsaWMga2V5OiBzdHJpbmcgPSBcIiNcIjtcclxuICBwdWJsaWMgdHJhbnNsYXRpb246IHN0cmluZyA9IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVHJhbnNsYXRpb25zIHtcclxuICBwdWJsaWMgdHJhbnNsYXRpb25zTGlzdDpbU2FvcFRyYW5zbGF0aW9uP10gPSBbXTtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FvcFRyYW5zbGF0aW9uU2VydmljZVBhcmFtcyB7XHJcbiAgY29udHJvbGxlcjpzdHJpbmcsXHJcbiAgYWN0aW9uOnN0cmluZyxcclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIF9wYXJhbXM6U2FvcFRyYW5zbGF0aW9uU2VydmljZVBhcmFtcztcclxuICBwcml2YXRlIF9zYW9wU2VydmljZXNDb3JlOiBTYW9wU2VydmljZXNDb3JlO1xyXG4gIC8vXHJcbiAgcHVibGljIF90ZXJtaW5vbG9neTpTYW9wVHJhbnNsYXRpb25zO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocGFyYW1zOlNhb3BUcmFuc2xhdGlvblNlcnZpY2VQYXJhbXMgPSBudWxsKXtcclxuICAgIGlmKCFpc1VuRGVmaW5lZChwYXJhbXMpKXtcclxuICAgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcGFyYW1zID0ge2NvbnRyb2xsZXI6XCJUcmFuc2xhdGlvblwiLGFjdGlvbjpcIkdldFRyYW5zbGF0aW9uc1wifTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICB0aGlzLl90ZXJtaW5vbG9neSA9IG5ldyBTYW9wVHJhbnNsYXRpb25zKCk7XHJcbiAgfVxyXG4gIFxyXG4gIHNldFRyYW5zbGF0aW9uc0xpc3QodHJhbnNsYXRpb25zOnN0cmluZ1tdKTphbnl7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdHJhbnNsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgIF90aGlzLl90ZXJtaW5vbG9neS50cmFuc2xhdGlvbnNMaXN0LnB1c2goe2tleTp2YWx1ZSx0cmFuc2xhdGlvbjp2YWx1ZX0pOyAgXHJcbiAgICB9KTsgICBcclxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0aW9ucyh0aGlzLl90ZXJtaW5vbG9neSk7XHJcbiAgfVxyXG5cclxuICBnZXRUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zOlNhb3BUcmFuc2xhdGlvbnMpOmFueXtcclxuICAgIGxldCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRyYW5zbGF0aW9ucyk7XHJcbiAgICBsZXQgX2RhdGEgPSB7anNvbklucHV0Ompzb25EYXRhfTtcclxuICAgIGxldCBfcmVzcG9uc2U6YW55O1xyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgX3Jlc3BvbnNlID0gcmVzcG9uc2U7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5fc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICBhY3Rpb246IHRoaXMuX3BhcmFtcy5jb250cm9sbGVyK1wiL1wiK3RoaXMuX3BhcmFtcy5hY3Rpb24rXCJcIlxyXG4gICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAsIGRhdGE6IF9kYXRhXHJcbiAgICAgICAgLCBhc3luYzogZmFsc2VcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fdGVybWlub2xvZ3kudHJhbnNsYXRpb25zTGlzdCA9IF9yZXNwb25zZS50cmFuc2xhdGlvbnNMaXN0O1xyXG4gICAgcmV0dXJuIF9yZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZShrZXk6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICBsZXQgX3RyID0gdGhpcy5fdGVybWlub2xvZ3kudHJhbnNsYXRpb25zTGlzdC5maW5kKGUgPT4gZS5rZXkgPT0ga2V5KSBhcyBhbnk7XHJcbiAgICBpZiAoaXNVbkRlZmluZWQoX3RyKSkgeyBcclxuICAgICAgcmV0dXJuIGtleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBfdHIudHJhbnNsYXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIu+7vy8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvYWxlcnRpZnkvaW5kZXguZC50c1wiIC8+XHJcbmltcG9ydCB7IGdsb2JhbCwgc2V0TW9kYWxGb3JtWkluZGV4LCBpc0VtcHR5LCBpc1VuRGVmaW5lZCwgc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXMsZ2V0U2l0ZUFic29sdXRlVVJMIH0gZnJvbSBcIi4uL0NvbW1vbi9zYW9wLWNvbW1vblwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlLFNhb3BTZXJ2aWNlc0NvcmVQYXJhbXMsIFNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSwgU2FvcFNlcnZpY2VzQ29yZVJlc3VsdCB9IGZyb20gJy4vc2FvcC1zZXJ2aWNlcy1jb3JlJ1xyXG5pbXBvcnQgeyBTYW9wTWVzc2FnZURsZywgU2FvcE1zZ0RsZ0J1dHRvbiB9IGZyb20gJy4uL0NvbXBvbmVudHMvc2FvcC1tZXNzYWdlLWRsZyc7XHJcbmltcG9ydCB7IFNhb3BUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3Nhb3AtdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgU2FvcEZsb2F0aW5nTGFiZWwgfSBmcm9tICcuLi9Db21wb25lbnRzL3Nhb3AtZmxvYXRpbmctbGFiZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVycm9yIHtcclxuICAgIHB1YmxpYyBDb2RlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgTWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBTYW9wV2ZBY3Rpb24ge1xyXG4gICAgd2ZhTm9uZSA9IDBcclxuICAgICx3ZmFBZGRSZWNvcmQgPSAxXHJcbiAgICAsd2ZhRWRpdFJlY29yZCA9IDJcclxuICAgICx3ZmFEZWxldGVSZWNvcmQgPSAzXHJcbiAgICAsd2ZhUmVjb3JkRGVzdGFpbHMgPSA0XHJcbiAgICAsd2ZhQ3VzdG9tSHRtbCA9IDVcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW9wV2ZTdWJtaXRSZXN1bHQge1xyXG4gICAgc3VjY2Vzczpib29sZWFuO1xyXG4gICAgdmlld0NvbnRlbnQ6c3RyaW5nO1xyXG4gICAgcmVkaXJlY3RUbzpzdHJpbmc7XHJcbiAgICBhbGVydE1lc3NhZ2U6IHN0cmluZztcclxuICAgIGRhdGE6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgICBwcml2YXRlIF92aWV3TW9kYWxGcmFtZTpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgcHJpdmF0ZSBfdmlld01vZGFsQm9keTpKUXVlcnk8SFRNTEVsZW1lbnQ+OyAgICBcclxuICAgIHByaXZhdGUgX3ZpZXdfdGl0bGU6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfYnRuT2s6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICAgIHByaXZhdGUgX3ZpZXdfYnRuQ2FuY2VsOkpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlc1BhcmFtczpTYW9wU2VydmljZXNDb3JlUGFyYW1zID0ge2FjdGlvbjpudWxsLGRhdGE6bnVsbCx0eXBlOlwiUE9TVFwifTtcclxuICAgIHByaXZhdGUgX3Rlcm1pbm9sb2d5OiBzdHJpbmdbXTtcclxuICAgIHByaXZhdGUgX3ByZXBhcmVWaWV3OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2RhdGE6YW55O1xyXG4gICAgcHJpdmF0ZSBfbW9kYWxQYXJlbnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy9cclxuICAgIHB1YmxpYyBfbGliTmFtZTpzdHJpbmc7ICAgIFxyXG4gICAgcHVibGljIHNhb3BTZXJ2aWNlc0NvcmU6U2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICBwdWJsaWMgdHJhbnNsYXRpb25TZXJ2aWNlOlNhb3BUcmFuc2xhdGlvblNlcnZpY2U7XHJcbiAgICBwdWJsaWMgY29udGVudEVsZW1lbnRJZCA9IFwiLnNhb3AtbW9kYWwtYm9keS1lbGVtZW50XCI7ICAgIFxyXG4gICAgcHVibGljIGFkZFJlY29yZEVuZHBvaW50OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGVkaXRSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBkZWxldGVSZWNvcmRFbmRwb2ludDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBzYW9wRmxvYXRpbmdMYWJlbDogU2FvcEZsb2F0aW5nTGFiZWw7XHJcbiAgICAvL1xyXG4gICAgcHVibGljIG9uU3VjY2Nlc3NDYWxsYmFjazogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBvbkVycm9yQ2FsbGJhY2s6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgb25GYWlsdXJlQ2FsbGJhY2s6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAvLyAgICBcclxuICAgIHB1YmxpYyBpZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGl0bGU6c3RyaW5nO1xyXG4gICAgcHVibGljIGZ1bGxUaXRsZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGZ1bGxTY3JlZW46Ym9vbGVhbiA9IGZhbHNlOyBcclxuICAgIC8vXHJcbiAgICBwdWJsaWMgb25DbG9zZTogKHBhcmFtczphbnkpID0+IGFueSA9IG51bGw7XHJcbiAgICBwdWJsaWMgb25TdWJtaXQ6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uRXJyb3I6IChwYXJhbXM6YW55KSA9PiBhbnkgPSBudWxsOyAgXHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDpzdHJpbmcsbGliTmFtZTpzdHJpbmcgPSBcIlwiKXtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcFZpZXdGb3JtLi4uXCIpO1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJ2aWV3SWQ6XCIrdmlld0lkKTtcclxuICAgICAgICB0aGlzLmlkID0gdmlld0lkO1xyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgICAgIHRoaXMub25TdWNjY2Vzc0NhbGxiYWNrID0gbGliTmFtZStcIi5vblN1Ym1pdFN1Y2Nlc3MoZGF0YSxcIitsaWJOYW1lK1wiKTtcIjtcclxuICAgICAgICB0aGlzLm9uRXJyb3JDYWxsYmFjayA9IGxpYk5hbWUgKyBcIi5vblN1Ym1pdEVycm9yKGRhdGEsXCIgKyBsaWJOYW1lICsgXCIpO1wiOyBcclxuICAgICAgICB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrID0gbGliTmFtZSArIFwiLm9uU3VibWl0RmFpbHVyZSh4aHIsXCIgKyBsaWJOYW1lICsgXCIpO1wiOyBcclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZSA9IG5ldyBTYW9wVHJhbnNsYXRpb25TZXJ2aWNlKCk7XHJcbiAgICAgICAgdGhpcy5zYW9wRmxvYXRpbmdMYWJlbCA9IG5ldyBTYW9wRmxvYXRpbmdMYWJlbCgpO1xyXG4gICAgICAgIC8vICBcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhKCk6YW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VGVybWlub2xvZ3lMaXN0KGRpY3Rpb25hcnk6IHN0cmluZ1tdID0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3Rlcm1pbm9sb2d5ID0gW1wiVXJlZGlcIixcIk5vdiB2bm9zXCIsXCJQb2Ryb2Jub3N0aVwiLFwiQnJpc2FuamVcIl07XHJcbiAgICAgICAgaWYgKGRpY3Rpb25hcnkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5vbG9neSA9IHRoaXMuX3Rlcm1pbm9sb2d5LmNvbmNhdChkaWN0aW9uYXJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0VHJhbnNsYXRpb25zTGlzdCh0aGlzLl90ZXJtaW5vbG9neSk7XHJcbiAgICB9ICAgICBcclxuXHJcbiAgICBwdWJsaWMgb25CdG5Pa0NsaWNrKHNlbmRlcjphbnkpOnZvaWR7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uQnRuT2tDbGljay4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25CdG5DYW5jZWwoc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwib25CdG5DYW5jZWwuLi5cIik7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyBiZWZvcmVWaWV3U2hvdyhzZW5kZXI6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCtcIi5iZWZvcmVWaWV3U2hvdygpXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lID0gJCh0aGlzLmlkKTtcclxuICAgICAgICBpZiAodGhpcy5fdmlld01vZGFsRnJhbWUgPT0gbnVsbCkgeyBjb25zb2xlLmxvZyh0aGlzLmlkK1wiIG5vdCBmb3VuZCFcIik7fTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIHZhciBjb250ZW50U2VsID0gdGhpcy5pZCArIFwiIFwiICsgdGhpcy5jb250ZW50RWxlbWVudElkO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkgPSAkKGNvbnRlbnRTZWwpOyAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZnRlclZpZXdTaG93KHNlbmRlcjphbnksd2ZBY3Rpb246U2FvcFdmQWN0aW9uKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCtcIi5hZnRlclZpZXdTaG93KClcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuYmluZFZpZXdFdmVudHMoc2VuZGVyKTtcclxuXHJcbiAgICAgICAgLy8gbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvLyB0aGlzLl92aWV3X2J0bk9rID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bk9rXCIpO1xyXG4gICAgICAgIC8vIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bkNhbmNlbFwiKTtcclxuICAgICAgICAvLyB0aGlzLl92aWV3X3RpdGxlID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2V4YW1wbGVNb2RhbExvbmdUaXRsZVwiKTtcclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWZ0ZXJWaWV3U2hvdyB0aXRsZTpcIisgdGhpcy50aXRsZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZ1bGxUaXRsZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmZ1bGxUaXRsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXNFbXB0eSh0aGlzLnRpdGxlKSl7XHJcbiAgICAgICAgICAgIGxldCBfdGl0bGUgPSBcIlwiO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mdWxsVGl0bGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50aXRsZTtcclxuICAgICAgICAgICAgfWVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiTm92IHZub3NcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgX3RpdGxlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKFwiVXJlZGlcIikrXCI6IFwiK3RoaXMudGl0bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzKXsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBfdGl0bGUgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoXCJQb2Ryb2Jub3N0aVwiKStcIjogXCIrdGhpcy50aXRsZTtcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImFmdGVyVmlld1Nob3cgX3RpdGxlOlwiKyBfdGl0bGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdmlld190aXRsZS5odG1sKF90aXRsZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRUaXRsZUFkZCA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNhZGRUaXRsZVwiKS52YWwoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld190aXRsZS5odG1sKGRlZmF1bHRUaXRsZUFkZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGVmYXVsdFRpdGxlRWRpdCA9ICQoXCJcIit0aGlzLmlkK1wiICo+ICNlZGl0VGl0bGVcIikudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdfdGl0bGUuaHRtbChkZWZhdWx0VGl0bGVFZGl0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy52aWV3U2hvd0NvbXBsZXRlKHNlbmRlciwgd2ZBY3Rpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gdGhpcy5fdmlld19idG5Pay5jbGljayhcclxuICAgICAgICAvLyAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vICAgICAgICAgX3RoaXMub25CdG5Pa0NsaWNrKHNlbmRlcik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLl92aWV3X2J0bkNhbmNlbC5jbGljayhcclxuICAgICAgICAvLyAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vICAgICAgICAgX3RoaXMub25CdG5DYW5jZWwoc2VuZGVyKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICk7ICAgICAgICBcclxuICAgIFxyXG4gICAgICAgIC8vdGhpcy5iaW5kVmlld0V2ZW50cygpO1xyXG5cclxuICAgICAgICB0aGlzLl9tb2RhbFBhcmVudCA9ICQoXCJib2R5XCIpLmhhc0NsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ByZXBhcmVWaWV3ID09IGZhbHNlKXtcclxuICAgICAgICAgICAgdGhpcy5fdmlld01vZGFsRnJhbWUubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICAgICAgc2V0TW9kYWxGb3JtWkluZGV4KHRoaXMuaWQpOyBcclxuICAgICAgICAgICAgc2V0Rmlyc3RGb3JtQ29udHJvbFRvRm9jdXModGhpcy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5hZnRlclZpZXdTaG93U3VjY2VzcyhzZW5kZXIpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJWaWV3U2hvd1N1Y2Nlc3Moc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKHRoaXMuaWQgKyBcIi5hZnRlclZpZXdTaG93U3VjY2VzcygpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2aWV3U2hvd0NvbXBsZXRlKHNlbmRlcjogYW55LCB3ZkFjdGlvbjogU2FvcFdmQWN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1Zyh0aGlzLmlkICsgXCIudmlld1Nob3dDb21wbGV0ZSgpXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2aWV3U2hvd25Db21wbGV0ZShzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcodGhpcy5pZCArIFwiLnZpZXdTaG93bkNvbXBsZXRlKClcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJpbmRWaWV3RXZlbnRzKHNlbmRlcjphbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYmluZFZpZXdFdmVudHNcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGRpdkZvcm0gPSB0aGlzLl92aWV3TW9kYWxGcmFtZS5maW5kKFwiZm9ybVwiKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl92aWV3X2J0bk9rID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bk9rXCIpO1xyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2J0bkNhbmNlbFwiKTtcclxuICAgICAgICB0aGlzLl92aWV3X3RpdGxlID0gJChcIlwiK3RoaXMuaWQrXCIgKj4gI2V4YW1wbGVNb2RhbExvbmdUaXRsZVwiKTsgICAgICAgIFxyXG5cclxuICAgICAgICB0aGlzLl92aWV3X2J0bk9rLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkJ0bk9rQ2xpY2soc2VuZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3ZpZXdfYnRuQ2FuY2VsLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vbkJ0bkNhbmNlbChzZW5kZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTsgIFxyXG5cclxuICAgICAgICBpZiAodGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LXN1Y2Nlc3NcIiwgdGhpcy5vblN1Y2NjZXNzQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vbkVycm9yQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LWVycm9yXCIsIHRoaXMub25FcnJvckNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZGl2Rm9ybS5hdHRyKFwiZGF0YS1hamF4LWZhaWx1cmVcIiwgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm9uKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkgeyAgICAgXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fbW9kYWxQYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuICAgICAgICAgICAgfSAgICBcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5vbignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbihlKSB7IFxyXG4gICAgICAgICAgICBfdGhpcy52aWV3U2hvd25Db21wbGV0ZShlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zYW9wRmxvYXRpbmdMYWJlbC5pbml0KCk7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbmRlckVycm9yc0Jhbm5lcihlcnJvcnM6RXJyb3JbXSk6U2FvcFNlcnZpY2VzQ29yZVJlc3BvbnNlIHtcclxuICAgICAgICBsZXQgcmVzdWx0OlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZTtcclxuICAgICAgICByZXN1bHQgPSB7cmVzcG9uc2U6U2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5lcnJvcixkYXRhOm51bGx9OyBcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KGVycm9ycyk7XHJcbiAgICAgICAgbGV0IF9kYXRhID0ge2pzb25JbnB1dDpqc29uRGF0YX07ICAgICAgICBcclxuICAgICAgICAvL1xyXG4gICAgICAgIGxldCBfc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgX3Nhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzID0gZnVuY3Rpb24gKHJlc3BvbnNlOlNhb3BTZXJ2aWNlc0NvcmVSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIF9zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiRXJyb3JzL1JlbmRlckVycm9yc0Jhbm5lclwiXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBfZGF0YVxyXG4gICAgICAgICAgICAsIGFzeW5jOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW5kZXJFcnJvcihlcnJNZXNzYWdlOnN0cmluZyk6dm9pZHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWpheC5hZnRlckVycm9yXCIpO1xyXG4gICAgICAgICAgICBsZXQgX2Vycm9yczpFcnJvcltdO1xyXG4gICAgICAgICAgICBfZXJyb3JzID0gW3tDb2RlOlwiXCIsTWVzc2FnZTplcnJNZXNzYWdlfV07ICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgX3BhcmVudFZpZXcgPSAkKHRoaXMuaWQpLnBhcmVudCgpO1xyXG4gICAgICAgICAgICBsZXQgX2Vycm9yQmFubmVySWQgPSB0aGlzLmlkK1wiRXJyb3JCYW5uZXJcIjtcclxuICAgICAgICAgICAgbGV0IF92aWV3X2Jhbm5lciA9IF9wYXJlbnRWaWV3LmZpbmQoX2Vycm9yQmFubmVySWQpO1xyXG4gICAgICAgICAgICBpZiAoIGlzVW5EZWZpbmVkKF92aWV3X2Jhbm5lcikgfHwgX3ZpZXdfYmFubmVyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBfcGFyZW50Vmlldy5hcHBlbmQoXCI8ZGl2IGlkPVwiICsgX2Vycm9yQmFubmVySWQucmVwbGFjZShcIiNcIixcIlwiKSArIFwiPjwvZGl2PlwiKTtcclxuICAgICAgICAgICAgICAgIF92aWV3X2Jhbm5lciA9IF9wYXJlbnRWaWV3LmZpbmQoX2Vycm9yQmFubmVySWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBfYmFubmVyUmVzdWx0ID0gdGhpcy5yZW5kZXJFcnJvcnNCYW5uZXIoX2Vycm9ycyk7XHJcbiAgICAgICAgICAgIF92aWV3X2Jhbm5lci5odG1sKF9iYW5uZXJSZXN1bHQuZGF0YS52aWV3Q29udGVudCk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaChlcnIpIHtcclxuICAgICAgICAgICAgYWxlcnQoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgIH0gIFxyXG4gICAgfVxyXG4gICAgLy9wdWJsaWMgbG9hZFZpZXdCb2R5KHdmQWN0aW9uOlNhb3BXZkFjdGlvbixkYXRhOmFueSxzZW5kZXI6YW55KTpTYW9wU2VydmljZXNDb3JlUmVzdWx0e1xyXG4gICAgcHVibGljIGxvYWRWaWV3Qm9keSh3ZkFjdGlvbjpTYW9wV2ZBY3Rpb24sZGF0YTphbnksc2VuZGVyOmFueSk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwibG9hZFZpZXdCb2R5XCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5iZWZvcmVWaWV3U2hvdyhzZW5kZXIpO1xyXG5cclxuICAgICAgICBpZiAod2ZBY3Rpb24gIT0gU2FvcFdmQWN0aW9uLndmYUN1c3RvbUh0bWwpIHtcclxuICAgICAgICAgICAgbGV0IF9hamF4QWN0aW9uID0gd2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCA/IHRoaXMuYWRkUmVjb3JkRW5kcG9pbnQgOiB0aGlzLmVkaXRSZWNvcmRFbmRwb2ludDtcclxuICAgICAgICAgICAgLy9fYWpheEFjdGlvbiA9IGdldFNpdGVBYnNvbHV0ZVVSTChfYWpheEFjdGlvbik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlc1BhcmFtcyA9IHthY3Rpb246X2FqYXhBY3Rpb24sZGF0YTpkYXRhLHR5cGU6XCJQT1NUXCJ9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLmFmdGVyU3VjY2VzcyA9IGZ1bmN0aW9uKF9hamF4UmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIGlmIChfYWpheFJlc3VsdC5yZXNwb25zZSA9PSBTYW9wU2VydmljZXNDb3JlUmVzdWx0LnN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhamF4LnN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChfYWpheFJlc3VsdC5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZnRlclZpZXdTaG93KHNlbmRlcix3ZkFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJhamF4LmVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoaXNVbkRlZmluZWQoX2FqYXhSZXN1bHQuZGF0YSkgJiYgaXNVbkRlZmluZWQoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpKSA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OICYmIF9hamF4UmVzdWx0LmRhdGEucmVzcG9uc2VKU09OLm1lc3NhZ2Upe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydGlmeS5lcnJvcihfYWpheFJlc3VsdC5kYXRhLnJlc3BvbnNlSlNPTi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfTtcclxuICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJFcnJvciA9IGZ1bmN0aW9uKF9hamF4UmVzdWx0KXtcclxuICAgIC8vIyMjXHJcbiAgICAgICAgICAgICAgICBpZiAoKGlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEpICYmIGlzVW5EZWZpbmVkKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKSkgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJJbnRlcm5hbCBlcnJvciFcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICAgICAgdGhpcy5zYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24odGhpcy5fc2VydmljZXNQYXJhbXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQoZGF0YSkgJiYgIWlzVW5EZWZpbmVkKGRhdGEuaHRtbCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChkYXRhLmh0bWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLmFmdGVyVmlld1Nob3coc2VuZGVyLHdmQWN0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdDogU2FvcFdmU3VibWl0UmVzdWx0KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5hZnRlckV4ZWN1dGVTdWNjZXNzXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3NDb21wbGV0ZShyZXN1bHQ6IFNhb3BXZlN1Ym1pdFJlc3VsdCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQub25TdWJtaXRTdWNjZXNzQ29tcGxldGVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0RXJyb3IocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uU3VibWl0RXJyb3JcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3VibWl0RmFpbHVyZShyZXN1bHQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQub25TdWJtaXRGYWlsdXJlXCIpO1xyXG4gICAgICAgIHZhciBzYW9wU2VydmljZXNDb3JlID0gbmV3IFNhb3BTZXJ2aWNlc0NvcmUoKTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLmhhbmRsZVN1Ym1pdEVycm9yKHJlc3VsdCk7XHJcbiAgICB9XHJcbiBcclxuICAgIHB1YmxpYyBvblN1Ym1pdFN1Y2Nlc3MocmVzdWx0OiBTYW9wV2ZTdWJtaXRSZXN1bHQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic3VibWl0Lm9uRXhlY3V0ZVN1Y2Nlc3NcIik7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzdWJtaXQuc3VjY2Vzc1wiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLm1vZGFsKCdoaWRlJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBqdXN0IGluIGNhc2U6IG9kc3RyYW5pLCDEjWUgamUgxaFlIHZlZG5vIHZpZG5vLCBhdnRvbWF0c2tvIHNlIG5lIHphcHJlIHZlZG5vIDooXHJcbiAgICAgICAgICAgICQoJy5tb2RhbC1iYWNrZHJvcCcpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKFwibW9kYWwtb3BlblwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuYWxlcnRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydGlmeS5tZXNzYWdlKHJlc3VsdC5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9ICBcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5yZWZyZXNoRGF0YSkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uU3VibWl0U3VjY2Vzc0NvbXBsZXRlKHJlc3VsdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInN1Ym1pdC5lcnJvclwiKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlbG9hZCB2aWV3IGZvcm1cIik7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEJvZHkuaHRtbChyZXN1bHQudmlld0NvbnRlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWZ0ZXJTdWJtaXRTdWNjZXNzKHJlc3VsdCk7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyBvbkRlbGV0ZVJlY29yZChkZWxldGVEYXRhOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIm9uRGVsZXRlUmVjb3JkXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZXNQYXJhbXMgPSB7YWN0aW9uOnRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQsZGF0YTpkZWxldGVEYXRhLHR5cGU6XCJQT1NUXCJ9O1xyXG5cclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJTdWNjZXNzID0gZnVuY3Rpb24oX2FqYXhSZXN1bHQpe1xyXG4gICAgICAgICAgICBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAgICAgICAgIGFsZXJ0aWZ5Lm1lc3NhZ2UoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuRGVmaW5lZChfdGhpcy5yZWZyZXNoRGF0YSkpe1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlZnJlc2hEYXRhKGRlbGV0ZURhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkuZXJyb3IoX2FqYXhSZXN1bHQuZGF0YS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih0aGlzLl9zZXJ2aWNlc1BhcmFtcyk7XHJcblxyXG4gICAgICAgIC8vIGxldCBfYWpheFJlc3VsdCA9IHRoaXMuc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHRoaXMuX3NlcnZpY2VzUGFyYW1zKTtcclxuICAgICAgICAvLyBpZiAoX2FqYXhSZXN1bHQucmVzcG9uc2UgPT0gU2FvcFNlcnZpY2VzQ29yZVJlc3VsdC5zdWNjZXNzKXtcclxuICAgICAgICAvLyAgICAgYWxlcnRpZnkubWVzc2FnZShfYWpheFJlc3VsdC5kYXRhLmFsZXJ0TWVzc2FnZSk7XHJcbiAgICAgICAgLy8gICAgIGlmICghaXNVbkRlZmluZWQodGhpcy5yZWZyZXNoRGF0YSkpe1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YShkZWxldGVEYXRhKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGFsZXJ0aWZ5LmVycm9yKF9hamF4UmVzdWx0LmRhdGEuYWxlcnRNZXNzYWdlKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gcmV0dXJuIF9hamF4UmVzdWx0LnJlc3BvbnNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoc2VuZGVyOmFueSk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcInJlZnJlc2hEYXRhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVSZWNvcmQodGl0bGU6c3RyaW5nLG1lc3NhZ2U6c3RyaW5nLGRlbGV0ZURhdGE6YW55KTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJkZWxldGVSZWNvcmQuYmVnaW5cIik7XHJcbiAgICAgICAgbGV0IHNhb3BNZXNzYWdlRGxnID0gbmV3IFNhb3BNZXNzYWdlRGxnKGRlbGV0ZURhdGEpICBcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5vblllcyA9IHRoaXMub25EZWxldGVSZWNvcmQuYmluZCh0aGlzKTtcclxuICAgICAgICBzYW9wTWVzc2FnZURsZy5TaG93KG1lc3NhZ2UsdGl0bGUsMSxbU2FvcE1zZ0RsZ0J1dHRvbi5tYlllcyxTYW9wTXNnRGxnQnV0dG9uLm1iTm9dKTtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiZGVsZXRlUmVjb3JkLmVuZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUmVjb3JkKGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiYWRkUmVjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgIGxldCBfcmVzdWx0ID0gdGhpcy5sb2FkVmlld0JvZHkoU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVkaXRSZWNvcmQoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlZGl0UmVjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFFZGl0UmVjb3JkLGRhdGEsc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVjb3JkRGV0YWlscyhkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcImVkaXRSZWNvcmRcIik7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5sb2FkVmlld0JvZHkoU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzLGRhdGEsc2VuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY3VzdG9uSHRtbEJvZHkoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJjdXN0b25IdG1sQm9keVwiKTtcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLmxvYWRWaWV3Qm9keShTYW9wV2ZBY3Rpb24ud2ZhQ3VzdG9tSHRtbCxkYXRhLHNlbmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHJlY29yZFByZXZpZXcoZGF0YTphbnksc2VuZGVyOmFueSA9IG51bGwpOnZvaWQge1xyXG4gICAgLy8gICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJlZGl0UmVjb3JkXCIpO1xyXG4gICAgLy8gICAgIHRoaXMubG9hZFZpZXdCb2R5KFNhb3BXZkFjdGlvbi53ZmFQcmVwYXJlVmlldyxkYXRhLHNlbmRlcik7XHJcbiAgICAvLyB9ICAgIFxyXG5cclxuICAgIHB1YmxpYyBzaG93Vmlld0Zvcm0od2ZBY3Rpb246U2FvcFdmQWN0aW9uLGRhdGE6YW55LHNlbmRlcjphbnkgPSBudWxsKTp2b2lke1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJzaG93Vmlld0Zvcm1cIik7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFBZGRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUVkaXRSZWNvcmQpIHtcclxuICAgICAgICAgICAgdGhpcy5lZGl0UmVjb3JkKGRhdGEsc2VuZGVyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHdmQWN0aW9uID09IFNhb3BXZkFjdGlvbi53ZmFSZWNvcmREZXN0YWlscykgeyAgXHJcbiAgICAgICAgICAgIHRoaXMucmVjb3JkRGV0YWlscyhkYXRhLHNlbmRlcik7ICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUN1c3RvbUh0bWwpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXN0b25IdG1sQm9keShkYXRhLHNlbmRlcik7ICAgICAgICAgIFxyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgIHRoaXMuU2V0VG9GdWxsU2NyZWVuKCk7ICAgICAgXHJcbiAgICB9ICBcclxuXHJcbiAgICBwdWJsaWMgcHJlcGFyZVZpZXdGb3JtKHdmQWN0aW9uOlNhb3BXZkFjdGlvbixkYXRhOmFueSxzZW5kZXI6YW55ID0gbnVsbCk6dm9pZHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwic2hvd1ZpZXdGb3JtXCIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVWaWV3ID0gdHJ1ZTtcclxuICAgICAgICBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYUFkZFJlY29yZCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFJlY29yZChkYXRhLHNlbmRlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhRWRpdFJlY29yZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRSZWNvcmQoZGF0YSxzZW5kZXIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2ZBY3Rpb24gPT0gU2FvcFdmQWN0aW9uLndmYVJlY29yZERlc3RhaWxzKSB7ICBcclxuICAgICAgICAgICAgdGhpcy5yZWNvcmREZXRhaWxzKGRhdGEsc2VuZGVyKTsgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIGlmICh3ZkFjdGlvbiA9PSBTYW9wV2ZBY3Rpb24ud2ZhQ3VzdG9tSHRtbCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1c3Rvbkh0bWxCb2R5KGRhdGEsc2VuZGVyKTsgICAgICAgICAgXHJcbiAgICAgICAgfSBcclxuXHJcbiAgICAgICAgdGhpcy5TZXRUb0Z1bGxTY3JlZW4oKTsgICAgICBcclxuICAgIH0gIFxyXG5cclxuICAgIHB1YmxpYyBTZXRUb0Z1bGxTY3JlZW4oKXtcclxuICAgICAgICBpZiAodGhpcy5mdWxsU2NyZWVuICl7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RhbEZyYW1lLmFkZENsYXNzKFwic2FvcC1tb2RhbC1mdWxsc2NyZWVuLWZvcm1cIik7XHJcbiAgICAgICAgICAgIGxldCBfZGlhbG9nRGl2ID0gdGhpcy5fdmlld01vZGFsRnJhbWUuZmluZChcIi5tb2RhbC1kaWFsb2dcIik7XHJcbiAgICAgICAgICAgIF9kaWFsb2dEaXYucmVtb3ZlQ2xhc3MoJ21vZGFsLWRpYWxvZy1jZW50ZXJlZCcpO1xyXG4gICAgICAgICAgICBfZGlhbG9nRGl2LmFkZENsYXNzKCdtb2RhbC1mdWxsc2NyZWVuJyk7XHJcbiAgICAgICAgICAgIF9kaWFsb2dEaXYucmVtb3ZlQXR0cignc3R5bGUnKTtcclxuICAgIFxyXG4gICAgICAgICAgICBsZXQgX2NvbnRlbnQgPSB0aGlzLl92aWV3TW9kYWxGcmFtZS5maW5kKFwiLm1vZGFsLWNvbnRlbnRcIik7XHJcbiAgICAgICAgICAgIF9jb250ZW50LnJlbW92ZUF0dHIoJ2NsYXNzJyk7XHJcbiAgICAgICAgICAgIF9jb250ZW50LmFkZENsYXNzKCdtb2RhbC1jb250ZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoRWxlbWVudERhdGEoaHRtbENvbnRlbnQ6c3RyaW5nLGVsZW1lbnRJZDpzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwicmVmcmVzaEVsZW1lbnREYXRhXCIpO1xyXG4gICAgICAgIGxldCBfZG9jdW1lbnQgPSAkKGh0bWxDb250ZW50KTtcclxuICAgICAgICBsZXQgX2NlbGwgPSBfZG9jdW1lbnQuZmluZChlbGVtZW50SWQpO1xyXG4gICAgICAgICQoZWxlbWVudElkKS5yZXBsYWNlV2l0aChfY2VsbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2xvc2VWaWV3Rm9ybSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5tb2RhbCgnaGlkZScpO1xyXG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZTogb2RzdHJhbmksIMSNZSBqZSDFoWUgdmVkbm8gdmlkbm8sIGF2dG9tYXRza28gc2UgbmUgemFwcmUgdmVkbm8gOihcclxuICAgICAgICAkKCcubW9kYWwtYmFja2Ryb3AnKS5yZW1vdmUoKTtcclxuICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKFwibW9kYWwtb3BlblwiKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93TW9kYWwoKTp2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcHJlcGFyZVZpZXcgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICB0aGlzLl92aWV3TW9kYWxGcmFtZS5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgICAgICBzZXRNb2RhbEZvcm1aSW5kZXgodGhpcy5pZCk7IFxyXG4gICAgICAgICAgICBzZXRGaXJzdEZvcm1Db250cm9sVG9Gb2N1cyh0aGlzLmlkKTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgIH1cclxuICAgXHJcbiAgICAvLyAgXHJcbn1cclxuIiwi77u/aW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSAnLi4vQ29tbW9uL3Nhb3AtY29tbW9uJztcclxuaW1wb3J0IHsgU2FvcFZpZXdGb3JtIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuaW1wb3J0IHsgU2FvcFdmQWN0aW9uIH0gZnJvbSBcIi4uL0NvcmUvc2FvcC12aWV3LWZvcm1cIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE1lYWxBcHBsaWNhdGlvbkJlbmVmaWNpYXJ5VmlldyBleHRlbmRzIFNhb3BWaWV3Rm9ybSB7XHJcbiAgICBwcml2YXRlIF9mb3JtSWQ6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc2lmcmFPdHJva2E6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHN1cGVyKHZpZXdJZCwgbGliTmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZnVsbFRpdGxlID0gXCJQcmlqYXZhIG5hIMWhb2xza28gcHJlaHJhbm9cIjtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRSZWNvcmRFbmRwb2ludCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5lZGl0UmVjb3JkRW5kcG9pbnQgPSBcIk1lYWxBcHBsaWNhdGlvbi9CZW5lZmljaWFyeVwiO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlUmVjb3JkRW5kcG9pbnQgPSBcIlwiO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBvbkJ0bk9rQ2xpY2soc2VuZGVyOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvbkJlbmVmaWNpYXJ5Vmlldy5vbkJ0bk9rQ2xpY2tcIik7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZENvZGUgPSAkKFwiI1NlbGVjdGVkQ29kZVwiKS52YWwoKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICB0aGlzLnNpZnJhT3Ryb2thID0gc2VsZWN0ZWRDb2RlO1xyXG4gICAgICAgIC8vdGhpcy5nb1N0cmFpZ2h0VG9Gb3JtKHNlbGVjdGVkQ29kZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tICcuLi9Db21tb24vc2FvcC1jb21tb24nO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmUnXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE1lYWxBcHBsaWNhdGlvbkZvcm1WaWV3IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uRm9ybVZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uRm9ybVZpZXcuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgd2luZG93Lm9ucmVzaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRUb3AoKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3Q29udHJvbHMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25Gb3JtVmlldy5pbml0Vmlld0NvbnRyb2xzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgJCgnI2J0bk5leHQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5zdWJtaXRGb3JtKGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjYnRuU3VibWl0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgX3RoaXMuc3VibWl0Rm9ybSh0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKCcjYnRuQ2FuY2VsJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgX3RoaXMuZ29Ub0xpc3QoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoRm9ybShzaWZyYU90cm9rYTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25Gb3JtVmlldy5yZWZyZXNoRm9ybVwiKTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uVmlldy5FeGVjdXRlQWN0aW9uLk1lYWxBcHBsaWNhdGlvbi9Gb3JtLmFmdGVyRG9uZVwiKTtcclxuICAgICAgICAgICAgJChcIiNtZWFsQXBwbGljYXRpb25EaXZcIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLnNldFRvcCgpO1xyXG4gICAgICAgICAgICBfdGhpcy5pbml0Vmlld0NvbnRyb2xzKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiTWVhbEFwcGxpY2F0aW9uL0Zvcm1cIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIHNpZnJhT3Ryb2thOiBzaWZyYU90cm9rYVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjbWVhbEFwcGxpY2F0aW9uTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEZpbGxlZEZvcm0oaWRQcmlqYXZlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvbkZvcm1WaWV3LnJlZnJlc2hGb3JtXCIpO1xyXG5cclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25WaWV3LkV4ZWN1dGVBY3Rpb24uTWVhbEFwcGxpY2F0aW9uL0Zvcm0uYWZ0ZXJEb25lXCIpO1xyXG4gICAgICAgICAgICAkKFwiI21lYWxBcHBsaWNhdGlvbkRpdlwiKS5odG1sKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgX3RoaXMuc2V0VG9wKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmluaXRWaWV3Q29udHJvbHMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJNZWFsQXBwbGljYXRpb24vRmlsbGVkRm9ybVwiXHJcbiAgICAgICAgICAgICwgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgaWRQcmlqYXZlOiBpZFByaWphdmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI21lYWxBcHBsaWNhdGlvbkxvYWRpbmdcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN1Ym1pdEZvcm0oc2tpcFBydmlldzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uRm9ybVZpZXcuc3VibWl0Rm9ybVwiKTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGRhdGEgPSAkKCdmb3JtJykuc2VyaWFsaXplKCk7IC8vIG9yIHVzZSB0aGUgaWQgb2YgdGhlIGZvcm0gaXMgeW91IGhhdmUgZ2l2ZW4gaXQgb25lXHJcblxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uVmlldy5FeGVjdXRlQWN0aW9uLk1lYWxBcHBsaWNhdGlvbi9TdWJtaXRGb3JtLmFmdGVyRG9uZVwiKTtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpZFByaWphdmUgPSByZXNwb25zZS52aWV3Q29udGVudDtcclxuICAgICAgICAgICAgICAgIGlmIChza2lwUHJ2aWV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3VibWl0TWVhbEFwcGxpY2F0aW9uKGlkUHJpamF2ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5nb1RvUHJldmlldyhpZFByaWphdmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChcIiNtZWFsQXBwbGljYXRpb25EaXZcIikuaHRtbChyZXNwb25zZS52aWV3Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRUb3AoKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmluaXRWaWV3Q29udHJvbHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIk1lYWxBcHBsaWNhdGlvbi9Gb3JtU3VibWl0XCJcclxuICAgICAgICAgICAgLCBkYXRhOiBkYXRhXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI21lYWxBcHBsaWNhdGlvbkxvYWRpbmdcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdvVG9QcmV2aWV3KGlkUHJpamF2ZTogYmlnaW50KTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25Gb3JtVmlldy5nb1RvUHJldmlld1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBnb1RvTGlzdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvbkZvcm1WaWV3LmdvVG9MaXN0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRvcCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvbkZvcm1WaWV3LnNldFRvcFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdWJtaXRNZWFsQXBwbGljYXRpb24oaWRQcmlqYXZlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvbkZvcm1WaWV3LnN1Ym1pdE1lYWxBcHBsaWNhdGlvblwiKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbiIsIu+7v2ltcG9ydCB7IGdsb2JhbCB9IGZyb20gJy4uL0NvbW1vbi9zYW9wLWNvbW1vbic7XHJcbmltcG9ydCB7IFNhb3BXZkFjdGlvbiB9IGZyb20gXCIuLi9Db3JlL3Nhb3Atdmlldy1mb3JtXCI7XHJcbmltcG9ydCB7IFNhb3BTZXJ2aWNlc0NvcmUgfSBmcm9tICcuLi9Db3JlL3Nhb3Atc2VydmljZXMtY29yZSdcclxuaW1wb3J0IHsgU2FvcE1lYWxBcHBsaWNhdGlvbkJlbmVmaWNpYXJ5VmlldyB9IGZyb20gXCIuL3Nhb3AtbWVhbC1hcHBsaWNhdGlvbi1iZW5lZmljaWFyeS12aWV3XCI7XHJcbmltcG9ydCB7IHBhcmFtIH0gZnJvbSAnanF1ZXJ5JztcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTWVhbEFwcGxpY2F0aW9uTGlzdFZpZXcge1xyXG4gICAgcHJpdmF0ZSBfbGliTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgX2JlbmVmaWNpYXJ5Rm9ybTogU2FvcE1lYWxBcHBsaWNhdGlvbkJlbmVmaWNpYXJ5VmlldztcclxuICAgIHB1YmxpYyBzZWxlY3RlZENvZGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgaWRQcmlqYXZlOiBzdHJpbmc7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZpZXdJZDogc3RyaW5nLCBsaWJOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25MaXN0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbGliTmFtZSA9IGxpYk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25MaXN0Vmlldy5pbml0Vmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fYmVuZWZpY2lhcnlGb3JtID0gbmV3IFNhb3BNZWFsQXBwbGljYXRpb25CZW5lZmljaWFyeVZpZXcoXCIjbWVhbEFwcGxpY2F0aW9uVmlldzAwMVwiLCB0aGlzLl9saWJOYW1lKTtcclxuICAgICAgICB0aGlzLl9iZW5lZmljaWFyeUZvcm0ub25CdG5Pa0NsaWNrID0gdGhpcy5vbkJ0bk9rQ2xpY2tFeC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHdpbmRvdy5vbnJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2V0VG9wKCk7XHJcbiAgICAgICAgICAgIF90aGlzLnNldFRhYmxlSGVpZ2h0KCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoTGlzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3Q29udHJvbHMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25MaXN0Vmlldy5pbml0Vmlld0NvbnRyb2xzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgJCgnI2J0bk5ldycpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICgkKFwiI1N0ZXZpbG9PdHJva1wiKS52YWwoKSA+IDEpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9iZW5lZmljaWFyeUZvcm0uc2hvd1ZpZXdGb3JtKFNhb3BXZkFjdGlvbi53ZmFFZGl0UmVjb3JkLCB7fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRDb2RlID0gJChcIiNQcnZpT3Ryb2tcIikudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmdvVG9Gb3JtKHNlbGVjdGVkQ29kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQoJy5idG5Eb2N1bWVudCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmlkUHJpamF2ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKFwiZGF0YS1wcmlqYXZhLWlkXCIpO1xyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoTGlzdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKCcuYnRuRG9jdW1lbnREb3dubG9hZCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmlkUHJpamF2ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKFwiZGF0YS1wcmlqYXZhLWlkXCIpO1xyXG4gICAgICAgICAgICBfdGhpcy5kb3dubG9hZERvY3VtZW50KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaExpc3QocGFyYW1zOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25MaXN0Vmlldy5yZWZyZXNoTGlzdFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgaWRQcmlqYXZlIDogdGhpcy5pZFByaWphdmVcclxuICAgICAgICB9XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25MaXN0Vmlldy5FeGVjdXRlQWN0aW9uLk1lYWxBcHBsaWNhdGlvbi9MaXN0LmFmdGVyRG9uZVwiKTtcclxuICAgICAgICAgICAgJChcIiNtZWFsQXBwbGljYXRpb25EaXZcIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLnNldFRvcCgpO1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRUYWJsZUhlaWdodCgpO1xyXG4gICAgICAgICAgICBfdGhpcy5pbml0Vmlld0NvbnRyb2xzKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiTWVhbEFwcGxpY2F0aW9uL0xpc3RcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHBhcmFtc1xyXG4gICAgICAgICAgICAsIHR5cGU6IFwiR0VUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI21lYWxBcHBsaWNhdGlvbkxvYWRpbmdcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkRG9jdW1lbnQocGFyYW1zOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25MaXN0Vmlldy5kb3dubG9hZERvY3VtZW50XCIpO1xyXG5cclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICBpZFByaWphdmU6IHRoaXMuaWRQcmlqYXZlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uTGlzdFZpZXcuRXhlY3V0ZUFjdGlvbi5NZWFsQXBwbGljYXRpb24vRG93bmxvYWREb2MuYWZ0ZXJEb25lXCIpO1xyXG4gICAgICAgICAgICAvLyQoXCIjbWVhbEFwcGxpY2F0aW9uRGl2XCIpLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAvL190aGlzLnNldFRvcCgpO1xyXG4gICAgICAgICAgICAvL190aGlzLnNldFRhYmxlSGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIC8vX3RoaXMuaW5pdFZpZXdDb250cm9scygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5FeGVjdXRlQWN0aW9uKHtcclxuICAgICAgICAgICAgYWN0aW9uOiBcIk1lYWxBcHBsaWNhdGlvbi9Eb3dubG9hZERvY1wiXHJcbiAgICAgICAgICAgICwgZGF0YTogcGFyYW1zXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjbWVhbEFwcGxpY2F0aW9uTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ29Ub0Zvcm0oc2lmcmFPdHJva2E6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uTGlzdFZpZXcuZ29Ub0Zvcm1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VG9wKCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uTGlzdFZpZXcuc2V0VG9wXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRhYmxlSGVpZ2h0KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uVmlldy5zZXRUYWJsZUhlaWdodFwiKTtcclxuICAgICAgICB2YXIgX2hlaWdodDEgPSAkKCdoZWFkZXInKS5oZWlnaHQoKTtcclxuICAgICAgICB2YXIgX2hlaWdodDIgPSAkKCcjbWVhbEFwcGxpY2F0aW9uRGl2MScpLmhlaWdodCgpO1xyXG4gICAgICAgIHZhciByZW1haW5pbmdfaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gX2hlaWdodDEgLSBfaGVpZ2h0MiAtIDY5O1xyXG4gICAgICAgICQoJyNtZWFsQXBwbGljYXRpb25MaXN0JykuY3NzKFwiaGVpZ2h0XCIsIHJlbWFpbmluZ19oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkJ0bk9rQ2xpY2tFeChzZW5kZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uTGlzdFZpZXcub25CdG5Pa0NsaWNrRXhcIik7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZENvZGUgPSAkKFwiI1NlbGVjdGVkQ29kZVwiKS52YWwoKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICB0aGlzLmdvVG9Gb3JtKHNlbGVjdGVkQ29kZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tICcuLi9Db21tb24vc2FvcC1jb21tb24nO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmUnXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcE1lYWxBcHBsaWNhdGlvblByZXZpZXdWaWV3IHtcclxuICAgIHByaXZhdGUgX2xpYk5hbWU6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2aWV3SWQ6IHN0cmluZywgbGliTmFtZTogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uUHJldmlld1ZpZXdcIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2xpYk5hbWUgPSBsaWJOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3KCkge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uUHJldmlld1ZpZXcuaW5pdFZpZXdcIik7XHJcblxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgd2luZG93Lm9ucmVzaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5zZXRUb3AoKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRWaWV3Q29udHJvbHMoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25QcmV2aWV3Vmlldy5pbml0Vmlld0NvbnRyb2xzXCIpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICQoJyNidG5TdWJtaXQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBsZXQgaWRQcmlqYXZlID0gJChcIiNJRFByaWphdmVcIikudmFsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgX3RoaXMuc3VibWl0TWVhbEFwcGxpY2F0aW9uKGlkUHJpamF2ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnI2J0blByZXZpb3VzJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgbGV0IGlkUHJpamF2ZSA9ICQoXCIjSURQcmlqYXZlXCIpLnZhbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIF90aGlzLmdvVG9GaWxsZWRGb3JtKGlkUHJpamF2ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCgnI2J0bkNhbmNlbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmdvVG9MaXN0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFByZXZpZXcoaWRQcmlqYXZlOiBiaWdpbnQpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvblByZXZpZXdWaWV3LnJlZnJlc2hGb3JtXCIpO1xyXG5cclxuICAgICAgICBsZXQgc2FvcFNlcnZpY2VzQ29yZSA9IG5ldyBTYW9wU2VydmljZXNDb3JlKCk7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgc2FvcFNlcnZpY2VzQ29yZS5hZnRlckRvbmUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25QcmV2aWV3Vmlldy5FeGVjdXRlQWN0aW9uLk1lYWxBcHBsaWNhdGlvbi9QcmV2aWV3LmFmdGVyRG9uZVwiKTtcclxuICAgICAgICAgICAgJChcIiNtZWFsQXBwbGljYXRpb25EaXZcIikuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIF90aGlzLnNldFRvcCgpO1xyXG4gICAgICAgICAgICBfdGhpcy5pbml0Vmlld0NvbnRyb2xzKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiTWVhbEFwcGxpY2F0aW9uL1ByZXZpZXdcIlxyXG4gICAgICAgICAgICAsIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIElEUHJpamF2ZTogaWRQcmlqYXZlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLCB0eXBlOiBcIkdFVFwiXHJcbiAgICAgICAgICAgICwgc3Bpbm5lckRpdklkOiBcIiNtZWFsQXBwbGljYXRpb25Mb2FkaW5nXCJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnb1RvTGlzdCgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvblByZXZpZXdWaWV3LmdvVG9MaXN0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdvVG9GaWxsZWRGb3JtKGlkUHJpamF2ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25QcmV2aWV3Vmlldy5nb1RvRm9ybVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUb3AoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25QcmV2aWV3Vmlldy5zZXRUb3BcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3VibWl0TWVhbEFwcGxpY2F0aW9uKGlkUHJpamF2ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25QcmV2aWV3Vmlldy5zdWJtaXRNZWFsQXBwbGljYXRpb25cIik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu79pbXBvcnQgeyBnbG9iYWwgfSBmcm9tICcuLi9Db21tb24vc2FvcC1jb21tb24nO1xyXG5pbXBvcnQgeyBTYW9wV2ZBY3Rpb24gfSBmcm9tIFwiLi4vQ29yZS9zYW9wLXZpZXctZm9ybVwiO1xyXG5pbXBvcnQgeyBTYW9wU2VydmljZXNDb3JlIH0gZnJvbSAnLi4vQ29yZS9zYW9wLXNlcnZpY2VzLWNvcmUnXHJcbmltcG9ydCB7IFNhb3BNZWFsQXBwbGljYXRpb25MaXN0VmlldyB9IGZyb20gXCIuL3Nhb3AtbWVhbC1hcHBsaWNhdGlvbi1saXN0LXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcE1lYWxBcHBsaWNhdGlvbkJlbmVmaWNpYXJ5VmlldyB9IGZyb20gXCIuL3Nhb3AtbWVhbC1hcHBsaWNhdGlvbi1iZW5lZmljaWFyeS12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BNZWFsQXBwbGljYXRpb25Gb3JtVmlldyB9IGZyb20gXCIuL3Nhb3AtbWVhbC1hcHBsaWNhdGlvbi1mb3JtLXZpZXdcIjtcclxuaW1wb3J0IHsgU2FvcE1lYWxBcHBsaWNhdGlvblByZXZpZXdWaWV3IH0gZnJvbSBcIi4vc2FvcC1tZWFsLWFwcGxpY2F0aW9uLXByZXZpZXctdmlld1wiOyBcclxuXHJcbmV4cG9ydCBjbGFzcyBTYW9wTWVhbEFwcGxpY2F0aW9uVmlldyB7XHJcbiAgICBwcml2YXRlIF9saWJOYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgLy9lZGl0IGZvcm1hXHJcbiAgICBwcml2YXRlIF9saXN0VmlldzogU2FvcE1lYWxBcHBsaWNhdGlvbkxpc3RWaWV3O1xyXG4gICAgcHJpdmF0ZSBfZm9ybVZpZXc6IFNhb3BNZWFsQXBwbGljYXRpb25Gb3JtVmlldztcclxuICAgIHByaXZhdGUgX3ByZXZpZXdWaWV3OiBTYW9wTWVhbEFwcGxpY2F0aW9uUHJldmlld1ZpZXc7XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOiBzdHJpbmcsIGxpYk5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvblZpZXdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFZpZXcoKSB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25WaWV3LmluaXRWaWV3XCIpO1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIF90aGlzLnNldFRvcCgpO1xyXG4gICAgICAgIHdpbmRvdy5vbnJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgX3RoaXMuc2V0VG9wKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5nb1RvTGlzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdvVG9MaXN0KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uVmlldy5nb1RvTGlzdFwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbGlzdFZpZXcgPSBuZXcgU2FvcE1lYWxBcHBsaWNhdGlvbkxpc3RWaWV3KFwiI21lYWxBcHBsaWNhdGlvblZpZXdMaXN0XCIsIHRoaXMuX2xpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuX2xpc3RWaWV3LnNldFRvcCA9IHRoaXMuc2V0VG9wLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbGlzdFZpZXcuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLl9saXN0Vmlldy5nb1RvRm9ybSA9IHRoaXMuZ29Ub0Zvcm0uYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBnb1RvRm9ybShzaWZyYU90cm9rYTogc3RyaW5nKTogdm9pZCAge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uVmlldy5nb1RvRm9ybVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZm9ybVZpZXcgPSBuZXcgU2FvcE1lYWxBcHBsaWNhdGlvbkZvcm1WaWV3KFwiI21lYWxBcHBsaWNhdGlvblZpZXdGb3JtXCIsIHRoaXMuX2xpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuX2Zvcm1WaWV3LnNldFRvcCA9IHRoaXMuc2V0VG9wLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fZm9ybVZpZXcuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLl9mb3JtVmlldy5nb1RvTGlzdCA9IHRoaXMuZ29Ub0xpc3QuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9mb3JtVmlldy5nb1RvUHJldmlldyA9IHRoaXMuZ29Ub1ByZXZpZXcuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9mb3JtVmlldy5zdWJtaXRNZWFsQXBwbGljYXRpb24gPSB0aGlzLnN1Ym1pdE1lYWxBcHBsaWNhdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2Zvcm1WaWV3LnJlZnJlc2hGb3JtKHNpZnJhT3Ryb2thKTtcclxuICAgIH1cclxuXHJcbiAgICBnb1RvUHJldmlldyhpZFByaWphdmU6IGJpZ2ludCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uVmlldy5nb1RvUHJldmlld1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJldmlld1ZpZXcgPSBuZXcgU2FvcE1lYWxBcHBsaWNhdGlvblByZXZpZXdWaWV3KFwiI21lYWxBcHBsaWNhdGlvblZpZXdQcmV2aWV3XCIsIHRoaXMuX2xpYk5hbWUpO1xyXG4gICAgICAgIHRoaXMuX3ByZXZpZXdWaWV3LnNldFRvcCA9IHRoaXMuc2V0VG9wLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fcHJldmlld1ZpZXcuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLl9wcmV2aWV3Vmlldy5nb1RvTGlzdCA9IHRoaXMuZ29Ub0xpc3QuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9wcmV2aWV3Vmlldy5nb1RvRmlsbGVkRm9ybSA9IHRoaXMuZ29Ub0ZpbGxlZEZvcm0uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9wcmV2aWV3Vmlldy5zdWJtaXRNZWFsQXBwbGljYXRpb24gPSB0aGlzLnN1Ym1pdE1lYWxBcHBsaWNhdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX3ByZXZpZXdWaWV3LnJlZnJlc2hQcmV2aWV3KGlkUHJpamF2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ29Ub0ZpbGxlZEZvcm0oaWRQcmlqYXZlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvblZpZXcuZ29Ub0ZpbGxlZEZvcm1cIik7XHJcblxyXG4gICAgICAgIHRoaXMuX2Zvcm1WaWV3ID0gbmV3IFNhb3BNZWFsQXBwbGljYXRpb25Gb3JtVmlldyhcIiNtZWFsQXBwbGljYXRpb25WaWV3Rm9ybVwiLCB0aGlzLl9saWJOYW1lKTtcclxuICAgICAgICB0aGlzLl9mb3JtVmlldy5zZXRUb3AgPSB0aGlzLnNldFRvcC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2Zvcm1WaWV3LmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5fZm9ybVZpZXcuc3VibWl0TWVhbEFwcGxpY2F0aW9uID0gdGhpcy5zdWJtaXRNZWFsQXBwbGljYXRpb24uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9mb3JtVmlldy5nb1RvTGlzdCA9IHRoaXMuZ29Ub0xpc3QuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9mb3JtVmlldy5nb1RvUHJldmlldyA9IHRoaXMuZ29Ub1ByZXZpZXcuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9mb3JtVmlldy5yZWZyZXNoRmlsbGVkRm9ybShpZFByaWphdmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRvcCgpIHtcclxuICAgICAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiU2FvcE1lYWxBcHBsaWNhdGlvblZpZXcuc2V0VG9wXCIpO1xyXG4gICAgICAgIHZhciBfdG9wID0gJCgnaGVhZGVyJykuaGVpZ2h0KCk7XHJcbiAgICAgICAgJCgnLmFwcGxpY2F0aW9uLWNvbnRhaW5lcicpLmNzcyhcInRvcFwiLCBfdG9wKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FrY2lqZVxyXG4gICAgc3VibWl0TWVhbEFwcGxpY2F0aW9uKGlkUHJpamF2ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BNZWFsQXBwbGljYXRpb25WaWV3LnN1Ym1pdE1lYWxBcHBsaWNhdGlvblwiKTtcclxuXHJcbiAgICAgICAgbGV0IHNhb3BTZXJ2aWNlc0NvcmUgPSBuZXcgU2FvcFNlcnZpY2VzQ29yZSgpO1xyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHNhb3BTZXJ2aWNlc0NvcmUuYWZ0ZXJEb25lID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wTWVhbEFwcGxpY2F0aW9uVmlldy5FeGVjdXRlQWN0aW9uLk1lYWxBcHBsaWNhdGlvbi9Eb2N1bWVudFN1Ym1pdC5hZnRlckRvbmVcIik7XHJcbiAgICAgICAgICAgIF90aGlzLmdvVG9MaXN0KCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzYW9wU2VydmljZXNDb3JlLkV4ZWN1dGVBY3Rpb24oe1xyXG4gICAgICAgICAgICBhY3Rpb246IFwiTWVhbEFwcGxpY2F0aW9uL0RvY3VtZW50U3VibWl0XCJcclxuICAgICAgICAgICAgLCBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICBJRFByaWphdmU6IGlkUHJpamF2ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICwgdHlwZTogXCJHRVRcIlxyXG4gICAgICAgICAgICAsIHNwaW5uZXJEaXZJZDogXCIjbWVhbEFwcGxpY2F0aW9uTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL2FsZXJ0aWZ5L2luZGV4LmQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQHR5cGVzL3Nhb3BfY29yZS9zYW9wQ29tbW9uU2VydmljZXMuZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvc2FvcF9jb3JlL3Nhb3BDb3JlU2VydmljZXMuZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9AdHlwZXMvc2FvcF9jb3JlL3Nhb3BUcmFuc2xhdGlvbnNTZXJ2aWNlcy5kLnRzXCIgLz5cclxuaW1wb3J0ICogYXMgU2FvcFZpZXdGb3JtU2VydmljZXMgZnJvbSBcIi4uL0B0eXBlcy9zYW9wX2NvcmUvc2FvcFZpZXdGb3JtU2VydmljZXNcIlxyXG5pbXBvcnQgeyBTYW9wQ2hhbmdlUHdkVmlldyB9IGZyb20gJy4uL0FjY291bnQvc2FvcC1jaGFuZ2UtcHdkLXZpZXcnXHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFNldHRpbmdzVmlldyB7IFxyXG4gICAgLy9cclxuICAgIHByaXZhdGUgX3Nhb3BTZXJ2aWNlc0NvcmUgOiBpY1Nhb3BDb3JlLlNhb3BTZXJ2aWNlc0NvcmVFeDtcclxuICAgIHByaXZhdGUgX3Nhb3BDaGFuZ2VQd2RWaWV3IDogU2FvcENoYW5nZVB3ZFZpZXc7XHJcblxyXG4gICAgY29uc3RydWN0b3Iodmlld0lkOnN0cmluZyxsaWJOYW1lOnN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlID0gbmV3IGljU2FvcENvcmUuU2FvcFNlcnZpY2VzQ29yZUV4KCk7IFxyXG4gICAgICAgIHRoaXMuX3Nhb3BDaGFuZ2VQd2RWaWV3ID0gbmV3IFNhb3BDaGFuZ2VQd2RWaWV3KHZpZXdJZCxsaWJOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0VmlldygpOiB2b2lkIHtcclxuICAgICAgICBpY1Nhb3BDb3JlLmdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2V0dGluZ3NWaWV3LmluaXRWaWV3XCIpO1xyXG5cclxuICAgICAgICB0aGlzLmJpbmRWaWV3RXZlbnRzKCk7ICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5jaGVja1Bhc3N3b3JkU3RyZW5ndGgoKTtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBiaW5kVmlld0V2ZW50cygpe1xyXG4gICAgICAgIGljU2FvcENvcmUuZ2xvYmFsLkNvbnNvbGVMb2dEZWd1ZyhcIlNhb3BTZXR0aW5nc1ZpZXcuYmluZEdyaWRFdmVudHNcIik7XHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvL1xyXG4gICAgICAgICQoXCIjc2VsZWN0SmV6aWtcIikub2ZmKFwiY2hhbmdlXCIpO1xyXG4gICAgICAgICQoXCIjc2VsZWN0SmV6aWtcIikub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgX3RoaXMudnJzdGFKZXppa2FDaGFuZ2VkKCk7XHJcbiAgICAgICAgfSk7ICBcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9zYW9wQ2hhbmdlUHdkVmlldy5iaW5kVmlld0V2ZW50cygpOyAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHZyc3RhSmV6aWthQ2hhbmdlZCgpOiB2b2lkIHtcclxuICAgICAgICBpY1Nhb3BDb3JlLmdsb2JhbC5Db25zb2xlTG9nRGVndWcoXCJTYW9wU2V0dGluZ3NWaWV3LnZyc3RhSmV6aWthQ2hhbmdlZFwiKTtcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBsZXQgdnJzdGFKZXppa2FFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdEplemlrJykgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IGplemlrID0gdnJzdGFKZXppa2FFbGVtZW50Lm9wdGlvbnNbdnJzdGFKZXppa2FFbGVtZW50LnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xyXG5cclxuICAgICAgICBsZXQgaWRXZWJPcGVyYXRlcmphID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdJRFdlYk9wZXJhdGVyamEnKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSB7IGlkd2Vib3BlcmF0ZXJqYTogaWRXZWJPcGVyYXRlcmphLCBqZXppazogamV6aWt9O1xyXG5cclxuICAgICAgICB0aGlzLl9zYW9wU2VydmljZXNDb3JlLmFmdGVyRG9uZSA9IGZ1bmN0aW9uIChyZXNwb25zZTpTYW9wVmlld0Zvcm1TZXJ2aWNlcy5TYW9wV2ZTdWJtaXRSZXN1bHQpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFsZXJ0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgYWxlcnRpZnkubWVzc2FnZShyZXNwb25zZS5hbGVydE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uudmlld0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjbWVzc2FnZUJhbm5lclwiKS5odG1sKHJlc3BvbnNlLnZpZXdDb250ZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIC8vcmVsb2FkIGN1cnJlbnQgcGFnZSBcclxuICAgICAgICAgICAgICAgIGljU2FvcENvcmUuZ2xvYmFsLnJlbG9kZUN1cnJlbnRQYWdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI3NlbGVjdEplemlrXCIpLnZhbChyZXNwb25zZS5qZXppayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX3Nhb3BTZXJ2aWNlc0NvcmUuRXhlY3V0ZUFjdGlvbih7XHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJTZXR0aW5ncy9VcGRhdGVTYW9wd2ViT3BlcmF0ZXJqaUplemlrXCJcclxuICAgICAgICAgICAgLCBkYXRhOiBkYXRhXHJcbiAgICAgICAgICAgICwgdHlwZTogXCJQT1NUXCJcclxuICAgICAgICAgICAgLCBzcGlubmVyRGl2SWQ6IFwiI2Fic2VuY2VDb25maXJtYXRpb25QZW5kaW5nTG9hZGluZ1wiXHJcbiAgICAgICAgfSk7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2hlY2tQYXNzd29yZFN0cmVuZ3RoKCk6dm9pZHtcclxuICAgICAgICB0aGlzLl9zYW9wQ2hhbmdlUHdkVmlldy5jaGVja1Bhc3N3b3JkU3RyZW5ndGgoKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG4iLCLvu78vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9AdHlwZXMvc2FvcF9jb3JlL3Nhb3BDb21tb25TZXJ2aWNlcy5kLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vQHR5cGVzL3Nhb3BfY29yZS9zYW9wVHJhbnNsYXRpb25zU2VydmljZXMuZC50c1wiIC8+XHJcbi8vaW1wb3J0ICogYXMgaWNTYW9wQ29yZSBmcm9tIFwiLi9AdHlwZXMvc2FvcF9jb3JlL2luZGV4XCJcclxuLy9pbXBvcnQgKiBhcyBpY1Nhb3BDb3JlIGZyb20gJy4vQHR5cGVzL3Nhb3BfY29yZS9pbmRleCdcclxuLy9pbXBvcnQgKiBhcyBzYW9wQ29tbW9uU2VydmljZXMgZnJvbSBcIi4vQHR5cGVzL3Nhb3BfY29yZS9zYW9wQ29tbW9uU2VydmljZXNcIlxyXG5cclxuaW1wb3J0IHsgZ2xvYmFsIH0gZnJvbSAnLi9Db21tb24vc2FvcC1jb21tb24nO1xyXG5pbXBvcnQgeyBTYW9wSW5wdXRNYXNrIH0gZnJvbSBcIi4vQ29tcG9uZW50cy9zYW9wLWlucHV0bWFza1wiO1xyXG5pbXBvcnQgeyBTYW9wU2V0dGluZ3NWaWV3IH0gZnJvbSBcIi4vU2V0dGluZ3Mvc2FvcC1zZXR0aW5ncy12aWV3XCI7XHJcbmltcG9ydCB7IFNhb3BDaGFuZ2VQd2RWaWV3IH0gZnJvbSAnLi9BY2NvdW50L3Nhb3AtY2hhbmdlLXB3ZC12aWV3JztcclxuaW1wb3J0IHsgU2FvcFZpZXdTcGlubmVyIH0gZnJvbSAnLi9Db21wb25lbnRzL3Nhb3Atdmlldy1zcGlubmVyJztcclxuaW1wb3J0IHsgU2FvcE1lYWxBcHBsaWNhdGlvblZpZXcgfSBmcm9tICcuL01lYWxBcHBsaWNhdGlvbi9zYW9wLW1lYWwtYXBwbGljYXRpb24tdmlldyc7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlY2hvKCk6IHZvaWQge1xyXG4gICAgaWNTYW9wQ29yZS5lY2hvVGVzdChcInRlc3RcIik7XHJcbn1cclxuXHJcbi8vIGV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbXBhdGliaWxpdHkoKTogYm9vbGVhbiB7XHJcbi8vICAgICByZXR1cm4gaWNTYW9wQ29yZS5jaGVja0NvbXBhdGliaWxpdHkoKTtcclxuLy8gfVxyXG5cclxuLy8gZXhwb3J0IGZ1bmN0aW9uIGluaXRDbGllbnRMb2dNb2RlVmFsdWUoKTp2b2lkIHtcclxuLy8gICAgIGljU2FvcENvcmUuaW5pdENsaWVudExvZ01vZGVWYWx1ZSgpO1xyXG4vLyB9XHJcblxyXG4vLyBleHBvcnQgZnVuY3Rpb24gaW5pdFNpdGVCYXNlVXJsVmFsdWUoKTp2b2lkIHtcclxuLy8gICAgIGljU2FvcENvcmUuaW5pdFNpdGVCYXNlVXJsVmFsdWUoKTtcclxuLy8gfVxyXG5cclxuLy8gZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVTaXRlSlMoKTp2b2lkIHtcclxuLy8gICAgIGljU2FvcENvcmUuaW5pdGlhbGl6ZVNpdGVKUygpO1xyXG4vLyB9XHJcblxyXG4vLyBleHBvcnQgZnVuY3Rpb24gc2V0Rmlyc3RDb250cm9sVG9Gb2N1cyhmb3JtSWQ6IHN0cmluZyk6dm9pZCB7XHJcbi8vICAgICBpY1Nhb3BDb3JlLnNldEZpcnN0Q29udHJvbFRvRm9jdXMoZm9ybUlkKTtcclxuLy8gfVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDbGllbnRMb2dNb2RlVmFsdWUoKSB7XHJcbiAgICBnbG9iYWwuZGVidWdNb2RlID0gZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRTaXRlQmFzZVVybFZhbHVlKCkge1xyXG4gICAgZ2xvYmFsLnNpdGVCYXNlVXJsID0gZ2xvYmFsLmdldFNpdGVCYXNlVXJsKClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVEZWJ1Z01vZGUoKSB7XHJcbiAgICBnbG9iYWwuQ29uc29sZUxvZ0RlZ3VnKFwiaW5pdGlhbGl6ZURlYnVnTW9kZVwiKTtcclxuXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoZS5jdHJsS2V5ICYmIGUuYWx0S2V5ICYmIGUua2V5Q29kZSA9PSA3OSkge1xyXG4gICAgICAgICAgICAvLyBDVFJMICsgQUxUICsgT1xyXG4gICAgICAgICAgICBnbG9iYWwuU2V0Q2xpZW50TG9nTW9kZVN0b3JhZ2VWYWx1ZSgpO1xyXG4gICAgICAgICAgICBnbG9iYWwuZGVidWdNb2RlID0gZ2xvYmFsLkdldENsaWVudExvZ01vZGVTdG9yYWdlVmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BJbnB1dE1hc2tFeCBleHRlbmRzIFNhb3BJbnB1dE1hc2sgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BTZXR0aW5nc1ZpZXdFeCBleHRlbmRzIFNhb3BTZXR0aW5nc1ZpZXcgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BDaGFuZ2VQd2RWaWV3RXggZXh0ZW5kcyBTYW9wQ2hhbmdlUHdkVmlldyB7IH07XHJcblxyXG5leHBvcnQgY2xhc3MgU2FvcFZpZXdTcGlubmVyRVggZXh0ZW5kcyBTYW9wVmlld1NwaW5uZXIgeyB9O1xyXG5cclxuZXhwb3J0IGNsYXNzIFNhb3BNZWFsQXBwbGljYXRpb25WaWV3RXggZXh0ZW5kcyBTYW9wTWVhbEFwcGxpY2F0aW9uVmlldyB7IH07XHJcblxyXG5cclxuXHJcbiJdfQ=="}