1 line
150 KiB
JavaScript
1 line
150 KiB
JavaScript
"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["my_account-timesheet_authorization-TimeSheetAuthorizationViewController"],{8121:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"TimeSheetAuthorizationViewController\": () => (/* binding */ TimeSheetAuthorizationViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass TimeSheetAuthorizationViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#time_sheet_authorization_view_container',\n\n\t\t\ttype_array: null,\n\t\t\thierarchy_level_array: null,\n\n\t\t\tmessages: null,\n\n\t\t\tmessage_control_api: null,\n\n\t\t\tauthorization_api: null,\n\n\t\t\trequest_api: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'TimeSheetAuthorizationEditView.html';\n\t\tthis.permission_id = 'punch';\n\t\tthis.viewId = 'TimeSheetAuthorization';\n\t\tthis.script_name = 'TimeSheetAuthorizationView';\n\t\tthis.table_name_key = 'pay_period_time_sheet_verify';\n\t\tthis.context_menu_name = $.i18n._( 'TimeSheet (Authorizations)' );\n\t\tthis.navigation_label = $.i18n._( 'TimeSheet' );\n\t\tthis.api = TTAPI.APIPayPeriodTimeSheetVerify;\n\t\tthis.request_api = TTAPI.APIRequest;\n\t\tthis.message_control_api = TTAPI.APIMessageControl;\n\t\tthis.authorization_api = TTAPI.APIAuthorization;\n\t\tthis.event_bus = new TTEventBus({ view_id: this.viewId });\n\n\t\tthis.render();\n\t\tthis.buildContextMenu( true );\n\n\t\tthis.initData();\n\n\t\tthis.hierarchy_type_id = 90;\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\t\tvar res = this.request_api.getHierarchyLevelOptions( [-1], { async: false } );\n\t\tvar data = res.getResult();\n\t\t$this['hierarchy_level_array'] = Global.buildRecordArray( data );\n\t\tif ( Global.isSet( $this.basic_search_field_ui_dic['hierarchy_level'] ) ) {\n\t\t\t$this.basic_search_field_ui_dic['hierarchy_level'].setSourceData( Global.buildRecordArray( data ) );\n\t\t}\n\t}\n\n\tsearch( set_default_menu, page_action, page_number, callBack ) {\n\t\tthis.refresh_id = null;\n\t\tthis.updateBadgeCount();\n\t\tsuper.search( set_default_menu, page_action, page_number, callBack );\n\t}\n\n\tupdateBadgeCount() {\n\t\tthis.event_bus.emit( 'tt_topbar', 'profile_pending_counts', { //Update \"My Profile\" badge.\n\t\t\tobject_types: [ 'notification', 'timesheet_authorization' ]\n\t\t} );\n\t}\n\n\tprocessResultData( result_data ) {\n\t\tvar len = result_data.length;\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar item = result_data[i];\n\t\t\tif ( item.id == TTUUID.not_exist_id ) {\n\t\t\t\titem.id = item.user_id + '_' + item.pay_period_id;\n\t\t\t}\n\t\t}\n\n\t\treturn result_data;\n\t}\n\n\tparseToRecordId( id, index ) {\n\t\tif ( !id ) {\n\t\t\treturn false;\n\t\t}\n\t\tid = id.toString();\n\t\tif ( id.indexOf( '_' ) > 0 ) {\n\t\t\tif ( index >= 0 ) {\n\t\t\t\treturn id.split( '_' )[index];\n\t\t\t}\n\t\t\treturn TTUUID.not_exist_id;\n\t\t} else {\n\t\t\treturn id;\n\t\t}\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\tgroups: {\n\t\t\t\taction: {\n\t\t\t\t\tlabel: $.i18n._( 'Action' ),\n\t\t\t\t\tid: this.script_name + 'action'\n\t\t\t\t},\n\t\t\t\tauthorization: {\n\t\t\t\t\tlabel: $.i18n._( 'Authorization' ),\n\t\t\t\t\tid: this.script_name + 'authorization'\n\t\t\t\t},\n\t\t\t\tobjects: {\n\t\t\t\t\tlabel: $.i18n._( 'Objects' ),\n\t\t\t\t\tid: this.script_name + 'objects'\n\t\t\t\t}\n\t\t\t},\n\t\t\texclude: ['default'],\n\t\t\tinclude: [\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'View' ),\n\t\t\t\t\tid: 'view',\n\t\t\t\t\tgroup: 'action',\n\t\t\t\t\tvue_icon: 'tticon tticon-visibility_black_24dp',\n\t\t\t\t\tshow_on_right_click: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Cancel' ),\n\t\t\t\t\tid: 'cancel',\n\t\t\t\t\tgroup: 'action',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Authorize' ),\n\t\t\t\t\tid: 'authorization',\n\t\t\t\t\tvue_icon: 'tticon tticon-thumb_up_black_24dp',\n\t\t\t\t\tmenu_align: 'center'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Pass' ),\n\t\t\t\t\tid: 'pass',\n\t\t\t\t\tvue_icon: 'tticon tticon-redo_black_24dp',\n\t\t\t\t\tmenu_align: 'center'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Decline' ),\n\t\t\t\t\tid: 'decline',\n\t\t\t\t\tvue_icon: 'tticon tticon-thumb_down_black_24dp',\n\t\t\t\t\tmenu_align: 'center'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Jump To' ),\n\t\t\t\t\tid: 'jump_to_header',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\taction_group_header: true,\n\t\t\t\t\tpermission_result: false // to hide it in legacy context menu and avoid errors in legacy parsers.\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'TimeSheet' ),\n\t\t\t\t\tid: 'timesheet',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Schedule' ),\n\t\t\t\t\tid: 'schedule',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Export' ),\n\t\t\t\t\tid: 'export_excel',\n\t\t\t\t\tgroup: 'other',\n\t\t\t\t\tvue_icon: 'tticon tticon-file_upload_black_24dp',\n\t\t\t\t\tmenu_align: 'right'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Edit Employee' ),\n\t\t\t\t\tid: 'edit_employee',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t\t},\n\t\t\t]\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tsetDefaultMenuViewIcon( context_btn, grid_selected_length, p_id ) {\n\t\tif ( !this.viewPermissionValidate( p_id ) || this.edit_only_mode ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( grid_selected_length === 1 ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetDefaultMenuEditIcon( context_btn, grid_selected_length ) {\n\t\tif ( !this.editPermissionValidate( 'punch' ) || this.edit_only_mode ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( grid_selected_length === 1 && this.editOwnerOrChildPermissionValidate( 'punch' ) && this.parseToRecordId( this.getGridSelectIdArray()[0] ) !== TTUUID.not_exist_id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetEditMenuEditIcon( context_btn ) {\n\t\tif ( !this.editPermissionValidate( 'punch' ) || this.edit_only_mode ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\t\tif ( !this.is_viewing || !this.editOwnerOrChildPermissionValidate( 'punch' ) || this.parseToRecordId( this.current_edit_record.id ) === TTUUID.not_exist_id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tgetFilterColumnsFromDisplayColumns() {\n\t\t// Error: Unable to get property 'getGridParam' of undefined or null reference\n\t\tvar display_columns = [];\n\t\tif ( this.grid ) {\n\t\t\tdisplay_columns = this.grid.getGridParam( 'colModel' );\n\t\t}\n\n\t\tvar column_filter = {};\n\t\tcolumn_filter.is_owner = true;\n\t\tcolumn_filter.id = true;\n\t\tcolumn_filter.user_id = true;\n\t\tcolumn_filter.is_child = true;\n\t\tcolumn_filter.in_use = true;\n\t\tcolumn_filter.first_name = true;\n\t\tcolumn_filter.last_name = true;\n\t\tcolumn_filter.start_date = true;\n\t\tcolumn_filter.end_date = true;\n\t\tcolumn_filter.pay_period_id = true;\n\n\t\tif ( display_columns ) {\n\t\t\tvar len = display_columns.length;\n\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar column_info = display_columns[i];\n\t\t\t\tcolumn_filter[column_info.name] = true;\n\t\t\t}\n\t\t}\n\n\t\treturn column_filter;\n\t}\n\n\tsetDefaultMenuAuthorizationExpenseIcon( context_btn, grid_selected_length ) {\n\t\tif ( !( Global.getProductEdition() >= 25 ) ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t}\n\n\tsetCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'send':\n\t\t\t\tthis.setDefaultMenuSaveIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization':\n\t\t\t\tthis.setDefaultMenuAuthorizationIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'pass':\n\t\t\t\tthis.setDefaultMenuPassIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'decline':\n\t\t\t\tthis.setDefaultMenuDeclineIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_request':\n\t\t\t\tthis.setDefaultMenuAuthorizationRequestIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_timesheet':\n\t\t\t\tthis.setDefaultMenuAuthorizationTimesheetIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'punch' );\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'schedule' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_employee':\n\t\t\t\tthis.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'user' );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_expense':\n\t\t\t\tthis.setDefaultMenuAuthorizationExpenseIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetCustomEditMenuIcon( id, context_btn ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'send':\n\t\t\t\tthis.setEditMenuSaveIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization':\n\t\t\t\tthis.setEditMenuAuthorizationIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'pass':\n\t\t\t\tthis.setEditMenuPassIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'decline':\n\t\t\t\tthis.setEditMenuDeclineIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_request':\n\t\t\t\tthis.setEditMenuAuthorizationRequestIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_timesheet':\n\t\t\t\tthis.setEditMenuAuthorizationTimesheetIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\t\tthis.setEditMenuNavViewIcon( context_btn, 'punch' );\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tthis.setEditMenuNavViewIcon( context_btn, 'schedule' );\n\t\t\t\tbreak;\n\t\t\tcase 'edit_employee':\n\t\t\t\tthis.setEditMenuNavEditIcon( context_btn, 'user' );\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_expense':\n\t\t\t\tthis.setEditMenuAuthorizationExpenseIcon( context_btn );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetEditMenuAuthorizationExpenseIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tonCustomContextClick( id ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'send':\n\t\t\t\tthis.onSaveClick();\n\t\t\t\tbreak;\n\t\t\tcase 'authorization':\n\t\t\t\tthis.onAuthorizationClick();\n\t\t\t\tbreak;\n\t\t\tcase 'pass':\n\t\t\t\tthis.onPassClick();\n\t\t\t\tbreak;\n\t\t\tcase 'decline':\n\t\t\t\tthis.onDeclineClick();\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_request':\n\t\t\t\tthis.onAuthorizationRequestClick();\n\t\t\t\tbreak;\n\t\t\tcase 'authorization_timesheet':\n\t\t\t\tbreak; //Already here, don't do anything.\n\t\t\tcase 'authorization_expense':\n\t\t\t\tthis.onAuthorizationExpenseClick();\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\tcase 'schedule':\n\t\t\tcase 'edit_employee':\n\t\t\tcase 'export_excel':\n\t\t\t\tthis.onNavigationClick( id );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonAuthorizationExpenseClick() {\n\t\tIndexViewController.goToView( 'ExpenseAuthorization' );\n\t}\n\n\tonNavigationClick( iconName ) {\n\n\t\tvar $this = this;\n\n\t\tvar grid_selected_id_array;\n\n\t\tvar filter = {};\n\n\t\tvar ids = [];\n\n\t\tvar user_ids = [];\n\n\t\tvar base_date;\n\n\t\tif ( $this.edit_view && $this.current_edit_record.id ) {\n\t\t\tids.push( $this.current_edit_record.id );\n\t\t\tuser_ids.push( $this.current_edit_record.user_id );\n\t\t\tbase_date = $this.current_edit_record.start_date;\n\t\t} else {\n\t\t\tgrid_selected_id_array = this.getGridSelectIdArray();\n\t\t\t$.each( grid_selected_id_array, function( index, value ) {\n\t\t\t\tvar grid_selected_row = $this.getRecordFromGridById( value );\n\t\t\t\tids.push( grid_selected_row.id );\n\t\t\t\tuser_ids.push( grid_selected_row.user_id );\n\t\t\t\tbase_date = grid_selected_row.start_date;\n\t\t\t} );\n\t\t}\n\n\t\t//Error: TypeError: Global.strToDateTime(...) is null in interface/html5/framework/jquery.min.js?v=9.0.0-20151014-164655 line 2 > eval line 552\n\t\tbase_date = base_date ? Global.strToDateTime( base_date ).format() : new Date().format();\n\n\t\tswitch ( iconName ) {\n\t\t\tcase 'edit_employee':\n\t\t\t\tif ( user_ids.length > 0 ) {\n\t\t\t\t\tIndexViewController.openEditView( this, 'Employee', user_ids[0] );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet':\n\t\t\t\tif ( user_ids.length > 0 ) {\n\t\t\t\t\tfilter.user_id = user_ids[0];\n\t\t\t\t\tfilter.base_date = base_date;\n\t\t\t\t\tGlobal.addViewTab( $this.viewId, $.i18n._( 'Authorization - TimeSheet' ), window.location.href );\n\t\t\t\t\tIndexViewController.goToView( 'TimeSheet', filter );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'schedule':\n\t\t\t\tfilter.filter_data = {};\n\t\t\t\tvar include_users = { value: user_ids };\n\t\t\t\tfilter.filter_data.include_user_ids = include_users;\n\t\t\t\tfilter.select_date = base_date;\n\t\t\t\tGlobal.addViewTab( this.viewId, $.i18n._( 'Authorization - TimeSheet' ), window.location.href );\n\t\t\t\tIndexViewController.goToView( 'Schedule', filter );\n\t\t\t\tbreak;\n\n\t\t\tcase 'export_excel':\n\t\t\t\tthis.onExportClick( 'export' + this.api.key_name );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonSaveClick( ignoreWarning ) {\n\t\tif ( !Global.isSet( ignoreWarning ) ) {\n\t\t\tignoreWarning = false;\n\t\t}\n\t\tif ( this.is_edit ) {\n\n\t\t\tvar $this = this;\n\n\t\t\tvar record = {};\n\n\t\t\tthis.is_add = false;\n\n\t\t\trecord = this.uniformVariable( record );\n\n\t\t\tthis.message_control_api['setMessageControl']( record, false, ignoreWarning, {\n\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t$this.onSaveResult( result );\n\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tonSaveResult( result ) {\n\t\tvar $this = this;\n\t\tvar current_edit_record_id;\n\n\t\tif ( result.isValid() ) {\n\n\t\t\tcurrent_edit_record_id = $this.current_edit_record.id;\n\n\t\t\t$this.onViewClick( current_edit_record_id, true );\n\n\t\t} else {\n\t\t\t$this.setErrorMenu();\n\t\t\t$this.setErrorTips( result );\n\n\t\t}\n\t}\n\n\tvalidate() {\n\n\t\tvar $this = this;\n\n\t\tvar record = this.current_edit_record;\n\n\t\trecord = this.uniformVariable( record );\n\n\t\tthis.message_control_api['validate' + this.message_control_api.key_name]( record, {\n\t\t\tonResult: function( result ) {\n\t\t\t\t$this.validateResult( result );\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tonAuthorizationClick() {\n\t\tvar $this = this;\n\t\tvar data = [];\n\t\tvar grid_selected_id_array = this.getGridSelectIdArray();\n\t\tvar grid_selected_length = grid_selected_id_array.length;\n\n\t\tvar getRecordFilterData = ( record_data ) => {\n\t\t\tvar filter = {};\n\t\t\tfilter.authorized = true;\n\t\t\tif ( this.parseToRecordId( record_data.id ) == TTUUID.not_exist_id ) {\n\t\t\t\tfilter.object_id = TTUUID.not_exist_id;\n\t\t\t\tfilter.user_id = record_data.user_id;\n\t\t\t\tfilter.pay_period_id = record_data.pay_period_id;\n\t\t\t} else {\n\t\t\t\tfilter.object_id = record_data.id;\n\t\t\t}\n\t\t\tfilter.object_type_id = 90;\n\n\t\t\treturn filter;\n };\n\n\t\tif ( grid_selected_length > 0 && !this.is_viewing && !this.is_edit ) { //Only do mass authorization if not in list view.\n\t\t\tfor ( var i = 0; i < grid_selected_length; i++ ) {\n\t\t\t\tvar record_data = this.getRecordFromGridById( grid_selected_id_array[i] );\n\t\t\t\tdata.push( getRecordFilterData( record_data ) );\n\t\t\t}\n\t\t} else {\n\t\t\tdata.push( getRecordFilterData( $this.current_edit_record ) );\n\t\t}\n\n\t\t$this.authorization_api['setAuthorization']( data, {\n\t\t\tonResult: function( res ) {\n\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t$this.updateBadgeCount();\n\t\t\t\t\tif ( $this.is_edit || $this.is_viewing ) {\n\t\t\t\t\t\t$this.onRightArrowClick( function() {\n\t\t\t\t\t\t\t$this.search( false );\n\t\t\t\t\t\t\t$().TFeedback( {\n\t\t\t\t\t\t\t\tsource: 'Authorize'\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.search( true );\n\t\t\t\t\t\t$().TFeedback( {\n source: 'Authorize'\n } );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tTAlertManager.showErrorAlert( res );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\n\tonPassClick() {\n\t\tvar $this = this;\n\t\tthis.onRightArrowClick( function() {\n\t\t\t$this.search();\n\t\t\t$().TFeedback( {\n\t\t\t\tsource: 'Pass'\n\t\t\t} );\n\t\t} );\n\t}\n\n\tonAuthorizationRequestClick() {\n\t\tIndexViewController.goToView( 'RequestAuthorization' );\n\t}\n\n\tonCancelClick( force_no_confirm, cancel_all, callback ) {\n\t\t//Refresh grid on cancel as its not done during authorize/decline anymore.\n\t\tvar $this = this;\n\t\tsuper.onCancelClick( force_no_confirm, cancel_all, function() {\n\t\t\t//Since we are overriding the callback function to call this.search(), make sure the original callback is still called.\n\t\t\tif ( callback ) {\n\t\t\t\tcallback();\n\t\t\t}\n\n\t\t\t$this.search();\n\t\t} );\n\t}\n\n\tonDeclineClick() {\n\n\t\tvar $this = this;\n\t\tvar data = [];\n\t\tvar grid_selected_id_array = this.getGridSelectIdArray();\n\t\tvar grid_selected_length = grid_selected_id_array.length;\n\n\t\tvar getRecordFilterData = ( record_data ) => {\n\t\t\tvar filter = {};\n\t\t\tfilter.authorized = false;\n\t\t\tif ( this.parseToRecordId( record_data.id ) == TTUUID.not_exist_id ) {\n\t\t\t\tfilter.object_id = TTUUID.not_exist_id;\n\t\t\t\tfilter.user_id = record_data.user_id;\n\t\t\t\tfilter.pay_period_id = record_data.pay_period_id;\n\t\t\t} else {\n\t\t\t\tfilter.object_id = record_data.id;\n\t\t\t}\n\t\t\tfilter.object_type_id = 90;\n\n\t\t\treturn filter;\n\t\t};\n\n\t\tif ( grid_selected_length > 0 && !this.is_viewing && !this.is_edit ) { //Only do mass authorization if not in list view.\n\t\t\tfor ( var i = 0; i < grid_selected_length; i++ ) {\n\t\t\t\tvar record_data = this.getRecordFromGridById( grid_selected_id_array[i] );\n\t\t\t\tdata.push( getRecordFilterData( record_data ) );\n\t\t\t}\n\t\t} else {\n\t\t\tdata.push( getRecordFilterData( $this.current_edit_record ) );\n\t\t}\n\n\t\t$this.authorization_api['setAuthorization']( data, {\n\t\t\tonResult: function( res ) {\n\t\t\t\tif ( res.isValid() ) {\n\t\t\t\t\t$this.updateBadgeCount();\n\t\t\t\t\tif ( $this.is_edit || $this.is_viewing ) {\n\t\t\t\t\t\t$this.search( false );\n\t\t\t\t\t\t$this.onRightArrowClick( function() {\n\t\t\t\t\t\t\t$().TFeedback( {\n\t\t\t\t\t\t\t\tsource: 'Decline'\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.search( true );\n\t\t\t\t\t\t$().TFeedback( {\n\t\t\t\t\t\t\tsource: 'Decline'\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tTAlertManager.showErrorAlert( res );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\n\tonAuthorizationTimesheetClick() {\n\t\tthis.search( false );\n\t}\n\n\tuniformVariable( records ) {\n\n\t\tvar msg = {};\n\n\t\tif ( this.is_edit && this.current_edit_record != undefined ) {\n\t\t\tmsg.body = this.current_edit_record['body'];\n\t\t\tmsg.from_user_id = this.current_edit_record['user_id'];\n\t\t\tmsg.to_user_id = this.current_edit_record['user_id'];\n\t\t\tmsg.object_id = this.current_edit_record['id'];\n\t\t\tmsg.object_type_id = 90;\n\t\t\tif ( Global.isFalseOrNull( this.current_edit_record['subject'] ) ) {\n\t\t\t\tmsg.subject = this.edit_view_ui_dic['subject'].getValue();\n\t\t\t} else {\n\t\t\t\tmsg.subject = this.current_edit_record['subject'];\n\t\t\t}\n\t\t\treturn msg;\n\t\t}\n\t\trecords.id = this.parseToRecordId( records.id );\n\t\treturn records;\n\t}\n\n\tgetAPIFilters() {\n\t\t// override this function if view requires more filters\n\t\tvar record_id = this.getCurrentSelectedRecord();\n\t\tvar filter = {};\n\n\t\tfilter.filter_data = {};\n\t\tif ( this.parseToRecordId( record_id ) != TTUUID.not_exist_id ) {\n\t\t\tfilter.filter_data.id = [record_id];\n\t\t} else {\n\t\t\tfilter.filter_data.user_id = this.parseToRecordId( record_id, 0 );\n\t\t\tfilter.filter_data.pay_period_id = this.parseToRecordId( record_id, 1 );\n\t\t}\n\n\t\treturn filter;\n\t}\n\n\thandleViewAPICallbackResult( result ) {\n\t\tvar result_data = result.getResult();\n\t\tvar record_id = this.getCurrentSelectedRecord();\n\n\t\tresult_data = this.processResultData( result_data );\n\t\tif ( !result_data ) {\n\t\t\tresult_data = [];\n\t\t}\n\n\t\tresult_data = result_data[0];\n\t\treturn super.handleViewAPICallbackResult( result_data );\n\t}\n\n\tdoViewClickResult( result_data ) {\n\t\tsuper.doViewClickResult( result_data );\n\t\tAuthorizationHistory.init( this );\n\t}\n\n\tonGridDblClickRow() {\n\n\t\tProgressBar.showOverlay();\n\t\tthis.onViewClick();\n\t}\n\n\tsetEditMenuAuthorizationIcon( context_btn ) {\n\t\tif ( this.is_edit ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuPassIcon( context_btn ) {\n\t\tif ( this.is_edit ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuDeclineIcon( context_btn ) {\n\t\tif ( this.is_edit ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuAuthorizationRequestIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuAuthorizationTimesheetIcon( context_btn ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetDefaultMenuSaveIcon( context_btn, grid_selected_length ) {\n\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\tsetDefaultMenuAuthorizationIcon( context_btn, grid_selected_length ) {\n\t\tif ( grid_selected_length > 0 ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetDefaultMenuPassIcon( context_btn, grid_selected_length ) {\n\t\tif ( !this.is_viewing ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\tsetDefaultMenuDeclineIcon( context_btn, grid_selected_length ) {\n\t\tif ( grid_selected_length > 0 ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetDefaultMenuAuthorizationRequestIcon( context_btn, grid_selected_length ) {\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t}\n\n\tsetDefaultMenuAuthorizationTimesheetIcon( context_btn, grid_selected_length ) {\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t}\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\t\tthis.search_fields = [\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_id',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Pay Period' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'pay_period_id',\n\t\t\t\tlayout_name: 'global_Pay_period',\n\t\t\t\tapi_class: TTAPI.APIPayPeriod,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Hierarchy Level' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tmultiple: false,\n\t\t\t\tset_any: false,\n\t\t\t\tfield: 'hierarchy_level',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Created By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'created_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Updated By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'updated_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\t\t];\n\t}\n\n\tonEditClick( editId, noRefreshUI ) {\n\n\t\tvar $this = this;\n\t\tthis.is_viewing = false;\n\t\tthis.is_edit = true;\n\t\tthis.is_add = false;\n\t\tLocalCacheData.current_doing_context_action = 'edit';\n\t\t$this.openEditView();\n\n\t\t$this.initEditView();\n\t}\n\n\tgetSubViewFilter( filter ) {\n\n\t\tif ( filter.length === 0 ) {\n\t\t\tfilter = {};\n\t\t}\n\n\t\tif ( !Global.isSet( filter.hierarchy_level ) ) {\n\t\t\tfilter['hierarchy_level'] = 1;\n\t\t\tthis.filter_data['hierarchy_level'] = {\n\t\t\t\tfield: 'hierarchy_level',\n\t\t\t\tid: '',\n\t\t\t\tvalue: this.basic_search_field_ui_dic['hierarchy_level'].getValue( true )\n\t\t\t};\n\t\t}\n\n\t\treturn filter;\n\t}\n\n\tbuildEditViewUI() {\n\t\tsuper.buildEditViewUI();\n\n\t\tvar tab_model = {\n\t\t\t'tab_timesheet_verification': { 'label': $.i18n._( 'Message' ), 'is_multi_column': true },\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation = null;\n\n\t\t//Tab 0 start\n\n\t\tvar tab_timesheet_verification = this.edit_view_tab.find( '#tab_timesheet_verification' );\n\t\tvar tab_timesheet_verification_column1 = tab_timesheet_verification.find( '.first-column' );\n\t\tvar tab_timesheet_verification_column2 = tab_timesheet_verification.find( '.second-column' );\n\t\tthis.edit_view_tabs[0] = [];\n\t\tthis.edit_view_tabs[0].push( tab_timesheet_verification_column1 );\n\n\t\t// Subject\n\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'subject', width: 359 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Subject' ), form_item_input, tab_timesheet_verification_column1, '' );\n\n\t\t// Body\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\tform_item_input.TTextArea( { field: 'body', width: 600, height: 400 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Body' ), form_item_input, tab_timesheet_verification_column1, '', null, null, true );\n\t\ttab_timesheet_verification_column2.css( 'display', 'none' );\n\t}\n\n\tneedShowNavigation() {\n\t\tif ( this.is_viewing && this.current_edit_record && Global.isSet( this.current_edit_record.id ) && this.current_edit_record.id ) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbuildViewUI() {\n\t\tvar pager_data = this.navigation && this.navigation.getPagerData && this.navigation.getPagerData();\n\t\tvar source_data = this.navigation && this.navigation.getSourceData && this.navigation.getSourceData();\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_timesheet_verification': {\n\t\t\t\t'label': $.i18n._( 'TimeSheet Verification' ),\n\t\t\t\t'html_template': this.getTimeSheetAuthorizationTabHtml(),\n\t\t\t},\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APIPayPeriodTimeSheetVerify,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_Pay_period',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true,\n\t\t\textendDataProcessWhenSearch: this.processResultData\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\tif ( pager_data && source_data ) {\n\t\t\tthis.navigation.setSourceData( source_data );\n\t\t\tthis.navigation.setPagerData( pager_data );\n\t\t}\n\n\t\t//Tab 0 first column start\n\n\t\tvar tab_timesheet_verification = this.edit_view_tab.find( '#tab_timesheet_verification' );\n\t\tvar tab_timesheet_verification_column1 = tab_timesheet_verification.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\t\tthis.edit_view_tabs[0].push( tab_timesheet_verification_column1 );\n\n\t\t// Employee\n\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'full_name', selected_able: true } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_timesheet_verification_column1, '' );\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'status', selected_able: true } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_timesheet_verification_column1, '' );\n\n\t\t// Pay Period\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'pay_period', selected_able: true } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Pay Period' ), form_item_input, tab_timesheet_verification_column1 );\n\n\t\t// tab_timesheet_verification first column end\n\n\t\tvar separate_box = tab_timesheet_verification.find( '.separate' );\n\n\t\t// Messages\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.SEPARATED_BOX );\n\t\tform_item_input.SeparatedBox( { label: $.i18n._( 'Messages' ) } );\n\t\tthis.addEditFieldToColumn( null, form_item_input, separate_box );\n\n\t\tseparate_box.css( 'display', 'none' );\n\n\t\t// Tab 0 second column start\n\n\t\tvar tab_timesheet_verification_column2 = tab_timesheet_verification.find( '.second-column' );\n\n\t\tthis.edit_view_tabs[0].push( tab_timesheet_verification_column2 );\n\n\t\t// From\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'from', selected_able: true } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'From' ), form_item_input, tab_timesheet_verification_column2, '' );\n\n\t\t// Subject\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'subject', selected_able: true } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Subject' ), form_item_input, tab_timesheet_verification_column2 );\n\n\t\t// Body\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'body', width: 600, height: 400, selected_able: true } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Body' ), form_item_input, tab_timesheet_verification_column2, '', null, true, true );\n\n\t\t// Tab 0 second column end\n\n\t\ttab_timesheet_verification_column2.css( 'display', 'none' );\n\t}\n\n\tinitEditViewUI( view_id, edit_view_file_name ) {\n\t\tGlobal.setUINotready();\n\t\tTTPromise.add( 'init', 'init' );\n\t\tTTPromise.wait();\n\t\tvar $this = this;\n\n\t\tif ( this.edit_view ) {\n\t\t\tthis.edit_view.remove();\n\t\t}\n\n\t\tthis.edit_view = $( Global.loadViewSource( view_id, edit_view_file_name, null, true ) );\n\n\t\tthis.edit_view_tab = $( this.edit_view.find( '.edit-view-tab-bar' ) );\n\n\t\t//Give edt view tab a id, so we can load it when put right click menu on it\n\t\tthis.edit_view_tab.attr( 'id', this.ui_id + '_edit_view_tab' );\n\n\t\t// Moved into generic BaseView.initEditViewTabs\n\t\t// this.setTabOVisibility( false );\n\t\t// this.edit_view_tab = this.edit_view_tab.tabs( {\n\t\t// \tactivate: function( e, ui ) {\n\t\t// \t\t$this.onTabShow( e, ui );\n\t\t// \t}\n\t\t// } );\n\t\t//\n\t\t// this.edit_view_tab.bind( 'tabsselect', function( e, ui ) {\n\t\t// \t$this.onTabIndexChange( e, ui );\n\t\t// } );\n\n\t\tGlobal.contentContainer().append( this.edit_view );\n\t\tthis.initRightClickMenu( RightClickMenuType.EDITVIEW );\n\n\t\tif ( this.is_viewing ) {\n\t\t\tLocalCacheData.current_doing_context_action = 'view';\n\t\t\tthis.buildViewUI();\n\t\t} else if ( this.is_edit ) {\n\t\t\tLocalCacheData.current_doing_context_action = 'edit';\n\t\t\tthis.buildEditViewUI();\n\t\t}\n\n\t\t$this.setEditViewTabHeight();\n\t}\n\n\tinitEditViewTabs() {\n\t\tvar $this = this;\n\t\tvar tab_options = {\n\t\t\tactivate: function( e, ui ) {\n\t\t\t\t$this.onTabShow( e, ui );\n\t\t\t}\n\t\t};\n\n\t\tsuper.initEditViewTabs( tab_options );\n\t}\n\n\tsetCurrentEditRecordData() {\n\n\t\t//Set current edit record data to all widgets\n\t\tfor ( var key in this.current_edit_record ) {\n\t\t\tif ( !this.current_edit_record.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tif ( Global.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'full_name':\n\t\t\t\t\t\tif ( this.is_viewing ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record['first_name'] + ' ' + this.current_edit_record['last_name'] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'pay_period':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record['start_date'] + ' ' + this.current_edit_record['end_date'] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'subject':\n\t\t\t\t\t\tif ( this.is_edit ) {\n\t\t\t\t\t\t\tif ( Global.isSet( this.messages ) ) {\n\t\t\t\t\t\t\t\twidget.setValue( 'Re: ' + this.messages[0].subject );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( this.is_viewing ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.collectUIDataToCurrentEditRecord();\n\t\tthis.setEditViewDataDone();\n\t}\n\n\tsetEditViewDataDone() {\n\t\tvar $this = this;\n\t\tsuper.setEditViewDataDone();\n\n\t\tif ( this.is_viewing ) {\n\t\t\tthis.initTimeSheetSummary();\n\t\t\tthis.initExceptionSummary();\n\t\t\t//this.initEmbeddedMessageData();\n\t\t} else {\n\t\t\tif ( Global.isSet( $this.messages ) ) {\n\t\t\t\t$this.messages = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tbuildExceptionDisplayColumns( apiDisplayColumnsArray ) {\n\t\tvar len = this.all_exception_columns.length;\n\t\tvar len1 = apiDisplayColumnsArray ? apiDisplayColumnsArray.length : 0;\n\t\tvar display_columns = [];\n\t\tfor ( var j = 0; j < len1; j++ ) {\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tif ( apiDisplayColumnsArray[j] === this.all_exception_columns[i].value ) {\n\t\t\t\t\tdisplay_columns.push( this.all_exception_columns[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn display_columns;\n\t}\n\n\tinitExceptionSummary() {\n\n\t\tvar $this = this;\n\t\tif ( !this.api_exception ) {\n\t\t\tthis.api_exception = TTAPI.APIException;\n\t\t}\n\n\t\t$this.buildExceptionGrid();\n\t\t$this.setExceptionGridSize();\n\t\tthis.api_exception.getOptions( 'columns', {\n\t\t\tonResult: function( columns_result ) {\n\t\t\t\tvar columns_result_data = columns_result.getResult();\n\t\t\t\tif ( Global.isSet( $this.current_edit_record ) == false ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tvar args = {\n\t\t\t\t\tfilter_data: {\n\t\t\t\t\t\tuser_id: $this.current_edit_record.user_id,\n\t\t\t\t\t\tpay_period_id: $this.current_edit_record.pay_period_id,\n\t\t\t\t\t\ttype_id: [30, 40, 50, 55, 60]\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t$this.api_exception.getException( args, {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t$this.all_exception_columns = Global.buildColumnArray( columns_result_data );\n\t\t\t\t\t\tvar grid;\n\t\t\t\t\t\tif ( !Global.isSet( $this.exception_grid ) ) {\n\t\t\t\t\t\t\tgrid = $( '#exception_grid' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar display_columns = [\n\t\t\t\t\t\t\t'date_stamp',\n\t\t\t\t\t\t\t'severity',\n\t\t\t\t\t\t\t'exception_policy_type',\n\t\t\t\t\t\t\t'exception_policy_type_id',\n\t\t\t\t\t\t\t'exception_color',\n\t\t\t\t\t\t\t'exception_background_color'\n\t\t\t\t\t\t];\n\t\t\t\t\t\tdisplay_columns = $this.buildExceptionDisplayColumns( display_columns );\n\t\t\t\t\t\t//Set Data Grid on List view\n\t\t\t\t\t\tvar column_info_array = [];\n\t\t\t\t\t\tvar len = display_columns.length;\n\t\t\t\t\t\tvar start_from = 0;\n\t\t\t\t\t\tfor ( var i = start_from; i < len; i++ ) {\n\t\t\t\t\t\t\tvar view_column_data = display_columns[i];\n\t\t\t\t\t\t\tvar column_info = {\n\t\t\t\t\t\t\t\tname: view_column_data.value,\n\t\t\t\t\t\t\t\tindex: view_column_data.value,\n\t\t\t\t\t\t\t\tlabel: view_column_data.label,\n\t\t\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\t\t\tsortable: false,\n\t\t\t\t\t\t\t\ttitle: false\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcolumn_info_array.push( column_info );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$this.buildExceptionGrid( column_info_array );\n\n\t\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\t\tif ( !Global.isArray( result_data ) && TTUUID.isUUID( $this.refresh_id ) == false ) {\n\t\t\t\t\t\t\t$this.showExceptionGridNoResultCover();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.removeExceptionGridNoResultCover();\n\t\t\t\t\t\t\t$this.exception_grid.setData( Global.formatGridData( result.getResult() ) );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this.setExceptionGridSize();\n\n\t\t\t\t\t\t$( '.exception-title' ).text( $.i18n._( 'Exceptions' ) );\n\t\t\t\t\t\t$( '.exception-title' ).css( 'width', ( $this.exception_grid.grid.width() - 1 ) + 'px !important' );\n\t\t\t\t\t\t$this.setGridCellBackGround();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t}\n\n\tbuildExceptionGrid( column_info_array ) {\n\t\tvar $this = this;\n\n\t\tif ( typeof column_info_array == 'undefined' ) {\n\t\t\tcolumn_info_array = [];\n\t\t}\n\n\t\tif ( this.exception_grid ) {\n\t\t\tthis.exception_grid.grid.jqGrid( 'GridUnload' );\n\t\t\tthis.exception_grid = null;\n\t\t}\n\t\tthis.exception_grid = new TTGrid( 'exception_grid', {\n\t\t\tonResizeGrid: false,\n\t\t\tmultiselect: false,\n\t\t\twinMultiSelect: false,\n\t\t\tgridComplete: function() {\n\t\t\t\tif ( $( this ).jqGrid( 'getGridParam', 'data' ).length > 0 ) {\n\t\t\t\t\t$this.exception_grid.setGridColumnsWidth();\n\t\t\t\t}\n\t\t\t},\n\t\t\tondblClickRow: function( row_id ) {\n\t\t\t\t$this.onExceptionGridDblClickRow( row_id );\n\t\t\t},\n\t\t\tsortable: false,\n\t\t\theight: 160\n\t\t}, column_info_array );\n\t}\n\n\tshowExceptionGridNoResultCover() {\n\t\tthis.removeExceptionGridNoResultCover();\n\t\tthis.exception_grid_no_result_box = Global.loadWidgetByName( WidgetNamesDic.NO_RESULT_BOX );\n\t\tthis.exception_grid_no_result_box.NoResultBox( { related_view_controller: this, is_new: false } );\n\t\tvar grid_div = $( '.exception-grid-div' );\n\t\tgrid_div.css( 'position', 'relative' );\n\t\tthis.exception_grid_no_result_box.attr( 'id', '#exception_grid_no_result_box' );\n\t\tthis.exception_grid_no_result_box.css( 'width', parseInt( grid_div.width() ) + 'px' );\n\t\tthis.exception_grid_no_result_box.css( 'height', parseInt( grid_div.height() ) + 'px' );\n\n\t\tgrid_div.append( this.exception_grid_no_result_box );\n\t}\n\n\tremoveExceptionGridNoResultCover() {\n\t\tif ( this.exception_grid_no_result_box && this.exception_grid_no_result_box.length > 0 ) {\n\t\t\tthis.exception_grid_no_result_box.remove();\n\t\t}\n\t\tthis.exception_grid_no_result_box = null;\n\t}\n\n\tsetEditViewTabSize() {\n\t\tsuper.setEditViewTabSize();\n\t\tthis.setExceptionGridSize();\n\t\tthis.setTimeSheetSummaryGridSize();\n\t}\n\n\tsetGridCellBackGround() {\n\t\tvar data;\n\t\tvar len;\n\t\tvar i;\n\t\tvar item;\n\t\tif ( !this.exception_grid || !this.edit_view ) {\n\t\t\treturn;\n\t\t}\n\t\tdata = this.exception_grid.getGridParam( 'data' );\n\t\t//Error: TypeError: data is undefined in /interface/html5/framework/jquery.min.js?v=7.4.6-20141027-074127 line 2 > eval line 70\n\t\tif ( !data ) {\n\t\t\treturn;\n\t\t}\n\t\tlen = data.length;\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\titem = data[i];\n\t\t\tif ( item.exception_background_color ) {\n\t\t\t\tvar severity = this.edit_view.find( 'tr[id=\\'' + item.id + '\\']' ).find( 'td[aria-describedby=\"exception_grid_severity\"]' );\n\t\t\t\tseverity.css( 'background-color', item.exception_background_color );\n\t\t\t\tseverity.css( 'font-weight', 'bold' );\n\t\t\t}\n\t\t\tif ( item.exception_color ) {\n\t\t\t\tvar code = this.edit_view.find( 'tr[id=\\'' + item.id + '\\']' ).find( 'td[aria-describedby=\"exception_grid_exception_policy_type_id\"]' );\n\t\t\t\tcode.css( 'color', item.exception_color );\n\t\t\t\tcode.css( 'font-weight', 'bold' );\n\t\t\t}\n\t\t}\n\t}\n\n\tinitTimeSheetSummary() {\n\t\tvar $this = this;\n\n\t\tif ( Global.isSet( this.current_edit_record ) == false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.accumulated_total_grid_source_map = {};\n\t\tif ( !this.api_timesheet ) {\n\t\t\tthis.api_timesheet = TTAPI.APITimeSheet;\n\t\t}\n\n\t\t$this.buildAccumulatedTotalGrid();\n\t\tthis.api_timesheet.getTimeSheetData( this.current_edit_record.user_id, this.current_edit_record.start_date, {\n\t\t\tonResult: function( result ) {\n\n\t\t\t\tif ( Global.isSet( $this.current_edit_record ) == false ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t$this.full_timesheet_data = result.getResult();\n\t\t\t\t$this.pay_period_data = $this.full_timesheet_data.pay_period_data;\n\t\t\t\t$this.timesheet_verify_data = $this.full_timesheet_data.timesheet_verify_data;\n\t\t\t\t$this.start_date = Global.strToDate( $this.full_timesheet_data.timesheet_dates.start_display_date );\n\t\t\t\t$this.end_date = Global.strToDate( $this.full_timesheet_data.timesheet_dates.end_display_date );\n\t\t\t\tvar columns = [];\n\t\t\t\tvar punch_in_out_column = {\n\t\t\t\t\tname: 'punch_info',\n\t\t\t\t\tindex: 'punch_info',\n\t\t\t\t\tlabel: ' ',\n\t\t\t\t\twidth: 200,\n\t\t\t\t\tfixed: true,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tformatter: $this.onCellFormat\n\t\t\t\t};\n\t\t\t\tcolumns.push( punch_in_out_column );\n\t\t\t\tvar start_date_str = $this.current_edit_record.start_date;\n\t\t\t\tvar end_date_str = $this.current_edit_record.end_date;\n\t\t\t\t$this.getAccumulatedTotalGridPayperiodHeader();\n\t\t\t\tvar column_1 = {\n\t\t\t\t\tname: 'week',\n\t\t\t\t\tindex: 'week',\n\t\t\t\t\tlabel: $.i18n._( 'Week' ) + '<br>' + start_date_str + ' to ' + end_date_str,\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tformatter: $this.onCellFormat\n\t\t\t\t};\n\t\t\t\tvar column_2 = {\n\t\t\t\t\tname: 'pay_period',\n\t\t\t\t\tindex: 'pay_period',\n\t\t\t\t\tlabel: $.i18n._( 'Pay Period' ) + '<br>' + $this.pay_period_header,\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tformatter: $this.onCellFormat\n\t\t\t\t};\n\t\t\t\tcolumns.push( column_2 );\n\t\t\t\t$this.buildAccumulatedTotalGrid( columns );\n\t\t\t\t$this.buildAccumulatedTotalData();\n\t\t\t\t$this.setTimeSheetSummaryGridSize();\n\t\t\t\t$( '.button-rotate' ).removeClass( 'button-rotate' );\n\t\t\t}\n\t\t} );\n\t}\n\n\tbuildAccmulatedOrderMap( total ) {\n\t\tif ( !total ) {\n\t\t\treturn;\n\t\t}\n\t\tfor ( var key in total ) {\n\t\t\tfor ( var key1 in total[key] ) {\n\t\t\t\tthis.accmulated_order_map[key1] = total[key][key1].order;\n\t\t\t}\n\t\t}\n\t}\n\n\t//This function is copied from TimeSheetViewController.js\n\tbuildSubGridsData( array, date_string, map, result_array, parent_key ) {\n\t\tvar row;\n\t\tvar marked_regular_row = false; //Only mark the first regular time row, as thats where the bold top-line is going to go.\n\t\tfor ( var key in array ) {\n\t\t\tif ( !map[key] ) {\n\t\t\t\trow = {};\n\t\t\t\trow.parent_key = parent_key;\n\t\t\t\trow.key = key;\n\n\t\t\t\tif ( parent_key === 'accumulated_time' ) {\n\t\t\t\t\tif ( key === 'total' || key === 'worked_time' ) {\n\t\t\t\t\t\trow.type = TimeSheetAuthorizationViewController.TOTAL_ROW;\n\t\t\t\t\t} else if ( marked_regular_row == false && key.indexOf( 'regular_time' ) === 0 ) {\n\t\t\t\t\t\trow.type = TimeSheetAuthorizationViewController.REGULAR_ROW;\n\t\t\t\t\t\tmarked_regular_row = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\trow.type = TimeSheetAuthorizationViewController.ACCUMULATED_TIME_ROW;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( array[key].override ) {\n\t\t\t\t\t\trow.is_override_row = true;\n\t\t\t\t\t}\n\t\t\t\t} else if ( parent_key === 'premium_time' ) {\n\t\t\t\t\trow.type = TimeSheetAuthorizationViewController.PREMIUM_ROW;\n\t\t\t\t}\n\n\t\t\t\tif ( this.accmulated_order_map[key] ) {\n\t\t\t\t\trow.order = this.accmulated_order_map[key];\n\t\t\t\t}\n\n\t\t\t\trow.punch_info = array[key].label;\n\n\t\t\t\tvar key_array = key.split( '_' );\n\t\t\t\tvar no_id = false;\n\t\t\t\tif ( key_array.length > 1 && key_array[1] == '0' ) {\n\t\t\t\t\tno_id = true;\n\t\t\t\t}\n\n\t\t\t\tarray[key].key = key;\n\t\t\t\trow[date_string] = Global.getTimeUnit( array[key].total_time );\n\t\t\t\trow[date_string + '_data'] = array[key];\n\n\t\t\t\t//if id == 0, put the row as first row.\n\t\t\t\tif ( no_id ) {\n\t\t\t\t\tresult_array.unshift( row );\n\t\t\t\t} else {\n\t\t\t\t\tresult_array.push( row );\n\t\t\t\t}\n\t\t\t\tmap[key] = row;\n\t\t\t} else {\n\t\t\t\trow = map[key];\n\t\t\t\tif ( row[date_string] && key === 'total' ) { //Override total cell data since we set all to 00:00 at beginning\n\t\t\t\t\tarray[key].key = key;\n\t\t\t\t\trow[date_string] = Global.getTimeUnit( array[key].total_time );\n\t\t\t\t\trow[date_string + '_data'] = array[key];\n\t\t\t\t\tif ( row.parent_key === 'accumulated_time' ) {\n\t\t\t\t\t\tif ( array[key].override ) {\n\t\t\t\t\t\t\trow.is_override_row = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tarray[key].key = key;\n\t\t\t\t\trow[date_string] = Global.getTimeUnit( array[key].total_time );\n\t\t\t\t\trow[date_string + '_data'] = array[key];\n\n\t\t\t\t\tif ( row.parent_key === 'accumulated_time' ) {\n\t\t\t\t\t\tif ( array[key].override ) {\n\t\t\t\t\t\t\trow.is_override_row = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tbuildAccumulatedTotalData() {\n\t\tthis.accmulated_order_map = {};\n\t\tthis.accumulated_total_grid_source = [];\n\t\tvar accumulated_user_date_total_data = this.full_timesheet_data.accumulated_user_date_total_data;\n\t\tvar pay_period_accumulated_user_date_total_data = this.full_timesheet_data.pay_period_accumulated_user_date_total_data;\n\t\tvar accumulated_time = pay_period_accumulated_user_date_total_data.accumulated_time;\n\t\tvar premium_time = pay_period_accumulated_user_date_total_data.premium_time;\n\t\tvar absence_time = pay_period_accumulated_user_date_total_data.absence_time_taken;\n\t\t// Save the order, will do sort after all data prepared.\n\t\tif ( accumulated_user_date_total_data.total ) {\n\t\t\tthis.buildAccmulatedOrderMap( accumulated_user_date_total_data.total );\n\t\t}\n\t\tif ( pay_period_accumulated_user_date_total_data ) {\n\t\t\tthis.buildAccmulatedOrderMap( pay_period_accumulated_user_date_total_data );\n\t\t}\n\t\tif ( Global.isSet( accumulated_time ) ) {\n\t\t\tthis.buildSubGridsData( accumulated_time, 'pay_period', this.accumulated_total_grid_source_map, this.accumulated_total_grid_source, 'accumulated_time' );\n\t\t} else {\n\t\t\taccumulated_time = { total: { label: 'Total Time', total_time: '0' } };\n\t\t\tthis.buildSubGridsData( accumulated_time, 'pay_period', this.accumulated_total_grid_source_map, this.accumulated_total_grid_source, 'accumulated_time' );\n\t\t}\n\t\tif ( Global.isSet( premium_time ) ) {\n\t\t\tthis.buildSubGridsData( premium_time, 'pay_period', this.accumulated_total_grid_source_map, this.accumulated_total_grid_source, 'premium_time' );\n\t\t}\n\t\tif ( Global.isSet( absence_time ) ) {\n\t\t\tthis.buildSubGridsData( absence_time, 'pay_period', this.accumulated_total_grid_source_map, this.accumulated_total_grid_source, 'absence_time' );\n\t\t}\n\t\taccumulated_time = { total: { label: 'Total Time', total_time: '0' } };\n\t\tthis.buildSubGridsData( accumulated_time, 'week', this.accumulated_total_grid_source_map, this.accumulated_total_grid_source, 'accumulated_time' );\n\t\tfor ( var key in accumulated_user_date_total_data ) {\n\t\t\t//Build Accumulated Total Grid week column data\n\t\t\tif ( key === 'total' ) {\n\t\t\t\tvar total_result = accumulated_user_date_total_data.total;\n\t\t\t\taccumulated_time = total_result.accumulated_time;\n\t\t\t\tpremium_time = total_result.premium_time;\n\t\t\t\tabsence_time = total_result.absence_time_taken;\n\t\t\t\tif ( Global.isSet( accumulated_time ) ) {\n\t\t\t\t\tthis.buildSubGridsData( accumulated_time, 'week', this.accumulated_total_grid_source_map, this.accumulated_total_grid_source, 'accumulated_time' );\n\t\t\t\t}\n\t\t\t\tif ( Global.isSet( premium_time ) ) {\n\t\t\t\t\tthis.buildSubGridsData( premium_time, 'week', this.accumulated_total_grid_source_map, this.accumulated_total_grid_source, 'premium_time' );\n\t\t\t\t}\n\t\t\t\tif ( Global.isSet( absence_time ) ) {\n\t\t\t\t\tthis.buildSubGridsData( absence_time, 'week', this.accumulated_total_grid_source_map, this.accumulated_total_grid_source, 'absence_time' );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tthis.sortAccumulatedTotalData();\n\t\tthis.timesheet_authorization_summary_grid.setData( this.accumulated_total_grid_source );\n\n\t\t$( '.timesheet-authorization-summary-title' ).text( $.i18n._( 'TimeSheet Summary' ) );\n\t}\n\n\tsortAccumulatedTotalData() {\n\t\tvar sort_fields = ['order', 'punch_info'];\n\t\tthis.accumulated_total_grid_source.sort( Global.m_sort_by( sort_fields ) );\n\t}\n\n\tgetAccumulatedTotalGridPayperiodHeader() {\n\t\tthis.pay_period_header = $.i18n._( 'No Pay Period' );\n\t\tvar pay_period_id = this.timesheet_verify_data.pay_period_id;\n\t\tif ( pay_period_id && this.pay_period_data ) {\n\t\t\tfor ( var key in this.pay_period_data ) {\n\t\t\t\tvar pay_period = this.pay_period_data[key];\n\t\t\t\tif ( pay_period.id === pay_period_id ) {\n\t\t\t\t\tvar start_date = Global.strToDate( pay_period.start_date ).format();\n\t\t\t\t\tvar end_date = Global.strToDate( pay_period.end_date ).format();\n\t\t\t\t\tthis.pay_period_header = start_date + ' to ' + end_date;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tbuildAccumulatedTotalGrid( columns ) {\n\t\tvar $this = this;\n\t\tvar grid;\n\t\tif ( typeof columns == 'undefined' ) {\n\t\t\tcolumns = [];\n\t\t}\n\t\tif ( this.timesheet_authorization_summary_grid ) {\n\t\t\tthis.timesheet_authorization_summary_grid.grid.jqGrid( 'GridUnload' );\n\t\t\tthis.timesheet_authorization_summary_grid = null;\n\t\t}\n\t\tvar $this = this;\n\t\tthis.timesheet_authorization_summary_grid = new TTGrid( 'timesheet_authorization_summary_grid', {\n\t\t\tmultiselect: false,\n\t\t\twinMultiSelect: false,\n\t\t\tsortable: false,\n\t\t\tonResizeGrid: false,\n\t\t\tgridComplete: function() {\n\t\t\t\t$this.setTimeSheetSummaryGridSize();\n\t\t\t},\n\t\t\tondblClickRow: function() {\n\t\t\t\t$this.onTimeSheetGridDblClickRow();\n\t\t\t}\n\t\t}, columns );\n\t\tthis.setTimeSheetSummaryGridSize();\n\t}\n\n\tonTimeSheetGridDblClickRow() {\n\t\tvar filter = { filter_data: {} };\n\t\tfilter.user_id = this.current_edit_record.user_id;\n\t\tfilter.base_date = Global.strToDateTime( this.current_edit_record.start_date ).format();\n\t\tGlobal.addViewTab( this.viewId, $.i18n._( 'TimeSheet (Authorizations)' ), window.location.href );\n\t\tIndexViewController.goToView( 'TimeSheet', filter );\n\t}\n\n\tonExceptionGridDblClickRow( row_id ) {\n\t\tvar date_stamp = this.exception_grid.grid.jqGrid( 'getCell', row_id, 'date_stamp' );\n\n\t\tif ( !date_stamp ) {\n\t\t\tdate_stamp = Global.strToDateTime( this.current_edit_record.start_date ).format();\n\t\t}\n\n\t\tvar filter = { filter_data: {} };\n\t\tfilter.user_id = this.current_edit_record.user_id;\n\t\tfilter.base_date = date_stamp;\n\t\tGlobal.addViewTab( this.viewId, $.i18n._( 'TimeSheet (Authorizations)' ), window.location.href );\n\t\tIndexViewController.goToView( 'TimeSheet', filter );\n\t}\n\n\tonCellFormat( cell_value, related_data, row ) {\n\t\tcell_value = Global.decodeCellValue( cell_value );\n\t\tvar col_model = related_data.colModel;\n\t\tvar row_id = related_data.rowid;\n\t\tvar content_div = $( '<div class=\\'punch-content-div\\'></div>' );\n\t\tvar punch_info;\n\t\tif ( related_data.pos === 0 ) {\n\t\t\tif ( row.type === TimeSheetAuthorizationViewController.TOTAL_ROW ) {\n\t\t\t\tpunch_info = $( '<span class=\\'total\\' style=\\'font-size: 11px\\'></span>' );\n\t\t\t\tif ( Global.isSet( cell_value ) ) {\n\t\t\t\t\tpunch_info.text( cell_value );\n\t\t\t\t} else {\n\t\t\t\t\tpunch_info.text( '' );\n\t\t\t\t}\n\t\t\t\treturn punch_info.get( 0 ).outerHTML;\n\t\t\t} else if ( row.type === TimeSheetAuthorizationViewController.REGULAR_ROW ) {\n\t\t\t\tpunch_info = $( '<span class=\\'top-line-span\\' style=\\'font-size: 11px\\'></span>' );\n\t\t\t\tif ( Global.isSet( cell_value ) ) {\n\t\t\t\t\tpunch_info.text( cell_value );\n\t\t\t\t} else {\n\t\t\t\t\tpunch_info.text( '' );\n\t\t\t\t}\n\t\t\t\treturn punch_info.get( 0 ).outerHTML;\n\t\t\t}\n\t\t\treturn cell_value;\n\t\t}\n\t\tvar ex_span;\n\t\tvar i;\n\t\tvar time_span;\n\t\tvar punch;\n\t\tvar break_span;\n\t\tvar related_punch;\n\t\tvar exception;\n\t\tvar len;\n\t\tvar text;\n\t\tvar ex;\n\t\tvar data;\n\t\tif ( row.type === TimeSheetAuthorizationViewController.TOTAL_ROW ) {\n\t\t\tdata = row[col_model.name + '_data'];\n\t\t\ttime_span = $( '<span class=\\'total\\'></span>' );\n\t\t\tif ( Global.isSet( cell_value ) ) {\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.hasOwnProperty( 'override' ) && data.override === true ) {\n\t\t\t\t\t\ttime_span.addClass( 'absence-override' );\n\t\t\t\t\t}\n\t\t\t\t\tif ( data.hasOwnProperty( 'note' ) && data.note ) {\n\t\t\t\t\t\tcell_value = '*' + cell_value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttime_span.text( cell_value );\n\n\t\t\t} else {\n\t\t\t\ttime_span.text( '' );\n\t\t\t}\n\t\t\tcontent_div.prepend( time_span );\n\t\t} else if ( row.type === TimeSheetAuthorizationViewController.REGULAR_ROW ) {\n\t\t\tcontent_div.addClass( 'top-line' );\n\t\t\tdata = row[col_model.name + '_data'];\n\t\t\ttime_span = $( '<span ></span>' );\n\t\t\tif ( Global.isSet( cell_value ) ) {\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.hasOwnProperty( 'override' ) && data.override === true ) {\n\t\t\t\t\t\ttime_span.addClass( 'absence-override' );\n\t\t\t\t\t}\n\t\t\t\t\tif ( data.hasOwnProperty( 'note' ) && data.note ) {\n\t\t\t\t\t\tcell_value = '*' + cell_value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttime_span.text( cell_value );\n\t\t\t} else {\n\t\t\t\ttime_span.text( '' );\n\t\t\t}\n\t\t\tcontent_div.prepend( time_span );\n\t\t} else if ( row.type === TimeSheetAuthorizationViewController.ACCUMULATED_TIME_ROW ) {\n\t\t\tdata = row[col_model.name + '_data'];\n\t\t\ttime_span = $( '<span></span>' );\n\t\t\tif ( Global.isSet( cell_value ) ) {\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.hasOwnProperty( 'override' ) && data.override === true ) {\n\t\t\t\t\t\ttime_span.addClass( 'absence-override' );\n\t\t\t\t\t}\n\t\t\t\t\tif ( data.hasOwnProperty( 'note' ) && data.note ) {\n\t\t\t\t\t\tcell_value = '*' + cell_value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttime_span.text( cell_value );\n\t\t\t} else {\n\t\t\t\ttime_span.text( '' );\n\t\t\t}\n\t\t\tcontent_div.prepend( time_span );\n\t\t} else {\n\t\t\ttime_span = $( '<span class=\\'punch-time\\'></span>' );\n\t\t\tif ( Global.isSet( cell_value ) ) {\n\t\t\t\ttime_span.text( cell_value );\n\t\t\t} else {\n\t\t\t\ttime_span.text( '' );\n\t\t\t}\n\t\t\tcontent_div.prepend( time_span );\n\t\t}\n\t\treturn content_div.get( 0 ).outerHTML;\n\t}\n\n\tsetExceptionGridSize() {\n\t\tif ( this.exception_grid ) {\n\t\t\tthis.exception_grid.grid.setGridWidth( $( '.exception-grid-div' ).width() + 1 );\n\n\t\t\tvar size = 2;\n\n\t\t\tvar data_array = this.exception_grid.getData();\n\t\t\tif ( Global.isArray( data_array ) ) {\n\t\t\t\tsize += ( 22 * data_array.length );\n\t\t\t}\n\n\t\t\tthis.exception_grid.setGridHeight( size );\n\t\t}\n\t}\n\n\tsetTimeSheetSummaryGridSize() {\n\t\tif ( this.timesheet_authorization_summary_grid ) {\n\t\t\tthis.timesheet_authorization_summary_grid.grid.setGridWidth( $( '.timesheet-authorization-grid-div' ).width() );\n\n\t\t\tvar size = 2;\n\n\t\t\tvar data_array = this.timesheet_authorization_summary_grid.getData();\n\t\t\tif ( Global.isArray( data_array ) ) {\n\t\t\t\tsize += ( 22 * data_array.length );\n\t\t\t}\n\n\t\t\tthis.timesheet_authorization_summary_grid.setGridHeight( size );\n\t\t}\n\t}\n\n\tgetTimeSheetAuthorizationTabHtml() {\n\t\treturn `\n\t\t<div id=\"tab_timesheet_verification\" class=\"edit-view-tab-outside\">\n\t\t\t<div class=\"edit-view-tab\" id=\"tab_timesheet_verification_content_div\">\n\t\t\t\t<div class=\"first-column full-width-column\"></div>\n\t\t\t\t<div class=\"authorization-grid-div inside-grid full-width-column\">\n\t\t\t\t\t<div class=\"grid-top-border\"></div>\n\t\t\t\t\t<div class=\"grid-title separated-box\"></div>\n\t\t\t\t\t<table id=\"grid\"></table>\n\t\t\t\t\t<div class=\"bottom-div\">\n\t\t\t\t\t\t<div class=\"grid-bottom-border\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<br>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"third-column timesheet-authorization-grid-div\">\n\t\t\t\t\t<div class=\"accumulated-total-grid-title timesheet-authorization-summary-title full-width-column\"></div>\n\t\t\t\t\t<table id=\"timesheet_authorization_summary_grid\"></table>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"forth-column exception-grid-div\">\n\t\t\t\t\t<div class=\"accumulated-total-grid-title exception-title full-width-column\"></div>\n\t\t\t\t\t<table id=\"exception_grid\"></table>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"separate full-width-column\"></div>\n\t\t\t\t<div class=\"second-column full-width-column\" style=\"margin-left: 0\"></div>\n\t\t\t</div>\n\t\t</div>`;\n\t}\n\n}\n\nTimeSheetAuthorizationViewController.TOTAL_ROW = 4;\nTimeSheetAuthorizationViewController.REGULAR_ROW = 5;\nTimeSheetAuthorizationViewController.ABSENCE_ROW = 6;\nTimeSheetAuthorizationViewController.ACCUMULATED_TIME_ROW = 7;\nTimeSheetAuthorizationViewController.PREMIUM_ROW = 8;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEyMS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTztBQUNQLDJCQUEyQjtBQUMzQixFQUFFLENBQUM7QUFDSDs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLENBQUM7QUFDNUIsMEJBQTBCLENBQUM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msc0JBQXNCOztBQUUxRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtEQUErRCxlQUFlO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRyxDQUFDO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxDQUFDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLG9DQUFvQyxDQUFDO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5RUFBeUU7QUFDekUsb0JBQW9CLDBCQUEwQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sQ0FBQztBQUNSO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUixPQUFPO0FBQ1A7QUFDQSxNQUFNLENBQUM7QUFDUDtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLENBQUM7QUFDSjtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEseUVBQXlFO0FBQ3pFLG9CQUFvQiwwQkFBMEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLENBQUM7QUFDUjtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1IsT0FBTztBQUNQO0FBQ0EsTUFBTSxDQUFDO0FBQ1A7QUFDQSxRQUFRO0FBQ1I7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DLFNBQVMsQ0FBQywrQ0FBK0M7QUFDNUY7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQ0FBZ0MsK0JBQStCO0FBQy9ELDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0EsK0JBQStCLHlDQUF5QztBQUN4RSw2QkFBNkIsQ0FBQztBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWEsQ0FBQztBQUNkO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkIsMENBQTBDO0FBQ3JFLDZCQUE2QixDQUFDOztBQUU5QjtBQUNBLDJCQUEyQix1Q0FBdUM7QUFDbEUsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSwyQkFBMkIsMkNBQTJDO0FBQ3RFLDZCQUE2QixDQUFDOztBQUU5Qjs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLGtDQUFrQyxPQUFPLENBQUMsd0JBQXdCO0FBQ2xFOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkIscUNBQXFDO0FBQ2hFLDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0EsMkJBQTJCLHdDQUF3QztBQUNuRSw2QkFBNkIsQ0FBQzs7QUFFOUI7QUFDQTtBQUNBLDJCQUEyQiw4REFBOEQ7QUFDekYsNkJBQTZCLENBQUM7O0FBRTlCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLENBQUM7O0FBRXBCLHVCQUF1QixDQUFDOztBQUV4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFVBQVU7QUFDN0Isb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLENBQUM7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFNBQVM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsTUFBTSxDQUFDLDZCQUE2QixDQUFDO0FBQ3JDLE1BQU0sQ0FBQztBQUNQO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxDQUFDO0FBQ1Y7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELCtDQUErQztBQUNsRyxpQkFBaUIsQ0FBQztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxDQUFDO0FBQ0w7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSix3QkFBd0IsU0FBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSxDQUFDLG1EQUFtRCxDQUFDO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLENBQUM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxrQ0FBa0MsQ0FBQztBQUNuQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0Esa0NBQWtDLENBQUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixDQUFDO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixDQUFDO0FBQ2xCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGlCQUFpQixDQUFDO0FBQ2xCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLENBQUM7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsZUFBZSxDQUFDO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLGVBQWUsQ0FBQztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osZUFBZSxDQUFDO0FBQ2hCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEMsQ0FBQzs7QUFFM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnRUFBZ0UsQ0FBQzs7QUFFakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL215X2FjY291bnQvdGltZXNoZWV0X2F1dGhvcml6YXRpb24vVGltZVNoZWV0QXV0aG9yaXphdGlvblZpZXdDb250cm9sbGVyLmpzPzdkNDQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFRpbWVTaGVldEF1dGhvcml6YXRpb25WaWV3Q29udHJvbGxlciBleHRlbmRzIEJhc2VWaWV3Q29udHJvbGxlciB7XG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zID0ge30gKSB7XG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0ZWw6ICcjdGltZV9zaGVldF9hdXRob3JpemF0aW9uX3ZpZXdfY29udGFpbmVyJyxcblxuXHRcdFx0dHlwZV9hcnJheTogbnVsbCxcblx0XHRcdGhpZXJhcmNoeV9sZXZlbF9hcnJheTogbnVsbCxcblxuXHRcdFx0bWVzc2FnZXM6IG51bGwsXG5cblx0XHRcdG1lc3NhZ2VfY29udHJvbF9hcGk6IG51bGwsXG5cblx0XHRcdGF1dGhvcml6YXRpb25fYXBpOiBudWxsLFxuXG5cdFx0XHRyZXF1ZXN0X2FwaTogbnVsbFxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXHRcdC8vdGhpcy5fc3VwZXIoJ2luaXRpYWxpemUnLCBvcHRpb25zICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdHBsID0gJ1RpbWVTaGVldEF1dGhvcml6YXRpb25FZGl0Vmlldy5odG1sJztcblx0XHR0aGlzLnBlcm1pc3Npb25faWQgPSAncHVuY2gnO1xuXHRcdHRoaXMudmlld0lkID0gJ1RpbWVTaGVldEF1dGhvcml6YXRpb24nO1xuXHRcdHRoaXMuc2NyaXB0X25hbWUgPSAnVGltZVNoZWV0QXV0aG9yaXphdGlvblZpZXcnO1xuXHRcdHRoaXMudGFibGVfbmFtZV9rZXkgPSAncGF5X3BlcmlvZF90aW1lX3NoZWV0X3ZlcmlmeSc7XG5cdFx0dGhpcy5jb250ZXh0X21lbnVfbmFtZSA9ICQuaTE4bi5fKCAnVGltZVNoZWV0IChBdXRob3JpemF0aW9ucyknICk7XG5cdFx0dGhpcy5uYXZpZ2F0aW9uX2xhYmVsID0gJC5pMThuLl8oICdUaW1lU2hlZXQnICk7XG5cdFx0dGhpcy5hcGkgPSBUVEFQSS5BUElQYXlQZXJpb2RUaW1lU2hlZXRWZXJpZnk7XG5cdFx0dGhpcy5yZXF1ZXN0X2FwaSA9IFRUQVBJLkFQSVJlcXVlc3Q7XG5cdFx0dGhpcy5tZXNzYWdlX2NvbnRyb2xfYXBpID0gVFRBUEkuQVBJTWVzc2FnZUNvbnRyb2w7XG5cdFx0dGhpcy5hdXRob3JpemF0aW9uX2FwaSA9IFRUQVBJLkFQSUF1dGhvcml6YXRpb247XG5cdFx0dGhpcy5ldmVudF9idXMgPSBuZXcgVFRFdmVudEJ1cyh7IHZpZXdfaWQ6IHRoaXMudmlld0lkIH0pO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblxuXHRcdHRoaXMuaW5pdERhdGEoKTtcblxuXHRcdHRoaXMuaGllcmFyY2h5X3R5cGVfaWQgPSA5MDtcblx0fVxuXG5cdGluaXRPcHRpb25zKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHJlcyA9IHRoaXMucmVxdWVzdF9hcGkuZ2V0SGllcmFyY2h5TGV2ZWxPcHRpb25zKCBbLTFdLCB7IGFzeW5jOiBmYWxzZSB9ICk7XG5cdFx0dmFyIGRhdGEgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0JHRoaXNbJ2hpZXJhcmNoeV9sZXZlbF9hcnJheSddID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIGRhdGEgKTtcblx0XHRpZiAoIEdsb2JhbC5pc1NldCggJHRoaXMuYmFzaWNfc2VhcmNoX2ZpZWxkX3VpX2RpY1snaGllcmFyY2h5X2xldmVsJ10gKSApIHtcblx0XHRcdCR0aGlzLmJhc2ljX3NlYXJjaF9maWVsZF91aV9kaWNbJ2hpZXJhcmNoeV9sZXZlbCddLnNldFNvdXJjZURhdGEoIEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCBkYXRhICkgKTtcblx0XHR9XG5cdH1cblxuXHRzZWFyY2goIHNldF9kZWZhdWx0X21lbnUsIHBhZ2VfYWN0aW9uLCBwYWdlX251bWJlciwgY2FsbEJhY2sgKSB7XG5cdFx0dGhpcy5yZWZyZXNoX2lkID0gbnVsbDtcblx0XHR0aGlzLnVwZGF0ZUJhZGdlQ291bnQoKTtcblx0XHRzdXBlci5zZWFyY2goIHNldF9kZWZhdWx0X21lbnUsIHBhZ2VfYWN0aW9uLCBwYWdlX251bWJlciwgY2FsbEJhY2sgKTtcblx0fVxuXG5cdHVwZGF0ZUJhZGdlQ291bnQoKSB7XG5cdFx0dGhpcy5ldmVudF9idXMuZW1pdCggJ3R0X3RvcGJhcicsICdwcm9maWxlX3BlbmRpbmdfY291bnRzJywgeyAvL1VwZGF0ZSBcIk15IFByb2ZpbGVcIiBiYWRnZS5cblx0XHRcdG9iamVjdF90eXBlczogWyAnbm90aWZpY2F0aW9uJywgJ3RpbWVzaGVldF9hdXRob3JpemF0aW9uJyBdXG5cdFx0fSApO1xuXHR9XG5cblx0cHJvY2Vzc1Jlc3VsdERhdGEoIHJlc3VsdF9kYXRhICkge1xuXHRcdHZhciBsZW4gPSByZXN1bHRfZGF0YS5sZW5ndGg7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHR2YXIgaXRlbSA9IHJlc3VsdF9kYXRhW2ldO1xuXHRcdFx0aWYgKCBpdGVtLmlkID09IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdFx0XHRcdGl0ZW0uaWQgPSBpdGVtLnVzZXJfaWQgKyAnXycgKyBpdGVtLnBheV9wZXJpb2RfaWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdF9kYXRhO1xuXHR9XG5cblx0cGFyc2VUb1JlY29yZElkKCBpZCwgaW5kZXggKSB7XG5cdFx0aWYgKCAhaWQgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlkID0gaWQudG9TdHJpbmcoKTtcblx0XHRpZiAoIGlkLmluZGV4T2YoICdfJyApID4gMCApIHtcblx0XHRcdGlmICggaW5kZXggPj0gMCApIHtcblx0XHRcdFx0cmV0dXJuIGlkLnNwbGl0KCAnXycgKVtpbmRleF07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gVFRVVUlELm5vdF9leGlzdF9pZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGlkO1xuXHRcdH1cblx0fVxuXG5cdGdldEN1c3RvbUNvbnRleHRNZW51TW9kZWwoKSB7XG5cdFx0dmFyIGNvbnRleHRfbWVudV9tb2RlbCA9IHtcblx0XHRcdGdyb3Vwczoge1xuXHRcdFx0XHRhY3Rpb246IHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdBY3Rpb24nICksXG5cdFx0XHRcdFx0aWQ6IHRoaXMuc2NyaXB0X25hbWUgKyAnYWN0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhdXRob3JpemF0aW9uOiB7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQXV0aG9yaXphdGlvbicgKSxcblx0XHRcdFx0XHRpZDogdGhpcy5zY3JpcHRfbmFtZSArICdhdXRob3JpemF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvYmplY3RzOiB7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnT2JqZWN0cycgKSxcblx0XHRcdFx0XHRpZDogdGhpcy5zY3JpcHRfbmFtZSArICdvYmplY3RzJ1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZXhjbHVkZTogWydkZWZhdWx0J10sXG5cdFx0XHRpbmNsdWRlOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdWaWV3JyApLFxuXHRcdFx0XHRcdGlkOiAndmlldycsXG5cdFx0XHRcdFx0Z3JvdXA6ICdhY3Rpb24nLFxuXHRcdFx0XHRcdHZ1ZV9pY29uOiAndHRpY29uIHR0aWNvbi12aXNpYmlsaXR5X2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdHNob3dfb25fcmlnaHRfY2xpY2s6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdDYW5jZWwnICksXG5cdFx0XHRcdFx0aWQ6ICdjYW5jZWwnLFxuXHRcdFx0XHRcdGdyb3VwOiAnYWN0aW9uJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQXV0aG9yaXplJyApLFxuXHRcdFx0XHRcdGlkOiAnYXV0aG9yaXphdGlvbicsXG5cdFx0XHRcdFx0dnVlX2ljb246ICd0dGljb24gdHRpY29uLXRodW1iX3VwX2JsYWNrXzI0ZHAnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdjZW50ZXInXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdQYXNzJyApLFxuXHRcdFx0XHRcdGlkOiAncGFzcycsXG5cdFx0XHRcdFx0dnVlX2ljb246ICd0dGljb24gdHRpY29uLXJlZG9fYmxhY2tfMjRkcCcsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ2NlbnRlcidcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0RlY2xpbmUnICksXG5cdFx0XHRcdFx0aWQ6ICdkZWNsaW5lJyxcblx0XHRcdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tdGh1bWJfZG93bl9ibGFja18yNGRwJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAnY2VudGVyJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnSnVtcCBUbycgKSxcblx0XHRcdFx0XHRpZDogJ2p1bXBfdG9faGVhZGVyJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cDogJ2p1bXBfdG8nLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cF9oZWFkZXI6IHRydWUsXG5cdFx0XHRcdFx0cGVybWlzc2lvbl9yZXN1bHQ6IGZhbHNlIC8vIHRvIGhpZGUgaXQgaW4gbGVnYWN5IGNvbnRleHQgbWVudSBhbmQgYXZvaWQgZXJyb3JzIGluIGxlZ2FjeSBwYXJzZXJzLlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnVGltZVNoZWV0JyApLFxuXHRcdFx0XHRcdGlkOiAndGltZXNoZWV0Jyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cDogJ2p1bXBfdG8nLFxuXHRcdFx0XHRcdGdyb3VwOiAnbmF2aWdhdGlvbicsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1NjaGVkdWxlJyApLFxuXHRcdFx0XHRcdGlkOiAnc2NoZWR1bGUnLFxuXHRcdFx0XHRcdG1lbnVfYWxpZ246ICdyaWdodCcsXG5cdFx0XHRcdFx0YWN0aW9uX2dyb3VwOiAnanVtcF90bycsXG5cdFx0XHRcdFx0Z3JvdXA6ICduYXZpZ2F0aW9uJyxcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFeHBvcnQnICksXG5cdFx0XHRcdFx0aWQ6ICdleHBvcnRfZXhjZWwnLFxuXHRcdFx0XHRcdGdyb3VwOiAnb3RoZXInLFxuXHRcdFx0XHRcdHZ1ZV9pY29uOiAndHRpY29uIHR0aWNvbi1maWxlX3VwbG9hZF9ibGFja18yNGRwJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFZGl0IEVtcGxveWVlJyApLFxuXHRcdFx0XHRcdGlkOiAnZWRpdF9lbXBsb3llZScsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdqdW1wX3RvJyxcblx0XHRcdFx0XHRncm91cDogJ25hdmlnYXRpb24nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRdXG5cdFx0fTtcblxuXHRcdHJldHVybiBjb250ZXh0X21lbnVfbW9kZWw7XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudVZpZXdJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsIHBfaWQgKSB7XG5cdFx0aWYgKCAhdGhpcy52aWV3UGVybWlzc2lvblZhbGlkYXRlKCBwX2lkICkgfHwgdGhpcy5lZGl0X29ubHlfbW9kZSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHR9XG5cblx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID09PSAxICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldERlZmF1bHRNZW51RWRpdEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRpZiAoICF0aGlzLmVkaXRQZXJtaXNzaW9uVmFsaWRhdGUoICdwdW5jaCcgKSB8fCB0aGlzLmVkaXRfb25seV9tb2RlICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdH1cblxuXHRcdGlmICggZ3JpZF9zZWxlY3RlZF9sZW5ndGggPT09IDEgJiYgdGhpcy5lZGl0T3duZXJPckNoaWxkUGVybWlzc2lvblZhbGlkYXRlKCAncHVuY2gnICkgJiYgdGhpcy5wYXJzZVRvUmVjb3JkSWQoIHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKVswXSApICE9PSBUVFVVSUQubm90X2V4aXN0X2lkICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51RWRpdEljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdGlmICggIXRoaXMuZWRpdFBlcm1pc3Npb25WYWxpZGF0ZSggJ3B1bmNoJyApIHx8IHRoaXMuZWRpdF9vbmx5X21vZGUgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXHRcdGlmICggIXRoaXMuaXNfdmlld2luZyB8fCAhdGhpcy5lZGl0T3duZXJPckNoaWxkUGVybWlzc2lvblZhbGlkYXRlKCAncHVuY2gnICkgfHwgdGhpcy5wYXJzZVRvUmVjb3JkSWQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApID09PSBUVFVVSUQubm90X2V4aXN0X2lkICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRnZXRGaWx0ZXJDb2x1bW5zRnJvbURpc3BsYXlDb2x1bW5zKCkge1xuXHRcdC8vIEVycm9yOiBVbmFibGUgdG8gZ2V0IHByb3BlcnR5ICdnZXRHcmlkUGFyYW0nIG9mIHVuZGVmaW5lZCBvciBudWxsIHJlZmVyZW5jZVxuXHRcdHZhciBkaXNwbGF5X2NvbHVtbnMgPSBbXTtcblx0XHRpZiAoIHRoaXMuZ3JpZCApIHtcblx0XHRcdGRpc3BsYXlfY29sdW1ucyA9IHRoaXMuZ3JpZC5nZXRHcmlkUGFyYW0oICdjb2xNb2RlbCcgKTtcblx0XHR9XG5cblx0XHR2YXIgY29sdW1uX2ZpbHRlciA9IHt9O1xuXHRcdGNvbHVtbl9maWx0ZXIuaXNfb3duZXIgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuaWQgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIudXNlcl9pZCA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5pc19jaGlsZCA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5pbl91c2UgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuZmlyc3RfbmFtZSA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5sYXN0X25hbWUgPSB0cnVlO1xuXHRcdGNvbHVtbl9maWx0ZXIuc3RhcnRfZGF0ZSA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5lbmRfZGF0ZSA9IHRydWU7XG5cdFx0Y29sdW1uX2ZpbHRlci5wYXlfcGVyaW9kX2lkID0gdHJ1ZTtcblxuXHRcdGlmICggZGlzcGxheV9jb2x1bW5zICkge1xuXHRcdFx0dmFyIGxlbiA9IGRpc3BsYXlfY29sdW1ucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHR2YXIgY29sdW1uX2luZm8gPSBkaXNwbGF5X2NvbHVtbnNbaV07XG5cdFx0XHRcdGNvbHVtbl9maWx0ZXJbY29sdW1uX2luZm8ubmFtZV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb2x1bW5fZmlsdGVyO1xuXHR9XG5cblx0c2V0RGVmYXVsdE1lbnVBdXRob3JpemF0aW9uRXhwZW5zZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRpZiAoICEoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDI1ICkgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fVxuXHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0fVxuXG5cdHNldEN1c3RvbURlZmF1bHRNZW51SWNvbiggaWQsIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3NlbmQnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51U2F2ZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb24nOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51QXV0aG9yaXphdGlvbkljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3Bhc3MnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51UGFzc0ljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2RlY2xpbmUnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51RGVjbGluZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb25fcmVxdWVzdCc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVBdXRob3JpemF0aW9uUmVxdWVzdEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb25fdGltZXNoZWV0Jzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudUF1dGhvcml6YXRpb25UaW1lc2hlZXRJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd0aW1lc2hlZXQnOlxuXHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51Vmlld0ljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCwgJ3B1bmNoJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NjaGVkdWxlJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudVZpZXdJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsICdzY2hlZHVsZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlZGl0X2VtcGxveWVlJzpcblx0XHRcdFx0dGhpcy5zZXREZWZhdWx0TWVudVZpZXdJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGgsICd1c2VyJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb25fZXhwZW5zZSc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVBdXRob3JpemF0aW9uRXhwZW5zZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRzZXRDdXN0b21FZGl0TWVudUljb24oIGlkLCBjb250ZXh0X2J0biApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3NlbmQnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51U2F2ZUljb24oIGNvbnRleHRfYnRuICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbic6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVBdXRob3JpemF0aW9uSWNvbiggY29udGV4dF9idG4gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXNzJzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudVBhc3NJY29uKCBjb250ZXh0X2J0biApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2RlY2xpbmUnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51RGVjbGluZUljb24oIGNvbnRleHRfYnRuICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbl9yZXF1ZXN0Jzpcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudUF1dGhvcml6YXRpb25SZXF1ZXN0SWNvbiggY29udGV4dF9idG4gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhdXRob3JpemF0aW9uX3RpbWVzaGVldCc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVBdXRob3JpemF0aW9uVGltZXNoZWV0SWNvbiggY29udGV4dF9idG4gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd0aW1lc2hlZXQnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51TmF2Vmlld0ljb24oIGNvbnRleHRfYnRuLCAncHVuY2gnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2NoZWR1bGUnOlxuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51TmF2Vmlld0ljb24oIGNvbnRleHRfYnRuLCAnc2NoZWR1bGUnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZWRpdF9lbXBsb3llZSc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVOYXZFZGl0SWNvbiggY29udGV4dF9idG4sICd1c2VyJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb25fZXhwZW5zZSc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVBdXRob3JpemF0aW9uRXhwZW5zZUljb24oIGNvbnRleHRfYnRuICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51QXV0aG9yaXphdGlvbkV4cGVuc2VJY29uKCBjb250ZXh0X2J0biApIHtcblx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgfHwgIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9XG5cdH1cblxuXHRvbkN1c3RvbUNvbnRleHRDbGljayggaWQgKSB7XG5cdFx0c3dpdGNoICggaWQgKSB7XG5cdFx0XHRjYXNlICdzZW5kJzpcblx0XHRcdFx0dGhpcy5vblNhdmVDbGljaygpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb24nOlxuXHRcdFx0XHR0aGlzLm9uQXV0aG9yaXphdGlvbkNsaWNrKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncGFzcyc6XG5cdFx0XHRcdHRoaXMub25QYXNzQ2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdkZWNsaW5lJzpcblx0XHRcdFx0dGhpcy5vbkRlY2xpbmVDbGljaygpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2F1dGhvcml6YXRpb25fcmVxdWVzdCc6XG5cdFx0XHRcdHRoaXMub25BdXRob3JpemF0aW9uUmVxdWVzdENsaWNrKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbl90aW1lc2hlZXQnOlxuXHRcdFx0XHRicmVhazsgLy9BbHJlYWR5IGhlcmUsIGRvbid0IGRvIGFueXRoaW5nLlxuXHRcdFx0Y2FzZSAnYXV0aG9yaXphdGlvbl9leHBlbnNlJzpcblx0XHRcdFx0dGhpcy5vbkF1dGhvcml6YXRpb25FeHBlbnNlQ2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd0aW1lc2hlZXQnOlxuXHRcdFx0Y2FzZSAnc2NoZWR1bGUnOlxuXHRcdFx0Y2FzZSAnZWRpdF9lbXBsb3llZSc6XG5cdFx0XHRjYXNlICdleHBvcnRfZXhjZWwnOlxuXHRcdFx0XHR0aGlzLm9uTmF2aWdhdGlvbkNsaWNrKCBpZCApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRvbkF1dGhvcml6YXRpb25FeHBlbnNlQ2xpY2soKSB7XG5cdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ0V4cGVuc2VBdXRob3JpemF0aW9uJyApO1xuXHR9XG5cblx0b25OYXZpZ2F0aW9uQ2xpY2soIGljb25OYW1lICkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciBncmlkX3NlbGVjdGVkX2lkX2FycmF5O1xuXG5cdFx0dmFyIGZpbHRlciA9IHt9O1xuXG5cdFx0dmFyIGlkcyA9IFtdO1xuXG5cdFx0dmFyIHVzZXJfaWRzID0gW107XG5cblx0XHR2YXIgYmFzZV9kYXRlO1xuXG5cdFx0aWYgKCAkdGhpcy5lZGl0X3ZpZXcgJiYgJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdGlkcy5wdXNoKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICk7XG5cdFx0XHR1c2VyX2lkcy5wdXNoKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQgKTtcblx0XHRcdGJhc2VfZGF0ZSA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Z3JpZF9zZWxlY3RlZF9pZF9hcnJheSA9IHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKTtcblx0XHRcdCQuZWFjaCggZ3JpZF9zZWxlY3RlZF9pZF9hcnJheSwgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGdyaWRfc2VsZWN0ZWRfcm93ID0gJHRoaXMuZ2V0UmVjb3JkRnJvbUdyaWRCeUlkKCB2YWx1ZSApO1xuXHRcdFx0XHRpZHMucHVzaCggZ3JpZF9zZWxlY3RlZF9yb3cuaWQgKTtcblx0XHRcdFx0dXNlcl9pZHMucHVzaCggZ3JpZF9zZWxlY3RlZF9yb3cudXNlcl9pZCApO1xuXHRcdFx0XHRiYXNlX2RhdGUgPSBncmlkX3NlbGVjdGVkX3Jvdy5zdGFydF9kYXRlO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vRXJyb3I6IFR5cGVFcnJvcjogR2xvYmFsLnN0clRvRGF0ZVRpbWUoLi4uKSBpcyBudWxsIGluIGludGVyZmFjZS9odG1sNS9mcmFtZXdvcmsvanF1ZXJ5Lm1pbi5qcz92PTkuMC4wLTIwMTUxMDE0LTE2NDY1NSBsaW5lIDIgPiBldmFsIGxpbmUgNTUyXG5cdFx0YmFzZV9kYXRlID0gYmFzZV9kYXRlID8gR2xvYmFsLnN0clRvRGF0ZVRpbWUoIGJhc2VfZGF0ZSApLmZvcm1hdCgpIDogbmV3IERhdGUoKS5mb3JtYXQoKTtcblxuXHRcdHN3aXRjaCAoIGljb25OYW1lICkge1xuXHRcdFx0Y2FzZSAnZWRpdF9lbXBsb3llZSc6XG5cdFx0XHRcdGlmICggdXNlcl9pZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLm9wZW5FZGl0VmlldyggdGhpcywgJ0VtcGxveWVlJywgdXNlcl9pZHNbMF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RpbWVzaGVldCc6XG5cdFx0XHRcdGlmICggdXNlcl9pZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRmaWx0ZXIudXNlcl9pZCA9IHVzZXJfaWRzWzBdO1xuXHRcdFx0XHRcdGZpbHRlci5iYXNlX2RhdGUgPSBiYXNlX2RhdGU7XG5cdFx0XHRcdFx0R2xvYmFsLmFkZFZpZXdUYWIoICR0aGlzLnZpZXdJZCwgJC5pMThuLl8oICdBdXRob3JpemF0aW9uIC0gVGltZVNoZWV0JyApLCB3aW5kb3cubG9jYXRpb24uaHJlZiApO1xuXHRcdFx0XHRcdEluZGV4Vmlld0NvbnRyb2xsZXIuZ29Ub1ZpZXcoICdUaW1lU2hlZXQnLCBmaWx0ZXIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NjaGVkdWxlJzpcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0XHRcdHZhciBpbmNsdWRlX3VzZXJzID0geyB2YWx1ZTogdXNlcl9pZHMgfTtcblx0XHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLmluY2x1ZGVfdXNlcl9pZHMgPSBpbmNsdWRlX3VzZXJzO1xuXHRcdFx0XHRmaWx0ZXIuc2VsZWN0X2RhdGUgPSBiYXNlX2RhdGU7XG5cdFx0XHRcdEdsb2JhbC5hZGRWaWV3VGFiKCB0aGlzLnZpZXdJZCwgJC5pMThuLl8oICdBdXRob3JpemF0aW9uIC0gVGltZVNoZWV0JyApLCB3aW5kb3cubG9jYXRpb24uaHJlZiApO1xuXHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLmdvVG9WaWV3KCAnU2NoZWR1bGUnLCBmaWx0ZXIgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ2V4cG9ydF9leGNlbCc6XG5cdFx0XHRcdHRoaXMub25FeHBvcnRDbGljayggJ2V4cG9ydCcgKyB0aGlzLmFwaS5rZXlfbmFtZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRvblNhdmVDbGljayggaWdub3JlV2FybmluZyApIHtcblx0XHRpZiAoICFHbG9iYWwuaXNTZXQoIGlnbm9yZVdhcm5pbmcgKSApIHtcblx0XHRcdGlnbm9yZVdhcm5pbmcgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCB0aGlzLmlzX2VkaXQgKSB7XG5cblx0XHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHRcdHZhciByZWNvcmQgPSB7fTtcblxuXHRcdFx0dGhpcy5pc19hZGQgPSBmYWxzZTtcblxuXHRcdFx0cmVjb3JkID0gdGhpcy51bmlmb3JtVmFyaWFibGUoIHJlY29yZCApO1xuXG5cdFx0XHR0aGlzLm1lc3NhZ2VfY29udHJvbF9hcGlbJ3NldE1lc3NhZ2VDb250cm9sJ10oIHJlY29yZCwgZmFsc2UsIGlnbm9yZVdhcm5pbmcsIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHRcdFx0XHQkdGhpcy5vblNhdmVSZXN1bHQoIHJlc3VsdCApO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHRvblNhdmVSZXN1bHQoIHJlc3VsdCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBjdXJyZW50X2VkaXRfcmVjb3JkX2lkO1xuXG5cdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXG5cdFx0XHRjdXJyZW50X2VkaXRfcmVjb3JkX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblxuXHRcdFx0JHRoaXMub25WaWV3Q2xpY2soIGN1cnJlbnRfZWRpdF9yZWNvcmRfaWQsIHRydWUgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0XHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzdWx0ICk7XG5cblx0XHR9XG5cdH1cblxuXHR2YWxpZGF0ZSgpIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgcmVjb3JkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkO1xuXG5cdFx0cmVjb3JkID0gdGhpcy51bmlmb3JtVmFyaWFibGUoIHJlY29yZCApO1xuXG5cdFx0dGhpcy5tZXNzYWdlX2NvbnRyb2xfYXBpWyd2YWxpZGF0ZScgKyB0aGlzLm1lc3NhZ2VfY29udHJvbF9hcGkua2V5X25hbWVdKCByZWNvcmQsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHQkdGhpcy52YWxpZGF0ZVJlc3VsdCggcmVzdWx0ICk7XG5cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRvbkF1dGhvcml6YXRpb25DbGljaygpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBkYXRhID0gW107XG5cdFx0dmFyIGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkgPSB0aGlzLmdldEdyaWRTZWxlY3RJZEFycmF5KCk7XG5cdFx0dmFyIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID0gZ3JpZF9zZWxlY3RlZF9pZF9hcnJheS5sZW5ndGg7XG5cblx0XHR2YXIgZ2V0UmVjb3JkRmlsdGVyRGF0YSA9ICggcmVjb3JkX2RhdGEgKSA9PiB7XG5cdFx0XHR2YXIgZmlsdGVyID0ge307XG5cdFx0XHRmaWx0ZXIuYXV0aG9yaXplZCA9IHRydWU7XG5cdFx0XHRpZiAoIHRoaXMucGFyc2VUb1JlY29yZElkKCByZWNvcmRfZGF0YS5pZCApID09IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdFx0XHRcdGZpbHRlci5vYmplY3RfaWQgPSBUVFVVSUQubm90X2V4aXN0X2lkO1xuXHRcdFx0XHRmaWx0ZXIudXNlcl9pZCA9IHJlY29yZF9kYXRhLnVzZXJfaWQ7XG5cdFx0XHRcdGZpbHRlci5wYXlfcGVyaW9kX2lkID0gcmVjb3JkX2RhdGEucGF5X3BlcmlvZF9pZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZpbHRlci5vYmplY3RfaWQgPSByZWNvcmRfZGF0YS5pZDtcblx0XHRcdH1cblx0XHRcdGZpbHRlci5vYmplY3RfdHlwZV9pZCA9IDkwO1xuXG5cdFx0XHRyZXR1cm4gZmlsdGVyO1xuICAgICAgICB9O1xuXG5cdFx0aWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA+IDAgJiYgIXRoaXMuaXNfdmlld2luZyAmJiAhdGhpcy5pc19lZGl0ICkgeyAvL09ubHkgZG8gbWFzcyBhdXRob3JpemF0aW9uIGlmIG5vdCBpbiBsaXN0IHZpZXcuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBncmlkX3NlbGVjdGVkX2xlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YXIgcmVjb3JkX2RhdGEgPSB0aGlzLmdldFJlY29yZEZyb21HcmlkQnlJZCggZ3JpZF9zZWxlY3RlZF9pZF9hcnJheVtpXSApO1xuXHRcdFx0XHRkYXRhLnB1c2goIGdldFJlY29yZEZpbHRlckRhdGEoIHJlY29yZF9kYXRhICkgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YS5wdXNoKCBnZXRSZWNvcmRGaWx0ZXJEYXRhKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICkgKTtcblx0XHR9XG5cblx0XHQkdGhpcy5hdXRob3JpemF0aW9uX2FwaVsnc2V0QXV0aG9yaXphdGlvbiddKCBkYXRhLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0aWYgKCByZXMuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdCR0aGlzLnVwZGF0ZUJhZGdlQ291bnQoKTtcblx0XHRcdFx0XHRpZiAoICR0aGlzLmlzX2VkaXQgfHwgJHRoaXMuaXNfdmlld2luZyApIHtcblx0XHRcdFx0XHRcdCR0aGlzLm9uUmlnaHRBcnJvd0NsaWNrKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuc2VhcmNoKCBmYWxzZSApO1xuXHRcdFx0XHRcdFx0XHQkKCkuVEZlZWRiYWNrKCB7XG5cdFx0XHRcdFx0XHRcdFx0c291cmNlOiAnQXV0aG9yaXplJ1xuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdCR0aGlzLnNlYXJjaCggdHJ1ZSApO1xuXHRcdFx0XHRcdFx0JCgpLlRGZWVkYmFjaygge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ0F1dGhvcml6ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93RXJyb3JBbGVydCggcmVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRvblBhc3NDbGljaygpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMub25SaWdodEFycm93Q2xpY2soIGZ1bmN0aW9uKCkge1xuXHRcdFx0JHRoaXMuc2VhcmNoKCk7XG5cdFx0XHQkKCkuVEZlZWRiYWNrKCB7XG5cdFx0XHRcdHNvdXJjZTogJ1Bhc3MnXG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0b25BdXRob3JpemF0aW9uUmVxdWVzdENsaWNrKCkge1xuXHRcdEluZGV4Vmlld0NvbnRyb2xsZXIuZ29Ub1ZpZXcoICdSZXF1ZXN0QXV0aG9yaXphdGlvbicgKTtcblx0fVxuXG5cdG9uQ2FuY2VsQ2xpY2soIGZvcmNlX25vX2NvbmZpcm0sIGNhbmNlbF9hbGwsIGNhbGxiYWNrICkge1xuXHRcdC8vUmVmcmVzaCBncmlkIG9uIGNhbmNlbCBhcyBpdHMgbm90IGRvbmUgZHVyaW5nIGF1dGhvcml6ZS9kZWNsaW5lIGFueW1vcmUuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRzdXBlci5vbkNhbmNlbENsaWNrKCBmb3JjZV9ub19jb25maXJtLCBjYW5jZWxfYWxsLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vU2luY2Ugd2UgYXJlIG92ZXJyaWRpbmcgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgdGhpcy5zZWFyY2goKSwgbWFrZSBzdXJlIHRoZSBvcmlnaW5hbCBjYWxsYmFjayBpcyBzdGlsbCBjYWxsZWQuXG5cdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5zZWFyY2goKTtcblx0XHR9ICk7XG5cdH1cblxuXHRvbkRlY2xpbmVDbGljaygpIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGRhdGEgPSBbXTtcblx0XHR2YXIgZ3JpZF9zZWxlY3RlZF9pZF9hcnJheSA9IHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKTtcblx0XHR2YXIgZ3JpZF9zZWxlY3RlZF9sZW5ndGggPSBncmlkX3NlbGVjdGVkX2lkX2FycmF5Lmxlbmd0aDtcblxuXHRcdHZhciBnZXRSZWNvcmRGaWx0ZXJEYXRhID0gKCByZWNvcmRfZGF0YSApID0+IHtcblx0XHRcdHZhciBmaWx0ZXIgPSB7fTtcblx0XHRcdGZpbHRlci5hdXRob3JpemVkID0gZmFsc2U7XG5cdFx0XHRpZiAoIHRoaXMucGFyc2VUb1JlY29yZElkKCByZWNvcmRfZGF0YS5pZCApID09IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdFx0XHRcdGZpbHRlci5vYmplY3RfaWQgPSBUVFVVSUQubm90X2V4aXN0X2lkO1xuXHRcdFx0XHRmaWx0ZXIudXNlcl9pZCA9IHJlY29yZF9kYXRhLnVzZXJfaWQ7XG5cdFx0XHRcdGZpbHRlci5wYXlfcGVyaW9kX2lkID0gcmVjb3JkX2RhdGEucGF5X3BlcmlvZF9pZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZpbHRlci5vYmplY3RfaWQgPSByZWNvcmRfZGF0YS5pZDtcblx0XHRcdH1cblx0XHRcdGZpbHRlci5vYmplY3RfdHlwZV9pZCA9IDkwO1xuXG5cdFx0XHRyZXR1cm4gZmlsdGVyO1xuXHRcdH07XG5cblx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID4gMCAmJiAhdGhpcy5pc192aWV3aW5nICYmICF0aGlzLmlzX2VkaXQgKSB7IC8vT25seSBkbyBtYXNzIGF1dGhvcml6YXRpb24gaWYgbm90IGluIGxpc3Qgdmlldy5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGdyaWRfc2VsZWN0ZWRfbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhciByZWNvcmRfZGF0YSA9IHRoaXMuZ2V0UmVjb3JkRnJvbUdyaWRCeUlkKCBncmlkX3NlbGVjdGVkX2lkX2FycmF5W2ldICk7XG5cdFx0XHRcdGRhdGEucHVzaCggZ2V0UmVjb3JkRmlsdGVyRGF0YSggcmVjb3JkX2RhdGEgKSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhLnB1c2goIGdldFJlY29yZEZpbHRlckRhdGEoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSApO1xuXHRcdH1cblxuXHRcdCR0aGlzLmF1dGhvcml6YXRpb25fYXBpWydzZXRBdXRob3JpemF0aW9uJ10oIGRhdGEsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRpZiAoIHJlcy5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0JHRoaXMudXBkYXRlQmFkZ2VDb3VudCgpO1xuXHRcdFx0XHRcdGlmICggJHRoaXMuaXNfZWRpdCB8fCAkdGhpcy5pc192aWV3aW5nICkge1xuXHRcdFx0XHRcdFx0JHRoaXMuc2VhcmNoKCBmYWxzZSApO1xuXHRcdFx0XHRcdFx0JHRoaXMub25SaWdodEFycm93Q2xpY2soIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHQkKCkuVEZlZWRiYWNrKCB7XG5cdFx0XHRcdFx0XHRcdFx0c291cmNlOiAnRGVjbGluZSdcblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5zZWFyY2goIHRydWUgKTtcblx0XHRcdFx0XHRcdCQoKS5URmVlZGJhY2soIHtcblx0XHRcdFx0XHRcdFx0c291cmNlOiAnRGVjbGluZSdcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93RXJyb3JBbGVydCggcmVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRvbkF1dGhvcml6YXRpb25UaW1lc2hlZXRDbGljaygpIHtcblx0XHR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblx0fVxuXG5cdHVuaWZvcm1WYXJpYWJsZSggcmVjb3JkcyApIHtcblxuXHRcdHZhciBtc2cgPSB7fTtcblxuXHRcdGlmICggdGhpcy5pc19lZGl0ICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCAhPSB1bmRlZmluZWQgKSB7XG5cdFx0XHRtc2cuYm9keSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnYm9keSddO1xuXHRcdFx0bXNnLmZyb21fdXNlcl9pZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsndXNlcl9pZCddO1xuXHRcdFx0bXNnLnRvX3VzZXJfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3VzZXJfaWQnXTtcblx0XHRcdG1zZy5vYmplY3RfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2lkJ107XG5cdFx0XHRtc2cub2JqZWN0X3R5cGVfaWQgPSA5MDtcblx0XHRcdGlmICggR2xvYmFsLmlzRmFsc2VPck51bGwoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnc3ViamVjdCddICkgKSB7XG5cdFx0XHRcdG1zZy5zdWJqZWN0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljWydzdWJqZWN0J10uZ2V0VmFsdWUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1zZy5zdWJqZWN0ID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydzdWJqZWN0J107XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbXNnO1xuXHRcdH1cblx0XHRyZWNvcmRzLmlkID0gdGhpcy5wYXJzZVRvUmVjb3JkSWQoIHJlY29yZHMuaWQgKTtcblx0XHRyZXR1cm4gcmVjb3Jkcztcblx0fVxuXG5cdGdldEFQSUZpbHRlcnMoKSB7XG5cdFx0Ly8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpZiB2aWV3IHJlcXVpcmVzIG1vcmUgZmlsdGVyc1xuXHRcdHZhciByZWNvcmRfaWQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZFJlY29yZCgpO1xuXHRcdHZhciBmaWx0ZXIgPSB7fTtcblxuXHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IHt9O1xuXHRcdGlmICggdGhpcy5wYXJzZVRvUmVjb3JkSWQoIHJlY29yZF9pZCApICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdFx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEuaWQgPSBbcmVjb3JkX2lkXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLnVzZXJfaWQgPSB0aGlzLnBhcnNlVG9SZWNvcmRJZCggcmVjb3JkX2lkLCAwICk7XG5cdFx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEucGF5X3BlcmlvZF9pZCA9IHRoaXMucGFyc2VUb1JlY29yZElkKCByZWNvcmRfaWQsIDEgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmlsdGVyO1xuXHR9XG5cblx0aGFuZGxlVmlld0FQSUNhbGxiYWNrUmVzdWx0KCByZXN1bHQgKSB7XG5cdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdHZhciByZWNvcmRfaWQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZFJlY29yZCgpO1xuXG5cdFx0cmVzdWx0X2RhdGEgPSB0aGlzLnByb2Nlc3NSZXN1bHREYXRhKCByZXN1bHRfZGF0YSApO1xuXHRcdGlmICggIXJlc3VsdF9kYXRhICkge1xuXHRcdFx0cmVzdWx0X2RhdGEgPSBbXTtcblx0XHR9XG5cblx0XHRyZXN1bHRfZGF0YSA9IHJlc3VsdF9kYXRhWzBdO1xuXHRcdHJldHVybiBzdXBlci5oYW5kbGVWaWV3QVBJQ2FsbGJhY2tSZXN1bHQoIHJlc3VsdF9kYXRhICk7XG5cdH1cblxuXHRkb1ZpZXdDbGlja1Jlc3VsdCggcmVzdWx0X2RhdGEgKSB7XG5cdFx0c3VwZXIuZG9WaWV3Q2xpY2tSZXN1bHQoIHJlc3VsdF9kYXRhICk7XG5cdFx0QXV0aG9yaXphdGlvbkhpc3RvcnkuaW5pdCggdGhpcyApO1xuXHR9XG5cblx0b25HcmlkRGJsQ2xpY2tSb3coKSB7XG5cblx0XHRQcm9ncmVzc0Jhci5zaG93T3ZlcmxheSgpO1xuXHRcdHRoaXMub25WaWV3Q2xpY2soKTtcblx0fVxuXG5cdHNldEVkaXRNZW51QXV0aG9yaXphdGlvbkljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdGlmICggdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51UGFzc0ljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdGlmICggdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51RGVjbGluZUljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdGlmICggdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgdHJ1ZSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51QXV0aG9yaXphdGlvblJlcXVlc3RJY29uKCBjb250ZXh0X2J0biApIHtcblx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgfHwgIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9XG5cdH1cblxuXHRzZXRFZGl0TWVudUF1dGhvcml6YXRpb25UaW1lc2hlZXRJY29uKCBjb250ZXh0X2J0biApIHtcblx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgfHwgIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudVNhdmVJY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKSB7XG5cdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUF1dGhvcml6YXRpb25JY29uKCBjb250ZXh0X2J0biwgZ3JpZF9zZWxlY3RlZF9sZW5ndGggKSB7XG5cdFx0aWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA+IDAgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fVxuXHR9XG5cblx0c2V0RGVmYXVsdE1lbnVQYXNzSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdGlmICggIXRoaXMuaXNfdmlld2luZyApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fVxuXG5cdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0fVxuXG5cdHNldERlZmF1bHRNZW51RGVjbGluZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID4gMCApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUF1dGhvcml6YXRpb25SZXF1ZXN0SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICkge1xuXHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0fVxuXG5cdHNldERlZmF1bHRNZW51QXV0aG9yaXphdGlvblRpbWVzaGVldEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRDb250ZXh0TWVudU1hbmFnZXIuZGlzYWJsZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCB0cnVlICk7XG5cdH1cblxuXHRidWlsZFNlYXJjaEZpZWxkcygpIHtcblxuXHRcdHN1cGVyLmJ1aWxkU2VhcmNoRmllbGRzKCk7XG5cdFx0dGhpcy5zZWFyY2hfZmllbGRzID0gW1xuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRW1wbG95ZWUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICd1c2VyX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1BheSBQZXJpb2QnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdwYXlfcGVyaW9kX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfUGF5X3BlcmlvZCcsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUGF5UGVyaW9kLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnSGllcmFyY2h5IExldmVsJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdG11bHRpcGxlOiBmYWxzZSxcblx0XHRcdFx0c2V0X2FueTogZmFsc2UsXG5cdFx0XHRcdGZpZWxkOiAnaGllcmFyY2h5X2xldmVsJyxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfb3B0aW9uX2NvbHVtbicsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0NyZWF0ZWQgQnknICksXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0ZmllbGQ6ICdjcmVhdGVkX2J5Jyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1VwZGF0ZWQgQnknICksXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0ZmllbGQ6ICd1cGRhdGVkX2J5Jyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdXNlcicsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKVxuXHRcdF07XG5cdH1cblxuXHRvbkVkaXRDbGljayggZWRpdElkLCBub1JlZnJlc2hVSSApIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dGhpcy5pc192aWV3aW5nID0gZmFsc2U7XG5cdFx0dGhpcy5pc19lZGl0ID0gdHJ1ZTtcblx0XHR0aGlzLmlzX2FkZCA9IGZhbHNlO1xuXHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPSAnZWRpdCc7XG5cdFx0JHRoaXMub3BlbkVkaXRWaWV3KCk7XG5cblx0XHQkdGhpcy5pbml0RWRpdFZpZXcoKTtcblx0fVxuXG5cdGdldFN1YlZpZXdGaWx0ZXIoIGZpbHRlciApIHtcblxuXHRcdGlmICggZmlsdGVyLmxlbmd0aCA9PT0gMCApIHtcblx0XHRcdGZpbHRlciA9IHt9O1xuXHRcdH1cblxuXHRcdGlmICggIUdsb2JhbC5pc1NldCggZmlsdGVyLmhpZXJhcmNoeV9sZXZlbCApICkge1xuXHRcdFx0ZmlsdGVyWydoaWVyYXJjaHlfbGV2ZWwnXSA9IDE7XG5cdFx0XHR0aGlzLmZpbHRlcl9kYXRhWydoaWVyYXJjaHlfbGV2ZWwnXSA9IHtcblx0XHRcdFx0ZmllbGQ6ICdoaWVyYXJjaHlfbGV2ZWwnLFxuXHRcdFx0XHRpZDogJycsXG5cdFx0XHRcdHZhbHVlOiB0aGlzLmJhc2ljX3NlYXJjaF9maWVsZF91aV9kaWNbJ2hpZXJhcmNoeV9sZXZlbCddLmdldFZhbHVlKCB0cnVlIClcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZpbHRlcjtcblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblxuXHRcdHZhciB0YWJfbW9kZWwgPSB7XG5cdFx0XHQndGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb24nOiB7ICdsYWJlbCc6ICQuaTE4bi5fKCAnTWVzc2FnZScgKSwgJ2lzX211bHRpX2NvbHVtbic6IHRydWUgfSxcblx0XHR9O1xuXHRcdHRoaXMuc2V0VGFiTW9kZWwoIHRhYl9tb2RlbCApO1xuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uID0gbnVsbDtcblxuXHRcdC8vVGFiIDAgc3RhcnRcblxuXHRcdHZhciB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbiA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl90aW1lc2hlZXRfdmVyaWZpY2F0aW9uJyApO1xuXHRcdHZhciB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbl9jb2x1bW4xID0gdGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb24uZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cdFx0dmFyIHRhYl90aW1lc2hlZXRfdmVyaWZpY2F0aW9uX2NvbHVtbjIgPSB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbi5maW5kKCAnLnNlY29uZC1jb2x1bW4nICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1swXSA9IFtdO1xuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb25fY29sdW1uMSApO1xuXG5cdFx0Ly8gU3ViamVjdFxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3N1YmplY3QnLCB3aWR0aDogMzU5IH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1N1YmplY3QnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb25fY29sdW1uMSwgJycgKTtcblxuXHRcdC8vIEJvZHlcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfQVJFQSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dEFyZWEoIHsgZmllbGQ6ICdib2R5Jywgd2lkdGg6IDYwMCwgaGVpZ2h0OiA0MDAgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQm9keScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbl9jb2x1bW4xLCAnJywgbnVsbCwgbnVsbCwgdHJ1ZSApO1xuXHRcdHRhYl90aW1lc2hlZXRfdmVyaWZpY2F0aW9uX2NvbHVtbjIuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHR9XG5cblx0bmVlZFNob3dOYXZpZ2F0aW9uKCkge1xuXHRcdGlmICggdGhpcy5pc192aWV3aW5nICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCAmJiBHbG9iYWwuaXNTZXQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0YnVpbGRWaWV3VUkoKSB7XG5cdFx0dmFyIHBhZ2VyX2RhdGEgPSB0aGlzLm5hdmlnYXRpb24gJiYgdGhpcy5uYXZpZ2F0aW9uLmdldFBhZ2VyRGF0YSAmJiB0aGlzLm5hdmlnYXRpb24uZ2V0UGFnZXJEYXRhKCk7XG5cdFx0dmFyIHNvdXJjZV9kYXRhID0gdGhpcy5uYXZpZ2F0aW9uICYmIHRoaXMubmF2aWdhdGlvbi5nZXRTb3VyY2VEYXRhICYmIHRoaXMubmF2aWdhdGlvbi5nZXRTb3VyY2VEYXRhKCk7XG5cdFx0c3VwZXIuYnVpbGRFZGl0Vmlld1VJKCk7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIHRhYl9tb2RlbCA9IHtcblx0XHRcdCd0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbic6IHtcblx0XHRcdFx0J2xhYmVsJzogJC5pMThuLl8oICdUaW1lU2hlZXQgVmVyaWZpY2F0aW9uJyApLFxuXHRcdFx0XHQnaHRtbF90ZW1wbGF0ZSc6IHRoaXMuZ2V0VGltZVNoZWV0QXV0aG9yaXphdGlvblRhYkh0bWwoKSxcblx0XHRcdH0sXG5cdFx0fTtcblx0XHR0aGlzLnNldFRhYk1vZGVsKCB0YWJfbW9kZWwgKTtcblxuXHRcdHRoaXMubmF2aWdhdGlvbi5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUGF5UGVyaW9kVGltZVNoZWV0VmVyaWZ5LFxuXHRcdFx0aWQ6IHRoaXMuc2NyaXB0X25hbWUgKyAnX25hdmlnYXRpb24nLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX1BheV9wZXJpb2QnLFxuXHRcdFx0bmF2aWdhdGlvbl9tb2RlOiB0cnVlLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0ZXh0ZW5kRGF0YVByb2Nlc3NXaGVuU2VhcmNoOiB0aGlzLnByb2Nlc3NSZXN1bHREYXRhXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5zZXROYXZpZ2F0aW9uKCk7XG5cblx0XHRpZiAoIHBhZ2VyX2RhdGEgJiYgc291cmNlX2RhdGEgKSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRpb24uc2V0U291cmNlRGF0YSggc291cmNlX2RhdGEgKTtcblx0XHRcdHRoaXMubmF2aWdhdGlvbi5zZXRQYWdlckRhdGEoIHBhZ2VyX2RhdGEgKTtcblx0XHR9XG5cblx0XHQvL1RhYiAwIGZpcnN0IGNvbHVtbiBzdGFydFxuXG5cdFx0dmFyIHRhYl90aW1lc2hlZXRfdmVyaWZpY2F0aW9uID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb24nICk7XG5cdFx0dmFyIHRhYl90aW1lc2hlZXRfdmVyaWZpY2F0aW9uX2NvbHVtbjEgPSB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbi5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl90aW1lc2hlZXRfdmVyaWZpY2F0aW9uX2NvbHVtbjEgKTtcblxuXHRcdC8vIEVtcGxveWVlXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2Z1bGxfbmFtZScsIHNlbGVjdGVkX2FibGU6IHRydWUgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW1wbG95ZWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb25fY29sdW1uMSwgJycgKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3N0YXR1cycsIHNlbGVjdGVkX2FibGU6IHRydWUgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU3RhdHVzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90aW1lc2hlZXRfdmVyaWZpY2F0aW9uX2NvbHVtbjEsICcnICk7XG5cblx0XHQvLyBQYXkgUGVyaW9kXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAncGF5X3BlcmlvZCcsIHNlbGVjdGVkX2FibGU6IHRydWUgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUGF5IFBlcmlvZCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbl9jb2x1bW4xICk7XG5cblx0XHQvLyB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbiBmaXJzdCBjb2x1bW4gZW5kXG5cblx0XHR2YXIgc2VwYXJhdGVfYm94ID0gdGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb24uZmluZCggJy5zZXBhcmF0ZScgKTtcblxuXHRcdC8vIE1lc3NhZ2VzXG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlNFUEFSQVRFRF9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuU2VwYXJhdGVkQm94KCB7IGxhYmVsOiAkLmkxOG4uXyggJ01lc3NhZ2VzJyApIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCBudWxsLCBmb3JtX2l0ZW1faW5wdXQsIHNlcGFyYXRlX2JveCApO1xuXG5cdFx0c2VwYXJhdGVfYm94LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblxuXHRcdC8vIFRhYiAwIHNlY29uZCBjb2x1bW4gc3RhcnRcblxuXHRcdHZhciB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbl9jb2x1bW4yID0gdGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb24uZmluZCggJy5zZWNvbmQtY29sdW1uJyApO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1swXS5wdXNoKCB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbl9jb2x1bW4yICk7XG5cblx0XHQvLyBGcm9tXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnZnJvbScsIHNlbGVjdGVkX2FibGU6IHRydWUgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRnJvbScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvbl9jb2x1bW4yLCAnJyApO1xuXG5cdFx0Ly8gU3ViamVjdFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3N1YmplY3QnLCBzZWxlY3RlZF9hYmxlOiB0cnVlIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1N1YmplY3QnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb25fY29sdW1uMiApO1xuXG5cdFx0Ly8gQm9keVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2JvZHknLCB3aWR0aDogNjAwLCBoZWlnaHQ6IDQwMCwgc2VsZWN0ZWRfYWJsZTogdHJ1ZSB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdCb2R5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90aW1lc2hlZXRfdmVyaWZpY2F0aW9uX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cblx0XHQvLyBUYWIgMCBzZWNvbmQgY29sdW1uIGVuZFxuXG5cdFx0dGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb25fY29sdW1uMi5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdH1cblxuXHRpbml0RWRpdFZpZXdVSSggdmlld19pZCwgZWRpdF92aWV3X2ZpbGVfbmFtZSApIHtcblx0XHRHbG9iYWwuc2V0VUlOb3RyZWFkeSgpO1xuXHRcdFRUUHJvbWlzZS5hZGQoICdpbml0JywgJ2luaXQnICk7XG5cdFx0VFRQcm9taXNlLndhaXQoKTtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCB0aGlzLmVkaXRfdmlldyApIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3LnJlbW92ZSgpO1xuXHRcdH1cblxuXHRcdHRoaXMuZWRpdF92aWV3ID0gJCggR2xvYmFsLmxvYWRWaWV3U291cmNlKCB2aWV3X2lkLCBlZGl0X3ZpZXdfZmlsZV9uYW1lLCBudWxsLCB0cnVlICkgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYiA9ICQoIHRoaXMuZWRpdF92aWV3LmZpbmQoICcuZWRpdC12aWV3LXRhYi1iYXInICkgKTtcblxuXHRcdC8vR2l2ZSBlZHQgdmlldyB0YWIgYSBpZCwgc28gd2UgY2FuIGxvYWQgaXQgd2hlbiBwdXQgcmlnaHQgY2xpY2sgbWVudSBvbiBpdFxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYi5hdHRyKCAnaWQnLCB0aGlzLnVpX2lkICsgJ19lZGl0X3ZpZXdfdGFiJyApO1xuXG5cdFx0Ly8gTW92ZWQgaW50byBnZW5lcmljIEJhc2VWaWV3LmluaXRFZGl0Vmlld1RhYnNcblx0XHQvLyB0aGlzLnNldFRhYk9WaXNpYmlsaXR5KCBmYWxzZSApO1xuXHRcdC8vIHRoaXMuZWRpdF92aWV3X3RhYiA9IHRoaXMuZWRpdF92aWV3X3RhYi50YWJzKCB7XG5cdFx0Ly8gXHRhY3RpdmF0ZTogZnVuY3Rpb24oIGUsIHVpICkge1xuXHRcdC8vIFx0XHQkdGhpcy5vblRhYlNob3coIGUsIHVpICk7XG5cdFx0Ly8gXHR9XG5cdFx0Ly8gfSApO1xuXHRcdC8vXG5cdFx0Ly8gdGhpcy5lZGl0X3ZpZXdfdGFiLmJpbmQoICd0YWJzc2VsZWN0JywgZnVuY3Rpb24oIGUsIHVpICkge1xuXHRcdC8vIFx0JHRoaXMub25UYWJJbmRleENoYW5nZSggZSwgdWkgKTtcblx0XHQvLyB9ICk7XG5cblx0XHRHbG9iYWwuY29udGVudENvbnRhaW5lcigpLmFwcGVuZCggdGhpcy5lZGl0X3ZpZXcgKTtcblx0XHR0aGlzLmluaXRSaWdodENsaWNrTWVudSggUmlnaHRDbGlja01lbnVUeXBlLkVESVRWSUVXICk7XG5cblx0XHRpZiAoIHRoaXMuaXNfdmlld2luZyApIHtcblx0XHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPSAndmlldyc7XG5cdFx0XHR0aGlzLmJ1aWxkVmlld1VJKCk7XG5cdFx0fSBlbHNlIGlmICggdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9kb2luZ19jb250ZXh0X2FjdGlvbiA9ICdlZGl0Jztcblx0XHRcdHRoaXMuYnVpbGRFZGl0Vmlld1VJKCk7XG5cdFx0fVxuXG5cdFx0JHRoaXMuc2V0RWRpdFZpZXdUYWJIZWlnaHQoKTtcblx0fVxuXG5cdGluaXRFZGl0Vmlld1RhYnMoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgdGFiX29wdGlvbnMgPSB7XG5cdFx0XHRhY3RpdmF0ZTogZnVuY3Rpb24oIGUsIHVpICkge1xuXHRcdFx0XHQkdGhpcy5vblRhYlNob3coIGUsIHVpICk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHN1cGVyLmluaXRFZGl0Vmlld1RhYnMoIHRhYl9vcHRpb25zICk7XG5cdH1cblxuXHRzZXRDdXJyZW50RWRpdFJlY29yZERhdGEoKSB7XG5cblx0XHQvL1NldCBjdXJyZW50IGVkaXQgcmVjb3JkIGRhdGEgdG8gYWxsIHdpZGdldHNcblx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHdpZGdldCApICkge1xuXHRcdFx0XHRzd2l0Y2ggKCBrZXkgKSB7XG5cdFx0XHRcdFx0Y2FzZSAnZnVsbF9uYW1lJzpcblx0XHRcdFx0XHRcdGlmICggdGhpcy5pc192aWV3aW5nICkge1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZmlyc3RfbmFtZSddICsgJyAnICsgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydsYXN0X25hbWUnXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGF5X3BlcmlvZCc6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnc3RhcnRfZGF0ZSddICsgJyAnICsgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydlbmRfZGF0ZSddICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzdWJqZWN0Jzpcblx0XHRcdFx0XHRcdGlmICggdGhpcy5pc19lZGl0ICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5tZXNzYWdlcyApICkge1xuXHRcdFx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggJ1JlOiAnICsgdGhpcy5tZXNzYWdlc1swXS5zdWJqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuaXNfdmlld2luZyApIHtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmNvbGxlY3RVSURhdGFUb0N1cnJlbnRFZGl0UmVjb3JkKCk7XG5cdFx0dGhpcy5zZXRFZGl0Vmlld0RhdGFEb25lKCk7XG5cdH1cblxuXHRzZXRFZGl0Vmlld0RhdGFEb25lKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0c3VwZXIuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXG5cdFx0aWYgKCB0aGlzLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHR0aGlzLmluaXRUaW1lU2hlZXRTdW1tYXJ5KCk7XG5cdFx0XHR0aGlzLmluaXRFeGNlcHRpb25TdW1tYXJ5KCk7XG5cdFx0XHQvL3RoaXMuaW5pdEVtYmVkZGVkTWVzc2FnZURhdGEoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoICR0aGlzLm1lc3NhZ2VzICkgKSB7XG5cdFx0XHRcdCR0aGlzLm1lc3NhZ2VzID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRidWlsZEV4Y2VwdGlvbkRpc3BsYXlDb2x1bW5zKCBhcGlEaXNwbGF5Q29sdW1uc0FycmF5ICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmFsbF9leGNlcHRpb25fY29sdW1ucy5sZW5ndGg7XG5cdFx0dmFyIGxlbjEgPSBhcGlEaXNwbGF5Q29sdW1uc0FycmF5ID8gYXBpRGlzcGxheUNvbHVtbnNBcnJheS5sZW5ndGggOiAwO1xuXHRcdHZhciBkaXNwbGF5X2NvbHVtbnMgPSBbXTtcblx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBsZW4xOyBqKysgKSB7XG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0aWYgKCBhcGlEaXNwbGF5Q29sdW1uc0FycmF5W2pdID09PSB0aGlzLmFsbF9leGNlcHRpb25fY29sdW1uc1tpXS52YWx1ZSApIHtcblx0XHRcdFx0XHRkaXNwbGF5X2NvbHVtbnMucHVzaCggdGhpcy5hbGxfZXhjZXB0aW9uX2NvbHVtbnNbaV0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZGlzcGxheV9jb2x1bW5zO1xuXHR9XG5cblx0aW5pdEV4Y2VwdGlvblN1bW1hcnkoKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdGlmICggIXRoaXMuYXBpX2V4Y2VwdGlvbiApIHtcblx0XHRcdHRoaXMuYXBpX2V4Y2VwdGlvbiA9IFRUQVBJLkFQSUV4Y2VwdGlvbjtcblx0XHR9XG5cblx0XHQkdGhpcy5idWlsZEV4Y2VwdGlvbkdyaWQoKTtcblx0XHQkdGhpcy5zZXRFeGNlcHRpb25HcmlkU2l6ZSgpO1xuXHRcdHRoaXMuYXBpX2V4Y2VwdGlvbi5nZXRPcHRpb25zKCAnY29sdW1ucycsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggY29sdW1uc19yZXN1bHQgKSB7XG5cdFx0XHRcdHZhciBjb2x1bW5zX3Jlc3VsdF9kYXRhID0gY29sdW1uc19yZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICkgPT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBhcmdzID0ge1xuXHRcdFx0XHRcdGZpbHRlcl9kYXRhOiB7XG5cdFx0XHRcdFx0XHR1c2VyX2lkOiAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQsXG5cdFx0XHRcdFx0XHRwYXlfcGVyaW9kX2lkOiAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnBheV9wZXJpb2RfaWQsXG5cdFx0XHRcdFx0XHR0eXBlX2lkOiBbMzAsIDQwLCA1MCwgNTUsIDYwXVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHQkdGhpcy5hcGlfZXhjZXB0aW9uLmdldEV4Y2VwdGlvbiggYXJncywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0JHRoaXMuYWxsX2V4Y2VwdGlvbl9jb2x1bW5zID0gR2xvYmFsLmJ1aWxkQ29sdW1uQXJyYXkoIGNvbHVtbnNfcmVzdWx0X2RhdGEgKTtcblx0XHRcdFx0XHRcdHZhciBncmlkO1xuXHRcdFx0XHRcdFx0aWYgKCAhR2xvYmFsLmlzU2V0KCAkdGhpcy5leGNlcHRpb25fZ3JpZCApICkge1xuXHRcdFx0XHRcdFx0XHRncmlkID0gJCggJyNleGNlcHRpb25fZ3JpZCcgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHZhciBkaXNwbGF5X2NvbHVtbnMgPSBbXG5cdFx0XHRcdFx0XHRcdCdkYXRlX3N0YW1wJyxcblx0XHRcdFx0XHRcdFx0J3NldmVyaXR5Jyxcblx0XHRcdFx0XHRcdFx0J2V4Y2VwdGlvbl9wb2xpY3lfdHlwZScsXG5cdFx0XHRcdFx0XHRcdCdleGNlcHRpb25fcG9saWN5X3R5cGVfaWQnLFxuXHRcdFx0XHRcdFx0XHQnZXhjZXB0aW9uX2NvbG9yJyxcblx0XHRcdFx0XHRcdFx0J2V4Y2VwdGlvbl9iYWNrZ3JvdW5kX2NvbG9yJ1xuXHRcdFx0XHRcdFx0XTtcblx0XHRcdFx0XHRcdGRpc3BsYXlfY29sdW1ucyA9ICR0aGlzLmJ1aWxkRXhjZXB0aW9uRGlzcGxheUNvbHVtbnMoIGRpc3BsYXlfY29sdW1ucyApO1xuXHRcdFx0XHRcdFx0Ly9TZXQgRGF0YSBHcmlkIG9uIExpc3Qgdmlld1xuXHRcdFx0XHRcdFx0dmFyIGNvbHVtbl9pbmZvX2FycmF5ID0gW107XG5cdFx0XHRcdFx0XHR2YXIgbGVuID0gZGlzcGxheV9jb2x1bW5zLmxlbmd0aDtcblx0XHRcdFx0XHRcdHZhciBzdGFydF9mcm9tID0gMDtcblx0XHRcdFx0XHRcdGZvciAoIHZhciBpID0gc3RhcnRfZnJvbTsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdmlld19jb2x1bW5fZGF0YSA9IGRpc3BsYXlfY29sdW1uc1tpXTtcblx0XHRcdFx0XHRcdFx0dmFyIGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWU6IHZpZXdfY29sdW1uX2RhdGEudmFsdWUsXG5cdFx0XHRcdFx0XHRcdFx0aW5kZXg6IHZpZXdfY29sdW1uX2RhdGEudmFsdWUsXG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IHZpZXdfY29sdW1uX2RhdGEubGFiZWwsXG5cdFx0XHRcdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQkdGhpcy5idWlsZEV4Y2VwdGlvbkdyaWQoIGNvbHVtbl9pbmZvX2FycmF5ICk7XG5cblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdGlmICggIUdsb2JhbC5pc0FycmF5KCByZXN1bHRfZGF0YSApICYmIFRUVVVJRC5pc1VVSUQoICR0aGlzLnJlZnJlc2hfaWQgKSA9PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuc2hvd0V4Y2VwdGlvbkdyaWROb1Jlc3VsdENvdmVyKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5yZW1vdmVFeGNlcHRpb25HcmlkTm9SZXN1bHRDb3ZlcigpO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5leGNlcHRpb25fZ3JpZC5zZXREYXRhKCBHbG9iYWwuZm9ybWF0R3JpZERhdGEoIHJlc3VsdC5nZXRSZXN1bHQoKSApICk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCR0aGlzLnNldEV4Y2VwdGlvbkdyaWRTaXplKCk7XG5cblx0XHRcdFx0XHRcdCQoICcuZXhjZXB0aW9uLXRpdGxlJyApLnRleHQoICQuaTE4bi5fKCAnRXhjZXB0aW9ucycgKSApO1xuXHRcdFx0XHRcdFx0JCggJy5leGNlcHRpb24tdGl0bGUnICkuY3NzKCAnd2lkdGgnLCAoICR0aGlzLmV4Y2VwdGlvbl9ncmlkLmdyaWQud2lkdGgoKSAtIDEgKSArICdweCAhaW1wb3J0YW50JyApO1xuXHRcdFx0XHRcdFx0JHRoaXMuc2V0R3JpZENlbGxCYWNrR3JvdW5kKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0YnVpbGRFeGNlcHRpb25HcmlkKCBjb2x1bW5faW5mb19hcnJheSApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCB0eXBlb2YgY29sdW1uX2luZm9fYXJyYXkgPT0gJ3VuZGVmaW5lZCcgKSB7XG5cdFx0XHRjb2x1bW5faW5mb19hcnJheSA9IFtdO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5leGNlcHRpb25fZ3JpZCApIHtcblx0XHRcdHRoaXMuZXhjZXB0aW9uX2dyaWQuZ3JpZC5qcUdyaWQoICdHcmlkVW5sb2FkJyApO1xuXHRcdFx0dGhpcy5leGNlcHRpb25fZ3JpZCA9IG51bGw7XG5cdFx0fVxuXHRcdHRoaXMuZXhjZXB0aW9uX2dyaWQgPSBuZXcgVFRHcmlkKCAnZXhjZXB0aW9uX2dyaWQnLCB7XG5cdFx0XHRvblJlc2l6ZUdyaWQ6IGZhbHNlLFxuXHRcdFx0bXVsdGlzZWxlY3Q6IGZhbHNlLFxuXHRcdFx0d2luTXVsdGlTZWxlY3Q6IGZhbHNlLFxuXHRcdFx0Z3JpZENvbXBsZXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAkKCB0aGlzICkuanFHcmlkKCAnZ2V0R3JpZFBhcmFtJywgJ2RhdGEnICkubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHQkdGhpcy5leGNlcHRpb25fZ3JpZC5zZXRHcmlkQ29sdW1uc1dpZHRoKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRvbmRibENsaWNrUm93OiBmdW5jdGlvbiggcm93X2lkICkge1xuXHRcdFx0XHQkdGhpcy5vbkV4Y2VwdGlvbkdyaWREYmxDbGlja1Jvdyggcm93X2lkICk7XG5cdFx0XHR9LFxuXHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0aGVpZ2h0OiAxNjBcblx0XHR9LCBjb2x1bW5faW5mb19hcnJheSApO1xuXHR9XG5cblx0c2hvd0V4Y2VwdGlvbkdyaWROb1Jlc3VsdENvdmVyKCkge1xuXHRcdHRoaXMucmVtb3ZlRXhjZXB0aW9uR3JpZE5vUmVzdWx0Q292ZXIoKTtcblx0XHR0aGlzLmV4Y2VwdGlvbl9ncmlkX25vX3Jlc3VsdF9ib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggV2lkZ2V0TmFtZXNEaWMuTk9fUkVTVUxUX0JPWCApO1xuXHRcdHRoaXMuZXhjZXB0aW9uX2dyaWRfbm9fcmVzdWx0X2JveC5Ob1Jlc3VsdEJveCggeyByZWxhdGVkX3ZpZXdfY29udHJvbGxlcjogdGhpcywgaXNfbmV3OiBmYWxzZSB9ICk7XG5cdFx0dmFyIGdyaWRfZGl2ID0gJCggJy5leGNlcHRpb24tZ3JpZC1kaXYnICk7XG5cdFx0Z3JpZF9kaXYuY3NzKCAncG9zaXRpb24nLCAncmVsYXRpdmUnICk7XG5cdFx0dGhpcy5leGNlcHRpb25fZ3JpZF9ub19yZXN1bHRfYm94LmF0dHIoICdpZCcsICcjZXhjZXB0aW9uX2dyaWRfbm9fcmVzdWx0X2JveCcgKTtcblx0XHR0aGlzLmV4Y2VwdGlvbl9ncmlkX25vX3Jlc3VsdF9ib3guY3NzKCAnd2lkdGgnLCBwYXJzZUludCggZ3JpZF9kaXYud2lkdGgoKSApICsgJ3B4JyApO1xuXHRcdHRoaXMuZXhjZXB0aW9uX2dyaWRfbm9fcmVzdWx0X2JveC5jc3MoICdoZWlnaHQnLCBwYXJzZUludCggZ3JpZF9kaXYuaGVpZ2h0KCkgKSArICdweCcgKTtcblxuXHRcdGdyaWRfZGl2LmFwcGVuZCggdGhpcy5leGNlcHRpb25fZ3JpZF9ub19yZXN1bHRfYm94ICk7XG5cdH1cblxuXHRyZW1vdmVFeGNlcHRpb25HcmlkTm9SZXN1bHRDb3ZlcigpIHtcblx0XHRpZiAoIHRoaXMuZXhjZXB0aW9uX2dyaWRfbm9fcmVzdWx0X2JveCAmJiB0aGlzLmV4Y2VwdGlvbl9ncmlkX25vX3Jlc3VsdF9ib3gubGVuZ3RoID4gMCApIHtcblx0XHRcdHRoaXMuZXhjZXB0aW9uX2dyaWRfbm9fcmVzdWx0X2JveC5yZW1vdmUoKTtcblx0XHR9XG5cdFx0dGhpcy5leGNlcHRpb25fZ3JpZF9ub19yZXN1bHRfYm94ID0gbnVsbDtcblx0fVxuXG5cdHNldEVkaXRWaWV3VGFiU2l6ZSgpIHtcblx0XHRzdXBlci5zZXRFZGl0Vmlld1RhYlNpemUoKTtcblx0XHR0aGlzLnNldEV4Y2VwdGlvbkdyaWRTaXplKCk7XG5cdFx0dGhpcy5zZXRUaW1lU2hlZXRTdW1tYXJ5R3JpZFNpemUoKTtcblx0fVxuXG5cdHNldEdyaWRDZWxsQmFja0dyb3VuZCgpIHtcblx0XHR2YXIgZGF0YTtcblx0XHR2YXIgbGVuO1xuXHRcdHZhciBpO1xuXHRcdHZhciBpdGVtO1xuXHRcdGlmICggIXRoaXMuZXhjZXB0aW9uX2dyaWQgfHwgIXRoaXMuZWRpdF92aWV3ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRkYXRhID0gdGhpcy5leGNlcHRpb25fZ3JpZC5nZXRHcmlkUGFyYW0oICdkYXRhJyApO1xuXHRcdC8vRXJyb3I6IFR5cGVFcnJvcjogZGF0YSBpcyB1bmRlZmluZWQgaW4gL2ludGVyZmFjZS9odG1sNS9mcmFtZXdvcmsvanF1ZXJ5Lm1pbi5qcz92PTcuNC42LTIwMTQxMDI3LTA3NDEyNyBsaW5lIDIgPiBldmFsIGxpbmUgNzBcblx0XHRpZiAoICFkYXRhICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZW4gPSBkYXRhLmxlbmd0aDtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGl0ZW0gPSBkYXRhW2ldO1xuXHRcdFx0aWYgKCBpdGVtLmV4Y2VwdGlvbl9iYWNrZ3JvdW5kX2NvbG9yICkge1xuXHRcdFx0XHR2YXIgc2V2ZXJpdHkgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAndHJbaWQ9XFwnJyArIGl0ZW0uaWQgKyAnXFwnXScgKS5maW5kKCAndGRbYXJpYS1kZXNjcmliZWRieT1cImV4Y2VwdGlvbl9ncmlkX3NldmVyaXR5XCJdJyApO1xuXHRcdFx0XHRzZXZlcml0eS5jc3MoICdiYWNrZ3JvdW5kLWNvbG9yJywgaXRlbS5leGNlcHRpb25fYmFja2dyb3VuZF9jb2xvciApO1xuXHRcdFx0XHRzZXZlcml0eS5jc3MoICdmb250LXdlaWdodCcsICdib2xkJyApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBpdGVtLmV4Y2VwdGlvbl9jb2xvciApIHtcblx0XHRcdFx0dmFyIGNvZGUgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAndHJbaWQ9XFwnJyArIGl0ZW0uaWQgKyAnXFwnXScgKS5maW5kKCAndGRbYXJpYS1kZXNjcmliZWRieT1cImV4Y2VwdGlvbl9ncmlkX2V4Y2VwdGlvbl9wb2xpY3lfdHlwZV9pZFwiXScgKTtcblx0XHRcdFx0Y29kZS5jc3MoICdjb2xvcicsIGl0ZW0uZXhjZXB0aW9uX2NvbG9yICk7XG5cdFx0XHRcdGNvZGUuY3NzKCAnZm9udC13ZWlnaHQnLCAnYm9sZCcgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpbml0VGltZVNoZWV0U3VtbWFyeSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApID09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuYWNjdW11bGF0ZWRfdG90YWxfZ3JpZF9zb3VyY2VfbWFwID0ge307XG5cdFx0aWYgKCAhdGhpcy5hcGlfdGltZXNoZWV0ICkge1xuXHRcdFx0dGhpcy5hcGlfdGltZXNoZWV0ID0gVFRBUEkuQVBJVGltZVNoZWV0O1xuXHRcdH1cblxuXHRcdCR0aGlzLmJ1aWxkQWNjdW11bGF0ZWRUb3RhbEdyaWQoKTtcblx0XHR0aGlzLmFwaV90aW1lc2hlZXQuZ2V0VGltZVNoZWV0RGF0YSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfaWQsIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApID09IGZhbHNlICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLmZ1bGxfdGltZXNoZWV0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdCR0aGlzLnBheV9wZXJpb2RfZGF0YSA9ICR0aGlzLmZ1bGxfdGltZXNoZWV0X2RhdGEucGF5X3BlcmlvZF9kYXRhO1xuXHRcdFx0XHQkdGhpcy50aW1lc2hlZXRfdmVyaWZ5X2RhdGEgPSAkdGhpcy5mdWxsX3RpbWVzaGVldF9kYXRhLnRpbWVzaGVldF92ZXJpZnlfZGF0YTtcblx0XHRcdFx0JHRoaXMuc3RhcnRfZGF0ZSA9IEdsb2JhbC5zdHJUb0RhdGUoICR0aGlzLmZ1bGxfdGltZXNoZWV0X2RhdGEudGltZXNoZWV0X2RhdGVzLnN0YXJ0X2Rpc3BsYXlfZGF0ZSApO1xuXHRcdFx0XHQkdGhpcy5lbmRfZGF0ZSA9IEdsb2JhbC5zdHJUb0RhdGUoICR0aGlzLmZ1bGxfdGltZXNoZWV0X2RhdGEudGltZXNoZWV0X2RhdGVzLmVuZF9kaXNwbGF5X2RhdGUgKTtcblx0XHRcdFx0dmFyIGNvbHVtbnMgPSBbXTtcblx0XHRcdFx0dmFyIHB1bmNoX2luX291dF9jb2x1bW4gPSB7XG5cdFx0XHRcdFx0bmFtZTogJ3B1bmNoX2luZm8nLFxuXHRcdFx0XHRcdGluZGV4OiAncHVuY2hfaW5mbycsXG5cdFx0XHRcdFx0bGFiZWw6ICcgJyxcblx0XHRcdFx0XHR3aWR0aDogMjAwLFxuXHRcdFx0XHRcdGZpeGVkOiB0cnVlLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0XHR0aXRsZTogZmFsc2UsXG5cdFx0XHRcdFx0Zm9ybWF0dGVyOiAkdGhpcy5vbkNlbGxGb3JtYXRcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29sdW1ucy5wdXNoKCBwdW5jaF9pbl9vdXRfY29sdW1uICk7XG5cdFx0XHRcdHZhciBzdGFydF9kYXRlX3N0ciA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfZGF0ZTtcblx0XHRcdFx0dmFyIGVuZF9kYXRlX3N0ciA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZW5kX2RhdGU7XG5cdFx0XHRcdCR0aGlzLmdldEFjY3VtdWxhdGVkVG90YWxHcmlkUGF5cGVyaW9kSGVhZGVyKCk7XG5cdFx0XHRcdHZhciBjb2x1bW5fMSA9IHtcblx0XHRcdFx0XHRuYW1lOiAnd2VlaycsXG5cdFx0XHRcdFx0aW5kZXg6ICd3ZWVrJyxcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdXZWVrJyApICsgJzxicj4nICsgc3RhcnRfZGF0ZV9zdHIgKyAnIHRvICcgKyBlbmRfZGF0ZV9zdHIsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcm1hdHRlcjogJHRoaXMub25DZWxsRm9ybWF0XG5cdFx0XHRcdH07XG5cdFx0XHRcdHZhciBjb2x1bW5fMiA9IHtcblx0XHRcdFx0XHRuYW1lOiAncGF5X3BlcmlvZCcsXG5cdFx0XHRcdFx0aW5kZXg6ICdwYXlfcGVyaW9kJyxcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdQYXkgUGVyaW9kJyApICsgJzxicj4nICsgJHRoaXMucGF5X3BlcmlvZF9oZWFkZXIsXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcm1hdHRlcjogJHRoaXMub25DZWxsRm9ybWF0XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbHVtbnMucHVzaCggY29sdW1uXzIgKTtcblx0XHRcdFx0JHRoaXMuYnVpbGRBY2N1bXVsYXRlZFRvdGFsR3JpZCggY29sdW1ucyApO1xuXHRcdFx0XHQkdGhpcy5idWlsZEFjY3VtdWxhdGVkVG90YWxEYXRhKCk7XG5cdFx0XHRcdCR0aGlzLnNldFRpbWVTaGVldFN1bW1hcnlHcmlkU2l6ZSgpO1xuXHRcdFx0XHQkKCAnLmJ1dHRvbi1yb3RhdGUnICkucmVtb3ZlQ2xhc3MoICdidXR0b24tcm90YXRlJyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGJ1aWxkQWNjbXVsYXRlZE9yZGVyTWFwKCB0b3RhbCApIHtcblx0XHRpZiAoICF0b3RhbCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yICggdmFyIGtleSBpbiB0b3RhbCApIHtcblx0XHRcdGZvciAoIHZhciBrZXkxIGluIHRvdGFsW2tleV0gKSB7XG5cdFx0XHRcdHRoaXMuYWNjbXVsYXRlZF9vcmRlcl9tYXBba2V5MV0gPSB0b3RhbFtrZXldW2tleTFdLm9yZGVyO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vVGhpcyBmdW5jdGlvbiBpcyBjb3BpZWQgZnJvbSBUaW1lU2hlZXRWaWV3Q29udHJvbGxlci5qc1xuXHRidWlsZFN1YkdyaWRzRGF0YSggYXJyYXksIGRhdGVfc3RyaW5nLCBtYXAsIHJlc3VsdF9hcnJheSwgcGFyZW50X2tleSApIHtcblx0XHR2YXIgcm93O1xuXHRcdHZhciBtYXJrZWRfcmVndWxhcl9yb3cgPSBmYWxzZTsgLy9Pbmx5IG1hcmsgdGhlIGZpcnN0IHJlZ3VsYXIgdGltZSByb3csIGFzIHRoYXRzIHdoZXJlIHRoZSBib2xkIHRvcC1saW5lIGlzIGdvaW5nIHRvIGdvLlxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXJyYXkgKSB7XG5cdFx0XHRpZiAoICFtYXBba2V5XSApIHtcblx0XHRcdFx0cm93ID0ge307XG5cdFx0XHRcdHJvdy5wYXJlbnRfa2V5ID0gcGFyZW50X2tleTtcblx0XHRcdFx0cm93LmtleSA9IGtleTtcblxuXHRcdFx0XHRpZiAoIHBhcmVudF9rZXkgPT09ICdhY2N1bXVsYXRlZF90aW1lJyApIHtcblx0XHRcdFx0XHRpZiAoIGtleSA9PT0gJ3RvdGFsJyB8fCBrZXkgPT09ICd3b3JrZWRfdGltZScgKSB7XG5cdFx0XHRcdFx0XHRyb3cudHlwZSA9IFRpbWVTaGVldEF1dGhvcml6YXRpb25WaWV3Q29udHJvbGxlci5UT1RBTF9ST1c7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggbWFya2VkX3JlZ3VsYXJfcm93ID09IGZhbHNlICYmIGtleS5pbmRleE9mKCAncmVndWxhcl90aW1lJyApID09PSAwICkge1xuXHRcdFx0XHRcdFx0cm93LnR5cGUgPSBUaW1lU2hlZXRBdXRob3JpemF0aW9uVmlld0NvbnRyb2xsZXIuUkVHVUxBUl9ST1c7XG5cdFx0XHRcdFx0XHRtYXJrZWRfcmVndWxhcl9yb3cgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyb3cudHlwZSA9IFRpbWVTaGVldEF1dGhvcml6YXRpb25WaWV3Q29udHJvbGxlci5BQ0NVTVVMQVRFRF9USU1FX1JPVztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGFycmF5W2tleV0ub3ZlcnJpZGUgKSB7XG5cdFx0XHRcdFx0XHRyb3cuaXNfb3ZlcnJpZGVfcm93ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoIHBhcmVudF9rZXkgPT09ICdwcmVtaXVtX3RpbWUnICkge1xuXHRcdFx0XHRcdHJvdy50eXBlID0gVGltZVNoZWV0QXV0aG9yaXphdGlvblZpZXdDb250cm9sbGVyLlBSRU1JVU1fUk9XO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0aGlzLmFjY211bGF0ZWRfb3JkZXJfbWFwW2tleV0gKSB7XG5cdFx0XHRcdFx0cm93Lm9yZGVyID0gdGhpcy5hY2NtdWxhdGVkX29yZGVyX21hcFtrZXldO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cm93LnB1bmNoX2luZm8gPSBhcnJheVtrZXldLmxhYmVsO1xuXG5cdFx0XHRcdHZhciBrZXlfYXJyYXkgPSBrZXkuc3BsaXQoICdfJyApO1xuXHRcdFx0XHR2YXIgbm9faWQgPSBmYWxzZTtcblx0XHRcdFx0aWYgKCBrZXlfYXJyYXkubGVuZ3RoID4gMSAmJiBrZXlfYXJyYXlbMV0gPT0gJzAnICkge1xuXHRcdFx0XHRcdG5vX2lkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFycmF5W2tleV0ua2V5ID0ga2V5O1xuXHRcdFx0XHRyb3dbZGF0ZV9zdHJpbmddID0gR2xvYmFsLmdldFRpbWVVbml0KCBhcnJheVtrZXldLnRvdGFsX3RpbWUgKTtcblx0XHRcdFx0cm93W2RhdGVfc3RyaW5nICsgJ19kYXRhJ10gPSBhcnJheVtrZXldO1xuXG5cdFx0XHRcdC8vaWYgaWQgPT0gMCwgcHV0IHRoZSByb3cgYXMgZmlyc3Qgcm93LlxuXHRcdFx0XHRpZiAoIG5vX2lkICkge1xuXHRcdFx0XHRcdHJlc3VsdF9hcnJheS51bnNoaWZ0KCByb3cgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXN1bHRfYXJyYXkucHVzaCggcm93ICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bWFwW2tleV0gPSByb3c7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyb3cgPSBtYXBba2V5XTtcblx0XHRcdFx0aWYgKCByb3dbZGF0ZV9zdHJpbmddICYmIGtleSA9PT0gJ3RvdGFsJyApIHsgLy9PdmVycmlkZSB0b3RhbCBjZWxsIGRhdGEgc2luY2Ugd2Ugc2V0IGFsbCB0byAwMDowMCBhdCBiZWdpbm5pbmdcblx0XHRcdFx0XHRhcnJheVtrZXldLmtleSA9IGtleTtcblx0XHRcdFx0XHRyb3dbZGF0ZV9zdHJpbmddID0gR2xvYmFsLmdldFRpbWVVbml0KCBhcnJheVtrZXldLnRvdGFsX3RpbWUgKTtcblx0XHRcdFx0XHRyb3dbZGF0ZV9zdHJpbmcgKyAnX2RhdGEnXSA9IGFycmF5W2tleV07XG5cdFx0XHRcdFx0aWYgKCByb3cucGFyZW50X2tleSA9PT0gJ2FjY3VtdWxhdGVkX3RpbWUnICkge1xuXHRcdFx0XHRcdFx0aWYgKCBhcnJheVtrZXldLm92ZXJyaWRlICkge1xuXHRcdFx0XHRcdFx0XHRyb3cuaXNfb3ZlcnJpZGVfcm93ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXJyYXlba2V5XS5rZXkgPSBrZXk7XG5cdFx0XHRcdFx0cm93W2RhdGVfc3RyaW5nXSA9IEdsb2JhbC5nZXRUaW1lVW5pdCggYXJyYXlba2V5XS50b3RhbF90aW1lICk7XG5cdFx0XHRcdFx0cm93W2RhdGVfc3RyaW5nICsgJ19kYXRhJ10gPSBhcnJheVtrZXldO1xuXG5cdFx0XHRcdFx0aWYgKCByb3cucGFyZW50X2tleSA9PT0gJ2FjY3VtdWxhdGVkX3RpbWUnICkge1xuXHRcdFx0XHRcdFx0aWYgKCBhcnJheVtrZXldLm92ZXJyaWRlICkge1xuXHRcdFx0XHRcdFx0XHRyb3cuaXNfb3ZlcnJpZGVfcm93ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRidWlsZEFjY3VtdWxhdGVkVG90YWxEYXRhKCkge1xuXHRcdHRoaXMuYWNjbXVsYXRlZF9vcmRlcl9tYXAgPSB7fTtcblx0XHR0aGlzLmFjY3VtdWxhdGVkX3RvdGFsX2dyaWRfc291cmNlID0gW107XG5cdFx0dmFyIGFjY3VtdWxhdGVkX3VzZXJfZGF0ZV90b3RhbF9kYXRhID0gdGhpcy5mdWxsX3RpbWVzaGVldF9kYXRhLmFjY3VtdWxhdGVkX3VzZXJfZGF0ZV90b3RhbF9kYXRhO1xuXHRcdHZhciBwYXlfcGVyaW9kX2FjY3VtdWxhdGVkX3VzZXJfZGF0ZV90b3RhbF9kYXRhID0gdGhpcy5mdWxsX3RpbWVzaGVldF9kYXRhLnBheV9wZXJpb2RfYWNjdW11bGF0ZWRfdXNlcl9kYXRlX3RvdGFsX2RhdGE7XG5cdFx0dmFyIGFjY3VtdWxhdGVkX3RpbWUgPSBwYXlfcGVyaW9kX2FjY3VtdWxhdGVkX3VzZXJfZGF0ZV90b3RhbF9kYXRhLmFjY3VtdWxhdGVkX3RpbWU7XG5cdFx0dmFyIHByZW1pdW1fdGltZSA9IHBheV9wZXJpb2RfYWNjdW11bGF0ZWRfdXNlcl9kYXRlX3RvdGFsX2RhdGEucHJlbWl1bV90aW1lO1xuXHRcdHZhciBhYnNlbmNlX3RpbWUgPSBwYXlfcGVyaW9kX2FjY3VtdWxhdGVkX3VzZXJfZGF0ZV90b3RhbF9kYXRhLmFic2VuY2VfdGltZV90YWtlbjtcblx0XHQvLyBTYXZlIHRoZSBvcmRlciwgd2lsbCBkbyBzb3J0IGFmdGVyIGFsbCBkYXRhIHByZXBhcmVkLlxuXHRcdGlmICggYWNjdW11bGF0ZWRfdXNlcl9kYXRlX3RvdGFsX2RhdGEudG90YWwgKSB7XG5cdFx0XHR0aGlzLmJ1aWxkQWNjbXVsYXRlZE9yZGVyTWFwKCBhY2N1bXVsYXRlZF91c2VyX2RhdGVfdG90YWxfZGF0YS50b3RhbCApO1xuXHRcdH1cblx0XHRpZiAoIHBheV9wZXJpb2RfYWNjdW11bGF0ZWRfdXNlcl9kYXRlX3RvdGFsX2RhdGEgKSB7XG5cdFx0XHR0aGlzLmJ1aWxkQWNjbXVsYXRlZE9yZGVyTWFwKCBwYXlfcGVyaW9kX2FjY3VtdWxhdGVkX3VzZXJfZGF0ZV90b3RhbF9kYXRhICk7XG5cdFx0fVxuXHRcdGlmICggR2xvYmFsLmlzU2V0KCBhY2N1bXVsYXRlZF90aW1lICkgKSB7XG5cdFx0XHR0aGlzLmJ1aWxkU3ViR3JpZHNEYXRhKCBhY2N1bXVsYXRlZF90aW1lLCAncGF5X3BlcmlvZCcsIHRoaXMuYWNjdW11bGF0ZWRfdG90YWxfZ3JpZF9zb3VyY2VfbWFwLCB0aGlzLmFjY3VtdWxhdGVkX3RvdGFsX2dyaWRfc291cmNlLCAnYWNjdW11bGF0ZWRfdGltZScgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YWNjdW11bGF0ZWRfdGltZSA9IHsgdG90YWw6IHsgbGFiZWw6ICdUb3RhbCBUaW1lJywgdG90YWxfdGltZTogJzAnIH0gfTtcblx0XHRcdHRoaXMuYnVpbGRTdWJHcmlkc0RhdGEoIGFjY3VtdWxhdGVkX3RpbWUsICdwYXlfcGVyaW9kJywgdGhpcy5hY2N1bXVsYXRlZF90b3RhbF9ncmlkX3NvdXJjZV9tYXAsIHRoaXMuYWNjdW11bGF0ZWRfdG90YWxfZ3JpZF9zb3VyY2UsICdhY2N1bXVsYXRlZF90aW1lJyApO1xuXHRcdH1cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggcHJlbWl1bV90aW1lICkgKSB7XG5cdFx0XHR0aGlzLmJ1aWxkU3ViR3JpZHNEYXRhKCBwcmVtaXVtX3RpbWUsICdwYXlfcGVyaW9kJywgdGhpcy5hY2N1bXVsYXRlZF90b3RhbF9ncmlkX3NvdXJjZV9tYXAsIHRoaXMuYWNjdW11bGF0ZWRfdG90YWxfZ3JpZF9zb3VyY2UsICdwcmVtaXVtX3RpbWUnICk7XG5cdFx0fVxuXHRcdGlmICggR2xvYmFsLmlzU2V0KCBhYnNlbmNlX3RpbWUgKSApIHtcblx0XHRcdHRoaXMuYnVpbGRTdWJHcmlkc0RhdGEoIGFic2VuY2VfdGltZSwgJ3BheV9wZXJpb2QnLCB0aGlzLmFjY3VtdWxhdGVkX3RvdGFsX2dyaWRfc291cmNlX21hcCwgdGhpcy5hY2N1bXVsYXRlZF90b3RhbF9ncmlkX3NvdXJjZSwgJ2Fic2VuY2VfdGltZScgKTtcblx0XHR9XG5cdFx0YWNjdW11bGF0ZWRfdGltZSA9IHsgdG90YWw6IHsgbGFiZWw6ICdUb3RhbCBUaW1lJywgdG90YWxfdGltZTogJzAnIH0gfTtcblx0XHR0aGlzLmJ1aWxkU3ViR3JpZHNEYXRhKCBhY2N1bXVsYXRlZF90aW1lLCAnd2VlaycsIHRoaXMuYWNjdW11bGF0ZWRfdG90YWxfZ3JpZF9zb3VyY2VfbWFwLCB0aGlzLmFjY3VtdWxhdGVkX3RvdGFsX2dyaWRfc291cmNlLCAnYWNjdW11bGF0ZWRfdGltZScgKTtcblx0XHRmb3IgKCB2YXIga2V5IGluIGFjY3VtdWxhdGVkX3VzZXJfZGF0ZV90b3RhbF9kYXRhICkge1xuXHRcdFx0Ly9CdWlsZCBBY2N1bXVsYXRlZCBUb3RhbCBHcmlkIHdlZWsgY29sdW1uIGRhdGFcblx0XHRcdGlmICgga2V5ID09PSAndG90YWwnICkge1xuXHRcdFx0XHR2YXIgdG90YWxfcmVzdWx0ID0gYWNjdW11bGF0ZWRfdXNlcl9kYXRlX3RvdGFsX2RhdGEudG90YWw7XG5cdFx0XHRcdGFjY3VtdWxhdGVkX3RpbWUgPSB0b3RhbF9yZXN1bHQuYWNjdW11bGF0ZWRfdGltZTtcblx0XHRcdFx0cHJlbWl1bV90aW1lID0gdG90YWxfcmVzdWx0LnByZW1pdW1fdGltZTtcblx0XHRcdFx0YWJzZW5jZV90aW1lID0gdG90YWxfcmVzdWx0LmFic2VuY2VfdGltZV90YWtlbjtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGFjY3VtdWxhdGVkX3RpbWUgKSApIHtcblx0XHRcdFx0XHR0aGlzLmJ1aWxkU3ViR3JpZHNEYXRhKCBhY2N1bXVsYXRlZF90aW1lLCAnd2VlaycsIHRoaXMuYWNjdW11bGF0ZWRfdG90YWxfZ3JpZF9zb3VyY2VfbWFwLCB0aGlzLmFjY3VtdWxhdGVkX3RvdGFsX2dyaWRfc291cmNlLCAnYWNjdW11bGF0ZWRfdGltZScgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggcHJlbWl1bV90aW1lICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5idWlsZFN1YkdyaWRzRGF0YSggcHJlbWl1bV90aW1lLCAnd2VlaycsIHRoaXMuYWNjdW11bGF0ZWRfdG90YWxfZ3JpZF9zb3VyY2VfbWFwLCB0aGlzLmFjY3VtdWxhdGVkX3RvdGFsX2dyaWRfc291cmNlLCAncHJlbWl1bV90aW1lJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBhYnNlbmNlX3RpbWUgKSApIHtcblx0XHRcdFx0XHR0aGlzLmJ1aWxkU3ViR3JpZHNEYXRhKCBhYnNlbmNlX3RpbWUsICd3ZWVrJywgdGhpcy5hY2N1bXVsYXRlZF90b3RhbF9ncmlkX3NvdXJjZV9tYXAsIHRoaXMuYWNjdW11bGF0ZWRfdG90YWxfZ3JpZF9zb3VyY2UsICdhYnNlbmNlX3RpbWUnICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuc29ydEFjY3VtdWxhdGVkVG90YWxEYXRhKCk7XG5cdFx0dGhpcy50aW1lc2hlZXRfYXV0aG9yaXphdGlvbl9zdW1tYXJ5X2dyaWQuc2V0RGF0YSggdGhpcy5hY2N1bXVsYXRlZF90b3RhbF9ncmlkX3NvdXJjZSApO1xuXG5cdFx0JCggJy50aW1lc2hlZXQtYXV0aG9yaXphdGlvbi1zdW1tYXJ5LXRpdGxlJyApLnRleHQoICQuaTE4bi5fKCAnVGltZVNoZWV0IFN1bW1hcnknICkgKTtcblx0fVxuXG5cdHNvcnRBY2N1bXVsYXRlZFRvdGFsRGF0YSgpIHtcblx0XHR2YXIgc29ydF9maWVsZHMgPSBbJ29yZGVyJywgJ3B1bmNoX2luZm8nXTtcblx0XHR0aGlzLmFjY3VtdWxhdGVkX3RvdGFsX2dyaWRfc291cmNlLnNvcnQoIEdsb2JhbC5tX3NvcnRfYnkoIHNvcnRfZmllbGRzICkgKTtcblx0fVxuXG5cdGdldEFjY3VtdWxhdGVkVG90YWxHcmlkUGF5cGVyaW9kSGVhZGVyKCkge1xuXHRcdHRoaXMucGF5X3BlcmlvZF9oZWFkZXIgPSAkLmkxOG4uXyggJ05vIFBheSBQZXJpb2QnICk7XG5cdFx0dmFyIHBheV9wZXJpb2RfaWQgPSB0aGlzLnRpbWVzaGVldF92ZXJpZnlfZGF0YS5wYXlfcGVyaW9kX2lkO1xuXHRcdGlmICggcGF5X3BlcmlvZF9pZCAmJiB0aGlzLnBheV9wZXJpb2RfZGF0YSApIHtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5wYXlfcGVyaW9kX2RhdGEgKSB7XG5cdFx0XHRcdHZhciBwYXlfcGVyaW9kID0gdGhpcy5wYXlfcGVyaW9kX2RhdGFba2V5XTtcblx0XHRcdFx0aWYgKCBwYXlfcGVyaW9kLmlkID09PSBwYXlfcGVyaW9kX2lkICkge1xuXHRcdFx0XHRcdHZhciBzdGFydF9kYXRlID0gR2xvYmFsLnN0clRvRGF0ZSggcGF5X3BlcmlvZC5zdGFydF9kYXRlICkuZm9ybWF0KCk7XG5cdFx0XHRcdFx0dmFyIGVuZF9kYXRlID0gR2xvYmFsLnN0clRvRGF0ZSggcGF5X3BlcmlvZC5lbmRfZGF0ZSApLmZvcm1hdCgpO1xuXHRcdFx0XHRcdHRoaXMucGF5X3BlcmlvZF9oZWFkZXIgPSBzdGFydF9kYXRlICsgJyB0byAnICsgZW5kX2RhdGU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRidWlsZEFjY3VtdWxhdGVkVG90YWxHcmlkKCBjb2x1bW5zICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGdyaWQ7XG5cdFx0aWYgKCB0eXBlb2YgY29sdW1ucyA9PSAndW5kZWZpbmVkJyApIHtcblx0XHRcdGNvbHVtbnMgPSBbXTtcblx0XHR9XG5cdFx0aWYgKCB0aGlzLnRpbWVzaGVldF9hdXRob3JpemF0aW9uX3N1bW1hcnlfZ3JpZCApIHtcblx0XHRcdHRoaXMudGltZXNoZWV0X2F1dGhvcml6YXRpb25fc3VtbWFyeV9ncmlkLmdyaWQuanFHcmlkKCAnR3JpZFVubG9hZCcgKTtcblx0XHRcdHRoaXMudGltZXNoZWV0X2F1dGhvcml6YXRpb25fc3VtbWFyeV9ncmlkID0gbnVsbDtcblx0XHR9XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLnRpbWVzaGVldF9hdXRob3JpemF0aW9uX3N1bW1hcnlfZ3JpZCA9IG5ldyBUVEdyaWQoICd0aW1lc2hlZXRfYXV0aG9yaXphdGlvbl9zdW1tYXJ5X2dyaWQnLCB7XG5cdFx0XHRtdWx0aXNlbGVjdDogZmFsc2UsXG5cdFx0XHR3aW5NdWx0aVNlbGVjdDogZmFsc2UsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRvblJlc2l6ZUdyaWQ6IGZhbHNlLFxuXHRcdFx0Z3JpZENvbXBsZXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0JHRoaXMuc2V0VGltZVNoZWV0U3VtbWFyeUdyaWRTaXplKCk7XG5cdFx0XHR9LFxuXHRcdFx0b25kYmxDbGlja1JvdzogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLm9uVGltZVNoZWV0R3JpZERibENsaWNrUm93KCk7XG5cdFx0XHR9XG5cdFx0fSwgY29sdW1ucyApO1xuXHRcdHRoaXMuc2V0VGltZVNoZWV0U3VtbWFyeUdyaWRTaXplKCk7XG5cdH1cblxuXHRvblRpbWVTaGVldEdyaWREYmxDbGlja1JvdygpIHtcblx0XHR2YXIgZmlsdGVyID0geyBmaWx0ZXJfZGF0YToge30gfTtcblx0XHRmaWx0ZXIudXNlcl9pZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC51c2VyX2lkO1xuXHRcdGZpbHRlci5iYXNlX2RhdGUgPSBHbG9iYWwuc3RyVG9EYXRlVGltZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnN0YXJ0X2RhdGUgKS5mb3JtYXQoKTtcblx0XHRHbG9iYWwuYWRkVmlld1RhYiggdGhpcy52aWV3SWQsICQuaTE4bi5fKCAnVGltZVNoZWV0IChBdXRob3JpemF0aW9ucyknICksIHdpbmRvdy5sb2NhdGlvbi5ocmVmICk7XG5cdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ1RpbWVTaGVldCcsIGZpbHRlciApO1xuXHR9XG5cblx0b25FeGNlcHRpb25HcmlkRGJsQ2xpY2tSb3coIHJvd19pZCApIHtcblx0XHR2YXIgZGF0ZV9zdGFtcCA9IHRoaXMuZXhjZXB0aW9uX2dyaWQuZ3JpZC5qcUdyaWQoICdnZXRDZWxsJywgcm93X2lkLCAnZGF0ZV9zdGFtcCcgKTtcblxuXHRcdGlmICggIWRhdGVfc3RhbXAgKSB7XG5cdFx0XHRkYXRlX3N0YW1wID0gR2xvYmFsLnN0clRvRGF0ZVRpbWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlICkuZm9ybWF0KCk7XG5cdFx0fVxuXG5cdFx0dmFyIGZpbHRlciA9IHsgZmlsdGVyX2RhdGE6IHt9IH07XG5cdFx0ZmlsdGVyLnVzZXJfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZDtcblx0XHRmaWx0ZXIuYmFzZV9kYXRlID0gZGF0ZV9zdGFtcDtcblx0XHRHbG9iYWwuYWRkVmlld1RhYiggdGhpcy52aWV3SWQsICQuaTE4bi5fKCAnVGltZVNoZWV0IChBdXRob3JpemF0aW9ucyknICksIHdpbmRvdy5sb2NhdGlvbi5ocmVmICk7XG5cdFx0SW5kZXhWaWV3Q29udHJvbGxlci5nb1RvVmlldyggJ1RpbWVTaGVldCcsIGZpbHRlciApO1xuXHR9XG5cblx0b25DZWxsRm9ybWF0KCBjZWxsX3ZhbHVlLCByZWxhdGVkX2RhdGEsIHJvdyApIHtcblx0XHRjZWxsX3ZhbHVlID0gR2xvYmFsLmRlY29kZUNlbGxWYWx1ZSggY2VsbF92YWx1ZSApO1xuXHRcdHZhciBjb2xfbW9kZWwgPSByZWxhdGVkX2RhdGEuY29sTW9kZWw7XG5cdFx0dmFyIHJvd19pZCA9IHJlbGF0ZWRfZGF0YS5yb3dpZDtcblx0XHR2YXIgY29udGVudF9kaXYgPSAkKCAnPGRpdiBjbGFzcz1cXCdwdW5jaC1jb250ZW50LWRpdlxcJz48L2Rpdj4nICk7XG5cdFx0dmFyIHB1bmNoX2luZm87XG5cdFx0aWYgKCByZWxhdGVkX2RhdGEucG9zID09PSAwICkge1xuXHRcdFx0aWYgKCByb3cudHlwZSA9PT0gVGltZVNoZWV0QXV0aG9yaXphdGlvblZpZXdDb250cm9sbGVyLlRPVEFMX1JPVyApIHtcblx0XHRcdFx0cHVuY2hfaW5mbyA9ICQoICc8c3BhbiBjbGFzcz1cXCd0b3RhbFxcJyBzdHlsZT1cXCdmb250LXNpemU6IDExcHhcXCc+PC9zcGFuPicgKTtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGNlbGxfdmFsdWUgKSApIHtcblx0XHRcdFx0XHRwdW5jaF9pbmZvLnRleHQoIGNlbGxfdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwdW5jaF9pbmZvLnRleHQoICcnICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHB1bmNoX2luZm8uZ2V0KCAwICkub3V0ZXJIVE1MO1xuXHRcdFx0fSBlbHNlIGlmICggcm93LnR5cGUgPT09IFRpbWVTaGVldEF1dGhvcml6YXRpb25WaWV3Q29udHJvbGxlci5SRUdVTEFSX1JPVyApIHtcblx0XHRcdFx0cHVuY2hfaW5mbyA9ICQoICc8c3BhbiBjbGFzcz1cXCd0b3AtbGluZS1zcGFuXFwnIHN0eWxlPVxcJ2ZvbnQtc2l6ZTogMTFweFxcJz48L3NwYW4+JyApO1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggY2VsbF92YWx1ZSApICkge1xuXHRcdFx0XHRcdHB1bmNoX2luZm8udGV4dCggY2VsbF92YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHB1bmNoX2luZm8udGV4dCggJycgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcHVuY2hfaW5mby5nZXQoIDAgKS5vdXRlckhUTUw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY2VsbF92YWx1ZTtcblx0XHR9XG5cdFx0dmFyIGV4X3NwYW47XG5cdFx0dmFyIGk7XG5cdFx0dmFyIHRpbWVfc3Bhbjtcblx0XHR2YXIgcHVuY2g7XG5cdFx0dmFyIGJyZWFrX3NwYW47XG5cdFx0dmFyIHJlbGF0ZWRfcHVuY2g7XG5cdFx0dmFyIGV4Y2VwdGlvbjtcblx0XHR2YXIgbGVuO1xuXHRcdHZhciB0ZXh0O1xuXHRcdHZhciBleDtcblx0XHR2YXIgZGF0YTtcblx0XHRpZiAoIHJvdy50eXBlID09PSBUaW1lU2hlZXRBdXRob3JpemF0aW9uVmlld0NvbnRyb2xsZXIuVE9UQUxfUk9XICkge1xuXHRcdFx0ZGF0YSA9IHJvd1tjb2xfbW9kZWwubmFtZSArICdfZGF0YSddO1xuXHRcdFx0dGltZV9zcGFuID0gJCggJzxzcGFuIGNsYXNzPVxcJ3RvdGFsXFwnPjwvc3Bhbj4nICk7XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggY2VsbF92YWx1ZSApICkge1xuXHRcdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmhhc093blByb3BlcnR5KCAnb3ZlcnJpZGUnICkgJiYgZGF0YS5vdmVycmlkZSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdHRpbWVfc3Bhbi5hZGRDbGFzcyggJ2Fic2VuY2Utb3ZlcnJpZGUnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggZGF0YS5oYXNPd25Qcm9wZXJ0eSggJ25vdGUnICkgJiYgZGF0YS5ub3RlICkge1xuXHRcdFx0XHRcdFx0Y2VsbF92YWx1ZSA9ICcqJyArIGNlbGxfdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRpbWVfc3Bhbi50ZXh0KCBjZWxsX3ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRpbWVfc3Bhbi50ZXh0KCAnJyApO1xuXHRcdFx0fVxuXHRcdFx0Y29udGVudF9kaXYucHJlcGVuZCggdGltZV9zcGFuICk7XG5cdFx0fSBlbHNlIGlmICggcm93LnR5cGUgPT09IFRpbWVTaGVldEF1dGhvcml6YXRpb25WaWV3Q29udHJvbGxlci5SRUdVTEFSX1JPVyApIHtcblx0XHRcdGNvbnRlbnRfZGl2LmFkZENsYXNzKCAndG9wLWxpbmUnICk7XG5cdFx0XHRkYXRhID0gcm93W2NvbF9tb2RlbC5uYW1lICsgJ19kYXRhJ107XG5cdFx0XHR0aW1lX3NwYW4gPSAkKCAnPHNwYW4gPjwvc3Bhbj4nICk7XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggY2VsbF92YWx1ZSApICkge1xuXHRcdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmhhc093blByb3BlcnR5KCAnb3ZlcnJpZGUnICkgJiYgZGF0YS5vdmVycmlkZSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdHRpbWVfc3Bhbi5hZGRDbGFzcyggJ2Fic2VuY2Utb3ZlcnJpZGUnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggZGF0YS5oYXNPd25Qcm9wZXJ0eSggJ25vdGUnICkgJiYgZGF0YS5ub3RlICkge1xuXHRcdFx0XHRcdFx0Y2VsbF92YWx1ZSA9ICcqJyArIGNlbGxfdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRpbWVfc3Bhbi50ZXh0KCBjZWxsX3ZhbHVlICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aW1lX3NwYW4udGV4dCggJycgKTtcblx0XHRcdH1cblx0XHRcdGNvbnRlbnRfZGl2LnByZXBlbmQoIHRpbWVfc3BhbiApO1xuXHRcdH0gZWxzZSBpZiAoIHJvdy50eXBlID09PSBUaW1lU2hlZXRBdXRob3JpemF0aW9uVmlld0NvbnRyb2xsZXIuQUNDVU1VTEFURURfVElNRV9ST1cgKSB7XG5cdFx0XHRkYXRhID0gcm93W2NvbF9tb2RlbC5uYW1lICsgJ19kYXRhJ107XG5cdFx0XHR0aW1lX3NwYW4gPSAkKCAnPHNwYW4+PC9zcGFuPicgKTtcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBjZWxsX3ZhbHVlICkgKSB7XG5cdFx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuaGFzT3duUHJvcGVydHkoICdvdmVycmlkZScgKSAmJiBkYXRhLm92ZXJyaWRlID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0dGltZV9zcGFuLmFkZENsYXNzKCAnYWJzZW5jZS1vdmVycmlkZScgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmhhc093blByb3BlcnR5KCAnbm90ZScgKSAmJiBkYXRhLm5vdGUgKSB7XG5cdFx0XHRcdFx0XHRjZWxsX3ZhbHVlID0gJyonICsgY2VsbF92YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGltZV9zcGFuLnRleHQoIGNlbGxfdmFsdWUgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRpbWVfc3Bhbi50ZXh0KCAnJyApO1xuXHRcdFx0fVxuXHRcdFx0Y29udGVudF9kaXYucHJlcGVuZCggdGltZV9zcGFuICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRpbWVfc3BhbiA9ICQoICc8c3BhbiBjbGFzcz1cXCdwdW5jaC10aW1lXFwnPjwvc3Bhbj4nICk7XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggY2VsbF92YWx1ZSApICkge1xuXHRcdFx0XHR0aW1lX3NwYW4udGV4dCggY2VsbF92YWx1ZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGltZV9zcGFuLnRleHQoICcnICk7XG5cdFx0XHR9XG5cdFx0XHRjb250ZW50X2Rpdi5wcmVwZW5kKCB0aW1lX3NwYW4gKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRlbnRfZGl2LmdldCggMCApLm91dGVySFRNTDtcblx0fVxuXG5cdHNldEV4Y2VwdGlvbkdyaWRTaXplKCkge1xuXHRcdGlmICggdGhpcy5leGNlcHRpb25fZ3JpZCApIHtcblx0XHRcdHRoaXMuZXhjZXB0aW9uX2dyaWQuZ3JpZC5zZXRHcmlkV2lkdGgoICQoICcuZXhjZXB0aW9uLWdyaWQtZGl2JyApLndpZHRoKCkgKyAxICk7XG5cblx0XHRcdHZhciBzaXplID0gMjtcblxuXHRcdFx0dmFyIGRhdGFfYXJyYXkgPSB0aGlzLmV4Y2VwdGlvbl9ncmlkLmdldERhdGEoKTtcblx0XHRcdGlmICggR2xvYmFsLmlzQXJyYXkoIGRhdGFfYXJyYXkgKSApIHtcblx0XHRcdFx0c2l6ZSArPSAoIDIyICogZGF0YV9hcnJheS5sZW5ndGggKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leGNlcHRpb25fZ3JpZC5zZXRHcmlkSGVpZ2h0KCBzaXplICk7XG5cdFx0fVxuXHR9XG5cblx0c2V0VGltZVNoZWV0U3VtbWFyeUdyaWRTaXplKCkge1xuXHRcdGlmICggdGhpcy50aW1lc2hlZXRfYXV0aG9yaXphdGlvbl9zdW1tYXJ5X2dyaWQgKSB7XG5cdFx0XHR0aGlzLnRpbWVzaGVldF9hdXRob3JpemF0aW9uX3N1bW1hcnlfZ3JpZC5ncmlkLnNldEdyaWRXaWR0aCggJCggJy50aW1lc2hlZXQtYXV0aG9yaXphdGlvbi1ncmlkLWRpdicgKS53aWR0aCgpICk7XG5cblx0XHRcdHZhciBzaXplID0gMjtcblxuXHRcdFx0dmFyIGRhdGFfYXJyYXkgPSB0aGlzLnRpbWVzaGVldF9hdXRob3JpemF0aW9uX3N1bW1hcnlfZ3JpZC5nZXREYXRhKCk7XG5cdFx0XHRpZiAoIEdsb2JhbC5pc0FycmF5KCBkYXRhX2FycmF5ICkgKSB7XG5cdFx0XHRcdHNpemUgKz0gKCAyMiAqIGRhdGFfYXJyYXkubGVuZ3RoICk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudGltZXNoZWV0X2F1dGhvcml6YXRpb25fc3VtbWFyeV9ncmlkLnNldEdyaWRIZWlnaHQoIHNpemUgKTtcblx0XHR9XG5cdH1cblxuXHRnZXRUaW1lU2hlZXRBdXRob3JpemF0aW9uVGFiSHRtbCgpIHtcblx0XHRyZXR1cm4gYFxuXHRcdDxkaXYgaWQ9XCJ0YWJfdGltZXNoZWV0X3ZlcmlmaWNhdGlvblwiIGNsYXNzPVwiZWRpdC12aWV3LXRhYi1vdXRzaWRlXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiZWRpdC12aWV3LXRhYlwiIGlkPVwidGFiX3RpbWVzaGVldF92ZXJpZmljYXRpb25fY29udGVudF9kaXZcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZpcnN0LWNvbHVtbiBmdWxsLXdpZHRoLWNvbHVtblwiPjwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXV0aG9yaXphdGlvbi1ncmlkLWRpdiBpbnNpZGUtZ3JpZCBmdWxsLXdpZHRoLWNvbHVtblwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJncmlkLXRvcC1ib3JkZXJcIj48L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZ3JpZC10aXRsZSBzZXBhcmF0ZWQtYm94XCI+PC9kaXY+XG5cdFx0XHRcdFx0PHRhYmxlIGlkPVwiZ3JpZFwiPjwvdGFibGU+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJvdHRvbS1kaXZcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJncmlkLWJvdHRvbS1ib3JkZXJcIj48L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8YnI+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGhpcmQtY29sdW1uICB0aW1lc2hlZXQtYXV0aG9yaXphdGlvbi1ncmlkLWRpdlwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhY2N1bXVsYXRlZC10b3RhbC1ncmlkLXRpdGxlIHRpbWVzaGVldC1hdXRob3JpemF0aW9uLXN1bW1hcnktdGl0bGUgZnVsbC13aWR0aC1jb2x1bW5cIj48L2Rpdj5cblx0XHRcdFx0XHQ8dGFibGUgaWQ9XCJ0aW1lc2hlZXRfYXV0aG9yaXphdGlvbl9zdW1tYXJ5X2dyaWRcIj48L3RhYmxlPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcnRoLWNvbHVtbiAgZXhjZXB0aW9uLWdyaWQtZGl2XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFjY3VtdWxhdGVkLXRvdGFsLWdyaWQtdGl0bGUgZXhjZXB0aW9uLXRpdGxlIGZ1bGwtd2lkdGgtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0PHRhYmxlIGlkPVwiZXhjZXB0aW9uX2dyaWRcIj48L3RhYmxlPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInNlcGFyYXRlIGZ1bGwtd2lkdGgtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzZWNvbmQtY29sdW1uIGZ1bGwtd2lkdGgtY29sdW1uXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMFwiPjwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+YDtcblx0fVxuXG59XG5cblRpbWVTaGVldEF1dGhvcml6YXRpb25WaWV3Q29udHJvbGxlci5UT1RBTF9ST1cgPSA0O1xuVGltZVNoZWV0QXV0aG9yaXphdGlvblZpZXdDb250cm9sbGVyLlJFR1VMQVJfUk9XID0gNTtcblRpbWVTaGVldEF1dGhvcml6YXRpb25WaWV3Q29udHJvbGxlci5BQlNFTkNFX1JPVyA9IDY7XG5UaW1lU2hlZXRBdXRob3JpemF0aW9uVmlld0NvbnRyb2xsZXIuQUNDVU1VTEFURURfVElNRV9ST1cgPSA3O1xuVGltZVNoZWV0QXV0aG9yaXphdGlvblZpZXdDb250cm9sbGVyLlBSRU1JVU1fUk9XID0gODtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8121\n")}}]); |