TimeTrex/interface/html5/dist/common-BaseTreeViewController.bundle.js

1 line
42 KiB
JavaScript

"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["common-BaseTreeViewController"],{1838:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BaseTreeViewController\": () => (/* binding */ BaseTreeViewController)\n/* harmony export */ });\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass BaseTreeViewController extends BaseViewController {\n\tsetSelectLayout( column_start_from ) {\n\t\tvar $this = this;\n\n\t\tvar grid;\n\t\tif ( !Global.isSet( this.grid ) ) {\n\t\t\tgrid = $( this.el ).find( '#grid' );\n\n\t\t\tgrid.attr( 'id', this.ui_id + '_grid' ); //Grid's id is ScriptName + _grid\n\n\t\t\tgrid = $( this.el ).find( '#' + this.ui_id + '_grid' );\n\t\t}\n\n\t\tvar column_info_array = [];\n\n\t\tif ( !this.select_layout ) { //Set to defalt layout if no layout at all\n\t\t\tthis.select_layout = { id: '' };\n\t\t\tthis.select_layout.data = { filter_data: {}, filter_sort: {} };\n\t\t\tthis.select_layout.data.display_columns = this.default_display_columns;\n\t\t}\n\t\tvar layout_data = this.select_layout.data;\n\n\t\tif ( layout_data.display_columns.length < 1 ) {\n\t\t\tlayout_data.display_columns = this.default_display_columns;\n\t\t}\n\n\t\tvar display_columns = this.buildDisplayColumns( layout_data.display_columns );\n\t\t//Set Data Grid on List view\n\t\tvar len = display_columns.length;\n\n\t\tvar start_from = 0;\n\n\t\tif ( Global.isSet( column_start_from ) && column_start_from > 0 ) {\n\t\t\tstart_from = column_start_from;\n\t\t}\n\n\t\tvar view_column_data = display_columns[0];\n\n\t\tvar column_info = {\n\t\t\tname: view_column_data.value,\n\t\t\tindex: view_column_data.value,\n\t\t\tlabel: $this.grid_table_name,\n\t\t\twidth: 100,\n\t\t\tsortable: false,\n\t\t\ttitle: false\n\t\t};\n\n\t\tcolumn_info_array.push( column_info );\n\n\t\tif ( this.grid ) {\n\t\t\tthis.grid.jqGrid( 'GridUnload' );\n\t\t\tthis.grid = null;\n\t\t}\n\n\t\tthis.grid = new TTGrid( this.ui_id + '_grid', {\n\t\t\tmultiselect: false,\n\t\t\twinMultiSelect: false,\n\t\t\ttree_mode: true,\n\t\t\tonSelectRow: $.proxy( this.onGridSelectRow, this )\n\t\t}, column_info_array );\n\n\t\tthis.bindGridColumnEvents();\n\n\t\tthis.setGridHeaderStyle(); //Set Sort Style\n\n\t\tthis.filter_data = this.select_layout.data.filter_data;\n\n\t\tthis.showGridBorders();\n\n\t\t$this.setGridSize();\n\t}\n\n\tsearch( set_default_menu, page_action, page_number ) {\n\t\tvar $this = this;\n\n\t\tif ( !Global.isSet( set_default_menu ) ) {\n\t\t\tset_default_menu = true;\n\t\t}\n\n\t\tvar filter = {};\n\t\tfilter.filter_data = {};\n\t\tfilter.filter_sort = {};\n\t\tfilter.filter_columns = this.getFilterColumnsFromDisplayColumns();\n\t\tfilter.filter_items_per_page = 0; // Default to 0 to load user preference defined\n\n\t\tif ( this.sub_view_mode && this.parent_key ) {\n\t\t\tthis.select_layout.data.filter_data[this.parent_key] = this.parent_value;\n\n\t\t\t//If sub view controller set custom filters, get it\n\t\t\tif ( Global.isSet( this.getSubViewFilter ) ) {\n\n\t\t\t\tthis.select_layout.data.filter_data = this.getSubViewFilter( this.select_layout.data.filter_data );\n\n\t\t\t}\n\t\t}\n\n\t\tthis.last_select_ids = this.getGridSelectIdArray();\n\t\t//select_layout will not be null, it's set in setSelectLayout function\n\t\tfilter.filter_data = Global.convertLayoutFilterToAPIFilter( this.select_layout );\n\t\tfilter.filter_sort = this.select_layout.data.filter_sort;\n\n\t\tthis.api['get' + this.api.key_name]( filter, false, false, {\n\t\t\tonResult: function( result ) {\n\n\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\tresult_data = Global.buildTreeRecord( result_data );\n\n\t\t\t\t$this.grid_current_page_items = result_data; // For tree mode only\n\n\t\t\t\tif ( !Global.isArray( result_data ) ) {\n\t\t\t\t\t$this.showNoResultCover();\n\t\t\t\t} else {\n\t\t\t\t\t$this.removeNoResultCover();\n\t\t\t\t}\n\n\t\t\t\t$this.reSetGridTreeData( result_data );\n\n\t\t\t\t$this.setGridSize();\n\n\t\t\t\tProgressBar.closeOverlay(); //Add this in initData\n\t\t\t\tif ( set_default_menu ) {\n\t\t\t\t\t$this.setDefaultMenu();\n\t\t\t\t}\n\n\t\t\t\tif ( LocalCacheData.paging_type === 0 ) {\n\t\t\t\t\tif ( !$this.pager_data || $this.pager_data.is_last_page ) {\n\t\t\t\t\t\t$this.paging_widget.css( 'display', 'none' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.paging_widget.css( 'display', 'block' );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$this.reSelectLastSelectItems();\n\t\t\t\t$this.autoOpenEditViewIfNecessary();\n\t\t\t\t$this.searchDone();\n\t\t\t}\n\t\t} );\n\t}\n\n\tsetDefaultMenu( doNotSetFocus ) {\n\t\tvar selected_row = this.getSelectedItem();\n\t\tvar context_menu_array = ContextMenuManager.getMenuModelByMenuId( this.determineContextMenuMountAttributes().id );\n\n\t\t//If selected root group, disable all context menu icons other than add. Otherwise blank view opens that might be difficult for user to exit when clicking edit or view.\n\t\tif ( selected_row !== null && selected_row.id == TTUUID.zero_id ) {\n\t\t\tvar len = context_menu_array.length;\n\n\t\t\tvar grid_selected_id_array = this.getGridSelectIdArray();\n\n\t\t\tvar grid_selected_length = grid_selected_id_array.length;\n\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tlet context_btn = context_menu_array[i];\n\t\t\t\tlet id = context_menu_array[i].id;\n\n\t\t\t\tif ( id == 'add' ) {\n\t\t\t\t\tthis.setDefaultMenuAddIcon( context_btn, grid_selected_length );\n\t\t\t\t} else {\n\t\t\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.setDefaultMenu( doNotSetFocus );\n\t}\n\n\tonEditClick( record_id, noRefreshUI ) {\n\t\tif ( record_id === TTUUID.zero_id ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tsuper.onEditClick( record_id, noRefreshUI );\n\t}\n\n\treSetGridTreeData( val ) {\n\t\tvar $this = this;\n\n\t\tvar col_model = this.grid.getGridParam( 'colModel' );\n\t\tthis.grid.grid.jqGrid( 'GridUnload' );\n\t\tthis.grid = null;\n\n\t\tthis.grid = new TTGrid( this.ui_id + '_grid', {\n\t\t\tmultiselect: false,\n\t\t\twinMultiSelect: false,\n\t\t\tdatastr: val,\n\t\t\tdatatype: 'jsonstring',\n\t\t\tsortable: false,\n\t\t\tonSelectRow: function( id ) {\n\t\t\t\t$( '#ribbon_view_container .context-menu:visible a' ).click();\n\t\t\t\t$this.grid_select_id_array = [id];\n\t\t\t\t$this.setDefaultMenu();\n\n\t\t\t},\n\t\t\tondblClickRow: function() {\n\t\t\t\t//Do not open root group item as it cannot be edited and produces weird results if opened.\n\t\t\t\tif ( $this.getEditSelectedRecordId() !== TTUUID.zero_id ) {\n\t\t\t\t\t$this.onGridDblClickRow();\n\t\t\t\t}\n\t\t\t},\n\t\t\tgridview: true,\n\t\t\ttreeGrid: true,\n\t\t\ttreeGridModel: 'adjacency',\n\t\t\ttreedatatype: 'local',\n\t\t\tExpandColumn: 'name',\n\t\t}, col_model );\n\t}\n\n\tgetGridSelectIdArray() {\n\t\tvar result = [];\n\t\tresult = this.grid_select_id_array;\n\n\t\treturn result;\n\t}\n\n\tinitLayout() {\n\t\tvar $this = this;\n\t\tthis.real_this = this.constructor.__super__; // this seems first entry point. needed where view controller is extended twice, Base->Tree-View, used with onViewClick _super\n\n\t\t$this.getDefaultDisplayColumns( function() {\n\t\t\t$this.setSelectLayout();\n\t\t\t$this.search();\n\t\t} );\n\t}\n\n\tgetAllColumns( callBack ) {\n\t\tvar $this = this;\n\n\t\tthis.api.getOptions( 'columns', {\n\t\t\tonResult: function( columns_result ) {\n\n\t\t\t\tvar columns_result_data = columns_result.getResult();\n\t\t\t\t$this.all_columns = Global.buildColumnArray( columns_result_data );\n\n\t\t\t\tif ( callBack ) {\n\t\t\t\t\tcallBack();\n\t\t\t\t}\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tsetCurrentEditRecordData() {\n\t\t//Set current edit record data to all widgets\n\t\tfor ( var key in this.current_edit_record ) {\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 'parent_id':\n\t\t\t\t\t\twidget.setSourceData( this.grid_current_page_items );\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\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\t\tthis.collectUIDataToCurrentEditRecord();\n\t\tthis.setEditViewDataDone();\n\t}\n\n\tsetEditViewData() {\n\t\tvar $this = this;\n\n\t\tthis.is_changed = false;\n\n\t\tif ( !this.edit_only_mode ) {\n\n\t\t\tvar navigation_div = this.edit_view.find( '.navigation-div' );\n\n\t\t\tif ( Global.isSet( this.current_edit_record.id ) && this.current_edit_record.id ) {\n\t\t\t\tnavigation_div.css( 'display', 'block' );\n\t\t\t\t//Set Navigation Awesomebox\n\n\t\t\t\t//init navigation only when open edit view\n\t\t\t\tif ( !this.navigation.getSourceData() ) {\n\t\t\t\t\tthis.navigation.setSourceData( this.grid_current_page_items.filter( grid_item => grid_item.id !== TTUUID.zero_id ) );\n\n\t\t\t\t\tvar default_args = {};\n\t\t\t\t\tdefault_args.filter_data = Global.convertLayoutFilterToAPIFilter( this.select_layout );\n\t\t\t\t\tdefault_args.filter_sort = this.select_layout.data.filter_sort;\n\t\t\t\t\tthis.navigation.setDefaultArgs( default_args );\n\t\t\t\t}\n\n\t\t\t\tthis.navigation.setValue( this.current_edit_record );\n\n\t\t\t} else {\n\t\t\t\tnavigation_div.css( 'display', 'none' );\n\t\t\t}\n\t\t}\n\n\t\tfor ( var key in this.edit_view_ui_dic ) {\n\n\t\t\t//Set all UI field to current edit reocrd, we need validate all UI fielld when save and validate\n\t\t\tif ( !Global.isSet( $this.current_edit_record[key] ) && !this.is_mass_editing ) {\n\t\t\t\t$this.current_edit_record[key] = false;\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setNavigationArrowsStatus();\n\t\tthis.setNavigationArrowsEnabled();\n\n\t\t// Create this function alone because of the column value of view is different from each other, some columns need to be handle specially. and easily to rewrite this function in sub-class.\n\n\t\tthis.setCurrentEditRecordData();\n\n\t\t//Init *Please save this record before modifying any related data* box\n\t\tthis.edit_view.find( '.save-and-continue-div' ).SaveAndContinueBox( { related_view_controller: this } );\n\t\tthis.edit_view.find( '.save-and-continue-div' ).css( 'display', 'none' );\n\n\t\tif ( this.edit_view_tab.tabs( 'option', 'active' ) === 1 ) {\n\t\t\tif ( this.current_edit_record.id ) {\n\t\t\t\tthis.edit_view_tab.find( '#tab_audit' ).find( '.first-column-sub-view' ).css( 'display', 'block' );\n\t\t\t\tthis.initSubLogView( 'tab_audit' );\n\t\t\t} else {\n\t\t\t\tthis.edit_view_tab.find( '#tab_audit' ).find( '.first-column-sub-view' ).css( 'display', 'none' );\n\t\t\t\tthis.edit_view.find( '.save-and-continue-div' ).css( 'display', 'block' );\n\t\t\t}\n\t\t}\n\t\tthis.switchToProperTab();\n\t}\n\n\taddIdFieldToNavigation( array ) {\n\t\t$.each( array, function( key, item ) {\n\t\t\t$( item ).each( function( i_key, i_item ) {\n\t\t\t\ti_item.id = i_item._id_;\n\t\t\t} );\n\t\t} );\n\n\t\treturn array;\n\t}\n\n\tdoViewAPICall( filter ) {\n\t\treturn super.doViewAPICall( filter, [filter, false, false] );\n\t}\n\n\thandleViewAPICallbackResult( result ) {\n\t\treturn this.handleAPICallbackResult( result );\n\t}\n\n\thandleAPICallbackResult( result ) {\n\t\tvar result_data = result.getResult();\n\t\tvar record_id = this.getCurrentSelectedRecord();\n\t\tresult_data = Global.getParentIdByTreeRecord( Global.buildTreeRecord( result_data ), record_id );\n\t\tresult_data = result_data[0];\n\t\tresult_data.id = record_id;\n\n\t\tsuper.handleViewAPICallbackResult( result_data );\n\t}\n\n\thandleEditAPICallbackResult( result ) {\n\t\treturn this.handleAPICallbackResult( result );\n\t}\n\n\tonDeleteDone( result ) {\n\t\tthis.grid_select_id_array = [];\n\t\tthis.setDefaultMenu();\n\t\tthis.removeDeletedRows();\n\t}\n\n\tonSaveDone( result ) {\n\t\tthis.grid_select_id_array = [];\n\t}\n\n\tdoEditAPICall( filter ) {\n\t\treturn super.doEditAPICall( filter, [filter, false, false] );\n\t}\n\n\t_continueDoCopyAsNew() {\n\t\tvar $this = this;\n\t\tthis.setCurrentEditViewState( 'new' );\n\t\tLocalCacheData.current_doing_context_action = 'copy_as_new';\n\n\t\tif ( Global.isSet( this.edit_view ) ) {\n\n\t\t\tthis.current_edit_record.id = '';\n\t\t\tvar navigation_div = this.edit_view.find( '.navigation-div' );\n\t\t\tnavigation_div.css( 'display', 'none' );\n\t\t\tthis.setEditMenu();\n\t\t\tthis.setTabStatus();\n\t\t\tthis.is_changed = false;\n\t\t\tProgressBar.closeOverlay();\n\n\t\t} else {\n\t\t\tvar filter = {};\n\t\t\tvar grid_selected_id_array = this.getGridSelectIdArray();\n\t\t\tvar grid_selected_length = grid_selected_id_array.length;\n\n\t\t\tif ( grid_selected_length > 0 ) {\n\t\t\t\tvar selectedId = grid_selected_id_array[0];\n\t\t\t} else {\n\t\t\t\tTAlertManager.showAlert( $.i18n._( 'No selected record' ) );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfilter.filter_data = {};\n\n\t\t\tthis.api['get' + this.api.key_name]( filter, false, false, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t\tresult_data = Global.buildTreeRecord( result_data );\n\t\t\t\t\tresult_data = Global.getParentIdByTreeRecord( result_data, selectedId );\n\n\t\t\t\t\tif ( !result_data ) {\n\t\t\t\t\t\tTAlertManager.showAlert( $.i18n._( 'Record does not exist' ) );\n\t\t\t\t\t\t$this.onCancelClick();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.openEditView(); // Put it here is to avoid if the selected one is not existed in data or have deleted by other pragram. in this case, the edit view should not be opend.\n\n\t\t\t\t\tresult_data = result_data[0];\n\t\t\t\t\tif ( $this.sub_view_mode && $this.parent_key ) {\n\t\t\t\t\t\tresult_data[$this.parent_key] = $this.parent_value;\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.current_edit_record = result_data;\n\t\t\t\t\t$this.current_edit_record.id = '';\n\n\t\t\t\t\t$this.initEditView();\n\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tbuildEditViewUI() {\n\t\tvar $this = this;\n\n\t\t// #VueContextMenu# After we add the edit_view to the page in initEditViewUI(), add the context menu (Vue needs a valid id in dom)\n\t\tif( ContextMenuManager.getMenu( this.determineContextMenuMountAttributes().id ) === undefined ) {\n\t\t\tthis.buildContextMenu();\n\t\t} else {\n\t\t\tDebug.Warn( 'Context Menu ('+ this.determineContextMenuMountAttributes().id +') already exists for: '+ this.viewId, 'BaseTreeViewController.js', 'BaseTreeViewController', 'buildEditViewUI', 10 );\n\t\t}\n\n\t\t//No navigation when edit only mode\n\t\tif ( !this.edit_only_mode ) {\n\t\t\tvar navigation_div = this.edit_view.find( '.navigation-div' );\n\t\t\tvar label = navigation_div.find( '.navigation-label' );\n\n\t\t\tvar navigation_widget_div = navigation_div.find( '.navigation-widget-div' );\n\n\t\t\tthis.navigation = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tlabel.text( this.navigation_label );\n\n\t\t\tnavigation_widget_div.append( this.navigation );\n\t\t}\n\n\t\tthis.edit_view_close_icon = this.edit_view.find( '.close-icon' );\n\t\tthis.edit_view_close_icon.hide();\n\t\tthis.edit_view_close_icon.click( function() {\n\t\t\t$this.onCloseIconClick();\n\t\t} );\n\n\t\tvar tab_model = Array();\n\t\ttab_model[this.primary_tab_key] = { 'label': this.primary_tab_label };\n\t\ttab_model['tab_audit'] = {\n\t\t\t'label': $.i18n._( 'Audit' ),\n\t\t\t'init_callback': 'initSubLogView',\n\t\t\t'display_on_mass_edit': false,\n\t\t\t'display_on_add': false\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tid: this.script_name + '_navigation',\n\t\t\ttree_mode: true,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_tree_column',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: false,\n\t\t\ton_tree_grid_row_select: function( id, tree_mode_collapse ) {\n\t\t\t\t$this.onTreeGridNavigationRowSelect( id, tree_mode_collapse );\n\t\t\t}\n\t\t} );\n\n\t\tvar left_click = navigation_div.find( '.left-click' );\n\t\tvar right_click = navigation_div.find( '.right-click' );\n\t\tleft_click.attr( 'src', Global.getRealImagePath( 'images/left_arrow.svg' ) );\n\t\tright_click.attr( 'src', Global.getRealImagePath( 'images/right_arrow.svg' ) );\n\n\t\tthis.setNavigation();\n\n\t\t//Tab 0 start\n\t\tvar tab_group = this.edit_view_tab.find( '#' + this.primary_tab_key );\n\n\t\tvar tab_group_column1 = tab_group.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_group_column1 );\n\n\t\t//Parent\n\t\t//Group\n\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\ttree_mode: true,\n\t\t\tallow_multiple_selection: false,\n\t\t\tshow_search_inputs: false,\n\t\t\tlayout_name: 'global_tree_column',\n\t\t\tset_empty: true,\n\t\t\tfield: 'parent_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Parent' ), form_item_input, tab_group_column1, '' );\n\n\t\t//Name\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\n\t\tform_item_input.TTextInput( { field: 'name', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Name' ), form_item_input, tab_group_column1, '' );\n\n\t\tform_item_input.parent().width( '45%' );\n\t}\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgzOC5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxDQUFDOztBQUVYLDZDQUE2Qzs7QUFFN0MsVUFBVSxDQUFDO0FBQ1g7O0FBRUE7O0FBRUEsK0JBQStCO0FBQy9CLDBCQUEwQjtBQUMxQiwrQkFBK0IsZUFBZTtBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixDQUFDO0FBQ2pCLEdBQUc7O0FBRUg7O0FBRUEsNkJBQTZCOztBQUU3Qjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBOztBQUVBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksQ0FBQztBQUNMO0FBQ0E7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSx3RUFBd0UsZ0NBQWdDO0FBQ3hHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsQ0FBQztBQUNILEdBQUcsQ0FBQztBQUNKO0FBQ0EsS0FBSztBQUNMLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMLDZCQUE2QixDQUFDO0FBQzlCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQixDQUFDO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUEsZ0NBQWdDLCtCQUErQjtBQUMvRCw2QkFBNkIsQ0FBQzs7QUFFOUI7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL2NvbW1vbi9CYXNlVHJlZVZpZXdDb250cm9sbGVyLmpzPzhmMjciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEJhc2VUcmVlVmlld0NvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlVmlld0NvbnRyb2xsZXIge1xuXHRzZXRTZWxlY3RMYXlvdXQoIGNvbHVtbl9zdGFydF9mcm9tICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgZ3JpZDtcblx0XHRpZiAoICFHbG9iYWwuaXNTZXQoIHRoaXMuZ3JpZCApICkge1xuXHRcdFx0Z3JpZCA9ICQoIHRoaXMuZWwgKS5maW5kKCAnI2dyaWQnICk7XG5cblx0XHRcdGdyaWQuYXR0ciggJ2lkJywgdGhpcy51aV9pZCArICdfZ3JpZCcgKTsgIC8vR3JpZCdzIGlkIGlzIFNjcmlwdE5hbWUgKyBfZ3JpZFxuXG5cdFx0XHRncmlkID0gJCggdGhpcy5lbCApLmZpbmQoICcjJyArIHRoaXMudWlfaWQgKyAnX2dyaWQnICk7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbHVtbl9pbmZvX2FycmF5ID0gW107XG5cblx0XHRpZiAoICF0aGlzLnNlbGVjdF9sYXlvdXQgKSB7IC8vU2V0IHRvIGRlZmFsdCBsYXlvdXQgaWYgbm8gbGF5b3V0IGF0IGFsbFxuXHRcdFx0dGhpcy5zZWxlY3RfbGF5b3V0ID0geyBpZDogJycgfTtcblx0XHRcdHRoaXMuc2VsZWN0X2xheW91dC5kYXRhID0geyBmaWx0ZXJfZGF0YToge30sIGZpbHRlcl9zb3J0OiB7fSB9O1xuXHRcdFx0dGhpcy5zZWxlY3RfbGF5b3V0LmRhdGEuZGlzcGxheV9jb2x1bW5zID0gdGhpcy5kZWZhdWx0X2Rpc3BsYXlfY29sdW1ucztcblx0XHR9XG5cdFx0dmFyIGxheW91dF9kYXRhID0gdGhpcy5zZWxlY3RfbGF5b3V0LmRhdGE7XG5cblx0XHRpZiAoIGxheW91dF9kYXRhLmRpc3BsYXlfY29sdW1ucy5sZW5ndGggPCAxICkge1xuXHRcdFx0bGF5b3V0X2RhdGEuZGlzcGxheV9jb2x1bW5zID0gdGhpcy5kZWZhdWx0X2Rpc3BsYXlfY29sdW1ucztcblx0XHR9XG5cblx0XHR2YXIgZGlzcGxheV9jb2x1bW5zID0gdGhpcy5idWlsZERpc3BsYXlDb2x1bW5zKCBsYXlvdXRfZGF0YS5kaXNwbGF5X2NvbHVtbnMgKTtcblx0XHQvL1NldCBEYXRhIEdyaWQgb24gTGlzdCB2aWV3XG5cdFx0dmFyIGxlbiA9IGRpc3BsYXlfY29sdW1ucy5sZW5ndGg7XG5cblx0XHR2YXIgc3RhcnRfZnJvbSA9IDA7XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggY29sdW1uX3N0YXJ0X2Zyb20gKSAmJiBjb2x1bW5fc3RhcnRfZnJvbSA+IDAgKSB7XG5cdFx0XHRzdGFydF9mcm9tID0gY29sdW1uX3N0YXJ0X2Zyb207XG5cdFx0fVxuXG5cdFx0dmFyIHZpZXdfY29sdW1uX2RhdGEgPSBkaXNwbGF5X2NvbHVtbnNbMF07XG5cblx0XHR2YXIgY29sdW1uX2luZm8gPSB7XG5cdFx0XHRuYW1lOiB2aWV3X2NvbHVtbl9kYXRhLnZhbHVlLFxuXHRcdFx0aW5kZXg6IHZpZXdfY29sdW1uX2RhdGEudmFsdWUsXG5cdFx0XHRsYWJlbDogJHRoaXMuZ3JpZF90YWJsZV9uYW1lLFxuXHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdHRpdGxlOiBmYWxzZVxuXHRcdH07XG5cblx0XHRjb2x1bW5faW5mb19hcnJheS5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0aWYgKCB0aGlzLmdyaWQgKSB7XG5cdFx0XHR0aGlzLmdyaWQuanFHcmlkKCAnR3JpZFVubG9hZCcgKTtcblx0XHRcdHRoaXMuZ3JpZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFRUR3JpZCggdGhpcy51aV9pZCArICdfZ3JpZCcsIHtcblx0XHRcdG11bHRpc2VsZWN0OiBmYWxzZSxcblx0XHRcdHdpbk11bHRpU2VsZWN0OiBmYWxzZSxcblx0XHRcdHRyZWVfbW9kZTogdHJ1ZSxcblx0XHRcdG9uU2VsZWN0Um93OiAkLnByb3h5KCB0aGlzLm9uR3JpZFNlbGVjdFJvdywgdGhpcyApXG5cdFx0fSwgY29sdW1uX2luZm9fYXJyYXkgKTtcblxuXHRcdHRoaXMuYmluZEdyaWRDb2x1bW5FdmVudHMoKTtcblxuXHRcdHRoaXMuc2V0R3JpZEhlYWRlclN0eWxlKCk7IC8vU2V0IFNvcnQgU3R5bGVcblxuXHRcdHRoaXMuZmlsdGVyX2RhdGEgPSB0aGlzLnNlbGVjdF9sYXlvdXQuZGF0YS5maWx0ZXJfZGF0YTtcblxuXHRcdHRoaXMuc2hvd0dyaWRCb3JkZXJzKCk7XG5cblx0XHQkdGhpcy5zZXRHcmlkU2l6ZSgpO1xuXHR9XG5cblx0c2VhcmNoKCBzZXRfZGVmYXVsdF9tZW51LCBwYWdlX2FjdGlvbiwgcGFnZV9udW1iZXIgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdGlmICggIUdsb2JhbC5pc1NldCggc2V0X2RlZmF1bHRfbWVudSApICkge1xuXHRcdFx0c2V0X2RlZmF1bHRfbWVudSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIGZpbHRlciA9IHt9O1xuXHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IHt9O1xuXHRcdGZpbHRlci5maWx0ZXJfc29ydCA9IHt9O1xuXHRcdGZpbHRlci5maWx0ZXJfY29sdW1ucyA9IHRoaXMuZ2V0RmlsdGVyQ29sdW1uc0Zyb21EaXNwbGF5Q29sdW1ucygpO1xuXHRcdGZpbHRlci5maWx0ZXJfaXRlbXNfcGVyX3BhZ2UgPSAwOyAvLyBEZWZhdWx0IHRvIDAgdG8gbG9hZCB1c2VyIHByZWZlcmVuY2UgZGVmaW5lZFxuXG5cdFx0aWYgKCB0aGlzLnN1Yl92aWV3X21vZGUgJiYgdGhpcy5wYXJlbnRfa2V5ICkge1xuXHRcdFx0dGhpcy5zZWxlY3RfbGF5b3V0LmRhdGEuZmlsdGVyX2RhdGFbdGhpcy5wYXJlbnRfa2V5XSA9IHRoaXMucGFyZW50X3ZhbHVlO1xuXG5cdFx0XHQvL0lmIHN1YiB2aWV3IGNvbnRyb2xsZXIgc2V0IGN1c3RvbSBmaWx0ZXJzLCBnZXQgaXRcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB0aGlzLmdldFN1YlZpZXdGaWx0ZXIgKSApIHtcblxuXHRcdFx0XHR0aGlzLnNlbGVjdF9sYXlvdXQuZGF0YS5maWx0ZXJfZGF0YSA9IHRoaXMuZ2V0U3ViVmlld0ZpbHRlciggdGhpcy5zZWxlY3RfbGF5b3V0LmRhdGEuZmlsdGVyX2RhdGEgKTtcblxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMubGFzdF9zZWxlY3RfaWRzID0gdGhpcy5nZXRHcmlkU2VsZWN0SWRBcnJheSgpO1xuXHRcdC8vc2VsZWN0X2xheW91dCB3aWxsIG5vdCBiZSBudWxsLCBpdCdzIHNldCBpbiBzZXRTZWxlY3RMYXlvdXQgZnVuY3Rpb25cblx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEgPSBHbG9iYWwuY29udmVydExheW91dEZpbHRlclRvQVBJRmlsdGVyKCB0aGlzLnNlbGVjdF9sYXlvdXQgKTtcblx0XHRmaWx0ZXIuZmlsdGVyX3NvcnQgPSB0aGlzLnNlbGVjdF9sYXlvdXQuZGF0YS5maWx0ZXJfc29ydDtcblxuXHRcdHRoaXMuYXBpWydnZXQnICsgdGhpcy5hcGkua2V5X25hbWVdKCBmaWx0ZXIsIGZhbHNlLCBmYWxzZSwge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdHJlc3VsdF9kYXRhID0gR2xvYmFsLmJ1aWxkVHJlZVJlY29yZCggcmVzdWx0X2RhdGEgKTtcblxuXHRcdFx0XHQkdGhpcy5ncmlkX2N1cnJlbnRfcGFnZV9pdGVtcyA9IHJlc3VsdF9kYXRhOyAvLyBGb3IgdHJlZSBtb2RlIG9ubHlcblxuXHRcdFx0XHRpZiAoICFHbG9iYWwuaXNBcnJheSggcmVzdWx0X2RhdGEgKSApIHtcblx0XHRcdFx0XHQkdGhpcy5zaG93Tm9SZXN1bHRDb3ZlcigpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCR0aGlzLnJlbW92ZU5vUmVzdWx0Q292ZXIoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLnJlU2V0R3JpZFRyZWVEYXRhKCByZXN1bHRfZGF0YSApO1xuXG5cdFx0XHRcdCR0aGlzLnNldEdyaWRTaXplKCk7XG5cblx0XHRcdFx0UHJvZ3Jlc3NCYXIuY2xvc2VPdmVybGF5KCk7IC8vQWRkIHRoaXMgaW4gaW5pdERhdGFcblx0XHRcdFx0aWYgKCBzZXRfZGVmYXVsdF9tZW51ICkge1xuXHRcdFx0XHRcdCR0aGlzLnNldERlZmF1bHRNZW51KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIExvY2FsQ2FjaGVEYXRhLnBhZ2luZ190eXBlID09PSAwICkge1xuXHRcdFx0XHRcdGlmICggISR0aGlzLnBhZ2VyX2RhdGEgfHwgJHRoaXMucGFnZXJfZGF0YS5pc19sYXN0X3BhZ2UgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5wYWdpbmdfd2lkZ2V0LmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRoaXMucGFnaW5nX3dpZGdldC5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLnJlU2VsZWN0TGFzdFNlbGVjdEl0ZW1zKCk7XG5cdFx0XHRcdCR0aGlzLmF1dG9PcGVuRWRpdFZpZXdJZk5lY2Vzc2FyeSgpO1xuXHRcdFx0XHQkdGhpcy5zZWFyY2hEb25lKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0c2V0RGVmYXVsdE1lbnUoIGRvTm90U2V0Rm9jdXMgKSB7XG5cdFx0dmFyIHNlbGVjdGVkX3JvdyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtKCk7XG5cdFx0dmFyIGNvbnRleHRfbWVudV9hcnJheSA9IENvbnRleHRNZW51TWFuYWdlci5nZXRNZW51TW9kZWxCeU1lbnVJZCggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkICk7XG5cblx0XHQvL0lmIHNlbGVjdGVkIHJvb3QgZ3JvdXAsIGRpc2FibGUgYWxsIGNvbnRleHQgbWVudSBpY29ucyBvdGhlciB0aGFuIGFkZC4gT3RoZXJ3aXNlIGJsYW5rIHZpZXcgb3BlbnMgdGhhdCBtaWdodCBiZSBkaWZmaWN1bHQgZm9yIHVzZXIgdG8gZXhpdCB3aGVuIGNsaWNraW5nIGVkaXQgb3Igdmlldy5cblx0XHRpZiAoIHNlbGVjdGVkX3JvdyAhPT0gbnVsbCAmJiBzZWxlY3RlZF9yb3cuaWQgPT0gVFRVVUlELnplcm9faWQgKSB7XG5cdFx0XHR2YXIgbGVuID0gY29udGV4dF9tZW51X2FycmF5Lmxlbmd0aDtcblxuXHRcdFx0dmFyIGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkgPSB0aGlzLmdldEdyaWRTZWxlY3RJZEFycmF5KCk7XG5cblx0XHRcdHZhciBncmlkX3NlbGVjdGVkX2xlbmd0aCA9IGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0bGV0IGNvbnRleHRfYnRuID0gY29udGV4dF9tZW51X2FycmF5W2ldO1xuXHRcdFx0XHRsZXQgaWQgPSBjb250ZXh0X21lbnVfYXJyYXlbaV0uaWQ7XG5cblx0XHRcdFx0aWYgKCBpZCA9PSAnYWRkJyApIHtcblx0XHRcdFx0XHR0aGlzLnNldERlZmF1bHRNZW51QWRkSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHN1cGVyLnNldERlZmF1bHRNZW51KCBkb05vdFNldEZvY3VzICk7XG5cdH1cblxuXHRvbkVkaXRDbGljayggcmVjb3JkX2lkLCBub1JlZnJlc2hVSSApIHtcblx0XHRpZiAoIHJlY29yZF9pZCA9PT0gVFRVVUlELnplcm9faWQgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3VwZXIub25FZGl0Q2xpY2soIHJlY29yZF9pZCwgbm9SZWZyZXNoVUkgKTtcblx0fVxuXG5cdHJlU2V0R3JpZFRyZWVEYXRhKCB2YWwgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciBjb2xfbW9kZWwgPSB0aGlzLmdyaWQuZ2V0R3JpZFBhcmFtKCAnY29sTW9kZWwnICk7XG5cdFx0dGhpcy5ncmlkLmdyaWQuanFHcmlkKCAnR3JpZFVubG9hZCcgKTtcblx0XHR0aGlzLmdyaWQgPSBudWxsO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFRUR3JpZCggdGhpcy51aV9pZCArICdfZ3JpZCcsIHtcblx0XHRcdG11bHRpc2VsZWN0OiBmYWxzZSxcblx0XHRcdHdpbk11bHRpU2VsZWN0OiBmYWxzZSxcblx0XHRcdGRhdGFzdHI6IHZhbCxcblx0XHRcdGRhdGF0eXBlOiAnanNvbnN0cmluZycsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRvblNlbGVjdFJvdzogZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0XHQkKCAnI3JpYmJvbl92aWV3X2NvbnRhaW5lciAuY29udGV4dC1tZW51OnZpc2libGUgYScgKS5jbGljaygpO1xuXHRcdFx0XHQkdGhpcy5ncmlkX3NlbGVjdF9pZF9hcnJheSA9IFtpZF07XG5cdFx0XHRcdCR0aGlzLnNldERlZmF1bHRNZW51KCk7XG5cblx0XHRcdH0sXG5cdFx0XHRvbmRibENsaWNrUm93OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly9EbyBub3Qgb3BlbiByb290IGdyb3VwIGl0ZW0gYXMgaXQgY2Fubm90IGJlIGVkaXRlZCBhbmQgcHJvZHVjZXMgd2VpcmQgcmVzdWx0cyBpZiBvcGVuZWQuXG5cdFx0XHRcdGlmICggJHRoaXMuZ2V0RWRpdFNlbGVjdGVkUmVjb3JkSWQoKSAhPT0gVFRVVUlELnplcm9faWQgKSB7XG5cdFx0XHRcdFx0JHRoaXMub25HcmlkRGJsQ2xpY2tSb3coKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGdyaWR2aWV3OiB0cnVlLFxuXHRcdFx0dHJlZUdyaWQ6IHRydWUsXG5cdFx0XHR0cmVlR3JpZE1vZGVsOiAnYWRqYWNlbmN5Jyxcblx0XHRcdHRyZWVkYXRhdHlwZTogJ2xvY2FsJyxcblx0XHRcdEV4cGFuZENvbHVtbjogJ25hbWUnLFxuXHRcdH0sIGNvbF9tb2RlbCApO1xuXHR9XG5cblx0Z2V0R3JpZFNlbGVjdElkQXJyYXkoKSB7XG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xuXHRcdHJlc3VsdCA9IHRoaXMuZ3JpZF9zZWxlY3RfaWRfYXJyYXk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0aW5pdExheW91dCgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMucmVhbF90aGlzID0gdGhpcy5jb25zdHJ1Y3Rvci5fX3N1cGVyX187IC8vIHRoaXMgc2VlbXMgZmlyc3QgZW50cnkgcG9pbnQuIG5lZWRlZCB3aGVyZSB2aWV3IGNvbnRyb2xsZXIgaXMgZXh0ZW5kZWQgdHdpY2UsIEJhc2UtPlRyZWUtVmlldywgdXNlZCB3aXRoIG9uVmlld0NsaWNrIF9zdXBlclxuXG5cdFx0JHRoaXMuZ2V0RGVmYXVsdERpc3BsYXlDb2x1bW5zKCBmdW5jdGlvbigpIHtcblx0XHRcdCR0aGlzLnNldFNlbGVjdExheW91dCgpO1xuXHRcdFx0JHRoaXMuc2VhcmNoKCk7XG5cdFx0fSApO1xuXHR9XG5cblx0Z2V0QWxsQ29sdW1ucyggY2FsbEJhY2sgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHRoaXMuYXBpLmdldE9wdGlvbnMoICdjb2x1bW5zJywge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCBjb2x1bW5zX3Jlc3VsdCApIHtcblxuXHRcdFx0XHR2YXIgY29sdW1uc19yZXN1bHRfZGF0YSA9IGNvbHVtbnNfcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHQkdGhpcy5hbGxfY29sdW1ucyA9IEdsb2JhbC5idWlsZENvbHVtbkFycmF5KCBjb2x1bW5zX3Jlc3VsdF9kYXRhICk7XG5cblx0XHRcdFx0aWYgKCBjYWxsQmFjayApIHtcblx0XHRcdFx0XHRjYWxsQmFjaygpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRzZXRDdXJyZW50RWRpdFJlY29yZERhdGEoKSB7XG5cdFx0Ly9TZXQgY3VycmVudCBlZGl0IHJlY29yZCBkYXRhIHRvIGFsbCB3aWRnZXRzXG5cdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV07XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggd2lkZ2V0ICkgKSB7XG5cdFx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0XHRjYXNlICdwYXJlbnRfaWQnOlxuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFNvdXJjZURhdGEoIHRoaXMuZ3JpZF9jdXJyZW50X3BhZ2VfaXRlbXMgKTtcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuY29sbGVjdFVJRGF0YVRvQ3VycmVudEVkaXRSZWNvcmQoKTtcblx0XHR0aGlzLnNldEVkaXRWaWV3RGF0YURvbmUoKTtcblx0fVxuXG5cdHNldEVkaXRWaWV3RGF0YSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dGhpcy5pc19jaGFuZ2VkID0gZmFsc2U7XG5cblx0XHRpZiAoICF0aGlzLmVkaXRfb25seV9tb2RlICkge1xuXG5cdFx0XHR2YXIgbmF2aWdhdGlvbl9kaXYgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnLm5hdmlnYXRpb24tZGl2JyApO1xuXG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0XHRuYXZpZ2F0aW9uX2Rpdi5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHQvL1NldCBOYXZpZ2F0aW9uIEF3ZXNvbWVib3hcblxuXHRcdFx0XHQvL2luaXQgbmF2aWdhdGlvbiBvbmx5IHdoZW4gb3BlbiBlZGl0IHZpZXdcblx0XHRcdFx0aWYgKCAhdGhpcy5uYXZpZ2F0aW9uLmdldFNvdXJjZURhdGEoKSApIHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRpb24uc2V0U291cmNlRGF0YSggdGhpcy5ncmlkX2N1cnJlbnRfcGFnZV9pdGVtcy5maWx0ZXIoIGdyaWRfaXRlbSA9PiBncmlkX2l0ZW0uaWQgIT09IFRUVVVJRC56ZXJvX2lkICkgKTtcblxuXHRcdFx0XHRcdHZhciBkZWZhdWx0X2FyZ3MgPSB7fTtcblx0XHRcdFx0XHRkZWZhdWx0X2FyZ3MuZmlsdGVyX2RhdGEgPSBHbG9iYWwuY29udmVydExheW91dEZpbHRlclRvQVBJRmlsdGVyKCB0aGlzLnNlbGVjdF9sYXlvdXQgKTtcblx0XHRcdFx0XHRkZWZhdWx0X2FyZ3MuZmlsdGVyX3NvcnQgPSB0aGlzLnNlbGVjdF9sYXlvdXQuZGF0YS5maWx0ZXJfc29ydDtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRpb24uc2V0RGVmYXVsdEFyZ3MoIGRlZmF1bHRfYXJncyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5uYXZpZ2F0aW9uLnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmF2aWdhdGlvbl9kaXYuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5lZGl0X3ZpZXdfdWlfZGljICkge1xuXG5cdFx0XHQvL1NldCBhbGwgVUkgZmllbGQgdG8gY3VycmVudCBlZGl0IHJlb2NyZCwgd2UgbmVlZCB2YWxpZGF0ZSBhbGwgVUkgZmllbGxkIHdoZW4gc2F2ZSBhbmQgdmFsaWRhdGVcblx0XHRcdGlmICggIUdsb2JhbC5pc1NldCggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICkgJiYgIXRoaXMuaXNfbWFzc19lZGl0aW5nICkge1xuXHRcdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0TmF2aWdhdGlvbkFycm93c1N0YXR1cygpO1xuXHRcdHRoaXMuc2V0TmF2aWdhdGlvbkFycm93c0VuYWJsZWQoKTtcblxuXHRcdC8vIENyZWF0ZSB0aGlzIGZ1bmN0aW9uIGFsb25lIGJlY2F1c2Ugb2YgdGhlIGNvbHVtbiB2YWx1ZSBvZiB2aWV3IGlzIGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIsIHNvbWUgY29sdW1ucyBuZWVkIHRvIGJlIGhhbmRsZSBzcGVjaWFsbHkuIGFuZCBlYXNpbHkgdG8gcmV3cml0ZSB0aGlzIGZ1bmN0aW9uIGluIHN1Yi1jbGFzcy5cblxuXHRcdHRoaXMuc2V0Q3VycmVudEVkaXRSZWNvcmREYXRhKCk7XG5cblx0XHQvL0luaXQgKlBsZWFzZSBzYXZlIHRoaXMgcmVjb3JkIGJlZm9yZSBtb2RpZnlpbmcgYW55IHJlbGF0ZWQgZGF0YSogYm94XG5cdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5zYXZlLWFuZC1jb250aW51ZS1kaXYnICkuU2F2ZUFuZENvbnRpbnVlQm94KCB7IHJlbGF0ZWRfdmlld19jb250cm9sbGVyOiB0aGlzIH0gKTtcblx0XHR0aGlzLmVkaXRfdmlldy5maW5kKCAnLnNhdmUtYW5kLWNvbnRpbnVlLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cblx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3RhYi50YWJzKCAnb3B0aW9uJywgJ2FjdGl2ZScgKSA9PT0gMSApIHtcblx0XHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfYXVkaXQnICkuZmluZCggJy5maXJzdC1jb2x1bW4tc3ViLXZpZXcnICkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdFx0dGhpcy5pbml0U3ViTG9nVmlldyggJ3RhYl9hdWRpdCcgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9hdWRpdCcgKS5maW5kKCAnLmZpcnN0LWNvbHVtbi1zdWItdmlldycgKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcuc2F2ZS1hbmQtY29udGludWUtZGl2JyApLmNzcyggJ2Rpc3BsYXknLCAnYmxvY2snICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuc3dpdGNoVG9Qcm9wZXJUYWIoKTtcblx0fVxuXG5cdGFkZElkRmllbGRUb05hdmlnYXRpb24oIGFycmF5ICkge1xuXHRcdCQuZWFjaCggYXJyYXksIGZ1bmN0aW9uKCBrZXksIGl0ZW0gKSB7XG5cdFx0XHQkKCBpdGVtICkuZWFjaCggZnVuY3Rpb24oIGlfa2V5LCBpX2l0ZW0gKSB7XG5cdFx0XHRcdGlfaXRlbS5pZCA9IGlfaXRlbS5faWRfO1xuXHRcdFx0fSApO1xuXHRcdH0gKTtcblxuXHRcdHJldHVybiBhcnJheTtcblx0fVxuXG5cdGRvVmlld0FQSUNhbGwoIGZpbHRlciApIHtcblx0XHRyZXR1cm4gc3VwZXIuZG9WaWV3QVBJQ2FsbCggZmlsdGVyLCBbZmlsdGVyLCBmYWxzZSwgZmFsc2VdICk7XG5cdH1cblxuXHRoYW5kbGVWaWV3QVBJQ2FsbGJhY2tSZXN1bHQoIHJlc3VsdCApIHtcblx0XHRyZXR1cm4gdGhpcy5oYW5kbGVBUElDYWxsYmFja1Jlc3VsdCggcmVzdWx0ICk7XG5cdH1cblxuXHRoYW5kbGVBUElDYWxsYmFja1Jlc3VsdCggcmVzdWx0ICkge1xuXHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHR2YXIgcmVjb3JkX2lkID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRSZWNvcmQoKTtcblx0XHRyZXN1bHRfZGF0YSA9IEdsb2JhbC5nZXRQYXJlbnRJZEJ5VHJlZVJlY29yZCggR2xvYmFsLmJ1aWxkVHJlZVJlY29yZCggcmVzdWx0X2RhdGEgKSwgcmVjb3JkX2lkICk7XG5cdFx0cmVzdWx0X2RhdGEgPSByZXN1bHRfZGF0YVswXTtcblx0XHRyZXN1bHRfZGF0YS5pZCA9IHJlY29yZF9pZDtcblxuXHRcdHN1cGVyLmhhbmRsZVZpZXdBUElDYWxsYmFja1Jlc3VsdCggcmVzdWx0X2RhdGEgKTtcblx0fVxuXG5cdGhhbmRsZUVkaXRBUElDYWxsYmFja1Jlc3VsdCggcmVzdWx0ICkge1xuXHRcdHJldHVybiB0aGlzLmhhbmRsZUFQSUNhbGxiYWNrUmVzdWx0KCByZXN1bHQgKTtcblx0fVxuXG5cdG9uRGVsZXRlRG9uZSggcmVzdWx0ICkge1xuXHRcdHRoaXMuZ3JpZF9zZWxlY3RfaWRfYXJyYXkgPSBbXTtcblx0XHR0aGlzLnNldERlZmF1bHRNZW51KCk7XG5cdFx0dGhpcy5yZW1vdmVEZWxldGVkUm93cygpO1xuXHR9XG5cblx0b25TYXZlRG9uZSggcmVzdWx0ICkge1xuXHRcdHRoaXMuZ3JpZF9zZWxlY3RfaWRfYXJyYXkgPSBbXTtcblx0fVxuXG5cdGRvRWRpdEFQSUNhbGwoIGZpbHRlciApIHtcblx0XHRyZXR1cm4gc3VwZXIuZG9FZGl0QVBJQ2FsbCggZmlsdGVyLCBbZmlsdGVyLCBmYWxzZSwgZmFsc2VdICk7XG5cdH1cblxuXHRfY29udGludWVEb0NvcHlBc05ldygpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMuc2V0Q3VycmVudEVkaXRWaWV3U3RhdGUoICduZXcnICk7XG5cdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9kb2luZ19jb250ZXh0X2FjdGlvbiA9ICdjb3B5X2FzX25ldyc7XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5lZGl0X3ZpZXcgKSApIHtcblxuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkID0gJyc7XG5cdFx0XHR2YXIgbmF2aWdhdGlvbl9kaXYgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnLm5hdmlnYXRpb24tZGl2JyApO1xuXHRcdFx0bmF2aWdhdGlvbl9kaXYuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5zZXRFZGl0TWVudSgpO1xuXHRcdFx0dGhpcy5zZXRUYWJTdGF0dXMoKTtcblx0XHRcdHRoaXMuaXNfY2hhbmdlZCA9IGZhbHNlO1xuXHRcdFx0UHJvZ3Jlc3NCYXIuY2xvc2VPdmVybGF5KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGZpbHRlciA9IHt9O1xuXHRcdFx0dmFyIGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkgPSB0aGlzLmdldEdyaWRTZWxlY3RJZEFycmF5KCk7XG5cdFx0XHR2YXIgZ3JpZF9zZWxlY3RlZF9sZW5ndGggPSBncmlkX3NlbGVjdGVkX2lkX2FycmF5Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBncmlkX3NlbGVjdGVkX2xlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdHZhciBzZWxlY3RlZElkID0gZ3JpZF9zZWxlY3RlZF9pZF9hcnJheVswXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFRBbGVydE1hbmFnZXIuc2hvd0FsZXJ0KCAkLmkxOG4uXyggJ05vIHNlbGVjdGVkIHJlY29yZCcgKSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IHt9O1xuXG5cdFx0XHR0aGlzLmFwaVsnZ2V0JyArIHRoaXMuYXBpLmtleV9uYW1lXSggZmlsdGVyLCBmYWxzZSwgZmFsc2UsIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdHJlc3VsdF9kYXRhID0gR2xvYmFsLmJ1aWxkVHJlZVJlY29yZCggcmVzdWx0X2RhdGEgKTtcblx0XHRcdFx0XHRyZXN1bHRfZGF0YSA9IEdsb2JhbC5nZXRQYXJlbnRJZEJ5VHJlZVJlY29yZCggcmVzdWx0X2RhdGEsIHNlbGVjdGVkSWQgKTtcblxuXHRcdFx0XHRcdGlmICggIXJlc3VsdF9kYXRhICkge1xuXHRcdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoICQuaTE4bi5fKCAnUmVjb3JkIGRvZXMgbm90IGV4aXN0JyApICk7XG5cdFx0XHRcdFx0XHQkdGhpcy5vbkNhbmNlbENsaWNrKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JHRoaXMub3BlbkVkaXRWaWV3KCk7IC8vIFB1dCBpdCBoZXJlIGlzIHRvIGF2b2lkIGlmIHRoZSBzZWxlY3RlZCBvbmUgaXMgbm90IGV4aXN0ZWQgaW4gZGF0YSBvciBoYXZlIGRlbGV0ZWQgYnkgb3RoZXIgcHJhZ3JhbS4gaW4gdGhpcyBjYXNlLCB0aGUgZWRpdCB2aWV3IHNob3VsZCBub3QgYmUgb3BlbmQuXG5cblx0XHRcdFx0XHRyZXN1bHRfZGF0YSA9IHJlc3VsdF9kYXRhWzBdO1xuXHRcdFx0XHRcdGlmICggJHRoaXMuc3ViX3ZpZXdfbW9kZSAmJiAkdGhpcy5wYXJlbnRfa2V5ICkge1xuXHRcdFx0XHRcdFx0cmVzdWx0X2RhdGFbJHRoaXMucGFyZW50X2tleV0gPSAkdGhpcy5wYXJlbnRfdmFsdWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgPSAnJztcblxuXHRcdFx0XHRcdCR0aGlzLmluaXRFZGl0VmlldygpO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHRidWlsZEVkaXRWaWV3VUkoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdC8vICNWdWVDb250ZXh0TWVudSMgQWZ0ZXIgd2UgYWRkIHRoZSBlZGl0X3ZpZXcgdG8gdGhlIHBhZ2UgaW4gaW5pdEVkaXRWaWV3VUkoKSwgYWRkIHRoZSBjb250ZXh0IG1lbnUgKFZ1ZSBuZWVkcyBhIHZhbGlkIGlkIGluIGRvbSlcblx0XHRpZiggQ29udGV4dE1lbnVNYW5hZ2VyLmdldE1lbnUoIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0RGVidWcuV2FybiggJ0NvbnRleHQgTWVudSAoJysgdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkICsnKSBhbHJlYWR5IGV4aXN0cyBmb3I6ICcrIHRoaXMudmlld0lkLCAnQmFzZVRyZWVWaWV3Q29udHJvbGxlci5qcycsICdCYXNlVHJlZVZpZXdDb250cm9sbGVyJywgJ2J1aWxkRWRpdFZpZXdVSScsIDEwICk7XG5cdFx0fVxuXG5cdFx0Ly9ObyBuYXZpZ2F0aW9uIHdoZW4gZWRpdCBvbmx5IG1vZGVcblx0XHRpZiAoICF0aGlzLmVkaXRfb25seV9tb2RlICkge1xuXHRcdFx0dmFyIG5hdmlnYXRpb25fZGl2ID0gdGhpcy5lZGl0X3ZpZXcuZmluZCggJy5uYXZpZ2F0aW9uLWRpdicgKTtcblx0XHRcdHZhciBsYWJlbCA9IG5hdmlnYXRpb25fZGl2LmZpbmQoICcubmF2aWdhdGlvbi1sYWJlbCcgKTtcblxuXHRcdFx0dmFyIG5hdmlnYXRpb25fd2lkZ2V0X2RpdiA9IG5hdmlnYXRpb25fZGl2LmZpbmQoICcubmF2aWdhdGlvbi13aWRnZXQtZGl2JyApO1xuXG5cdFx0XHR0aGlzLm5hdmlnYXRpb24gPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGxhYmVsLnRleHQoIHRoaXMubmF2aWdhdGlvbl9sYWJlbCApO1xuXG5cdFx0XHRuYXZpZ2F0aW9uX3dpZGdldF9kaXYuYXBwZW5kKCB0aGlzLm5hdmlnYXRpb24gKTtcblx0XHR9XG5cblx0XHR0aGlzLmVkaXRfdmlld19jbG9zZV9pY29uID0gdGhpcy5lZGl0X3ZpZXcuZmluZCggJy5jbG9zZS1pY29uJyApO1xuXHRcdHRoaXMuZWRpdF92aWV3X2Nsb3NlX2ljb24uaGlkZSgpO1xuXHRcdHRoaXMuZWRpdF92aWV3X2Nsb3NlX2ljb24uY2xpY2soIGZ1bmN0aW9uKCkge1xuXHRcdFx0JHRoaXMub25DbG9zZUljb25DbGljaygpO1xuXHRcdH0gKTtcblxuXHRcdHZhciB0YWJfbW9kZWwgPSBBcnJheSgpO1xuXHRcdHRhYl9tb2RlbFt0aGlzLnByaW1hcnlfdGFiX2tleV0gPSB7ICdsYWJlbCc6IHRoaXMucHJpbWFyeV90YWJfbGFiZWwgfTtcblx0XHR0YWJfbW9kZWxbJ3RhYl9hdWRpdCddID0ge1xuXHRcdFx0J2xhYmVsJzogJC5pMThuLl8oICdBdWRpdCcgKSxcblx0XHRcdCdpbml0X2NhbGxiYWNrJzogJ2luaXRTdWJMb2dWaWV3Jyxcblx0XHRcdCdkaXNwbGF5X29uX21hc3NfZWRpdCc6IGZhbHNlLFxuXHRcdFx0J2Rpc3BsYXlfb25fYWRkJzogZmFsc2Vcblx0XHR9O1xuXHRcdHRoaXMuc2V0VGFiTW9kZWwoIHRhYl9tb2RlbCApO1xuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLkFDb21ib0JveCgge1xuXHRcdFx0aWQ6IHRoaXMuc2NyaXB0X25hbWUgKyAnX25hdmlnYXRpb24nLFxuXHRcdFx0dHJlZV9tb2RlOiB0cnVlLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3RyZWVfY29sdW1uJyxcblx0XHRcdG5hdmlnYXRpb25fbW9kZTogdHJ1ZSxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogZmFsc2UsXG5cdFx0XHRvbl90cmVlX2dyaWRfcm93X3NlbGVjdDogZnVuY3Rpb24oIGlkLCB0cmVlX21vZGVfY29sbGFwc2UgKSB7XG5cdFx0XHRcdCR0aGlzLm9uVHJlZUdyaWROYXZpZ2F0aW9uUm93U2VsZWN0KCBpZCwgdHJlZV9tb2RlX2NvbGxhcHNlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0dmFyIGxlZnRfY2xpY2sgPSBuYXZpZ2F0aW9uX2Rpdi5maW5kKCAnLmxlZnQtY2xpY2snICk7XG5cdFx0dmFyIHJpZ2h0X2NsaWNrID0gbmF2aWdhdGlvbl9kaXYuZmluZCggJy5yaWdodC1jbGljaycgKTtcblx0XHRsZWZ0X2NsaWNrLmF0dHIoICdzcmMnLCBHbG9iYWwuZ2V0UmVhbEltYWdlUGF0aCggJ2ltYWdlcy9sZWZ0X2Fycm93LnN2ZycgKSApO1xuXHRcdHJpZ2h0X2NsaWNrLmF0dHIoICdzcmMnLCBHbG9iYWwuZ2V0UmVhbEltYWdlUGF0aCggJ2ltYWdlcy9yaWdodF9hcnJvdy5zdmcnICkgKTtcblxuXHRcdHRoaXMuc2V0TmF2aWdhdGlvbigpO1xuXG5cdFx0Ly9UYWIgMCBzdGFydFxuXHRcdHZhciB0YWJfZ3JvdXAgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyMnICsgdGhpcy5wcmltYXJ5X3RhYl9rZXkgKTtcblxuXHRcdHZhciB0YWJfZ3JvdXBfY29sdW1uMSA9IHRhYl9ncm91cC5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX2dyb3VwX2NvbHVtbjEgKTtcblxuXHRcdC8vUGFyZW50XG5cdFx0Ly9Hcm91cFxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHR0cmVlX21vZGU6IHRydWUsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3RyZWVfY29sdW1uJyxcblx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdGZpZWxkOiAncGFyZW50X2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1BhcmVudCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZ3JvdXBfY29sdW1uMSwgJycgKTtcblxuXHRcdC8vTmFtZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICduYW1lJywgd2lkdGg6ICcxMDAlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdOYW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9ncm91cF9jb2x1bW4xLCAnJyApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LnBhcmVudCgpLndpZHRoKCAnNDUlJyApO1xuXHR9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1838\n")}}]);