1 line
198 KiB
JavaScript
1 line
198 KiB
JavaScript
"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["wizard-install-InstallWizardController"],{6868:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"InstallWizardController\": () => (/* binding */ InstallWizardController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass InstallWizardController extends BaseWizardController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '.install-wizard',\n\n\t\t\ttype_array: null,\n\n\t\t\tcountry_array: null,\n\n\t\t\ttime_zone_array: null,\n\n\t\t\texternal_installer: null,\n\n\t\t\tcompany_id: null,\n\n\t\t\tuser_id: null,\n\n\t\t\tedit_view_error_ui_dic: {},\n\n\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\t\tthis.title_1 = $( this.el ).find( '.title-1' );\n\t\tthis.steps = 5;\n\t\tthis.script_name = 'wizard_install';\n\t\tthis.wizard_id = 'InstallWizard';\n\t\tthis.api = TTAPI.APIInstall;\n\t\tServiceCaller.extra_url = '&disable_db=1';\n\t\tif ( _.size( LocalCacheData.getAllURLArgs() ) > 0 ) {\n\t\t\tvar url_args = LocalCacheData.getAllURLArgs();\n\t\t\tthis.current_step = url_args.a;\n\t\t\tthis.external_installer = url_args.external_installer;\n\t\t} else {\n\t\t\tthis.current_step = 'license';\n\t\t\tthis.external_installer = 0;\n\t\t}\n\n\t\tthis.render();\n\t}\n\n\trender() {\n\t\tvar $this = this;\n\t\tvar title = $( this.el ).find( '.title' );\n\n\t\tthis.next_btn = $( this.el ).find( '.forward-btn' );\n\t\tthis.back_btn = $( this.el ).find( '.back-btn' );\n\t\tthis.done_btn = $( this.el ).find( '.done-btn' );\n\n\t\ttitle.text( $.i18n._( 'Install Wizard' ) );\n\n\t\tthis.initCurrentStep();\n\t}\n\n\tinitCurrentStep( step ) {\n\t\tvar $this = this;\n\n\t\tif ( step ) {\n\t\t} else {\n\t\t\tstep = this.current_step;\n\t\t}\n\n\t\tProgressBar.showOverlay();\n\n\t\tswitch ( step ) {\n\t\t\tcase 'license':\n\t\t\t\tthis.api.getLicense( {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'requirements':\n\t\t\t\tthis.api.getRequirements( this.external_installer, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\tif ( res.getResult().action ) {\n\t\t\t\t\t\t\t\t$this.onNextClick();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'databaseSchema':\n\t\t\t\tServiceCaller.extra_url = false;\n\t\t\t\tthis.api.getDatabaseSchema( {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'databaseConfig':\n\t\t\t\tthis.api.getDatabaseConfig( {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t$this.type_array = res.getResult().type_options;\n\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'postUpgrade':\n\t\t\t\tthis.api.postUpgrade( {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'systemSettings':\n\t\t\t\tthis.api.getSystemSettings( {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t$this.time_zone_array = res.getResult().time_zone_options;\n\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'company':\n\t\t\t\tthis.api.getCompany( this.company_id, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'user':\n\t\t\t\tvar company_id = '';\n\t\t\t\tif ( Global.isSet( this.stepsDataDic[this.current_step] ) ) {\n\t\t\t\t\tcompany_id = this.stepsDataDic[this.current_step]['company_id'];\n\t\t\t\t}\n\t\t\t\tthis.api.getUser( company_id, this.user_id, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'installDone':\n\t\t\t\tvar upgrade = '';\n\t\t\t\tif ( Global.isSet( $this.stepsDataDic[$this.current_step] ) ) {\n\t\t\t\t\tupgrade = $this.stepsDataDic[$this.current_step]['upgrade'];\n\t\t\t\t}\n\t\t\t\tthis.api.installDone( upgrade, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'maintenanceJobs':\n\t\t\t\tthis.api.getMaintenanceJobs( {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\tif ( res.getResult() === true ) {\n\t\t\t\t\t\t\t\t$this.current_step = 'installDone';\n\t\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.current_step = 'license';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t_initCurrentStep( step ) {\n\t\tvar $this = this;\n\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\t\t$this.buildCurrentStepUI();\n\t\t$this.buildCurrentStepData();\n\t\t$this.setCurrentStepValues();\n\t}\n\n\tsetButtonsStatus() {\n\t\tif ( this.current_step === 'license' ) {\n\t\t\tGlobal.setWidgetEnabled( this.back_btn, false );\n\t\t\tGlobal.setWidgetEnabled( this.next_btn, false );\n\t\t} else {\n\t\t\tGlobal.setWidgetEnabled( this.back_btn, true );\n\t\t\tGlobal.setWidgetEnabled( this.next_btn, true );\n\t\t}\n\n\t\tif ( this.current_step !== 'installDone' ) {\n\t\t\tGlobal.setWidgetEnabled( this.done_btn, false );\n//\t\t\tGlobal.setWidgetEnabled( this.next_btn, true );\n\t\t} else {\n\t\t\tGlobal.setWidgetEnabled( this.done_btn, true );\n\t\t\tGlobal.setWidgetEnabled( this.next_btn, false );\n\t\t}\n\t}\n\n\t//Create each page UI\n\tbuildCurrentStepUI() {\n\n\t\tvar $this = this;\n\t\tvar step_title = this.content_div.find( '.step-title > .wizard-label' );\n\t\tvar license = this.content_div.find( '.license' );\n\t\tvar requirements = this.content_div.find( '.requirements' );\n\t\tvar databaseConfig = this.content_div.find( '.databaseConfig' );\n\t\tvar databaseSchema = this.content_div.find( '.databaseSchema' );\n\t\tvar postUpgrade = this.content_div.find( '.postUpgrade' );\n\t\tvar systemSettings = this.content_div.find( '.systemSettings' );\n\t\tvar company = this.content_div.find( '.company' );\n\t\tvar user = this.content_div.find( '.user' );\n\t\tvar installDone = this.content_div.find( '.installDone' );\n\t\tvar maintenanceJobs = this.content_div.find( '.maintenanceJobs' );\n\n\t\tvar form_item_input;\n\t\tvar stepData = this.stepsDataDic[this.current_step];\n\t\tthis.content_div.find( '.step' ).hide();\n\t\tthis.content_div.find( '.content-handle-btn' ).empty();\n\n\t\tif ( Global.isSet( this.stepsWidgetDic[this.current_step] ) ) {\n\n\t\t} else {\n\t\t\tthis.stepsWidgetDic[this.current_step] = {};\n\t\t}\n\n\t\tswitch ( this.current_step ) {\n\t\t\tcase 'license':\n\t\t\t\tlicense.empty();\n\t\t\t\tthis.title_1.text( $.i18n._( 'License Acceptance' ) );\n\t\t\t\tif ( stepData['install_mode'] ) {\n\t\t\t\t\tif ( stepData['license_text'] ) {\n\t\t\t\t\t\tstep_title.text( $.i18n._( 'Please read through the following license and if you agree and accept it, click the ' + '\"' + $.i18n._( 'I Accept' ) + '\"' + 'checkbox at the bottom.' ) );\n\n\t\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\t\t\t\t\tform_item_input.TTextArea( { field: 'license_text', width: '65%', height: '80%' } );\n\t\t\t\t\t\tthis.stepsWidgetDic[this.current_step][form_item_input.getField()] = form_item_input;\n\n\t\t\t\t\t\tlicense.append( form_item_input );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlicense.append( stepData['error_message'] );\n\t\t\t\t\t}\n\n\t\t\t\t\tlicense.append( '<br>' );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\t\t\tform_item_input.TCheckbox( { field: 'license_accept' } );\n\t\t\t\t\tform_item_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t\tif ( target.getValue() ) {\n\t\t\t\t\t\t\tGlobal.setWidgetEnabled( $this.next_btn, true );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tGlobal.setWidgetEnabled( $this.next_btn, false );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.stepsWidgetDic[this.current_step][form_item_input.getField()] = form_item_input;\n\n\t\t\t\t\tlicense.append( form_item_input );\n\n\t\t\t\t\tvar accept_label = '<span> ' + $.i18n._( 'I Accept' ) + '</span>';\n\n\t\t\t\t\tlicense.append( accept_label );\n\n\t\t\t\t} else {\n\t\t\t\t\tvar license_html = $.i18n._( 'The installer has already been run, as a safety measure it has been disabled from running again. If you are absolutely sure you want to run it again, or upgrade your system, please go to your timetrex.ini.php file and set \"installer_enabled\" to \"TRUE\". The line should look like' ) + ':';\n\t\t\t\t\tlicense_html = license_html + '<br>';\n\t\t\t\t\tlicense_html = license_html + '<br>';\n\t\t\t\t\tlicense_html = license_html + '\"' + '<b>installer_enabled = TRUE</b>' + '\"';\n\t\t\t\t\tlicense_html = license_html + '<br>';\n\t\t\t\t\tlicense_html = license_html + '<br>';\n\t\t\t\t\tlicense_html = license_html + $.i18n._( 'After this change has been made, you can click the \"Re-Check\" button below to begin your installation.' );\n\t\t\t\t\tlicense_html = license_html + '<br>';\n\t\t\t\t\tlicense_html = license_html + '<br>';\n\t\t\t\t\tlicense_html = license_html + $.i18n._( 'For help, please visit' ) + ' <a href=\"https://www.timetrex.com\">www.timetrex.com</a> ';\n\t\t\t\t\tlicense.append( license_html );\n\n\t\t\t\t\tvar ribbon_button_box = this.getRibbonButtonBox();\n\n\t\t\t\t\tvar ribbon_btn = $( '<li><button class=\"ribbon-sub-menu-icon\" id=\"re-check\">' + $.i18n._( 'Re-Check' ) + '</button></li>' );\n\t\t\t\t\tribbon_btn.unbind( 'click' ).bind( 'click', function() {\n\t\t\t\t\t\tProgressBar.showOverlay();\n\t\t\t\t\t\t$this.api.getLicense( {\n\t\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tribbon_button_box.children().eq( 0 ).append( ribbon_btn );\n\n\t\t\t\t\tthis.content_div.find( '.content-handle-btn' ).html( ribbon_button_box );\n\n\t\t\t\t}\n\n\t\t\t\tlicense.show();\n\t\t\t\tbreak;\n\n\t\t\tcase 'requirements':\n\n\t\t\t\tvar step_title_htm = $.i18n._( 'In order for your' ) + ' '\n\t\t\t\t\t+ $.i18n._( stepData.application_name ) + ' '\n\t\t\t\t\t+ $.i18n._( 'installation to function properly, please ensure all of the system check items listed below are marked as' ) + ' '\n\t\t\t\t\t+ '<b>OK</b>' + '. '\n\t\t\t\t\t+ $.i18n._( 'If any are red, please take the necessary steps to fix them.' );\n\n\t\t\t\tif ( stepData.check_all_requirements != 0 ) {\n\n\t\t\t\t\tif ( stepData.tt_product_edition > 10 ) {\n\t\t\t\t\t\tstep_title_htm = step_title_htm\n\t\t\t\t\t\t\t+ '<p style=\"background-color: #FFFF00\">'\n\t\t\t\t\t\t\t+ $.i18n._( 'For installation assistance, please contact' ) + ' '\n\t\t\t\t\t\t\t+ '<a href=\"https://www.timetrex.com/contact-us\" target=\"_blank\">' + $.i18n._( 'TimeTrex support' ) + '</a>';\n\t\t\t\t\t} else if ( stepData.tt_product_edition == 10 ) {\n\n\t\t\t\t\t\tstep_title_htm = step_title_htm\n\t\t\t\t\t\t\t+ '<p style=\"background-color: #FFFF00\">'\n\t\t\t\t\t\t\t+ $.i18n._( 'For installation assistance, please join our community' ) + ' '\n\t\t\t\t\t\t\t+ '<a href=\"https://forums.timetrex.com\" target=\"_blank\">' + $.i18n._( 'forums' ) + '</a>'\n\t\t\t\t\t\t\t+ ' ' + $.i18n._( 'or contact a TimeTrex support expert for' ) + ' '\n\t\t\t\t\t\t\t+ '<a href=\"https://www.timetrex.com/setup-support\" target=\"_blank\">' + $.i18n._( 'Implementation Support Services' ) + '</a></p>';\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( stepData.check_all_requirements == 1 ) {\n\t\t\t\t\tGlobal.setWidgetEnabled( this.next_btn, false );\n\t\t\t\t}\n\n\t\t\t\tif ( _.size( stepData.extended_error_messages ) > 0 ) {\n\t\t\t\t\tGlobal.setWidgetEnabled( this.next_btn, false );\n\t\t\t\t}\n\n\t\t\t\tstep_title.html( step_title_htm );\n\n\t\t\t\tthis.title_1.text( $.i18n._( 'System Check Acceptance' ) );\n\n\t\t\t\t// timetrex version, php version.\n\t\t\t\tvar requirements_column1 = requirements.find( '.first-column' );\n\t\t\t\trequirements_column1.empty();\n\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_input.TText( { field: 'timetrex_version' } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'TimeTrex Version' ), form_item_input, requirements_column1, '' );\n\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_input.TText( { field: 'php_version' } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'PHP Version' ), form_item_input, requirements_column1, '' );\n\n\t\t\t\trequirements.find( '.first-label' ).empty();\n\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.SEPARATED_BOX );\n\t\t\t\tform_item_input.SeparatedBox( { label: $.i18n._( 'PHP Requirements' ) } );\n\t\t\t\tthis.addEditFieldToColumn( null, form_item_input, requirements.find( '.first-label' ) );\n\n\t\t\t\tvar requirements_column2 = requirements.find( '.second-column' );\n\t\t\t\trequirements_column2.empty();\n\t\t\t\tif ( stepData.check_all_requirements == 0 ) {\n\t\t\t\t\trequirements_column2.html( $.i18n._( 'All System Requirements have been met successfully' ) + '!' );\n\t\t\t\t\trequirements_column2.addClass( 'all-ok' );\n\t\t\t\t} else {\n\t\t\t\t\t// php requirements\n\t\t\t\t\trequirements_column2.removeClass( 'all-ok' );\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'database_engine' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'PostgreSQL Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'bcmath' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'BCMATH Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'mbstring' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'MBSTRING Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'gettext' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'GETTEXT Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'intl' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'INTL Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'soap' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'SOAP Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'gd' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'GD Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'json' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'JSON Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'simplexml' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'SimpleXML Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'curl' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'CURL Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'zip' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'ZIP Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'mail' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'MAIL Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'openssl' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'OpenSSL Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'pear' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'PEAR Enabled' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'safe_mode' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Safe Mode Turned Off' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'disabled_functions' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'PHP DISABLE_FUNCTIONS' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'allow_fopen_url' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'ALLOW_FOPEN_URL Turned Off' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'disk_space' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Disk Space' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\t// other requirements\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'memory_limit' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Memory Limit' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'post_size' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Max Post Size' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'upload_size' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Max Upload Size' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'base_url' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Base URL' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'system_timezone' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'System TimeZone' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'php_int_size' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'PHP 64-bit Support' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'base_dir' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'PHP Open BaseDir' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'cli_executable' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'PHP CLI Executable' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'config_file' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Writable' ) + ' ' + $.i18n._( stepData.application_name ) + ' ' + $.i18n._( 'Configuration File' ) + '<br>' + '(timetrex.ini.php)', form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'cache_dir' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Writable Cache Directory' ), form_item_input, requirements_column2, '', null, true, true );\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'safe_cache_dir' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Secure Cache Directory' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'storage_dir' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Writable Storage Directory' ), form_item_input, requirements_column2, '', null, true, true );\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'safe_storage_dir' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Secure Storage Directory' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'log_dir' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Writable Log Directory' ), form_item_input, requirements_column2, '', null, true, true );\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'safe_log_dir' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Secure Log Directory' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'empty_cache_dir' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Empty Cache Directory' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'file_permission' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'File Permissions' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'file_checksums' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'File CheckSums' ), form_item_input, requirements_column2, '', null, true, true );\n\n\t\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\t\tform_item_input.TText( { field: 'cli_requirements' } );\n\t\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'PHP CLI Requirements' ), form_item_input, requirements_column2, '', null, true, true );\n\t\t\t\t}\n\n\t\t\t\t// forth column\n\n\t\t\t\tvar requirements_column4 = requirements.find( '.forth-column' );\n\t\t\t\trequirements_column4.empty();\n\n\t\t\t\tif ( _.size( stepData.extended_error_messages ) > 0 ) {\n\t\t\t\t\tvar error_html = '<span><b>' + $.i18n._( 'Detailed Error Messages' ) + '</b></span>';\n\t\t\t\t\terror_html = error_html + '<br>';\n\t\t\t\t\terror_html = error_html + '<br>';\n\t\t\t\t\tfor ( var i in stepData.extended_error_messages ) {\n\t\t\t\t\t\tvar errors = stepData['extended_error_messages'][i];\n\t\t\t\t\t\tfor ( var key in errors ) {\n\t\t\t\t\t\t\terror_html = error_html + errors[key];\n\t\t\t\t\t\t\terror_html = error_html + '<br>';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\trequirements_column4.html( error_html );\n\t\t\t\t\trequirements_column4.addClass( 'dataError' );\n\t\t\t\t} else {\n\t\t\t\t\trequirements_column4.removeClass( 'dataError' );\n\t\t\t\t}\n\n\t\t\t\t// fifth column\n\t\t\t\tvar requirements_column5 = requirements.find( '.fifth-column' );\n\t\t\t\trequirements_column5.empty();\n\n\t\t\t\tvar columns_html = $.i18n._( 'Your' ) + ' ' + $.i18n._( stepData['application_name'] ) + ' ' + $.i18n._( 'configuration file' ) + ' ';\n\t\t\t\tcolumns_html = columns_html + '(timetrex.ini.php)';\n\t\t\t\tcolumns_html = columns_html + ' ' + $.i18n._( 'is located at' ) + ':';\n\t\t\t\tcolumns_html = columns_html + '<br>';\n\t\t\t\tcolumns_html = columns_html + '<p><b>' + stepData['config_file_loc'] + '</b></p>';\n\t\t\t\tcolumns_html = columns_html + '<br>';\n\t\t\t\tcolumns_html = columns_html + $.i18n._( 'Your PHP configuration file' ) + ' ' + '(php.ini)' + ' ' + $.i18n._( 'is located at' ) + ':';\n\t\t\t\tcolumns_html = columns_html + '<br>';\n\n\t\t\t\tif ( stepData['php_include_path'] ) {\n\t\t\t\t\tcolumns_html = columns_html + '<p><b>' + stepData['php_config_file'] + '</b>' + ', ' + $.i18n._( 'the include path is' ) + ': ' + '\"' + '<b>' + stepData['php_include_path'] + '</b>' + '\"' + '</p>';\n\t\t\t\t} else {\n\t\t\t\t\tcolumns_html = columns_html + '<p><b>' + stepData['php_config_file'] + '</b>' + ', ' + $.i18n._( 'the include path is' ) + ': ' + '\"\"' + '</p>';\n\t\t\t\t}\n\n\t\t\t\tcolumns_html = columns_html + $.i18n._( 'Detailed' ) + ' ';\n\t\t\t\tcolumns_html = columns_html + '<a href=\"phpinfo.php\" target=\"_blank\">' + $.i18n._( 'PHP Information' ) + '</a>';\n\n\t\t\t\tif ( stepData.check_all_requirements == 0 ) {\n\n\t\t\t\t} else {\n\t\t\t\t\trequirements_column5.html( columns_html );\n\t\t\t\t}\n\n\t\t\t\tvar ribbon_button_box = this.getRibbonButtonBox();\n\n//\t\t\t\tribbon_button_box.css( 'width', '96%' );\n\t\t\t\tvar ribbon_btn = $( '<li><button class=\"ribbon-sub-menu-icon\" id=\"re-check\">' + $.i18n._( 'Re-Check' ) + '</button></li>' );\n\t\t\t\tribbon_btn.unbind( 'click' ).bind( 'click', function() {\n\t\t\t\t\tProgressBar.showOverlay();\n\t\t\t\t\t$this.api.getRequirements( $this.external_installer, {\n\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\tif ( res.getResult().action ) {\n\t\t\t\t\t\t\t\t$this.onNextClick();\n\t\t\t\t\t\t\t} else if ( res.isValid() ) {\n\t\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t\tribbon_button_box.children().eq( 0 ).append( ribbon_btn );\n\n\t\t\t\tthis.content_div.find( '.content-handle-btn' ).html( ribbon_button_box );\n\n\t\t\t\trequirements.show();\n\t\t\t\tbreak;\n\t\t\tcase 'user':\n\t\t\t\tstep_title.html( $.i18n._( 'Please enter the administrator user name and password' )\n\t\t\t\t\t+ '<br>'\n\t\t\t\t\t+ '<br>'\n\t\t\t\t\t+ '<b>' + '*' + $.i18n._( 'IMPORTANT' ) + '*' + ':' + '</b>' + ' '\n\t\t\t\t\t+ $.i18n._( 'Please write this information down, as you will need it later to login to' ) + ' '\n\t\t\t\t\t+ $.i18n._( stepData.application_name )\n\t\t\t\t);\n\t\t\t\tthis.title_1.text( $.i18n._( 'Administrator Login' ) );\n\t\t\t\tvar user_column1 = user.find( '.first-column' );\n\t\t\t\tuser_column1.empty();\n\n\t\t\t\t// User Name\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'user_name', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'User Name' ), form_item_input, user_column1 );\n\n\t\t\t\t// Password\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.PASSWORD_INPUT );\n\n\t\t\t\tform_item_input.TTextInput( { field: 'password', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Password' ), form_item_input, user_column1 );\n\n\t\t\t\t// Password(confirm)\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.PASSWORD_INPUT );\n\n\t\t\t\tform_item_input.TTextInput( { field: 'password2', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Password (Confirm)' ), form_item_input, user_column1 );\n\n\t\t\t\t// First Name\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'first_name', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'First Name' ), form_item_input, user_column1 );\n\n\t\t\t\t// Last Name\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'last_name', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Last Name' ), form_item_input, user_column1 );\n\n\t\t\t\t// Email\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'work_email', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Email' ), form_item_input, user_column1 );\n\n\t\t\t\tuser.show();\n\t\t\t\tbreak;\n\n\t\t\tcase 'company':\n\t\t\t\tstep_title.text( $.i18n._( 'Please enter your company information below.' ) );\n\t\t\t\tthis.title_1.text( $.i18n._( 'Company Information' ) );\n\t\t\t\tvar company_column1 = company.find( '.first-column' );\n\t\t\t\tcompany_column1.empty();\n\n\t\t\t\t// Company Full Name\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'name', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Company Full Name' ), form_item_input, company_column1 );\n\n\t\t\t\t// Company Short Name\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'short_name', width: 200 } );\n\n\t\t\t\tvar widgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\t\tvar label = $( '<span class=\\'widget-right-label\\'> ( ' + $.i18n._( 'ie' ) + ': ' + $.i18n._( 'America Online' ) + ' = ' + $.i18n._( 'AOL' ) + ', ' + $.i18n._( 'no spaces' ) + ' )</span>' );\n\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\twidgetContainer.append( label );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Company Short Name' ), form_item_input, company_column1, '', widgetContainer, null, true );\n\n\t\t\t\t// Industry\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: 'industry_id' } );\n\t\t\t\tform_item_input.setSourceData( this.stepsDataDic[this.current_step]['industry_options'] );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Industry' ), form_item_input, company_column1 );\n\n\t\t\t\t// Address (Line 1)\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'address1', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Address (Line 1)' ), form_item_input, company_column1 );\n\n\t\t\t\t// Address (Line 2)\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'address2', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Address (Line 2)' ), form_item_input, company_column1 );\n\n\t\t\t\t// City\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'city', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'City' ), form_item_input, company_column1 );\n\n\t\t\t\t// Country\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: 'country' } );\n\t\t\t\tform_item_input.setSourceData( this.stepsDataDic[this.current_step]['country_options'] );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Country' ), form_item_input, company_column1 );\n\n\t\t\t\t// Province / State\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: 'province' } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Province / State' ), form_item_input, company_column1 );\n\n\t\t\t\t// Postal / ZIP Code\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'postal_code', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Postal / ZIP Code' ), form_item_input, company_column1 );\n\n\t\t\t\t// Phone\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'work_phone', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Phone' ), form_item_input, company_column1 );\n\t\t\t\t//company.find( '.first-column' ).css( 'border', '1px solid #C7C7C7' );\n\t\t\t\t//\n\t\t\t\t//this.content_div.find( '.company' ).css( {height: this.content_div.height() - step_title.height() - 15} );\n\t\t\t\t//$( window ).resize( function() {\n\t\t\t\t//\t$this.content_div.find( '.company' ).css( {height: $this.content_div.height() - step_title.height() - 15} );\n\t\t\t\t//} );\n\n\t\t\t\tcompany.show();\n\t\t\t\tbreak;\n\n\t\t\tcase 'systemSettings':\n\t\t\t\tstep_title.text( $.i18n._( 'Please enter your site configuration information below. If you are unsure of the fields, we suggest that you use the default values.' ) );\n\t\t\t\tthis.title_1.text( $.i18n._( 'System Settings' ) );\n\t\t\t\tvar systemSettings_column1 = systemSettings.find( '.first-column' );\n\t\t\t\tsystemSettings_column1.empty();\n\t\t\t\t// URL\n\t\t\t\tvar widgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\t\tvar form_item_host_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\t\tform_item_host_input.TText( { field: 'host_name' } );\n\t\t\t\tform_item_host_input.setValue( 'http://' + this.stepsDataDic[this.current_step]['host_name'] );\n\t\t\t\twidgetContainer.append( form_item_host_input );\n\n\t\t\t\tvar form_item_url_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_url_input.TTextInput( { field: 'base_url', width: 200 } );\n\n\t\t\t\twidgetContainer.append( form_item_url_input );\n\n\t\t\t\tvar ie_label = $( '<span class=\\'widget-right-label\\'>(' + $.i18n._( 'No trailing slash' ) + ')</span>' );\n\n\t\t\t\twidgetContainer.append( ie_label );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'URL' ), [form_item_host_input, form_item_url_input], systemSettings_column1, '', widgetContainer, null, true );\n\n\t\t\t\t// Log Directory\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'log_dir', width: 400 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Log Directory' ), form_item_input, systemSettings_column1 );\n\n\t\t\t\t// Storage Directory\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'storage_dir', width: 400 } );\n\n\t\t\t\tvar widgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\t\tvar label = $( '<span class=\\'widget-right-label\\'> (' + $.i18n._( 'for things like attachments, logos, etc...' ) + ')</span>' );\n\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\twidgetContainer.append( label );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Storage Directory' ), form_item_input, systemSettings_column1, '', widgetContainer, null, true );\n\n\t\t\t\t// Cache Directory\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'cache_dir', width: 400 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Cache Directory' ), form_item_input, systemSettings_column1 );\n\n\t\t\t\t// System timezone\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: 'time_zone' } );\n\t\t\t\tform_item_input.setSourceData( $this.time_zone_array );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Server Time Zone' ), form_item_input, systemSettings_column1 );\n\n\t\t\t\tsystemSettings.show();\n\t\t\t\tbreak;\n\t\t\tcase 'databaseConfig':\n\n\t\t\t\tdatabaseConfig.find( '.step-tip' ).text( $.i18n._( 'Privileged Database User Name / Password. This is only used to create the database schema if the above user does not have permissions to do so.' ) );\n\n\t\t\t\tvar step_title_htm = '';\n\t\t\t\tstep_title_htm = step_title_htm + $.i18n._( 'Please enter your database configuration information below. If you are unsure, use the default values.' );\n\n\t\t\t\tstep_title.html( step_title_htm );\n\t\t\t\tthis.title_1.text( $.i18n._( 'Database Configuration' ) );\n\n\t\t\t\tvar databaseConfig_column1 = databaseConfig.find( '.first-column' );\n\t\t\t\tdatabaseConfig_column1.empty();\n\n\t\t\t\t// database type\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tform_item_input.TComboBox( { field: 'type' } );\n\t\t\t\tform_item_input.setSourceData( $this.type_array );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Database Type' ), form_item_input, databaseConfig_column1 );\n\n\t\t\t\t// host name\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'host', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Host Name' ), form_item_input, databaseConfig_column1 );\n\n\t\t\t\t// database name\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'database_name', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Database Name' ), form_item_input, databaseConfig_column1 );\n\n\t\t\t\t// Database User Name\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'user', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Database User Name' ), form_item_input, databaseConfig_column1 );\n\n\t\t\t\t// Database Password\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'password', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Database Password' ), form_item_input, databaseConfig_column1 );\n\n\t\t\t\tvar databaseConfig_column2 = databaseConfig.find( '.second-column' );\n\t\t\t\tdatabaseConfig_column2.empty();\n\n\t\t\t\t// Privileged Database User Name\n\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'priv_user', width: 200 } );\n\n\t\t\t\tvar widgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\t\tvar label = $( '<span class=\\'widget-right-label\\'>( ' + $.i18n._( 'ie: root, postgres' ) + ' )</span>' );\n\n\t\t\t\twidgetContainer.append( form_item_input );\n\t\t\t\twidgetContainer.append( label );\n\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Privileged Database User Name' ), form_item_input, databaseConfig_column2, '', widgetContainer );\n\n\t\t\t\t// Privileged Database User Password\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'priv_password', width: 200 } );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Privileged Database User Password' ), form_item_input, databaseConfig_column2 );\n\n\t\t\t\tvar ribbon_button_box = this.getRibbonButtonBox();\n\t\t\t\tvar ribbon_btn = $( '<li><button class=\"ribbon-sub-menu-icon\" id=\"testConnection\">' + $.i18n._( 'Test Connection' ) + '</button></li>' );\n\t\t\t\tvar $this = this;\n\t\t\t\tribbon_btn.unbind( 'click' ).bind( 'click', function() {\n\t\t\t\t\t$this.onTestDatabaseConnectionClick( $this, true );\n\t\t\t\t} );\n\n\t\t\t\tribbon_button_box.children().eq( 0 ).append( ribbon_btn );\n\n\t\t\t\tthis.content_div.find( '.content-handle-btn' ).html( ribbon_button_box );\n\t\t\t\t//databaseConfig.find( '.first-column' ).css( 'border', '1px solid #C7C7C7' );\n\n\t\t\t\t//this.content_div.find( '.databaseConfig' ).css( {height: this.content_div.height() - step_title.height() - 65} );\n\t\t\t\t//$( window ).resize( function() {\n\t\t\t\t//\t$this.content_div.find( '.databaseConfig' ).css( {height: $this.content_div.height() - step_title.height() - 65} );\n\t\t\t\t//} );\n\n\t\t\t\tdatabaseConfig.show();\n\t\t\t\tbreak;\n\t\t\tcase 'databaseSchema':\n\t\t\t\tthis.title_1.text( $.i18n._( 'Database Configuration' ) );\n\t\t\t\tif ( stepData.upgrade ) {\n\t\t\t\t\tdatabaseSchema.find( '.s-label' ).text( $.i18n._( 'Upgrading database, please wait...' ) );\n\t\t\t\t} else {\n\t\t\t\t\tdatabaseSchema.find( '.s-label' ).text( $.i18n._( 'Initializing database, please wait...' ) );\n\t\t\t\t}\n\n\t\t\t\tstep_title.empty();\n\t\t\t\tdatabaseSchema.show();\n\t\t\t\tbreak;\n\t\t\tcase 'postUpgrade':\n\t\t\t\tstep_title.empty();\n\t\t\t\tthis.title_1.text( $.i18n._( 'Upgrade Complete' ) );\n\t\t\t\tpostUpgrade.html( '<b>' + $.i18n._( 'Congratulations!' ) + '</b>' + ' '\n\t\t\t\t\t+ $.i18n._( 'You have successfully upgraded' ) + ' '\n\t\t\t\t\t+ $.i18n._( stepData.application_name ) + ' '\n\t\t\t\t\t+ $.i18n._( 'to' ) + ' '\n\t\t\t\t\t+ '<b>' + stepData.application_version + '</b>'\n\t\t\t\t\t+ '<br>'\n\t\t\t\t\t+ '<br>'\n\t\t\t\t\t+ '<b>' + $.i18n._( 'Note' ) + ':' + '</b>' + ' '\n\t\t\t\t\t+ $.i18n._( 'In order to access new features you may need to re-apply the' ) + ' '\n\t\t\t\t\t+ '<b>' + $.i18n._( 'Administrator' ) + '</b>' + ' '\n\t\t\t\t\t+ $.i18n._( 'permission preset to each administrator employee in' ) + ' '\n\t\t\t\t\t+ $.i18n._( stepData.application_name ) + '.'\n\t\t\t\t);\n\t\t\t\tpostUpgrade.show();\n\t\t\t\tbreak;\n\t\t\tcase 'installDone':\n\t\t\t\tvar loc = window.location;\n\t\t\t\tvar currentURL = loc.protocol + '//' + loc.host + loc.pathname;\n\t\t\t\tvar login_url = currentURL + '#!m=Login';\n\n\t\t\t\tstep_title.empty();\n\t\t\t\tthis.title_1.text( $.i18n._( 'Done!' ) );\n\t\t\t\tif ( stepData.upgrade == 1 ) {\n\t\t\t\t\tinstallDone.html( '<b>' + $.i18n._( 'Congratulations!' ) + '</b>' + ' '\n\t\t\t\t\t\t+ $.i18n._( 'You have successfully upgraded' ) + ' ' + $.i18n._( stepData.application_name )\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ $.i18n._( 'You may now' ) + ' '\n\t\t\t\t\t\t+ '<a href=\"' + login_url + '\">' + $.i18n._( 'login' ) + '</a>' + ' '\n\t\t\t\t\t\t+ $.i18n._( 'with the user name/password that you created earlier.' )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tinstallDone.html( '<b>' + $.i18n._( 'Congratulations!' ) + ' ' + '</b>' + ' '\n\t\t\t\t\t\t+ $.i18n._( 'You have successfully installed' ) + ' ' + $.i18n._( stepData.application_name )\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ $.i18n._( 'You may now' ) + ' '\n\t\t\t\t\t\t+ '<a href=\"' + login_url + '\">' + $.i18n._( 'login' ) + '</a>' + ' '\n\t\t\t\t\t\t+ $.i18n._( 'with the user name/password that you created earlier.' )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tinstallDone.show();\n\t\t\t\tbreak;\n\t\t\tcase 'maintenanceJobs':\n\t\t\t\tstep_title.empty();\n\t\t\t\tthis.title_1.text( $.i18n._( 'Maintenance Jobs' ) );\n\t\t\t\tvar maintenanceJob_html = $.i18n._( stepData.application_name ) + ' '\n\t\t\t\t\t+ '<b>' + $.i18n._( 'requires' ) + '</b>' + ' '\n\t\t\t\t\t+ $.i18n._( 'that maintenance jobs be run regularly throughout the day.' )\n\t\t\t\t\t+ '<br>'\n\t\t\t\t\t+ '<p style=\"color: #ff0000\">'\n\t\t\t\t\t+ '<b>'\n\t\t\t\t\t+ $.i18n._( 'This is extremely important and without these maintenance jobs running' ) + ' '\n\t\t\t\t\t+ $.i18n._( stepData.application_name ) + ' '\n\t\t\t\t\t+ $.i18n._( 'will fail to operate correctly.' )\n\t\t\t\t\t+ '</b>'\n\t\t\t\t\t+ '</p>'\n\t\t\t\t\t+ '<br>'\n\t\t\t\t\t+ '<br>'\n\t\t\t\t\t+ '<div style=\"background-color: #eee; width: 100%;\">'\n\t\t\t\t\t+ '<br>';\n\n\t\t\t\tif ( stepData.php_os == 'WINNT' ) {\n\t\t\t\t\tmaintenanceJob_html = maintenanceJob_html + $.i18n._( 'In Windows simply run this command as Administrator.' ) + '<br><br>' + stepData.schedule_maintenance_job_command;\n\t\t\t\t} else {\n\t\t\t\t\tmaintenanceJob_html = maintenanceJob_html + $.i18n._( 'In most Linux distributions, you can run the following command' );\n\t\t\t\t\tif ( stepData.is_sudo_installed == false ) {\n\t\t\t\t\t\tmaintenanceJob_html = maintenanceJob_html + +' ' + $.i18n._( 'as root' );\n\t\t\t\t\t}\n\t\t\t\t\tmaintenanceJob_html = maintenanceJob_html + ':' + '<br>' + '<b>';\n\n\t\t\t\t\tif ( stepData.is_sudo_installed ) {\n\t\t\t\t\t\tmaintenanceJob_html = maintenanceJob_html + 'sudo';\n\t\t\t\t\t}\n\n\t\t\t\t\tmaintenanceJob_html = maintenanceJob_html + ' crontab -u ' + stepData.web_server_user + ' -e';\n\n\t\t\t\t\tmaintenanceJob_html = maintenanceJob_html + '</b>'\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ $.i18n._( 'Then add the following line to the bottom of the file' ) + ':'\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ '<b>' + '* * * * * php ' + stepData.cron_file + ' > /dev/null 2>&1' + '</b>'\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ '<br>'\n\t\t\t\t\t\t+ '</div>';\n\n\t\t\t\t}\n\n\t\t\t\tmaintenanceJobs.html( maintenanceJob_html );\n\n\t\t\t\tmaintenanceJobs.show();\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\n\t/**\n\t * tests database connection:\n\t * @param $this\n\t * @param deferred (optional)\n\t */\n\tonTestDatabaseConnectionClick( $this, showTrue ) {\n\t\tvar $data = {};\n\t\tfor ( var key in $this.stepsWidgetDic[$this.current_step] ) {\n\t\t\tvar widget = $this.stepsWidgetDic[$this.current_step][key];\n\t\t\t$data[key] = widget.getValue();\n\t\t}\n\t\tProgressBar.showOverlay();\n\t\tvar res = $this.api.testConnection( $data, { async: false } );\n\n\t\tif ( res.isValid() ) {\n\t\t\tvar result = res.getResult();\n\t\t\tvar step_title_htm = '';\n\t\t\tif ( result.test_connection !== null ) {\n\t\t\t\tif ( result.test_connection === true ) {\n\t\t\t\t\tif ( result.database_version === 1 ) {\n\t\t\t\t\t\tstep_title_htm = step_title_htm\n\t\t\t\t\t\t\t+ '<p style=\"background-color: #ff0000\">'\n\t\t\t\t\t\t\t+ $.i18n._( 'Database version check' ) + ' '\n\t\t\t\t\t\t\t+ '<b>' + $.i18n._( 'FAILED' ) + '</b>' + '!' + ' '\n\t\t\t\t\t\t\t+ $.i18n._( 'Please upgrade your database to meet the minimum version requirements and try again.' )\n\t\t\t\t\t\t\t+ '</p>';\n\t\t\t\t\t\tTAlertManager.showAlert( step_title_htm );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstep_title_htm = step_title_htm\n\t\t\t\t\t\t\t+ '<p>'\n\t\t\t\t\t\t\t+ $.i18n._( 'Connection test to your database as a non-privileged user has' ) + ' '\n\t\t\t\t\t\t\t+ '<b>' + $.i18n._( 'SUCCEEDED' ) + '</b>' + '!' + ' '\n\t\t\t\t\t\t\t+ $.i18n._( 'You may continue.' )\n\t\t\t\t\t\t\t+ '</p>';\n\t\t\t\t\t\tif ( showTrue ) {\n\t\t\t\t\t\t\tTAlertManager.showAlert( step_title_htm );\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} else if ( result.test_connection === false ) {\n\t\t\t\t\tstep_title_htm = step_title_htm\n\t\t\t\t\t\t+ '<p style=\"background-color: #ff0000\">'\n\t\t\t\t\t\t+ $.i18n._( 'Connection test to your database as a non-privileged user has' ) + ' '\n\t\t\t\t\t\t+ '<b>' + $.i18n._( 'FAILED' ) + '</b>' + '!' + ' '\n\t\t\t\t\t\t+ $.i18n._( 'Please correct your settings and try again.' )\n\t\t\t\t\t\t+ '</p>';\n\n\t\t\t\t\tTAlertManager.showAlert( step_title_htm );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( result.test_priv_connection !== null ) {\n\t\t\t\tif ( result.test_priv_connection === false ) {\n\t\t\t\t\tstep_title_htm = step_title_htm\n\t\t\t\t\t\t+ '<p style=\"background-color: #ff0000\">'\n\t\t\t\t\t\t+ $.i18n._( 'Connection test to your database as a privileged user has' ) + ' '\n\t\t\t\t\t\t+ '<b>' + $.i18n._( 'FAILED' ) + '</b>' + '!' + ' '\n\t\t\t\t\t\t+ $.i18n._( 'Please correct the user name/password and try again.' )\n\t\t\t\t\t\t+ '</p>';\n\n\t\t\t\t\tTAlertManager.showAlert( step_title_htm );\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tonFormItemChange( target ) {\n\t\tvar widgets = this.stepsWidgetDic[this.current_step];\n\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\t\tswitch ( key ) {\n\t\t\tcase 'country':\n\t\t\t\tthis.api.getProvinceOptions( c_value, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\twidgets.province.setSourceData( [] );\n\t\t\t\t\t\t\twidgets.province.setSourceData( res.getResult() );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'type':\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonBackClick() {\n\t\tvar $this = this;\n\t\tthis.saveCurrentStep();\n\t\tswitch ( this.current_step ) {\n\t\t\tcase 'license':\n\t\t\t\tbreak;\n\t\t\tcase 'requirements':\n\t\t\t\tthis.current_step = 'license';\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t\tcase 'databaseConfig':\n\t\t\t\tthis.current_step = 'requirements';\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t\tcase 'postUpgrade':\n\t\t\tcase 'systemSettings':\n\t\t\t\tthis.current_step = 'databaseConfig';\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t\tcase 'company':\n\t\t\t\tthis.current_step = 'systemSettings';\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t\tcase 'maintenanceJobs':\n\t\t\tcase 'installDone':\n\t\t\t\tthis.current_step = 'user';\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t\tcase 'user':\n\t\t\t\tthis.current_step = 'company';\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonNextClick() {\n\t\tvar $data;\n\n\t\tvar $this = this;\n\t\tthis.saveCurrentStep();\n\t\tswitch ( this.current_step ) {\n\t\t\tcase 'license':\n\t\t\t\t// the next interface is system requirements, so set the current step to the requirements\n\t\t\t\tthis.current_step = 'requirements';\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t\tcase 'requirements':\n\t\t\t\tif ( this.external_installer == 1 ) {\n\t\t\t\t\tthis.current_step = 'databaseSchema';\n\t\t\t\t\tthis.initCurrentStep();\n\t\t\t\t} else {\n\t\t\t\t\tthis.current_step = 'databaseConfig';\n\t\t\t\t\tthis.initCurrentStep();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'databaseConfig':\n\t\t\t\t// need to save the database configure first.\n\t\t\t\t$data = {};\n\t\t\t\tfor ( var key in this.stepsWidgetDic[this.current_step] ) {\n\t\t\t\t\tvar widget = this.stepsWidgetDic[this.current_step][key];\n\t\t\t\t\t$data[key] = widget.getValue();\n\t\t\t\t}\n\n\t\t\t\tif ( this.onTestDatabaseConnectionClick( this, false ) ) {\n\t\t\t\t\tTAlertManager.showConfirmAlert( $.i18n._( 'Installing/Upgrading the TimeTrex database may take up to 10 minutes. Please do not stop the process in any way, including pressing STOP or BACK in your web browser, doing so may leave your database in an unusable state.' ), null, function( result ) {\n\t\t\t\t\t\tif ( result ) {\n\t\t\t\t\t\t\t$this.api.createDatabase( $data, {\n\t\t\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\t\t\t\tif ( res.getResult().next_page ) {\n\t\t\t\t\t\t\t\t\t\t\t$this.current_step = res.getResult().next_page;\n\t\t\t\t\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = res.getResult();\n\t\t\t\t\t\t\t\t\t\t\t$this._initCurrentStep();\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'postUpgrade':\n\t\t\t\tthis.current_step = 'installDone';\n\t\t\t\tthis.stepsDataDic[this.current_step] = { upgrade: 1 };\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t\tcase 'maintenanceJobs':\n\t\t\t\tthis.current_step = 'installDone';\n\t\t\t\tthis.initCurrentStep();\n\t\t\t\tbreak;\n\t\t\tcase 'systemSettings':\n\t\t\t\t$data = {};\n\t\t\t\tfor ( var key in this.stepsWidgetDic[this.current_step] ) {\n\t\t\t\t\tvar widget = this.stepsWidgetDic[this.current_step][key];\n\t\t\t\t\t$data[key] = widget.getValue();\n\t\t\t\t}\n\n\t\t\t\tthis.api.setSystemSettings( $data, this.external_installer, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\n\t\t\t\t\t\t\t$this.current_step = 'company';\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'company':\n\t\t\t\t$data = {};\n\t\t\t\t$data['company_id'] = $this.company_id;\n\t\t\t\tfor ( var key in this.stepsWidgetDic[this.current_step] ) {\n\t\t\t\t\tvar widget = this.stepsWidgetDic[this.current_step][key];\n\t\t\t\t\t$data[key] = widget.getValue();\n\t\t\t\t}\n\n\t\t\t\tthis.api.setCompany( $data, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\tvar company_id = res.getResult();\n\t\t\t\t\t\t\t$this.current_step = 'user';\n\t\t\t\t\t\t\t$this.company_id = company_id;\n\t\t\t\t\t\t\t$this.stepsDataDic[$this.current_step] = { company_id: company_id };\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.setErrorTips( res );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\t\t\tcase 'user':\n\t\t\t\t$data = {};\n\t\t\t\t$data['user_id'] = this.user_id;\n\t\t\t\tfor ( var key in this.stepsWidgetDic[this.current_step] ) {\n\t\t\t\t\tvar widget = this.stepsWidgetDic[this.current_step][key];\n\t\t\t\t\t$data[key] = widget.getValue();\n\t\t\t\t}\n\n\t\t\t\t$data = $.extend( {}, $data, this.stepsDataDic[$this.current_step] );\n\t\t\t\tthis.api.setUser( $data, this.external_installer, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\tvar next_page = res.getResult().next_page;\n\t\t\t\t\t\t\t$this.user_id = res.getResult().user_id;\n\t\t\t\t\t\t\t$this.current_step = next_page;\n\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.setErrorTips( res );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tbuildCurrentStepData() {\n\t\tvar args = {};\n\t\tvar $this = this;\n\t\tvar stepData = this.stepsDataDic[this.current_step];\n\t\tvar widgets = this.stepsWidgetDic[this.current_step];\n\t\tswitch ( this.current_step ) {\n\t\t\tcase 'systemSettings':\n\t\t\tcase 'databaseConfig':\n\t\t\tcase 'license':\n\t\t\tcase 'user':\n\t\t\t\tfor ( var key in widgets ) {\n\t\t\t\t\tif ( stepData[key] ) {\n\t\t\t\t\t\twidgets[key].setValue( stepData[key] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\tbreak;\n\t\t\tcase 'company':\n\t\t\t\tfor ( var key in widgets ) {\n\t\t\t\t\tif ( stepData[key] ) {\n\t\t\t\t\t\twidgets[key].setValue( stepData[key] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar country = widgets.country.getValue();\n\t\t\t\tthis.api.getProvinceOptions( country, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\twidgets.province.setSourceData( res.getResult() );\n\t\t\t\t\t\t\twidgets.province.setValue( stepData['province'] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'requirements':\n\t\t\t\tfor ( var key in widgets ) {\n\t\t\t\t\tvar edit_view_form_item_dic = $( this.edit_view_form_item_dic[key] );\n\n\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t} else {\n\t\t\t\t\t\tedit_view_form_item_dic.show();\n\t\t\t\t\t}\n\n\t\t\t\t\tvar widget = widgets[key];\n\t\t\t\t\twidget.removeClass( 't-text' );\n\t\t\t\t\twidget.removeClass( 'dataError' );\n\t\t\t\t\twidget.removeClass( 'dataWarning' );\n\t\t\t\t\twidget.addClass( 'custom-t-text' );\n\n\t\t\t\t\tswitch ( key ) {\n\t\t\t\t\t\tcase 'timetrex_version':\n\t\t\t\t\t\t\tif ( stepData[key].check_timetrex_version == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) + '(v' + stepData[key].current_timetrex_version + ')' );\n\t\t\t\t\t\t\t} else if ( stepData[key].check_timetrex_version == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Unable to Check Latest Version' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataWarning' );\n\t\t\t\t\t\t\t} else if ( stepData[key].check_timetrex_version == 2 ) {\n\t\t\t\t\t\t\t\twidget.html(\n\t\t\t\t\t\t\t\t\t$.i18n._( 'A Newer Version of TimeTrex is Available.' ) + ' '\n\t\t\t\t\t\t\t\t\t+ '<a href=\"https://www.timetrex.com/download.php\">' + $.i18n._( 'Download' ) + ' v' + stepData[key].latest_timetrex_version + ' ' + $.i18n._( 'Now' ) + '</a>' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataWarning' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'php_version':\n\t\t\t\t\t\t\tif ( stepData[key].check_php_version == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) + ' (v' + stepData[key].php_version + ')' );\n\t\t\t\t\t\t\t} else if ( stepData[key].check_php_version == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Invalid' ) + ' (v' + stepData[key].php_version + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t} else if ( stepData[key].check_php_version == 2 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Unsupported' ) + ' (v' + stepData[key].php_version + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataWarning' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'php_int_size':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Invalid (Only 32-bit)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'database_engine':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (PGSQL extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'bcmath':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (BCMATH extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mbstring':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (MBSTRING extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'gettext':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (GETTEXT extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'intl':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (INTL extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'soap':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (SOAP extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'gd':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (GD extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'json':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (JSON extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mcrypt':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (MCRYPT extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'simplexml':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (SimpleXML extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'curl':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (CURL extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'zip':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (ZIP extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mail':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (MAIL extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'openssl':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed. (OpenSSL extension must be enabled)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'pear':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\tif ( stepData.php_os == 'WINNT' ) {\n\t\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed.' )\n\t\t\t\t\t\t\t\t\t\t+ '(' + $.i18n._( 'try running' ) + ': ' + '\"<b>go-pear.bat</b>\"' + ')'\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not Installed.' )\n\t\t\t\t\t\t\t\t\t\t+ '('\n\t\t\t\t\t\t\t\t\t\t+ $.i18n._( 'install the PEAR RPM or package from' ) + ' '\n\t\t\t\t\t\t\t\t\t\t+ '<a href=\\\"http://pear.php.net\\\">http://pear.php.net</a>'\n\t\t\t\t\t\t\t\t\t\t+ ')'\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'safe_mode':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Safe Mode is On. (Please disable it in php.ini)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'allow_fopen_url':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'ALLOW_FOPEN_URL is Off. (Please enable it in php.ini)' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'disk_space':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not enough disk space available, please free up disk space and try again.' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'memory_limit':\n\t\t\t\t\t\t\tif ( stepData[key].check_php_memory_limit == 0 ) {\n\t\t\t\t\t\t\t\tvar str = $.i18n._( 'OK' );\n\t\t\t\t\t\t\t\tif ( stepData[key].memory_limit > 0 ) {\n\t\t\t\t\t\t\t\t\tstr += '(' + stepData[key].memory_limit + ' bytes' + ')';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twidget.html( str );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else if ( stepData[key].check_php_memory_limit == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( stepData[key].memory_limit + ' bytes' + ' (' + $.i18n._( 'Set this to 512M or higher' ) + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'post_size':\n\t\t\t\t\t\t\tif ( stepData[key].check_php_post_size == 0 ) {\n\t\t\t\t\t\t\t\tvar str = $.i18n._( 'OK' );\n\t\t\t\t\t\t\t\tif ( stepData[key].post_size > 0 ) {\n\t\t\t\t\t\t\t\t\tstr += '(' + stepData[key].post_size + ' bytes' + ')';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twidget.html( str );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else if ( stepData[key].check_php_post_size == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( stepData[key].post_size + ' bytes' + ' (' + $.i18n._( 'Set this to 25M or higher, recommend 128M' ) + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'upload_size':\n\t\t\t\t\t\t\tif ( stepData[key].check_php_upload_size == 0 ) {\n\t\t\t\t\t\t\t\tvar str = $.i18n._( 'OK' );\n\t\t\t\t\t\t\t\tif ( stepData[key].upload_size > 0 ) {\n\t\t\t\t\t\t\t\t\tstr += '(' + stepData[key].post_size + ' bytes' + ')';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twidget.html( str );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else if ( stepData[key].check_php_upload_size == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( stepData[key].upload_size + ' bytes' + ' (' + $.i18n._( 'Set this to 25M or higher, recommend 128M' ) + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'disabled_functions':\n\t\t\t\t\t\t\tif ( stepData[key].check_disabled_functions == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else if ( stepData[key].check_disabled_functions == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Critical functions disabled' ) + ': ' + stepData[key].disabled_function_list + ' (' + $.i18n._( 'Please enable them in php.ini' ) + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'base_url':\n\t\t\t\t\t\t\tif ( stepData[key].check_base_url == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( key + ' ' + $.i18n._( 'in' ) + ' timetrex.ini.php ' + $.i18n._( 'is incorrect, perhaps it should be' ) + ' ' + stepData[key].recommended_base_url + ' ' + $.i18n._( 'instead' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'base_dir':\n\t\t\t\t\t\t\tif ( stepData[key].check_php_open_base_dir == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'PHP OPEN_BASEDIR setting' ) + ' ' + '(' + stepData[key].php_open_base_dir + ') ' + $.i18n._( 'does not include directory of PHP CLI binary' ) + ' ' + '(' + stepData[key].php_cli_directory + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'system_timezone':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else if ( stepData[key] == 1 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'system_timezone in timetrex.ini.php is invalid!' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'cli_executable':\n\t\t\t\t\t\t\tif ( stepData[key].check_php_cli_binary == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'PHP CLI' ) + ' ' + '(' + stepData[key].php_cli + ')' + ' ' + $.i18n._( 'does not exist or is not executable.' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'cli_requirements':\n\t\t\t\t\t\t\tif ( stepData[key].check_php_cli_requirements == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'PHP CLI requirements failed while executing' ) + ':<br>'\n\t\t\t\t\t\t\t\t\t+ stepData[key].php_cli_requirements_command + '<br>'\n\t\t\t\t\t\t\t\t\t+ $.i18n._( 'Likely caused by having two PHP.INI files with different settings.' )\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'config_file':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not writable' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'cache_dir':\n\t\t\t\t\t\t\tif ( stepData[key].check_writable_cache_directory == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not writable' ) + ' (' + stepData[key].cache_dir + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'safe_cache_dir':\n\t\t\t\t\t\t\tif ( stepData[key].check_safe_cache_directory == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'INSECURE, must not be a sub-directory of base path.' ) + ' (' + stepData[key].base_path + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'storage_dir':\n\t\t\t\t\t\t\tif ( stepData[key].check_writable_storage_directory == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not writable' ) + ' (' + stepData[key].storage_path + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'safe_storage_dir':\n\t\t\t\t\t\t\tif ( stepData[key].check_safe_storage_directory == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'INSECURE, must not be a sub-directory of base path.' ) + ' (' + stepData[key].base_path + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'log_dir':\n\t\t\t\t\t\t\tif ( stepData[key].check_writable_log_directory == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Not writable' ) + ' (' + stepData[key].log_path + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'safe_log_dir':\n\t\t\t\t\t\t\tif ( stepData[key].check_safe_log_directory == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'INSECURE, must not be a sub-directory of base path.' ) + ' (' + stepData[key].base_path + ')' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'empty_cache_dir':\n\t\t\t\t\t\t\tif ( stepData[key].check_clean_cache_directory == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t\tedit_view_form_item_dic.hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'Please delete all files/directories in' ) + ': ' + ' <b>' + stepData[key].cache_dir + '</b>' );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'file_permission':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'File permissions are invalid, some' ) + ' ' + $.i18n._( stepData.application_name ) + ' ' + $.i18n._( 'files are not readable/writable. See detailed error messages below.' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'file_checksums':\n\t\t\t\t\t\t\tif ( stepData[key] == 0 ) {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'OK' ) );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidget.html( $.i18n._( 'File checksums do not match, some' ) + ' ' + $.i18n._( stepData.application_name ) + ' ' + $.i18n._( 'files may be corrupted, missing, or not installed properly. See detailed error messages below.' ) );\n\t\t\t\t\t\t\t\twidget.addClass( 'dataError' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\tbreak;\n\t\t\tcase 'databaseSchema':\n\t\t\t\tthis.api.setDatabaseSchema( this.external_installer, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t\t\tvar result = res.getResult();\n\t\t\t\t\t\t\tif ( result.next_page ) {\n\t\t\t\t\t\t\t\t$this.current_step = result.next_page;\n\t\t\t\t\t\t\t\tswitch ( result.next_page ) {\n\t\t\t\t\t\t\t\t\tcase 'postUpgrade':\n\t\t\t\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'systemSettings':\n\t\t\t\t\t\t\t\t\t\tif ( result.action ) {\n\t\t\t\t\t\t\t\t\t\t\t$this.onNextClick(); // skip system setting to company information directly.\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t$this.initCurrentStep();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\n\tsetErrorTips( result ) {\n\t\tthis.clearErrorTips();\n\n\t\tvar details = result.getDetails();\n\t\tvar error_list = details[0];\n\n\t\tfor ( var key in error_list ) {\n\n\t\t\tif ( !error_list.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !Global.isSet( this.stepsWidgetDic[this.current_step][key] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this.stepsWidgetDic[this.current_step][key].is( ':visible' ) ) {\n\n\t\t\t\tthis.stepsWidgetDic[this.current_step][key].setErrorStyle( error_list[key], true );\n\n\t\t\t} else {\n\n\t\t\t\tthis.stepsWidgetDic[this.current_step][key].setErrorStyle( error_list[key] );\n\t\t\t}\n\n\t\t\tthis.edit_view_error_ui_dic[key] = this.stepsWidgetDic[this.current_step][key];\n\n\t\t}\n\t}\n\n\tclearErrorTips() {\n\n\t\tfor ( var key in this.edit_view_error_ui_dic ) {\n\n\t\t\t//Error: Uncaught TypeError: Cannot read property 'clearErrorStyle' of undefined in /interface/html5/views/BaseViewController.js?v=8.0.0-20141117-111140 line 1779\n\t\t\tif ( !this.edit_view_error_ui_dic.hasOwnProperty( key ) || !this.edit_view_error_ui_dic[key] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.edit_view_error_ui_dic[key].clearErrorStyle();\n\t\t}\n\n\t\tthis.edit_view_error_ui_dic = {};\n\t}\n\n\tonDoneClick() {\n\t\tthis.cleanStepsData();\n\n//\t\tif ( this.call_back ) {\n//\t\t\tthis.call_back();\n//\t\t}\n//\t\tvar baseURI = $(\"*\").context.baseURI;\n\n\t\tvar loc = window.location;\n\t\tvar currentURL = loc.protocol + '//' + loc.host + loc.pathname;\n\t\tGlobal.setURLToBrowser( currentURL + '#!m=Login' );\n\t\t$( this.el ).remove();\n\t}\n\n\tonCloseClick() {\n\t\tif ( this.script_name ) {\n\t\t\tthis.saveCurrentStep();\n\t\t}\n\t\tvar loc = window.location;\n\t\tvar currentURL = loc.protocol + '//' + loc.host + loc.pathname;\n\t\tGlobal.setURLToBrowser( currentURL + '#!m=Login' );\n\t\t$( this.el ).remove();\n\t}\n\n\tcleanStepsData() {\n\t\tthis.stepsDataDic = {};\n\t\tthis.current_step = 'license';\n\t}\n\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTLENBQUM7QUFDVixpQkFBaUIsQ0FBQztBQUNsQixTQUFTLENBQUM7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVEsQ0FBQztBQUNULGdCQUFnQixDQUFDO0FBQ2pCLFFBQVEsQ0FBQztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxDQUFDO0FBQ1QsZ0JBQWdCLENBQUM7QUFDakIsUUFBUSxDQUFDO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyxDQUFDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUEsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLENBQUMsV0FBVztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLENBQUM7O0FBRXBDO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTLENBQUM7QUFDVixnRUFBZ0UsQ0FBQyw2RUFBNkUsQ0FBQztBQUMvSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0EsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1Q7QUFDQSxzQkFBc0IsQ0FBQztBQUN2QixrQkFBa0IsQ0FBQztBQUNuQjtBQUNBLFVBQVU7QUFDVixzQkFBc0IsQ0FBQztBQUN2QjtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixDQUFDO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0VBQW9FLENBQUM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixDQUFDO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsaUVBQWlFLENBQUM7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixDQUFDO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsbUVBQW1FLENBQUM7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0EsU0FBUztBQUNULHFCQUFxQixDQUFDLGdHQUFnRyxDQUFDO0FBQ3ZIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBLFNBQVM7QUFDVCxpQ0FBaUMsQ0FBQyx5Q0FBeUMsQ0FBQyxtR0FBbUcsQ0FBQztBQUNoTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEI7QUFDQSxTQUFTO0FBQ1QscUJBQXFCLENBQUMsNkZBQTZGLENBQUM7QUFDcEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEI7QUFDQSxTQUFTO0FBQ1QscUJBQXFCLENBQUMsdUVBQXVFLENBQUM7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0EsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEI7QUFDQSxTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0EsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEI7QUFDQSxTQUFTO0FBQ1QscUJBQXFCLENBQUM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0EsU0FBUztBQUNULHFCQUFxQixDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBLFNBQVM7QUFDVCxxQkFBcUIsQ0FBQztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsU0FBUztBQUNULHFCQUFxQixDQUFDLHdEQUF3RCxDQUFDLDZDQUE2QyxDQUFDO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixTQUFTO0FBQ1QscUJBQXFCLENBQUMsdURBQXVELENBQUMsNkNBQTZDLENBQUM7QUFDNUg7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsQ0FBQztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxDQUFDO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmZhY2UvaHRtbDUvdmlld3Mvd2l6YXJkL2luc3RhbGwvSW5zdGFsbFdpemFyZENvbnRyb2xsZXIuanM/MDVlNyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgSW5zdGFsbFdpemFyZENvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlV2l6YXJkQ29udHJvbGxlciB7XG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zID0ge30gKSB7XG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0ZWw6ICcuaW5zdGFsbC13aXphcmQnLFxuXG5cdFx0XHR0eXBlX2FycmF5OiBudWxsLFxuXG5cdFx0XHRjb3VudHJ5X2FycmF5OiBudWxsLFxuXG5cdFx0XHR0aW1lX3pvbmVfYXJyYXk6IG51bGwsXG5cblx0XHRcdGV4dGVybmFsX2luc3RhbGxlcjogbnVsbCxcblxuXHRcdFx0Y29tcGFueV9pZDogbnVsbCxcblxuXHRcdFx0dXNlcl9pZDogbnVsbCxcblxuXHRcdFx0ZWRpdF92aWV3X2Vycm9yX3VpX2RpYzoge30sXG5cblxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXHRcdC8vdGhpcy5fc3VwZXIoJ2luaXRpYWxpemUnLCBvcHRpb25zICk7XG5cdFx0dGhpcy50aXRsZV8xID0gJCggdGhpcy5lbCApLmZpbmQoICcudGl0bGUtMScgKTtcblx0XHR0aGlzLnN0ZXBzID0gNTtcblx0XHR0aGlzLnNjcmlwdF9uYW1lID0gJ3dpemFyZF9pbnN0YWxsJztcblx0XHR0aGlzLndpemFyZF9pZCA9ICdJbnN0YWxsV2l6YXJkJztcblx0XHR0aGlzLmFwaSA9IFRUQVBJLkFQSUluc3RhbGw7XG5cdFx0U2VydmljZUNhbGxlci5leHRyYV91cmwgPSAnJmRpc2FibGVfZGI9MSc7XG5cdFx0aWYgKCBfLnNpemUoIExvY2FsQ2FjaGVEYXRhLmdldEFsbFVSTEFyZ3MoKSApID4gMCApIHtcblx0XHRcdHZhciB1cmxfYXJncyA9IExvY2FsQ2FjaGVEYXRhLmdldEFsbFVSTEFyZ3MoKTtcblx0XHRcdHRoaXMuY3VycmVudF9zdGVwID0gdXJsX2FyZ3MuYTtcblx0XHRcdHRoaXMuZXh0ZXJuYWxfaW5zdGFsbGVyID0gdXJsX2FyZ3MuZXh0ZXJuYWxfaW5zdGFsbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRfc3RlcCA9ICdsaWNlbnNlJztcblx0XHRcdHRoaXMuZXh0ZXJuYWxfaW5zdGFsbGVyID0gMDtcblx0XHR9XG5cblx0XHR0aGlzLnJlbmRlcigpO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHRpdGxlID0gJCggdGhpcy5lbCApLmZpbmQoICcudGl0bGUnICk7XG5cblx0XHR0aGlzLm5leHRfYnRuID0gJCggdGhpcy5lbCApLmZpbmQoICcuZm9yd2FyZC1idG4nICk7XG5cdFx0dGhpcy5iYWNrX2J0biA9ICQoIHRoaXMuZWwgKS5maW5kKCAnLmJhY2stYnRuJyApO1xuXHRcdHRoaXMuZG9uZV9idG4gPSAkKCB0aGlzLmVsICkuZmluZCggJy5kb25lLWJ0bicgKTtcblxuXHRcdHRpdGxlLnRleHQoICQuaTE4bi5fKCAnSW5zdGFsbCBXaXphcmQnICkgKTtcblxuXHRcdHRoaXMuaW5pdEN1cnJlbnRTdGVwKCk7XG5cdH1cblxuXHRpbml0Q3VycmVudFN0ZXAoIHN0ZXAgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdGlmICggc3RlcCApIHtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3RlcCA9IHRoaXMuY3VycmVudF9zdGVwO1xuXHRcdH1cblxuXHRcdFByb2dyZXNzQmFyLnNob3dPdmVybGF5KCk7XG5cblx0XHRzd2l0Y2ggKCBzdGVwICkge1xuXHRcdFx0Y2FzZSAnbGljZW5zZSc6XG5cdFx0XHRcdHRoaXMuYXBpLmdldExpY2Vuc2UoIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdCR0aGlzLnN0ZXBzRGF0YURpY1skdGhpcy5jdXJyZW50X3N0ZXBdID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0JHRoaXMuX2luaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JlcXVpcmVtZW50cyc6XG5cdFx0XHRcdHRoaXMuYXBpLmdldFJlcXVpcmVtZW50cyggdGhpcy5leHRlcm5hbF9pbnN0YWxsZXIsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdGlmICggcmVzLmlzVmFsaWQoKSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCByZXMuZ2V0UmVzdWx0KCkuYWN0aW9uICkge1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLm9uTmV4dENsaWNrKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuc3RlcHNEYXRhRGljWyR0aGlzLmN1cnJlbnRfc3RlcF0gPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuX2luaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3N0ZXAgPSAnbGljZW5zZSc7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2RhdGFiYXNlU2NoZW1hJzpcblx0XHRcdFx0U2VydmljZUNhbGxlci5leHRyYV91cmwgPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5hcGkuZ2V0RGF0YWJhc2VTY2hlbWEoIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdGlmICggcmVzLmlzVmFsaWQoKSApIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuc3RlcHNEYXRhRGljWyR0aGlzLmN1cnJlbnRfc3RlcF0gPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLl9pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfc3RlcCA9ICdsaWNlbnNlJztcblx0XHRcdFx0XHRcdFx0JHRoaXMuaW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZGF0YWJhc2VDb25maWcnOlxuXHRcdFx0XHR0aGlzLmFwaS5nZXREYXRhYmFzZUNvbmZpZygge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5zdGVwc0RhdGFEaWNbJHRoaXMuY3VycmVudF9zdGVwXSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMudHlwZV9hcnJheSA9IHJlcy5nZXRSZXN1bHQoKS50eXBlX29wdGlvbnM7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLl9pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfc3RlcCA9ICdsaWNlbnNlJztcblx0XHRcdFx0XHRcdFx0JHRoaXMuaW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncG9zdFVwZ3JhZGUnOlxuXHRcdFx0XHR0aGlzLmFwaS5wb3N0VXBncmFkZSgge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5zdGVwc0RhdGFEaWNbJHRoaXMuY3VycmVudF9zdGVwXSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuX2luaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zdGVwID0gJ2xpY2Vuc2UnO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3N5c3RlbVNldHRpbmdzJzpcblx0XHRcdFx0dGhpcy5hcGkuZ2V0U3lzdGVtU2V0dGluZ3MoIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdGlmICggcmVzLmlzVmFsaWQoKSApIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuc3RlcHNEYXRhRGljWyR0aGlzLmN1cnJlbnRfc3RlcF0gPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnRpbWVfem9uZV9hcnJheSA9IHJlcy5nZXRSZXN1bHQoKS50aW1lX3pvbmVfb3B0aW9ucztcblx0XHRcdFx0XHRcdFx0JHRoaXMuX2luaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zdGVwID0gJ2xpY2Vuc2UnO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjb21wYW55Jzpcblx0XHRcdFx0dGhpcy5hcGkuZ2V0Q29tcGFueSggdGhpcy5jb21wYW55X2lkLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHJlcy5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnN0ZXBzRGF0YURpY1skdGhpcy5jdXJyZW50X3N0ZXBdID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5faW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3N0ZXAgPSAnbGljZW5zZSc7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3VzZXInOlxuXHRcdFx0XHR2YXIgY29tcGFueV9pZCA9ICcnO1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5zdGVwc0RhdGFEaWNbdGhpcy5jdXJyZW50X3N0ZXBdICkgKSB7XG5cdFx0XHRcdFx0Y29tcGFueV9pZCA9IHRoaXMuc3RlcHNEYXRhRGljW3RoaXMuY3VycmVudF9zdGVwXVsnY29tcGFueV9pZCddO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuYXBpLmdldFVzZXIoIGNvbXBhbnlfaWQsIHRoaXMudXNlcl9pZCwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5zdGVwc0RhdGFEaWNbJHRoaXMuY3VycmVudF9zdGVwXSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuX2luaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zdGVwID0gJ2xpY2Vuc2UnO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdpbnN0YWxsRG9uZSc6XG5cdFx0XHRcdHZhciB1cGdyYWRlID0gJyc7XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCAkdGhpcy5zdGVwc0RhdGFEaWNbJHRoaXMuY3VycmVudF9zdGVwXSApICkge1xuXHRcdFx0XHRcdHVwZ3JhZGUgPSAkdGhpcy5zdGVwc0RhdGFEaWNbJHRoaXMuY3VycmVudF9zdGVwXVsndXBncmFkZSddO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuYXBpLmluc3RhbGxEb25lKCB1cGdyYWRlLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHJlcy5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnN0ZXBzRGF0YURpY1skdGhpcy5jdXJyZW50X3N0ZXBdID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5faW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3N0ZXAgPSAnbGljZW5zZSc7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21haW50ZW5hbmNlSm9icyc6XG5cdFx0XHRcdHRoaXMuYXBpLmdldE1haW50ZW5hbmNlSm9icygge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHJlcy5nZXRSZXN1bHQoKSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3N0ZXAgPSAnaW5zdGFsbERvbmUnO1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLnN0ZXBzRGF0YURpY1skdGhpcy5jdXJyZW50X3N0ZXBdID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLl9pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3N0ZXAgPSAnbGljZW5zZSc7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRfaW5pdEN1cnJlbnRTdGVwKCBzdGVwICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0JHRoaXMuc2V0QnV0dG9uc1N0YXR1cygpOyAvLyBzZXQgYnV0dG9uIGVuYWJsZWQgb3IgZGlzYWJsZWRcblx0XHQkdGhpcy5idWlsZEN1cnJlbnRTdGVwVUkoKTtcblx0XHQkdGhpcy5idWlsZEN1cnJlbnRTdGVwRGF0YSgpO1xuXHRcdCR0aGlzLnNldEN1cnJlbnRTdGVwVmFsdWVzKCk7XG5cdH1cblxuXHRzZXRCdXR0b25zU3RhdHVzKCkge1xuXHRcdGlmICggdGhpcy5jdXJyZW50X3N0ZXAgPT09ICdsaWNlbnNlJyApIHtcblx0XHRcdEdsb2JhbC5zZXRXaWRnZXRFbmFibGVkKCB0aGlzLmJhY2tfYnRuLCBmYWxzZSApO1xuXHRcdFx0R2xvYmFsLnNldFdpZGdldEVuYWJsZWQoIHRoaXMubmV4dF9idG4sIGZhbHNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEdsb2JhbC5zZXRXaWRnZXRFbmFibGVkKCB0aGlzLmJhY2tfYnRuLCB0cnVlICk7XG5cdFx0XHRHbG9iYWwuc2V0V2lkZ2V0RW5hYmxlZCggdGhpcy5uZXh0X2J0biwgdHJ1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5jdXJyZW50X3N0ZXAgIT09ICdpbnN0YWxsRG9uZScgKSB7XG5cdFx0XHRHbG9iYWwuc2V0V2lkZ2V0RW5hYmxlZCggdGhpcy5kb25lX2J0biwgZmFsc2UgKTtcbi8vXHRcdFx0R2xvYmFsLnNldFdpZGdldEVuYWJsZWQoIHRoaXMubmV4dF9idG4sIHRydWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0R2xvYmFsLnNldFdpZGdldEVuYWJsZWQoIHRoaXMuZG9uZV9idG4sIHRydWUgKTtcblx0XHRcdEdsb2JhbC5zZXRXaWRnZXRFbmFibGVkKCB0aGlzLm5leHRfYnRuLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdC8vQ3JlYXRlIGVhY2ggcGFnZSBVSVxuXHRidWlsZEN1cnJlbnRTdGVwVUkoKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBzdGVwX3RpdGxlID0gdGhpcy5jb250ZW50X2Rpdi5maW5kKCAnLnN0ZXAtdGl0bGUgPiAud2l6YXJkLWxhYmVsJyApO1xuXHRcdHZhciBsaWNlbnNlID0gdGhpcy5jb250ZW50X2Rpdi5maW5kKCAnLmxpY2Vuc2UnICk7XG5cdFx0dmFyIHJlcXVpcmVtZW50cyA9IHRoaXMuY29udGVudF9kaXYuZmluZCggJy5yZXF1aXJlbWVudHMnICk7XG5cdFx0dmFyIGRhdGFiYXNlQ29uZmlnID0gdGhpcy5jb250ZW50X2Rpdi5maW5kKCAnLmRhdGFiYXNlQ29uZmlnJyApO1xuXHRcdHZhciBkYXRhYmFzZVNjaGVtYSA9IHRoaXMuY29udGVudF9kaXYuZmluZCggJy5kYXRhYmFzZVNjaGVtYScgKTtcblx0XHR2YXIgcG9zdFVwZ3JhZGUgPSB0aGlzLmNvbnRlbnRfZGl2LmZpbmQoICcucG9zdFVwZ3JhZGUnICk7XG5cdFx0dmFyIHN5c3RlbVNldHRpbmdzID0gdGhpcy5jb250ZW50X2Rpdi5maW5kKCAnLnN5c3RlbVNldHRpbmdzJyApO1xuXHRcdHZhciBjb21wYW55ID0gdGhpcy5jb250ZW50X2Rpdi5maW5kKCAnLmNvbXBhbnknICk7XG5cdFx0dmFyIHVzZXIgPSB0aGlzLmNvbnRlbnRfZGl2LmZpbmQoICcudXNlcicgKTtcblx0XHR2YXIgaW5zdGFsbERvbmUgPSB0aGlzLmNvbnRlbnRfZGl2LmZpbmQoICcuaW5zdGFsbERvbmUnICk7XG5cdFx0dmFyIG1haW50ZW5hbmNlSm9icyA9IHRoaXMuY29udGVudF9kaXYuZmluZCggJy5tYWludGVuYW5jZUpvYnMnICk7XG5cblx0XHR2YXIgZm9ybV9pdGVtX2lucHV0O1xuXHRcdHZhciBzdGVwRGF0YSA9IHRoaXMuc3RlcHNEYXRhRGljW3RoaXMuY3VycmVudF9zdGVwXTtcblx0XHR0aGlzLmNvbnRlbnRfZGl2LmZpbmQoICcuc3RlcCcgKS5oaWRlKCk7XG5cdFx0dGhpcy5jb250ZW50X2Rpdi5maW5kKCAnLmNvbnRlbnQtaGFuZGxlLWJ0bicgKS5lbXB0eSgpO1xuXG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdICkgKSB7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF0gPSB7fTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKCB0aGlzLmN1cnJlbnRfc3RlcCApIHtcblx0XHRcdGNhc2UgJ2xpY2Vuc2UnOlxuXHRcdFx0XHRsaWNlbnNlLmVtcHR5KCk7XG5cdFx0XHRcdHRoaXMudGl0bGVfMS50ZXh0KCAkLmkxOG4uXyggJ0xpY2Vuc2UgQWNjZXB0YW5jZScgKSApO1xuXHRcdFx0XHRpZiAoIHN0ZXBEYXRhWydpbnN0YWxsX21vZGUnXSApIHtcblx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhWydsaWNlbnNlX3RleHQnXSApIHtcblx0XHRcdFx0XHRcdHN0ZXBfdGl0bGUudGV4dCggJC5pMThuLl8oICdQbGVhc2UgcmVhZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbmQgaWYgeW91IGFncmVlIGFuZCBhY2NlcHQgaXQsIGNsaWNrIHRoZSAnICsgJ1wiJyArICQuaTE4bi5fKCAnSSBBY2NlcHQnICkgKyAnXCInICsgJ2NoZWNrYm94IGF0IHRoZSBib3R0b20uJyApICk7XG5cblx0XHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9BUkVBICk7XG5cdFx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRBcmVhKCB7IGZpZWxkOiAnbGljZW5zZV90ZXh0Jywgd2lkdGg6ICc2NSUnLCBoZWlnaHQ6ICc4MCUnIH0gKTtcblx0XHRcdFx0XHRcdHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdFx0XHRcdFx0bGljZW5zZS5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRsaWNlbnNlLmFwcGVuZCggc3RlcERhdGFbJ2Vycm9yX21lc3NhZ2UnXSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxpY2Vuc2UuYXBwZW5kKCAnPGJyPicgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVENoZWNrYm94KCB7IGZpZWxkOiAnbGljZW5zZV9hY2NlcHQnIH0gKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdEdsb2JhbC5zZXRXaWRnZXRFbmFibGVkKCAkdGhpcy5uZXh0X2J0biwgdHJ1ZSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0R2xvYmFsLnNldFdpZGdldEVuYWJsZWQoICR0aGlzLm5leHRfYnRuLCBmYWxzZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdFx0XHRcdGxpY2Vuc2UuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblxuXHRcdFx0XHRcdHZhciBhY2NlcHRfbGFiZWwgPSAnPHNwYW4+ICcgKyAkLmkxOG4uXyggJ0kgQWNjZXB0JyApICsgJzwvc3Bhbj4nO1xuXG5cdFx0XHRcdFx0bGljZW5zZS5hcHBlbmQoIGFjY2VwdF9sYWJlbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIGxpY2Vuc2VfaHRtbCA9ICQuaTE4bi5fKCAnVGhlIGluc3RhbGxlciBoYXMgYWxyZWFkeSBiZWVuIHJ1biwgYXMgYSBzYWZldHkgbWVhc3VyZSBpdCBoYXMgYmVlbiBkaXNhYmxlZCBmcm9tIHJ1bm5pbmcgYWdhaW4uIElmIHlvdSBhcmUgYWJzb2x1dGVseSBzdXJlIHlvdSB3YW50IHRvIHJ1biBpdCBhZ2Fpbiwgb3IgdXBncmFkZSB5b3VyIHN5c3RlbSwgcGxlYXNlIGdvIHRvIHlvdXIgdGltZXRyZXguaW5pLnBocCBmaWxlIGFuZCBzZXQgXCJpbnN0YWxsZXJfZW5hYmxlZFwiIHRvIFwiVFJVRVwiLiBUaGUgbGluZSBzaG91bGQgbG9vayBsaWtlJyApICsgJzonO1xuXHRcdFx0XHRcdGxpY2Vuc2VfaHRtbCA9IGxpY2Vuc2VfaHRtbCArICc8YnI+Jztcblx0XHRcdFx0XHRsaWNlbnNlX2h0bWwgPSBsaWNlbnNlX2h0bWwgKyAnPGJyPic7XG5cdFx0XHRcdFx0bGljZW5zZV9odG1sID0gbGljZW5zZV9odG1sICsgJ1wiJyArICc8Yj5pbnN0YWxsZXJfZW5hYmxlZCA9IFRSVUU8L2I+JyArICdcIic7XG5cdFx0XHRcdFx0bGljZW5zZV9odG1sID0gbGljZW5zZV9odG1sICsgJzxicj4nO1xuXHRcdFx0XHRcdGxpY2Vuc2VfaHRtbCA9IGxpY2Vuc2VfaHRtbCArICc8YnI+Jztcblx0XHRcdFx0XHRsaWNlbnNlX2h0bWwgPSBsaWNlbnNlX2h0bWwgKyAkLmkxOG4uXyggJ0FmdGVyIHRoaXMgY2hhbmdlIGhhcyBiZWVuIG1hZGUsIHlvdSBjYW4gY2xpY2sgdGhlIFwiUmUtQ2hlY2tcIiBidXR0b24gYmVsb3cgdG8gYmVnaW4geW91ciBpbnN0YWxsYXRpb24uJyApO1xuXHRcdFx0XHRcdGxpY2Vuc2VfaHRtbCA9IGxpY2Vuc2VfaHRtbCArICc8YnI+Jztcblx0XHRcdFx0XHRsaWNlbnNlX2h0bWwgPSBsaWNlbnNlX2h0bWwgKyAnPGJyPic7XG5cdFx0XHRcdFx0bGljZW5zZV9odG1sID0gbGljZW5zZV9odG1sICsgJC5pMThuLl8oICdGb3IgaGVscCwgcGxlYXNlIHZpc2l0JyApICsgJyA8YSBocmVmPVwiaHR0cHM6Ly93d3cudGltZXRyZXguY29tXCI+d3d3LnRpbWV0cmV4LmNvbTwvYT4gJztcblx0XHRcdFx0XHRsaWNlbnNlLmFwcGVuZCggbGljZW5zZV9odG1sICk7XG5cblx0XHRcdFx0XHR2YXIgcmliYm9uX2J1dHRvbl9ib3ggPSB0aGlzLmdldFJpYmJvbkJ1dHRvbkJveCgpO1xuXG5cdFx0XHRcdFx0dmFyIHJpYmJvbl9idG4gPSAkKCAnPGxpPjxidXR0b24gY2xhc3M9XCJyaWJib24tc3ViLW1lbnUtaWNvblwiIGlkPVwicmUtY2hlY2tcIj4nICsgJC5pMThuLl8oICdSZS1DaGVjaycgKSArICc8L2J1dHRvbj48L2xpPicgKTtcblx0XHRcdFx0XHRyaWJib25fYnRuLnVuYmluZCggJ2NsaWNrJyApLmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0UHJvZ3Jlc3NCYXIuc2hvd092ZXJsYXkoKTtcblx0XHRcdFx0XHRcdCR0aGlzLmFwaS5nZXRMaWNlbnNlKCB7XG5cdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLnN0ZXBzRGF0YURpY1skdGhpcy5jdXJyZW50X3N0ZXBdID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLl9pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0cmliYm9uX2J1dHRvbl9ib3guY2hpbGRyZW4oKS5lcSggMCApLmFwcGVuZCggcmliYm9uX2J0biApO1xuXG5cdFx0XHRcdFx0dGhpcy5jb250ZW50X2Rpdi5maW5kKCAnLmNvbnRlbnQtaGFuZGxlLWJ0bicgKS5odG1sKCByaWJib25fYnV0dG9uX2JveCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsaWNlbnNlLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ3JlcXVpcmVtZW50cyc6XG5cblx0XHRcdFx0dmFyIHN0ZXBfdGl0bGVfaHRtID0gJC5pMThuLl8oICdJbiBvcmRlciBmb3IgeW91cicgKSArICcgJ1xuXHRcdFx0XHRcdCsgJC5pMThuLl8oIHN0ZXBEYXRhLmFwcGxpY2F0aW9uX25hbWUgKSArICcgJ1xuXHRcdFx0XHRcdCsgJC5pMThuLl8oICdpbnN0YWxsYXRpb24gdG8gZnVuY3Rpb24gcHJvcGVybHksIHBsZWFzZSBlbnN1cmUgYWxsIG9mIHRoZSBzeXN0ZW0gY2hlY2sgaXRlbXMgbGlzdGVkIGJlbG93IGFyZSBtYXJrZWQgYXMnICkgKyAnICdcblx0XHRcdFx0XHQrICc8Yj5PSzwvYj4nICsgJy4gJ1xuXHRcdFx0XHRcdCsgJC5pMThuLl8oICdJZiBhbnkgYXJlIHJlZCwgcGxlYXNlIHRha2UgdGhlIG5lY2Vzc2FyeSBzdGVwcyB0byBmaXggdGhlbS4nICk7XG5cblx0XHRcdFx0aWYgKCBzdGVwRGF0YS5jaGVja19hbGxfcmVxdWlyZW1lbnRzICE9IDAgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhLnR0X3Byb2R1Y3RfZWRpdGlvbiA+IDEwICkge1xuXHRcdFx0XHRcdFx0c3RlcF90aXRsZV9odG0gPSBzdGVwX3RpdGxlX2h0bVxuXHRcdFx0XHRcdFx0XHQrICc8cCBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICNGRkZGMDBcIj4nXG5cdFx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdGb3IgaW5zdGFsbGF0aW9uIGFzc2lzdGFuY2UsIHBsZWFzZSBjb250YWN0JyApICsgJyAnXG5cdFx0XHRcdFx0XHRcdCsgJzxhIGhyZWY9XCJodHRwczovL3d3dy50aW1ldHJleC5jb20vY29udGFjdC11c1wiIHRhcmdldD1cIl9ibGFua1wiPicgKyAkLmkxOG4uXyggJ1RpbWVUcmV4IHN1cHBvcnQnICkgKyAnPC9hPic7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggc3RlcERhdGEudHRfcHJvZHVjdF9lZGl0aW9uID09IDEwICkge1xuXG5cdFx0XHRcdFx0XHRzdGVwX3RpdGxlX2h0bSA9IHN0ZXBfdGl0bGVfaHRtXG5cdFx0XHRcdFx0XHRcdCsgJzxwIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMFwiPidcblx0XHRcdFx0XHRcdFx0KyAkLmkxOG4uXyggJ0ZvciBpbnN0YWxsYXRpb24gYXNzaXN0YW5jZSwgcGxlYXNlIGpvaW4gb3VyIGNvbW11bml0eScgKSArICcgJ1xuXHRcdFx0XHRcdFx0XHQrICc8YSBocmVmPVwiaHR0cHM6Ly9mb3J1bXMudGltZXRyZXguY29tXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JyArICQuaTE4bi5fKCAnZm9ydW1zJyApICsgJzwvYT4nXG5cdFx0XHRcdFx0XHRcdCsgJyAnICsgJC5pMThuLl8oICdvciBjb250YWN0IGEgVGltZVRyZXggc3VwcG9ydCBleHBlcnQgZm9yJyApICsgJyAnXG5cdFx0XHRcdFx0XHRcdCsgJzxhIGhyZWY9XCJodHRwczovL3d3dy50aW1ldHJleC5jb20vc2V0dXAtc3VwcG9ydFwiIHRhcmdldD1cIl9ibGFua1wiPicgKyAkLmkxOG4uXyggJ0ltcGxlbWVudGF0aW9uIFN1cHBvcnQgU2VydmljZXMnICkgKyAnPC9hPjwvcD4nO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzdGVwRGF0YS5jaGVja19hbGxfcmVxdWlyZW1lbnRzID09IDEgKSB7XG5cdFx0XHRcdFx0R2xvYmFsLnNldFdpZGdldEVuYWJsZWQoIHRoaXMubmV4dF9idG4sIGZhbHNlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIF8uc2l6ZSggc3RlcERhdGEuZXh0ZW5kZWRfZXJyb3JfbWVzc2FnZXMgKSA+IDAgKSB7XG5cdFx0XHRcdFx0R2xvYmFsLnNldFdpZGdldEVuYWJsZWQoIHRoaXMubmV4dF9idG4sIGZhbHNlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGVwX3RpdGxlLmh0bWwoIHN0ZXBfdGl0bGVfaHRtICk7XG5cblx0XHRcdFx0dGhpcy50aXRsZV8xLnRleHQoICQuaTE4bi5fKCAnU3lzdGVtIENoZWNrIEFjY2VwdGFuY2UnICkgKTtcblxuXHRcdFx0XHQvLyB0aW1ldHJleCB2ZXJzaW9uLCBwaHAgdmVyc2lvbi5cblx0XHRcdFx0dmFyIHJlcXVpcmVtZW50c19jb2x1bW4xID0gcmVxdWlyZW1lbnRzLmZpbmQoICcuZmlyc3QtY29sdW1uJyApO1xuXHRcdFx0XHRyZXF1aXJlbWVudHNfY29sdW1uMS5lbXB0eSgpO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICd0aW1ldHJleF92ZXJzaW9uJyB9ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVGltZVRyZXggVmVyc2lvbicgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMSwgJycgKTtcblxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAncGhwX3ZlcnNpb24nIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQSFAgVmVyc2lvbicgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMSwgJycgKTtcblxuXHRcdFx0XHRyZXF1aXJlbWVudHMuZmluZCggJy5maXJzdC1sYWJlbCcgKS5lbXB0eSgpO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuU0VQQVJBVEVEX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuU2VwYXJhdGVkQm94KCB7IGxhYmVsOiAkLmkxOG4uXyggJ1BIUCBSZXF1aXJlbWVudHMnICkgfSApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCBudWxsLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50cy5maW5kKCAnLmZpcnN0LWxhYmVsJyApICk7XG5cblx0XHRcdFx0dmFyIHJlcXVpcmVtZW50c19jb2x1bW4yID0gcmVxdWlyZW1lbnRzLmZpbmQoICcuc2Vjb25kLWNvbHVtbicgKTtcblx0XHRcdFx0cmVxdWlyZW1lbnRzX2NvbHVtbjIuZW1wdHkoKTtcblx0XHRcdFx0aWYgKCBzdGVwRGF0YS5jaGVja19hbGxfcmVxdWlyZW1lbnRzID09IDAgKSB7XG5cdFx0XHRcdFx0cmVxdWlyZW1lbnRzX2NvbHVtbjIuaHRtbCggJC5pMThuLl8oICdBbGwgU3lzdGVtIFJlcXVpcmVtZW50cyBoYXZlIGJlZW4gbWV0IHN1Y2Nlc3NmdWxseScgKSArICchJyApO1xuXHRcdFx0XHRcdHJlcXVpcmVtZW50c19jb2x1bW4yLmFkZENsYXNzKCAnYWxsLW9rJyApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHBocCByZXF1aXJlbWVudHNcblx0XHRcdFx0XHRyZXF1aXJlbWVudHNfY29sdW1uMi5yZW1vdmVDbGFzcyggJ2FsbC1vaycgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdkYXRhYmFzZV9lbmdpbmUnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1Bvc3RncmVTUUwgRW5hYmxlZCcgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2JjbWF0aCcgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQkNNQVRIIEVuYWJsZWQnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdtYnN0cmluZycgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTUJTVFJJTkcgRW5hYmxlZCcgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2dldHRleHQnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0dFVFRFWFQgRW5hYmxlZCcgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2ludGwnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0lOVEwgRW5hYmxlZCcgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3NvYXAnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1NPQVAgRW5hYmxlZCcgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2dkJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdHRCBFbmFibGVkJyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnanNvbicgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnSlNPTiBFbmFibGVkJyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnc2ltcGxleG1sJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTaW1wbGVYTUwgRW5hYmxlZCcgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2N1cmwnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NVUkwgRW5hYmxlZCcgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3ppcCcgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnWklQIEVuYWJsZWQnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdtYWlsJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNQUlMIEVuYWJsZWQnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdvcGVuc3NsJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdPcGVuU1NMIEVuYWJsZWQnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdwZWFyJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQRUFSIEVuYWJsZWQnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdzYWZlX21vZGUnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1NhZmUgTW9kZSBUdXJuZWQgT2ZmJyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnZGlzYWJsZWRfZnVuY3Rpb25zJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQSFAgRElTQUJMRV9GVU5DVElPTlMnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdhbGxvd19mb3Blbl91cmwnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0FMTE9XX0ZPUEVOX1VSTCBUdXJuZWQgT2ZmJyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnZGlza19zcGFjZScgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGlzayBTcGFjZScgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdC8vIG90aGVyIHJlcXVpcmVtZW50c1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ21lbW9yeV9saW1pdCcgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWVtb3J5IExpbWl0JyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAncG9zdF9zaXplJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNYXggUG9zdCBTaXplJyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAndXBsb2FkX3NpemUnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ01heCBVcGxvYWQgU2l6ZScgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2Jhc2VfdXJsJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdCYXNlIFVSTCcgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3N5c3RlbV90aW1lem9uZScgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU3lzdGVtIFRpbWVab25lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAncGhwX2ludF9zaXplJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQSFAgNjQtYml0IFN1cHBvcnQnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdiYXNlX2RpcicgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUEhQIE9wZW4gQmFzZURpcicgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2NsaV9leGVjdXRhYmxlJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQSFAgQ0xJIEV4ZWN1dGFibGUnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHQoIHsgZmllbGQ6ICdjb25maWdfZmlsZScgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnV3JpdGFibGUnICkgKyAnICcgKyAkLmkxOG4uXyggc3RlcERhdGEuYXBwbGljYXRpb25fbmFtZSApICsgJyAnICsgJC5pMThuLl8oICdDb25maWd1cmF0aW9uIEZpbGUnICkgKyAnPGJyPicgKyAnKHRpbWV0cmV4LmluaS5waHApJywgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2NhY2hlX2RpcicgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnV3JpdGFibGUgQ2FjaGUgRGlyZWN0b3J5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3NhZmVfY2FjaGVfZGlyJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTZWN1cmUgQ2FjaGUgRGlyZWN0b3J5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnc3RvcmFnZV9kaXInIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1dyaXRhYmxlIFN0b3JhZ2UgRGlyZWN0b3J5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3NhZmVfc3RvcmFnZV9kaXInIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1NlY3VyZSBTdG9yYWdlIERpcmVjdG9yeScgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2xvZ19kaXInIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1dyaXRhYmxlIExvZyBEaXJlY3RvcnknICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnc2FmZV9sb2dfZGlyJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTZWN1cmUgTG9nIERpcmVjdG9yeScgKSwgZm9ybV9pdGVtX2lucHV0LCByZXF1aXJlbWVudHNfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2VtcHR5X2NhY2hlX2RpcicgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW1wdHkgQ2FjaGUgRGlyZWN0b3J5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnZmlsZV9wZXJtaXNzaW9uJyB9ICk7XG5cdFx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdGaWxlIFBlcm1pc3Npb25zJyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnZmlsZV9jaGVja3N1bXMnIH0gKTtcblx0XHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0ZpbGUgQ2hlY2tTdW1zJyApLCBmb3JtX2l0ZW1faW5wdXQsIHJlcXVpcmVtZW50c19jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnY2xpX3JlcXVpcmVtZW50cycgfSApO1xuXHRcdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUEhQIENMSSBSZXF1aXJlbWVudHMnICksIGZvcm1faXRlbV9pbnB1dCwgcmVxdWlyZW1lbnRzX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBmb3J0aCBjb2x1bW5cblxuXHRcdFx0XHR2YXIgcmVxdWlyZW1lbnRzX2NvbHVtbjQgPSByZXF1aXJlbWVudHMuZmluZCggJy5mb3J0aC1jb2x1bW4nICk7XG5cdFx0XHRcdHJlcXVpcmVtZW50c19jb2x1bW40LmVtcHR5KCk7XG5cblx0XHRcdFx0aWYgKCBfLnNpemUoIHN0ZXBEYXRhLmV4dGVuZGVkX2Vycm9yX21lc3NhZ2VzICkgPiAwICkge1xuXHRcdFx0XHRcdHZhciBlcnJvcl9odG1sID0gJzxzcGFuPjxiPicgKyAkLmkxOG4uXyggJ0RldGFpbGVkIEVycm9yIE1lc3NhZ2VzJyApICsgJzwvYj48L3NwYW4+Jztcblx0XHRcdFx0XHRlcnJvcl9odG1sID0gZXJyb3JfaHRtbCArICc8YnI+Jztcblx0XHRcdFx0XHRlcnJvcl9odG1sID0gZXJyb3JfaHRtbCArICc8YnI+Jztcblx0XHRcdFx0XHRmb3IgKCB2YXIgaSBpbiBzdGVwRGF0YS5leHRlbmRlZF9lcnJvcl9tZXNzYWdlcyApIHtcblx0XHRcdFx0XHRcdHZhciBlcnJvcnMgPSBzdGVwRGF0YVsnZXh0ZW5kZWRfZXJyb3JfbWVzc2FnZXMnXVtpXTtcblx0XHRcdFx0XHRcdGZvciAoIHZhciBrZXkgaW4gZXJyb3JzICkge1xuXHRcdFx0XHRcdFx0XHRlcnJvcl9odG1sID0gZXJyb3JfaHRtbCArIGVycm9yc1trZXldO1xuXHRcdFx0XHRcdFx0XHRlcnJvcl9odG1sID0gZXJyb3JfaHRtbCArICc8YnI+Jztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXF1aXJlbWVudHNfY29sdW1uNC5odG1sKCBlcnJvcl9odG1sICk7XG5cdFx0XHRcdFx0cmVxdWlyZW1lbnRzX2NvbHVtbjQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVxdWlyZW1lbnRzX2NvbHVtbjQucmVtb3ZlQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBmaWZ0aCBjb2x1bW5cblx0XHRcdFx0dmFyIHJlcXVpcmVtZW50c19jb2x1bW41ID0gcmVxdWlyZW1lbnRzLmZpbmQoICcuZmlmdGgtY29sdW1uJyApO1xuXHRcdFx0XHRyZXF1aXJlbWVudHNfY29sdW1uNS5lbXB0eSgpO1xuXG5cdFx0XHRcdHZhciBjb2x1bW5zX2h0bWwgPSAkLmkxOG4uXyggJ1lvdXInICkgKyAnICcgKyAkLmkxOG4uXyggc3RlcERhdGFbJ2FwcGxpY2F0aW9uX25hbWUnXSApICsgJyAnICsgJC5pMThuLl8oICdjb25maWd1cmF0aW9uIGZpbGUnICkgKyAnICc7XG5cdFx0XHRcdGNvbHVtbnNfaHRtbCA9IGNvbHVtbnNfaHRtbCArICcodGltZXRyZXguaW5pLnBocCknO1xuXHRcdFx0XHRjb2x1bW5zX2h0bWwgPSBjb2x1bW5zX2h0bWwgKyAnICcgKyAkLmkxOG4uXyggJ2lzIGxvY2F0ZWQgYXQnICkgKyAnOic7XG5cdFx0XHRcdGNvbHVtbnNfaHRtbCA9IGNvbHVtbnNfaHRtbCArICc8YnI+Jztcblx0XHRcdFx0Y29sdW1uc19odG1sID0gY29sdW1uc19odG1sICsgJzxwPjxiPicgKyBzdGVwRGF0YVsnY29uZmlnX2ZpbGVfbG9jJ10gKyAnPC9iPjwvcD4nO1xuXHRcdFx0XHRjb2x1bW5zX2h0bWwgPSBjb2x1bW5zX2h0bWwgKyAnPGJyPic7XG5cdFx0XHRcdGNvbHVtbnNfaHRtbCA9IGNvbHVtbnNfaHRtbCArICQuaTE4bi5fKCAnWW91ciBQSFAgY29uZmlndXJhdGlvbiBmaWxlJyApICsgJyAnICsgJyhwaHAuaW5pKScgKyAnICcgKyAkLmkxOG4uXyggJ2lzIGxvY2F0ZWQgYXQnICkgKyAnOic7XG5cdFx0XHRcdGNvbHVtbnNfaHRtbCA9IGNvbHVtbnNfaHRtbCArICc8YnI+JztcblxuXHRcdFx0XHRpZiAoIHN0ZXBEYXRhWydwaHBfaW5jbHVkZV9wYXRoJ10gKSB7XG5cdFx0XHRcdFx0Y29sdW1uc19odG1sID0gY29sdW1uc19odG1sICsgJzxwPjxiPicgKyBzdGVwRGF0YVsncGhwX2NvbmZpZ19maWxlJ10gKyAnPC9iPicgKyAnLCAnICsgJC5pMThuLl8oICd0aGUgaW5jbHVkZSBwYXRoIGlzJyApICsgJzogJyArICdcIicgKyAnPGI+JyArIHN0ZXBEYXRhWydwaHBfaW5jbHVkZV9wYXRoJ10gKyAnPC9iPicgKyAnXCInICsgJzwvcD4nO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbHVtbnNfaHRtbCA9IGNvbHVtbnNfaHRtbCArICc8cD48Yj4nICsgc3RlcERhdGFbJ3BocF9jb25maWdfZmlsZSddICsgJzwvYj4nICsgJywgJyArICQuaTE4bi5fKCAndGhlIGluY2x1ZGUgcGF0aCBpcycgKSArICc6ICcgKyAnXCJcIicgKyAnPC9wPic7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2x1bW5zX2h0bWwgPSBjb2x1bW5zX2h0bWwgKyAkLmkxOG4uXyggJ0RldGFpbGVkJyApICsgJyZuYnNwOyc7XG5cdFx0XHRcdGNvbHVtbnNfaHRtbCA9IGNvbHVtbnNfaHRtbCArICc8YSBocmVmPVwicGhwaW5mby5waHBcIiB0YXJnZXQ9XCJfYmxhbmtcIj4nICsgJC5pMThuLl8oICdQSFAgSW5mb3JtYXRpb24nICkgKyAnPC9hPic7XG5cblx0XHRcdFx0aWYgKCBzdGVwRGF0YS5jaGVja19hbGxfcmVxdWlyZW1lbnRzID09IDAgKSB7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXF1aXJlbWVudHNfY29sdW1uNS5odG1sKCBjb2x1bW5zX2h0bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciByaWJib25fYnV0dG9uX2JveCA9IHRoaXMuZ2V0UmliYm9uQnV0dG9uQm94KCk7XG5cbi8vXHRcdFx0XHRyaWJib25fYnV0dG9uX2JveC5jc3MoICd3aWR0aCcsICc5NiUnICk7XG5cdFx0XHRcdHZhciByaWJib25fYnRuID0gJCggJzxsaT48YnV0dG9uIGNsYXNzPVwicmliYm9uLXN1Yi1tZW51LWljb25cIiBpZD1cInJlLWNoZWNrXCI+JyArICQuaTE4bi5fKCAnUmUtQ2hlY2snICkgKyAnPC9idXR0b24+PC9saT4nICk7XG5cdFx0XHRcdHJpYmJvbl9idG4udW5iaW5kKCAnY2xpY2snICkuYmluZCggJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0UHJvZ3Jlc3NCYXIuc2hvd092ZXJsYXkoKTtcblx0XHRcdFx0XHQkdGhpcy5hcGkuZ2V0UmVxdWlyZW1lbnRzKCAkdGhpcy5leHRlcm5hbF9pbnN0YWxsZXIsIHtcblx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHJlcy5nZXRSZXN1bHQoKS5hY3Rpb24gKSB7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMub25OZXh0Q2xpY2soKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggcmVzLmlzVmFsaWQoKSApIHtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5zdGVwc0RhdGFEaWNbJHRoaXMuY3VycmVudF9zdGVwXSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5faW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHJpYmJvbl9idXR0b25fYm94LmNoaWxkcmVuKCkuZXEoIDAgKS5hcHBlbmQoIHJpYmJvbl9idG4gKTtcblxuXHRcdFx0XHR0aGlzLmNvbnRlbnRfZGl2LmZpbmQoICcuY29udGVudC1oYW5kbGUtYnRuJyApLmh0bWwoIHJpYmJvbl9idXR0b25fYm94ICk7XG5cblx0XHRcdFx0cmVxdWlyZW1lbnRzLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyJzpcblx0XHRcdFx0c3RlcF90aXRsZS5odG1sKCAkLmkxOG4uXyggJ1BsZWFzZSBlbnRlciB0aGUgYWRtaW5pc3RyYXRvciB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkJyApXG5cdFx0XHRcdFx0KyAnPGJyPidcblx0XHRcdFx0XHQrICc8YnI+J1xuXHRcdFx0XHRcdCsgJzxiPicgKyAnKicgKyAkLmkxOG4uXyggJ0lNUE9SVEFOVCcgKSArICcqJyArICc6JyArICc8L2I+JyArICcgJ1xuXHRcdFx0XHRcdCsgJC5pMThuLl8oICdQbGVhc2Ugd3JpdGUgdGhpcyBpbmZvcm1hdGlvbiBkb3duLCBhcyB5b3Ugd2lsbCBuZWVkIGl0IGxhdGVyIHRvIGxvZ2luIHRvJyApICsgJyAnXG5cdFx0XHRcdFx0KyAkLmkxOG4uXyggc3RlcERhdGEuYXBwbGljYXRpb25fbmFtZSApXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoaXMudGl0bGVfMS50ZXh0KCAkLmkxOG4uXyggJ0FkbWluaXN0cmF0b3IgTG9naW4nICkgKTtcblx0XHRcdFx0dmFyIHVzZXJfY29sdW1uMSA9IHVzZXIuZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cdFx0XHRcdHVzZXJfY29sdW1uMS5lbXB0eSgpO1xuXG5cdFx0XHRcdC8vIFVzZXIgTmFtZVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICd1c2VyX25hbWUnLCB3aWR0aDogMjAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdVc2VyIE5hbWUnICksIGZvcm1faXRlbV9pbnB1dCwgdXNlcl9jb2x1bW4xICk7XG5cblx0XHRcdFx0Ly8gUGFzc3dvcmRcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5QQVNTV09SRF9JTlBVVCApO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAncGFzc3dvcmQnLCB3aWR0aDogMjAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXNzd29yZCcgKSwgZm9ybV9pdGVtX2lucHV0LCB1c2VyX2NvbHVtbjEgKTtcblxuXHRcdFx0XHQvLyBQYXNzd29yZChjb25maXJtKVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlBBU1NXT1JEX0lOUFVUICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdwYXNzd29yZDInLCB3aWR0aDogMjAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXNzd29yZCAoQ29uZmlybSknICksIGZvcm1faXRlbV9pbnB1dCwgdXNlcl9jb2x1bW4xICk7XG5cblx0XHRcdFx0Ly8gRmlyc3QgTmFtZVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdmaXJzdF9uYW1lJywgd2lkdGg6IDIwMCB9ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRmlyc3QgTmFtZScgKSwgZm9ybV9pdGVtX2lucHV0LCB1c2VyX2NvbHVtbjEgKTtcblxuXHRcdFx0XHQvLyBMYXN0IE5hbWVcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnbGFzdF9uYW1lJywgd2lkdGg6IDIwMCB9ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTGFzdCBOYW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHVzZXJfY29sdW1uMSApO1xuXG5cdFx0XHRcdC8vIEVtYWlsXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3dvcmtfZW1haWwnLCB3aWR0aDogMjAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbWFpbCcgKSwgZm9ybV9pdGVtX2lucHV0LCB1c2VyX2NvbHVtbjEgKTtcblxuXHRcdFx0XHR1c2VyLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ2NvbXBhbnknOlxuXHRcdFx0XHRzdGVwX3RpdGxlLnRleHQoICQuaTE4bi5fKCAnUGxlYXNlIGVudGVyIHlvdXIgY29tcGFueSBpbmZvcm1hdGlvbiBiZWxvdy4nICkgKTtcblx0XHRcdFx0dGhpcy50aXRsZV8xLnRleHQoICQuaTE4bi5fKCAnQ29tcGFueSBJbmZvcm1hdGlvbicgKSApO1xuXHRcdFx0XHR2YXIgY29tcGFueV9jb2x1bW4xID0gY29tcGFueS5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHRcdFx0Y29tcGFueV9jb2x1bW4xLmVtcHR5KCk7XG5cblx0XHRcdFx0Ly8gQ29tcGFueSBGdWxsIE5hbWVcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnbmFtZScsIHdpZHRoOiAyMDAgfSApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NvbXBhbnkgRnVsbCBOYW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIGNvbXBhbnlfY29sdW1uMSApO1xuXG5cdFx0XHRcdC8vIENvbXBhbnkgU2hvcnQgTmFtZVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdzaG9ydF9uYW1lJywgd2lkdGg6IDIwMCB9ICk7XG5cblx0XHRcdFx0dmFyIHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0XHRcdHZhciBsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+ICggJyArICQuaTE4bi5fKCAnaWUnICkgKyAnOiAnICsgJC5pMThuLl8oICdBbWVyaWNhIE9ubGluZScgKSArICcgPSAnICsgJC5pMThuLl8oICdBT0wnICkgKyAnLCAnICsgJC5pMThuLl8oICdubyBzcGFjZXMnICkgKyAnICk8L3NwYW4+JyApO1xuXG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ29tcGFueSBTaG9ydCBOYW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIGNvbXBhbnlfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0XHRcdC8vIEluZHVzdHJ5XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdpbmR1c3RyeV9pZCcgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggdGhpcy5zdGVwc0RhdGFEaWNbdGhpcy5jdXJyZW50X3N0ZXBdWydpbmR1c3RyeV9vcHRpb25zJ10gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdJbmR1c3RyeScgKSwgZm9ybV9pdGVtX2lucHV0LCBjb21wYW55X2NvbHVtbjEgKTtcblxuXHRcdFx0XHQvLyBBZGRyZXNzIChMaW5lIDEpXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2FkZHJlc3MxJywgd2lkdGg6IDIwMCB9ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQWRkcmVzcyAoTGluZSAxKScgKSwgZm9ybV9pdGVtX2lucHV0LCBjb21wYW55X2NvbHVtbjEgKTtcblxuXHRcdFx0XHQvLyBBZGRyZXNzIChMaW5lIDIpXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2FkZHJlc3MyJywgd2lkdGg6IDIwMCB9ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQWRkcmVzcyAoTGluZSAyKScgKSwgZm9ybV9pdGVtX2lucHV0LCBjb21wYW55X2NvbHVtbjEgKTtcblxuXHRcdFx0XHQvLyBDaXR5XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2NpdHknLCB3aWR0aDogMjAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdDaXR5JyApLCBmb3JtX2l0ZW1faW5wdXQsIGNvbXBhbnlfY29sdW1uMSApO1xuXG5cdFx0XHRcdC8vIENvdW50cnlcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ2NvdW50cnknIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIHRoaXMuc3RlcHNEYXRhRGljW3RoaXMuY3VycmVudF9zdGVwXVsnY291bnRyeV9vcHRpb25zJ10gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdDb3VudHJ5JyApLCBmb3JtX2l0ZW1faW5wdXQsIGNvbXBhbnlfY29sdW1uMSApO1xuXG5cdFx0XHRcdC8vIFByb3ZpbmNlIC8gU3RhdGVcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3Byb3ZpbmNlJyB9ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUHJvdmluY2UgLyBTdGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCBjb21wYW55X2NvbHVtbjEgKTtcblxuXHRcdFx0XHQvLyBQb3N0YWwgLyBaSVAgQ29kZVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdwb3N0YWxfY29kZScsIHdpZHRoOiAyMDAgfSApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1Bvc3RhbCAvIFpJUCBDb2RlJyApLCBmb3JtX2l0ZW1faW5wdXQsIGNvbXBhbnlfY29sdW1uMSApO1xuXG5cdFx0XHRcdC8vIFBob25lXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3dvcmtfcGhvbmUnLCB3aWR0aDogMjAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQaG9uZScgKSwgZm9ybV9pdGVtX2lucHV0LCBjb21wYW55X2NvbHVtbjEgKTtcblx0XHRcdFx0Ly9jb21wYW55LmZpbmQoICcuZmlyc3QtY29sdW1uJyApLmNzcyggJ2JvcmRlcicsICcxcHggc29saWQgI0M3QzdDNycgKTtcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly90aGlzLmNvbnRlbnRfZGl2LmZpbmQoICcuY29tcGFueScgKS5jc3MoIHtoZWlnaHQ6IHRoaXMuY29udGVudF9kaXYuaGVpZ2h0KCkgLSBzdGVwX3RpdGxlLmhlaWdodCgpIC0gMTV9ICk7XG5cdFx0XHRcdC8vJCggd2luZG93ICkucmVzaXplKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly9cdCR0aGlzLmNvbnRlbnRfZGl2LmZpbmQoICcuY29tcGFueScgKS5jc3MoIHtoZWlnaHQ6ICR0aGlzLmNvbnRlbnRfZGl2LmhlaWdodCgpIC0gc3RlcF90aXRsZS5oZWlnaHQoKSAtIDE1fSApO1xuXHRcdFx0XHQvL30gKTtcblxuXHRcdFx0XHRjb21wYW55LnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ3N5c3RlbVNldHRpbmdzJzpcblx0XHRcdFx0c3RlcF90aXRsZS50ZXh0KCAkLmkxOG4uXyggJ1BsZWFzZSBlbnRlciB5b3VyIHNpdGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBiZWxvdy4gSWYgeW91IGFyZSB1bnN1cmUgb2YgdGhlIGZpZWxkcywgd2Ugc3VnZ2VzdCB0aGF0IHlvdSB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzLicgKSApO1xuXHRcdFx0XHR0aGlzLnRpdGxlXzEudGV4dCggJC5pMThuLl8oICdTeXN0ZW0gU2V0dGluZ3MnICkgKTtcblx0XHRcdFx0dmFyIHN5c3RlbVNldHRpbmdzX2NvbHVtbjEgPSBzeXN0ZW1TZXR0aW5ncy5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHRcdFx0c3lzdGVtU2V0dGluZ3NfY29sdW1uMS5lbXB0eSgpO1xuXHRcdFx0XHQvLyBVUkxcblx0XHRcdFx0dmFyIHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dmFyIGZvcm1faXRlbV9ob3N0X2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9ob3N0X2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnaG9zdF9uYW1lJyB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9ob3N0X2lucHV0LnNldFZhbHVlKCAnaHR0cDovLycgKyB0aGlzLnN0ZXBzRGF0YURpY1t0aGlzLmN1cnJlbnRfc3RlcF1bJ2hvc3RfbmFtZSddICk7XG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9ob3N0X2lucHV0ICk7XG5cblx0XHRcdFx0dmFyIGZvcm1faXRlbV91cmxfaW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX3VybF9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnYmFzZV91cmwnLCB3aWR0aDogMjAwIH0gKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1fdXJsX2lucHV0ICk7XG5cblx0XHRcdFx0dmFyIGllX2xhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4oJyArICQuaTE4bi5fKCAnTm8gdHJhaWxpbmcgc2xhc2gnICkgKyAnKTwvc3Bhbj4nICk7XG5cblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggaWVfbGFiZWwgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdVUkwnICksIFtmb3JtX2l0ZW1faG9zdF9pbnB1dCwgZm9ybV9pdGVtX3VybF9pbnB1dF0sIHN5c3RlbVNldHRpbmdzX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIG51bGwsIHRydWUgKTtcblxuXHRcdFx0XHQvLyBMb2cgRGlyZWN0b3J5XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2xvZ19kaXInLCB3aWR0aDogNDAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdMb2cgRGlyZWN0b3J5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHN5c3RlbVNldHRpbmdzX2NvbHVtbjEgKTtcblxuXHRcdFx0XHQvLyBTdG9yYWdlIERpcmVjdG9yeVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdzdG9yYWdlX2RpcicsIHdpZHRoOiA0MDAgfSApO1xuXG5cdFx0XHRcdHZhciB3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdFx0XHR2YXIgbGFiZWwgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsXFwnPiAoJyArICQuaTE4bi5fKCAnZm9yIHRoaW5ncyBsaWtlIGF0dGFjaG1lbnRzLCBsb2dvcywgZXRjLi4uJyApICsgJyk8L3NwYW4+JyApO1xuXG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU3RvcmFnZSBEaXJlY3RvcnknICksIGZvcm1faXRlbV9pbnB1dCwgc3lzdGVtU2V0dGluZ3NfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0XHRcdC8vIENhY2hlIERpcmVjdG9yeVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdjYWNoZV9kaXInLCB3aWR0aDogNDAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdDYWNoZSBEaXJlY3RvcnknICksIGZvcm1faXRlbV9pbnB1dCwgc3lzdGVtU2V0dGluZ3NfY29sdW1uMSApO1xuXG5cdFx0XHRcdC8vIFN5c3RlbSB0aW1lem9uZVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAndGltZV96b25lJyB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy50aW1lX3pvbmVfYXJyYXkgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTZXJ2ZXIgVGltZSBab25lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHN5c3RlbVNldHRpbmdzX2NvbHVtbjEgKTtcblxuXHRcdFx0XHRzeXN0ZW1TZXR0aW5ncy5zaG93KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZGF0YWJhc2VDb25maWcnOlxuXG5cdFx0XHRcdGRhdGFiYXNlQ29uZmlnLmZpbmQoICcuc3RlcC10aXAnICkudGV4dCggJC5pMThuLl8oICdQcml2aWxlZ2VkIERhdGFiYXNlIFVzZXIgTmFtZSAvIFBhc3N3b3JkLiBUaGlzIGlzIG9ubHkgdXNlZCB0byBjcmVhdGUgdGhlIGRhdGFiYXNlIHNjaGVtYSBpZiB0aGUgYWJvdmUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIGRvIHNvLicgKSApO1xuXG5cdFx0XHRcdHZhciBzdGVwX3RpdGxlX2h0bSA9ICcnO1xuXHRcdFx0XHRzdGVwX3RpdGxlX2h0bSA9IHN0ZXBfdGl0bGVfaHRtICsgJC5pMThuLl8oICdQbGVhc2UgZW50ZXIgeW91ciBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJlbG93LiBJZiB5b3UgYXJlIHVuc3VyZSwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlcy4nICk7XG5cblx0XHRcdFx0c3RlcF90aXRsZS5odG1sKCBzdGVwX3RpdGxlX2h0bSApO1xuXHRcdFx0XHR0aGlzLnRpdGxlXzEudGV4dCggJC5pMThuLl8oICdEYXRhYmFzZSBDb25maWd1cmF0aW9uJyApICk7XG5cblx0XHRcdFx0dmFyIGRhdGFiYXNlQ29uZmlnX2NvbHVtbjEgPSBkYXRhYmFzZUNvbmZpZy5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHRcdFx0ZGF0YWJhc2VDb25maWdfY29sdW1uMS5lbXB0eSgpO1xuXG5cdFx0XHRcdC8vIGRhdGFiYXNlIHR5cGVcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3R5cGUnIH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLnR5cGVfYXJyYXkgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEYXRhYmFzZSBUeXBlJyApLCBmb3JtX2l0ZW1faW5wdXQsIGRhdGFiYXNlQ29uZmlnX2NvbHVtbjEgKTtcblxuXHRcdFx0XHQvLyBob3N0IG5hbWVcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnaG9zdCcsIHdpZHRoOiAyMDAgfSApO1xuXHRcdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0hvc3QgTmFtZScgKSwgZm9ybV9pdGVtX2lucHV0LCBkYXRhYmFzZUNvbmZpZ19jb2x1bW4xICk7XG5cblx0XHRcdFx0Ly8gZGF0YWJhc2UgbmFtZVxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkYXRhYmFzZV9uYW1lJywgd2lkdGg6IDIwMCB9ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGF0YWJhc2UgTmFtZScgKSwgZm9ybV9pdGVtX2lucHV0LCBkYXRhYmFzZUNvbmZpZ19jb2x1bW4xICk7XG5cblx0XHRcdFx0Ly8gRGF0YWJhc2UgVXNlciBOYW1lXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3VzZXInLCB3aWR0aDogMjAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEYXRhYmFzZSBVc2VyIE5hbWUnICksIGZvcm1faXRlbV9pbnB1dCwgZGF0YWJhc2VDb25maWdfY29sdW1uMSApO1xuXG5cdFx0XHRcdC8vIERhdGFiYXNlIFBhc3N3b3JkXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3Bhc3N3b3JkJywgd2lkdGg6IDIwMCB9ICk7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGF0YWJhc2UgUGFzc3dvcmQnICksIGZvcm1faXRlbV9pbnB1dCwgZGF0YWJhc2VDb25maWdfY29sdW1uMSApO1xuXG5cdFx0XHRcdHZhciBkYXRhYmFzZUNvbmZpZ19jb2x1bW4yID0gZGF0YWJhc2VDb25maWcuZmluZCggJy5zZWNvbmQtY29sdW1uJyApO1xuXHRcdFx0XHRkYXRhYmFzZUNvbmZpZ19jb2x1bW4yLmVtcHR5KCk7XG5cblx0XHRcdFx0Ly8gUHJpdmlsZWdlZCBEYXRhYmFzZSBVc2VyIE5hbWVcblxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdwcml2X3VzZXInLCB3aWR0aDogMjAwIH0gKTtcblxuXHRcdFx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRcdFx0dmFyIGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4oICcgKyAkLmkxOG4uXyggJ2llOiByb290LCBwb3N0Z3JlcycgKSArICcgKTwvc3Bhbj4nICk7XG5cblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGxhYmVsICk7XG5cblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQcml2aWxlZ2VkIERhdGFiYXNlIFVzZXIgTmFtZScgKSwgZm9ybV9pdGVtX2lucHV0LCBkYXRhYmFzZUNvbmZpZ19jb2x1bW4yLCAnJywgd2lkZ2V0Q29udGFpbmVyICk7XG5cblx0XHRcdFx0Ly8gUHJpdmlsZWdlZCBEYXRhYmFzZSBVc2VyIFBhc3N3b3JkXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3ByaXZfcGFzc3dvcmQnLCB3aWR0aDogMjAwIH0gKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQcml2aWxlZ2VkIERhdGFiYXNlIFVzZXIgUGFzc3dvcmQnICksIGZvcm1faXRlbV9pbnB1dCwgZGF0YWJhc2VDb25maWdfY29sdW1uMiApO1xuXG5cdFx0XHRcdHZhciByaWJib25fYnV0dG9uX2JveCA9IHRoaXMuZ2V0UmliYm9uQnV0dG9uQm94KCk7XG5cdFx0XHRcdHZhciByaWJib25fYnRuID0gJCggJzxsaT48YnV0dG9uIGNsYXNzPVwicmliYm9uLXN1Yi1tZW51LWljb25cIiBpZD1cInRlc3RDb25uZWN0aW9uXCI+JyArICQuaTE4bi5fKCAnVGVzdCBDb25uZWN0aW9uJyApICsgJzwvYnV0dG9uPjwvbGk+JyApO1xuXHRcdFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdFx0XHRyaWJib25fYnRuLnVuYmluZCggJ2NsaWNrJyApLmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdCR0aGlzLm9uVGVzdERhdGFiYXNlQ29ubmVjdGlvbkNsaWNrKCAkdGhpcywgdHJ1ZSApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0cmliYm9uX2J1dHRvbl9ib3guY2hpbGRyZW4oKS5lcSggMCApLmFwcGVuZCggcmliYm9uX2J0biApO1xuXG5cdFx0XHRcdHRoaXMuY29udGVudF9kaXYuZmluZCggJy5jb250ZW50LWhhbmRsZS1idG4nICkuaHRtbCggcmliYm9uX2J1dHRvbl9ib3ggKTtcblx0XHRcdFx0Ly9kYXRhYmFzZUNvbmZpZy5maW5kKCAnLmZpcnN0LWNvbHVtbicgKS5jc3MoICdib3JkZXInLCAnMXB4IHNvbGlkICNDN0M3QzcnICk7XG5cblx0XHRcdFx0Ly90aGlzLmNvbnRlbnRfZGl2LmZpbmQoICcuZGF0YWJhc2VDb25maWcnICkuY3NzKCB7aGVpZ2h0OiB0aGlzLmNvbnRlbnRfZGl2LmhlaWdodCgpIC0gc3RlcF90aXRsZS5oZWlnaHQoKSAtIDY1fSApO1xuXHRcdFx0XHQvLyQoIHdpbmRvdyApLnJlc2l6ZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vXHQkdGhpcy5jb250ZW50X2Rpdi5maW5kKCAnLmRhdGFiYXNlQ29uZmlnJyApLmNzcygge2hlaWdodDogJHRoaXMuY29udGVudF9kaXYuaGVpZ2h0KCkgLSBzdGVwX3RpdGxlLmhlaWdodCgpIC0gNjV9ICk7XG5cdFx0XHRcdC8vfSApO1xuXG5cdFx0XHRcdGRhdGFiYXNlQ29uZmlnLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdkYXRhYmFzZVNjaGVtYSc6XG5cdFx0XHRcdHRoaXMudGl0bGVfMS50ZXh0KCAkLmkxOG4uXyggJ0RhdGFiYXNlIENvbmZpZ3VyYXRpb24nICkgKTtcblx0XHRcdFx0aWYgKCBzdGVwRGF0YS51cGdyYWRlICkge1xuXHRcdFx0XHRcdGRhdGFiYXNlU2NoZW1hLmZpbmQoICcucy1sYWJlbCcgKS50ZXh0KCAkLmkxOG4uXyggJ1VwZ3JhZGluZyBkYXRhYmFzZSwgcGxlYXNlIHdhaXQuLi4nICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhYmFzZVNjaGVtYS5maW5kKCAnLnMtbGFiZWwnICkudGV4dCggJC5pMThuLl8oICdJbml0aWFsaXppbmcgZGF0YWJhc2UsIHBsZWFzZSB3YWl0Li4uJyApICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGVwX3RpdGxlLmVtcHR5KCk7XG5cdFx0XHRcdGRhdGFiYXNlU2NoZW1hLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwb3N0VXBncmFkZSc6XG5cdFx0XHRcdHN0ZXBfdGl0bGUuZW1wdHkoKTtcblx0XHRcdFx0dGhpcy50aXRsZV8xLnRleHQoICQuaTE4bi5fKCAnVXBncmFkZSBDb21wbGV0ZScgKSApO1xuXHRcdFx0XHRwb3N0VXBncmFkZS5odG1sKCAnPGI+JyArICQuaTE4bi5fKCAnQ29uZ3JhdHVsYXRpb25zIScgKSArICc8L2I+JyArICcgJ1xuXHRcdFx0XHRcdCsgJC5pMThuLl8oICdZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgdXBncmFkZWQnICkgKyAnICdcblx0XHRcdFx0XHQrICQuaTE4bi5fKCBzdGVwRGF0YS5hcHBsaWNhdGlvbl9uYW1lICkgKyAnICdcblx0XHRcdFx0XHQrICQuaTE4bi5fKCAndG8nICkgKyAnICdcblx0XHRcdFx0XHQrICc8Yj4nICsgc3RlcERhdGEuYXBwbGljYXRpb25fdmVyc2lvbiArICc8L2I+J1xuXHRcdFx0XHRcdCsgJzxicj4nXG5cdFx0XHRcdFx0KyAnPGJyPidcblx0XHRcdFx0XHQrICc8Yj4nICsgJC5pMThuLl8oICdOb3RlJyApICsgJzonICsgJzwvYj4nICsgJyAnXG5cdFx0XHRcdFx0KyAkLmkxOG4uXyggJ0luIG9yZGVyIHRvIGFjY2VzcyBuZXcgZmVhdHVyZXMgeW91IG1heSBuZWVkIHRvIHJlLWFwcGx5IHRoZScgKSArICcgJ1xuXHRcdFx0XHRcdCsgJzxiPicgKyAkLmkxOG4uXyggJ0FkbWluaXN0cmF0b3InICkgKyAnPC9iPicgKyAnICdcblx0XHRcdFx0XHQrICQuaTE4bi5fKCAncGVybWlzc2lvbiBwcmVzZXQgdG8gZWFjaCBhZG1pbmlzdHJhdG9yIGVtcGxveWVlIGluJyApICsgJyAnXG5cdFx0XHRcdFx0KyAkLmkxOG4uXyggc3RlcERhdGEuYXBwbGljYXRpb25fbmFtZSApICsgJy4nXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHBvc3RVcGdyYWRlLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdpbnN0YWxsRG9uZSc6XG5cdFx0XHRcdHZhciBsb2MgPSB3aW5kb3cubG9jYXRpb247XG5cdFx0XHRcdHZhciBjdXJyZW50VVJMID0gbG9jLnByb3RvY29sICsgJy8vJyArIGxvYy5ob3N0ICsgbG9jLnBhdGhuYW1lO1xuXHRcdFx0XHR2YXIgbG9naW5fdXJsID0gY3VycmVudFVSTCArICcjIW09TG9naW4nO1xuXG5cdFx0XHRcdHN0ZXBfdGl0bGUuZW1wdHkoKTtcblx0XHRcdFx0dGhpcy50aXRsZV8xLnRleHQoICQuaTE4bi5fKCAnRG9uZSEnICkgKTtcblx0XHRcdFx0aWYgKCBzdGVwRGF0YS51cGdyYWRlID09IDEgKSB7XG5cdFx0XHRcdFx0aW5zdGFsbERvbmUuaHRtbCggJzxiPicgKyAkLmkxOG4uXyggJ0NvbmdyYXR1bGF0aW9ucyEnICkgKyAnPC9iPicgKyAnICdcblx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgdXBncmFkZWQnICkgKyAnICcgKyAkLmkxOG4uXyggc3RlcERhdGEuYXBwbGljYXRpb25fbmFtZSApXG5cdFx0XHRcdFx0XHQrICc8YnI+J1xuXHRcdFx0XHRcdFx0KyAnPGJyPidcblx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdZb3UgbWF5IG5vdycgKSArICcgJ1xuXHRcdFx0XHRcdFx0KyAnPGEgaHJlZj1cIicgKyBsb2dpbl91cmwgKyAnXCI+JyArICQuaTE4bi5fKCAnbG9naW4nICkgKyAnPC9hPicgKyAnICdcblx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICd3aXRoIHRoZSB1c2VyIG5hbWUvcGFzc3dvcmQgdGhhdCB5b3UgY3JlYXRlZCBlYXJsaWVyLicgKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aW5zdGFsbERvbmUuaHRtbCggJzxiPicgKyAkLmkxOG4uXyggJ0NvbmdyYXR1bGF0aW9ucyEnICkgKyAnICcgKyAnPC9iPicgKyAnICdcblx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkJyApICsgJyAnICsgJC5pMThuLl8oIHN0ZXBEYXRhLmFwcGxpY2F0aW9uX25hbWUgKVxuXHRcdFx0XHRcdFx0KyAnPGJyPidcblx0XHRcdFx0XHRcdCsgJzxicj4nXG5cdFx0XHRcdFx0XHQrICQuaTE4bi5fKCAnWW91IG1heSBub3cnICkgKyAnICdcblx0XHRcdFx0XHRcdCsgJzxhIGhyZWY9XCInICsgbG9naW5fdXJsICsgJ1wiPicgKyAkLmkxOG4uXyggJ2xvZ2luJyApICsgJzwvYT4nICsgJyAnXG5cdFx0XHRcdFx0XHQrICQuaTE4bi5fKCAnd2l0aCB0aGUgdXNlciBuYW1lL3Bhc3N3b3JkIHRoYXQgeW91IGNyZWF0ZWQgZWFybGllci4nIClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluc3RhbGxEb25lLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdtYWludGVuYW5jZUpvYnMnOlxuXHRcdFx0XHRzdGVwX3RpdGxlLmVtcHR5KCk7XG5cdFx0XHRcdHRoaXMudGl0bGVfMS50ZXh0KCAkLmkxOG4uXyggJ01haW50ZW5hbmNlIEpvYnMnICkgKTtcblx0XHRcdFx0dmFyIG1haW50ZW5hbmNlSm9iX2h0bWwgPSAkLmkxOG4uXyggc3RlcERhdGEuYXBwbGljYXRpb25fbmFtZSApICsgJyAnXG5cdFx0XHRcdFx0KyAnPGI+JyArICQuaTE4bi5fKCAncmVxdWlyZXMnICkgKyAnPC9iPicgKyAnICdcblx0XHRcdFx0XHQrICQuaTE4bi5fKCAndGhhdCBtYWludGVuYW5jZSBqb2JzIGJlIHJ1biByZWd1bGFybHkgdGhyb3VnaG91dCB0aGUgZGF5LicgKVxuXHRcdFx0XHRcdCsgJzxicj4nXG5cdFx0XHRcdFx0KyAnPHAgc3R5bGU9XCJjb2xvcjogI2ZmMDAwMFwiPidcblx0XHRcdFx0XHQrICc8Yj4nXG5cdFx0XHRcdFx0KyAkLmkxOG4uXyggJ1RoaXMgaXMgZXh0cmVtZWx5IGltcG9ydGFudCBhbmQgd2l0aG91dCB0aGVzZSBtYWludGVuYW5jZSBqb2JzIHJ1bm5pbmcnICkgKyAnICdcblx0XHRcdFx0XHQrICQuaTE4bi5fKCBzdGVwRGF0YS5hcHBsaWNhdGlvbl9uYW1lICkgKyAnICdcblx0XHRcdFx0XHQrICQuaTE4bi5fKCAnd2lsbCBmYWlsIHRvIG9wZXJhdGUgY29ycmVjdGx5LicgKVxuXHRcdFx0XHRcdCsgJzwvYj4nXG5cdFx0XHRcdFx0KyAnPC9wPidcblx0XHRcdFx0XHQrICc8YnI+J1xuXHRcdFx0XHRcdCsgJzxicj4nXG5cdFx0XHRcdFx0KyAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICNlZWU7IHdpZHRoOiAxMDAlO1wiPidcblx0XHRcdFx0XHQrICc8YnI+JztcblxuXHRcdFx0XHRpZiAoIHN0ZXBEYXRhLnBocF9vcyA9PSAnV0lOTlQnICkge1xuXHRcdFx0XHRcdG1haW50ZW5hbmNlSm9iX2h0bWwgPSBtYWludGVuYW5jZUpvYl9odG1sICsgJC5pMThuLl8oICdJbiBXaW5kb3dzIHNpbXBseSBydW4gdGhpcyBjb21tYW5kIGFzIEFkbWluaXN0cmF0b3IuJyApICsgJzxicj48YnI+JyArIHN0ZXBEYXRhLnNjaGVkdWxlX21haW50ZW5hbmNlX2pvYl9jb21tYW5kO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1haW50ZW5hbmNlSm9iX2h0bWwgPSBtYWludGVuYW5jZUpvYl9odG1sICsgJC5pMThuLl8oICdJbiBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMsIHlvdSBjYW4gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCcgKTtcblx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhLmlzX3N1ZG9faW5zdGFsbGVkID09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0bWFpbnRlbmFuY2VKb2JfaHRtbCA9IG1haW50ZW5hbmNlSm9iX2h0bWwgKyArJyAnICsgJC5pMThuLl8oICdhcyByb290JyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtYWludGVuYW5jZUpvYl9odG1sID0gbWFpbnRlbmFuY2VKb2JfaHRtbCArICc6JyArICc8YnI+JyArICc8Yj4nO1xuXG5cdFx0XHRcdFx0aWYgKCBzdGVwRGF0YS5pc19zdWRvX2luc3RhbGxlZCApIHtcblx0XHRcdFx0XHRcdG1haW50ZW5hbmNlSm9iX2h0bWwgPSBtYWludGVuYW5jZUpvYl9odG1sICsgJ3N1ZG8nO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1haW50ZW5hbmNlSm9iX2h0bWwgPSBtYWludGVuYW5jZUpvYl9odG1sICsgJyBjcm9udGFiIC11ICcgKyBzdGVwRGF0YS53ZWJfc2VydmVyX3VzZXIgKyAnIC1lJztcblxuXHRcdFx0XHRcdG1haW50ZW5hbmNlSm9iX2h0bWwgPSBtYWludGVuYW5jZUpvYl9odG1sICsgJzwvYj4nXG5cdFx0XHRcdFx0XHQrICc8YnI+J1xuXHRcdFx0XHRcdFx0KyAnPGJyPidcblx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdUaGVuIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gdGhlIGJvdHRvbSBvZiB0aGUgZmlsZScgKSArICc6J1xuXHRcdFx0XHRcdFx0KyAnPGJyPidcblx0XHRcdFx0XHRcdCsgJzxiPicgKyAnKiAqICogKiAqIHBocCAnICsgc3RlcERhdGEuY3Jvbl9maWxlICsgJyA+IC9kZXYvbnVsbCAyPiYxJyArICc8L2I+J1xuXHRcdFx0XHRcdFx0KyAnPGJyPidcblx0XHRcdFx0XHRcdCsgJzxicj4nXG5cdFx0XHRcdFx0XHQrICc8L2Rpdj4nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtYWludGVuYW5jZUpvYnMuaHRtbCggbWFpbnRlbmFuY2VKb2JfaHRtbCApO1xuXG5cdFx0XHRcdG1haW50ZW5hbmNlSm9icy5zaG93KCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIHRlc3RzIGRhdGFiYXNlIGNvbm5lY3Rpb246XG5cdCAqIEBwYXJhbSAkdGhpc1xuXHQgKiBAcGFyYW0gZGVmZXJyZWQgKG9wdGlvbmFsKVxuXHQgKi9cblx0b25UZXN0RGF0YWJhc2VDb25uZWN0aW9uQ2xpY2soICR0aGlzLCBzaG93VHJ1ZSApIHtcblx0XHR2YXIgJGRhdGEgPSB7fTtcblx0XHRmb3IgKCB2YXIga2V5IGluICR0aGlzLnN0ZXBzV2lkZ2V0RGljWyR0aGlzLmN1cnJlbnRfc3RlcF0gKSB7XG5cdFx0XHR2YXIgd2lkZ2V0ID0gJHRoaXMuc3RlcHNXaWRnZXREaWNbJHRoaXMuY3VycmVudF9zdGVwXVtrZXldO1xuXHRcdFx0JGRhdGFba2V5XSA9IHdpZGdldC5nZXRWYWx1ZSgpO1xuXHRcdH1cblx0XHRQcm9ncmVzc0Jhci5zaG93T3ZlcmxheSgpO1xuXHRcdHZhciByZXMgPSAkdGhpcy5hcGkudGVzdENvbm5lY3Rpb24oICRkYXRhLCB7IGFzeW5jOiBmYWxzZSB9ICk7XG5cblx0XHRpZiAoIHJlcy5pc1ZhbGlkKCkgKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0dmFyIHN0ZXBfdGl0bGVfaHRtID0gJyc7XG5cdFx0XHRpZiAoIHJlc3VsdC50ZXN0X2Nvbm5lY3Rpb24gIT09IG51bGwgKSB7XG5cdFx0XHRcdGlmICggcmVzdWx0LnRlc3RfY29ubmVjdGlvbiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRpZiAoIHJlc3VsdC5kYXRhYmFzZV92ZXJzaW9uID09PSAxICkge1xuXHRcdFx0XHRcdFx0c3RlcF90aXRsZV9odG0gPSBzdGVwX3RpdGxlX2h0bVxuXHRcdFx0XHRcdFx0XHQrICc8cCBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICNmZjAwMDBcIj4nXG5cdFx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdEYXRhYmFzZSB2ZXJzaW9uIGNoZWNrJyApICsgJyAnXG5cdFx0XHRcdFx0XHRcdCsgJzxiPicgKyAkLmkxOG4uXyggJ0ZBSUxFRCcgKSArICc8L2I+JyArICchJyArICcgJ1xuXHRcdFx0XHRcdFx0XHQrICQuaTE4bi5fKCAnUGxlYXNlIHVwZ3JhZGUgeW91ciBkYXRhYmFzZSB0byBtZWV0IHRoZSBtaW5pbXVtIHZlcnNpb24gcmVxdWlyZW1lbnRzIGFuZCB0cnkgYWdhaW4uJyApXG5cdFx0XHRcdFx0XHRcdCsgJzwvcD4nO1xuXHRcdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoIHN0ZXBfdGl0bGVfaHRtICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN0ZXBfdGl0bGVfaHRtID0gc3RlcF90aXRsZV9odG1cblx0XHRcdFx0XHRcdFx0KyAnPHA+J1xuXHRcdFx0XHRcdFx0XHQrICQuaTE4bi5fKCAnQ29ubmVjdGlvbiB0ZXN0IHRvIHlvdXIgZGF0YWJhc2UgYXMgYSBub24tcHJpdmlsZWdlZCB1c2VyIGhhcycgKSArICcgJ1xuXHRcdFx0XHRcdFx0XHQrICc8Yj4nICsgJC5pMThuLl8oICdTVUNDRUVERUQnICkgKyAnPC9iPicgKyAnIScgKyAnICdcblx0XHRcdFx0XHRcdFx0KyAkLmkxOG4uXyggJ1lvdSBtYXkgY29udGludWUuJyApXG5cdFx0XHRcdFx0XHRcdCsgJzwvcD4nO1xuXHRcdFx0XHRcdFx0aWYgKCBzaG93VHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoIHN0ZXBfdGl0bGVfaHRtICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoIHJlc3VsdC50ZXN0X2Nvbm5lY3Rpb24gPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdHN0ZXBfdGl0bGVfaHRtID0gc3RlcF90aXRsZV9odG1cblx0XHRcdFx0XHRcdCsgJzxwIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2ZmMDAwMFwiPidcblx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdDb25uZWN0aW9uIHRlc3QgdG8geW91ciBkYXRhYmFzZSBhcyBhIG5vbi1wcml2aWxlZ2VkIHVzZXIgaGFzJyApICsgJyAnXG5cdFx0XHRcdFx0XHQrICc8Yj4nICsgJC5pMThuLl8oICdGQUlMRUQnICkgKyAnPC9iPicgKyAnIScgKyAnICdcblx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdQbGVhc2UgY29ycmVjdCB5b3VyIHNldHRpbmdzIGFuZCB0cnkgYWdhaW4uJyApXG5cdFx0XHRcdFx0XHQrICc8L3A+JztcblxuXHRcdFx0XHRcdFRBbGVydE1hbmFnZXIuc2hvd0FsZXJ0KCBzdGVwX3RpdGxlX2h0bSApO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHJlc3VsdC50ZXN0X3ByaXZfY29ubmVjdGlvbiAhPT0gbnVsbCApIHtcblx0XHRcdFx0aWYgKCByZXN1bHQudGVzdF9wcml2X2Nvbm5lY3Rpb24gPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdHN0ZXBfdGl0bGVfaHRtID0gc3RlcF90aXRsZV9odG1cblx0XHRcdFx0XHRcdCsgJzxwIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2ZmMDAwMFwiPidcblx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdDb25uZWN0aW9uIHRlc3QgdG8geW91ciBkYXRhYmFzZSBhcyBhIHByaXZpbGVnZWQgdXNlciBoYXMnICkgKyAnICdcblx0XHRcdFx0XHRcdCsgJzxiPicgKyAkLmkxOG4uXyggJ0ZBSUxFRCcgKSArICc8L2I+JyArICchJyArICcgJ1xuXHRcdFx0XHRcdFx0KyAkLmkxOG4uXyggJ1BsZWFzZSBjb3JyZWN0IHRoZSB1c2VyIG5hbWUvcGFzc3dvcmQgYW5kIHRyeSBhZ2Fpbi4nIClcblx0XHRcdFx0XHRcdCsgJzwvcD4nO1xuXG5cdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoIHN0ZXBfdGl0bGVfaHRtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH1cblx0fVxuXG5cdG9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApIHtcblx0XHR2YXIgd2lkZ2V0cyA9IHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdO1xuXG5cdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdHZhciBjX3ZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0c3dpdGNoICgga2V5ICkge1xuXHRcdFx0Y2FzZSAnY291bnRyeSc6XG5cdFx0XHRcdHRoaXMuYXBpLmdldFByb3ZpbmNlT3B0aW9ucyggY192YWx1ZSwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHR3aWRnZXRzLnByb3ZpbmNlLnNldFNvdXJjZURhdGEoIFtdICk7XG5cdFx0XHRcdFx0XHRcdHdpZGdldHMucHJvdmluY2Uuc2V0U291cmNlRGF0YSggcmVzLmdldFJlc3VsdCgpICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndHlwZSc6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdG9uQmFja0NsaWNrKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dGhpcy5zYXZlQ3VycmVudFN0ZXAoKTtcblx0XHRzd2l0Y2ggKCB0aGlzLmN1cnJlbnRfc3RlcCApIHtcblx0XHRcdGNhc2UgJ2xpY2Vuc2UnOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3JlcXVpcmVtZW50cyc6XG5cdFx0XHRcdHRoaXMuY3VycmVudF9zdGVwID0gJ2xpY2Vuc2UnO1xuXHRcdFx0XHR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2RhdGFiYXNlQ29uZmlnJzpcblx0XHRcdFx0dGhpcy5jdXJyZW50X3N0ZXAgPSAncmVxdWlyZW1lbnRzJztcblx0XHRcdFx0dGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwb3N0VXBncmFkZSc6XG5cdFx0XHRjYXNlICdzeXN0ZW1TZXR0aW5ncyc6XG5cdFx0XHRcdHRoaXMuY3VycmVudF9zdGVwID0gJ2RhdGFiYXNlQ29uZmlnJztcblx0XHRcdFx0dGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjb21wYW55Jzpcblx0XHRcdFx0dGhpcy5jdXJyZW50X3N0ZXAgPSAnc3lzdGVtU2V0dGluZ3MnO1xuXHRcdFx0XHR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21haW50ZW5hbmNlSm9icyc6XG5cdFx0XHRjYXNlICdpbnN0YWxsRG9uZSc6XG5cdFx0XHRcdHRoaXMuY3VycmVudF9zdGVwID0gJ3VzZXInO1xuXHRcdFx0XHR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3VzZXInOlxuXHRcdFx0XHR0aGlzLmN1cnJlbnRfc3RlcCA9ICdjb21wYW55Jztcblx0XHRcdFx0dGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0b25OZXh0Q2xpY2soKSB7XG5cdFx0dmFyICRkYXRhO1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLnNhdmVDdXJyZW50U3RlcCgpO1xuXHRcdHN3aXRjaCAoIHRoaXMuY3VycmVudF9zdGVwICkge1xuXHRcdFx0Y2FzZSAnbGljZW5zZSc6XG5cdFx0XHRcdC8vIHRoZSBuZXh0IGludGVyZmFjZSBpcyBzeXN0ZW0gcmVxdWlyZW1lbnRzLCBzbyBzZXQgdGhlIGN1cnJlbnQgc3RlcCB0byB0aGUgcmVxdWlyZW1lbnRzXG5cdFx0XHRcdHRoaXMuY3VycmVudF9zdGVwID0gJ3JlcXVpcmVtZW50cyc7XG5cdFx0XHRcdHRoaXMuaW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmVxdWlyZW1lbnRzJzpcblx0XHRcdFx0aWYgKCB0aGlzLmV4dGVybmFsX2luc3RhbGxlciA9PSAxICkge1xuXHRcdFx0XHRcdHRoaXMuY3VycmVudF9zdGVwID0gJ2RhdGFiYXNlU2NoZW1hJztcblx0XHRcdFx0XHR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuY3VycmVudF9zdGVwID0gJ2RhdGFiYXNlQ29uZmlnJztcblx0XHRcdFx0XHR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZGF0YWJhc2VDb25maWcnOlxuXHRcdFx0XHQvLyBuZWVkIHRvIHNhdmUgdGhlIGRhdGFiYXNlIGNvbmZpZ3VyZSBmaXJzdC5cblx0XHRcdFx0JGRhdGEgPSB7fTtcblx0XHRcdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLnN0ZXBzV2lkZ2V0RGljW3RoaXMuY3VycmVudF9zdGVwXSApIHtcblx0XHRcdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF1ba2V5XTtcblx0XHRcdFx0XHQkZGF0YVtrZXldID0gd2lkZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRoaXMub25UZXN0RGF0YWJhc2VDb25uZWN0aW9uQ2xpY2soIHRoaXMsIGZhbHNlICkgKSB7XG5cdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93Q29uZmlybUFsZXJ0KCAkLmkxOG4uXyggJ0luc3RhbGxpbmcvVXBncmFkaW5nIHRoZSBUaW1lVHJleCBkYXRhYmFzZSBtYXkgdGFrZSB1cCB0byAxMCBtaW51dGVzLiBQbGVhc2UgZG8gbm90IHN0b3AgdGhlIHByb2Nlc3MgaW4gYW55IHdheSwgaW5jbHVkaW5nIHByZXNzaW5nIFNUT1Agb3IgQkFDSyBpbiB5b3VyIHdlYiBicm93c2VyLCBkb2luZyBzbyBtYXkgbGVhdmUgeW91ciBkYXRhYmFzZSBpbiBhbiB1bnVzYWJsZSBzdGF0ZS4nICksIG51bGwsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuYXBpLmNyZWF0ZURhdGFiYXNlKCAkZGF0YSwge1xuXHRcdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJlcy5nZXRSZXN1bHQoKS5uZXh0X3BhZ2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zdGVwID0gcmVzLmdldFJlc3VsdCgpLm5leHRfcGFnZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5zdGVwc0RhdGFEaWNbJHRoaXMuY3VycmVudF9zdGVwXSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5faW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3Bvc3RVcGdyYWRlJzpcblx0XHRcdFx0dGhpcy5jdXJyZW50X3N0ZXAgPSAnaW5zdGFsbERvbmUnO1xuXHRcdFx0XHR0aGlzLnN0ZXBzRGF0YURpY1t0aGlzLmN1cnJlbnRfc3RlcF0gPSB7IHVwZ3JhZGU6IDEgfTtcblx0XHRcdFx0dGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdtYWludGVuYW5jZUpvYnMnOlxuXHRcdFx0XHR0aGlzLmN1cnJlbnRfc3RlcCA9ICdpbnN0YWxsRG9uZSc7XG5cdFx0XHRcdHRoaXMuaW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc3lzdGVtU2V0dGluZ3MnOlxuXHRcdFx0XHQkZGF0YSA9IHt9O1xuXHRcdFx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdICkge1xuXHRcdFx0XHRcdHZhciB3aWRnZXQgPSB0aGlzLnN0ZXBzV2lkZ2V0RGljW3RoaXMuY3VycmVudF9zdGVwXVtrZXldO1xuXHRcdFx0XHRcdCRkYXRhW2tleV0gPSB3aWRnZXQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYXBpLnNldFN5c3RlbVNldHRpbmdzKCAkZGF0YSwgdGhpcy5leHRlcm5hbF9pbnN0YWxsZXIsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdGlmICggcmVzLmlzVmFsaWQoKSApIHtcblxuXHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3N0ZXAgPSAnY29tcGFueSc7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2NvbXBhbnknOlxuXHRcdFx0XHQkZGF0YSA9IHt9O1xuXHRcdFx0XHQkZGF0YVsnY29tcGFueV9pZCddID0gJHRoaXMuY29tcGFueV9pZDtcblx0XHRcdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLnN0ZXBzV2lkZ2V0RGljW3RoaXMuY3VycmVudF9zdGVwXSApIHtcblx0XHRcdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF1ba2V5XTtcblx0XHRcdFx0XHQkZGF0YVtrZXldID0gd2lkZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmFwaS5zZXRDb21wYW55KCAkZGF0YSwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgY29tcGFueV9pZCA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zdGVwID0gJ3VzZXInO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5jb21wYW55X2lkID0gY29tcGFueV9pZDtcblx0XHRcdFx0XHRcdFx0JHRoaXMuc3RlcHNEYXRhRGljWyR0aGlzLmN1cnJlbnRfc3RlcF0gPSB7IGNvbXBhbnlfaWQ6IGNvbXBhbnlfaWQgfTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuaW5pdEN1cnJlbnRTdGVwKCk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyJzpcblx0XHRcdFx0JGRhdGEgPSB7fTtcblx0XHRcdFx0JGRhdGFbJ3VzZXJfaWQnXSA9IHRoaXMudXNlcl9pZDtcblx0XHRcdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLnN0ZXBzV2lkZ2V0RGljW3RoaXMuY3VycmVudF9zdGVwXSApIHtcblx0XHRcdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF1ba2V5XTtcblx0XHRcdFx0XHQkZGF0YVtrZXldID0gd2lkZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQkZGF0YSA9ICQuZXh0ZW5kKCB7fSwgJGRhdGEsIHRoaXMuc3RlcHNEYXRhRGljWyR0aGlzLmN1cnJlbnRfc3RlcF0gKTtcblx0XHRcdFx0dGhpcy5hcGkuc2V0VXNlciggJGRhdGEsIHRoaXMuZXh0ZXJuYWxfaW5zdGFsbGVyLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHJlcy5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBuZXh0X3BhZ2UgPSByZXMuZ2V0UmVzdWx0KCkubmV4dF9wYWdlO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy51c2VyX2lkID0gcmVzLmdldFJlc3VsdCgpLnVzZXJfaWQ7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfc3RlcCA9IG5leHRfcGFnZTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuaW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlcyApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRidWlsZEN1cnJlbnRTdGVwRGF0YSgpIHtcblx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHN0ZXBEYXRhID0gdGhpcy5zdGVwc0RhdGFEaWNbdGhpcy5jdXJyZW50X3N0ZXBdO1xuXHRcdHZhciB3aWRnZXRzID0gdGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF07XG5cdFx0c3dpdGNoICggdGhpcy5jdXJyZW50X3N0ZXAgKSB7XG5cdFx0XHRjYXNlICdzeXN0ZW1TZXR0aW5ncyc6XG5cdFx0XHRjYXNlICdkYXRhYmFzZUNvbmZpZyc6XG5cdFx0XHRjYXNlICdsaWNlbnNlJzpcblx0XHRcdGNhc2UgJ3VzZXInOlxuXHRcdFx0XHRmb3IgKCB2YXIga2V5IGluIHdpZGdldHMgKSB7XG5cdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldICkge1xuXHRcdFx0XHRcdFx0d2lkZ2V0c1trZXldLnNldFZhbHVlKCBzdGVwRGF0YVtrZXldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdFByb2dyZXNzQmFyLmNsb3NlT3ZlcmxheSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2NvbXBhbnknOlxuXHRcdFx0XHRmb3IgKCB2YXIga2V5IGluIHdpZGdldHMgKSB7XG5cdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldICkge1xuXHRcdFx0XHRcdFx0d2lkZ2V0c1trZXldLnNldFZhbHVlKCBzdGVwRGF0YVtrZXldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBjb3VudHJ5ID0gd2lkZ2V0cy5jb3VudHJ5LmdldFZhbHVlKCk7XG5cdFx0XHRcdHRoaXMuYXBpLmdldFByb3ZpbmNlT3B0aW9ucyggY291bnRyeSwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHR3aWRnZXRzLnByb3ZpbmNlLnNldFNvdXJjZURhdGEoIHJlcy5nZXRSZXN1bHQoKSApO1xuXHRcdFx0XHRcdFx0XHR3aWRnZXRzLnByb3ZpbmNlLnNldFZhbHVlKCBzdGVwRGF0YVsncHJvdmluY2UnXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0UHJvZ3Jlc3NCYXIuY2xvc2VPdmVybGF5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmVxdWlyZW1lbnRzJzpcblx0XHRcdFx0Zm9yICggdmFyIGtleSBpbiB3aWRnZXRzICkge1xuXHRcdFx0XHRcdHZhciBlZGl0X3ZpZXdfZm9ybV9pdGVtX2RpYyA9ICQoIHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNba2V5XSApO1xuXG5cdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldID09IDAgKSB7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGVkaXRfdmlld19mb3JtX2l0ZW1fZGljLnNob3coKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgd2lkZ2V0ID0gd2lkZ2V0c1trZXldO1xuXHRcdFx0XHRcdHdpZGdldC5yZW1vdmVDbGFzcyggJ3QtdGV4dCcgKTtcblx0XHRcdFx0XHR3aWRnZXQucmVtb3ZlQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0d2lkZ2V0LnJlbW92ZUNsYXNzKCAnZGF0YVdhcm5pbmcnICk7XG5cdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnY3VzdG9tLXQtdGV4dCcgKTtcblxuXHRcdFx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0XHRcdGNhc2UgJ3RpbWV0cmV4X3ZlcnNpb24nOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfdGltZXRyZXhfdmVyc2lvbiA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICsgJyh2JyArIHN0ZXBEYXRhW2tleV0uY3VycmVudF90aW1ldHJleF92ZXJzaW9uICsgJyknICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfdGltZXRyZXhfdmVyc2lvbiA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ1VuYWJsZSB0byBDaGVjayBMYXRlc3QgVmVyc2lvbicgKSApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFXYXJuaW5nJyApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldLmNoZWNrX3RpbWV0cmV4X3ZlcnNpb24gPT0gMiApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbChcblx0XHRcdFx0XHRcdFx0XHRcdCQuaTE4bi5fKCAnQSBOZXdlciBWZXJzaW9uIG9mIFRpbWVUcmV4IGlzIEF2YWlsYWJsZS4nICkgKyAnICdcblx0XHRcdFx0XHRcdFx0XHRcdCsgJzxhIGhyZWY9XCJodHRwczovL3d3dy50aW1ldHJleC5jb20vZG93bmxvYWQucGhwXCI+JyArICQuaTE4bi5fKCAnRG93bmxvYWQnICkgKyAnIHYnICsgc3RlcERhdGFba2V5XS5sYXRlc3RfdGltZXRyZXhfdmVyc2lvbiArICcgJyArICQuaTE4bi5fKCAnTm93JyApICsgJzwvYT4nICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YVdhcm5pbmcnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdwaHBfdmVyc2lvbic6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XS5jaGVja19waHBfdmVyc2lvbiA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICsgJyAodicgKyBzdGVwRGF0YVtrZXldLnBocF92ZXJzaW9uICsgJyknICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfcGhwX3ZlcnNpb24gPT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdJbnZhbGlkJyApICsgJyAodicgKyBzdGVwRGF0YVtrZXldLnBocF92ZXJzaW9uICsgJyknICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldLmNoZWNrX3BocF92ZXJzaW9uID09IDIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnVW5zdXBwb3J0ZWQnICkgKyAnICh2JyArIHN0ZXBEYXRhW2tleV0ucGhwX3ZlcnNpb24gKyAnKScgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhV2FybmluZycgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ3BocF9pbnRfc2l6ZSc6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdJbnZhbGlkIChPbmx5IDMyLWJpdCknICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdkYXRhYmFzZV9lbmdpbmUnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBJbnN0YWxsZWQuIChQR1NRTCBleHRlbnNpb24gbXVzdCBiZSBlbmFibGVkKScgKSApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2JjbWF0aCc6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdOb3QgSW5zdGFsbGVkLiAoQkNNQVRIIGV4dGVuc2lvbiBtdXN0IGJlIGVuYWJsZWQpJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnbWJzdHJpbmcnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldID09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnTm90IEluc3RhbGxlZC4gKE1CU1RSSU5HIGV4dGVuc2lvbiBtdXN0IGJlIGVuYWJsZWQpJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZ2V0dGV4dCc6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdOb3QgSW5zdGFsbGVkLiAoR0VUVEVYVCBleHRlbnNpb24gbXVzdCBiZSBlbmFibGVkKScgKSApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2ludGwnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldID09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnTm90IEluc3RhbGxlZC4gKElOVEwgZXh0ZW5zaW9uIG11c3QgYmUgZW5hYmxlZCknICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdzb2FwJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggc3RlcERhdGFba2V5XSA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBJbnN0YWxsZWQuIChTT0FQIGV4dGVuc2lvbiBtdXN0IGJlIGVuYWJsZWQpJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZ2QnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldID09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnTm90IEluc3RhbGxlZC4gKEdEIGV4dGVuc2lvbiBtdXN0IGJlIGVuYWJsZWQpJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnanNvbic6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdOb3QgSW5zdGFsbGVkLiAoSlNPTiBleHRlbnNpb24gbXVzdCBiZSBlbmFibGVkKScgKSApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ21jcnlwdCc6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdOb3QgSW5zdGFsbGVkLiAoTUNSWVBUIGV4dGVuc2lvbiBtdXN0IGJlIGVuYWJsZWQpJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnc2ltcGxleG1sJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggc3RlcERhdGFba2V5XSA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBJbnN0YWxsZWQuIChTaW1wbGVYTUwgZXh0ZW5zaW9uIG11c3QgYmUgZW5hYmxlZCknICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdjdXJsJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggc3RlcERhdGFba2V5XSA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBJbnN0YWxsZWQuIChDVVJMIGV4dGVuc2lvbiBtdXN0IGJlIGVuYWJsZWQpJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnemlwJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggc3RlcERhdGFba2V5XSA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBJbnN0YWxsZWQuIChaSVAgZXh0ZW5zaW9uIG11c3QgYmUgZW5hYmxlZCknICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdtYWlsJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggc3RlcERhdGFba2V5XSA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBJbnN0YWxsZWQuIChNQUlMIGV4dGVuc2lvbiBtdXN0IGJlIGVuYWJsZWQpJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnb3BlbnNzbCc6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMSApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdOb3QgSW5zdGFsbGVkLiAoT3BlblNTTCBleHRlbnNpb24gbXVzdCBiZSBlbmFibGVkKScgKSApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ3BlYXInOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldID09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YS5waHBfb3MgPT0gJ1dJTk5UJyApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBJbnN0YWxsZWQuJyApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgJygnICsgJC5pMThuLl8oICd0cnkgcnVubmluZycgKSArICc6ICcgKyAnXCI8Yj5nby1wZWFyLmJhdDwvYj5cIicgKyAnKSdcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBJbnN0YWxsZWQuJyApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgJygnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdpbnN0YWxsIHRoZSBQRUFSIFJQTSBvciBwYWNrYWdlIGZyb20nICkgKyAnICdcblx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnPGEgaHJlZj1cXFwiaHR0cDovL3BlYXIucGhwLm5ldFxcXCI+aHR0cDovL3BlYXIucGhwLm5ldDwvYT4nXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgJyknXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdzYWZlX21vZGUnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldID09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnU2FmZSBNb2RlIGlzIE9uLiAoUGxlYXNlIGRpc2FibGUgaXQgaW4gcGhwLmluaSknICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdhbGxvd19mb3Blbl91cmwnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldID09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnQUxMT1dfRk9QRU5fVVJMIGlzIE9mZi4gKFBsZWFzZSBlbmFibGUgaXQgaW4gcGhwLmluaSknICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdkaXNrX3NwYWNlJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggc3RlcERhdGFba2V5XSA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCBlbm91Z2ggZGlzayBzcGFjZSBhdmFpbGFibGUsIHBsZWFzZSBmcmVlIHVwIGRpc2sgc3BhY2UgYW5kIHRyeSBhZ2Fpbi4nICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdtZW1vcnlfbGltaXQnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfcGhwX21lbW9yeV9saW1pdCA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBzdHIgPSAkLmkxOG4uXyggJ09LJyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XS5tZW1vcnlfbGltaXQgPiAwICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c3RyICs9ICcoJyArIHN0ZXBEYXRhW2tleV0ubWVtb3J5X2xpbWl0ICsgJyBieXRlcycgKyAnKSc7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCBzdHIgKTtcblx0XHRcdFx0XHRcdFx0XHRlZGl0X3ZpZXdfZm9ybV9pdGVtX2RpYy5oaWRlKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfcGhwX21lbW9yeV9saW1pdCA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCBzdGVwRGF0YVtrZXldLm1lbW9yeV9saW1pdCArICcgYnl0ZXMnICsgJyAoJyArICQuaTE4bi5fKCAnU2V0IHRoaXMgdG8gNTEyTSBvciBoaWdoZXInICkgKyAnKScgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdwb3N0X3NpemUnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfcGhwX3Bvc3Rfc2l6ZSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBzdHIgPSAkLmkxOG4uXyggJ09LJyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XS5wb3N0X3NpemUgPiAwICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c3RyICs9ICcoJyArIHN0ZXBEYXRhW2tleV0ucG9zdF9zaXplICsgJyBieXRlcycgKyAnKSc7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCBzdHIgKTtcblx0XHRcdFx0XHRcdFx0XHRlZGl0X3ZpZXdfZm9ybV9pdGVtX2RpYy5oaWRlKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfcGhwX3Bvc3Rfc2l6ZSA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCBzdGVwRGF0YVtrZXldLnBvc3Rfc2l6ZSArICcgYnl0ZXMnICsgJyAoJyArICQuaTE4bi5fKCAnU2V0IHRoaXMgdG8gMjVNIG9yIGhpZ2hlciwgcmVjb21tZW5kIDEyOE0nICkgKyAnKScgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICd1cGxvYWRfc2l6ZSc6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XS5jaGVja19waHBfdXBsb2FkX3NpemUgPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgc3RyID0gJC5pMThuLl8oICdPSycgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0udXBsb2FkX3NpemUgPiAwICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c3RyICs9ICcoJyArIHN0ZXBEYXRhW2tleV0ucG9zdF9zaXplICsgJyBieXRlcycgKyAnKSc7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCBzdHIgKTtcblx0XHRcdFx0XHRcdFx0XHRlZGl0X3ZpZXdfZm9ybV9pdGVtX2RpYy5oaWRlKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfcGhwX3VwbG9hZF9zaXplID09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoIHN0ZXBEYXRhW2tleV0udXBsb2FkX3NpemUgKyAnIGJ5dGVzJyArICcgKCcgKyAkLmkxOG4uXyggJ1NldCB0aGlzIHRvIDI1TSBvciBoaWdoZXIsIHJlY29tbWVuZCAxMjhNJyApICsgJyknICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZGlzYWJsZWRfZnVuY3Rpb25zJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldLmNoZWNrX2Rpc2FibGVkX2Z1bmN0aW9ucyA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldLmNoZWNrX2Rpc2FibGVkX2Z1bmN0aW9ucyA9PSAxICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ0NyaXRpY2FsIGZ1bmN0aW9ucyBkaXNhYmxlZCcgKSArICc6ICcgKyBzdGVwRGF0YVtrZXldLmRpc2FibGVkX2Z1bmN0aW9uX2xpc3QgKyAnICgnICsgJC5pMThuLl8oICdQbGVhc2UgZW5hYmxlIHRoZW0gaW4gcGhwLmluaScgKSArICcpJyApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2Jhc2VfdXJsJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldLmNoZWNrX2Jhc2VfdXJsID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0XHRlZGl0X3ZpZXdfZm9ybV9pdGVtX2RpYy5oaWRlKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoIGtleSArICcgJyArICQuaTE4bi5fKCAnaW4nICkgKyAnIHRpbWV0cmV4LmluaS5waHAgJyArICQuaTE4bi5fKCAnaXMgaW5jb3JyZWN0LCBwZXJoYXBzIGl0IHNob3VsZCBiZScgKSArICcgJyArIHN0ZXBEYXRhW2tleV0ucmVjb21tZW5kZWRfYmFzZV91cmwgKyAnICcgKyAkLmkxOG4uXyggJ2luc3RlYWQnICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdiYXNlX2Rpcic6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XS5jaGVja19waHBfb3Blbl9iYXNlX2RpciA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ1BIUCBPUEVOX0JBU0VESVIgc2V0dGluZycgKSArICcgJyArICcoJyArIHN0ZXBEYXRhW2tleV0ucGhwX29wZW5fYmFzZV9kaXIgKyAnKSAnICsgJC5pMThuLl8oICdkb2VzIG5vdCBpbmNsdWRlIGRpcmVjdG9yeSBvZiBQSFAgQ0xJIGJpbmFyeScgKSArICcgJyArICcoJyArIHN0ZXBEYXRhW2tleV0ucGhwX2NsaV9kaXJlY3RvcnkgKyAnKScgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdzeXN0ZW1fdGltZXpvbmUnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0gPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGVwRGF0YVtrZXldID09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnc3lzdGVtX3RpbWV6b25lIGluIHRpbWV0cmV4LmluaS5waHAgaXMgaW52YWxpZCEnICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdjbGlfZXhlY3V0YWJsZSc6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XS5jaGVja19waHBfY2xpX2JpbmFyeSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ1BIUCBDTEknICkgKyAnICcgKyAnKCcgKyBzdGVwRGF0YVtrZXldLnBocF9jbGkgKyAnKScgKyAnICcgKyAkLmkxOG4uXyggJ2RvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBleGVjdXRhYmxlLicgKSApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2NsaV9yZXF1aXJlbWVudHMnOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfcGhwX2NsaV9yZXF1aXJlbWVudHMgPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGVkaXRfdmlld19mb3JtX2l0ZW1fZGljLmhpZGUoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdQSFAgQ0xJIHJlcXVpcmVtZW50cyBmYWlsZWQgd2hpbGUgZXhlY3V0aW5nJyApICsgJzo8YnI+J1xuXHRcdFx0XHRcdFx0XHRcdFx0KyBzdGVwRGF0YVtrZXldLnBocF9jbGlfcmVxdWlyZW1lbnRzX2NvbW1hbmQgKyAnPGJyPidcblx0XHRcdFx0XHRcdFx0XHRcdCsgJC5pMThuLl8oICdMaWtlbHkgY2F1c2VkIGJ5IGhhdmluZyB0d28gUEhQLklOSSBmaWxlcyB3aXRoIGRpZmZlcmVudCBzZXR0aW5ncy4nIClcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2NvbmZpZ19maWxlJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdOb3Qgd3JpdGFibGUnICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdjYWNoZV9kaXInOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfd3JpdGFibGVfY2FjaGVfZGlyZWN0b3J5ID09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnT0snICkgKTtcblx0XHRcdFx0XHRcdFx0XHRlZGl0X3ZpZXdfZm9ybV9pdGVtX2RpYy5oaWRlKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnTm90IHdyaXRhYmxlJyApICsgJyAoJyArIHN0ZXBEYXRhW2tleV0uY2FjaGVfZGlyICsgJyknICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnc2FmZV9jYWNoZV9kaXInOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfc2FmZV9jYWNoZV9kaXJlY3RvcnkgPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGVkaXRfdmlld19mb3JtX2l0ZW1fZGljLmhpZGUoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdJTlNFQ1VSRSwgbXVzdCBub3QgYmUgYSBzdWItZGlyZWN0b3J5IG9mIGJhc2UgcGF0aC4nICkgKyAnICgnICsgc3RlcERhdGFba2V5XS5iYXNlX3BhdGggKyAnKScgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdzdG9yYWdlX2Rpcic6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XS5jaGVja193cml0YWJsZV9zdG9yYWdlX2RpcmVjdG9yeSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCB3cml0YWJsZScgKSArICcgKCcgKyBzdGVwRGF0YVtrZXldLnN0b3JhZ2VfcGF0aCArICcpJyApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ3NhZmVfc3RvcmFnZV9kaXInOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfc2FmZV9zdG9yYWdlX2RpcmVjdG9yeSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ0lOU0VDVVJFLCBtdXN0IG5vdCBiZSBhIHN1Yi1kaXJlY3Rvcnkgb2YgYmFzZSBwYXRoLicgKSArICcgKCcgKyBzdGVwRGF0YVtrZXldLmJhc2VfcGF0aCArICcpJyApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2xvZ19kaXInOlxuXHRcdFx0XHRcdFx0XHRpZiAoIHN0ZXBEYXRhW2tleV0uY2hlY2tfd3JpdGFibGVfbG9nX2RpcmVjdG9yeSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ05vdCB3cml0YWJsZScgKSArICcgKCcgKyBzdGVwRGF0YVtrZXldLmxvZ19wYXRoICsgJyknICk7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0LmFkZENsYXNzKCAnZGF0YUVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnc2FmZV9sb2dfZGlyJzpcblx0XHRcdFx0XHRcdFx0aWYgKCBzdGVwRGF0YVtrZXldLmNoZWNrX3NhZmVfbG9nX2RpcmVjdG9yeSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ0lOU0VDVVJFLCBtdXN0IG5vdCBiZSBhIHN1Yi1kaXJlY3Rvcnkgb2YgYmFzZSBwYXRoLicgKSArICcgKCcgKyBzdGVwRGF0YVtrZXldLmJhc2VfcGF0aCArICcpJyApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2VtcHR5X2NhY2hlX2Rpcic6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XS5jaGVja19jbGVhbl9jYWNoZV9kaXJlY3RvcnkgPT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdPSycgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGVkaXRfdmlld19mb3JtX2l0ZW1fZGljLmhpZGUoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuaHRtbCggJC5pMThuLl8oICdQbGVhc2UgZGVsZXRlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbicgKSArICc6ICcgKyAnIDxiPicgKyBzdGVwRGF0YVtrZXldLmNhY2hlX2RpciArICc8L2I+JyApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2ZpbGVfcGVybWlzc2lvbic6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnRmlsZSBwZXJtaXNzaW9ucyBhcmUgaW52YWxpZCwgc29tZScgKSArICcgJyArICQuaTE4bi5fKCBzdGVwRGF0YS5hcHBsaWNhdGlvbl9uYW1lICkgKyAnICcgKyAkLmkxOG4uXyggJ2ZpbGVzIGFyZSBub3QgcmVhZGFibGUvd3JpdGFibGUuIFNlZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcyBiZWxvdy4nICkgKTtcblx0XHRcdFx0XHRcdFx0XHR3aWRnZXQuYWRkQ2xhc3MoICdkYXRhRXJyb3InICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdmaWxlX2NoZWNrc3Vtcyc6XG5cdFx0XHRcdFx0XHRcdGlmICggc3RlcERhdGFba2V5XSA9PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5odG1sKCAkLmkxOG4uXyggJ09LJyApICk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0d2lkZ2V0Lmh0bWwoICQuaTE4bi5fKCAnRmlsZSBjaGVja3N1bXMgZG8gbm90IG1hdGNoLCBzb21lJyApICsgJyAnICsgJC5pMThuLl8oIHN0ZXBEYXRhLmFwcGxpY2F0aW9uX25hbWUgKSArICcgJyArICQuaTE4bi5fKCAnZmlsZXMgbWF5IGJlIGNvcnJ1cHRlZCwgbWlzc2luZywgb3Igbm90IGluc3RhbGxlZCBwcm9wZXJseS4gU2VlIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzIGJlbG93LicgKSApO1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5hZGRDbGFzcyggJ2RhdGFFcnJvcicgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHRcdFByb2dyZXNzQmFyLmNsb3NlT3ZlcmxheSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2RhdGFiYXNlU2NoZW1hJzpcblx0XHRcdFx0dGhpcy5hcGkuc2V0RGF0YWJhc2VTY2hlbWEoIHRoaXMuZXh0ZXJuYWxfaW5zdGFsbGVyLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHJlcy5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRcdGlmICggcmVzdWx0Lm5leHRfcGFnZSApIHtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3N0ZXAgPSByZXN1bHQubmV4dF9wYWdlO1xuXHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAoIHJlc3VsdC5uZXh0X3BhZ2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlICdwb3N0VXBncmFkZSc6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmluaXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3N5c3RlbVNldHRpbmdzJzpcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXN1bHQuYWN0aW9uICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLm9uTmV4dENsaWNrKCk7IC8vIHNraXAgc3lzdGVtIHNldHRpbmcgdG8gY29tcGFueSBpbmZvcm1hdGlvbiBkaXJlY3RseS5cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRQcm9ncmVzc0Jhci5jbG9zZU92ZXJsYXkoKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cdH1cblxuXHRzZXRFcnJvclRpcHMoIHJlc3VsdCApIHtcblx0XHR0aGlzLmNsZWFyRXJyb3JUaXBzKCk7XG5cblx0XHR2YXIgZGV0YWlscyA9IHJlc3VsdC5nZXREZXRhaWxzKCk7XG5cdFx0dmFyIGVycm9yX2xpc3QgPSBkZXRhaWxzWzBdO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBlcnJvcl9saXN0ICkge1xuXG5cdFx0XHRpZiAoICFlcnJvcl9saXN0Lmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggIUdsb2JhbC5pc1NldCggdGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF1ba2V5XSApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLnN0ZXBzV2lkZ2V0RGljW3RoaXMuY3VycmVudF9zdGVwXVtrZXldLmlzKCAnOnZpc2libGUnICkgKSB7XG5cblx0XHRcdFx0dGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF1ba2V5XS5zZXRFcnJvclN0eWxlKCBlcnJvcl9saXN0W2tleV0sIHRydWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLnN0ZXBzV2lkZ2V0RGljW3RoaXMuY3VycmVudF9zdGVwXVtrZXldLnNldEVycm9yU3R5bGUoIGVycm9yX2xpc3Rba2V5XSApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmVkaXRfdmlld19lcnJvcl91aV9kaWNba2V5XSA9IHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdW2tleV07XG5cblx0XHR9XG5cdH1cblxuXHRjbGVhckVycm9yVGlwcygpIHtcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5lZGl0X3ZpZXdfZXJyb3JfdWlfZGljICkge1xuXG5cdFx0XHQvL0Vycm9yOiBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdjbGVhckVycm9yU3R5bGUnIG9mIHVuZGVmaW5lZCBpbiAvaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL0Jhc2VWaWV3Q29udHJvbGxlci5qcz92PTguMC4wLTIwMTQxMTE3LTExMTE0MCBsaW5lIDE3Nzlcblx0XHRcdGlmICggIXRoaXMuZWRpdF92aWV3X2Vycm9yX3VpX2RpYy5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgfHwgIXRoaXMuZWRpdF92aWV3X2Vycm9yX3VpX2RpY1trZXldICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfZXJyb3JfdWlfZGljW2tleV0uY2xlYXJFcnJvclN0eWxlKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfZXJyb3JfdWlfZGljID0ge307XG5cdH1cblxuXHRvbkRvbmVDbGljaygpIHtcblx0XHR0aGlzLmNsZWFuU3RlcHNEYXRhKCk7XG5cbi8vXHRcdGlmICggdGhpcy5jYWxsX2JhY2sgKSB7XG4vL1x0XHRcdHRoaXMuY2FsbF9iYWNrKCk7XG4vL1x0XHR9XG4vL1x0XHR2YXIgYmFzZVVSSSA9ICQoXCIqXCIpLmNvbnRleHQuYmFzZVVSSTtcblxuXHRcdHZhciBsb2MgPSB3aW5kb3cubG9jYXRpb247XG5cdFx0dmFyIGN1cnJlbnRVUkwgPSBsb2MucHJvdG9jb2wgKyAnLy8nICsgbG9jLmhvc3QgKyBsb2MucGF0aG5hbWU7XG5cdFx0R2xvYmFsLnNldFVSTFRvQnJvd3NlciggY3VycmVudFVSTCArICcjIW09TG9naW4nICk7XG5cdFx0JCggdGhpcy5lbCApLnJlbW92ZSgpO1xuXHR9XG5cblx0b25DbG9zZUNsaWNrKCkge1xuXHRcdGlmICggdGhpcy5zY3JpcHRfbmFtZSApIHtcblx0XHRcdHRoaXMuc2F2ZUN1cnJlbnRTdGVwKCk7XG5cdFx0fVxuXHRcdHZhciBsb2MgPSB3aW5kb3cubG9jYXRpb247XG5cdFx0dmFyIGN1cnJlbnRVUkwgPSBsb2MucHJvdG9jb2wgKyAnLy8nICsgbG9jLmhvc3QgKyBsb2MucGF0aG5hbWU7XG5cdFx0R2xvYmFsLnNldFVSTFRvQnJvd3NlciggY3VycmVudFVSTCArICcjIW09TG9naW4nICk7XG5cdFx0JCggdGhpcy5lbCApLnJlbW92ZSgpO1xuXHR9XG5cblx0Y2xlYW5TdGVwc0RhdGEoKSB7XG5cdFx0dGhpcy5zdGVwc0RhdGFEaWMgPSB7fTtcblx0XHR0aGlzLmN1cnJlbnRfc3RlcCA9ICdsaWNlbnNlJztcblx0fVxuXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6868\n")}}]); |