TimeTrex/interface/html5/dist/datepicker-TDatePicker.bundle.js

1 line
37 KiB
JavaScript

(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["datepicker-TDatePicker"],{84:(__unused_webpack_module,__unused_webpack_exports,__webpack_require__)=>{eval("/* provided dependency */ var jQuery = __webpack_require__(9755);\n( function( $ ) {\n\n\t$.fn.TDatePicker = function( options ) {\n\t\tvar opts = $.extend( {}, $.fn.TDatePicker.defaults, options );\n\t\t//Global.addCss( 'global/widgets/datepicker/TDatePicker.css' );\n\n\t\tvar $this = this;\n\t\tvar field;\n\t\tvar validation_field;\n\t\tvar date_picker_input;\n\t\tvar icon;\n\t\tvar error_string = '';\n\t\tvar error_tip_box;\n\t\tvar mode = 'date';\n\t\tvar multiple; // This is used to test Punches -> Edit view Date\n\t\tvar mass_edit_mode = false;\n\t\tvar check_box = null;\n\t\tvar enabled = true;\n\t\tvar is_open = false;\n\t\tvar focus_out_timer;\n\t\tvar can_open = false; //default when the calender can be open, we only open it when click on the icon\n\t\tvar is_static_width = false;\n\n\t\tthis.getEnabled = function() {\n\t\t\treturn enabled;\n\t\t};\n\n\t\tthis.setEnabled = function( val ) {\n\t\t\tenabled = val;\n\t\t\tif ( val === false || val === '' ) {\n\t\t\t\t//$this.attr( 'disabled', 'true' );\n\t\t\t\tdate_picker_input.addClass( 't-date-picker-readonly' );\n\t\t\t\ticon.css( 'display', 'none' );\n\t\t\t\tdate_picker_input.attr( 'readonly', 'readonly' );\n\t\t\t\tif ( check_box ) {\n\t\t\t\t\tcheck_box.hide();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t//$this.removeAttr( 'disabled' );\n\t\t\t\tdate_picker_input.removeClass( 't-date-picker-readonly' );\n\t\t\t\ticon.css( 'display', 'inline' );\n\t\t\t\tdate_picker_input.removeAttr( 'readonly' );\n\t\t\t\tif ( check_box ) {\n\t\t\t\t\tcheck_box.show();\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setCheckBox = function( val ) {\n\t\t\tif ( check_box ) {\n\t\t\t\tcheck_box.children().eq( 0 )[0].checked = val;\n\t\t\t}\n\t\t};\n\n\t\tthis.isChecked = function() {\n\t\t\tif ( check_box ) {\n\t\t\t\tif ( check_box.children().eq( 0 )[0].checked === true ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tthis.setMassEditMode = function( val ) {\n\t\t\tmass_edit_mode = val;\n\n\t\t\tif ( mass_edit_mode ) {\n\t\t\t\tcheck_box = $( ' <div class=\"mass-edit-checkbox-wrapper\"><input type=\"checkbox\" class=\"mass-edit-checkbox\"></input>' +\n\t\t\t\t\t'<label for=\"checkbox-input-1\" class=\"input-helper input-helper--checkbox\"></label></div>' );\n\t\t\t\tcheck_box.insertBefore( $( this ) );\n\n\t\t\t\tcheck_box.change( function() {\n\t\t\t\t\t$this.trigger( 'formItemChange', [$this] );\n\t\t\t\t} );\n\n\t\t\t} else {\n\t\t\t\tif ( check_box ) {\n\t\t\t\t\tcheck_box.remove();\n\t\t\t\t\tcheck_box = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setErrorStyle = function( errStr, show, isWarning ) {\n\t\t\tif ( isWarning ) {\n\t\t\t\tdate_picker_input.addClass( 'warning-tip' );\n\t\t\t} else {\n\t\t\t\tdate_picker_input.addClass( 'error-tip' );\n\t\t\t}\n\t\t\terror_string = errStr;\n\n\t\t\tif ( show ) {\n\t\t\t\tthis.showErrorTip();\n\t\t\t}\n\t\t};\n\n\t\tthis.showErrorTip = function( sec ) {\n\n\t\t\tif ( !Global.isSet( sec ) ) {\n\t\t\t\tsec = 2;\n\t\t\t}\n\n\t\t\tif ( !error_tip_box ) {\n\t\t\t\terror_tip_box = Global.loadWidgetByName( WidgetNamesDic.ERROR_TOOLTIP );\n\t\t\t\terror_tip_box = error_tip_box.ErrorTipBox();\n\t\t\t}\n\t\t\tif ( date_picker_input.hasClass( 'warning-tip' ) ) {\n\t\t\t\terror_tip_box.show( this, error_string, sec, true );\n\t\t\t} else {\n\t\t\t\terror_tip_box.show( this, error_string, sec );\n\t\t\t}\n\t\t};\n\n\t\tthis.hideErrorTip = function() {\n\n\t\t\tif ( Global.isSet( error_tip_box ) ) {\n\t\t\t\terror_tip_box.remove();\n\t\t\t}\n\n\t\t};\n\n\t\t// Error: TypeError: date_picker_input is undefined in /interface/html5/global/widgets/datepicker/TDatePicker.js?v=8.0.3-20150313-161037 line 122\n\t\tthis.clearErrorStyle = function() {\n\t\t\tif ( !date_picker_input ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdate_picker_input.removeClass( 'error-tip' );\n\t\t\tdate_picker_input.removeClass( 'warning-tip' );\n\t\t\tthis.hideErrorTip();\n\t\t\terror_string = '';\n\t\t};\n\n\t\tthis.getField = function() {\n\t\t\treturn field;\n\t\t};\n\n\t\tthis.getValidationField = function() {\n\t\t\treturn validation_field;\n\t\t};\n\n\t\tthis.getDefaultFormatValue = function() {\n\t\t\t// Error: Uncaught TypeError: Cannot read property 'val' of undefined in interface/html5/global/widgets/datepicker/TDatePicker.js?v=9.0.5-20151222-162114 line 145\n\t\t\tvar val = date_picker_input ? date_picker_input.val() : null;\n\t\t\t//Error: Uncaught TypeError: Cannot read property 'format' of null in interface/html5/global/widgets/datepicker/TDatePicker.js?v=9.0.0-20150909-213207 line 140\n\t\t\tval = Global.strToDate( val ) && Global.strToDate( val ).format( 'YYYY-MM-DD' );\n\n\t\t\treturn val;\n\t\t};\n\n\t\tthis.setPlaceHolder = function( val ) {\n\t\t\tdate_picker_input.attr( 'placeholder', val );\n\t\t};\n\n\t\tthis.getValue = function() {\n\t\t\t// This is used to test Punches -> Edit view Date\n\t\t\tif ( multiple ) {\n\t\t\t\treturn [date_picker_input.val()];\n\t\t\t}\n\n\t\t\treturn date_picker_input.val();\n\t\t};\n\n\t\tthis.setValue = function( val ) {\n\t\t\t//Error: Uncaught TypeError: Cannot read property 'val' of undefined in /interface/html5/global/widgets/datepicker/TDatePicker.js?v=8.0.0-20141230-130626 line 144\n\t\t\tif ( !date_picker_input ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !val ) {\n\t\t\t\tval = '';\n\t\t\t}\n\t\t\tdate_picker_input.val( val );\n\t\t\tthis.autoResize();\n\t\t};\n\n\t\tthis.setDefaultWidgetValue = function() {\n\t\t\tif ( $( this ).attr( 'widget-value' ) ) {\n\t\t\t\tthis.setValue( $( this ).attr( 'widget-value' ) );\n\t\t\t}\n\t\t};\n\n\t\tthis.autoResize = function() {\n\t\t\tvar content_width, example_width, example_display;\n\t\t\tif ( LocalCacheData.getLoginUserPreference() ) {\n\t\t\t\texample_display = LocalCacheData.getLoginUserPreference().date_format_display;\n\t\t\t} else {\n\t\t\t\texample_display = 'dd-mmm-yy';\n\t\t\t}\n\t\t\tif ( !is_static_width ) {\n\t\t\t\tif ( mode === 'date' ) {\n\t\t\t\t\texample_width = Global.calculateTextWidth( example_display );\n\t\t\t\t} else if ( mode === 'date_time' ) {\n\t\t\t\t\texample_width = Global.calculateTextWidth( example_display + ' ' + LocalCacheData.getLoginUserPreference().time_format_display );\n\t\t\t\t}\n\t\t\t\tcontent_width = Global.calculateTextWidth( date_picker_input.val(), {\n\t\t\t\t\tmin_width: example_width,\n\t\t\t\t\tmax_width: ( example_width + 100 ),\n\t\t\t\t\tpadding: 28\n\t\t\t\t} );\n\t\t\t\t$this.width( content_width + 'px' );\n\t\t\t}\n\t\t};\n\n\t\tthis.each( function() {\n\t\t\tvar o = $.meta ? $.extend( {}, opts, $( this ).data() ) : opts;\n\t\t\tfield = o.field;\n\t\t\tif ( o.validation_field ) {\n\t\t\t\tvalidation_field = o.validation_field;\n\t\t\t}\n\t\t\tmultiple = o.multiple; // This is used to test Punches -> Edit view Date\n\t\t\tif ( Global.isSet( o.mode ) ) {\n\t\t\t\tmode = o.mode;\n\t\t\t}\n\t\t\ticon = $( this ).find( '.t-date-picker-icon' );\n\t\t\tdate_picker_input = $( this ).find( '.t-date-picker' );\n\t\t\ticon.attr( 'src', Global.getRealImagePath( 'images/cal.png' ) );\n\n\t\t\ticon.bind( 'mousedown', function( e ) {\n\t\t\t\te.stopPropagation(); //Stop jquery-ui datepickers own mousedown event from firing, which cause the date picker to close, then the below 'mouseup' event opens it again.\n\t\t\t} );\n\n\t\t\ticon.bind( 'mouseup', function() { //Need to use 'mouseup' event as main.js binds 'mousedown' for closing when clicked off.\n\t\t\t\tif ( !enabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( !is_open ) {\n\t\t\t\t\tdate_picker_input.datepicker( 'show' );\n\t\t\t\t\tis_open = true;\n\t\t\t\t} else {\n\t\t\t\t\tdate_picker_input.datepicker( 'hide' );\n\t\t\t\t\tis_open = false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tvar time_format = 'h:mm TT';\n\t\t\tvar format = 'dd-M-y';\n\t\t\t// When portal mode, no user preference.\n\t\t\tif ( LocalCacheData.getLoginUserPreference() ) {\n\t\t\t\tformat = LocalCacheData.getLoginUserPreference().date_format_1;\n\t\t\t\ttime_format = LocalCacheData.getLoginUserPreference().time_format_1;\n\t\t\t}\n\t\t\tvar day_name_min = [\n\t\t\t\t$.i18n._( 'Sun' ), $.i18n._( 'Mon' ), $.i18n._( 'Tue' ),\n\t\t\t\t$.i18n._( 'Wed' ), $.i18n._( 'Thu' ), $.i18n._( 'Fri' ), $.i18n._( 'Sat' )\n\t\t\t];\n\t\t\tvar month_name_short = [\n\t\t\t\t$.i18n._( 'Jan' ), $.i18n._( 'Feb' ),\n\t\t\t\t$.i18n._( 'Mar' ), $.i18n._( 'Apr' ), $.i18n._( 'May' ),\n\t\t\t\t$.i18n._( 'Jun' ), $.i18n._( 'Jul' ), $.i18n._( 'Aug' ),\n\t\t\t\t$.i18n._( 'Sep' ), $.i18n._( 'Oct' ), $.i18n._( 'Nov' ),\n\t\t\t\t$.i18n._( 'Dec' )\n\t\t\t];\n\t\t\tvar current_text = $.i18n._( 'Today' );\n\t\t\tvar close_text = $.i18n._( 'Close' );\n\n\t\t\t$.datepicker._gotoToday = function( id ) {\n\t\t\t\t//This fixes JS exception when using the \"TODAY\" button in the date pickers: Uncaught TypeError: Cannot read property 'selectedYear' of undefined\n\t\t\t\t$( id ).datepicker( 'setDate', new Date() ).datepicker( 'hide' ).change();\n\n\t\t\t\t// var target = $( id );\n\t\t\t\t// var inst = this._getInst( target[0] );\n\t\t\t\t// if ( this._get( inst, 'gotoCurrent' ) && inst.currentDay ) {\n\t\t\t\t// \tinst.selectedDay = inst.currentDay;\n\t\t\t\t// \tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\t\t// \tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t\t\t// }\n\t\t\t\t// else {\n\t\t\t\t// \tvar date = new Date();\n\t\t\t\t// \tinst.selectedDay = date.getDate();\n\t\t\t\t// \tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\t\t// \tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t\t\t// \t// the below two lines are new\n\t\t\t\t// \tthis._setDateDatepicker( target, date );\n\t\t\t\t// \tthis._selectDate( id, this._getDateDatepicker( target ) );\n\t\t\t\t// \t$( target ).datepicker( 'setDate', date );\n\t\t\t\t// }\n\t\t\t\t// this._notifyChange( inst );\n\t\t\t\t// this._adjustDate( target );\n\t\t\t};\n\n\t\t\tif ( mode === 'date' ) {\n\t\t\t\tdate_picker_input = date_picker_input.datepicker( {\n\t\t\t\t\tshowOtherMonths: true,\n\t\t\t\t\tselectOtherMonths: true,\n\t\t\t\t\tshowTime: false,\n\t\t\t\t\tdateFormat: format,\n\t\t\t\t\tshowHour: false,\n\t\t\t\t\tshowMinute: false,\n\t\t\t\t\tchangeMonth: true,\n\t\t\t\t\tchangeYear: true,\n\t\t\t\t\tshowButtonPanel: true,\n\t\t\t\t\tduration: '',\n\t\t\t\t\tshowAnim: '',\n\t\t\t\t\tyearRange: '-100:+10',\n\t\t\t\t\tshowOn: '',\n\t\t\t\t\tdayNamesMin: day_name_min,\n\t\t\t\t\tcurrentText: current_text,\n\t\t\t\t\tmonthNamesShort: month_name_short,\n\t\t\t\t\tcloseText: close_text,\n\t\t\t\t\tbeforeShow: function() {\n\t\t\t\t\t\tif ( o.beforeShow ) {\n\t\t\t\t\t\t\to.beforeShow();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tonClose: function() {\n\t\t\t\t\t\tis_open = false;\n\t\t\t\t\t\t$this.autoResize();\n\t\t\t\t\t\tif ( o.onClose ) {\n\t\t\t\t\t\t\to.onClose();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t//#2353 - removed because it breaks the month navigation buttons\n\t\t\t\t\t// onChangeMonthYear: function( year, month, args ) {\n\t\t\t\t\t// \tvar day = $.datepicker.formatDate( 'dd', $( this ).datepicker( 'getDate' ) );\n\t\t\t\t\t// \t$( this ).val( $.datepicker.formatDate( format, new Date( year, month - 1, day ) ) );\n\t\t\t\t\t// }\n\n\t\t\t\t} );\n\n\t\t\t\t// Portal mode, no user preference.\n\t\t\t\tif ( LocalCacheData.getLoginUserPreference() ) {\n\t\t\t\t\t$this.setPlaceHolder( LocalCacheData.getLoginUserPreference().date_format_display );\n\t\t\t\t} else {\n\t\t\t\t\t$this.setPlaceHolder( 'dd-mmm-yy' );\n\t\t\t\t}\n\n\t\t\t} else if ( mode === 'date_time' ) {\n\t\t\t\tdate_picker_input = date_picker_input.datetimepicker( {\n\t\t\t\t\tshowOtherMonths: true,\n\t\t\t\t\tselectOtherMonths: true,\n\t\t\t\t\tdateFormat: format,\n\t\t\t\t\ttimeFormat: time_format,\n\t\t\t\t\tshowTime: true,\n\t\t\t\t\tshowHour: true,\n\t\t\t\t\tshowMinute: true,\n\t\t\t\t\tchangeMonth: true,\n\t\t\t\t\tchangeYear: true,\n\t\t\t\t\tshowButtonPanel: true,\n\t\t\t\t\tduration: '',\n\t\t\t\t\tshowAnim: '',\n\t\t\t\t\tshowOn: '',\n\t\t\t\t\tyearRange: '-100:+10',\n\t\t\t\t\tcloseText: close_text,\n\t\t\t\t\tdayNamesMin: day_name_min,\n\t\t\t\t\tmonthNamesShort: month_name_short,\n\t\t\t\t\tcurrentText: current_text,\n\t\t\t\t\tonClose: function() {\n\t\t\t\t\t\tis_open = false;\n\t\t\t\t\t\t$this.autoResize();\n\t\t\t\t\t\tif ( o.onClose ) {\n\t\t\t\t\t\t\to.onClose();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$this.setPlaceHolder( LocalCacheData.loginUserPreference.date_format_display + ' ' + LocalCacheData.loginUserPreference.time_format_display );\n\t\t\t}\n\n\t\t\tdate_picker_input.change( function() {\n\t\t\t\tif ( check_box ) {\n\t\t\t\t\t$this.setCheckBox( true );\n\t\t\t\t}\n\n\t\t\t\t$this.trigger( 'formItemChange', [$this] );\n\t\t\t\t$this.autoResize();\n\t\t\t} );\n\n\t\t\tdate_picker_input.mouseover( function() {\n\n\t\t\t\tif ( enabled ) {\n\t\t\t\t\tif ( error_string && error_string.length > 0 ) {\n\t\t\t\t\t\t$this.showErrorTip( 20 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tdate_picker_input.mouseout( function() {\n\t\t\t\tif ( !$( $this ).is( ':focus' ) ) {\n\t\t\t\t\t$this.hideErrorTip();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tdate_picker_input.focusin( function( e ) {\n\t\t\t\tif ( !enabled ) {\n\t\t\t\t\tif ( !check_box ) {\n\t\t\t\t\t\tif ( LocalCacheData.current_open_sub_controller &&\n\t\t\t\t\t\t\tLocalCacheData.current_open_sub_controller.edit_view &&\n\t\t\t\t\t\t\tLocalCacheData.current_open_sub_controller.is_viewing ) {\n\t\t\t\t\t\t\terror_string = LocalCacheData.current_open_sub_controller.getViewModeErrorMessage();\n\t\t\t\t\t\t\t$this.showErrorTip( 10 );\n\t\t\t\t\t\t} else if ( LocalCacheData.current_open_primary_controller &&\n\t\t\t\t\t\t\tLocalCacheData.current_open_primary_controller.edit_view &&\n\t\t\t\t\t\t\tLocalCacheData.current_open_primary_controller.is_viewing ) {\n\t\t\t\t\t\t\terror_string = LocalCacheData.current_open_primary_controller.getViewModeErrorMessage();\n\t\t\t\t\t\t\t$this.showErrorTip( 10 );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tif ( error_string && error_string.length > 0 ) {\n\t\t\t\t\t\t$this.showErrorTip( 20 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tdate_picker_input.focusout( function() {\n\t\t\t\t$this.hideErrorTip();\n\n\t\t\t} );\n\n\t\t\tif ( o.width > 0 ) {\n\t\t\t\t$this.width( o.width );\n\t\t\t\tis_static_width = true;\n\t\t\t} else {\n\t\t\t\t$this.autoResize();\n\t\t\t\tis_static_width = false;\n\t\t\t}\n\n\t\t\t$this.setDefaultWidgetValue();\n\n\t\t} );\n\n\t\treturn this;\n\n\t};\n\n\t$.fn.TDatePicker.defaults = {};\n\t$.fn.TDatePicker.html_template = `\n\t<div class=\"t-date-picker-div\">\n\t\t<input class=\"t-date-picker\" type=\"text\"/>\n\t\t<img id=\"tDatePickerIcon\" class=\"t-date-picker-icon\"/>\n\t</div>\n\t`;\n\n} )( jQuery );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJtYXBwaW5ncyI6IjtBQUFBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07O0FBRU4sS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QixLQUFLOztBQUVMLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxJQUFJOztBQUVKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsR0FBRyxNQUFNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L2dsb2JhbC93aWRnZXRzL2RhdGVwaWNrZXIvVERhdGVQaWNrZXIuanM/OGQ3NSJdLCJzb3VyY2VzQ29udGVudCI6WyIoIGZ1bmN0aW9uKCAkICkge1xuXG5cdCQuZm4uVERhdGVQaWNrZXIgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIgb3B0cyA9ICQuZXh0ZW5kKCB7fSwgJC5mbi5URGF0ZVBpY2tlci5kZWZhdWx0cywgb3B0aW9ucyApO1xuXHRcdC8vR2xvYmFsLmFkZENzcyggJ2dsb2JhbC93aWRnZXRzL2RhdGVwaWNrZXIvVERhdGVQaWNrZXIuY3NzJyApO1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgZmllbGQ7XG5cdFx0dmFyIHZhbGlkYXRpb25fZmllbGQ7XG5cdFx0dmFyIGRhdGVfcGlja2VyX2lucHV0O1xuXHRcdHZhciBpY29uO1xuXHRcdHZhciBlcnJvcl9zdHJpbmcgPSAnJztcblx0XHR2YXIgZXJyb3JfdGlwX2JveDtcblx0XHR2YXIgbW9kZSA9ICdkYXRlJztcblx0XHR2YXIgbXVsdGlwbGU7IC8vIFRoaXMgaXMgdXNlZCB0byB0ZXN0IFB1bmNoZXMgLT4gRWRpdCB2aWV3IERhdGVcblx0XHR2YXIgbWFzc19lZGl0X21vZGUgPSBmYWxzZTtcblx0XHR2YXIgY2hlY2tfYm94ID0gbnVsbDtcblx0XHR2YXIgZW5hYmxlZCA9IHRydWU7XG5cdFx0dmFyIGlzX29wZW4gPSBmYWxzZTtcblx0XHR2YXIgZm9jdXNfb3V0X3RpbWVyO1xuXHRcdHZhciBjYW5fb3BlbiA9IGZhbHNlOyAvL2RlZmF1bHQgd2hlbiB0aGUgY2FsZW5kZXIgY2FuIGJlIG9wZW4sIHdlIG9ubHkgb3BlbiBpdCB3aGVuIGNsaWNrIG9uIHRoZSBpY29uXG5cdFx0dmFyIGlzX3N0YXRpY193aWR0aCA9IGZhbHNlO1xuXG5cdFx0dGhpcy5nZXRFbmFibGVkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZW5hYmxlZDtcblx0XHR9O1xuXG5cdFx0dGhpcy5zZXRFbmFibGVkID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdGVuYWJsZWQgPSB2YWw7XG5cdFx0XHRpZiAoIHZhbCA9PT0gZmFsc2UgfHwgdmFsID09PSAnJyApIHtcblx0XHRcdFx0Ly8kdGhpcy5hdHRyKCAnZGlzYWJsZWQnLCAndHJ1ZScgKTtcblx0XHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQuYWRkQ2xhc3MoICd0LWRhdGUtcGlja2VyLXJlYWRvbmx5JyApO1xuXHRcdFx0XHRpY29uLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQuYXR0ciggJ3JlYWRvbmx5JywgJ3JlYWRvbmx5JyApO1xuXHRcdFx0XHRpZiAoIGNoZWNrX2JveCApIHtcblx0XHRcdFx0XHRjaGVja19ib3guaGlkZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyR0aGlzLnJlbW92ZUF0dHIoICdkaXNhYmxlZCcgKTtcblx0XHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQucmVtb3ZlQ2xhc3MoICd0LWRhdGUtcGlja2VyLXJlYWRvbmx5JyApO1xuXHRcdFx0XHRpY29uLmNzcyggJ2Rpc3BsYXknLCAnaW5saW5lJyApO1xuXHRcdFx0XHRkYXRlX3BpY2tlcl9pbnB1dC5yZW1vdmVBdHRyKCAncmVhZG9ubHknICk7XG5cdFx0XHRcdGlmICggY2hlY2tfYm94ICkge1xuXHRcdFx0XHRcdGNoZWNrX2JveC5zaG93KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH07XG5cblx0XHR0aGlzLnNldENoZWNrQm94ID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdGlmICggY2hlY2tfYm94ICkge1xuXHRcdFx0XHRjaGVja19ib3guY2hpbGRyZW4oKS5lcSggMCApWzBdLmNoZWNrZWQgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRoaXMuaXNDaGVja2VkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNoZWNrX2JveCApIHtcblx0XHRcdFx0aWYgKCBjaGVja19ib3guY2hpbGRyZW4oKS5lcSggMCApWzBdLmNoZWNrZWQgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHR0aGlzLnNldE1hc3NFZGl0TW9kZSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRtYXNzX2VkaXRfbW9kZSA9IHZhbDtcblxuXHRcdFx0aWYgKCBtYXNzX2VkaXRfbW9kZSApIHtcblx0XHRcdFx0Y2hlY2tfYm94ID0gJCggJyA8ZGl2IGNsYXNzPVwibWFzcy1lZGl0LWNoZWNrYm94LXdyYXBwZXJcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJtYXNzLWVkaXQtY2hlY2tib3hcIj48L2lucHV0PicgK1xuXHRcdFx0XHRcdCc8bGFiZWwgZm9yPVwiY2hlY2tib3gtaW5wdXQtMVwiIGNsYXNzPVwiaW5wdXQtaGVscGVyIGlucHV0LWhlbHBlci0tY2hlY2tib3hcIj48L2xhYmVsPjwvZGl2PicgKTtcblx0XHRcdFx0Y2hlY2tfYm94Lmluc2VydEJlZm9yZSggJCggdGhpcyApICk7XG5cblx0XHRcdFx0Y2hlY2tfYm94LmNoYW5nZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0JHRoaXMudHJpZ2dlciggJ2Zvcm1JdGVtQ2hhbmdlJywgWyR0aGlzXSApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICggY2hlY2tfYm94ICkge1xuXHRcdFx0XHRcdGNoZWNrX2JveC5yZW1vdmUoKTtcblx0XHRcdFx0XHRjaGVja19ib3ggPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dGhpcy5zZXRFcnJvclN0eWxlID0gZnVuY3Rpb24oIGVyclN0ciwgc2hvdywgaXNXYXJuaW5nICkge1xuXHRcdFx0aWYgKCBpc1dhcm5pbmcgKSB7XG5cdFx0XHRcdGRhdGVfcGlja2VyX2lucHV0LmFkZENsYXNzKCAnd2FybmluZy10aXAnICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRlX3BpY2tlcl9pbnB1dC5hZGRDbGFzcyggJ2Vycm9yLXRpcCcgKTtcblx0XHRcdH1cblx0XHRcdGVycm9yX3N0cmluZyA9IGVyclN0cjtcblxuXHRcdFx0aWYgKCBzaG93ICkge1xuXHRcdFx0XHR0aGlzLnNob3dFcnJvclRpcCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLnNob3dFcnJvclRpcCA9IGZ1bmN0aW9uKCBzZWMgKSB7XG5cblx0XHRcdGlmICggIUdsb2JhbC5pc1NldCggc2VjICkgKSB7XG5cdFx0XHRcdHNlYyA9IDI7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggIWVycm9yX3RpcF9ib3ggKSB7XG5cdFx0XHRcdGVycm9yX3RpcF9ib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggV2lkZ2V0TmFtZXNEaWMuRVJST1JfVE9PTFRJUCApO1xuXHRcdFx0XHRlcnJvcl90aXBfYm94ID0gZXJyb3JfdGlwX2JveC5FcnJvclRpcEJveCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBkYXRlX3BpY2tlcl9pbnB1dC5oYXNDbGFzcyggJ3dhcm5pbmctdGlwJyApICkge1xuXHRcdFx0XHRlcnJvcl90aXBfYm94LnNob3coIHRoaXMsIGVycm9yX3N0cmluZywgc2VjLCB0cnVlICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlcnJvcl90aXBfYm94LnNob3coIHRoaXMsIGVycm9yX3N0cmluZywgc2VjICk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHRoaXMuaGlkZUVycm9yVGlwID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBlcnJvcl90aXBfYm94ICkgKSB7XG5cdFx0XHRcdGVycm9yX3RpcF9ib3gucmVtb3ZlKCk7XG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0Ly8gRXJyb3I6IFR5cGVFcnJvcjogZGF0ZV9waWNrZXJfaW5wdXQgaXMgdW5kZWZpbmVkIGluIC9pbnRlcmZhY2UvaHRtbDUvZ2xvYmFsL3dpZGdldHMvZGF0ZXBpY2tlci9URGF0ZVBpY2tlci5qcz92PTguMC4zLTIwMTUwMzEzLTE2MTAzNyBsaW5lIDEyMlxuXHRcdHRoaXMuY2xlYXJFcnJvclN0eWxlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFkYXRlX3BpY2tlcl9pbnB1dCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQucmVtb3ZlQ2xhc3MoICdlcnJvci10aXAnICk7XG5cdFx0XHRkYXRlX3BpY2tlcl9pbnB1dC5yZW1vdmVDbGFzcyggJ3dhcm5pbmctdGlwJyApO1xuXHRcdFx0dGhpcy5oaWRlRXJyb3JUaXAoKTtcblx0XHRcdGVycm9yX3N0cmluZyA9ICcnO1xuXHRcdH07XG5cblx0XHR0aGlzLmdldEZpZWxkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZmllbGQ7XG5cdFx0fTtcblxuXHRcdHRoaXMuZ2V0VmFsaWRhdGlvbkZpZWxkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdmFsaWRhdGlvbl9maWVsZDtcblx0XHR9O1xuXG5cdFx0dGhpcy5nZXREZWZhdWx0Rm9ybWF0VmFsdWUgPSBmdW5jdGlvbigpIHtcblx0XHRcdC8vIEVycm9yOiBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICd2YWwnIG9mIHVuZGVmaW5lZCBpbiBpbnRlcmZhY2UvaHRtbDUvZ2xvYmFsL3dpZGdldHMvZGF0ZXBpY2tlci9URGF0ZVBpY2tlci5qcz92PTkuMC41LTIwMTUxMjIyLTE2MjExNCBsaW5lIDE0NVxuXHRcdFx0dmFyIHZhbCA9IGRhdGVfcGlja2VyX2lucHV0ID8gZGF0ZV9waWNrZXJfaW5wdXQudmFsKCkgOiBudWxsO1xuXHRcdFx0Ly9FcnJvcjogVW5jYXVnaHQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0eSAnZm9ybWF0JyBvZiBudWxsIGluIGludGVyZmFjZS9odG1sNS9nbG9iYWwvd2lkZ2V0cy9kYXRlcGlja2VyL1REYXRlUGlja2VyLmpzP3Y9OS4wLjAtMjAxNTA5MDktMjEzMjA3IGxpbmUgMTQwXG5cdFx0XHR2YWwgPSBHbG9iYWwuc3RyVG9EYXRlKCB2YWwgKSAmJiBHbG9iYWwuc3RyVG9EYXRlKCB2YWwgKS5mb3JtYXQoICdZWVlZLU1NLUREJyApO1xuXG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH07XG5cblx0XHR0aGlzLnNldFBsYWNlSG9sZGVyID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdGRhdGVfcGlja2VyX2lucHV0LmF0dHIoICdwbGFjZWhvbGRlcicsIHZhbCApO1xuXHRcdH07XG5cblx0XHR0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBUaGlzIGlzIHVzZWQgdG8gdGVzdCBQdW5jaGVzIC0+IEVkaXQgdmlldyBEYXRlXG5cdFx0XHRpZiAoIG11bHRpcGxlICkge1xuXHRcdFx0XHRyZXR1cm4gW2RhdGVfcGlja2VyX2lucHV0LnZhbCgpXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGVfcGlja2VyX2lucHV0LnZhbCgpO1xuXHRcdH07XG5cblx0XHR0aGlzLnNldFZhbHVlID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdC8vRXJyb3I6IFVuY2F1Z2h0IFR5cGVFcnJvcjogQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3ZhbCcgb2YgdW5kZWZpbmVkIGluIC9pbnRlcmZhY2UvaHRtbDUvZ2xvYmFsL3dpZGdldHMvZGF0ZXBpY2tlci9URGF0ZVBpY2tlci5qcz92PTguMC4wLTIwMTQxMjMwLTEzMDYyNiBsaW5lIDE0NFxuXHRcdFx0aWYgKCAhZGF0ZV9waWNrZXJfaW5wdXQgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICggIXZhbCApIHtcblx0XHRcdFx0dmFsID0gJyc7XG5cdFx0XHR9XG5cdFx0XHRkYXRlX3BpY2tlcl9pbnB1dC52YWwoIHZhbCApO1xuXHRcdFx0dGhpcy5hdXRvUmVzaXplKCk7XG5cdFx0fTtcblxuXHRcdHRoaXMuc2V0RGVmYXVsdFdpZGdldFZhbHVlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICQoIHRoaXMgKS5hdHRyKCAnd2lkZ2V0LXZhbHVlJyApICkge1xuXHRcdFx0XHR0aGlzLnNldFZhbHVlKCAkKCB0aGlzICkuYXR0ciggJ3dpZGdldC12YWx1ZScgKSApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmF1dG9SZXNpemUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBjb250ZW50X3dpZHRoLCBleGFtcGxlX3dpZHRoLCBleGFtcGxlX2Rpc3BsYXk7XG5cdFx0XHRpZiAoIExvY2FsQ2FjaGVEYXRhLmdldExvZ2luVXNlclByZWZlcmVuY2UoKSApIHtcblx0XHRcdFx0ZXhhbXBsZV9kaXNwbGF5ID0gTG9jYWxDYWNoZURhdGEuZ2V0TG9naW5Vc2VyUHJlZmVyZW5jZSgpLmRhdGVfZm9ybWF0X2Rpc3BsYXk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleGFtcGxlX2Rpc3BsYXkgPSAnZGQtbW1tLXl5Jztcblx0XHRcdH1cblx0XHRcdGlmICggIWlzX3N0YXRpY193aWR0aCApIHtcblx0XHRcdFx0aWYgKCBtb2RlID09PSAnZGF0ZScgKSB7XG5cdFx0XHRcdFx0ZXhhbXBsZV93aWR0aCA9IEdsb2JhbC5jYWxjdWxhdGVUZXh0V2lkdGgoIGV4YW1wbGVfZGlzcGxheSApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBtb2RlID09PSAnZGF0ZV90aW1lJyApIHtcblx0XHRcdFx0XHRleGFtcGxlX3dpZHRoID0gR2xvYmFsLmNhbGN1bGF0ZVRleHRXaWR0aCggZXhhbXBsZV9kaXNwbGF5ICsgJyAnICsgTG9jYWxDYWNoZURhdGEuZ2V0TG9naW5Vc2VyUHJlZmVyZW5jZSgpLnRpbWVfZm9ybWF0X2Rpc3BsYXkgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250ZW50X3dpZHRoID0gR2xvYmFsLmNhbGN1bGF0ZVRleHRXaWR0aCggZGF0ZV9waWNrZXJfaW5wdXQudmFsKCksIHtcblx0XHRcdFx0XHRtaW5fd2lkdGg6IGV4YW1wbGVfd2lkdGgsXG5cdFx0XHRcdFx0bWF4X3dpZHRoOiAoIGV4YW1wbGVfd2lkdGggKyAxMDAgKSxcblx0XHRcdFx0XHRwYWRkaW5nOiAyOFxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCR0aGlzLndpZHRoKCBjb250ZW50X3dpZHRoICsgJ3B4JyApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG8gPSAkLm1ldGEgPyAkLmV4dGVuZCgge30sIG9wdHMsICQoIHRoaXMgKS5kYXRhKCkgKSA6IG9wdHM7XG5cdFx0XHRmaWVsZCA9IG8uZmllbGQ7XG5cdFx0XHRpZiAoIG8udmFsaWRhdGlvbl9maWVsZCApIHtcblx0XHRcdFx0dmFsaWRhdGlvbl9maWVsZCA9IG8udmFsaWRhdGlvbl9maWVsZDtcblx0XHRcdH1cblx0XHRcdG11bHRpcGxlID0gby5tdWx0aXBsZTsgLy8gVGhpcyBpcyB1c2VkIHRvIHRlc3QgUHVuY2hlcyAtPiBFZGl0IHZpZXcgRGF0ZVxuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIG8ubW9kZSApICkge1xuXHRcdFx0XHRtb2RlID0gby5tb2RlO1xuXHRcdFx0fVxuXHRcdFx0aWNvbiA9ICQoIHRoaXMgKS5maW5kKCAnLnQtZGF0ZS1waWNrZXItaWNvbicgKTtcblx0XHRcdGRhdGVfcGlja2VyX2lucHV0ID0gJCggdGhpcyApLmZpbmQoICcudC1kYXRlLXBpY2tlcicgKTtcblx0XHRcdGljb24uYXR0ciggJ3NyYycsIEdsb2JhbC5nZXRSZWFsSW1hZ2VQYXRoKCAnaW1hZ2VzL2NhbC5wbmcnICkgKTtcblxuXHRcdFx0aWNvbi5iaW5kKCAnbW91c2Vkb3duJywgZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vU3RvcCBqcXVlcnktdWkgZGF0ZXBpY2tlcnMgb3duIG1vdXNlZG93biBldmVudCBmcm9tIGZpcmluZywgd2hpY2ggY2F1c2UgdGhlIGRhdGUgcGlja2VyIHRvIGNsb3NlLCB0aGVuIHRoZSBiZWxvdyAnbW91c2V1cCcgZXZlbnQgb3BlbnMgaXQgYWdhaW4uXG5cdFx0XHR9ICk7XG5cblx0XHRcdGljb24uYmluZCggJ21vdXNldXAnLCBmdW5jdGlvbigpIHsgLy9OZWVkIHRvIHVzZSAnbW91c2V1cCcgZXZlbnQgYXMgbWFpbi5qcyBiaW5kcyAnbW91c2Vkb3duJyBmb3IgY2xvc2luZyB3aGVuIGNsaWNrZWQgb2ZmLlxuXHRcdFx0XHRpZiAoICFlbmFibGVkICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggIWlzX29wZW4gKSB7XG5cdFx0XHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQuZGF0ZXBpY2tlciggJ3Nob3cnICk7XG5cdFx0XHRcdFx0aXNfb3BlbiA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQuZGF0ZXBpY2tlciggJ2hpZGUnICk7XG5cdFx0XHRcdFx0aXNfb3BlbiA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdHZhciB0aW1lX2Zvcm1hdCA9ICdoOm1tIFRUJztcblx0XHRcdHZhciBmb3JtYXQgPSAnZGQtTS15Jztcblx0XHRcdC8vIFdoZW4gcG9ydGFsIG1vZGUsIG5vIHVzZXIgcHJlZmVyZW5jZS5cblx0XHRcdGlmICggTG9jYWxDYWNoZURhdGEuZ2V0TG9naW5Vc2VyUHJlZmVyZW5jZSgpICkge1xuXHRcdFx0XHRmb3JtYXQgPSBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXJQcmVmZXJlbmNlKCkuZGF0ZV9mb3JtYXRfMTtcblx0XHRcdFx0dGltZV9mb3JtYXQgPSBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXJQcmVmZXJlbmNlKCkudGltZV9mb3JtYXRfMTtcblx0XHRcdH1cblx0XHRcdHZhciBkYXlfbmFtZV9taW4gPSBbXG5cdFx0XHRcdCQuaTE4bi5fKCAnU3VuJyApLCAkLmkxOG4uXyggJ01vbicgKSwgJC5pMThuLl8oICdUdWUnICksXG5cdFx0XHRcdCQuaTE4bi5fKCAnV2VkJyApLCAkLmkxOG4uXyggJ1RodScgKSwgJC5pMThuLl8oICdGcmknICksICQuaTE4bi5fKCAnU2F0JyApXG5cdFx0XHRdO1xuXHRcdFx0dmFyIG1vbnRoX25hbWVfc2hvcnQgPSBbXG5cdFx0XHRcdCQuaTE4bi5fKCAnSmFuJyApLCAkLmkxOG4uXyggJ0ZlYicgKSxcblx0XHRcdFx0JC5pMThuLl8oICdNYXInICksICQuaTE4bi5fKCAnQXByJyApLCAkLmkxOG4uXyggJ01heScgKSxcblx0XHRcdFx0JC5pMThuLl8oICdKdW4nICksICQuaTE4bi5fKCAnSnVsJyApLCAkLmkxOG4uXyggJ0F1ZycgKSxcblx0XHRcdFx0JC5pMThuLl8oICdTZXAnICksICQuaTE4bi5fKCAnT2N0JyApLCAkLmkxOG4uXyggJ05vdicgKSxcblx0XHRcdFx0JC5pMThuLl8oICdEZWMnIClcblx0XHRcdF07XG5cdFx0XHR2YXIgY3VycmVudF90ZXh0ID0gJC5pMThuLl8oICdUb2RheScgKTtcblx0XHRcdHZhciBjbG9zZV90ZXh0ID0gJC5pMThuLl8oICdDbG9zZScgKTtcblxuXHRcdFx0JC5kYXRlcGlja2VyLl9nb3RvVG9kYXkgPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHRcdC8vVGhpcyBmaXhlcyBKUyBleGNlcHRpb24gd2hlbiB1c2luZyB0aGUgXCJUT0RBWVwiIGJ1dHRvbiBpbiB0aGUgZGF0ZSBwaWNrZXJzOiBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdzZWxlY3RlZFllYXInIG9mIHVuZGVmaW5lZFxuXHRcdFx0XHQkKCBpZCApLmRhdGVwaWNrZXIoICdzZXREYXRlJywgbmV3IERhdGUoKSApLmRhdGVwaWNrZXIoICdoaWRlJyApLmNoYW5nZSgpO1xuXG5cdFx0XHRcdC8vIHZhciB0YXJnZXQgPSAkKCBpZCApO1xuXHRcdFx0XHQvLyB2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QoIHRhcmdldFswXSApO1xuXHRcdFx0XHQvLyBpZiAoIHRoaXMuX2dldCggaW5zdCwgJ2dvdG9DdXJyZW50JyApICYmIGluc3QuY3VycmVudERheSApIHtcblx0XHRcdFx0Ly8gXHRpbnN0LnNlbGVjdGVkRGF5ID0gaW5zdC5jdXJyZW50RGF5O1xuXHRcdFx0XHQvLyBcdGluc3QuZHJhd01vbnRoID0gaW5zdC5zZWxlY3RlZE1vbnRoID0gaW5zdC5jdXJyZW50TW9udGg7XG5cdFx0XHRcdC8vIFx0aW5zdC5kcmF3WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyID0gaW5zdC5jdXJyZW50WWVhcjtcblx0XHRcdFx0Ly8gfVxuXHRcdFx0XHQvLyBlbHNlIHtcblx0XHRcdFx0Ly8gXHR2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XG5cdFx0XHRcdC8vIFx0aW5zdC5zZWxlY3RlZERheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHRcdFx0XHQvLyBcdGluc3QuZHJhd01vbnRoID0gaW5zdC5zZWxlY3RlZE1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuXHRcdFx0XHQvLyBcdGluc3QuZHJhd1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0XHRcdFx0Ly8gXHQvLyB0aGUgYmVsb3cgdHdvIGxpbmVzIGFyZSBuZXdcblx0XHRcdFx0Ly8gXHR0aGlzLl9zZXREYXRlRGF0ZXBpY2tlciggdGFyZ2V0LCBkYXRlICk7XG5cdFx0XHRcdC8vIFx0dGhpcy5fc2VsZWN0RGF0ZSggaWQsIHRoaXMuX2dldERhdGVEYXRlcGlja2VyKCB0YXJnZXQgKSApO1xuXHRcdFx0XHQvLyBcdCQoIHRhcmdldCApLmRhdGVwaWNrZXIoICdzZXREYXRlJywgZGF0ZSApO1xuXHRcdFx0XHQvLyB9XG5cdFx0XHRcdC8vIHRoaXMuX25vdGlmeUNoYW5nZSggaW5zdCApO1xuXHRcdFx0XHQvLyB0aGlzLl9hZGp1c3REYXRlKCB0YXJnZXQgKTtcblx0XHRcdH07XG5cblx0XHRcdGlmICggbW9kZSA9PT0gJ2RhdGUnICkge1xuXHRcdFx0XHRkYXRlX3BpY2tlcl9pbnB1dCA9IGRhdGVfcGlja2VyX2lucHV0LmRhdGVwaWNrZXIoIHtcblx0XHRcdFx0XHRzaG93T3RoZXJNb250aHM6IHRydWUsXG5cdFx0XHRcdFx0c2VsZWN0T3RoZXJNb250aHM6IHRydWUsXG5cdFx0XHRcdFx0c2hvd1RpbWU6IGZhbHNlLFxuXHRcdFx0XHRcdGRhdGVGb3JtYXQ6IGZvcm1hdCxcblx0XHRcdFx0XHRzaG93SG91cjogZmFsc2UsXG5cdFx0XHRcdFx0c2hvd01pbnV0ZTogZmFsc2UsXG5cdFx0XHRcdFx0Y2hhbmdlTW9udGg6IHRydWUsXG5cdFx0XHRcdFx0Y2hhbmdlWWVhcjogdHJ1ZSxcblx0XHRcdFx0XHRzaG93QnV0dG9uUGFuZWw6IHRydWUsXG5cdFx0XHRcdFx0ZHVyYXRpb246ICcnLFxuXHRcdFx0XHRcdHNob3dBbmltOiAnJyxcblx0XHRcdFx0XHR5ZWFyUmFuZ2U6ICctMTAwOisxMCcsXG5cdFx0XHRcdFx0c2hvd09uOiAnJyxcblx0XHRcdFx0XHRkYXlOYW1lc01pbjogZGF5X25hbWVfbWluLFxuXHRcdFx0XHRcdGN1cnJlbnRUZXh0OiBjdXJyZW50X3RleHQsXG5cdFx0XHRcdFx0bW9udGhOYW1lc1Nob3J0OiBtb250aF9uYW1lX3Nob3J0LFxuXHRcdFx0XHRcdGNsb3NlVGV4dDogY2xvc2VfdGV4dCxcblx0XHRcdFx0XHRiZWZvcmVTaG93OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggby5iZWZvcmVTaG93ICkge1xuXHRcdFx0XHRcdFx0XHRvLmJlZm9yZVNob3coKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpc19vcGVuID0gZmFsc2U7XG5cdFx0XHRcdFx0XHQkdGhpcy5hdXRvUmVzaXplKCk7XG5cdFx0XHRcdFx0XHRpZiAoIG8ub25DbG9zZSApIHtcblx0XHRcdFx0XHRcdFx0by5vbkNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIzIzNTMgLSByZW1vdmVkIGJlY2F1c2UgaXQgYnJlYWtzIHRoZSBtb250aCBuYXZpZ2F0aW9uIGJ1dHRvbnNcblx0XHRcdFx0XHQvLyBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24oIHllYXIsIG1vbnRoLCBhcmdzICkge1xuXHRcdFx0XHRcdC8vIFx0dmFyIGRheSA9ICQuZGF0ZXBpY2tlci5mb3JtYXREYXRlKCAnZGQnLCAkKCB0aGlzICkuZGF0ZXBpY2tlciggJ2dldERhdGUnICkgKTtcblx0XHRcdFx0XHQvLyBcdCQoIHRoaXMgKS52YWwoICQuZGF0ZXBpY2tlci5mb3JtYXREYXRlKCBmb3JtYXQsIG5ldyBEYXRlKCB5ZWFyLCBtb250aCAtIDEsIGRheSApICkgKTtcblx0XHRcdFx0XHQvLyB9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdC8vIFBvcnRhbCBtb2RlLCBubyB1c2VyIHByZWZlcmVuY2UuXG5cdFx0XHRcdGlmICggTG9jYWxDYWNoZURhdGEuZ2V0TG9naW5Vc2VyUHJlZmVyZW5jZSgpICkge1xuXHRcdFx0XHRcdCR0aGlzLnNldFBsYWNlSG9sZGVyKCBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXJQcmVmZXJlbmNlKCkuZGF0ZV9mb3JtYXRfZGlzcGxheSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCR0aGlzLnNldFBsYWNlSG9sZGVyKCAnZGQtbW1tLXl5JyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1vZGUgPT09ICdkYXRlX3RpbWUnICkge1xuXHRcdFx0XHRkYXRlX3BpY2tlcl9pbnB1dCA9IGRhdGVfcGlja2VyX2lucHV0LmRhdGV0aW1lcGlja2VyKCB7XG5cdFx0XHRcdFx0c2hvd090aGVyTW9udGhzOiB0cnVlLFxuXHRcdFx0XHRcdHNlbGVjdE90aGVyTW9udGhzOiB0cnVlLFxuXHRcdFx0XHRcdGRhdGVGb3JtYXQ6IGZvcm1hdCxcblx0XHRcdFx0XHR0aW1lRm9ybWF0OiB0aW1lX2Zvcm1hdCxcblx0XHRcdFx0XHRzaG93VGltZTogdHJ1ZSxcblx0XHRcdFx0XHRzaG93SG91cjogdHJ1ZSxcblx0XHRcdFx0XHRzaG93TWludXRlOiB0cnVlLFxuXHRcdFx0XHRcdGNoYW5nZU1vbnRoOiB0cnVlLFxuXHRcdFx0XHRcdGNoYW5nZVllYXI6IHRydWUsXG5cdFx0XHRcdFx0c2hvd0J1dHRvblBhbmVsOiB0cnVlLFxuXHRcdFx0XHRcdGR1cmF0aW9uOiAnJyxcblx0XHRcdFx0XHRzaG93QW5pbTogJycsXG5cdFx0XHRcdFx0c2hvd09uOiAnJyxcblx0XHRcdFx0XHR5ZWFyUmFuZ2U6ICctMTAwOisxMCcsXG5cdFx0XHRcdFx0Y2xvc2VUZXh0OiBjbG9zZV90ZXh0LFxuXHRcdFx0XHRcdGRheU5hbWVzTWluOiBkYXlfbmFtZV9taW4sXG5cdFx0XHRcdFx0bW9udGhOYW1lc1Nob3J0OiBtb250aF9uYW1lX3Nob3J0LFxuXHRcdFx0XHRcdGN1cnJlbnRUZXh0OiBjdXJyZW50X3RleHQsXG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpc19vcGVuID0gZmFsc2U7XG5cdFx0XHRcdFx0XHQkdGhpcy5hdXRvUmVzaXplKCk7XG5cdFx0XHRcdFx0XHRpZiAoIG8ub25DbG9zZSApIHtcblx0XHRcdFx0XHRcdFx0by5vbkNsb3NlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCR0aGlzLnNldFBsYWNlSG9sZGVyKCBMb2NhbENhY2hlRGF0YS5sb2dpblVzZXJQcmVmZXJlbmNlLmRhdGVfZm9ybWF0X2Rpc3BsYXkgKyAnICcgKyBMb2NhbENhY2hlRGF0YS5sb2dpblVzZXJQcmVmZXJlbmNlLnRpbWVfZm9ybWF0X2Rpc3BsYXkgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQuY2hhbmdlKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjaGVja19ib3ggKSB7XG5cdFx0XHRcdFx0JHRoaXMuc2V0Q2hlY2tCb3goIHRydWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLnRyaWdnZXIoICdmb3JtSXRlbUNoYW5nZScsIFskdGhpc10gKTtcblx0XHRcdFx0JHRoaXMuYXV0b1Jlc2l6ZSgpO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRkYXRlX3BpY2tlcl9pbnB1dC5tb3VzZW92ZXIoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdGlmICggZW5hYmxlZCApIHtcblx0XHRcdFx0XHRpZiAoIGVycm9yX3N0cmluZyAmJiBlcnJvcl9zdHJpbmcubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRcdCR0aGlzLnNob3dFcnJvclRpcCggMjAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0fSApO1xuXG5cdFx0XHRkYXRlX3BpY2tlcl9pbnB1dC5tb3VzZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISQoICR0aGlzICkuaXMoICc6Zm9jdXMnICkgKSB7XG5cdFx0XHRcdFx0JHRoaXMuaGlkZUVycm9yVGlwKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblxuXHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQuZm9jdXNpbiggZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRcdGlmICggIWVuYWJsZWQgKSB7XG5cdFx0XHRcdFx0aWYgKCAhY2hlY2tfYm94ICkge1xuXHRcdFx0XHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fc3ViX2NvbnRyb2xsZXIgJiZcblx0XHRcdFx0XHRcdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3N1Yl9jb250cm9sbGVyLmVkaXRfdmlldyAmJlxuXHRcdFx0XHRcdFx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fc3ViX2NvbnRyb2xsZXIuaXNfdmlld2luZyApIHtcblx0XHRcdFx0XHRcdFx0ZXJyb3Jfc3RyaW5nID0gTG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3N1Yl9jb250cm9sbGVyLmdldFZpZXdNb2RlRXJyb3JNZXNzYWdlKCk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnNob3dFcnJvclRpcCggMTAgKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfb3Blbl9wcmltYXJ5X2NvbnRyb2xsZXIgJiZcblx0XHRcdFx0XHRcdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3ByaW1hcnlfY29udHJvbGxlci5lZGl0X3ZpZXcgJiZcblx0XHRcdFx0XHRcdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3ByaW1hcnlfY29udHJvbGxlci5pc192aWV3aW5nICkge1xuXHRcdFx0XHRcdFx0XHRlcnJvcl9zdHJpbmcgPSBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fcHJpbWFyeV9jb250cm9sbGVyLmdldFZpZXdNb2RlRXJyb3JNZXNzYWdlKCk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnNob3dFcnJvclRpcCggMTAgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoIGVycm9yX3N0cmluZyAmJiBlcnJvcl9zdHJpbmcubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRcdCR0aGlzLnNob3dFcnJvclRpcCggMjAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblxuXHRcdFx0ZGF0ZV9waWNrZXJfaW5wdXQuZm9jdXNvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkdGhpcy5oaWRlRXJyb3JUaXAoKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIG8ud2lkdGggPiAwICkge1xuXHRcdFx0XHQkdGhpcy53aWR0aCggby53aWR0aCApO1xuXHRcdFx0XHRpc19zdGF0aWNfd2lkdGggPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHRoaXMuYXV0b1Jlc2l6ZSgpO1xuXHRcdFx0XHRpc19zdGF0aWNfd2lkdGggPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0JHRoaXMuc2V0RGVmYXVsdFdpZGdldFZhbHVlKCk7XG5cblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG5cdCQuZm4uVERhdGVQaWNrZXIuZGVmYXVsdHMgPSB7fTtcblx0JC5mbi5URGF0ZVBpY2tlci5odG1sX3RlbXBsYXRlID0gYFxuXHQ8ZGl2IGNsYXNzPVwidC1kYXRlLXBpY2tlci1kaXZcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJ0LWRhdGUtcGlja2VyXCIgdHlwZT1cInRleHRcIi8+XG5cdFx0PGltZyBpZD1cInREYXRlUGlja2VySWNvblwiIGNsYXNzPVwidC1kYXRlLXBpY2tlci1pY29uXCIvPlxuXHQ8L2Rpdj5cblx0YDtcblxufSApKCBqUXVlcnkgKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///84\n")}}]);