File manager - Edit - /home/premiey/www/wp-includes/images/media/page-customize.tar
Back
_src/customize_plugin_page.css 0000666 00000013152 15167025561 0012616 0 ustar 00 /** Upgrade ***********************************************************************************************************/ .wpbc_ajx_toolbar .ui_container .ui_group.ui_group__upgrade { flex: 1 1 auto; height: 6em; position: relative; margin: 0 0 5px; } .wpbc_ajx_toolbar .ui_container .ui_group.wpbc_blur{ flex: 1 1 auto; } /** TOOLBAR ***********************************************************************************************************/ /* Override default settings of main toolbar: ../includes/_toolbar_ui/_src/toolbar_ui.css */ #toolbar_booking_customize_plugin.wpbc_ajx_toolbar { margin: 0; /* margin: 0 0 10px 50px; */ } /** CONTENT ***********************************************************************************************************/ /* Main container */ .wpbc_ajx_cstm__container { display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: flex-start; margin: 20px 0 0; } /* LEFT section */ .wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_left { flex: 1 1 auto; display: flex; flex-flow: row wrap; justify-content: flex-start; align-items: flex-start; } /* Calendar in right section */ .wpbc_ajx_cstm__calendar{ width:100%; max-width:100%; margin:0; } /* RIGHT section - Fixed width */ .wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_right { flex: 0 0 280px; margin: 0 0 0 30px; display: flex; flex-flow: column wrap; justify-content: flex-start; align-items: flex-end; } /** WIDGETS ***********************************************************************************************************/ /* Widgets Section - Define width of widget here */ .wpbc_widgets { width:100%; /* WIDTH of WIDGETs*/ display: flex; flex-flow: column wrap; justify-content: flex-start; align-items: flex-start; } /* Widget */ .wpbc_widgets .wpbc_widget { margin: 0 0 20px; width:100%; flex: 1 1 100%; } /* Widget Header */ .wpbc_widget .wpbc_widget_header { width: 100%; height: 44px; border: 1px solid #ccc; background: #fff; font-weight: 600; text-shadow: none; display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center; } /* Widget Header text */ .wpbc_widget .wpbc_widget_header .wpbc_widget_header_text { flex: 1 1 auto; padding: 0 15px; } /* Settings Link in right side of header */ .wpbc_widget .wpbc_widget_header .wpbc_widget_header_settings_link { flex: 0 0 auto; margin-left: auto; border-left: 1px solid #ccc; padding: 5px 10px; color: #0e70b7; display: none; } /** MOBILE ***********************************************************************************************************/ @media (max-width: 600px) { .wpbc_ajx_cstm__container { flex-flow: row wrap; } .wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_left { order: 2; } .wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_right { order: 1; flex: 1 1 auto; margin: 0; } } @media (max-width: 470px) { } /** Toolbar Text Bar **********************************************************************************************/ #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar { font-size: 1.1em; line-height: 1.8em; /*height: auto;*/ } /* Sub Bar - Text Titles */ #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar *{ font-size: 1em; } /* Sub Bar - Links to sections */ #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a, #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a:focus{ color: #555; outline: none; padding: 3px 10px; text-decoration: none; } #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step:hover{ cursor: default; } #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a:hover{ color: #D54E21 !important; background-color: transparent !important; border-bottom-color: #d54e21; text-decoration: none; } /** Toolbar Text Bar - Resources **********************************************************************************************/ #wpbc_hidden_template__select_booking_resource { display: none; } /** Toolbar Dates Hints **********************************************************************************************/ #wpbc_hidden_template__select_booking_resource { flex: 0 1 auto; } #wpbc_toolbar_dates_hint{ flex: 1 1 auto; justify-content: flex-start; margin-left: 0; } #wpbc_toolbar_dates_hint .ui_element { } #wpbc_toolbar_dates_hint .ui_element .wpbc_help_text { font-size: 1.1em; line-height: 1.8em; /*height: auto;*/ } #wpbc_toolbar_dates_hint .ui_element .wpbc_help_text *{ font-size: 1em; } #wpbc_toolbar_dates_hint .ui_element .wpbc_help_text strong{ } /* Dates hints */ .wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints { font-size: 1.05em; display: block; /*flex-flow: row wrap;*/ /*width: 100%;*/ /*justify-content: flex-start;*/ /*align-items: first baseline;*/ } .wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span{ /*flex: 1 1 auto;*/ padding: 0 0.2em; } .wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span.wpbc_big_text, .wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span.wpbc_big_date{ font-size: 1.05em; font-weight: 600; padding: 0 0.3em; } /* Sub section of elements with left padding ----------------------------------------------------------------------- */ .ui_element_sub_section { display: flex; flex-flow: row wrap; justify-content: flex-start; align-items: stretch; flex: 1 1 100%; border: 1px dashed #a6a6a6; border-radius: 4px; padding: 5px 12px 5px; margin: 5px 0 5px 25px; } _src/customize__inline_calendar.js 0000666 00000072526 15167025561 0013430 0 ustar 00 "use strict"; /** * Define JavaScript variables for front-end calendar for backward compatibility * * @param calendar_params_arr example:{ 'html_id' : 'calendar_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, 'text_id' : 'date_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, 'calendar__booking_start_day_weeek': calendar_params_arr.ajx_cleaned_params.calendar__booking_start_day_weeek, 'calendar__view__visible_months': calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months, 'calendar__days_selection_mode': calendar_params_arr.ajx_cleaned_params.calendar__days_selection_mode, 'resource_id' : calendar_params_arr.ajx_cleaned_params.resource_id, 'ajx_nonce_calendar' : calendar_params_arr.ajx_data_arr.ajx_nonce_calendar, 'booked_dates' : calendar_params_arr.ajx_data_arr.booked_dates, 'season_customize_plugin': calendar_params_arr.ajx_data_arr.season_customize_plugin, 'resource_unavailable_dates' : calendar_params_arr.ajx_data_arr.resource_unavailable_dates } */ function wpbc_assign_global_js_for_calendar( calendar_params_arr ){ //TODO: need to test it before remove } /** * Load Datepick Inline calendar * * @param calendar_params_arr example:{ 'html_id' : 'calendar_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, 'text_id' : 'date_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, 'calendar__booking_start_day_weeek': calendar_params_arr.ajx_cleaned_params.calendar__booking_start_day_weeek, 'calendar__view__visible_months': calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months, 'calendar__days_selection_mode': calendar_params_arr.ajx_cleaned_params.calendar__days_selection_mode, 'resource_id' : calendar_params_arr.ajx_cleaned_params.resource_id, 'ajx_nonce_calendar' : calendar_params_arr.ajx_data_arr.ajx_nonce_calendar, 'booked_dates' : calendar_params_arr.ajx_data_arr.calendar_settings.booked_dates, 'season_customize_plugin': calendar_params_arr.ajx_data_arr.season_customize_plugin, 'resource_unavailable_dates' : calendar_params_arr.ajx_data_arr.resource_unavailable_dates } * @returns {boolean} */ function wpbc_show_inline_booking_calendar( calendar_params_arr ){ if ( ( 0 === jQuery( '#' + calendar_params_arr.html_id ).length ) // If calendar DOM element not exist then exist || ( true === jQuery( '#' + calendar_params_arr.html_id ).hasClass( 'hasDatepick' ) ) // If the calendar with the same Booking resource already has been activated, then exist. ){ return false; } //------------------------------------------------------------------------------------------------------------------ // JavaScript variables for front-end calendar //------------------------------------------------------------------------------------------------------------------ wpbc_assign_global_js_for_calendar( calendar_params_arr ); //------------------------------------------------------------------------------------------------------------------ // Configure and show calendar //------------------------------------------------------------------------------------------------------------------ jQuery( '#' + calendar_params_arr.html_id ).text( '' ); jQuery( '#' + calendar_params_arr.html_id ).datepick({ beforeShowDay: function ( date ){ return wpbc__inline_booking_calendar__apply_css_to_days( date, calendar_params_arr, this ); }, onSelect: function ( date ){ jQuery( '#' + calendar_params_arr.text_id ).val( date ); //wpbc_blink_element('.wpbc_widget_change_calendar_skin', 3, 220); return wpbc__inline_booking_calendar__on_days_select( date, calendar_params_arr, this ); }, onHover: function ( value, date ){ //wpbc_cstm__prepare_tooltip__in_calendar( value, date, calendar_params_arr, this ); return wpbc__inline_booking_calendar__on_days_hover( value, date, calendar_params_arr, this ); }, onChangeMonthYear: //null, function ( year, month ){ return wpbc__inline_booking_calendar__on_change_year_month( year, month, calendar_params_arr, this ); }, showOn: 'both', numberOfMonths: calendar_params_arr.calendar__view__visible_months, stepMonths: 1, prevText: '«', nextText: '»', dateFormat: 'dd.mm.yy', // 'yy-mm-dd', changeMonth: false, changeYear: false, minDate: 0, //null, // Scroll as long as you need maxDate: calendar_params_arr.calendar__booking_max_monthes_in_calendar, // minDate: new Date(2020, 2, 1), maxDate: new Date(2020, 9, 31), // Ability to set any start and end date in calendar showStatus: false, closeAtTop: false, firstDay: calendar_params_arr.calendar__booking_start_day_weeek, gotoCurrent: false, hideIfNoPrevNext: true, multiSeparator: ', ', /* 'multiSelect' can be 0 for 'single', 'dynamic' and can be 365 for 'multiple', 'fixed' // Maximum number of selectable dates: Single day = 0, multi days = 365 */ multiSelect: ( ( 'single' == calendar_params_arr.calendar__days_selection_mode ) || ( 'dynamic' == calendar_params_arr.calendar__days_selection_mode ) ? 0 : 365 ), /* 'rangeSelect' true for 'dynamic' false for 'single', 'multiple', 'fixed' */ rangeSelect: ('dynamic' == calendar_params_arr.calendar__days_selection_mode), rangeSeparator: ' - ', // ' ~ ', //' - ', // showWeeks: true, useThemeRoller: false } ); return true; } /** * When we scroll month in calendar then trigger specific event * @param year * @param month * @param calendar_params_arr * @param datepick_this */ function wpbc__inline_booking_calendar__on_change_year_month( year, month, calendar_params_arr, datepick_this ){ /** * We need to use inst.drawMonth instead of month variable. * It is because, each time, when we use dynamic arnge selection, the month here are different */ var inst = jQuery.datepick._getInst( datepick_this ); jQuery( 'body' ).trigger( 'wpbc__inline_booking_calendar__changed_year_month' // event name , [inst.drawYear, (inst.drawMonth+1), calendar_params_arr, datepick_this] ); // To catch this event: jQuery( 'body' ).on('wpbc__inline_booking_calendar__changed_year_month', function( event, year, month, calendar_params_arr, datepick_this ) { ... } ); } /** * Apply CSS to calendar date cells * * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time) * @param calendar_params_arr - Calendar Settings Object: { "html_id": "calendar_booking4", "text_id": "date_booking4", "calendar__booking_start_day_weeek": 1, "calendar__view__visible_months": 12, "resource_id": 4, "ajx_nonce_calendar": "<input type=\"hidden\" ... />", "booked_dates": { "12-28-2022": [ { "booking_date": "2022-12-28 00:00:00", "approved": "1", "booking_id": "26" } ], ... } 'season_customize_plugin':{ "2023-01-09": true, "2023-01-10": true, "2023-01-11": true, ... } } } * @param datepick_this - this of datepick Obj * * @returns [boolean,string] - [ {true -available | false - unavailable}, 'CSS classes for calendar day cell' ] */ function wpbc__inline_booking_calendar__apply_css_to_days( date, calendar_params_arr, datepick_this ){ var today_date = new Date( _wpbc.get_other_param( 'today_arr' )[ 0 ], (parseInt( _wpbc.get_other_param( 'today_arr' )[ 1 ] ) - 1), _wpbc.get_other_param( 'today_arr' )[ 2 ], 0, 0, 0 ); var class_day = ( date.getMonth() + 1 ) + '-' + date.getDate() + '-' + date.getFullYear(); // '1-9-2023' var sql_class_day = wpbc__get__sql_class_date( date ); // '2023-01-09' var css_date__standard = 'cal4date-' + class_day; var css_date__additional = ' wpbc_weekday_' + date.getDay() + ' '; //-------------------------------------------------------------------------------------------------------------- // WEEKDAYS :: Set unavailable week days from - Settings General page in "Availability" section for ( var i = 0; i < _wpbc.get_other_param( 'availability__week_days_unavailable' ).length; i++ ){ if ( date.getDay() == _wpbc.get_other_param( 'availability__week_days_unavailable' )[ i ] ) { return [ false, css_date__standard + ' date_user_unavailable' + ' weekdays_unavailable' ]; } } // BEFORE_AFTER :: Set unavailable days Before / After the Today date if ( ( (wpbc_dates__days_between( date, today_date )) < parseInt(_wpbc.get_other_param( 'availability__unavailable_from_today' )) ) || ( ( parseInt( '0' + parseInt( _wpbc.get_other_param( 'availability__available_from_today' ) ) ) > 0 ) && ( wpbc_dates__days_between( date, today_date ) > parseInt( '0' + parseInt( _wpbc.get_other_param( 'availability__available_from_today' ) ) ) ) ) ){ return [ false, css_date__standard + ' date_user_unavailable' + ' before_after_unavailable' ]; } // SEASONS :: Booking > Resources > Availability page var is_date_available = calendar_params_arr.season_customize_plugin[ sql_class_day ]; if ( false === is_date_available ){ //FixIn: 9.5.4.4 return [ false, css_date__standard + ' date_user_unavailable' + ' season_unavailable' ]; } // RESOURCE_UNAVAILABLE :: Booking > Customize page if ( wpbc_in_array(calendar_params_arr.resource_unavailable_dates, sql_class_day ) ){ is_date_available = false; } if ( false === is_date_available ){ //FixIn: 9.5.4.4 return [ false, css_date__standard + ' date_user_unavailable' + ' resource_unavailable' ]; } //-------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------- // Is any bookings in this date ? if ( 'undefined' !== typeof( calendar_params_arr.booked_dates[ class_day ] ) ) { var bookings_in_date = calendar_params_arr.booked_dates[ class_day ]; if ( 'undefined' !== typeof( bookings_in_date[ 'sec_0' ] ) ) { // "Full day" booking -> (seconds == 0) css_date__additional += ( '0' === bookings_in_date[ 'sec_0' ].approved ) ? ' date2approve ' : ' date_approved '; // Pending = '0' | Approved = '1' css_date__additional += ' full_day_booking'; return [ false, css_date__standard + css_date__additional ]; } else if ( Object.keys( bookings_in_date ).length > 0 ){ // "Time slots" Bookings var is_approved = true; _.each( bookings_in_date, function ( p_val, p_key, p_data ) { if ( !parseInt( p_val.approved ) ){ is_approved = false; } var ts = p_val.booking_date.substring( p_val.booking_date.length - 1 ); if ( true === _wpbc.get_other_param( 'is_enabled_change_over' ) ){ if ( ts == '1' ) { css_date__additional += ' check_in_time' + ((parseInt(p_val.approved)) ? ' check_in_time_date_approved' : ' check_in_time_date2approve'); } if ( ts == '2' ) { css_date__additional += ' check_out_time' + ((parseInt(p_val.approved)) ? ' check_out_time_date_approved' : ' check_out_time_date2approve'); } } }); if ( ! is_approved ){ css_date__additional += ' date2approve timespartly' } else { css_date__additional += ' date_approved timespartly' } if ( ! _wpbc.get_other_param( 'is_enabled_change_over' ) ){ css_date__additional += ' times_clock' } } } //-------------------------------------------------------------------------------------------------------------- return [ true, css_date__standard + css_date__additional + ' date_available' ]; } //TODO: need to use wpbc_calendar script, instead of this one /** * Apply some CSS classes, when we mouse over specific dates in calendar * @param value * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time) * @param calendar_params_arr - Calendar Settings Object: { "html_id": "calendar_booking4", "text_id": "date_booking4", "calendar__booking_start_day_weeek": 1, "calendar__view__visible_months": 12, "resource_id": 4, "ajx_nonce_calendar": "<input type=\"hidden\" ... />", "booked_dates": { "12-28-2022": [ { "booking_date": "2022-12-28 00:00:00", "approved": "1", "booking_id": "26" } ], ... } 'season_customize_plugin':{ "2023-01-09": true, "2023-01-10": true, "2023-01-11": true, ... } } } * @param datepick_this - this of datepick Obj * * @returns {boolean} */ function wpbc__inline_booking_calendar__on_days_hover( value, date, calendar_params_arr, datepick_this ){ if( null === date ){ return; } // The same functions as in client.css ************************************************************* //TODO: 2023-06-30 17:22 if ( true ){ var bk_type = calendar_params_arr.resource_id var is_calendar_booking_unselectable = jQuery( '#calendar_booking_unselectable' + bk_type ); //FixIn: 8.0.1.2 var is_booking_form_also = jQuery( '#booking_form_div' + bk_type ); // Set unselectable, if only Availability Calendar here (and we do not insert Booking form by mistake). if ( (is_calendar_booking_unselectable.length == 1) && (is_booking_form_also.length != 1) ){ jQuery( '#calendar_booking' + bk_type + ' .datepick-days-cell-over' ).removeClass( 'datepick-days-cell-over' ); // clear all highlight days selections jQuery( '.wpbc_only_calendar #calendar_booking' + bk_type + ' .datepick-days-cell, ' + '.wpbc_only_calendar #calendar_booking' + bk_type + ' .datepick-days-cell a' ).css( 'cursor', 'default' ); return false; } //FixIn: 8.0.1.2 end return true; } // ************************************************************************************************* if ( null === date ){ jQuery( '.datepick-days-cell-over' ).removeClass( 'datepick-days-cell-over' ); // clear all highlight days selections return false; } var inst = jQuery.datepick._getInst( document.getElementById( 'calendar_booking' + calendar_params_arr.resource_id ) ); if ( ( 1 == inst.dates.length) // If we have one selected date && ('dynamic' === calendar_params_arr.calendar__days_selection_mode) // while have range days selection mode ){ var td_class; var td_overs = []; var is_check = true; var selceted_first_day = new Date(); selceted_first_day.setFullYear(inst.dates[0].getFullYear(),(inst.dates[0].getMonth()), (inst.dates[0].getDate() ) ); //Get first Date while( is_check ){ td_class = (selceted_first_day.getMonth() + 1) + '-' + selceted_first_day.getDate() + '-' + selceted_first_day.getFullYear(); td_overs[ td_overs.length ] = '#calendar_booking' + calendar_params_arr.resource_id + ' .cal4date-' + td_class; // add to array for later make selection by class if ( ( ( date.getMonth() == selceted_first_day.getMonth() ) && ( date.getDate() == selceted_first_day.getDate() ) && ( date.getFullYear() == selceted_first_day.getFullYear() ) ) || ( selceted_first_day > date ) ){ is_check = false; } selceted_first_day.setFullYear( selceted_first_day.getFullYear(), (selceted_first_day.getMonth()), (selceted_first_day.getDate() + 1) ); } // Highlight Days for ( var i=0; i < td_overs.length ; i++) { // add class to all elements jQuery( td_overs[i] ).addClass('datepick-days-cell-over'); } return true; } return true; } //TODO: need to use wpbc_calendar script, instead of this one /** * On DAYs selection in calendar * * @param dates_selection - string: '2023-03-07 ~ 2023-03-07' or '2023-04-10, 2023-04-12, 2023-04-02, 2023-04-04' * @param calendar_params_arr - Calendar Settings Object: { "html_id": "calendar_booking4", "text_id": "date_booking4", "calendar__booking_start_day_weeek": 1, "calendar__view__visible_months": 12, "resource_id": 4, "ajx_nonce_calendar": "<input type=\"hidden\" ... />", "booked_dates": { "12-28-2022": [ { "booking_date": "2022-12-28 00:00:00", "approved": "1", "booking_id": "26" } ], ... } 'season_customize_plugin':{ "2023-01-09": true, "2023-01-10": true, "2023-01-11": true, ... } } } * @param datepick_this - this of datepick Obj * * @returns boolean */ function wpbc__inline_booking_calendar__on_days_select( dates_selection, calendar_params_arr, datepick_this = null ){ // The same functions as in client.css //TODO: 2023-06-30 17:22 if ( true ){ var bk_type = calendar_params_arr.resource_id var date = dates_selection; // Set unselectable, if only Availability Calendar here (and we do not insert Booking form by mistake). var is_calendar_booking_unselectable = jQuery( '#calendar_booking_unselectable' + bk_type ); //FixIn: 8.0.1.2 var is_booking_form_also = jQuery( '#booking_form_div' + bk_type ); if ( (is_calendar_booking_unselectable.length > 0) && (is_booking_form_also.length <= 0) ){ wpbc_calendar__unselect_all_dates( bk_type ); jQuery( '.wpbc_only_calendar .popover_calendar_hover' ).remove(); //Hide all opened popovers return false; } //FixIn: 8.0.1.2 end jQuery( '#date_booking' + bk_type ).val( date ); jQuery( ".booking_form_div" ).trigger( "date_selected", [bk_type, date] ); } else { // Functionality from Booking > Availability page var inst = jQuery.datepick._getInst( document.getElementById( 'calendar_booking' + calendar_params_arr.resource_id ) ); var dates_arr = []; // [ "2023-04-09", "2023-04-10", "2023-04-11" ] if ( -1 !== dates_selection.indexOf( '~' ) ) { // Range Days dates_arr = wpbc_get_dates_arr__from_dates_range_js( { 'dates_separator' : ' ~ ', // ' ~ ' 'dates' : dates_selection, // '2023-04-04 ~ 2023-04-07' } ); } else { // Multiple Days dates_arr = wpbc_get_dates_arr__from_dates_comma_separated_js( { 'dates_separator' : ', ', // ', ' 'dates' : dates_selection, // '2023-04-10, 2023-04-12, 2023-04-02, 2023-04-04' } ); } wpbc_avy_after_days_selection__show_help_info({ 'calendar__days_selection_mode': calendar_params_arr.calendar__days_selection_mode, 'dates_arr' : dates_arr, 'dates_click_num' : inst.dates.length, 'popover_hints' : calendar_params_arr.popover_hints } ); } return true; } /** * Show help info at the top toolbar about selected dates and future actions * * @param params * Example 1: { calendar__days_selection_mode: "dynamic", dates_arr: [ "2023-04-03" ], dates_click_num: 1 'popover_hints' : calendar_params_arr.popover_hints } * Example 2: { calendar__days_selection_mode: "dynamic" dates_arr: Array(10) [ "2023-04-03", "2023-04-04", "2023-04-05", … ] dates_click_num: 2 'popover_hints' : calendar_params_arr.popover_hints } */ function wpbc_avy_after_days_selection__show_help_info( params ){ // console.log( params ); // [ "2023-04-09", "2023-04-10", "2023-04-11" ] var message, color; if (jQuery( '#ui_btn_cstm__set_days_customize_plugin__available').is(':checked')){ message = params.popover_hints.toolbar_text_available;//'Set dates _DATES_ as _HTML_ available.'; color = '#11be4c'; } else { message = params.popover_hints.toolbar_text_unavailable;//'Set dates _DATES_ as _HTML_ unavailable.'; color = '#e43939'; } message = '<span>' + message + '</span>'; var first_date = params[ 'dates_arr' ][ 0 ]; var last_date = ( 'dynamic' == params.calendar__days_selection_mode ) ? params[ 'dates_arr' ][ (params[ 'dates_arr' ].length - 1) ] : ( params[ 'dates_arr' ].length > 1 ) ? params[ 'dates_arr' ][ 1 ] : ''; first_date = jQuery.datepick.formatDate( 'dd M, yy', new Date( first_date + 'T00:00:00' ) ); last_date = jQuery.datepick.formatDate( 'dd M, yy', new Date( last_date + 'T00:00:00' ) ); if ( 'dynamic' == params.calendar__days_selection_mode ){ if ( 1 == params.dates_click_num ){ last_date = '___________' } else { if ( 'first_time' == jQuery( '.wpbc_ajx_customize_plugin_container' ).attr( 'wpbc_loaded' ) ){ jQuery( '.wpbc_ajx_customize_plugin_container' ).attr( 'wpbc_loaded', 'done' ) wpbc_blink_element( '.wpbc_widget_change_calendar_skin', 3, 220 ); } } message = message.replace( '_DATES_', '</span>' //+ '<div>' + 'from' + '</div>' + '<span class="wpbc_big_date">' + first_date + '</span>' + '<span>' + '-' + '</span>' + '<span class="wpbc_big_date">' + last_date + '</span>' + '<span>' ); } else { // if ( params[ 'dates_arr' ].length > 1 ){ // last_date = ', ' + last_date; // last_date += ( params[ 'dates_arr' ].length > 2 ) ? ', ...' : ''; // } else { // last_date=''; // } var dates_arr = []; for( var i = 0; i < params[ 'dates_arr' ].length; i++ ){ dates_arr.push( jQuery.datepick.formatDate( 'dd M yy', new Date( params[ 'dates_arr' ][ i ] + 'T00:00:00' ) ) ); } first_date = dates_arr.join( ', ' ); message = message.replace( '_DATES_', '</span>' + '<span class="wpbc_big_date">' + first_date + '</span>' + '<span>' ); } message = message.replace( '_HTML_' , '</span><span class="wpbc_big_text" style="color:'+color+';">') + '<span>'; //message += ' <div style="margin-left: 1em;">' + ' Click on Apply button to apply customize_plugin.' + '</div>'; message = '<div class="wpbc_toolbar_dates_hints">' + message + '</div>'; jQuery( '.wpbc_help_text' ).html( message ); } /** * Parse dates ------------------------------------------------------------------------------------------- */ /** * Get dates array, from comma separated dates * * @param params = { * 'dates_separator' => ', ', // Dates separator * 'dates' => '2023-04-04, 2023-04-07, 2023-04-05' // Dates in 'Y-m-d' format: '2023-01-31' } * * @return array = [ * [0] => 2023-04-04 * [1] => 2023-04-05 * [2] => 2023-04-06 * [3] => 2023-04-07 ] * * Example #1: wpbc_get_dates_arr__from_dates_comma_separated_js( { 'dates_separator' : ', ', 'dates' : '2023-04-04, 2023-04-07, 2023-04-05' } ); */ function wpbc_get_dates_arr__from_dates_comma_separated_js( params ){ var dates_arr = []; if ( '' !== params[ 'dates' ] ){ dates_arr = params[ 'dates' ].split( params[ 'dates_separator' ] ); dates_arr.sort(); } return dates_arr; } /** * Get dates array, from range days selection * * @param params = { * 'dates_separator' => ' ~ ', // Dates separator * 'dates' => '2023-04-04 ~ 2023-04-07' // Dates in 'Y-m-d' format: '2023-01-31' } * * @return array = [ * [0] => 2023-04-04 * [1] => 2023-04-05 * [2] => 2023-04-06 * [3] => 2023-04-07 ] * * Example #1: wpbc_get_dates_arr__from_dates_range_js( { 'dates_separator' : ' ~ ', 'dates' : '2023-04-04 ~ 2023-04-07' } ); * Example #2: wpbc_get_dates_arr__from_dates_range_js( { 'dates_separator' : ' - ', 'dates' : '2023-04-04 - 2023-04-07' } ); */ function wpbc_get_dates_arr__from_dates_range_js( params ){ var dates_arr = []; if ( '' !== params['dates'] ) { dates_arr = params[ 'dates' ].split( params[ 'dates_separator' ] ); var check_in_date_ymd = dates_arr[0]; var check_out_date_ymd = dates_arr[1]; if ( ('' !== check_in_date_ymd) && ('' !== check_out_date_ymd) ){ dates_arr = wpbc_get_dates_array_from_start_end_days_js( check_in_date_ymd, check_out_date_ymd ); } } return dates_arr; } /** * Get dates array based on start and end dates. * * @param string sStartDate - start date: 2023-04-09 * @param string sEndDate - end date: 2023-04-11 * @return array - [ "2023-04-09", "2023-04-10", "2023-04-11" ] */ function wpbc_get_dates_array_from_start_end_days_js( sStartDate, sEndDate ){ sStartDate = new Date( sStartDate + 'T00:00:00' ); sEndDate = new Date( sEndDate + 'T00:00:00' ); var aDays=[]; // Start the variable off with the start date aDays.push( sStartDate.getTime() ); // Set a 'temp' variable, sCurrentDate, with the start date - before beginning the loop var sCurrentDate = new Date( sStartDate.getTime() ); var one_day_duration = 24*60*60*1000; // While the current date is less than the end date while(sCurrentDate < sEndDate){ // Add a day to the current date "+1 day" sCurrentDate.setTime( sCurrentDate.getTime() + one_day_duration ); // Add this new day to the aDays array aDays.push( sCurrentDate.getTime() ); } for (let i = 0; i < aDays.length; i++) { aDays[ i ] = new Date( aDays[i] ); aDays[ i ] = aDays[ i ].getFullYear() + '-' + (( (aDays[ i ].getMonth() + 1) < 10) ? '0' : '') + (aDays[ i ].getMonth() + 1) + '-' + (( aDays[ i ].getDate() < 10) ? '0' : '') + aDays[ i ].getDate(); } // Once the loop has finished, return the array of days. return aDays; } /** * Scroll to specific "Year & Month" in Inline Booking Calendar * * @param {number} resource_id 1 * @param {number} year 2023 * @param {number} month 12 (from 1 to 12) * * @returns {boolean} // changed or not */ function wpbc__inline_booking_calendar__change_year_month( resource_id, year, month ){ var inst = jQuery.datepick._getInst( document.getElementById( 'calendar_booking' + resource_id) ); if ( false != inst ){ year = parseInt( year ); month = parseInt( month ) - 1; inst.cursorDate = new Date(); inst.cursorDate.setFullYear( year, month, 1 ); inst.cursorDate.setMonth( month ); // In some cases, the setFullYear can set only Year, and not the Month and day //FixIn:6.2.3.5 inst.cursorDate.setDate( 1 ); inst.drawMonth = inst.cursorDate.getMonth(); inst.drawYear = inst.cursorDate.getFullYear(); jQuery.datepick._notifyChange( inst ); jQuery.datepick._adjustInstDate( inst ); jQuery.datepick._showDate( inst ); jQuery.datepick._updateDatepick( inst ); return true; } return false; } _src/customize_plugin_page.js 0000666 00000101254 15167025561 0012443 0 ustar 00 "use strict"; /** * Request Object * Here we can define Search parameters and Update it later, when some parameter was changed * */ var wpbc_ajx_customize_plugin = (function ( obj, $) { // Secure parameters for Ajax ------------------------------------------------------------------------------------ var p_secure = obj.security_obj = obj.security_obj || { user_id: 0, nonce : '', locale : '' }; obj.set_secure_param = function ( param_key, param_val ) { p_secure[ param_key ] = param_val; }; obj.get_secure_param = function ( param_key ) { return p_secure[ param_key ]; }; // Listing Search parameters ------------------------------------------------------------------------------------ var p_listing = obj.search_request_obj = obj.search_request_obj || { // sort : "booking_id", // sort_type : "DESC", // page_num : 1, // page_items_count: 10, // create_date : "", // keyword : "", // source : "" }; obj.search_set_all_params = function ( request_param_obj ) { p_listing = request_param_obj; }; obj.search_get_all_params = function () { return p_listing; }; obj.search_get_param = function ( param_key ) { return p_listing[ param_key ]; }; obj.search_set_param = function ( param_key, param_val ) { // if ( Array.isArray( param_val ) ){ // param_val = JSON.stringify( param_val ); // } p_listing[ param_key ] = param_val; }; obj.search_set_params_arr = function( params_arr ){ _.each( params_arr, function ( p_val, p_key, p_data ){ // Define different Search parameters for request this.search_set_param( p_key, p_val ); } ); } // Other parameters ------------------------------------------------------------------------------------ var p_other = obj.other_obj = obj.other_obj || { }; obj.set_other_param = function ( param_key, param_val ) { p_other[ param_key ] = param_val; }; obj.get_other_param = function ( param_key ) { return p_other[ param_key ]; }; return obj; }( wpbc_ajx_customize_plugin || {}, jQuery )); var wpbc_ajx_bookings = []; /** * Show Content ---------------------------------------------------------------------------------------------- */ /** * Show Content - Calendar and UI elements * * @param ajx_data * @param ajx_search_params * @param ajx_cleaned_params */ function wpbc_ajx_customize_plugin__page_content__show( ajx_data, ajx_search_params , ajx_cleaned_params ){ // Content --------------------------------------------------------------------------------------------------------- var template__customize_plugin_main_page_content = wp.template( 'wpbc_ajx_customize_plugin_main_page_content' ); jQuery( wpbc_ajx_customize_plugin.get_other_param( 'listing_container' ) ).html( template__customize_plugin_main_page_content( { 'ajx_data' : ajx_data, 'ajx_search_params' : ajx_search_params, // $_REQUEST[ 'search_params' ] 'ajx_cleaned_params' : ajx_cleaned_params } ) ); var template__inline_calendar; var data_arr = { 'ajx_data' : ajx_data, 'ajx_search_params' : ajx_search_params, 'ajx_cleaned_params' : ajx_cleaned_params }; switch ( ajx_data['customize_steps']['current'] ){ case 'calendar_skin': // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template( 'wpbc_ajx_customize_plugin__inline_calendar' ); jQuery('.wpbc_ajx_cstm__section_left').html( template__inline_calendar( data_arr ) ); // Calendar Skin var template__wiget_calendar_skin = wp.template( 'wpbc_ajx_widget_change_calendar_skin' ); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__wiget_calendar_skin( data_arr ) ); // Shortcode // var template__widget_plugin_shortcode = wp.template( 'wpbc_ajx_widget_plugin_shortcode' ); // jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__widget_plugin_shortcode( data_arr ) ); // Size // var template__wiget_calendar_size = wp.template( 'wpbc_ajx_widget_calendar_size' ); // jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__wiget_calendar_size( data_arr ) ); break; case 'calendar_size': // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template( 'wpbc_ajx_customize_plugin__inline_calendar' ); jQuery('.wpbc_ajx_cstm__section_left').html( template__inline_calendar( data_arr ) ); // Calendar Skin var template__wiget_calendar_size = wp.template( 'wpbc_ajx_widget_calendar_size' ); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__wiget_calendar_size( data_arr ) ); // Shortcode // var template__widget_plugin_shortcode = wp.template( 'wpbc_ajx_widget_plugin_shortcode' ); // jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__widget_plugin_shortcode( data_arr ) ); break; case 'calendar_dates_selection': // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template( 'wpbc_ajx_customize_plugin__inline_calendar' ); jQuery('.wpbc_ajx_cstm__section_left').html( template__inline_calendar( data_arr ) ); jQuery('.wpbc_ajx_cstm__section_left').append('<div class="clear" style="width:100%;margin:50px 0 0;"></div>'); var message_html_id = wpbc_ajx_customize_plugin__show_message( '<strong>' + 'You can test days selection in calendar' + '</strong>' , { 'container': '.wpbc_ajx_cstm__section_left', // '#ajax_working', 'style' : 'margin: 6px auto; padding: 6px 20px;z-index: 999999;', 'type' : 'info', 'delay' : 5000 } ); wpbc_blink_element( '#' + message_html_id, 3, 320 ); // Widget - Dates selection var template__widget_plugin_calendar_dates_selection = wp.template( 'wpbc_ajx_widget_calendar_dates_selection' ); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__widget_plugin_calendar_dates_selection( data_arr ) ); break; case 'calendar_weekdays_availability': // Scroll to current month var s_year = wpbc_ajx_customize_plugin.search_set_param( 'calendar__start_year', 0 ); var s_month = wpbc_ajx_customize_plugin.search_set_param( 'calendar__start_month', 0 ); // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template( 'wpbc_ajx_customize_plugin__inline_calendar' ); jQuery('.wpbc_ajx_cstm__section_left').html( template__inline_calendar( data_arr ) ); // Widget - Weekdays Availability var template__widget_plugin_calendar_weekdays_availability = wp.template( 'wpbc_ajx_widget_calendar_weekdays_availability' ); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__widget_plugin_calendar_weekdays_availability( data_arr ) ); break; case 'calendar_additional': // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template( 'wpbc_ajx_customize_plugin__inline_calendar' ); jQuery('.wpbc_ajx_cstm__section_left').html( template__inline_calendar( data_arr ) ); // Calendar Skin var template__wiget_calendar_additional = wp.template( 'wpbc_ajx_widget_calendar_additional' ); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__wiget_calendar_additional( data_arr ) ); // Shortcode // var template__widget_plugin_shortcode = wp.template( 'wpbc_ajx_widget_plugin_shortcode' ); // jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__widget_plugin_shortcode( data_arr ) ); break; default: //console.log( `Sorry, we are out of ${expr}.` ); } // Toolbar --------------------------------------------------------------------------------------------------------- var template__customize_plugin_toolbar_page_content = wp.template( 'wpbc_ajx_customize_plugin_toolbar_page_content' ); jQuery( wpbc_ajx_customize_plugin.get_other_param( 'toolbar_container' ) ).html( template__customize_plugin_toolbar_page_content( { 'ajx_data' : ajx_data, 'ajx_search_params' : ajx_search_params, // $_REQUEST[ 'search_params' ] 'ajx_cleaned_params' : ajx_cleaned_params } ) ); // Booking resources ------------------------------------------------------------------------------------------ var wpbc_ajx_select_booking_resource = wp.template( 'wpbc_ajx_select_booking_resource' ); jQuery( '#wpbc_hidden_template__select_booking_resource').html( wpbc_ajx_select_booking_resource( { 'ajx_data' : ajx_data, 'ajx_search_params' : ajx_search_params, 'ajx_cleaned_params' : ajx_cleaned_params } ) ); /* * By default hided at ../wp-content/plugins/booking/includes/page-customize/_src/customize_plugin_page.css #wpbc_hidden_template__select_booking_resource { display: none; } * * We can hide ///- Hide resources! * //setTimeout( function (){ jQuery( '#wpbc_hidden_template__select_booking_resource' ).html( '' ); }, 1000 ); */ // Other --------------------------------------------------------------------------------------------------------- jQuery( '.wpbc_processing.wpbc_spin').parent().parent().parent().parent( '[id^="wpbc_notice_"]' ).hide(); // Load calendar --------------------------------------------------------------------------------------------------------- wpbc_ajx_customize_plugin__calendar__show( { 'resource_id' : ajx_cleaned_params.resource_id, 'ajx_nonce_calendar': ajx_data.ajx_nonce_calendar, 'ajx_data_arr' : ajx_data, 'ajx_cleaned_params' : ajx_cleaned_params } ); //------------------------------------------------------------------------------------------------------------------ /** * Change calendar skin view */ jQuery( '.wpbc_radio__set_days_customize_plugin' ).on('change', function ( event, resource_id, inst ){ wpbc__calendar__change_skin( jQuery( this ).val() ); }); // Re-load Tooltips jQuery( document ).ready( function (){ wpbc_define_tippy_tooltips( wpbc_ajx_customize_plugin.get_other_param( 'listing_container' ) + ' ' ); wpbc_define_tippy_tooltips( wpbc_ajx_customize_plugin.get_other_param( 'toolbar_container' ) + ' ' ); }); } /** * Show inline month view calendar with all predefined CSS (sizes and check in/out, times containers) * @param {obj} calendar_params_arr { 'resource_id' : ajx_cleaned_params.resource_id, 'ajx_nonce_calendar' : ajx_data_arr.ajx_nonce_calendar, 'ajx_data_arr' : ajx_data_arr = { ajx_booking_resources:[], resource_unavailable_dates:[], season_customize_plugin:{},.... } 'ajx_cleaned_params' : { calendar__days_selection_mode: "dynamic" calendar__timeslot_day_bg_as_available: "" calendar__view__cell_height: "" calendar__view__months_in_row: 4 calendar__view__visible_months: 12 calendar__view__width: "100%" dates_customize_plugin: "unavailable" dates_selection: "2023-03-14 ~ 2023-03-16" do_action: "set_customize_plugin" resource_id: 1 ui_clicked_element_id: "wpbc_customize_plugin_apply_btn" ui_usr__customize_plugin_selected_toolbar: "info" } } */ function wpbc_ajx_customize_plugin__calendar__show( calendar_params_arr ){ // Update nonce jQuery( '#ajx_nonce_calendar_section' ).html( calendar_params_arr.ajx_nonce_calendar ); //------------------------------------------------------------------------------------------------------------------ // Update bookings //------------------------------------------------------------------------------------------------------------------ if ( 'undefined' == typeof (wpbc_ajx_bookings[ calendar_params_arr.resource_id ]) ){ wpbc_ajx_bookings[ calendar_params_arr.resource_id ] = []; } wpbc_ajx_bookings[ calendar_params_arr.resource_id ] = calendar_params_arr[ 'ajx_data_arr' ][ 'calendar_settings' ][ 'booked_dates' ]; //------------------------------------------------------------------------------------------------------------------ // Get scrolling month or year in calendar and save it to the init parameters //------------------------------------------------------------------------------------------------------------------ jQuery( 'body' ).off( 'wpbc__inline_booking_calendar__changed_year_month' ); jQuery( 'body' ).on( 'wpbc__inline_booking_calendar__changed_year_month', function ( event, year, month, calendar_params_arr, datepick_this ){ wpbc_ajx_customize_plugin.search_set_param( 'calendar__start_year', year ); wpbc_ajx_customize_plugin.search_set_param( 'calendar__start_month', month ); } ); //------------------------------------------------------------------------------------------------------------------ // Define showing mouse over tooltip on unavailable dates //------------------------------------------------------------------------------------------------------------------ jQuery( 'body' ).on( 'wpbc_datepick_inline_calendar_refresh', function ( event, resource_id, inst ){ /** * It's defined, when calendar REFRESHED (change months or days selection) loaded in jquery.datepick.wpbc.9.0.js : * $( 'body' ).trigger( 'wpbc_datepick_inline_calendar_refresh', ... //FixIn: 9.4.4.13 */ // inst.dpDiv it's: <div class="datepick-inline datepick-multi" style="width: 17712px;">....</div> inst.dpDiv.find( '.season_unavailable,.before_after_unavailable,.weekdays_unavailable' ).on( 'mouseover', function ( this_event ){ // also available these vars: resource_id, jCalContainer, inst var jCell = jQuery( this_event.currentTarget ); wpbc_cstm__show_tooltip__for_element( jCell, calendar_params_arr[ 'ajx_data_arr' ]['popover_hints'] ); }); }); //------------------------------------------------------------------------------------------------------------------ // Define height of the calendar cells, and mouse over tooltips at some unavailable dates //------------------------------------------------------------------------------------------------------------------ jQuery( 'body' ).on( 'wpbc_datepick_inline_calendar_loaded', function ( event, resource_id, jCalContainer, inst ){ /** * It's defined, when calendar loaded in jquery.datepick.wpbc.9.0.js : * $( 'body' ).trigger( 'wpbc_datepick_inline_calendar_loaded', ... //FixIn: 9.4.4.12 */ // Remove highlight day for today date jQuery( '.datepick-days-cell.datepick-today.datepick-days-cell-over' ).removeClass( 'datepick-days-cell-over' ); // Set height of calendar cells if defined this option var stylesheet = document.getElementById( 'wpbc-calendar-cell-height' ); if ( null !== stylesheet ){ stylesheet.parentNode.removeChild( stylesheet ); } if ( '' !== calendar_params_arr.ajx_cleaned_params.calendar__view__cell_height ){ jQuery( 'head' ).append( '<style type="text/css" id="wpbc-calendar-cell-height">' + '.hasDatepick .datepick-inline .datepick-title-row th, ' + '.hasDatepick .datepick-inline .datepick-days-cell {' + 'height: ' + calendar_params_arr.ajx_cleaned_params.calendar__view__cell_height + ' !important;' + '}' +'</style>' ); } // Define showing mouse over tooltip on unavailable dates jCalContainer.find( '.season_unavailable,.before_after_unavailable,.weekdays_unavailable' ).on( 'mouseover', function ( this_event ){ // also available these vars: resource_id, jCalContainer, inst var jCell = jQuery( this_event.currentTarget ); wpbc_cstm__show_tooltip__for_element( jCell, calendar_params_arr[ 'ajx_data_arr' ]['popover_hints'] ); }); } ); //------------------------------------------------------------------------------------------------------------------ // Define months_in_row //------------------------------------------------------------------------------------------------------------------ if ( ( undefined == calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row ) || ( '' == calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row ) ){ calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row = calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months; } //------------------------------------------------------------------------------------------------------------------ // Define width of entire calendar //------------------------------------------------------------------------------------------------------------------ var width = ''; // var width = 'width:100%;max-width:100%;'; // Width /* FixIn: 9.7.3.4 */ if ( ( undefined != calendar_params_arr.ajx_cleaned_params.calendar__view__width ) && ( '' !== calendar_params_arr.ajx_cleaned_params.calendar__view__width ) ){ width += 'max-width:' + calendar_params_arr.ajx_cleaned_params.calendar__view__width + ';'; width += 'width:100%;'; } //------------------------------------------------------------------------------------------------------------------ // Add calendar container: "Calendar is loading..." and textarea //------------------------------------------------------------------------------------------------------------------ jQuery( '.wpbc_ajx_cstm__calendar' ).html( '<div class="' + ' bk_calendar_frame' + ' months_num_in_row_' + calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row + ' cal_month_num_' + calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months + ' ' + calendar_params_arr.ajx_cleaned_params.calendar__timeslot_day_bg_as_available // 'wpbc_timeslot_day_bg_as_available' || '' + '" ' + 'style="' + width + '">' + '<div id="calendar_booking' + calendar_params_arr.resource_id + '">' + 'Calendar is loading...' + '</div>' + '</div>' + '<textarea id="date_booking' + calendar_params_arr.resource_id + '"' + ' name="date_booking' + calendar_params_arr.resource_id + '"' + ' autocomplete="off"' + ' style="display:none;width:100%;height:10em;margin:2em 0 0;"></textarea>' ); //------------------------------------------------------------------------------------------------------------------ // Define variables for calendar //------------------------------------------------------------------------------------------------------------------ var cal_param_arr = calendar_params_arr.ajx_data_arr.calendar_settings; cal_param_arr[ 'html_id' ] = 'calendar_booking' + calendar_params_arr.ajx_cleaned_params.resource_id; cal_param_arr[ 'text_id' ] = 'date_booking' + calendar_params_arr.ajx_cleaned_params.resource_id; cal_param_arr[ 'resource_id' ] = calendar_params_arr.ajx_cleaned_params.resource_id; cal_param_arr[ 'ajx_nonce_calendar' ] = calendar_params_arr.ajx_data_arr.ajx_nonce_calendar; cal_param_arr[ 'season_customize_plugin' ] = calendar_params_arr.ajx_data_arr.season_customize_plugin; cal_param_arr[ 'resource_unavailable_dates' ] = calendar_params_arr.ajx_data_arr.resource_unavailable_dates; cal_param_arr[ 'popover_hints' ] = calendar_params_arr.ajx_data_arr.popover_hints; // {'season_unavailable':'...','weekdays_unavailable':'...','before_after_unavailable':'...',} //------------------------------------------------------------------------------------------------------------------ // Show Calendar //------------------------------------------------------------------------------------------------------------------ wpbc_show_inline_booking_calendar( cal_param_arr ); //------------------------------------------------------------------------------------------------------------------ // Scroll to specific Year and Month, if defined in init parameters //------------------------------------------------------------------------------------------------------------------ var s_year = wpbc_ajx_customize_plugin.search_get_param( 'calendar__start_year' ); var s_month = wpbc_ajx_customize_plugin.search_get_param( 'calendar__start_month' ); if ( ( 0 !== s_year ) && ( 0 !== s_month ) ){ wpbc__inline_booking_calendar__change_year_month( cal_param_arr[ 'resource_id' ], s_year, s_month ) } } /** * Tooltips ---------------------------------------------------------------------------------------------- */ /** * Define showing tooltip, when mouse over on SELECTABLE (available, pending, approved, resource unavailable), days * Can be called directly from datepick init function. * * @param value * @param date * @param calendar_params_arr * @param datepick_this * @returns {boolean} */ function wpbc_cstm__prepare_tooltip__in_calendar( value, date, calendar_params_arr, datepick_this ){ if ( null == date ){ return false; } var td_class = ( date.getMonth() + 1 ) + '-' + date.getDate() + '-' + date.getFullYear(); var jCell = jQuery( '#calendar_booking' + calendar_params_arr.resource_id + ' td.cal4date-' + td_class ); wpbc_cstm__show_tooltip__for_element( jCell, calendar_params_arr[ 'popover_hints' ] ); return true; } /** * Define tooltip for showing on UNAVAILABLE days (season, weekday, today_depends unavailable) * * @param jCell jQuery of specific day cell * @param popover_hints Array with tooltip hint texts : {'season_unavailable':'...','weekdays_unavailable':'...','before_after_unavailable':'...',} */ function wpbc_cstm__show_tooltip__for_element( jCell, popover_hints ){ var tooltip_time = ''; if ( jCell.hasClass( 'season_unavailable' ) ){ tooltip_time = popover_hints[ 'season_unavailable' ]; } else if ( jCell.hasClass( 'weekdays_unavailable' ) ){ tooltip_time = popover_hints[ 'weekdays_unavailable' ]; } else if ( jCell.hasClass( 'before_after_unavailable' ) ){ tooltip_time = popover_hints[ 'before_after_unavailable' ]; } else if ( jCell.hasClass( 'date2approve' ) ){ } else if ( jCell.hasClass( 'date_approved' ) ){ } else { } jCell.attr( 'data-content', tooltip_time ); var td_el = jCell.get(0); //jQuery( '#calendar_booking' + calendar_params_arr.resource_id + ' td.cal4date-' + td_class ).get(0); if ( ( undefined == td_el._tippy ) && ( '' != tooltip_time ) ){ wpbc_tippy( td_el , { content( reference ){ var popover_content = reference.getAttribute( 'data-content' ); return '<div class="popover popover_tippy">' + '<div class="popover-content">' + popover_content + '</div>' + '</div>'; }, allowHTML : true, trigger : 'mouseenter focus', interactive : ! true, hideOnClick : true, interactiveBorder: 10, maxWidth : 550, theme : 'wpbc-tippy-times', placement : 'top', delay : [400, 0], //FixIn: 9.4.2.2 ignoreAttributes : true, touch : true, //['hold', 500], // 500ms delay //FixIn: 9.2.1.5 appendTo: () => document.body, }); } } /** * Ajax ------------------------------------------------------------------------------------------------------ */ /** * Send Ajax show request */ function wpbc_ajx_customize_plugin__ajax_request(){ console.groupCollapsed( 'WPBC_AJX_CUSTOMIZE_PLUGIN' ); console.log( ' == Before Ajax Send - search_get_all_params() == ' , wpbc_ajx_customize_plugin.search_get_all_params() ); wpbc_customize_plugin_reload_button__spin_start(); // Start Ajax jQuery.post( wpbc_url_ajax, { action : 'WPBC_AJX_CUSTOMIZE_PLUGIN', wpbc_ajx_user_id: wpbc_ajx_customize_plugin.get_secure_param( 'user_id' ), nonce : wpbc_ajx_customize_plugin.get_secure_param( 'nonce' ), wpbc_ajx_locale : wpbc_ajx_customize_plugin.get_secure_param( 'locale' ), search_params : wpbc_ajx_customize_plugin.search_get_all_params() }, /** * S u c c e s s * * @param response_data - its object returned from Ajax - class-live-searcg.php * @param textStatus - 'success' * @param jqXHR - Object */ function ( response_data, textStatus, jqXHR ) { console.log( ' == Response WPBC_AJX_CUSTOMIZE_PLUGIN == ', response_data ); console.groupEnd(); // Probably Error if ( (typeof response_data !== 'object') || (response_data === null) ){ wpbc_ajx_customize_plugin__actual_content__hide(); wpbc_ajx_customize_plugin__show_message( response_data ); return; } // Reload page, after filter toolbar has been reset if ( ( undefined != response_data[ 'ajx_cleaned_params' ]) && ( 'reset_done' === response_data[ 'ajx_cleaned_params' ][ 'do_action' ]) ){ location.reload(); return; } // Show listing wpbc_ajx_customize_plugin__page_content__show( response_data[ 'ajx_data' ], response_data[ 'ajx_search_params' ] , response_data[ 'ajx_cleaned_params' ] ); //wpbc_ajx_customize_plugin__define_ui_hooks(); // Redefine Hooks, because we show new DOM elements if ( '' != response_data[ 'ajx_data' ][ 'ajx_after_action_message' ].replace( /\n/g, "<br />" ) ){ wpbc_admin_show_message( response_data[ 'ajx_data' ][ 'ajx_after_action_message' ].replace( /\n/g, "<br />" ) , ( '1' == response_data[ 'ajx_data' ][ 'ajx_after_action_result' ] ) ? 'success' : 'error' , 10000 ); } wpbc_customize_plugin_reload_button__spin_pause(); // Remove spin icon from button and Enable this button. wpbc_button__remove_spin( response_data[ 'ajx_cleaned_params' ][ 'ui_clicked_element_id' ] ) jQuery( '#ajax_respond' ).html( response_data ); // For ability to show response, add such DIV element to page } ).fail( function ( jqXHR, textStatus, errorThrown ) { if ( window.console && window.console.log ){ console.log( 'Ajax_Error', jqXHR, textStatus, errorThrown ); } var error_message = '<strong>' + 'Error!' + '</strong> ' + errorThrown ; if ( jqXHR.status ){ error_message += ' (<b>' + jqXHR.status + '</b>)'; if (403 == jqXHR.status ){ error_message += ' Probably nonce for this page has been expired. Please <a href="javascript:void(0)" onclick="javascript:location.reload();">reload the page</a>.'; } } if ( jqXHR.responseText ){ error_message += ' ' + jqXHR.responseText; } error_message = error_message.replace( /\n/g, "<br />" ); wpbc_ajx_customize_plugin__actual_content__hide(); wpbc_ajx_customize_plugin__show_message( error_message ); }) // .done( function ( data, textStatus, jqXHR ) { if ( window.console && window.console.log ){ console.log( 'second success', data, textStatus, jqXHR ); } }) // .always( function ( data_jqXHR, textStatus, jqXHR_errorThrown ) { if ( window.console && window.console.log ){ console.log( 'always finished', data_jqXHR, textStatus, jqXHR_errorThrown ); } }) ; // End Ajax } /** * H o o k s - its Action/Times when need to re-Render Views ----------------------------------------------- */ /** * Send Ajax Search Request after Updating search request parameters * * @param params_arr */ function wpbc_ajx_customize_plugin__send_request_with_params ( params_arr ){ // Define different Search parameters for request _.each( params_arr, function ( p_val, p_key, p_data ) { //console.log( 'Request for: ', p_key, p_val ); wpbc_ajx_customize_plugin.search_set_param( p_key, p_val ); }); // Send Ajax Request wpbc_ajx_customize_plugin__ajax_request(); } /** * Search request for "Page Number" * @param page_number int */ function wpbc_ajx_customize_plugin__pagination_click( page_number ){ wpbc_ajx_customize_plugin__send_request_with_params( { 'page_num': page_number } ); } /** * Show / Hide Content --------------------------------------------------------------------------------------- */ /** * Show Listing Content - Sending Ajax Request - with parameters that we early defined */ function wpbc_ajx_customize_plugin__actual_content__show(){ wpbc_ajx_customize_plugin__ajax_request(); // Send Ajax Request - with parameters that we early defined in "wpbc_ajx_booking_listing" Obj. } /** * Hide Listing Content */ function wpbc_ajx_customize_plugin__actual_content__hide(){ jQuery( wpbc_ajx_customize_plugin.get_other_param( 'listing_container' ) ).html( '' ); } /** * M e s s a g e --------------------------------------------------------------------------------------------- */ /** * */ /** * Show message in content * * @param message Message HTML * @param params = { * ['type'] 'warning' | 'info' | 'error' | 'success' default: 'warning' * ['container'] '.wpbc_ajx_cstm__section_left' default: wpbc_ajx_customize_plugin.get_other_param( 'listing_container' ) * ['is_append'] true | false default: true * } * Example: * var html_id = wpbc_ajx_customize_plugin__show_message( 'You can test days selection in calendar', 'info', '.wpbc_ajx_cstm__section_left', true ); * * * @returns string - HTML ID */ function wpbc_ajx_customize_plugin__show_message( message, params = {} ){ var params_default = { 'type' : 'warning', 'container': wpbc_ajx_customize_plugin.get_other_param( 'listing_container' ), 'is_append': true, 'style' : 'text-align:left;', 'delay' : 0 }; _.each( params, function ( p_val, p_key, p_data ){ params_default[ p_key ] = p_val; } ); params = params_default; var unique_div_id = new Date(); unique_div_id = 'wpbc_notice_' + unique_div_id.getTime(); var alert_class = 'notice '; if ( params['type'] == 'error' ){ alert_class += 'notice-error '; message = '<i style="margin-right: 0.5em;color: #d63638;" class="menu_icon icon-1x wpbc_icn_report_gmailerrorred"></i>' + message; } if ( params['type'] == 'warning' ){ alert_class += 'notice-warning '; message = '<i style="margin-right: 0.5em;color: #e9aa04;" class="menu_icon icon-1x wpbc_icn_warning"></i>' + message; } if ( params['type'] == 'info' ){ alert_class += 'notice-info '; } if ( params['type'] == 'success' ){ alert_class += 'notice-info alert-success updated '; message = '<i style="margin-right: 0.5em;color: #64aa45;" class="menu_icon icon-1x wpbc_icn_done_outline"></i>' + message; } message = '<div id="' + unique_div_id + '" class="wpbc-settings-notice ' + alert_class + '" style="' + params[ 'style' ] + '">' + message + '</div>'; if ( params['is_append'] ){ jQuery( params['container'] ).append( message ); } else { jQuery( params['container'] ).html( message ); } params['delay'] = parseInt( params['delay'] ); if ( params['delay'] > 0 ){ var closed_timer = setTimeout( function (){ jQuery( '#' + unique_div_id ).fadeOut( 1500 ); } , params[ 'delay' ] ); } return unique_div_id; } /** * Support Functions - Spin Icon in Buttons ------------------------------------------------------------------ */ /** * Spin button in Filter toolbar - Start */ function wpbc_customize_plugin_reload_button__spin_start(){ jQuery( '#wpbc_customize_plugin_reload_button .menu_icon.wpbc_spin').removeClass( 'wpbc_animation_pause' ); } /** * Spin button in Filter toolbar - Pause */ function wpbc_customize_plugin_reload_button__spin_pause(){ jQuery( '#wpbc_customize_plugin_reload_button .menu_icon.wpbc_spin' ).addClass( 'wpbc_animation_pause' ); } /** * Spin button in Filter toolbar - is Spinning ? * * @returns {boolean} */ function wpbc_customize_plugin_reload_button__is_spin(){ if ( jQuery( '#wpbc_customize_plugin_reload_button .menu_icon.wpbc_spin' ).hasClass( 'wpbc_animation_pause' ) ){ return true; } else { return false; } } _out/customize_plugin_page.js 0000666 00000322556 15167025561 0012475 0 ustar 00 "use strict"; /** * Request Object * Here we can define Search parameters and Update it later, when some parameter was changed * */ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } var wpbc_ajx_customize_plugin = function (obj, $) { // Secure parameters for Ajax ------------------------------------------------------------------------------------ var p_secure = obj.security_obj = obj.security_obj || { user_id: 0, nonce: '', locale: '' }; obj.set_secure_param = function (param_key, param_val) { p_secure[param_key] = param_val; }; obj.get_secure_param = function (param_key) { return p_secure[param_key]; }; // Listing Search parameters ------------------------------------------------------------------------------------ var p_listing = obj.search_request_obj = obj.search_request_obj || { // sort : "booking_id", // sort_type : "DESC", // page_num : 1, // page_items_count: 10, // create_date : "", // keyword : "", // source : "" }; obj.search_set_all_params = function (request_param_obj) { p_listing = request_param_obj; }; obj.search_get_all_params = function () { return p_listing; }; obj.search_get_param = function (param_key) { return p_listing[param_key]; }; obj.search_set_param = function (param_key, param_val) { // if ( Array.isArray( param_val ) ){ // param_val = JSON.stringify( param_val ); // } p_listing[param_key] = param_val; }; obj.search_set_params_arr = function (params_arr) { _.each(params_arr, function (p_val, p_key, p_data) { // Define different Search parameters for request this.search_set_param(p_key, p_val); }); }; // Other parameters ------------------------------------------------------------------------------------ var p_other = obj.other_obj = obj.other_obj || {}; obj.set_other_param = function (param_key, param_val) { p_other[param_key] = param_val; }; obj.get_other_param = function (param_key) { return p_other[param_key]; }; return obj; }(wpbc_ajx_customize_plugin || {}, jQuery); var wpbc_ajx_bookings = []; /** * Show Content ---------------------------------------------------------------------------------------------- */ /** * Show Content - Calendar and UI elements * * @param ajx_data * @param ajx_search_params * @param ajx_cleaned_params */ function wpbc_ajx_customize_plugin__page_content__show(ajx_data, ajx_search_params, ajx_cleaned_params) { // Content --------------------------------------------------------------------------------------------------------- var template__customize_plugin_main_page_content = wp.template('wpbc_ajx_customize_plugin_main_page_content'); jQuery(wpbc_ajx_customize_plugin.get_other_param('listing_container')).html(template__customize_plugin_main_page_content({ 'ajx_data': ajx_data, 'ajx_search_params': ajx_search_params, // $_REQUEST[ 'search_params' ] 'ajx_cleaned_params': ajx_cleaned_params })); var template__inline_calendar; var data_arr = { 'ajx_data': ajx_data, 'ajx_search_params': ajx_search_params, 'ajx_cleaned_params': ajx_cleaned_params }; switch (ajx_data['customize_steps']['current']) { case 'calendar_skin': // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template('wpbc_ajx_customize_plugin__inline_calendar'); jQuery('.wpbc_ajx_cstm__section_left').html(template__inline_calendar(data_arr)); // Calendar Skin var template__wiget_calendar_skin = wp.template('wpbc_ajx_widget_change_calendar_skin'); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append(template__wiget_calendar_skin(data_arr)); // Shortcode // var template__widget_plugin_shortcode = wp.template( 'wpbc_ajx_widget_plugin_shortcode' ); // jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__widget_plugin_shortcode( data_arr ) ); // Size // var template__wiget_calendar_size = wp.template( 'wpbc_ajx_widget_calendar_size' ); // jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__wiget_calendar_size( data_arr ) ); break; case 'calendar_size': // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template('wpbc_ajx_customize_plugin__inline_calendar'); jQuery('.wpbc_ajx_cstm__section_left').html(template__inline_calendar(data_arr)); // Calendar Skin var template__wiget_calendar_size = wp.template('wpbc_ajx_widget_calendar_size'); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append(template__wiget_calendar_size(data_arr)); // Shortcode // var template__widget_plugin_shortcode = wp.template( 'wpbc_ajx_widget_plugin_shortcode' ); // jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__widget_plugin_shortcode( data_arr ) ); break; case 'calendar_dates_selection': // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template('wpbc_ajx_customize_plugin__inline_calendar'); jQuery('.wpbc_ajx_cstm__section_left').html(template__inline_calendar(data_arr)); jQuery('.wpbc_ajx_cstm__section_left').append('<div class="clear" style="width:100%;margin:50px 0 0;"></div>'); var message_html_id = wpbc_ajx_customize_plugin__show_message('<strong>' + 'You can test days selection in calendar' + '</strong>', { 'container': '.wpbc_ajx_cstm__section_left', // '#ajax_working', 'style': 'margin: 6px auto; padding: 6px 20px;z-index: 999999;', 'type': 'info', 'delay': 5000 }); wpbc_blink_element('#' + message_html_id, 3, 320); // Widget - Dates selection var template__widget_plugin_calendar_dates_selection = wp.template('wpbc_ajx_widget_calendar_dates_selection'); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append(template__widget_plugin_calendar_dates_selection(data_arr)); break; case 'calendar_weekdays_availability': // Scroll to current month var s_year = wpbc_ajx_customize_plugin.search_set_param('calendar__start_year', 0); var s_month = wpbc_ajx_customize_plugin.search_set_param('calendar__start_month', 0); // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template('wpbc_ajx_customize_plugin__inline_calendar'); jQuery('.wpbc_ajx_cstm__section_left').html(template__inline_calendar(data_arr)); // Widget - Weekdays Availability var template__widget_plugin_calendar_weekdays_availability = wp.template('wpbc_ajx_widget_calendar_weekdays_availability'); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append(template__widget_plugin_calendar_weekdays_availability(data_arr)); break; case 'calendar_additional': // Calendar -------------------------------------------------------------------------------------------- template__inline_calendar = wp.template('wpbc_ajx_customize_plugin__inline_calendar'); jQuery('.wpbc_ajx_cstm__section_left').html(template__inline_calendar(data_arr)); // Calendar Skin var template__wiget_calendar_additional = wp.template('wpbc_ajx_widget_calendar_additional'); jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append(template__wiget_calendar_additional(data_arr)); // Shortcode // var template__widget_plugin_shortcode = wp.template( 'wpbc_ajx_widget_plugin_shortcode' ); // jQuery('.wpbc_ajx_cstm__section_right .wpbc_widgets').append( template__widget_plugin_shortcode( data_arr ) ); break; default: //console.log( `Sorry, we are out of ${expr}.` ); } // Toolbar --------------------------------------------------------------------------------------------------------- var template__customize_plugin_toolbar_page_content = wp.template('wpbc_ajx_customize_plugin_toolbar_page_content'); jQuery(wpbc_ajx_customize_plugin.get_other_param('toolbar_container')).html(template__customize_plugin_toolbar_page_content({ 'ajx_data': ajx_data, 'ajx_search_params': ajx_search_params, // $_REQUEST[ 'search_params' ] 'ajx_cleaned_params': ajx_cleaned_params })); // Booking resources ------------------------------------------------------------------------------------------ var wpbc_ajx_select_booking_resource = wp.template('wpbc_ajx_select_booking_resource'); jQuery('#wpbc_hidden_template__select_booking_resource').html(wpbc_ajx_select_booking_resource({ 'ajx_data': ajx_data, 'ajx_search_params': ajx_search_params, 'ajx_cleaned_params': ajx_cleaned_params })); /* * By default hided at ../wp-content/plugins/booking/includes/page-customize/_src/customize_plugin_page.css #wpbc_hidden_template__select_booking_resource { display: none; } * * We can hide ///- Hide resources! * //setTimeout( function (){ jQuery( '#wpbc_hidden_template__select_booking_resource' ).html( '' ); }, 1000 ); */ // Other --------------------------------------------------------------------------------------------------------- jQuery('.wpbc_processing.wpbc_spin').parent().parent().parent().parent('[id^="wpbc_notice_"]').hide(); // Load calendar --------------------------------------------------------------------------------------------------------- wpbc_ajx_customize_plugin__calendar__show({ 'resource_id': ajx_cleaned_params.resource_id, 'ajx_nonce_calendar': ajx_data.ajx_nonce_calendar, 'ajx_data_arr': ajx_data, 'ajx_cleaned_params': ajx_cleaned_params }); //------------------------------------------------------------------------------------------------------------------ /** * Change calendar skin view */ jQuery('.wpbc_radio__set_days_customize_plugin').on('change', function (event, resource_id, inst) { wpbc__calendar__change_skin(jQuery(this).val()); }); // Re-load Tooltips jQuery(document).ready(function () { wpbc_define_tippy_tooltips(wpbc_ajx_customize_plugin.get_other_param('listing_container') + ' '); wpbc_define_tippy_tooltips(wpbc_ajx_customize_plugin.get_other_param('toolbar_container') + ' '); }); } /** * Show inline month view calendar with all predefined CSS (sizes and check in/out, times containers) * @param {obj} calendar_params_arr { 'resource_id' : ajx_cleaned_params.resource_id, 'ajx_nonce_calendar' : ajx_data_arr.ajx_nonce_calendar, 'ajx_data_arr' : ajx_data_arr = { ajx_booking_resources:[], resource_unavailable_dates:[], season_customize_plugin:{},.... } 'ajx_cleaned_params' : { calendar__days_selection_mode: "dynamic" calendar__timeslot_day_bg_as_available: "" calendar__view__cell_height: "" calendar__view__months_in_row: 4 calendar__view__visible_months: 12 calendar__view__width: "100%" dates_customize_plugin: "unavailable" dates_selection: "2023-03-14 ~ 2023-03-16" do_action: "set_customize_plugin" resource_id: 1 ui_clicked_element_id: "wpbc_customize_plugin_apply_btn" ui_usr__customize_plugin_selected_toolbar: "info" } } */ function wpbc_ajx_customize_plugin__calendar__show(calendar_params_arr) { // Update nonce jQuery('#ajx_nonce_calendar_section').html(calendar_params_arr.ajx_nonce_calendar); //------------------------------------------------------------------------------------------------------------------ // Update bookings //------------------------------------------------------------------------------------------------------------------ if ('undefined' == typeof wpbc_ajx_bookings[calendar_params_arr.resource_id]) { wpbc_ajx_bookings[calendar_params_arr.resource_id] = []; } wpbc_ajx_bookings[calendar_params_arr.resource_id] = calendar_params_arr['ajx_data_arr']['calendar_settings']['booked_dates']; //------------------------------------------------------------------------------------------------------------------ // Get scrolling month or year in calendar and save it to the init parameters //------------------------------------------------------------------------------------------------------------------ jQuery('body').off('wpbc__inline_booking_calendar__changed_year_month'); jQuery('body').on('wpbc__inline_booking_calendar__changed_year_month', function (event, year, month, calendar_params_arr, datepick_this) { wpbc_ajx_customize_plugin.search_set_param('calendar__start_year', year); wpbc_ajx_customize_plugin.search_set_param('calendar__start_month', month); }); //------------------------------------------------------------------------------------------------------------------ // Define showing mouse over tooltip on unavailable dates //------------------------------------------------------------------------------------------------------------------ jQuery('body').on('wpbc_datepick_inline_calendar_refresh', function (event, resource_id, inst) { /** * It's defined, when calendar REFRESHED (change months or days selection) loaded in jquery.datepick.wpbc.9.0.js : * $( 'body' ).trigger( 'wpbc_datepick_inline_calendar_refresh', ... //FixIn: 9.4.4.13 */ // inst.dpDiv it's: <div class="datepick-inline datepick-multi" style="width: 17712px;">....</div> inst.dpDiv.find('.season_unavailable,.before_after_unavailable,.weekdays_unavailable').on('mouseover', function (this_event) { // also available these vars: resource_id, jCalContainer, inst var jCell = jQuery(this_event.currentTarget); wpbc_cstm__show_tooltip__for_element(jCell, calendar_params_arr['ajx_data_arr']['popover_hints']); }); }); //------------------------------------------------------------------------------------------------------------------ // Define height of the calendar cells, and mouse over tooltips at some unavailable dates //------------------------------------------------------------------------------------------------------------------ jQuery('body').on('wpbc_datepick_inline_calendar_loaded', function (event, resource_id, jCalContainer, inst) { /** * It's defined, when calendar loaded in jquery.datepick.wpbc.9.0.js : * $( 'body' ).trigger( 'wpbc_datepick_inline_calendar_loaded', ... //FixIn: 9.4.4.12 */ // Remove highlight day for today date jQuery('.datepick-days-cell.datepick-today.datepick-days-cell-over').removeClass('datepick-days-cell-over'); // Set height of calendar cells if defined this option var stylesheet = document.getElementById('wpbc-calendar-cell-height'); if (null !== stylesheet) { stylesheet.parentNode.removeChild(stylesheet); } if ('' !== calendar_params_arr.ajx_cleaned_params.calendar__view__cell_height) { jQuery('head').append('<style type="text/css" id="wpbc-calendar-cell-height">' + '.hasDatepick .datepick-inline .datepick-title-row th, ' + '.hasDatepick .datepick-inline .datepick-days-cell {' + 'height: ' + calendar_params_arr.ajx_cleaned_params.calendar__view__cell_height + ' !important;' + '}' + '</style>'); } // Define showing mouse over tooltip on unavailable dates jCalContainer.find('.season_unavailable,.before_after_unavailable,.weekdays_unavailable').on('mouseover', function (this_event) { // also available these vars: resource_id, jCalContainer, inst var jCell = jQuery(this_event.currentTarget); wpbc_cstm__show_tooltip__for_element(jCell, calendar_params_arr['ajx_data_arr']['popover_hints']); }); }); //------------------------------------------------------------------------------------------------------------------ // Define months_in_row //------------------------------------------------------------------------------------------------------------------ if (undefined == calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row || '' == calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row) { calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row = calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months; } //------------------------------------------------------------------------------------------------------------------ // Define width of entire calendar //------------------------------------------------------------------------------------------------------------------ var width = ''; // var width = 'width:100%;max-width:100%;'; // Width /* FixIn: 9.7.3.4 */ if (undefined != calendar_params_arr.ajx_cleaned_params.calendar__view__width && '' !== calendar_params_arr.ajx_cleaned_params.calendar__view__width) { width += 'max-width:' + calendar_params_arr.ajx_cleaned_params.calendar__view__width + ';'; width += 'width:100%;'; } //------------------------------------------------------------------------------------------------------------------ // Add calendar container: "Calendar is loading..." and textarea //------------------------------------------------------------------------------------------------------------------ jQuery('.wpbc_ajx_cstm__calendar').html('<div class="' + ' bk_calendar_frame' + ' months_num_in_row_' + calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row + ' cal_month_num_' + calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months + ' ' + calendar_params_arr.ajx_cleaned_params.calendar__timeslot_day_bg_as_available // 'wpbc_timeslot_day_bg_as_available' || '' + '" ' + 'style="' + width + '">' + '<div id="calendar_booking' + calendar_params_arr.resource_id + '">' + 'Calendar is loading...' + '</div>' + '</div>' + '<textarea id="date_booking' + calendar_params_arr.resource_id + '"' + ' name="date_booking' + calendar_params_arr.resource_id + '"' + ' autocomplete="off"' + ' style="display:none;width:100%;height:10em;margin:2em 0 0;"></textarea>'); //------------------------------------------------------------------------------------------------------------------ // Define variables for calendar //------------------------------------------------------------------------------------------------------------------ var cal_param_arr = calendar_params_arr.ajx_data_arr.calendar_settings; cal_param_arr['html_id'] = 'calendar_booking' + calendar_params_arr.ajx_cleaned_params.resource_id; cal_param_arr['text_id'] = 'date_booking' + calendar_params_arr.ajx_cleaned_params.resource_id; cal_param_arr['resource_id'] = calendar_params_arr.ajx_cleaned_params.resource_id; cal_param_arr['ajx_nonce_calendar'] = calendar_params_arr.ajx_data_arr.ajx_nonce_calendar; cal_param_arr['season_customize_plugin'] = calendar_params_arr.ajx_data_arr.season_customize_plugin; cal_param_arr['resource_unavailable_dates'] = calendar_params_arr.ajx_data_arr.resource_unavailable_dates; cal_param_arr['popover_hints'] = calendar_params_arr.ajx_data_arr.popover_hints; // {'season_unavailable':'...','weekdays_unavailable':'...','before_after_unavailable':'...',} //------------------------------------------------------------------------------------------------------------------ // Show Calendar //------------------------------------------------------------------------------------------------------------------ wpbc_show_inline_booking_calendar(cal_param_arr); //------------------------------------------------------------------------------------------------------------------ // Scroll to specific Year and Month, if defined in init parameters //------------------------------------------------------------------------------------------------------------------ var s_year = wpbc_ajx_customize_plugin.search_get_param('calendar__start_year'); var s_month = wpbc_ajx_customize_plugin.search_get_param('calendar__start_month'); if (0 !== s_year && 0 !== s_month) { wpbc__inline_booking_calendar__change_year_month(cal_param_arr['resource_id'], s_year, s_month); } } /** * Tooltips ---------------------------------------------------------------------------------------------- */ /** * Define showing tooltip, when mouse over on SELECTABLE (available, pending, approved, resource unavailable), days * Can be called directly from datepick init function. * * @param value * @param date * @param calendar_params_arr * @param datepick_this * @returns {boolean} */ function wpbc_cstm__prepare_tooltip__in_calendar(value, date, calendar_params_arr, datepick_this) { if (null == date) { return false; } var td_class = date.getMonth() + 1 + '-' + date.getDate() + '-' + date.getFullYear(); var jCell = jQuery('#calendar_booking' + calendar_params_arr.resource_id + ' td.cal4date-' + td_class); wpbc_cstm__show_tooltip__for_element(jCell, calendar_params_arr['popover_hints']); return true; } /** * Define tooltip for showing on UNAVAILABLE days (season, weekday, today_depends unavailable) * * @param jCell jQuery of specific day cell * @param popover_hints Array with tooltip hint texts : {'season_unavailable':'...','weekdays_unavailable':'...','before_after_unavailable':'...',} */ function wpbc_cstm__show_tooltip__for_element(jCell, popover_hints) { var tooltip_time = ''; if (jCell.hasClass('season_unavailable')) { tooltip_time = popover_hints['season_unavailable']; } else if (jCell.hasClass('weekdays_unavailable')) { tooltip_time = popover_hints['weekdays_unavailable']; } else if (jCell.hasClass('before_after_unavailable')) { tooltip_time = popover_hints['before_after_unavailable']; } else if (jCell.hasClass('date2approve')) {} else if (jCell.hasClass('date_approved')) {} else {} jCell.attr('data-content', tooltip_time); var td_el = jCell.get(0); //jQuery( '#calendar_booking' + calendar_params_arr.resource_id + ' td.cal4date-' + td_class ).get(0); if (undefined == td_el._tippy && '' != tooltip_time) { wpbc_tippy(td_el, { content: function content(reference) { var popover_content = reference.getAttribute('data-content'); return '<div class="popover popover_tippy">' + '<div class="popover-content">' + popover_content + '</div>' + '</div>'; }, allowHTML: true, trigger: 'mouseenter focus', interactive: !true, hideOnClick: true, interactiveBorder: 10, maxWidth: 550, theme: 'wpbc-tippy-times', placement: 'top', delay: [400, 0], //FixIn: 9.4.2.2 ignoreAttributes: true, touch: true, //['hold', 500], // 500ms delay //FixIn: 9.2.1.5 appendTo: function appendTo() { return document.body; } }); } } /** * Ajax ------------------------------------------------------------------------------------------------------ */ /** * Send Ajax show request */ function wpbc_ajx_customize_plugin__ajax_request() { console.groupCollapsed('WPBC_AJX_CUSTOMIZE_PLUGIN'); console.log(' == Before Ajax Send - search_get_all_params() == ', wpbc_ajx_customize_plugin.search_get_all_params()); wpbc_customize_plugin_reload_button__spin_start(); // Start Ajax jQuery.post(wpbc_url_ajax, { action: 'WPBC_AJX_CUSTOMIZE_PLUGIN', wpbc_ajx_user_id: wpbc_ajx_customize_plugin.get_secure_param('user_id'), nonce: wpbc_ajx_customize_plugin.get_secure_param('nonce'), wpbc_ajx_locale: wpbc_ajx_customize_plugin.get_secure_param('locale'), search_params: wpbc_ajx_customize_plugin.search_get_all_params() }, /** * S u c c e s s * * @param response_data - its object returned from Ajax - class-live-searcg.php * @param textStatus - 'success' * @param jqXHR - Object */ function (response_data, textStatus, jqXHR) { console.log(' == Response WPBC_AJX_CUSTOMIZE_PLUGIN == ', response_data); console.groupEnd(); // Probably Error if (_typeof(response_data) !== 'object' || response_data === null) { wpbc_ajx_customize_plugin__actual_content__hide(); wpbc_ajx_customize_plugin__show_message(response_data); return; } // Reload page, after filter toolbar has been reset if (undefined != response_data['ajx_cleaned_params'] && 'reset_done' === response_data['ajx_cleaned_params']['do_action']) { location.reload(); return; } // Show listing wpbc_ajx_customize_plugin__page_content__show(response_data['ajx_data'], response_data['ajx_search_params'], response_data['ajx_cleaned_params']); //wpbc_ajx_customize_plugin__define_ui_hooks(); // Redefine Hooks, because we show new DOM elements if ('' != response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g, "<br />")) { wpbc_admin_show_message(response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g, "<br />"), '1' == response_data['ajx_data']['ajx_after_action_result'] ? 'success' : 'error', 10000); } wpbc_customize_plugin_reload_button__spin_pause(); // Remove spin icon from button and Enable this button. wpbc_button__remove_spin(response_data['ajx_cleaned_params']['ui_clicked_element_id']); jQuery('#ajax_respond').html(response_data); // For ability to show response, add such DIV element to page }).fail(function (jqXHR, textStatus, errorThrown) { if (window.console && window.console.log) { console.log('Ajax_Error', jqXHR, textStatus, errorThrown); } var error_message = '<strong>' + 'Error!' + '</strong> ' + errorThrown; if (jqXHR.status) { error_message += ' (<b>' + jqXHR.status + '</b>)'; if (403 == jqXHR.status) { error_message += ' Probably nonce for this page has been expired. Please <a href="javascript:void(0)" onclick="javascript:location.reload();">reload the page</a>.'; } } if (jqXHR.responseText) { error_message += ' ' + jqXHR.responseText; } error_message = error_message.replace(/\n/g, "<br />"); wpbc_ajx_customize_plugin__actual_content__hide(); wpbc_ajx_customize_plugin__show_message(error_message); }) // .done( function ( data, textStatus, jqXHR ) { if ( window.console && window.console.log ){ console.log( 'second success', data, textStatus, jqXHR ); } }) // .always( function ( data_jqXHR, textStatus, jqXHR_errorThrown ) { if ( window.console && window.console.log ){ console.log( 'always finished', data_jqXHR, textStatus, jqXHR_errorThrown ); } }) ; // End Ajax } /** * H o o k s - its Action/Times when need to re-Render Views ----------------------------------------------- */ /** * Send Ajax Search Request after Updating search request parameters * * @param params_arr */ function wpbc_ajx_customize_plugin__send_request_with_params(params_arr) { // Define different Search parameters for request _.each(params_arr, function (p_val, p_key, p_data) { //console.log( 'Request for: ', p_key, p_val ); wpbc_ajx_customize_plugin.search_set_param(p_key, p_val); }); // Send Ajax Request wpbc_ajx_customize_plugin__ajax_request(); } /** * Search request for "Page Number" * @param page_number int */ function wpbc_ajx_customize_plugin__pagination_click(page_number) { wpbc_ajx_customize_plugin__send_request_with_params({ 'page_num': page_number }); } /** * Show / Hide Content --------------------------------------------------------------------------------------- */ /** * Show Listing Content - Sending Ajax Request - with parameters that we early defined */ function wpbc_ajx_customize_plugin__actual_content__show() { wpbc_ajx_customize_plugin__ajax_request(); // Send Ajax Request - with parameters that we early defined in "wpbc_ajx_booking_listing" Obj. } /** * Hide Listing Content */ function wpbc_ajx_customize_plugin__actual_content__hide() { jQuery(wpbc_ajx_customize_plugin.get_other_param('listing_container')).html(''); } /** * M e s s a g e --------------------------------------------------------------------------------------------- */ /** * */ /** * Show message in content * * @param message Message HTML * @param params = { * ['type'] 'warning' | 'info' | 'error' | 'success' default: 'warning' * ['container'] '.wpbc_ajx_cstm__section_left' default: wpbc_ajx_customize_plugin.get_other_param( 'listing_container' ) * ['is_append'] true | false default: true * } * Example: * var html_id = wpbc_ajx_customize_plugin__show_message( 'You can test days selection in calendar', 'info', '.wpbc_ajx_cstm__section_left', true ); * * * @returns string - HTML ID */ function wpbc_ajx_customize_plugin__show_message(message) { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var params_default = { 'type': 'warning', 'container': wpbc_ajx_customize_plugin.get_other_param('listing_container'), 'is_append': true, 'style': 'text-align:left;', 'delay': 0 }; _.each(params, function (p_val, p_key, p_data) { params_default[p_key] = p_val; }); params = params_default; var unique_div_id = new Date(); unique_div_id = 'wpbc_notice_' + unique_div_id.getTime(); var alert_class = 'notice '; if (params['type'] == 'error') { alert_class += 'notice-error '; message = '<i style="margin-right: 0.5em;color: #d63638;" class="menu_icon icon-1x wpbc_icn_report_gmailerrorred"></i>' + message; } if (params['type'] == 'warning') { alert_class += 'notice-warning '; message = '<i style="margin-right: 0.5em;color: #e9aa04;" class="menu_icon icon-1x wpbc_icn_warning"></i>' + message; } if (params['type'] == 'info') { alert_class += 'notice-info '; } if (params['type'] == 'success') { alert_class += 'notice-info alert-success updated '; message = '<i style="margin-right: 0.5em;color: #64aa45;" class="menu_icon icon-1x wpbc_icn_done_outline"></i>' + message; } message = '<div id="' + unique_div_id + '" class="wpbc-settings-notice ' + alert_class + '" style="' + params['style'] + '">' + message + '</div>'; if (params['is_append']) { jQuery(params['container']).append(message); } else { jQuery(params['container']).html(message); } params['delay'] = parseInt(params['delay']); if (params['delay'] > 0) { var closed_timer = setTimeout(function () { jQuery('#' + unique_div_id).fadeOut(1500); }, params['delay']); } return unique_div_id; } /** * Support Functions - Spin Icon in Buttons ------------------------------------------------------------------ */ /** * Spin button in Filter toolbar - Start */ function wpbc_customize_plugin_reload_button__spin_start() { jQuery('#wpbc_customize_plugin_reload_button .menu_icon.wpbc_spin').removeClass('wpbc_animation_pause'); } /** * Spin button in Filter toolbar - Pause */ function wpbc_customize_plugin_reload_button__spin_pause() { jQuery('#wpbc_customize_plugin_reload_button .menu_icon.wpbc_spin').addClass('wpbc_animation_pause'); } /** * Spin button in Filter toolbar - is Spinning ? * * @returns {boolean} */ function wpbc_customize_plugin_reload_button__is_spin() { if (jQuery('#wpbc_customize_plugin_reload_button .menu_icon.wpbc_spin').hasClass('wpbc_animation_pause')) { return true; } else { return false; } } //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1jdXN0b21pemUvX291dC9jdXN0b21pemVfcGx1Z2luX3BhZ2UuanMiLCJuYW1lcyI6WyJfdHlwZW9mIiwib2JqIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsIndwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4iLCIkIiwicF9zZWN1cmUiLCJzZWN1cml0eV9vYmoiLCJ1c2VyX2lkIiwibm9uY2UiLCJsb2NhbGUiLCJzZXRfc2VjdXJlX3BhcmFtIiwicGFyYW1fa2V5IiwicGFyYW1fdmFsIiwiZ2V0X3NlY3VyZV9wYXJhbSIsInBfbGlzdGluZyIsInNlYXJjaF9yZXF1ZXN0X29iaiIsInNlYXJjaF9zZXRfYWxsX3BhcmFtcyIsInJlcXVlc3RfcGFyYW1fb2JqIiwic2VhcmNoX2dldF9hbGxfcGFyYW1zIiwic2VhcmNoX2dldF9wYXJhbSIsInNlYXJjaF9zZXRfcGFyYW0iLCJzZWFyY2hfc2V0X3BhcmFtc19hcnIiLCJwYXJhbXNfYXJyIiwiXyIsImVhY2giLCJwX3ZhbCIsInBfa2V5IiwicF9kYXRhIiwicF9vdGhlciIsIm90aGVyX29iaiIsInNldF9vdGhlcl9wYXJhbSIsImdldF9vdGhlcl9wYXJhbSIsImpRdWVyeSIsIndwYmNfYWp4X2Jvb2tpbmdzIiwid3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9fcGFnZV9jb250ZW50X19zaG93IiwiYWp4X2RhdGEiLCJhanhfc2VhcmNoX3BhcmFtcyIsImFqeF9jbGVhbmVkX3BhcmFtcyIsInRlbXBsYXRlX19jdXN0b21pemVfcGx1Z2luX21haW5fcGFnZV9jb250ZW50Iiwid3AiLCJ0ZW1wbGF0ZSIsImh0bWwiLCJ0ZW1wbGF0ZV9faW5saW5lX2NhbGVuZGFyIiwiZGF0YV9hcnIiLCJ0ZW1wbGF0ZV9fd2lnZXRfY2FsZW5kYXJfc2tpbiIsImFwcGVuZCIsInRlbXBsYXRlX193aWdldF9jYWxlbmRhcl9zaXplIiwibWVzc2FnZV9odG1sX2lkIiwid3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9fc2hvd19tZXNzYWdlIiwid3BiY19ibGlua19lbGVtZW50IiwidGVtcGxhdGVfX3dpZGdldF9wbHVnaW5fY2FsZW5kYXJfZGF0ZXNfc2VsZWN0aW9uIiwic195ZWFyIiwic19tb250aCIsInRlbXBsYXRlX193aWRnZXRfcGx1Z2luX2NhbGVuZGFyX3dlZWtkYXlzX2F2YWlsYWJpbGl0eSIsInRlbXBsYXRlX193aWdldF9jYWxlbmRhcl9hZGRpdGlvbmFsIiwidGVtcGxhdGVfX2N1c3RvbWl6ZV9wbHVnaW5fdG9vbGJhcl9wYWdlX2NvbnRlbnQiLCJ3cGJjX2FqeF9zZWxlY3RfYm9va2luZ19yZXNvdXJjZSIsInBhcmVudCIsImhpZGUiLCJ3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19jYWxlbmRhcl9fc2hvdyIsInJlc291cmNlX2lkIiwiYWp4X25vbmNlX2NhbGVuZGFyIiwib24iLCJldmVudCIsImluc3QiLCJ3cGJjX19jYWxlbmRhcl9fY2hhbmdlX3NraW4iLCJ2YWwiLCJkb2N1bWVudCIsInJlYWR5Iiwid3BiY19kZWZpbmVfdGlwcHlfdG9vbHRpcHMiLCJjYWxlbmRhcl9wYXJhbXNfYXJyIiwib2ZmIiwieWVhciIsIm1vbnRoIiwiZGF0ZXBpY2tfdGhpcyIsImRwRGl2IiwiZmluZCIsInRoaXNfZXZlbnQiLCJqQ2VsbCIsImN1cnJlbnRUYXJnZXQiLCJ3cGJjX2NzdG1fX3Nob3dfdG9vbHRpcF9fZm9yX2VsZW1lbnQiLCJqQ2FsQ29udGFpbmVyIiwicmVtb3ZlQ2xhc3MiLCJzdHlsZXNoZWV0IiwiZ2V0RWxlbWVudEJ5SWQiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJjYWxlbmRhcl9fdmlld19fY2VsbF9oZWlnaHQiLCJ1bmRlZmluZWQiLCJjYWxlbmRhcl9fdmlld19fbW9udGhzX2luX3JvdyIsImNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRocyIsIndpZHRoIiwiY2FsZW5kYXJfX3ZpZXdfX3dpZHRoIiwiY2FsZW5kYXJfX3RpbWVzbG90X2RheV9iZ19hc19hdmFpbGFibGUiLCJjYWxfcGFyYW1fYXJyIiwiYWp4X2RhdGFfYXJyIiwiY2FsZW5kYXJfc2V0dGluZ3MiLCJzZWFzb25fY3VzdG9taXplX3BsdWdpbiIsInJlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzIiwicG9wb3Zlcl9oaW50cyIsIndwYmNfc2hvd19pbmxpbmVfYm9va2luZ19jYWxlbmRhciIsIndwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19jaGFuZ2VfeWVhcl9tb250aCIsIndwYmNfY3N0bV9fcHJlcGFyZV90b29sdGlwX19pbl9jYWxlbmRhciIsInZhbHVlIiwiZGF0ZSIsInRkX2NsYXNzIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiZ2V0RnVsbFllYXIiLCJ0b29sdGlwX3RpbWUiLCJoYXNDbGFzcyIsImF0dHIiLCJ0ZF9lbCIsImdldCIsIl90aXBweSIsIndwYmNfdGlwcHkiLCJjb250ZW50IiwicmVmZXJlbmNlIiwicG9wb3Zlcl9jb250ZW50IiwiZ2V0QXR0cmlidXRlIiwiYWxsb3dIVE1MIiwidHJpZ2dlciIsImludGVyYWN0aXZlIiwiaGlkZU9uQ2xpY2siLCJpbnRlcmFjdGl2ZUJvcmRlciIsIm1heFdpZHRoIiwidGhlbWUiLCJwbGFjZW1lbnQiLCJkZWxheSIsImlnbm9yZUF0dHJpYnV0ZXMiLCJ0b3VjaCIsImFwcGVuZFRvIiwiYm9keSIsIndwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX2FqYXhfcmVxdWVzdCIsImNvbnNvbGUiLCJncm91cENvbGxhcHNlZCIsImxvZyIsIndwYmNfY3VzdG9taXplX3BsdWdpbl9yZWxvYWRfYnV0dG9uX19zcGluX3N0YXJ0IiwicG9zdCIsIndwYmNfdXJsX2FqYXgiLCJhY3Rpb24iLCJ3cGJjX2FqeF91c2VyX2lkIiwid3BiY19hanhfbG9jYWxlIiwic2VhcmNoX3BhcmFtcyIsInJlc3BvbnNlX2RhdGEiLCJ0ZXh0U3RhdHVzIiwianFYSFIiLCJncm91cEVuZCIsIndwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX2FjdHVhbF9jb250ZW50X19oaWRlIiwibG9jYXRpb24iLCJyZWxvYWQiLCJyZXBsYWNlIiwid3BiY19hZG1pbl9zaG93X21lc3NhZ2UiLCJ3cGJjX2N1c3RvbWl6ZV9wbHVnaW5fcmVsb2FkX2J1dHRvbl9fc3Bpbl9wYXVzZSIsIndwYmNfYnV0dG9uX19yZW1vdmVfc3BpbiIsImZhaWwiLCJlcnJvclRocm93biIsIndpbmRvdyIsImVycm9yX21lc3NhZ2UiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJ3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19zZW5kX3JlcXVlc3Rfd2l0aF9wYXJhbXMiLCJ3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19wYWdpbmF0aW9uX2NsaWNrIiwicGFnZV9udW1iZXIiLCJ3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19hY3R1YWxfY29udGVudF9fc2hvdyIsIm1lc3NhZ2UiLCJwYXJhbXMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJwYXJhbXNfZGVmYXVsdCIsInVuaXF1ZV9kaXZfaWQiLCJEYXRlIiwiZ2V0VGltZSIsImFsZXJ0X2NsYXNzIiwicGFyc2VJbnQiLCJjbG9zZWRfdGltZXIiLCJzZXRUaW1lb3V0IiwiZmFkZU91dCIsImFkZENsYXNzIiwid3BiY19jdXN0b21pemVfcGx1Z2luX3JlbG9hZF9idXR0b25fX2lzX3NwaW4iXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLWN1c3RvbWl6ZS9fc3JjL2N1c3RvbWl6ZV9wbHVnaW5fcGFnZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBSZXF1ZXN0IE9iamVjdFxyXG4gKiBIZXJlIHdlIGNhbiAgZGVmaW5lIFNlYXJjaCBwYXJhbWV0ZXJzIGFuZCBVcGRhdGUgaXQgbGF0ZXIsICB3aGVuICBzb21lIHBhcmFtZXRlciB3YXMgY2hhbmdlZFxyXG4gKlxyXG4gKi9cclxuXHJcbnZhciB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luID0gKGZ1bmN0aW9uICggb2JqLCAkKSB7XHJcblxyXG5cdC8vIFNlY3VyZSBwYXJhbWV0ZXJzIGZvciBBamF4XHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgcF9zZWN1cmUgPSBvYmouc2VjdXJpdHlfb2JqID0gb2JqLnNlY3VyaXR5X29iaiB8fCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXJfaWQ6IDAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5vbmNlICA6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsb2NhbGUgOiAnJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9O1xyXG5cclxuXHRvYmouc2V0X3NlY3VyZV9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5LCBwYXJhbV92YWwgKSB7XHJcblx0XHRwX3NlY3VyZVsgcGFyYW1fa2V5IF0gPSBwYXJhbV92YWw7XHJcblx0fTtcclxuXHJcblx0b2JqLmdldF9zZWN1cmVfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSApIHtcclxuXHRcdHJldHVybiBwX3NlY3VyZVsgcGFyYW1fa2V5IF07XHJcblx0fTtcclxuXHJcblxyXG5cdC8vIExpc3RpbmcgU2VhcmNoIHBhcmFtZXRlcnNcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBwX2xpc3RpbmcgPSBvYmouc2VhcmNoX3JlcXVlc3Rfb2JqID0gb2JqLnNlYXJjaF9yZXF1ZXN0X29iaiB8fCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHNvcnQgICAgICAgICAgICA6IFwiYm9va2luZ19pZFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzb3J0X3R5cGUgICAgICAgOiBcIkRFU0NcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gcGFnZV9udW0gICAgICAgIDogMSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gcGFnZV9pdGVtc19jb3VudDogMTAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGNyZWF0ZV9kYXRlICAgICA6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGtleXdvcmQgICAgICAgICA6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHNvdXJjZSAgICAgICAgICA6IFwiXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH07XHJcblxyXG5cdG9iai5zZWFyY2hfc2V0X2FsbF9wYXJhbXMgPSBmdW5jdGlvbiAoIHJlcXVlc3RfcGFyYW1fb2JqICkge1xyXG5cdFx0cF9saXN0aW5nID0gcmVxdWVzdF9wYXJhbV9vYmo7XHJcblx0fTtcclxuXHJcblx0b2JqLnNlYXJjaF9nZXRfYWxsX3BhcmFtcyA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBwX2xpc3Rpbmc7XHJcblx0fTtcclxuXHJcblx0b2JqLnNlYXJjaF9nZXRfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSApIHtcclxuXHRcdHJldHVybiBwX2xpc3RpbmdbIHBhcmFtX2tleSBdO1xyXG5cdH07XHJcblxyXG5cdG9iai5zZWFyY2hfc2V0X3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXksIHBhcmFtX3ZhbCApIHtcclxuXHRcdC8vIGlmICggQXJyYXkuaXNBcnJheSggcGFyYW1fdmFsICkgKXtcclxuXHRcdC8vIFx0cGFyYW1fdmFsID0gSlNPTi5zdHJpbmdpZnkoIHBhcmFtX3ZhbCApO1xyXG5cdFx0Ly8gfVxyXG5cdFx0cF9saXN0aW5nWyBwYXJhbV9rZXkgXSA9IHBhcmFtX3ZhbDtcclxuXHR9O1xyXG5cclxuXHRvYmouc2VhcmNoX3NldF9wYXJhbXNfYXJyID0gZnVuY3Rpb24oIHBhcmFtc19hcnIgKXtcclxuXHRcdF8uZWFjaCggcGFyYW1zX2FyciwgZnVuY3Rpb24gKCBwX3ZhbCwgcF9rZXksIHBfZGF0YSApe1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmluZSBkaWZmZXJlbnQgU2VhcmNoICBwYXJhbWV0ZXJzIGZvciByZXF1ZXN0XHJcblx0XHRcdHRoaXMuc2VhcmNoX3NldF9wYXJhbSggcF9rZXksIHBfdmFsICk7XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxuXHJcblx0Ly8gT3RoZXIgcGFyYW1ldGVycyBcdFx0XHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgcF9vdGhlciA9IG9iai5vdGhlcl9vYmogPSBvYmoub3RoZXJfb2JqIHx8IHsgfTtcclxuXHJcblx0b2JqLnNldF9vdGhlcl9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5LCBwYXJhbV92YWwgKSB7XHJcblx0XHRwX290aGVyWyBwYXJhbV9rZXkgXSA9IHBhcmFtX3ZhbDtcclxuXHR9O1xyXG5cclxuXHRvYmouZ2V0X290aGVyX3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXkgKSB7XHJcblx0XHRyZXR1cm4gcF9vdGhlclsgcGFyYW1fa2V5IF07XHJcblx0fTtcclxuXHJcblxyXG5cdHJldHVybiBvYmo7XHJcbn0oIHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4gfHwge30sIGpRdWVyeSApKTtcclxuXHJcbnZhciB3cGJjX2FqeF9ib29raW5ncyA9IFtdO1xyXG5cclxuLyoqXHJcbiAqICAgU2hvdyBDb250ZW50ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG4vKipcclxuICogU2hvdyBDb250ZW50IC0gQ2FsZW5kYXIgYW5kIFVJIGVsZW1lbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSBhanhfZGF0YVxyXG4gKiBAcGFyYW0gYWp4X3NlYXJjaF9wYXJhbXNcclxuICogQHBhcmFtIGFqeF9jbGVhbmVkX3BhcmFtc1xyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9fcGFnZV9jb250ZW50X19zaG93KCBhanhfZGF0YSwgYWp4X3NlYXJjaF9wYXJhbXMgLCBhanhfY2xlYW5lZF9wYXJhbXMgKXtcclxuXHJcblx0Ly8gQ29udGVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgdGVtcGxhdGVfX2N1c3RvbWl6ZV9wbHVnaW5fbWFpbl9wYWdlX2NvbnRlbnQgPSB3cC50ZW1wbGF0ZSggJ3dwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fbWFpbl9wYWdlX2NvbnRlbnQnICk7XHJcblx0alF1ZXJ5KCB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luLmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICkuaHRtbCggdGVtcGxhdGVfX2N1c3RvbWl6ZV9wbHVnaW5fbWFpbl9wYWdlX2NvbnRlbnQoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2RhdGEnICAgICAgICAgICAgICA6IGFqeF9kYXRhLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfc2VhcmNoX3BhcmFtcycgICAgIDogYWp4X3NlYXJjaF9wYXJhbXMsXHRcdFx0XHRcdFx0XHRcdC8vICRfUkVRVUVTVFsgJ3NlYXJjaF9wYXJhbXMnIF1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2NsZWFuZWRfcGFyYW1zJyAgICA6IGFqeF9jbGVhbmVkX3BhcmFtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9ICkgKTtcclxuXHJcblx0dmFyIHRlbXBsYXRlX19pbmxpbmVfY2FsZW5kYXI7XHJcblx0dmFyIGRhdGFfYXJyID0ge1xyXG5cdFx0XHRcdFx0XHRcdCdhanhfZGF0YScgICAgICAgICAgICAgIDogYWp4X2RhdGEsXHJcblx0XHRcdFx0XHRcdFx0J2FqeF9zZWFyY2hfcGFyYW1zJyAgICAgOiBhanhfc2VhcmNoX3BhcmFtcyxcclxuXHRcdFx0XHRcdFx0XHQnYWp4X2NsZWFuZWRfcGFyYW1zJyAgICA6IGFqeF9jbGVhbmVkX3BhcmFtc1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRzd2l0Y2ggKCBhanhfZGF0YVsnY3VzdG9taXplX3N0ZXBzJ11bJ2N1cnJlbnQnXSApe1xyXG5cclxuXHRcdGNhc2UgJ2NhbGVuZGFyX3NraW4nOlxyXG5cclxuXHRcdFx0Ly8gQ2FsZW5kYXIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHRcdHRlbXBsYXRlX19pbmxpbmVfY2FsZW5kYXIgPSB3cC50ZW1wbGF0ZSggJ3dwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX2lubGluZV9jYWxlbmRhcicgKTtcclxuXHRcdFx0alF1ZXJ5KCcud3BiY19hanhfY3N0bV9fc2VjdGlvbl9sZWZ0JykuaHRtbChcdHRlbXBsYXRlX19pbmxpbmVfY2FsZW5kYXIoIGRhdGFfYXJyICkgKTtcclxuXHJcblx0XHRcdC8vIENhbGVuZGFyIFNraW5cclxuXHRcdFx0dmFyIHRlbXBsYXRlX193aWdldF9jYWxlbmRhcl9za2luID0gd3AudGVtcGxhdGUoICd3cGJjX2FqeF93aWRnZXRfY2hhbmdlX2NhbGVuZGFyX3NraW4nICk7XHJcblx0XHRcdGpRdWVyeSgnLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fcmlnaHQgLndwYmNfd2lkZ2V0cycpLmFwcGVuZChcdHRlbXBsYXRlX193aWdldF9jYWxlbmRhcl9za2luKCBkYXRhX2FyciApICk7XHJcblxyXG5cdFx0XHQvLyBTaG9ydGNvZGVcclxuXHRcdFx0Ly8gdmFyIHRlbXBsYXRlX193aWRnZXRfcGx1Z2luX3Nob3J0Y29kZSA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfd2lkZ2V0X3BsdWdpbl9zaG9ydGNvZGUnICk7XHJcblx0XHRcdC8vIGpRdWVyeSgnLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fcmlnaHQgLndwYmNfd2lkZ2V0cycpLmFwcGVuZChcdHRlbXBsYXRlX193aWRnZXRfcGx1Z2luX3Nob3J0Y29kZSggZGF0YV9hcnIgKSApO1xyXG5cclxuXHRcdFx0Ly8gU2l6ZVxyXG5cdFx0XHQvLyB2YXIgdGVtcGxhdGVfX3dpZ2V0X2NhbGVuZGFyX3NpemUgPSB3cC50ZW1wbGF0ZSggJ3dwYmNfYWp4X3dpZGdldF9jYWxlbmRhcl9zaXplJyApO1xyXG5cdFx0XHQvLyBqUXVlcnkoJy53cGJjX2FqeF9jc3RtX19zZWN0aW9uX3JpZ2h0IC53cGJjX3dpZGdldHMnKS5hcHBlbmQoXHR0ZW1wbGF0ZV9fd2lnZXRfY2FsZW5kYXJfc2l6ZSggZGF0YV9hcnIgKSApO1xyXG5cclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSAnY2FsZW5kYXJfc2l6ZSc6XHJcblxyXG5cdFx0XHQvLyBDYWxlbmRhciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0dGVtcGxhdGVfX2lubGluZV9jYWxlbmRhciA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9faW5saW5lX2NhbGVuZGFyJyApO1xyXG5cdFx0XHRqUXVlcnkoJy53cGJjX2FqeF9jc3RtX19zZWN0aW9uX2xlZnQnKS5odG1sKFx0dGVtcGxhdGVfX2lubGluZV9jYWxlbmRhciggZGF0YV9hcnIgKSApO1xyXG5cclxuXHRcdFx0Ly8gQ2FsZW5kYXIgU2tpblxyXG5cdFx0XHR2YXIgdGVtcGxhdGVfX3dpZ2V0X2NhbGVuZGFyX3NpemUgPSB3cC50ZW1wbGF0ZSggJ3dwYmNfYWp4X3dpZGdldF9jYWxlbmRhcl9zaXplJyApO1xyXG5cdFx0XHRqUXVlcnkoJy53cGJjX2FqeF9jc3RtX19zZWN0aW9uX3JpZ2h0IC53cGJjX3dpZGdldHMnKS5hcHBlbmQoXHR0ZW1wbGF0ZV9fd2lnZXRfY2FsZW5kYXJfc2l6ZSggZGF0YV9hcnIgKSApO1xyXG5cclxuXHRcdFx0Ly8gU2hvcnRjb2RlXHJcblx0XHRcdC8vIHZhciB0ZW1wbGF0ZV9fd2lkZ2V0X3BsdWdpbl9zaG9ydGNvZGUgPSB3cC50ZW1wbGF0ZSggJ3dwYmNfYWp4X3dpZGdldF9wbHVnaW5fc2hvcnRjb2RlJyApO1xyXG5cdFx0XHQvLyBqUXVlcnkoJy53cGJjX2FqeF9jc3RtX19zZWN0aW9uX3JpZ2h0IC53cGJjX3dpZGdldHMnKS5hcHBlbmQoXHR0ZW1wbGF0ZV9fd2lkZ2V0X3BsdWdpbl9zaG9ydGNvZGUoIGRhdGFfYXJyICkgKTtcclxuXHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgJ2NhbGVuZGFyX2RhdGVzX3NlbGVjdGlvbic6XHJcblxyXG5cdFx0XHQvLyBDYWxlbmRhciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0dGVtcGxhdGVfX2lubGluZV9jYWxlbmRhciA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9faW5saW5lX2NhbGVuZGFyJyApO1xyXG5cdFx0XHRqUXVlcnkoJy53cGJjX2FqeF9jc3RtX19zZWN0aW9uX2xlZnQnKS5odG1sKFx0dGVtcGxhdGVfX2lubGluZV9jYWxlbmRhciggZGF0YV9hcnIgKSApO1xyXG5cclxuXHRcdFx0alF1ZXJ5KCcud3BiY19hanhfY3N0bV9fc2VjdGlvbl9sZWZ0JykuYXBwZW5kKCc8ZGl2IGNsYXNzPVwiY2xlYXJcIiBzdHlsZT1cIndpZHRoOjEwMCU7bWFyZ2luOjUwcHggMCAwO1wiPjwvZGl2PicpO1xyXG5cclxuXHRcdFx0dmFyIG1lc3NhZ2VfaHRtbF9pZCA9IHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX3Nob3dfbWVzc2FnZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnPHN0cm9uZz4nICtcdCdZb3UgY2FuIHRlc3QgZGF5cyBzZWxlY3Rpb24gaW4gY2FsZW5kYXInICsgJzwvc3Ryb25nPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQsIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2NvbnRhaW5lcic6ICcud3BiY19hanhfY3N0bV9fc2VjdGlvbl9sZWZ0JyxcdFx0Ly8gJyNhamF4X3dvcmtpbmcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc3R5bGUnICAgIDogJ21hcmdpbjogNnB4IGF1dG87ICBwYWRkaW5nOiA2cHggMjBweDt6LWluZGV4OiA5OTk5OTk7JyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3R5cGUnICAgICA6ICdpbmZvJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RlbGF5JyAgICA6IDUwMDBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHR3cGJjX2JsaW5rX2VsZW1lbnQoICcjJyArIG1lc3NhZ2VfaHRtbF9pZCwgMywgMzIwICk7XHJcblxyXG5cdFx0XHQvLyBXaWRnZXQgLSBEYXRlcyBzZWxlY3Rpb25cclxuXHRcdFx0IHZhciB0ZW1wbGF0ZV9fd2lkZ2V0X3BsdWdpbl9jYWxlbmRhcl9kYXRlc19zZWxlY3Rpb24gPSB3cC50ZW1wbGF0ZSggJ3dwYmNfYWp4X3dpZGdldF9jYWxlbmRhcl9kYXRlc19zZWxlY3Rpb24nICk7XHJcblx0XHRcdCBqUXVlcnkoJy53cGJjX2FqeF9jc3RtX19zZWN0aW9uX3JpZ2h0IC53cGJjX3dpZGdldHMnKS5hcHBlbmQoXHR0ZW1wbGF0ZV9fd2lkZ2V0X3BsdWdpbl9jYWxlbmRhcl9kYXRlc19zZWxlY3Rpb24oIGRhdGFfYXJyICkgKTtcclxuXHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgJ2NhbGVuZGFyX3dlZWtkYXlzX2F2YWlsYWJpbGl0eSc6XHJcblxyXG5cdFx0XHQvLyBTY3JvbGwgIHRvICBjdXJyZW50IG1vbnRoXHJcblx0XHRcdHZhciBzX3llYXIgPSB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luLnNlYXJjaF9zZXRfcGFyYW0oICdjYWxlbmRhcl9fc3RhcnRfeWVhcicsIDAgKTtcclxuXHRcdFx0dmFyIHNfbW9udGggPSB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luLnNlYXJjaF9zZXRfcGFyYW0oICdjYWxlbmRhcl9fc3RhcnRfbW9udGgnLCAwICk7XHJcblxyXG5cdFx0XHQvLyBDYWxlbmRhciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0dGVtcGxhdGVfX2lubGluZV9jYWxlbmRhciA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9faW5saW5lX2NhbGVuZGFyJyApO1xyXG5cdFx0XHRqUXVlcnkoJy53cGJjX2FqeF9jc3RtX19zZWN0aW9uX2xlZnQnKS5odG1sKFx0dGVtcGxhdGVfX2lubGluZV9jYWxlbmRhciggZGF0YV9hcnIgKSApO1xyXG5cclxuXHRcdFx0Ly8gV2lkZ2V0IC0gV2Vla2RheXMgQXZhaWxhYmlsaXR5XHJcblx0XHRcdCB2YXIgdGVtcGxhdGVfX3dpZGdldF9wbHVnaW5fY2FsZW5kYXJfd2Vla2RheXNfYXZhaWxhYmlsaXR5ID0gd3AudGVtcGxhdGUoICd3cGJjX2FqeF93aWRnZXRfY2FsZW5kYXJfd2Vla2RheXNfYXZhaWxhYmlsaXR5JyApO1xyXG5cdFx0XHQgalF1ZXJ5KCcud3BiY19hanhfY3N0bV9fc2VjdGlvbl9yaWdodCAud3BiY193aWRnZXRzJykuYXBwZW5kKFx0dGVtcGxhdGVfX3dpZGdldF9wbHVnaW5fY2FsZW5kYXJfd2Vla2RheXNfYXZhaWxhYmlsaXR5KCBkYXRhX2FyciApICk7XHJcblxyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlICdjYWxlbmRhcl9hZGRpdGlvbmFsJzpcclxuXHJcblx0XHRcdC8vIENhbGVuZGFyICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHR0ZW1wbGF0ZV9faW5saW5lX2NhbGVuZGFyID0gd3AudGVtcGxhdGUoICd3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19pbmxpbmVfY2FsZW5kYXInICk7XHJcblx0XHRcdGpRdWVyeSgnLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fbGVmdCcpLmh0bWwoXHR0ZW1wbGF0ZV9faW5saW5lX2NhbGVuZGFyKCBkYXRhX2FyciApICk7XHJcblxyXG5cdFx0XHQvLyBDYWxlbmRhciBTa2luXHJcblx0XHRcdHZhciB0ZW1wbGF0ZV9fd2lnZXRfY2FsZW5kYXJfYWRkaXRpb25hbCA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfd2lkZ2V0X2NhbGVuZGFyX2FkZGl0aW9uYWwnICk7XHJcblx0XHRcdGpRdWVyeSgnLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fcmlnaHQgLndwYmNfd2lkZ2V0cycpLmFwcGVuZChcdHRlbXBsYXRlX193aWdldF9jYWxlbmRhcl9hZGRpdGlvbmFsKCBkYXRhX2FyciApICk7XHJcblxyXG5cdFx0XHQvLyBTaG9ydGNvZGVcclxuXHRcdFx0Ly8gdmFyIHRlbXBsYXRlX193aWRnZXRfcGx1Z2luX3Nob3J0Y29kZSA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfd2lkZ2V0X3BsdWdpbl9zaG9ydGNvZGUnICk7XHJcblx0XHRcdC8vIGpRdWVyeSgnLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fcmlnaHQgLndwYmNfd2lkZ2V0cycpLmFwcGVuZChcdHRlbXBsYXRlX193aWRnZXRfcGx1Z2luX3Nob3J0Y29kZSggZGF0YV9hcnIgKSApO1xyXG5cclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0ZGVmYXVsdDpcclxuXHRcdFx0Ly9jb25zb2xlLmxvZyggYFNvcnJ5LCB3ZSBhcmUgb3V0IG9mICR7ZXhwcn0uYCApO1xyXG5cdH1cclxuXHJcblx0Ly8gVG9vbGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgdGVtcGxhdGVfX2N1c3RvbWl6ZV9wbHVnaW5fdG9vbGJhcl9wYWdlX2NvbnRlbnQgPSB3cC50ZW1wbGF0ZSggJ3dwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fdG9vbGJhcl9wYWdlX2NvbnRlbnQnICk7XHJcblx0alF1ZXJ5KCB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luLmdldF9vdGhlcl9wYXJhbSggJ3Rvb2xiYXJfY29udGFpbmVyJyApICkuaHRtbCggdGVtcGxhdGVfX2N1c3RvbWl6ZV9wbHVnaW5fdG9vbGJhcl9wYWdlX2NvbnRlbnQoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2RhdGEnICAgICAgICAgICAgICA6IGFqeF9kYXRhLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfc2VhcmNoX3BhcmFtcycgICAgIDogYWp4X3NlYXJjaF9wYXJhbXMsXHRcdFx0XHRcdFx0XHRcdC8vICRfUkVRVUVTVFsgJ3NlYXJjaF9wYXJhbXMnIF1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2NsZWFuZWRfcGFyYW1zJyAgICA6IGFqeF9jbGVhbmVkX3BhcmFtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9ICkgKTtcclxuXHJcblxyXG5cdFx0Ly8gQm9va2luZyByZXNvdXJjZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0dmFyIHdwYmNfYWp4X3NlbGVjdF9ib29raW5nX3Jlc291cmNlID0gd3AudGVtcGxhdGUoICd3cGJjX2FqeF9zZWxlY3RfYm9va2luZ19yZXNvdXJjZScgKTtcclxuXHRcdGpRdWVyeSggJyN3cGJjX2hpZGRlbl90ZW1wbGF0ZV9fc2VsZWN0X2Jvb2tpbmdfcmVzb3VyY2UnKS5odG1sKCB3cGJjX2FqeF9zZWxlY3RfYm9va2luZ19yZXNvdXJjZSgge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9kYXRhJyAgICAgICAgICAgICAgOiBhanhfZGF0YSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfc2VhcmNoX3BhcmFtcycgICAgIDogYWp4X3NlYXJjaF9wYXJhbXMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2NsZWFuZWRfcGFyYW1zJyAgICA6IGFqeF9jbGVhbmVkX3BhcmFtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gXHQpICk7XHJcblx0XHQvKlxyXG5cdFx0ICogQnkgIGRlZmF1bHQgaGlkZWQgYXQgLi4vd3AtY29udGVudC9wbHVnaW5zL2Jvb2tpbmcvaW5jbHVkZXMvcGFnZS1jdXN0b21pemUvX3NyYy9jdXN0b21pemVfcGx1Z2luX3BhZ2UuY3NzICAjd3BiY19oaWRkZW5fdGVtcGxhdGVfX3NlbGVjdF9ib29raW5nX3Jlc291cmNlIHsgZGlzcGxheTogbm9uZTsgfVxyXG5cdFx0ICpcclxuXHRcdCAqIFx0V2UgY2FuIGhpZGUgIC8vLy1cdEhpZGUgcmVzb3VyY2VzIVxyXG5cdFx0ICogXHRcdFx0XHQgLy9zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKXsgalF1ZXJ5KCAnI3dwYmNfaGlkZGVuX3RlbXBsYXRlX19zZWxlY3RfYm9va2luZ19yZXNvdXJjZScgKS5odG1sKCAnJyApOyB9LCAxMDAwICk7XHJcblx0XHQgKi9cclxuXHJcblxyXG5cclxuXHJcblx0Ly8gT3RoZXIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGpRdWVyeSggJy53cGJjX3Byb2Nlc3Npbmcud3BiY19zcGluJykucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCAnW2lkXj1cIndwYmNfbm90aWNlX1wiXScgKS5oaWRlKCk7XHJcblxyXG5cclxuXHQvLyBMb2FkIGNhbGVuZGFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX2NhbGVuZGFyX19zaG93KCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncmVzb3VyY2VfaWQnICAgICAgIDogYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9ub25jZV9jYWxlbmRhcic6IGFqeF9kYXRhLmFqeF9ub25jZV9jYWxlbmRhcixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfZGF0YV9hcnInICAgICAgICAgIDogYWp4X2RhdGEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2NsZWFuZWRfcGFyYW1zJyAgICA6IGFqeF9jbGVhbmVkX3BhcmFtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvKipcclxuXHQgKiBDaGFuZ2UgY2FsZW5kYXIgc2tpbiB2aWV3XHJcblx0ICovXHJcblx0alF1ZXJ5KCAnLndwYmNfcmFkaW9fX3NldF9kYXlzX2N1c3RvbWl6ZV9wbHVnaW4nICkub24oJ2NoYW5nZScsIGZ1bmN0aW9uICggZXZlbnQsIHJlc291cmNlX2lkLCBpbnN0ICl7XHJcblx0XHR3cGJjX19jYWxlbmRhcl9fY2hhbmdlX3NraW4oIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XHJcblx0fSk7XHJcblxyXG5cclxuXHQvLyBSZS1sb2FkIFRvb2x0aXBzXHJcblx0alF1ZXJ5KCBkb2N1bWVudCApLnJlYWR5KCBmdW5jdGlvbiAoKXtcclxuXHRcdHdwYmNfZGVmaW5lX3RpcHB5X3Rvb2x0aXBzKCB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luLmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICsgJyAnICk7XHJcblx0XHR3cGJjX2RlZmluZV90aXBweV90b29sdGlwcyggd3BiY19hanhfY3VzdG9taXplX3BsdWdpbi5nZXRfb3RoZXJfcGFyYW0oICd0b29sYmFyX2NvbnRhaW5lcicgKSArICcgJyApO1xyXG5cdH0pO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFNob3cgaW5saW5lIG1vbnRoIHZpZXcgY2FsZW5kYXIgICAgICAgICAgICAgIHdpdGggYWxsIHByZWRlZmluZWQgQ1NTIChzaXplcyBhbmQgY2hlY2sgaW4vb3V0LCAgdGltZXMgY29udGFpbmVycylcclxuICogQHBhcmFtIHtvYmp9IGNhbGVuZGFyX3BhcmFtc19hcnJcclxuXHRcdFx0e1xyXG5cdFx0XHRcdCdyZXNvdXJjZV9pZCcgICAgICAgXHQ6IGFqeF9jbGVhbmVkX3BhcmFtcy5yZXNvdXJjZV9pZCxcclxuXHRcdFx0XHQnYWp4X25vbmNlX2NhbGVuZGFyJ1x0OiBhanhfZGF0YV9hcnIuYWp4X25vbmNlX2NhbGVuZGFyLFxyXG5cdFx0XHRcdCdhanhfZGF0YV9hcnInICAgICAgICAgIDogYWp4X2RhdGFfYXJyID0geyBhanhfYm9va2luZ19yZXNvdXJjZXM6W10sICByZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlczpbXSwgc2Vhc29uX2N1c3RvbWl6ZV9wbHVnaW46e30sLi4uLiB9XHJcblx0XHRcdFx0J2FqeF9jbGVhbmVkX3BhcmFtcycgICAgOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZTogXCJkeW5hbWljXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhbGVuZGFyX190aW1lc2xvdF9kYXlfYmdfYXNfYXZhaWxhYmxlOiBcIlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fdmlld19fY2VsbF9oZWlnaHQ6IFwiXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhbGVuZGFyX192aWV3X19tb250aHNfaW5fcm93OiA0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fdmlld19fdmlzaWJsZV9tb250aHM6IDEyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fdmlld19fd2lkdGg6IFwiMTAwJVwiXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZXNfY3VzdG9taXplX3BsdWdpbjogXCJ1bmF2YWlsYWJsZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlc19zZWxlY3Rpb246IFwiMjAyMy0wMy0xNCB+IDIwMjMtMDMtMTZcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9fYWN0aW9uOiBcInNldF9jdXN0b21pemVfcGx1Z2luXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc291cmNlX2lkOiAxXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1aV9jbGlja2VkX2VsZW1lbnRfaWQ6IFwid3BiY19jdXN0b21pemVfcGx1Z2luX2FwcGx5X2J0blwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1aV91c3JfX2N1c3RvbWl6ZV9wbHVnaW5fc2VsZWN0ZWRfdG9vbGJhcjogXCJpbmZvXCJcclxuXHRcdFx0XHRcdFx0XHRcdCAgXHRcdCB9XHJcblx0XHRcdH1cclxuKi9cclxuZnVuY3Rpb24gd3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9fY2FsZW5kYXJfX3Nob3coIGNhbGVuZGFyX3BhcmFtc19hcnIgKXtcclxuXHJcblx0Ly8gVXBkYXRlIG5vbmNlXHJcblx0alF1ZXJ5KCAnI2FqeF9ub25jZV9jYWxlbmRhcl9zZWN0aW9uJyApLmh0bWwoIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X25vbmNlX2NhbGVuZGFyICk7XHJcblxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIFVwZGF0ZSBib29raW5nc1xyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0aWYgKCAndW5kZWZpbmVkJyA9PSB0eXBlb2YgKHdwYmNfYWp4X2Jvb2tpbmdzWyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkIF0pICl7IHdwYmNfYWp4X2Jvb2tpbmdzWyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkIF0gPSBbXTsgfVxyXG5cdHdwYmNfYWp4X2Jvb2tpbmdzWyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkIF0gPSBjYWxlbmRhcl9wYXJhbXNfYXJyWyAnYWp4X2RhdGFfYXJyJyBdWyAnY2FsZW5kYXJfc2V0dGluZ3MnIF1bICdib29rZWRfZGF0ZXMnIF07XHJcblxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gXHQvLyBHZXQgc2Nyb2xsaW5nIG1vbnRoICBvciB5ZWFyICBpbiBjYWxlbmRhciAgYW5kIHNhdmUgaXQgdG8gIHRoZSBpbml0IHBhcmFtZXRlcnNcclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGpRdWVyeSggJ2JvZHknICkub2ZmKCAnd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX2NoYW5nZWRfeWVhcl9tb250aCcgKTtcclxuXHRqUXVlcnkoICdib2R5JyApLm9uKCAnd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX2NoYW5nZWRfeWVhcl9tb250aCcsIGZ1bmN0aW9uICggZXZlbnQsIHllYXIsIG1vbnRoLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCBkYXRlcGlja190aGlzICl7XHJcblxyXG5cdFx0d3BiY19hanhfY3VzdG9taXplX3BsdWdpbi5zZWFyY2hfc2V0X3BhcmFtKCAnY2FsZW5kYXJfX3N0YXJ0X3llYXInLCB5ZWFyICk7XHJcblx0XHR3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luLnNlYXJjaF9zZXRfcGFyYW0oICdjYWxlbmRhcl9fc3RhcnRfbW9udGgnLCBtb250aCApO1xyXG5cdH0gKTtcclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBEZWZpbmUgc2hvd2luZyBtb3VzZSBvdmVyIHRvb2x0aXAgb24gdW5hdmFpbGFibGUgZGF0ZXNcclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGpRdWVyeSggJ2JvZHknICkub24oICd3cGJjX2RhdGVwaWNrX2lubGluZV9jYWxlbmRhcl9yZWZyZXNoJywgZnVuY3Rpb24gKCBldmVudCwgcmVzb3VyY2VfaWQsIGluc3QgKXtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEl0J3MgZGVmaW5lZCwgd2hlbiBjYWxlbmRhciBSRUZSRVNIRUQgKGNoYW5nZSBtb250aHMgb3IgZGF5cyBzZWxlY3Rpb24pIGxvYWRlZCBpbiBqcXVlcnkuZGF0ZXBpY2sud3BiYy45LjAuanMgOlxyXG5cdFx0ICogXHRcdCQoICdib2R5JyApLnRyaWdnZXIoICd3cGJjX2RhdGVwaWNrX2lubGluZV9jYWxlbmRhcl9yZWZyZXNoJywgLi4uXHRcdC8vRml4SW46IDkuNC40LjEzXHJcblx0XHQgKi9cclxuXHJcblx0XHQvLyBpbnN0LmRwRGl2ICBpdCdzOiAgPGRpdiBjbGFzcz1cImRhdGVwaWNrLWlubGluZSBkYXRlcGljay1tdWx0aVwiIHN0eWxlPVwid2lkdGg6IDE3NzEycHg7XCI+Li4uLjwvZGl2PlxyXG5cclxuXHRcdGluc3QuZHBEaXYuZmluZCggJy5zZWFzb25fdW5hdmFpbGFibGUsLmJlZm9yZV9hZnRlcl91bmF2YWlsYWJsZSwud2Vla2RheXNfdW5hdmFpbGFibGUnICkub24oICdtb3VzZW92ZXInLCBmdW5jdGlvbiAoIHRoaXNfZXZlbnQgKXtcclxuXHRcdFx0Ly8gYWxzbyBhdmFpbGFibGUgdGhlc2UgdmFyczogXHRyZXNvdXJjZV9pZCwgakNhbENvbnRhaW5lciwgaW5zdFxyXG5cdFx0XHR2YXIgakNlbGwgPSBqUXVlcnkoIHRoaXNfZXZlbnQuY3VycmVudFRhcmdldCApO1xyXG5cdFx0XHR3cGJjX2NzdG1fX3Nob3dfdG9vbHRpcF9fZm9yX2VsZW1lbnQoIGpDZWxsLCBjYWxlbmRhcl9wYXJhbXNfYXJyWyAnYWp4X2RhdGFfYXJyJyBdWydwb3BvdmVyX2hpbnRzJ10gKTtcclxuXHRcdH0pO1xyXG5cclxuXHR9KTtcclxuXHJcblxyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gIERlZmluZSBoZWlnaHQgb2YgdGhlIGNhbGVuZGFyICBjZWxscywgXHRhbmQgIG1vdXNlIG92ZXIgdG9vbHRpcHMgYXQgIHNvbWUgdW5hdmFpbGFibGUgZGF0ZXNcclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGpRdWVyeSggJ2JvZHknICkub24oICd3cGJjX2RhdGVwaWNrX2lubGluZV9jYWxlbmRhcl9sb2FkZWQnLCBmdW5jdGlvbiAoIGV2ZW50LCByZXNvdXJjZV9pZCwgakNhbENvbnRhaW5lciwgaW5zdCApe1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSXQncyBkZWZpbmVkLCB3aGVuIGNhbGVuZGFyIGxvYWRlZCBpbiBqcXVlcnkuZGF0ZXBpY2sud3BiYy45LjAuanMgOlxyXG5cdFx0ICogXHRcdCQoICdib2R5JyApLnRyaWdnZXIoICd3cGJjX2RhdGVwaWNrX2lubGluZV9jYWxlbmRhcl9sb2FkZWQnLCAuLi5cdFx0Ly9GaXhJbjogOS40LjQuMTJcclxuXHRcdCAqL1xyXG5cclxuXHRcdC8vIFJlbW92ZSBoaWdobGlnaHQgZGF5IGZvciB0b2RheSAgZGF0ZVxyXG5cdFx0alF1ZXJ5KCAnLmRhdGVwaWNrLWRheXMtY2VsbC5kYXRlcGljay10b2RheS5kYXRlcGljay1kYXlzLWNlbGwtb3ZlcicgKS5yZW1vdmVDbGFzcyggJ2RhdGVwaWNrLWRheXMtY2VsbC1vdmVyJyApO1xyXG5cclxuXHRcdC8vIFNldCBoZWlnaHQgb2YgY2FsZW5kYXIgIGNlbGxzIGlmIGRlZmluZWQgdGhpcyBvcHRpb25cclxuXHRcdHZhciBzdHlsZXNoZWV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjLWNhbGVuZGFyLWNlbGwtaGVpZ2h0JyApO1xyXG5cdFx0aWYgKCBudWxsICE9PSBzdHlsZXNoZWV0ICl7XHJcblx0XHRcdHN0eWxlc2hlZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggc3R5bGVzaGVldCApO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCAnJyAhPT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX2NlbGxfaGVpZ2h0ICl7XHJcblx0XHRcdGpRdWVyeSggJ2hlYWQnICkuYXBwZW5kKCAnPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiIGlkPVwid3BiYy1jYWxlbmRhci1jZWxsLWhlaWdodFwiPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrICcuaGFzRGF0ZXBpY2sgLmRhdGVwaWNrLWlubGluZSAuZGF0ZXBpY2stdGl0bGUtcm93IHRoLCAnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnLmhhc0RhdGVwaWNrIC5kYXRlcGljay1pbmxpbmUgLmRhdGVwaWNrLWRheXMtY2VsbCB7J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnaGVpZ2h0OiAnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX2NlbGxfaGVpZ2h0ICsgJyAhaW1wb3J0YW50OydcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrICd9J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQrJzwvc3R5bGU+JyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERlZmluZSBzaG93aW5nIG1vdXNlIG92ZXIgdG9vbHRpcCBvbiB1bmF2YWlsYWJsZSBkYXRlc1xyXG5cdFx0akNhbENvbnRhaW5lci5maW5kKCAnLnNlYXNvbl91bmF2YWlsYWJsZSwuYmVmb3JlX2FmdGVyX3VuYXZhaWxhYmxlLC53ZWVrZGF5c191bmF2YWlsYWJsZScgKS5vbiggJ21vdXNlb3ZlcicsIGZ1bmN0aW9uICggdGhpc19ldmVudCApe1xyXG5cdFx0XHQvLyBhbHNvIGF2YWlsYWJsZSB0aGVzZSB2YXJzOiBcdHJlc291cmNlX2lkLCBqQ2FsQ29udGFpbmVyLCBpbnN0XHJcblx0XHRcdHZhciBqQ2VsbCA9IGpRdWVyeSggdGhpc19ldmVudC5jdXJyZW50VGFyZ2V0ICk7XHJcblx0XHRcdHdwYmNfY3N0bV9fc2hvd190b29sdGlwX19mb3JfZWxlbWVudCggakNlbGwsIGNhbGVuZGFyX3BhcmFtc19hcnJbICdhanhfZGF0YV9hcnInIF1bJ3BvcG92ZXJfaGludHMnXSApO1xyXG5cdFx0fSk7XHJcblx0fSApO1xyXG5cclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBEZWZpbmUgbW9udGhzX2luX3Jvd1xyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0aWYgKCAgICggdW5kZWZpbmVkID09IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19tb250aHNfaW5fcm93IClcclxuXHRcdCAgICAgIHx8ICggJycgPT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX21vbnRoc19pbl9yb3cgKVxyXG5cdCl7XHJcblx0XHRjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdmlld19fbW9udGhzX2luX3JvdyA9IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRocztcclxuXHR9XHJcblx0XHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBEZWZpbmUgd2lkdGggb2YgZW50aXJlIGNhbGVuZGFyXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgd2lkdGggPSAgICcnO1x0XHRcdFx0XHQvLyB2YXIgd2lkdGggPSAnd2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTsnO1xyXG5cdC8vIFdpZHRoXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogRml4SW46IDkuNy4zLjQgKi9cclxuXHRpZiAoICAgKCB1bmRlZmluZWQgIT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX3dpZHRoIClcclxuXHRcdCAgICAgICYmICggJycgIT09IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X193aWR0aCApXHJcblx0KXtcclxuXHRcdHdpZHRoICs9ICdtYXgtd2lkdGg6JyBcdCsgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX3dpZHRoICsgJzsnO1xyXG5cdFx0d2lkdGggKz0gJ3dpZHRoOjEwMCU7JztcclxuXHR9XHJcblxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIEFkZCBjYWxlbmRhciBjb250YWluZXI6IFwiQ2FsZW5kYXIgaXMgbG9hZGluZy4uLlwiICBhbmQgdGV4dGFyZWFcclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGpRdWVyeSggJy53cGJjX2FqeF9jc3RtX19jYWxlbmRhcicgKS5odG1sKFxyXG5cclxuXHRcdCc8ZGl2IGNsYXNzPVwiJ1x0KyAnIGJrX2NhbGVuZGFyX2ZyYW1lJ1xyXG5cdFx0XHRcdFx0XHQrICcgbW9udGhzX251bV9pbl9yb3dfJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19tb250aHNfaW5fcm93XHJcblx0XHRcdFx0XHRcdCsgJyBjYWxfbW9udGhfbnVtXycgXHQrIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRoc1xyXG5cdFx0XHRcdFx0XHQrICcgJyBcdFx0XHRcdFx0KyBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdGltZXNsb3RfZGF5X2JnX2FzX2F2YWlsYWJsZSBcdFx0XHRcdC8vICd3cGJjX3RpbWVzbG90X2RheV9iZ19hc19hdmFpbGFibGUnIHx8ICcnXHJcblx0XHRcdFx0KyAnXCIgJ1xyXG5cdFx0XHQrICdzdHlsZT1cIicgKyB3aWR0aCArICdcIj4nXHJcblxyXG5cdFx0XHRcdCsgJzxkaXYgaWQ9XCJjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKyAnXCI+JyArICdDYWxlbmRhciBpcyBsb2FkaW5nLi4uJyArICc8L2Rpdj4nXHJcblxyXG5cdFx0KyAnPC9kaXY+J1xyXG5cclxuXHRcdCsgJzx0ZXh0YXJlYSAgICAgIGlkPVwiZGF0ZV9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKyAnXCInXHJcblx0XHRcdFx0XHQrICcgbmFtZT1cImRhdGVfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICsgJ1wiJ1xyXG5cdFx0XHRcdFx0KyAnIGF1dG9jb21wbGV0ZT1cIm9mZlwiJ1xyXG5cdFx0XHRcdFx0KyAnIHN0eWxlPVwiZGlzcGxheTpub25lO3dpZHRoOjEwMCU7aGVpZ2h0OjEwZW07bWFyZ2luOjJlbSAwIDA7XCI+PC90ZXh0YXJlYT4nXHJcblx0KTtcclxuXHJcblxyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gRGVmaW5lIHZhcmlhYmxlcyBmb3IgY2FsZW5kYXJcclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBjYWxfcGFyYW1fYXJyID0gIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLmNhbGVuZGFyX3NldHRpbmdzO1xyXG5cdGNhbF9wYXJhbV9hcnJbICdodG1sX2lkJyBdIFx0XHRcdFx0XHRcdD0gJ2NhbGVuZGFyX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMucmVzb3VyY2VfaWQ7XHJcblx0Y2FsX3BhcmFtX2FyclsgJ3RleHRfaWQnIF0gXHRcdFx0XHRcdFx0PSAnZGF0ZV9ib29raW5nJyBcdCArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkO1xyXG5cdGNhbF9wYXJhbV9hcnJbICdyZXNvdXJjZV9pZCcgXSBcdFx0XHRcdFx0PSBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5yZXNvdXJjZV9pZDtcclxuXHRjYWxfcGFyYW1fYXJyWyAnYWp4X25vbmNlX2NhbGVuZGFyJyBdIFx0XHRcdD0gY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIuYWp4X25vbmNlX2NhbGVuZGFyO1xyXG5cdGNhbF9wYXJhbV9hcnJbICdzZWFzb25fY3VzdG9taXplX3BsdWdpbicgXSBcdFx0PSBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9kYXRhX2Fyci5zZWFzb25fY3VzdG9taXplX3BsdWdpbjtcclxuXHRjYWxfcGFyYW1fYXJyWyAncmVzb3VyY2VfdW5hdmFpbGFibGVfZGF0ZXMnIF0gXHQ9IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLnJlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzO1xyXG5cdGNhbF9wYXJhbV9hcnJbICdwb3BvdmVyX2hpbnRzJyBdIFx0XHRcdFx0PSBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9kYXRhX2Fyci5wb3BvdmVyX2hpbnRzO1x0XHRcdFx0XHQvLyB7J3NlYXNvbl91bmF2YWlsYWJsZSc6Jy4uLicsJ3dlZWtkYXlzX3VuYXZhaWxhYmxlJzonLi4uJywnYmVmb3JlX2FmdGVyX3VuYXZhaWxhYmxlJzonLi4uJyx9XHJcblxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIFNob3cgQ2FsZW5kYXJcclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHdwYmNfc2hvd19pbmxpbmVfYm9va2luZ19jYWxlbmRhciggY2FsX3BhcmFtX2FyciApO1xyXG5cclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBTY3JvbGwgIHRvICBzcGVjaWZpYyBZZWFyIGFuZCBNb250aCwgIGlmIGRlZmluZWQgaW4gaW5pdCBwYXJhbWV0ZXJzXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgc195ZWFyICA9IHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4uc2VhcmNoX2dldF9wYXJhbSggJ2NhbGVuZGFyX19zdGFydF95ZWFyJyApO1xyXG5cdHZhciBzX21vbnRoID0gd3BiY19hanhfY3VzdG9taXplX3BsdWdpbi5zZWFyY2hfZ2V0X3BhcmFtKCAnY2FsZW5kYXJfX3N0YXJ0X21vbnRoJyApO1xyXG5cdGlmICggKCAwICE9PSBzX3llYXIgKSAmJiAoIDAgIT09IHNfbW9udGggKSApe1xyXG5cdFx0IHdwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19jaGFuZ2VfeWVhcl9tb250aCggY2FsX3BhcmFtX2FyclsgJ3Jlc291cmNlX2lkJyBdLCBzX3llYXIsIHNfbW9udGggKVxyXG5cdH1cclxufVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogICBUb29sdGlwcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmUgc2hvd2luZyB0b29sdGlwLCAgd2hlbiAgbW91c2Ugb3ZlciBvbiAgU0VMRUNUQUJMRSAoYXZhaWxhYmxlLCBwZW5kaW5nLCBhcHByb3ZlZCwgcmVzb3VyY2UgdW5hdmFpbGFibGUpLCAgZGF5c1xyXG5cdCAqIENhbiBiZSBjYWxsZWQgZGlyZWN0bHkgIGZyb20gIGRhdGVwaWNrIGluaXQgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gdmFsdWVcclxuXHQgKiBAcGFyYW0gZGF0ZVxyXG5cdCAqIEBwYXJhbSBjYWxlbmRhcl9wYXJhbXNfYXJyXHJcblx0ICogQHBhcmFtIGRhdGVwaWNrX3RoaXNcclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2NzdG1fX3ByZXBhcmVfdG9vbHRpcF9faW5fY2FsZW5kYXIoIHZhbHVlLCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCBkYXRlcGlja190aGlzICl7XHJcblxyXG5cdFx0aWYgKCBudWxsID09IGRhdGUgKXsgIHJldHVybiBmYWxzZTsgIH1cclxuXHJcblx0XHR2YXIgdGRfY2xhc3MgPSAoIGRhdGUuZ2V0TW9udGgoKSArIDEgKSArICctJyArIGRhdGUuZ2V0RGF0ZSgpICsgJy0nICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG5cclxuXHRcdHZhciBqQ2VsbCA9IGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKyAnIHRkLmNhbDRkYXRlLScgKyB0ZF9jbGFzcyApO1xyXG5cclxuXHRcdHdwYmNfY3N0bV9fc2hvd190b29sdGlwX19mb3JfZWxlbWVudCggakNlbGwsIGNhbGVuZGFyX3BhcmFtc19hcnJbICdwb3BvdmVyX2hpbnRzJyBdICk7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmUgdG9vbHRpcCAgZm9yIHNob3dpbmcgb24gVU5BVkFJTEFCTEUgZGF5cyAoc2Vhc29uLCB3ZWVrZGF5LCB0b2RheV9kZXBlbmRzIHVuYXZhaWxhYmxlKVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGpDZWxsXHRcdFx0XHRcdGpRdWVyeSBvZiBzcGVjaWZpYyBkYXkgY2VsbFxyXG5cdCAqIEBwYXJhbSBwb3BvdmVyX2hpbnRzXHRcdCAgICBBcnJheSB3aXRoIHRvb2x0aXAgaGludCB0ZXh0c1x0IDogeydzZWFzb25fdW5hdmFpbGFibGUnOicuLi4nLCd3ZWVrZGF5c191bmF2YWlsYWJsZSc6Jy4uLicsJ2JlZm9yZV9hZnRlcl91bmF2YWlsYWJsZSc6Jy4uLicsfVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfY3N0bV9fc2hvd190b29sdGlwX19mb3JfZWxlbWVudCggakNlbGwsIHBvcG92ZXJfaGludHMgKXtcclxuXHJcblx0XHR2YXIgdG9vbHRpcF90aW1lID0gJyc7XHJcblxyXG5cdFx0aWYgKCBqQ2VsbC5oYXNDbGFzcyggJ3NlYXNvbl91bmF2YWlsYWJsZScgKSApe1xyXG5cdFx0XHR0b29sdGlwX3RpbWUgPSBwb3BvdmVyX2hpbnRzWyAnc2Vhc29uX3VuYXZhaWxhYmxlJyBdO1xyXG5cdFx0fSBlbHNlIGlmICggakNlbGwuaGFzQ2xhc3MoICd3ZWVrZGF5c191bmF2YWlsYWJsZScgKSApe1xyXG5cdFx0XHR0b29sdGlwX3RpbWUgPSBwb3BvdmVyX2hpbnRzWyAnd2Vla2RheXNfdW5hdmFpbGFibGUnIF07XHJcblx0XHR9IGVsc2UgaWYgKCBqQ2VsbC5oYXNDbGFzcyggJ2JlZm9yZV9hZnRlcl91bmF2YWlsYWJsZScgKSApe1xyXG5cdFx0XHR0b29sdGlwX3RpbWUgPSBwb3BvdmVyX2hpbnRzWyAnYmVmb3JlX2FmdGVyX3VuYXZhaWxhYmxlJyBdO1xyXG5cdFx0fSBlbHNlIGlmICggakNlbGwuaGFzQ2xhc3MoICdkYXRlMmFwcHJvdmUnICkgKXtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBqQ2VsbC5oYXNDbGFzcyggJ2RhdGVfYXBwcm92ZWQnICkgKXtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRqQ2VsbC5hdHRyKCAnZGF0YS1jb250ZW50JywgdG9vbHRpcF90aW1lICk7XHJcblxyXG5cdFx0dmFyIHRkX2VsID0gakNlbGwuZ2V0KDApO1x0Ly9qUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICsgJyB0ZC5jYWw0ZGF0ZS0nICsgdGRfY2xhc3MgKS5nZXQoMCk7XHJcblxyXG5cdFx0aWYgKCAoIHVuZGVmaW5lZCA9PSB0ZF9lbC5fdGlwcHkgKSAmJiAoICcnICE9IHRvb2x0aXBfdGltZSApICl7XHJcblxyXG5cdFx0XHRcdHdwYmNfdGlwcHkoIHRkX2VsICwge1xyXG5cdFx0XHRcdFx0Y29udGVudCggcmVmZXJlbmNlICl7XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgcG9wb3Zlcl9jb250ZW50ID0gcmVmZXJlbmNlLmdldEF0dHJpYnV0ZSggJ2RhdGEtY29udGVudCcgKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cInBvcG92ZXIgcG9wb3Zlcl90aXBweVwiPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0KyAnPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrIHBvcG92ZXJfY29udGVudFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQrICc8L2Rpdj4nXHJcblx0XHRcdFx0XHRcdFx0ICsgJzwvZGl2Pic7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0YWxsb3dIVE1MICAgICAgICA6IHRydWUsXHJcblx0XHRcdFx0XHR0cmlnZ2VyXHRcdFx0IDogJ21vdXNlZW50ZXIgZm9jdXMnLFxyXG5cdFx0XHRcdFx0aW50ZXJhY3RpdmUgICAgICA6ICEgdHJ1ZSxcclxuXHRcdFx0XHRcdGhpZGVPbkNsaWNrICAgICAgOiB0cnVlLFxyXG5cdFx0XHRcdFx0aW50ZXJhY3RpdmVCb3JkZXI6IDEwLFxyXG5cdFx0XHRcdFx0bWF4V2lkdGggICAgICAgICA6IDU1MCxcclxuXHRcdFx0XHRcdHRoZW1lICAgICAgICAgICAgOiAnd3BiYy10aXBweS10aW1lcycsXHJcblx0XHRcdFx0XHRwbGFjZW1lbnQgICAgICAgIDogJ3RvcCcsXHJcblx0XHRcdFx0XHRkZWxheVx0XHRcdCA6IFs0MDAsIDBdLFx0XHRcdC8vRml4SW46IDkuNC4yLjJcclxuXHRcdFx0XHRcdGlnbm9yZUF0dHJpYnV0ZXMgOiB0cnVlLFxyXG5cdFx0XHRcdFx0dG91Y2hcdFx0XHQgOiB0cnVlLFx0XHRcdFx0Ly9bJ2hvbGQnLCA1MDBdLCAvLyA1MDBtcyBkZWxheVx0XHRcdC8vRml4SW46IDkuMi4xLjVcclxuXHRcdFx0XHRcdGFwcGVuZFRvOiAoKSA9PiBkb2N1bWVudC5ib2R5LFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogICBBamF4ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbi8qKlxyXG4gKiBTZW5kIEFqYXggc2hvdyByZXF1ZXN0XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19hamF4X3JlcXVlc3QoKXtcclxuXHJcbmNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoICdXUEJDX0FKWF9DVVNUT01JWkVfUExVR0lOJyApOyBjb25zb2xlLmxvZyggJyA9PSBCZWZvcmUgQWpheCBTZW5kIC0gc2VhcmNoX2dldF9hbGxfcGFyYW1zKCkgPT0gJyAsIHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4uc2VhcmNoX2dldF9hbGxfcGFyYW1zKCkgKTtcclxuXHJcblx0d3BiY19jdXN0b21pemVfcGx1Z2luX3JlbG9hZF9idXR0b25fX3NwaW5fc3RhcnQoKTtcclxuXHJcblx0Ly8gU3RhcnQgQWpheFxyXG5cdGpRdWVyeS5wb3N0KCB3cGJjX3VybF9hamF4LFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGFjdGlvbiAgICAgICAgICA6ICdXUEJDX0FKWF9DVVNUT01JWkVfUExVR0lOJyxcclxuXHRcdFx0XHRcdHdwYmNfYWp4X3VzZXJfaWQ6IHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4uZ2V0X3NlY3VyZV9wYXJhbSggJ3VzZXJfaWQnICksXHJcblx0XHRcdFx0XHRub25jZSAgICAgICAgICAgOiB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luLmdldF9zZWN1cmVfcGFyYW0oICdub25jZScgKSxcclxuXHRcdFx0XHRcdHdwYmNfYWp4X2xvY2FsZSA6IHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4uZ2V0X3NlY3VyZV9wYXJhbSggJ2xvY2FsZScgKSxcclxuXHJcblx0XHRcdFx0XHRzZWFyY2hfcGFyYW1zXHQ6IHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4uc2VhcmNoX2dldF9hbGxfcGFyYW1zKClcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qKlxyXG5cdFx0XHRcdCAqIFMgdSBjIGMgZSBzIHNcclxuXHRcdFx0XHQgKlxyXG5cdFx0XHRcdCAqIEBwYXJhbSByZXNwb25zZV9kYXRhXHRcdC1cdGl0cyBvYmplY3QgcmV0dXJuZWQgZnJvbSAgQWpheCAtIGNsYXNzLWxpdmUtc2VhcmNnLnBocFxyXG5cdFx0XHRcdCAqIEBwYXJhbSB0ZXh0U3RhdHVzXHRcdC1cdCdzdWNjZXNzJ1xyXG5cdFx0XHRcdCAqIEBwYXJhbSBqcVhIUlx0XHRcdFx0LVx0T2JqZWN0XHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0ZnVuY3Rpb24gKCByZXNwb25zZV9kYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApIHtcclxuXHJcbmNvbnNvbGUubG9nKCAnID09IFJlc3BvbnNlIFdQQkNfQUpYX0NVU1RPTUlaRV9QTFVHSU4gPT0gJywgcmVzcG9uc2VfZGF0YSApOyBjb25zb2xlLmdyb3VwRW5kKCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gUHJvYmFibHkgRXJyb3JcclxuXHRcdFx0XHRcdGlmICggKHR5cGVvZiByZXNwb25zZV9kYXRhICE9PSAnb2JqZWN0JykgfHwgKHJlc3BvbnNlX2RhdGEgPT09IG51bGwpICl7XHJcblxyXG5cdFx0XHRcdFx0XHR3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19hY3R1YWxfY29udGVudF9faGlkZSgpO1xyXG5cdFx0XHRcdFx0XHR3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19zaG93X21lc3NhZ2UoIHJlc3BvbnNlX2RhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBSZWxvYWQgcGFnZSwgYWZ0ZXIgZmlsdGVyIHRvb2xiYXIgaGFzIGJlZW4gcmVzZXRcclxuXHRcdFx0XHRcdGlmICggICAgICAgKCAgICAgdW5kZWZpbmVkICE9IHJlc3BvbnNlX2RhdGFbICdhanhfY2xlYW5lZF9wYXJhbXMnIF0pXHJcblx0XHRcdFx0XHRcdFx0JiYgKCAncmVzZXRfZG9uZScgPT09IHJlc3BvbnNlX2RhdGFbICdhanhfY2xlYW5lZF9wYXJhbXMnIF1bICdkb19hY3Rpb24nIF0pXHJcblx0XHRcdFx0XHQpe1xyXG5cdFx0XHRcdFx0XHRsb2NhdGlvbi5yZWxvYWQoKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFNob3cgbGlzdGluZ1xyXG5cdFx0XHRcdFx0d3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9fcGFnZV9jb250ZW50X19zaG93KCByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF0sIHJlc3BvbnNlX2RhdGFbICdhanhfc2VhcmNoX3BhcmFtcycgXSAsIHJlc3BvbnNlX2RhdGFbICdhanhfY2xlYW5lZF9wYXJhbXMnIF0gKTtcclxuXHJcblx0XHRcdFx0XHQvL3dwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX2RlZmluZV91aV9ob29rcygpO1x0XHRcdFx0XHRcdC8vIFJlZGVmaW5lIEhvb2tzLCBiZWNhdXNlIHdlIHNob3cgbmV3IERPTSBlbGVtZW50c1xyXG5cdFx0XHRcdFx0aWYgKCAnJyAhPSByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdhanhfYWZ0ZXJfYWN0aW9uX21lc3NhZ2UnIF0ucmVwbGFjZSggL1xcbi9nLCBcIjxiciAvPlwiICkgKXtcclxuXHRcdFx0XHRcdFx0d3BiY19hZG1pbl9zaG93X21lc3NhZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdhanhfYWZ0ZXJfYWN0aW9uX21lc3NhZ2UnIF0ucmVwbGFjZSggL1xcbi9nLCBcIjxiciAvPlwiIClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQsICggJzEnID09IHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fcmVzdWx0JyBdICkgPyAnc3VjY2VzcycgOiAnZXJyb3InXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LCAxMDAwMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHdwYmNfY3VzdG9taXplX3BsdWdpbl9yZWxvYWRfYnV0dG9uX19zcGluX3BhdXNlKCk7XHJcblx0XHRcdFx0XHQvLyBSZW1vdmUgc3BpbiBpY29uIGZyb20gIGJ1dHRvbiBhbmQgRW5hYmxlIHRoaXMgYnV0dG9uLlxyXG5cdFx0XHRcdFx0d3BiY19idXR0b25fX3JlbW92ZV9zcGluKCByZXNwb25zZV9kYXRhWyAnYWp4X2NsZWFuZWRfcGFyYW1zJyBdWyAndWlfY2xpY2tlZF9lbGVtZW50X2lkJyBdIClcclxuXHJcblx0XHRcdFx0XHRqUXVlcnkoICcjYWpheF9yZXNwb25kJyApLmh0bWwoIHJlc3BvbnNlX2RhdGEgKTtcdFx0Ly8gRm9yIGFiaWxpdHkgdG8gc2hvdyByZXNwb25zZSwgYWRkIHN1Y2ggRElWIGVsZW1lbnQgdG8gcGFnZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0ICApLmZhaWwoIGZ1bmN0aW9uICgganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duICkgeyAgICBpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyApeyBjb25zb2xlLmxvZyggJ0FqYXhfRXJyb3InLCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24gKTsgfVxyXG5cclxuXHRcdFx0XHRcdHZhciBlcnJvcl9tZXNzYWdlID0gJzxzdHJvbmc+JyArICdFcnJvciEnICsgJzwvc3Ryb25nPiAnICsgZXJyb3JUaHJvd24gO1xyXG5cdFx0XHRcdFx0aWYgKCBqcVhIUi5zdGF0dXMgKXtcclxuXHRcdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSArPSAnICg8Yj4nICsganFYSFIuc3RhdHVzICsgJzwvYj4pJztcclxuXHRcdFx0XHRcdFx0aWYgKDQwMyA9PSBqcVhIUi5zdGF0dXMgKXtcclxuXHRcdFx0XHRcdFx0XHRlcnJvcl9tZXNzYWdlICs9ICcgUHJvYmFibHkgbm9uY2UgZm9yIHRoaXMgcGFnZSBoYXMgYmVlbiBleHBpcmVkLiBQbGVhc2UgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIG9uY2xpY2s9XCJqYXZhc2NyaXB0OmxvY2F0aW9uLnJlbG9hZCgpO1wiPnJlbG9hZCB0aGUgcGFnZTwvYT4uJztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBqcVhIUi5yZXNwb25zZVRleHQgKXtcclxuXHRcdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSArPSAnICcgKyBqcVhIUi5yZXNwb25zZVRleHQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRlcnJvcl9tZXNzYWdlID0gZXJyb3JfbWVzc2FnZS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKTtcclxuXHJcblx0XHRcdFx0XHR3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19hY3R1YWxfY29udGVudF9faGlkZSgpO1xyXG5cdFx0XHRcdFx0d3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9fc2hvd19tZXNzYWdlKCBlcnJvcl9tZXNzYWdlICk7XHJcblx0XHRcdCAgfSlcclxuXHQgICAgICAgICAgLy8gLmRvbmUoICAgZnVuY3Rpb24gKCBkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApIHsgICBpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyApeyBjb25zb2xlLmxvZyggJ3NlY29uZCBzdWNjZXNzJywgZGF0YSwgdGV4dFN0YXR1cywganFYSFIgKTsgfSAgICB9KVxyXG5cdFx0XHQgIC8vIC5hbHdheXMoIGZ1bmN0aW9uICggZGF0YV9qcVhIUiwgdGV4dFN0YXR1cywganFYSFJfZXJyb3JUaHJvd24gKSB7ICAgaWYgKCB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgKXsgY29uc29sZS5sb2coICdhbHdheXMgZmluaXNoZWQnLCBkYXRhX2pxWEhSLCB0ZXh0U3RhdHVzLCBqcVhIUl9lcnJvclRocm93biApOyB9ICAgICB9KVxyXG5cdFx0XHQgIDsgIC8vIEVuZCBBamF4XHJcblxyXG59XHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIEggbyBvIGsgcyAgLSAgaXRzIEFjdGlvbi9UaW1lcyB3aGVuIG5lZWQgdG8gcmUtUmVuZGVyIFZpZXdzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqIFNlbmQgQWpheCBTZWFyY2ggUmVxdWVzdCBhZnRlciBVcGRhdGluZyBzZWFyY2ggcmVxdWVzdCBwYXJhbWV0ZXJzXHJcbiAqXHJcbiAqIEBwYXJhbSBwYXJhbXNfYXJyXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19zZW5kX3JlcXVlc3Rfd2l0aF9wYXJhbXMgKCBwYXJhbXNfYXJyICl7XHJcblxyXG5cdC8vIERlZmluZSBkaWZmZXJlbnQgU2VhcmNoICBwYXJhbWV0ZXJzIGZvciByZXF1ZXN0XHJcblx0Xy5lYWNoKCBwYXJhbXNfYXJyLCBmdW5jdGlvbiAoIHBfdmFsLCBwX2tleSwgcF9kYXRhICkge1xyXG5cdFx0Ly9jb25zb2xlLmxvZyggJ1JlcXVlc3QgZm9yOiAnLCBwX2tleSwgcF92YWwgKTtcclxuXHRcdHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4uc2VhcmNoX3NldF9wYXJhbSggcF9rZXksIHBfdmFsICk7XHJcblx0fSk7XHJcblxyXG5cdC8vIFNlbmQgQWpheCBSZXF1ZXN0XHJcblx0d3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9fYWpheF9yZXF1ZXN0KCk7XHJcbn1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaCByZXF1ZXN0IGZvciBcIlBhZ2UgTnVtYmVyXCJcclxuXHQgKiBAcGFyYW0gcGFnZV9udW1iZXJcdGludFxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX3BhZ2luYXRpb25fY2xpY2soIHBhZ2VfbnVtYmVyICl7XHJcblxyXG5cdFx0d3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9fc2VuZF9yZXF1ZXN0X3dpdGhfcGFyYW1zKCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncGFnZV9udW0nOiBwYWdlX251bWJlclxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHR9XHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIFNob3cgLyBIaWRlIENvbnRlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqICBTaG93IExpc3RpbmcgQ29udGVudCBcdC0gXHRTZW5kaW5nIEFqYXggUmVxdWVzdFx0LVx0d2l0aCBwYXJhbWV0ZXJzIHRoYXQgIHdlIGVhcmx5ICBkZWZpbmVkXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19hY3R1YWxfY29udGVudF9fc2hvdygpe1xyXG5cclxuXHR3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19hamF4X3JlcXVlc3QoKTtcdFx0XHQvLyBTZW5kIEFqYXggUmVxdWVzdFx0LVx0d2l0aCBwYXJhbWV0ZXJzIHRoYXQgIHdlIGVhcmx5ICBkZWZpbmVkIGluIFwid3BiY19hanhfYm9va2luZ19saXN0aW5nXCIgT2JqLlxyXG59XHJcblxyXG4vKipcclxuICogSGlkZSBMaXN0aW5nIENvbnRlbnRcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX2FjdHVhbF9jb250ZW50X19oaWRlKCl7XHJcblxyXG5cdGpRdWVyeSggIHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW4uZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICkgICkuaHRtbCggJycgKTtcclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuICogICBNIGUgcyBzIGEgZyBlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbi8qKlxyXG4gKlxyXG4gKi9cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIFNob3cgbWVzc2FnZSBpbiBjb250ZW50XHJcbiAqXHJcbiAqIEBwYXJhbSBtZXNzYWdlXHRcdFx0XHRNZXNzYWdlIEhUTUxcclxuICogQHBhcmFtIHBhcmFtcyA9IHtcclxuICogICAgICAgICAgICAgICAgICAgWyd0eXBlJ11cdFx0XHRcdCd3YXJuaW5nJyB8ICdpbmZvJyB8ICdlcnJvcicgfCAnc3VjY2VzcydcdFx0ZGVmYXVsdDogJ3dhcm5pbmcnXHJcbiAqICAgICAgICAgICAgICAgICAgIFsnY29udGFpbmVyJ11cdFx0XHQnLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fbGVmdCdcdFx0ZGVmYXVsdDogd3BiY19hanhfY3VzdG9taXplX3BsdWdpbi5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKVxyXG4gKiAgICAgICAgICAgICAgICAgICBbJ2lzX2FwcGVuZCddXHRcdFx0dHJ1ZSB8IGZhbHNlXHRcdFx0XHRcdFx0ZGVmYXVsdDogdHJ1ZVxyXG4gKlx0XHRcdFx0ICAgfVxyXG4gKiBFeGFtcGxlOlxyXG4gKiBcdFx0XHR2YXIgaHRtbF9pZCA9IHdwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fX3Nob3dfbWVzc2FnZSggJ1lvdSBjYW4gdGVzdCBkYXlzIHNlbGVjdGlvbiBpbiBjYWxlbmRhcicsICdpbmZvJywgJy53cGJjX2FqeF9jc3RtX19zZWN0aW9uX2xlZnQnLCB0cnVlICk7XHJcbiAqXHJcbiAqXHJcbiAqIEByZXR1cm5zIHN0cmluZyAgLSBIVE1MIElEXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9jdXN0b21pemVfcGx1Z2luX19zaG93X21lc3NhZ2UoIG1lc3NhZ2UsIHBhcmFtcyA9IHt9ICl7XHJcblxyXG5cdHZhciBwYXJhbXNfZGVmYXVsdCA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdCd0eXBlJyAgICAgOiAnd2FybmluZycsXHJcblx0XHRcdFx0XHRcdFx0XHQnY29udGFpbmVyJzogd3BiY19hanhfY3VzdG9taXplX3BsdWdpbi5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKSxcclxuXHRcdFx0XHRcdFx0XHRcdCdpc19hcHBlbmQnOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0J3N0eWxlJyAgICA6ICd0ZXh0LWFsaWduOmxlZnQ7JyxcclxuXHRcdFx0XHRcdFx0XHRcdCdkZWxheScgICAgOiAwXHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRfLmVhY2goIHBhcmFtcywgZnVuY3Rpb24gKCBwX3ZhbCwgcF9rZXksIHBfZGF0YSApe1xyXG5cdFx0cGFyYW1zX2RlZmF1bHRbIHBfa2V5IF0gPSBwX3ZhbDtcclxuXHR9ICk7XHJcblx0cGFyYW1zID0gcGFyYW1zX2RlZmF1bHQ7XHJcblxyXG4gICAgdmFyIHVuaXF1ZV9kaXZfaWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdW5pcXVlX2Rpdl9pZCA9ICd3cGJjX25vdGljZV8nICsgdW5pcXVlX2Rpdl9pZC5nZXRUaW1lKCk7XHJcblxyXG5cdHZhciBhbGVydF9jbGFzcyA9ICdub3RpY2UgJztcclxuXHRpZiAoIHBhcmFtc1sndHlwZSddID09ICdlcnJvcicgKXtcclxuXHRcdGFsZXJ0X2NsYXNzICs9ICdub3RpY2UtZXJyb3IgJztcclxuXHRcdG1lc3NhZ2UgPSAnPGkgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDAuNWVtO2NvbG9yOiAjZDYzNjM4O1wiIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fcmVwb3J0X2dtYWlsZXJyb3JyZWRcIj48L2k+JyArIG1lc3NhZ2U7XHJcblx0fVxyXG5cdGlmICggcGFyYW1zWyd0eXBlJ10gPT0gJ3dhcm5pbmcnICl7XHJcblx0XHRhbGVydF9jbGFzcyArPSAnbm90aWNlLXdhcm5pbmcgJztcclxuXHRcdG1lc3NhZ2UgPSAnPGkgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDAuNWVtO2NvbG9yOiAjZTlhYTA0O1wiIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fd2FybmluZ1wiPjwvaT4nICsgbWVzc2FnZTtcclxuXHR9XHJcblx0aWYgKCBwYXJhbXNbJ3R5cGUnXSA9PSAnaW5mbycgKXtcclxuXHRcdGFsZXJ0X2NsYXNzICs9ICdub3RpY2UtaW5mbyAnO1xyXG5cdH1cclxuXHRpZiAoIHBhcmFtc1sndHlwZSddID09ICdzdWNjZXNzJyApe1xyXG5cdFx0YWxlcnRfY2xhc3MgKz0gJ25vdGljZS1pbmZvIGFsZXJ0LXN1Y2Nlc3MgdXBkYXRlZCAnO1xyXG5cdFx0bWVzc2FnZSA9ICc8aSBzdHlsZT1cIm1hcmdpbi1yaWdodDogMC41ZW07Y29sb3I6ICM2NGFhNDU7XCIgY2xhc3M9XCJtZW51X2ljb24gaWNvbi0xeCB3cGJjX2ljbl9kb25lX291dGxpbmVcIj48L2k+JyArIG1lc3NhZ2U7XHJcblx0fVxyXG5cclxuXHRtZXNzYWdlID0gJzxkaXYgaWQ9XCInICsgdW5pcXVlX2Rpdl9pZCArICdcIiBjbGFzcz1cIndwYmMtc2V0dGluZ3Mtbm90aWNlICcgKyBhbGVydF9jbGFzcyArICdcIiBzdHlsZT1cIicgKyBwYXJhbXNbICdzdHlsZScgXSArICdcIj4nICsgbWVzc2FnZSArICc8L2Rpdj4nO1xyXG5cclxuXHRpZiAoIHBhcmFtc1snaXNfYXBwZW5kJ10gKXtcclxuXHRcdGpRdWVyeSggcGFyYW1zWydjb250YWluZXInXSApLmFwcGVuZCggbWVzc2FnZSApO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRqUXVlcnkoIHBhcmFtc1snY29udGFpbmVyJ10gKS5odG1sKCBtZXNzYWdlICk7XHJcblx0fVxyXG5cclxuXHRwYXJhbXNbJ2RlbGF5J10gPSBwYXJzZUludCggcGFyYW1zWydkZWxheSddICk7XHJcblx0aWYgKCBwYXJhbXNbJ2RlbGF5J10gPiAwICl7XHJcblxyXG5cdFx0dmFyIGNsb3NlZF90aW1lciA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCAnIycgKyB1bmlxdWVfZGl2X2lkICkuZmFkZU91dCggMTUwMCApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LCBwYXJhbXNbICdkZWxheScgXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdW5pcXVlX2Rpdl9pZDtcclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuICogICBTdXBwb3J0IEZ1bmN0aW9ucyAtIFNwaW4gSWNvbiBpbiBCdXR0b25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbi8qKlxyXG4gKiBTcGluIGJ1dHRvbiBpbiBGaWx0ZXIgdG9vbGJhciAgLSAgU3RhcnRcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY3VzdG9taXplX3BsdWdpbl9yZWxvYWRfYnV0dG9uX19zcGluX3N0YXJ0KCl7XHJcblx0alF1ZXJ5KCAnI3dwYmNfY3VzdG9taXplX3BsdWdpbl9yZWxvYWRfYnV0dG9uIC5tZW51X2ljb24ud3BiY19zcGluJykucmVtb3ZlQ2xhc3MoICd3cGJjX2FuaW1hdGlvbl9wYXVzZScgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNwaW4gYnV0dG9uIGluIEZpbHRlciB0b29sYmFyICAtICBQYXVzZVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19jdXN0b21pemVfcGx1Z2luX3JlbG9hZF9idXR0b25fX3NwaW5fcGF1c2UoKXtcclxuXHRqUXVlcnkoICcjd3BiY19jdXN0b21pemVfcGx1Z2luX3JlbG9hZF9idXR0b24gLm1lbnVfaWNvbi53cGJjX3NwaW4nICkuYWRkQ2xhc3MoICd3cGJjX2FuaW1hdGlvbl9wYXVzZScgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNwaW4gYnV0dG9uIGluIEZpbHRlciB0b29sYmFyICAtICBpcyBTcGlubmluZyA/XHJcbiAqXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19jdXN0b21pemVfcGx1Z2luX3JlbG9hZF9idXR0b25fX2lzX3NwaW4oKXtcclxuICAgIGlmICggalF1ZXJ5KCAnI3dwYmNfY3VzdG9taXplX3BsdWdpbl9yZWxvYWRfYnV0dG9uIC5tZW51X2ljb24ud3BiY19zcGluJyApLmhhc0NsYXNzKCAnd3BiY19hbmltYXRpb25fcGF1c2UnICkgKXtcclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkEsU0FBQUEsUUFBQUMsR0FBQSxzQ0FBQUQsT0FBQSx3QkFBQUUsTUFBQSx1QkFBQUEsTUFBQSxDQUFBQyxRQUFBLGFBQUFGLEdBQUEsa0JBQUFBLEdBQUEsZ0JBQUFBLEdBQUEsV0FBQUEsR0FBQSx5QkFBQUMsTUFBQSxJQUFBRCxHQUFBLENBQUFHLFdBQUEsS0FBQUYsTUFBQSxJQUFBRCxHQUFBLEtBQUFDLE1BQUEsQ0FBQUcsU0FBQSxxQkFBQUosR0FBQSxLQUFBRCxPQUFBLENBQUFDLEdBQUE7QUFNQSxJQUFJSyx5QkFBeUIsR0FBSSxVQUFXTCxHQUFHLEVBQUVNLENBQUMsRUFBRTtFQUVuRDtFQUNBLElBQUlDLFFBQVEsR0FBR1AsR0FBRyxDQUFDUSxZQUFZLEdBQUdSLEdBQUcsQ0FBQ1EsWUFBWSxJQUFJO0lBQ3hDQyxPQUFPLEVBQUUsQ0FBQztJQUNWQyxLQUFLLEVBQUksRUFBRTtJQUNYQyxNQUFNLEVBQUc7RUFDUixDQUFDO0VBRWhCWCxHQUFHLENBQUNZLGdCQUFnQixHQUFHLFVBQVdDLFNBQVMsRUFBRUMsU0FBUyxFQUFHO0lBQ3hEUCxRQUFRLENBQUVNLFNBQVMsQ0FBRSxHQUFHQyxTQUFTO0VBQ2xDLENBQUM7RUFFRGQsR0FBRyxDQUFDZSxnQkFBZ0IsR0FBRyxVQUFXRixTQUFTLEVBQUc7SUFDN0MsT0FBT04sUUFBUSxDQUFFTSxTQUFTLENBQUU7RUFDN0IsQ0FBQzs7RUFHRDtFQUNBLElBQUlH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 _out/customize_plugin_page.css 0000666 00000011234 15167025561 0012635 0 ustar 00 .wpbc_ajx_toolbar .ui_container .ui_group.ui_group__upgrade { -ms-flex: 1 1 auto; flex: 1 1 auto; height: 6em; position: relative; margin: 0 0 5px } .wpbc_ajx_toolbar .ui_container .ui_group.wpbc_blur { -ms-flex: 1 1 auto; flex: 1 1 auto } #toolbar_booking_customize_plugin.wpbc_ajx_toolbar { margin: 0 } .wpbc_ajx_cstm__container { display: -ms-flexbox; display: flex; -ms-flex-flow: row nowrap; flex-flow: row nowrap; -ms-flex-pack: start; justify-content: flex-start; -ms-flex-align: start; align-items: flex-start; margin: 20px 0 0 } .wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_left { -ms-flex: 1 1 auto; flex: 1 1 auto; display: -ms-flexbox; display: flex; -ms-flex-flow: row wrap; flex-flow: row wrap; -ms-flex-pack: start; justify-content: flex-start; -ms-flex-align: start; align-items: flex-start } .wpbc_ajx_cstm__calendar { width: 100%; max-width: 100%; margin: 0 } .wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_right { -ms-flex: 0 0 280px; flex: 0 0 280px; margin: 0 0 0 30px; display: -ms-flexbox; display: flex; -ms-flex-flow: column wrap; flex-flow: column wrap; -ms-flex-pack: start; justify-content: flex-start; -ms-flex-align: end; align-items: flex-end } .wpbc_widgets { width: 100%; display: -ms-flexbox; display: flex; -ms-flex-flow: column wrap; flex-flow: column wrap; -ms-flex-pack: start; justify-content: flex-start; -ms-flex-align: start; align-items: flex-start } .wpbc_widgets .wpbc_widget { margin: 0 0 20px; width: 100%; -ms-flex: 1 1 100%; flex: 1 1 100% } .wpbc_widget .wpbc_widget_header { width: 100%; height: 44px; border: 1px solid #ccc; background: #fff; font-weight: 600; text-shadow: none; display: -ms-flexbox; display: flex; -ms-flex-flow: row nowrap; flex-flow: row nowrap; -ms-flex-pack: start; justify-content: flex-start; -ms-flex-align: center; align-items: center } .wpbc_widget .wpbc_widget_header .wpbc_widget_header_text { -ms-flex: 1 1 auto; flex: 1 1 auto; padding: 0 15px } .wpbc_widget .wpbc_widget_header .wpbc_widget_header_settings_link { -ms-flex: 0 0 auto; flex: 0 0 auto; margin-left: auto; border-left: 1px solid #ccc; padding: 5px 10px; color: #0e70b7; display: none } @media (max-width:600px) { .wpbc_ajx_cstm__container { -ms-flex-flow: row wrap; flex-flow: row wrap } .wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_left { -ms-flex-order: 2; order: 2 } .wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_right { -ms-flex-order: 1; order: 1; -ms-flex: 1 1 auto; flex: 1 1 auto; margin: 0 } } #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar { font-size: 1.1em; line-height: 1.8em } #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar * { font-size: 1em } #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a, #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a:focus { color: #555; outline: 0; padding: 3px 10px; text-decoration: none } #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step:hover { cursor: default } #wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a:hover { color: #d54e21!important; background-color: transparent!important; border-bottom-color: #d54e21; text-decoration: none } #wpbc_hidden_template__select_booking_resource { display: none; -ms-flex: 0 1 auto; flex: 0 1 auto } #wpbc_toolbar_dates_hint { -ms-flex: 1 1 auto; flex: 1 1 auto; -ms-flex-pack: start; justify-content: flex-start; margin-left: 0 } #wpbc_toolbar_dates_hint .ui_element .wpbc_help_text { font-size: 1.1em; line-height: 1.8em } #wpbc_toolbar_dates_hint .ui_element .wpbc_help_text * { font-size: 1em } .wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints { font-size: 1.05em; display: block } .wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span { padding: 0 .2em } .wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span.wpbc_big_date, .wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span.wpbc_big_text { font-size: 1.05em; font-weight: 600; padding: 0 .3em } .ui_element_sub_section { display: -ms-flexbox; display: flex; -ms-flex-flow: row wrap; flex-flow: row wrap; -ms-flex-pack: start; justify-content: flex-start; -ms-flex-align: stretch; align-items: stretch; -ms-flex: 1 1 100%; flex: 1 1 100%; border: 1px dashed #a6a6a6; border-radius: 4px; padding: 5px 12px; margin: 5px 0 5px 25px } _out/customize_plugin_page.min.css 0000666 00000032651 15167025561 0013425 0 ustar 00 .wpbc_ajx_toolbar .ui_container .ui_group.ui_group__upgrade{-ms-flex:1 1 auto;flex:1 1 auto;height:6em;position:relative;margin:0 0 5px}.wpbc_ajx_toolbar .ui_container .ui_group.wpbc_blur{-ms-flex:1 1 auto;flex:1 1 auto}#toolbar_booking_customize_plugin.wpbc_ajx_toolbar{margin:0}.wpbc_ajx_cstm__container{display:-ms-flexbox;display:flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:start;align-items:flex-start;margin:20px 0 0}.wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_left{-ms-flex:1 1 auto;flex:1 1 auto;display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:start;align-items:flex-start}.wpbc_ajx_cstm__calendar{width:100%;max-width:100%;margin:0}.wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_right{-ms-flex:0 0 280px;flex:0 0 280px;margin:0 0 0 30px;display:-ms-flexbox;display:flex;-ms-flex-flow:column wrap;flex-flow:column wrap;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:end;align-items:flex-end}.wpbc_widgets{width:100%;display:-ms-flexbox;display:flex;-ms-flex-flow:column wrap;flex-flow:column wrap;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:start;align-items:flex-start}.wpbc_widgets .wpbc_widget{margin:0 0 20px;width:100%;-ms-flex:1 1 100%;flex:1 1 100%}.wpbc_widget .wpbc_widget_header{width:100%;height:44px;border:1px solid #ccc;background:#fff;font-weight:600;text-shadow:none;display:-ms-flexbox;display:flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:center;align-items:center}.wpbc_widget .wpbc_widget_header .wpbc_widget_header_text{-ms-flex:1 1 auto;flex:1 1 auto;padding:0 15px}.wpbc_widget .wpbc_widget_header .wpbc_widget_header_settings_link{-ms-flex:0 0 auto;flex:0 0 auto;margin-left:auto;border-left:1px solid #ccc;padding:5px 10px;color:#0e70b7;display:none}@media (max-width:600px){.wpbc_ajx_cstm__container{-ms-flex-flow:row wrap;flex-flow:row wrap}.wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_left{-ms-flex-order:2;order:2}.wpbc_ajx_cstm__container .wpbc_ajx_cstm__section_right{-ms-flex-order:1;order:1;-ms-flex:1 1 auto;flex:1 1 auto;margin:0}}#wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar{font-size:1.1em;line-height:1.8em}#wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar *{font-size:1em}#wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a,#wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a:focus{color:#555;outline:0;padding:3px 10px;text-decoration:none}#wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step:hover{cursor:default}#wpbc_toolbar_dates_hint .ui_element .wpbc_text_bar .wpbc_option_step a:hover{color:#d54e21!important;background-color:transparent!important;border-bottom-color:#d54e21;text-decoration:none}#wpbc_hidden_template__select_booking_resource{display:none;-ms-flex:0 1 auto;flex:0 1 auto}#wpbc_toolbar_dates_hint{-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-pack:start;justify-content:flex-start;margin-left:0}#wpbc_toolbar_dates_hint .ui_element .wpbc_help_text{font-size:1.1em;line-height:1.8em}#wpbc_toolbar_dates_hint .ui_element .wpbc_help_text *{font-size:1em}.wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints{font-size:1.05em;display:block}.wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span{padding:0 .2em}.wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span.wpbc_big_date,.wpbc_ajx_toolbar .wpbc_help_text .wpbc_toolbar_dates_hints span.wpbc_big_text{font-size:1.05em;font-weight:600;padding:0 .3em}.ui_element_sub_section{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:stretch;align-items:stretch;-ms-flex:1 1 100%;flex:1 1 100%;border:1px dashed #a6a6a6;border-radius:4px;padding:5px 12px;margin:5px 0 5px 25px} /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluY2x1ZGVzL3BhZ2UtY3VzdG9taXplL19vdXQvY3VzdG9taXplX3BsdWdpbl9wYWdlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0REFDRSxTQUFVLEVBQUUsRUFBRSxLQUNkLEtBQU0sRUFBRSxFQUFFLEtBQ1YsT0FBUSxJQUNSLFNBQVUsU0FDVixPQUFRLEVBQUUsRUFBRSxJQUVkLG9EQUNFLFNBQVUsRUFBRSxFQUFFLEtBQ2QsS0FBTSxFQUFFLEVBQUUsS0FFWixtREFDRSxPQUFRLEVBRVYsMEJBQ0UsUUFBUyxZQUNULFFBQVMsS0FDVCxjQUFlLElBQUksT0FDbkIsVUFBVyxJQUFJLE9BQ2YsY0FBZSxNQUNmLGdCQUFpQixXQUNqQixlQUFnQixNQUNoQixZQUFhLFdBQ2IsT0FBUSxLQUFLLEVBQUUsRUFFakIsdURBQ0UsU0FBVSxFQUFFLEVBQUUsS0FDZCxLQUFNLEVBQUUsRUFBRSxLQUNWLFFBQVMsWUFDVCxRQUFTLEtBQ1QsY0FBZSxJQUFJLEtBQ25CLFVBQVcsSUFBSSxLQUNmLGNBQWUsTUFDZixnQkFBaUIsV0FDakIsZUFBZ0IsTUFDaEIsWUFBYSxXQUVmLHlCQUNFLE1BQU8sS0FDUCxVQUFXLEtBQ1gsT0FBUSxFQUVWLHdEQUNFLFNBQVUsRUFBRSxFQUFFLE1BQ2QsS0FBTSxFQUFFLEVBQUUsTUFDVixPQUFRLEVBQUUsRUFBRSxFQUFFLEtBQ2QsUUFBUyxZQUNULFFBQVMsS0FDVCxjQUFlLE9BQU8sS0FDdEIsVUFBVyxPQUFPLEtBQ2xCLGNBQWUsTUFDZixnQkFBaUIsV0FDakIsZUFBZ0IsSUFDaEIsWUFBYSxTQUVmLGNBQ0UsTUFBTyxLQUNQLFFBQVMsWUFDVCxRQUFTLEtBQ1QsY0FBZSxPQUFPLEtBQ3RCLFVBQVcsT0FBTyxLQUNsQixjQUFlLE1BQ2YsZ0JBQWlCLFdBQ2pCLGVBQWdCLE1BQ2hCLFlBQWEsV0FFZiwyQkFDRSxPQUFRLEVBQUUsRUFBRSxLQUNaLE1BQU8sS0FDUCxTQUFVLEVBQUUsRUFBRSxLQUNkLEtBQU0sRUFBRSxFQUFFLEtBRVosaUNBQ0UsTUFBTyxLQUNQLE9BQVEsS0FDUixPQUFRLElBQUksTUFBTSxLQUNsQixXQUFZLEtBQ1osWUFBYSxJQUNiLFlBQWEsS0FDYixRQUFTLFlBQ1QsUUFBUyxLQUNULGNBQWUsSUFBSSxPQUNuQixVQUFXLElBQUksT0FDZixjQUFlLE1BQ2YsZ0JBQWlCLFdBQ2pCLGVBQWdCLE9BQ2hCLFlBQWEsT0FFZiwwREFDRSxTQUFVLEVBQUUsRUFBRSxLQUNkLEtBQU0sRUFBRSxFQUFFLEtBQ1YsUUFBUyxFQUFFLEtBRWIsbUVBQ0UsU0FBVSxFQUFFLEVBQUUsS0FDZCxLQUFNLEVBQUUsRUFBRSxLQUNWLFlBQWEsS0FDYixZQUFhLElBQUksTUFBTSxLQUN2QixRQUFTLElBQUksS0FDYixNQUFPLFFBQ1AsUUFBUyxLQUVYLHlCQUNFLDBCQUNFLGNBQWUsSUFBSSxLQUNuQixVQUFXLElBQUksS0FFakIsdURBQ0UsZUFBZ0IsRUFDaEIsTUFBTyxFQUVULHdEQUNFLGVBQWdCLEVBQ2hCLE1BQU8sRUFDUCxTQUFVLEVBQUUsRUFBRSxLQUNkLEtBQU0sRUFBRSxFQUFFLEtBQ1YsT0FBUSxHQUdaLG9EQUNFLFVBQVcsTUFDWCxZQUFhLE1BRWYsc0RBQ0UsVUFBVyxJQUViLHdFQUNBLDhFQUNFLE1BQU8sS0FDUCxRQUFTLEVBQ1QsUUFBUyxJQUFJLEtBQ2IsZ0JBQWlCLEtBRW5CLDRFQUNFLE9BQVEsUUFFViw4RUFDRSxNQUFPLGtCQUNQLGlCQUFrQixzQkFDbEIsb0JBQXFCLFFBQ3JCLGdCQUFpQixLQUVuQiwrQ0FDRSxRQUFTLEtBQ1QsU0FBVSxFQUFFLEVBQUUsS0FDZCxLQUFNLEVBQUUsRUFBRSxLQUVaLHlCQUNFLFNBQVUsRUFBRSxFQUFFLEtBQ2QsS0FBTSxFQUFFLEVBQUUsS0FDVixjQUFlLE1BQ2YsZ0JBQWlCLFdBQ2pCLFlBQWEsRUFFZixxREFDRSxVQUFXLE1BQ1gsWUFBYSxNQUVmLHVEQUNFLFVBQVcsSUFFYiw0REFDRSxVQUFXLE9BQ1gsUUFBUyxNQUVYLGlFQUNFLFFBQVMsRUFBRSxLQUViLCtFQUNBLCtFQUNFLFVBQVcsT0FDWCxZQUFhLElBQ2IsUUFBUyxFQUFFLEtBRWIsd0JBQ0UsUUFBUyxZQUNULFFBQVMsS0FDVCxjQUFlLElBQUksS0FDbkIsVUFBVyxJQUFJLEtBQ2YsY0FBZSxNQUNmLGdCQUFpQixXQUNqQixlQUFnQixRQUNoQixZQUFhLFFBQ2IsU0FBVSxFQUFFLEVBQUUsS0FDZCxLQUFNLEVBQUUsRUFBRSxLQUNWLE9BQVEsSUFBSSxPQUFPLFFBQ25CLGNBQWUsSUFDZixRQUFTLElBQUksS0FDYixPQUFRLElBQUksRUFBRSxJQUFJIiwiZmlsZSI6ImluY2x1ZGVzL3BhZ2UtY3VzdG9taXplL19vdXQvY3VzdG9taXplX3BsdWdpbl9wYWdlLm1pbi5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIud3BiY19hanhfdG9vbGJhciAudWlfY29udGFpbmVyIC51aV9ncm91cC51aV9ncm91cF9fdXBncmFkZSB7XHJcbiAgLW1zLWZsZXg6IDEgMSBhdXRvO1xyXG4gIGZsZXg6IDEgMSBhdXRvO1xyXG4gIGhlaWdodDogNmVtO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBtYXJnaW46IDAgMCA1cHhcclxufVxyXG4ud3BiY19hanhfdG9vbGJhciAudWlfY29udGFpbmVyIC51aV9ncm91cC53cGJjX2JsdXIge1xyXG4gIC1tcy1mbGV4OiAxIDEgYXV0bztcclxuICBmbGV4OiAxIDEgYXV0b1xyXG59XHJcbiN0b29sYmFyX2Jvb2tpbmdfY3VzdG9taXplX3BsdWdpbi53cGJjX2FqeF90b29sYmFyIHtcclxuICBtYXJnaW46IDBcclxufVxyXG4ud3BiY19hanhfY3N0bV9fY29udGFpbmVyIHtcclxuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIC1tcy1mbGV4LWZsb3c6IHJvdyBub3dyYXA7XHJcbiAgZmxleC1mbG93OiByb3cgbm93cmFwO1xyXG4gIC1tcy1mbGV4LXBhY2s6IHN0YXJ0O1xyXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcclxuICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7XHJcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XHJcbiAgbWFyZ2luOiAyMHB4IDAgMFxyXG59XHJcbi53cGJjX2FqeF9jc3RtX19jb250YWluZXIgLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fbGVmdCB7XHJcbiAgLW1zLWZsZXg6IDEgMSBhdXRvO1xyXG4gIGZsZXg6IDEgMSBhdXRvO1xyXG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgLW1zLWZsZXgtZmxvdzogcm93IHdyYXA7XHJcbiAgZmxleC1mbG93OiByb3cgd3JhcDtcclxuICAtbXMtZmxleC1wYWNrOiBzdGFydDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgLW1zLWZsZXgtYWxpZ246IHN0YXJ0O1xyXG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0XHJcbn1cclxuLndwYmNfYWp4X2NzdG1fX2NhbGVuZGFyIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgbWFyZ2luOiAwXHJcbn1cclxuLndwYmNfYWp4X2NzdG1fX2NvbnRhaW5lciAud3BiY19hanhfY3N0bV9fc2VjdGlvbl9yaWdodCB7XHJcbiAgLW1zLWZsZXg6IDAgMCAyODBweDtcclxuICBmbGV4OiAwIDAgMjgwcHg7XHJcbiAgbWFyZ2luOiAwIDAgMCAzMHB4O1xyXG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgLW1zLWZsZXgtZmxvdzogY29sdW1uIHdyYXA7XHJcbiAgZmxleC1mbG93OiBjb2x1bW4gd3JhcDtcclxuICAtbXMtZmxleC1wYWNrOiBzdGFydDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgLW1zLWZsZXgtYWxpZ246IGVuZDtcclxuICBhbGlnbi1pdGVtczogZmxleC1lbmRcclxufVxyXG4ud3BiY193aWRnZXRzIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIC1tcy1mbGV4LWZsb3c6IGNvbHVtbiB3cmFwO1xyXG4gIGZsZXgtZmxvdzogY29sdW1uIHdyYXA7XHJcbiAgLW1zLWZsZXgtcGFjazogc3RhcnQ7XHJcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xyXG4gIC1tcy1mbGV4LWFsaWduOiBzdGFydDtcclxuICBhbGlnbi1pdGVtczogZmxleC1zdGFydFxyXG59XHJcbi53cGJjX3dpZGdldHMgLndwYmNfd2lkZ2V0IHtcclxuICBtYXJnaW46IDAgMCAyMHB4O1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIC1tcy1mbGV4OiAxIDEgMTAwJTtcclxuICBmbGV4OiAxIDEgMTAwJVxyXG59XHJcbi53cGJjX3dpZGdldCAud3BiY193aWRnZXRfaGVhZGVyIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDQ0cHg7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICBiYWNrZ3JvdW5kOiAjZmZmO1xyXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgdGV4dC1zaGFkb3c6IG5vbmU7XHJcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICAtbXMtZmxleC1mbG93OiByb3cgbm93cmFwO1xyXG4gIGZsZXgtZmxvdzogcm93IG5vd3JhcDtcclxuICAtbXMtZmxleC1wYWNrOiBzdGFydDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyXHJcbn1cclxuLndwYmNfd2lkZ2V0IC53cGJjX3dpZGdldF9oZWFkZXIgLndwYmNfd2lkZ2V0X2hlYWRlcl90ZXh0IHtcclxuICAtbXMtZmxleDogMSAxIGF1dG87XHJcbiAgZmxleDogMSAxIGF1dG87XHJcbiAgcGFkZGluZzogMCAxNXB4XHJcbn1cclxuLndwYmNfd2lkZ2V0IC53cGJjX3dpZGdldF9oZWFkZXIgLndwYmNfd2lkZ2V0X2hlYWRlcl9zZXR0aW5nc19saW5rIHtcclxuICAtbXMtZmxleDogMCAwIGF1dG87XHJcbiAgZmxleDogMCAwIGF1dG87XHJcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XHJcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjO1xyXG4gIHBhZGRpbmc6IDVweCAxMHB4O1xyXG4gIGNvbG9yOiAjMGU3MGI3O1xyXG4gIGRpc3BsYXk6IG5vbmVcclxufVxyXG5AbWVkaWEgKG1heC13aWR0aDo2MDBweCkge1xyXG4gIC53cGJjX2FqeF9jc3RtX19jb250YWluZXIge1xyXG4gICAgLW1zLWZsZXgtZmxvdzogcm93IHdyYXA7XHJcbiAgICBmbGV4LWZsb3c6IHJvdyB3cmFwXHJcbiAgfVxyXG4gIC53cGJjX2FqeF9jc3RtX19jb250YWluZXIgLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fbGVmdCB7XHJcbiAgICAtbXMtZmxleC1vcmRlcjogMjtcclxuICAgIG9yZGVyOiAyXHJcbiAgfVxyXG4gIC53cGJjX2FqeF9jc3RtX19jb250YWluZXIgLndwYmNfYWp4X2NzdG1fX3NlY3Rpb25fcmlnaHQge1xyXG4gICAgLW1zLWZsZXgtb3JkZXI6IDE7XHJcbiAgICBvcmRlcjogMTtcclxuICAgIC1tcy1mbGV4OiAxIDEgYXV0bztcclxuICAgIGZsZXg6IDEgMSBhdXRvO1xyXG4gICAgbWFyZ2luOiAwXHJcbiAgfVxyXG59XHJcbiN3cGJjX3Rvb2xiYXJfZGF0ZXNfaGludCAudWlfZWxlbWVudCAud3BiY190ZXh0X2JhciB7XHJcbiAgZm9udC1zaXplOiAxLjFlbTtcclxuICBsaW5lLWhlaWdodDogMS44ZW1cclxufVxyXG4jd3BiY190b29sYmFyX2RhdGVzX2hpbnQgLnVpX2VsZW1lbnQgLndwYmNfdGV4dF9iYXIgKiB7XHJcbiAgZm9udC1zaXplOiAxZW1cclxufVxyXG4jd3BiY190b29sYmFyX2RhdGVzX2hpbnQgLnVpX2VsZW1lbnQgLndwYmNfdGV4dF9iYXIgLndwYmNfb3B0aW9uX3N0ZXAgYSxcclxuI3dwYmNfdG9vbGJhcl9kYXRlc19oaW50IC51aV9lbGVtZW50IC53cGJjX3RleHRfYmFyIC53cGJjX29wdGlvbl9zdGVwIGE6Zm9jdXMge1xyXG4gIGNvbG9yOiAjNTU1O1xyXG4gIG91dGxpbmU6IDA7XHJcbiAgcGFkZGluZzogM3B4IDEwcHg7XHJcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lXHJcbn1cclxuI3dwYmNfdG9vbGJhcl9kYXRlc19oaW50IC51aV9lbGVtZW50IC53cGJjX3RleHRfYmFyIC53cGJjX29wdGlvbl9zdGVwOmhvdmVyIHtcclxuICBjdXJzb3I6IGRlZmF1bHRcclxufVxyXG4jd3BiY190b29sYmFyX2RhdGVzX2hpbnQgLnVpX2VsZW1lbnQgLndwYmNfdGV4dF9iYXIgLndwYmNfb3B0aW9uX3N0ZXAgYTpob3ZlciB7XHJcbiAgY29sb3I6ICNkNTRlMjEhaW1wb3J0YW50O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50IWltcG9ydGFudDtcclxuICBib3JkZXItYm90dG9tLWNvbG9yOiAjZDU0ZTIxO1xyXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZVxyXG59XHJcbiN3cGJjX2hpZGRlbl90ZW1wbGF0ZV9fc2VsZWN0X2Jvb2tpbmdfcmVzb3VyY2Uge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbiAgLW1zLWZsZXg6IDAgMSBhdXRvO1xyXG4gIGZsZXg6IDAgMSBhdXRvXHJcbn1cclxuI3dwYmNfdG9vbGJhcl9kYXRlc19oaW50IHtcclxuICAtbXMtZmxleDogMSAxIGF1dG87XHJcbiAgZmxleDogMSAxIGF1dG87XHJcbiAgLW1zLWZsZXgtcGFjazogc3RhcnQ7XHJcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xyXG4gIG1hcmdpbi1sZWZ0OiAwXHJcbn1cclxuI3dwYmNfdG9vbGJhcl9kYXRlc19oaW50IC51aV9lbGVtZW50IC53cGJjX2hlbHBfdGV4dCB7XHJcbiAgZm9udC1zaXplOiAxLjFlbTtcclxuICBsaW5lLWhlaWdodDogMS44ZW1cclxufVxyXG4jd3BiY190b29sYmFyX2RhdGVzX2hpbnQgLnVpX2VsZW1lbnQgLndwYmNfaGVscF90ZXh0ICoge1xyXG4gIGZvbnQtc2l6ZTogMWVtXHJcbn1cclxuLndwYmNfYWp4X3Rvb2xiYXIgLndwYmNfaGVscF90ZXh0IC53cGJjX3Rvb2xiYXJfZGF0ZXNfaGludHMge1xyXG4gIGZvbnQtc2l6ZTogMS4wNWVtO1xyXG4gIGRpc3BsYXk6IGJsb2NrXHJcbn1cclxuLndwYmNfYWp4X3Rvb2xiYXIgLndwYmNfaGVscF90ZXh0IC53cGJjX3Rvb2xiYXJfZGF0ZXNfaGludHMgc3BhbiB7XHJcbiAgcGFkZGluZzogMCAuMmVtXHJcbn1cclxuLndwYmNfYWp4X3Rvb2xiYXIgLndwYmNfaGVscF90ZXh0IC53cGJjX3Rvb2xiYXJfZGF0ZXNfaGludHMgc3Bhbi53cGJjX2JpZ19kYXRlLFxyXG4ud3BiY19hanhfdG9vbGJhciAud3BiY19oZWxwX3RleHQgLndwYmNfdG9vbGJhcl9kYXRlc19oaW50cyBzcGFuLndwYmNfYmlnX3RleHQge1xyXG4gIGZvbnQtc2l6ZTogMS4wNWVtO1xyXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgcGFkZGluZzogMCAuM2VtXHJcbn1cclxuLnVpX2VsZW1lbnRfc3ViX3NlY3Rpb24ge1xyXG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgLW1zLWZsZXgtZmxvdzogcm93IHdyYXA7XHJcbiAgZmxleC1mbG93OiByb3cgd3JhcDtcclxuICAtbXMtZmxleC1wYWNrOiBzdGFydDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbiAgLW1zLWZsZXgtYWxpZ246IHN0cmV0Y2g7XHJcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XHJcbiAgLW1zLWZsZXg6IDEgMSAxMDAlO1xyXG4gIGZsZXg6IDEgMSAxMDAlO1xyXG4gIGJvcmRlcjogMXB4IGRhc2hlZCAjYTZhNmE2O1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBwYWRkaW5nOiA1cHggMTJweDtcclxuICBtYXJnaW46IDVweCAwIDVweCAyNXB4XHJcbn0iXX0= */ _out/customize__inline_calendar.js 0000666 00000277414 15167025561 0013453 0 ustar 00 "use strict"; /** * Define JavaScript variables for front-end calendar for backward compatibility * * @param calendar_params_arr example:{ 'html_id' : 'calendar_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, 'text_id' : 'date_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, 'calendar__booking_start_day_weeek': calendar_params_arr.ajx_cleaned_params.calendar__booking_start_day_weeek, 'calendar__view__visible_months': calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months, 'calendar__days_selection_mode': calendar_params_arr.ajx_cleaned_params.calendar__days_selection_mode, 'resource_id' : calendar_params_arr.ajx_cleaned_params.resource_id, 'ajx_nonce_calendar' : calendar_params_arr.ajx_data_arr.ajx_nonce_calendar, 'booked_dates' : calendar_params_arr.ajx_data_arr.booked_dates, 'season_customize_plugin': calendar_params_arr.ajx_data_arr.season_customize_plugin, 'resource_unavailable_dates' : calendar_params_arr.ajx_data_arr.resource_unavailable_dates } */ function wpbc_assign_global_js_for_calendar(calendar_params_arr) { //TODO: need to test it before remove } /** * Load Datepick Inline calendar * * @param calendar_params_arr example:{ 'html_id' : 'calendar_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, 'text_id' : 'date_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, 'calendar__booking_start_day_weeek': calendar_params_arr.ajx_cleaned_params.calendar__booking_start_day_weeek, 'calendar__view__visible_months': calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months, 'calendar__days_selection_mode': calendar_params_arr.ajx_cleaned_params.calendar__days_selection_mode, 'resource_id' : calendar_params_arr.ajx_cleaned_params.resource_id, 'ajx_nonce_calendar' : calendar_params_arr.ajx_data_arr.ajx_nonce_calendar, 'booked_dates' : calendar_params_arr.ajx_data_arr.calendar_settings.booked_dates, 'season_customize_plugin': calendar_params_arr.ajx_data_arr.season_customize_plugin, 'resource_unavailable_dates' : calendar_params_arr.ajx_data_arr.resource_unavailable_dates } * @returns {boolean} */ function wpbc_show_inline_booking_calendar(calendar_params_arr) { if (0 === jQuery('#' + calendar_params_arr.html_id).length // If calendar DOM element not exist then exist || true === jQuery('#' + calendar_params_arr.html_id).hasClass('hasDatepick') // If the calendar with the same Booking resource already has been activated, then exist. ) { return false; } //------------------------------------------------------------------------------------------------------------------ // JavaScript variables for front-end calendar //------------------------------------------------------------------------------------------------------------------ wpbc_assign_global_js_for_calendar(calendar_params_arr); //------------------------------------------------------------------------------------------------------------------ // Configure and show calendar //------------------------------------------------------------------------------------------------------------------ jQuery('#' + calendar_params_arr.html_id).text(''); jQuery('#' + calendar_params_arr.html_id).datepick({ beforeShowDay: function beforeShowDay(date) { return wpbc__inline_booking_calendar__apply_css_to_days(date, calendar_params_arr, this); }, onSelect: function onSelect(date) { jQuery('#' + calendar_params_arr.text_id).val(date); //wpbc_blink_element('.wpbc_widget_change_calendar_skin', 3, 220); return wpbc__inline_booking_calendar__on_days_select(date, calendar_params_arr, this); }, onHover: function onHover(value, date) { //wpbc_cstm__prepare_tooltip__in_calendar( value, date, calendar_params_arr, this ); return wpbc__inline_booking_calendar__on_days_hover(value, date, calendar_params_arr, this); }, onChangeMonthYear: //null, function onChangeMonthYear(year, month) { return wpbc__inline_booking_calendar__on_change_year_month(year, month, calendar_params_arr, this); }, showOn: 'both', numberOfMonths: calendar_params_arr.calendar__view__visible_months, stepMonths: 1, prevText: '«', nextText: '»', dateFormat: 'dd.mm.yy', // 'yy-mm-dd', changeMonth: false, changeYear: false, minDate: 0, //null, // Scroll as long as you need maxDate: calendar_params_arr.calendar__booking_max_monthes_in_calendar, // minDate: new Date(2020, 2, 1), maxDate: new Date(2020, 9, 31), // Ability to set any start and end date in calendar showStatus: false, closeAtTop: false, firstDay: calendar_params_arr.calendar__booking_start_day_weeek, gotoCurrent: false, hideIfNoPrevNext: true, multiSeparator: ', ', /* 'multiSelect' can be 0 for 'single', 'dynamic' and can be 365 for 'multiple', 'fixed' // Maximum number of selectable dates: Single day = 0, multi days = 365 */ multiSelect: 'single' == calendar_params_arr.calendar__days_selection_mode || 'dynamic' == calendar_params_arr.calendar__days_selection_mode ? 0 : 365, /* 'rangeSelect' true for 'dynamic' false for 'single', 'multiple', 'fixed' */ rangeSelect: 'dynamic' == calendar_params_arr.calendar__days_selection_mode, rangeSeparator: ' - ', // ' ~ ', //' - ', // showWeeks: true, useThemeRoller: false }); return true; } /** * When we scroll month in calendar then trigger specific event * @param year * @param month * @param calendar_params_arr * @param datepick_this */ function wpbc__inline_booking_calendar__on_change_year_month(year, month, calendar_params_arr, datepick_this) { /** * We need to use inst.drawMonth instead of month variable. * It is because, each time, when we use dynamic arnge selection, the month here are different */ var inst = jQuery.datepick._getInst(datepick_this); jQuery('body').trigger('wpbc__inline_booking_calendar__changed_year_month' // event name , [inst.drawYear, inst.drawMonth + 1, calendar_params_arr, datepick_this]); // To catch this event: jQuery( 'body' ).on('wpbc__inline_booking_calendar__changed_year_month', function( event, year, month, calendar_params_arr, datepick_this ) { ... } ); } /** * Apply CSS to calendar date cells * * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time) * @param calendar_params_arr - Calendar Settings Object: { "html_id": "calendar_booking4", "text_id": "date_booking4", "calendar__booking_start_day_weeek": 1, "calendar__view__visible_months": 12, "resource_id": 4, "ajx_nonce_calendar": "<input type=\"hidden\" ... />", "booked_dates": { "12-28-2022": [ { "booking_date": "2022-12-28 00:00:00", "approved": "1", "booking_id": "26" } ], ... } 'season_customize_plugin':{ "2023-01-09": true, "2023-01-10": true, "2023-01-11": true, ... } } } * @param datepick_this - this of datepick Obj * * @returns [boolean,string] - [ {true -available | false - unavailable}, 'CSS classes for calendar day cell' ] */ function wpbc__inline_booking_calendar__apply_css_to_days(date, calendar_params_arr, datepick_this) { var today_date = new Date(_wpbc.get_other_param('today_arr')[0], parseInt(_wpbc.get_other_param('today_arr')[1]) - 1, _wpbc.get_other_param('today_arr')[2], 0, 0, 0); var class_day = date.getMonth() + 1 + '-' + date.getDate() + '-' + date.getFullYear(); // '1-9-2023' var sql_class_day = wpbc__get__sql_class_date(date); // '2023-01-09' var css_date__standard = 'cal4date-' + class_day; var css_date__additional = ' wpbc_weekday_' + date.getDay() + ' '; //-------------------------------------------------------------------------------------------------------------- // WEEKDAYS :: Set unavailable week days from - Settings General page in "Availability" section for (var i = 0; i < _wpbc.get_other_param('availability__week_days_unavailable').length; i++) { if (date.getDay() == _wpbc.get_other_param('availability__week_days_unavailable')[i]) { return [false, css_date__standard + ' date_user_unavailable' + ' weekdays_unavailable']; } } // BEFORE_AFTER :: Set unavailable days Before / After the Today date if (wpbc_dates__days_between(date, today_date) < parseInt(_wpbc.get_other_param('availability__unavailable_from_today')) || parseInt('0' + parseInt(_wpbc.get_other_param('availability__available_from_today'))) > 0 && wpbc_dates__days_between(date, today_date) > parseInt('0' + parseInt(_wpbc.get_other_param('availability__available_from_today')))) { return [false, css_date__standard + ' date_user_unavailable' + ' before_after_unavailable']; } // SEASONS :: Booking > Resources > Availability page var is_date_available = calendar_params_arr.season_customize_plugin[sql_class_day]; if (false === is_date_available) { //FixIn: 9.5.4.4 return [false, css_date__standard + ' date_user_unavailable' + ' season_unavailable']; } // RESOURCE_UNAVAILABLE :: Booking > Customize page if (wpbc_in_array(calendar_params_arr.resource_unavailable_dates, sql_class_day)) { is_date_available = false; } if (false === is_date_available) { //FixIn: 9.5.4.4 return [false, css_date__standard + ' date_user_unavailable' + ' resource_unavailable']; } //-------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------- // Is any bookings in this date ? if ('undefined' !== typeof calendar_params_arr.booked_dates[class_day]) { var bookings_in_date = calendar_params_arr.booked_dates[class_day]; if ('undefined' !== typeof bookings_in_date['sec_0']) { // "Full day" booking -> (seconds == 0) css_date__additional += '0' === bookings_in_date['sec_0'].approved ? ' date2approve ' : ' date_approved '; // Pending = '0' | Approved = '1' css_date__additional += ' full_day_booking'; return [false, css_date__standard + css_date__additional]; } else if (Object.keys(bookings_in_date).length > 0) { // "Time slots" Bookings var is_approved = true; _.each(bookings_in_date, function (p_val, p_key, p_data) { if (!parseInt(p_val.approved)) { is_approved = false; } var ts = p_val.booking_date.substring(p_val.booking_date.length - 1); if (true === _wpbc.get_other_param('is_enabled_change_over')) { if (ts == '1') { css_date__additional += ' check_in_time' + (parseInt(p_val.approved) ? ' check_in_time_date_approved' : ' check_in_time_date2approve'); } if (ts == '2') { css_date__additional += ' check_out_time' + (parseInt(p_val.approved) ? ' check_out_time_date_approved' : ' check_out_time_date2approve'); } } }); if (!is_approved) { css_date__additional += ' date2approve timespartly'; } else { css_date__additional += ' date_approved timespartly'; } if (!_wpbc.get_other_param('is_enabled_change_over')) { css_date__additional += ' times_clock'; } } } //-------------------------------------------------------------------------------------------------------------- return [true, css_date__standard + css_date__additional + ' date_available']; } //TODO: need to use wpbc_calendar script, instead of this one /** * Apply some CSS classes, when we mouse over specific dates in calendar * @param value * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time) * @param calendar_params_arr - Calendar Settings Object: { "html_id": "calendar_booking4", "text_id": "date_booking4", "calendar__booking_start_day_weeek": 1, "calendar__view__visible_months": 12, "resource_id": 4, "ajx_nonce_calendar": "<input type=\"hidden\" ... />", "booked_dates": { "12-28-2022": [ { "booking_date": "2022-12-28 00:00:00", "approved": "1", "booking_id": "26" } ], ... } 'season_customize_plugin':{ "2023-01-09": true, "2023-01-10": true, "2023-01-11": true, ... } } } * @param datepick_this - this of datepick Obj * * @returns {boolean} */ function wpbc__inline_booking_calendar__on_days_hover(value, date, calendar_params_arr, datepick_this) { if (null === date) { return; } // The same functions as in client.css ************************************************************* //TODO: 2023-06-30 17:22 if (true) { var bk_type = calendar_params_arr.resource_id; var is_calendar_booking_unselectable = jQuery('#calendar_booking_unselectable' + bk_type); //FixIn: 8.0.1.2 var is_booking_form_also = jQuery('#booking_form_div' + bk_type); // Set unselectable, if only Availability Calendar here (and we do not insert Booking form by mistake). if (is_calendar_booking_unselectable.length == 1 && is_booking_form_also.length != 1) { jQuery('#calendar_booking' + bk_type + ' .datepick-days-cell-over').removeClass('datepick-days-cell-over'); // clear all highlight days selections jQuery('.wpbc_only_calendar #calendar_booking' + bk_type + ' .datepick-days-cell, ' + '.wpbc_only_calendar #calendar_booking' + bk_type + ' .datepick-days-cell a').css('cursor', 'default'); return false; } //FixIn: 8.0.1.2 end return true; } // ************************************************************************************************* if (null === date) { jQuery('.datepick-days-cell-over').removeClass('datepick-days-cell-over'); // clear all highlight days selections return false; } var inst = jQuery.datepick._getInst(document.getElementById('calendar_booking' + calendar_params_arr.resource_id)); if (1 == inst.dates.length // If we have one selected date && 'dynamic' === calendar_params_arr.calendar__days_selection_mode // while have range days selection mode ) { var td_class; var td_overs = []; var is_check = true; var selceted_first_day = new Date(); selceted_first_day.setFullYear(inst.dates[0].getFullYear(), inst.dates[0].getMonth(), inst.dates[0].getDate()); //Get first Date while (is_check) { td_class = selceted_first_day.getMonth() + 1 + '-' + selceted_first_day.getDate() + '-' + selceted_first_day.getFullYear(); td_overs[td_overs.length] = '#calendar_booking' + calendar_params_arr.resource_id + ' .cal4date-' + td_class; // add to array for later make selection by class if (date.getMonth() == selceted_first_day.getMonth() && date.getDate() == selceted_first_day.getDate() && date.getFullYear() == selceted_first_day.getFullYear() || selceted_first_day > date) { is_check = false; } selceted_first_day.setFullYear(selceted_first_day.getFullYear(), selceted_first_day.getMonth(), selceted_first_day.getDate() + 1); } // Highlight Days for (var i = 0; i < td_overs.length; i++) { // add class to all elements jQuery(td_overs[i]).addClass('datepick-days-cell-over'); } return true; } return true; } //TODO: need to use wpbc_calendar script, instead of this one /** * On DAYs selection in calendar * * @param dates_selection - string: '2023-03-07 ~ 2023-03-07' or '2023-04-10, 2023-04-12, 2023-04-02, 2023-04-04' * @param calendar_params_arr - Calendar Settings Object: { "html_id": "calendar_booking4", "text_id": "date_booking4", "calendar__booking_start_day_weeek": 1, "calendar__view__visible_months": 12, "resource_id": 4, "ajx_nonce_calendar": "<input type=\"hidden\" ... />", "booked_dates": { "12-28-2022": [ { "booking_date": "2022-12-28 00:00:00", "approved": "1", "booking_id": "26" } ], ... } 'season_customize_plugin':{ "2023-01-09": true, "2023-01-10": true, "2023-01-11": true, ... } } } * @param datepick_this - this of datepick Obj * * @returns boolean */ function wpbc__inline_booking_calendar__on_days_select(dates_selection, calendar_params_arr) { var datepick_this = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; // The same functions as in client.css //TODO: 2023-06-30 17:22 if (true) { var bk_type = calendar_params_arr.resource_id; var date = dates_selection; // Set unselectable, if only Availability Calendar here (and we do not insert Booking form by mistake). var is_calendar_booking_unselectable = jQuery('#calendar_booking_unselectable' + bk_type); //FixIn: 8.0.1.2 var is_booking_form_also = jQuery('#booking_form_div' + bk_type); if (is_calendar_booking_unselectable.length > 0 && is_booking_form_also.length <= 0) { wpbc_calendar__unselect_all_dates(bk_type); jQuery('.wpbc_only_calendar .popover_calendar_hover').remove(); //Hide all opened popovers return false; } //FixIn: 8.0.1.2 end jQuery('#date_booking' + bk_type).val(date); jQuery(".booking_form_div").trigger("date_selected", [bk_type, date]); } else { // Functionality from Booking > Availability page var inst = jQuery.datepick._getInst(document.getElementById('calendar_booking' + calendar_params_arr.resource_id)); var dates_arr = []; // [ "2023-04-09", "2023-04-10", "2023-04-11" ] if (-1 !== dates_selection.indexOf('~')) { // Range Days dates_arr = wpbc_get_dates_arr__from_dates_range_js({ 'dates_separator': ' ~ ', // ' ~ ' 'dates': dates_selection // '2023-04-04 ~ 2023-04-07' }); } else { // Multiple Days dates_arr = wpbc_get_dates_arr__from_dates_comma_separated_js({ 'dates_separator': ', ', // ', ' 'dates': dates_selection // '2023-04-10, 2023-04-12, 2023-04-02, 2023-04-04' }); } wpbc_avy_after_days_selection__show_help_info({ 'calendar__days_selection_mode': calendar_params_arr.calendar__days_selection_mode, 'dates_arr': dates_arr, 'dates_click_num': inst.dates.length, 'popover_hints': calendar_params_arr.popover_hints }); } return true; } /** * Show help info at the top toolbar about selected dates and future actions * * @param params * Example 1: { calendar__days_selection_mode: "dynamic", dates_arr: [ "2023-04-03" ], dates_click_num: 1 'popover_hints' : calendar_params_arr.popover_hints } * Example 2: { calendar__days_selection_mode: "dynamic" dates_arr: Array(10) [ "2023-04-03", "2023-04-04", "2023-04-05", … ] dates_click_num: 2 'popover_hints' : calendar_params_arr.popover_hints } */ function wpbc_avy_after_days_selection__show_help_info(params) { // console.log( params ); // [ "2023-04-09", "2023-04-10", "2023-04-11" ] var message, color; if (jQuery('#ui_btn_cstm__set_days_customize_plugin__available').is(':checked')) { message = params.popover_hints.toolbar_text_available; //'Set dates _DATES_ as _HTML_ available.'; color = '#11be4c'; } else { message = params.popover_hints.toolbar_text_unavailable; //'Set dates _DATES_ as _HTML_ unavailable.'; color = '#e43939'; } message = '<span>' + message + '</span>'; var first_date = params['dates_arr'][0]; var last_date = 'dynamic' == params.calendar__days_selection_mode ? params['dates_arr'][params['dates_arr'].length - 1] : params['dates_arr'].length > 1 ? params['dates_arr'][1] : ''; first_date = jQuery.datepick.formatDate('dd M, yy', new Date(first_date + 'T00:00:00')); last_date = jQuery.datepick.formatDate('dd M, yy', new Date(last_date + 'T00:00:00')); if ('dynamic' == params.calendar__days_selection_mode) { if (1 == params.dates_click_num) { last_date = '___________'; } else { if ('first_time' == jQuery('.wpbc_ajx_customize_plugin_container').attr('wpbc_loaded')) { jQuery('.wpbc_ajx_customize_plugin_container').attr('wpbc_loaded', 'done'); wpbc_blink_element('.wpbc_widget_change_calendar_skin', 3, 220); } } message = message.replace('_DATES_', '</span>' //+ '<div>' + 'from' + '</div>' + '<span class="wpbc_big_date">' + first_date + '</span>' + '<span>' + '-' + '</span>' + '<span class="wpbc_big_date">' + last_date + '</span>' + '<span>'); } else { // if ( params[ 'dates_arr' ].length > 1 ){ // last_date = ', ' + last_date; // last_date += ( params[ 'dates_arr' ].length > 2 ) ? ', ...' : ''; // } else { // last_date=''; // } var dates_arr = []; for (var i = 0; i < params['dates_arr'].length; i++) { dates_arr.push(jQuery.datepick.formatDate('dd M yy', new Date(params['dates_arr'][i] + 'T00:00:00'))); } first_date = dates_arr.join(', '); message = message.replace('_DATES_', '</span>' + '<span class="wpbc_big_date">' + first_date + '</span>' + '<span>'); } message = message.replace('_HTML_', '</span><span class="wpbc_big_text" style="color:' + color + ';">') + '<span>'; //message += ' <div style="margin-left: 1em;">' + ' Click on Apply button to apply customize_plugin.' + '</div>'; message = '<div class="wpbc_toolbar_dates_hints">' + message + '</div>'; jQuery('.wpbc_help_text').html(message); } /** * Parse dates ------------------------------------------------------------------------------------------- */ /** * Get dates array, from comma separated dates * * @param params = { * 'dates_separator' => ', ', // Dates separator * 'dates' => '2023-04-04, 2023-04-07, 2023-04-05' // Dates in 'Y-m-d' format: '2023-01-31' } * * @return array = [ * [0] => 2023-04-04 * [1] => 2023-04-05 * [2] => 2023-04-06 * [3] => 2023-04-07 ] * * Example #1: wpbc_get_dates_arr__from_dates_comma_separated_js( { 'dates_separator' : ', ', 'dates' : '2023-04-04, 2023-04-07, 2023-04-05' } ); */ function wpbc_get_dates_arr__from_dates_comma_separated_js(params) { var dates_arr = []; if ('' !== params['dates']) { dates_arr = params['dates'].split(params['dates_separator']); dates_arr.sort(); } return dates_arr; } /** * Get dates array, from range days selection * * @param params = { * 'dates_separator' => ' ~ ', // Dates separator * 'dates' => '2023-04-04 ~ 2023-04-07' // Dates in 'Y-m-d' format: '2023-01-31' } * * @return array = [ * [0] => 2023-04-04 * [1] => 2023-04-05 * [2] => 2023-04-06 * [3] => 2023-04-07 ] * * Example #1: wpbc_get_dates_arr__from_dates_range_js( { 'dates_separator' : ' ~ ', 'dates' : '2023-04-04 ~ 2023-04-07' } ); * Example #2: wpbc_get_dates_arr__from_dates_range_js( { 'dates_separator' : ' - ', 'dates' : '2023-04-04 - 2023-04-07' } ); */ function wpbc_get_dates_arr__from_dates_range_js(params) { var dates_arr = []; if ('' !== params['dates']) { dates_arr = params['dates'].split(params['dates_separator']); var check_in_date_ymd = dates_arr[0]; var check_out_date_ymd = dates_arr[1]; if ('' !== check_in_date_ymd && '' !== check_out_date_ymd) { dates_arr = wpbc_get_dates_array_from_start_end_days_js(check_in_date_ymd, check_out_date_ymd); } } return dates_arr; } /** * Get dates array based on start and end dates. * * @param string sStartDate - start date: 2023-04-09 * @param string sEndDate - end date: 2023-04-11 * @return array - [ "2023-04-09", "2023-04-10", "2023-04-11" ] */ function wpbc_get_dates_array_from_start_end_days_js(sStartDate, sEndDate) { sStartDate = new Date(sStartDate + 'T00:00:00'); sEndDate = new Date(sEndDate + 'T00:00:00'); var aDays = []; // Start the variable off with the start date aDays.push(sStartDate.getTime()); // Set a 'temp' variable, sCurrentDate, with the start date - before beginning the loop var sCurrentDate = new Date(sStartDate.getTime()); var one_day_duration = 24 * 60 * 60 * 1000; // While the current date is less than the end date while (sCurrentDate < sEndDate) { // Add a day to the current date "+1 day" sCurrentDate.setTime(sCurrentDate.getTime() + one_day_duration); // Add this new day to the aDays array aDays.push(sCurrentDate.getTime()); } for (var i = 0; i < aDays.length; i++) { aDays[i] = new Date(aDays[i]); aDays[i] = aDays[i].getFullYear() + '-' + (aDays[i].getMonth() + 1 < 10 ? '0' : '') + (aDays[i].getMonth() + 1) + '-' + (aDays[i].getDate() < 10 ? '0' : '') + aDays[i].getDate(); } // Once the loop has finished, return the array of days. return aDays; } /** * Scroll to specific "Year & Month" in Inline Booking Calendar * * @param {number} resource_id 1 * @param {number} year 2023 * @param {number} month 12 (from 1 to 12) * * @returns {boolean} // changed or not */ function wpbc__inline_booking_calendar__change_year_month(resource_id, year, month) { var inst = jQuery.datepick._getInst(document.getElementById('calendar_booking' + resource_id)); if (false != inst) { year = parseInt(year); month = parseInt(month) - 1; inst.cursorDate = new Date(); inst.cursorDate.setFullYear(year, month, 1); inst.cursorDate.setMonth(month); // In some cases, the setFullYear can set only Year, and not the Month and day //FixIn:6.2.3.5 inst.cursorDate.setDate(1); inst.drawMonth = inst.cursorDate.getMonth(); inst.drawYear = inst.cursorDate.getFullYear(); jQuery.datepick._notifyChange(inst); jQuery.datepick._adjustInstDate(inst); jQuery.datepick._showDate(inst); jQuery.datepick._updateDatepick(inst); return true; } return false; } //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1jdXN0b21pemUvX291dC9jdXN0b21pemVfX2lubGluZV9jYWxlbmRhci5qcyIsIm5hbWVzIjpbIndwYmNfYXNzaWduX2dsb2JhbF9qc19mb3JfY2FsZW5kYXIiLCJjYWxlbmRhcl9wYXJhbXNfYXJyIiwid3BiY19zaG93X2lubGluZV9ib29raW5nX2NhbGVuZGFyIiwialF1ZXJ5IiwiaHRtbF9pZCIsImxlbmd0aCIsImhhc0NsYXNzIiwidGV4dCIsImRhdGVwaWNrIiwiYmVmb3JlU2hvd0RheSIsImRhdGUiLCJ3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fYXBwbHlfY3NzX3RvX2RheXMiLCJvblNlbGVjdCIsInRleHRfaWQiLCJ2YWwiLCJ3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fb25fZGF5c19zZWxlY3QiLCJvbkhvdmVyIiwidmFsdWUiLCJ3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fb25fZGF5c19ob3ZlciIsIm9uQ2hhbmdlTW9udGhZZWFyIiwieWVhciIsIm1vbnRoIiwid3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX29uX2NoYW5nZV95ZWFyX21vbnRoIiwic2hvd09uIiwibnVtYmVyT2ZNb250aHMiLCJjYWxlbmRhcl9fdmlld19fdmlzaWJsZV9tb250aHMiLCJzdGVwTW9udGhzIiwicHJldlRleHQiLCJuZXh0VGV4dCIsImRhdGVGb3JtYXQiLCJjaGFuZ2VNb250aCIsImNoYW5nZVllYXIiLCJtaW5EYXRlIiwibWF4RGF0ZSIsImNhbGVuZGFyX19ib29raW5nX21heF9tb250aGVzX2luX2NhbGVuZGFyIiwic2hvd1N0YXR1cyIsImNsb3NlQXRUb3AiLCJmaXJzdERheSIsImNhbGVuZGFyX19ib29raW5nX3N0YXJ0X2RheV93ZWVlayIsImdvdG9DdXJyZW50IiwiaGlkZUlmTm9QcmV2TmV4dCIsIm11bHRpU2VwYXJhdG9yIiwibXVsdGlTZWxlY3QiLCJjYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSIsInJhbmdlU2VsZWN0IiwicmFuZ2VTZXBhcmF0b3IiLCJ1c2VUaGVtZVJvbGxlciIsImRhdGVwaWNrX3RoaXMiLCJpbnN0IiwiX2dldEluc3QiLCJ0cmlnZ2VyIiwiZHJhd1llYXIiLCJkcmF3TW9udGgiLCJ0b2RheV9kYXRlIiwiRGF0ZSIsIl93cGJjIiwiZ2V0X290aGVyX3BhcmFtIiwicGFyc2VJbnQiLCJjbGFzc19kYXkiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRGdWxsWWVhciIsInNxbF9jbGFzc19kYXkiLCJ3cGJjX19nZXRfX3NxbF9jbGFzc19kYXRlIiwiY3NzX2RhdGVfX3N0YW5kYXJkIiwiY3NzX2RhdGVfX2FkZGl0aW9uYWwiLCJnZXREYXkiLCJpIiwid3BiY19kYXRlc19fZGF5c19iZXR3ZWVuIiwiaXNfZGF0ZV9hdmFpbGFibGUiLCJzZWFzb25fY3VzdG9taXplX3BsdWdpbiIsIndwYmNfaW5fYXJyYXkiLCJyZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlcyIsImJvb2tlZF9kYXRlcyIsImJvb2tpbmdzX2luX2RhdGUiLCJhcHByb3ZlZCIsIk9iamVjdCIsImtleXMiLCJpc19hcHByb3ZlZCIsIl8iLCJlYWNoIiwicF92YWwiLCJwX2tleSIsInBfZGF0YSIsInRzIiwiYm9va2luZ19kYXRlIiwic3Vic3RyaW5nIiwiYmtfdHlwZSIsInJlc291cmNlX2lkIiwiaXNfY2FsZW5kYXJfYm9va2luZ191bnNlbGVjdGFibGUiLCJpc19ib29raW5nX2Zvcm1fYWxzbyIsInJlbW92ZUNsYXNzIiwiY3NzIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRhdGVzIiwidGRfY2xhc3MiLCJ0ZF9vdmVycyIsImlzX2NoZWNrIiwic2VsY2V0ZWRfZmlyc3RfZGF5Iiwic2V0RnVsbFllYXIiLCJhZGRDbGFzcyIsImRhdGVzX3NlbGVjdGlvbiIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIndwYmNfY2FsZW5kYXJfX3Vuc2VsZWN0X2FsbF9kYXRlcyIsInJlbW92ZSIsImRhdGVzX2FyciIsImluZGV4T2YiLCJ3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfcmFuZ2VfanMiLCJ3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfY29tbWFfc2VwYXJhdGVkX2pzIiwid3BiY19hdnlfYWZ0ZXJfZGF5c19zZWxlY3Rpb25fX3Nob3dfaGVscF9pbmZvIiwicG9wb3Zlcl9oaW50cyIsInBhcmFtcyIsIm1lc3NhZ2UiLCJjb2xvciIsImlzIiwidG9vbGJhcl90ZXh0X2F2YWlsYWJsZSIsInRvb2xiYXJfdGV4dF91bmF2YWlsYWJsZSIsImZpcnN0X2RhdGUiLCJsYXN0X2RhdGUiLCJmb3JtYXREYXRlIiwiZGF0ZXNfY2xpY2tfbnVtIiwiYXR0ciIsIndwYmNfYmxpbmtfZWxlbWVudCIsInJlcGxhY2UiLCJwdXNoIiwiam9pbiIsImh0bWwiLCJzcGxpdCIsInNvcnQiLCJjaGVja19pbl9kYXRlX3ltZCIsImNoZWNrX291dF9kYXRlX3ltZCIsIndwYmNfZ2V0X2RhdGVzX2FycmF5X2Zyb21fc3RhcnRfZW5kX2RheXNfanMiLCJzU3RhcnREYXRlIiwic0VuZERhdGUiLCJhRGF5cyIsImdldFRpbWUiLCJzQ3VycmVudERhdGUiLCJvbmVfZGF5X2R1cmF0aW9uIiwic2V0VGltZSIsIndwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19jaGFuZ2VfeWVhcl9tb250aCIsImN1cnNvckRhdGUiLCJzZXRNb250aCIsInNldERhdGUiLCJfbm90aWZ5Q2hhbmdlIiwiX2FkanVzdEluc3REYXRlIiwiX3Nob3dEYXRlIiwiX3VwZGF0ZURhdGVwaWNrIl0sInNvdXJjZXMiOlsiaW5jbHVkZXMvcGFnZS1jdXN0b21pemUvX3NyYy9jdXN0b21pemVfX2lubGluZV9jYWxlbmRhci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBEZWZpbmUgSmF2YVNjcmlwdCB2YXJpYWJsZXMgZm9yIGZyb250LWVuZCBjYWxlbmRhciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsZW5kYXJfcGFyYW1zX2FyciBleGFtcGxlOntcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdodG1sX2lkJyAgICAgICAgICAgOiAnY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5yZXNvdXJjZV9pZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd0ZXh0X2lkJyAgICAgICAgICAgOiAnZGF0ZV9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdjYWxlbmRhcl9fYm9va2luZ19zdGFydF9kYXlfd2VlZWsnOiBcdCAgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX2Jvb2tpbmdfc3RhcnRfZGF5X3dlZWVrLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2NhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRocyc6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRocyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdjYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSc6ICBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncmVzb3VyY2VfaWQnICAgICAgICA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9ub25jZV9jYWxlbmRhcicgOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9kYXRhX2Fyci5hanhfbm9uY2VfY2FsZW5kYXIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYm9va2VkX2RhdGVzJyAgICAgICA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLmJvb2tlZF9kYXRlcyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdzZWFzb25fY3VzdG9taXplX3BsdWdpbic6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLnNlYXNvbl9jdXN0b21pemVfcGx1Z2luLFxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdyZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlcycgOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9kYXRhX2Fyci5yZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYXNzaWduX2dsb2JhbF9qc19mb3JfY2FsZW5kYXIoIGNhbGVuZGFyX3BhcmFtc19hcnIgKXtcclxuLy9UT0RPOiBuZWVkIHRvICB0ZXN0IGl0IGJlZm9yZSByZW1vdmVcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBcdExvYWQgRGF0ZXBpY2sgSW5saW5lIGNhbGVuZGFyXHJcbiAqXHJcbiAqIEBwYXJhbSBjYWxlbmRhcl9wYXJhbXNfYXJyXHRcdGV4YW1wbGU6e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2h0bWxfaWQnICAgICAgICAgICA6ICdjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3RleHRfaWQnICAgICAgICAgICA6ICdkYXRlX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMucmVzb3VyY2VfaWQsXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2NhbGVuZGFyX19ib29raW5nX3N0YXJ0X2RheV93ZWVlayc6IFx0ICBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fYm9va2luZ19zdGFydF9kYXlfd2VlZWssXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzJzogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2NhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlJzogIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlLFxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdyZXNvdXJjZV9pZCcgICAgICAgIDogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMucmVzb3VyY2VfaWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X25vbmNlX2NhbGVuZGFyJyA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLmFqeF9ub25jZV9jYWxlbmRhcixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdib29rZWRfZGF0ZXMnICAgICAgIDogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIuY2FsZW5kYXJfc2V0dGluZ3MuYm9va2VkX2RhdGVzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3NlYXNvbl9jdXN0b21pemVfcGx1Z2luJzogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIuc2Vhc29uX2N1c3RvbWl6ZV9wbHVnaW4sXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3Jlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzJyA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLnJlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfc2hvd19pbmxpbmVfYm9va2luZ19jYWxlbmRhciggY2FsZW5kYXJfcGFyYW1zX2FyciApe1xyXG5cclxuXHRpZiAoXHJcblx0XHQgICAoIDAgPT09IGpRdWVyeSggJyMnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5odG1sX2lkICkubGVuZ3RoIClcdFx0XHRcdFx0XHRcdC8vIElmIGNhbGVuZGFyIERPTSBlbGVtZW50IG5vdCBleGlzdCB0aGVuIGV4aXN0XHJcblx0XHR8fCAoIHRydWUgPT09IGpRdWVyeSggJyMnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5odG1sX2lkICkuaGFzQ2xhc3MoICdoYXNEYXRlcGljaycgKSApXHQvLyBJZiB0aGUgY2FsZW5kYXIgd2l0aCB0aGUgc2FtZSBCb29raW5nIHJlc291cmNlIGFscmVhZHkgIGhhcyBiZWVuIGFjdGl2YXRlZCwgdGhlbiBleGlzdC5cclxuXHQpe1xyXG5cdCAgIHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gIEphdmFTY3JpcHQgdmFyaWFibGVzIGZvciBmcm9udC1lbmQgY2FsZW5kYXJcclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHdwYmNfYXNzaWduX2dsb2JhbF9qc19mb3JfY2FsZW5kYXIoIGNhbGVuZGFyX3BhcmFtc19hcnIgKTtcclxuXHJcblxyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gQ29uZmlndXJlIGFuZCBzaG93IGNhbGVuZGFyXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRqUXVlcnkoICcjJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuaHRtbF9pZCApLnRleHQoICcnICk7XHJcblx0alF1ZXJ5KCAnIycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmh0bWxfaWQgKS5kYXRlcGljayh7XHJcblx0XHRcdFx0XHRiZWZvcmVTaG93RGF5OiBcdGZ1bmN0aW9uICggZGF0ZSApe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fYXBwbHlfY3NzX3RvX2RheXMoIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcclxuICAgICAgICAgICAgICAgICAgICBvblNlbGVjdDogXHQgIFx0ZnVuY3Rpb24gKCBkYXRlICl7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCAnIycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnRleHRfaWQgKS52YWwoIGRhdGUgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL3dwYmNfYmxpbmtfZWxlbWVudCgnLndwYmNfd2lkZ2V0X2NoYW5nZV9jYWxlbmRhcl9za2luJywgMywgMjIwKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX29uX2RheXNfc2VsZWN0KCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0sXHJcbiAgICAgICAgICAgICAgICAgICAgb25Ib3ZlcjogXHRcdGZ1bmN0aW9uICggdmFsdWUsIGRhdGUgKXtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL3dwYmNfY3N0bV9fcHJlcGFyZV90b29sdGlwX19pbl9jYWxlbmRhciggdmFsdWUsIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX29uX2RheXNfaG92ZXIoIHZhbHVlLCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0sXHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VNb250aFllYXI6XHQvL251bGwsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCB5ZWFyLCBtb250aCApe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19vbl9jaGFuZ2VfeWVhcl9tb250aCggeWVhciwgbW9udGgsIGNhbGVuZGFyX3BhcmFtc19hcnIsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dPbjogXHRcdFx0J2JvdGgnLFxyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlck9mTW9udGhzOiBcdGNhbGVuZGFyX3BhcmFtc19hcnIuY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBNb250aHM6XHRcdFx0MSxcclxuICAgICAgICAgICAgICAgICAgICBwcmV2VGV4dDogXHRcdFx0JyZsYXF1bzsnLFxyXG4gICAgICAgICAgICAgICAgICAgIG5leHRUZXh0OiBcdFx0XHQnJnJhcXVvOycsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdDogXHRcdCdkZC5tbS55eScsXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gJ3l5LW1tLWRkJyxcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VNb250aDogXHRcdGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZVllYXI6IFx0XHRmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW5EYXRlOiBcdFx0XHQwLFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL251bGwsICBcdC8vIFNjcm9sbCBhcyBsb25nIGFzIHlvdSBuZWVkXHJcblx0XHRcdFx0XHRtYXhEYXRlOiBcdFx0XHRjYWxlbmRhcl9wYXJhbXNfYXJyLmNhbGVuZGFyX19ib29raW5nX21heF9tb250aGVzX2luX2NhbGVuZGFyLFx0XHRcdFx0XHQvLyBtaW5EYXRlOiBuZXcgRGF0ZSgyMDIwLCAyLCAxKSwgbWF4RGF0ZTogbmV3IERhdGUoMjAyMCwgOSwgMzEpLCBcdC8vIEFiaWxpdHkgdG8gc2V0IGFueSAgc3RhcnQgYW5kIGVuZCBkYXRlIGluIGNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd1N0YXR1czogXHRcdGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQXRUb3A6IFx0XHRmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdERheTpcdFx0XHRjYWxlbmRhcl9wYXJhbXNfYXJyLmNhbGVuZGFyX19ib29raW5nX3N0YXJ0X2RheV93ZWVlayxcclxuICAgICAgICAgICAgICAgICAgICBnb3RvQ3VycmVudDogXHRcdGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGhpZGVJZk5vUHJldk5leHQ6XHR0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIG11bHRpU2VwYXJhdG9yOiBcdCcsICcsXHJcblx0XHRcdFx0XHQvKiAgJ211bHRpU2VsZWN0JyBjYW4gIGJlIDAgICBmb3IgJ3NpbmdsZScsICdkeW5hbWljJ1xyXG5cdFx0XHRcdFx0ICBcdFx0XHQgIGFuZCBjYW4gIGJlIDM2NSBmb3IgJ211bHRpcGxlJywgJ2ZpeGVkJ1xyXG5cdFx0XHRcdFx0ICBcdFx0XHQgIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0YWJsZSBkYXRlczpcdCBTaW5nbGUgZGF5ID0gMCwgIG11bHRpIGRheXMgPSAzNjVcclxuXHRcdFx0XHRcdCAqL1xyXG5cdFx0XHRcdFx0bXVsdGlTZWxlY3Q6ICAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgKCAnc2luZ2xlJyAgPT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSApXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fHwgKCAnZHluYW1pYycgPT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSApXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgID8gMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgICA6IDM2NVxyXG5cdFx0XHRcdFx0XHRcdFx0ICApLFxyXG5cdFx0XHRcdFx0LyogICdyYW5nZVNlbGVjdCcgdHJ1ZSAgZm9yICdkeW5hbWljJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQgIGZhbHNlIGZvciAnc2luZ2xlJywgJ211bHRpcGxlJywgJ2ZpeGVkJ1xyXG5cdFx0XHRcdFx0ICovXHJcblx0XHRcdFx0XHRyYW5nZVNlbGVjdDogICgnZHluYW1pYycgPT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSksXHJcblx0XHRcdFx0XHRyYW5nZVNlcGFyYXRvcjogJyAtICcsIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL1x0JyB+ICcsXHQvLycgLSAnLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3dXZWVrczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICB1c2VUaGVtZVJvbGxlcjpcdFx0ZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuXHRyZXR1cm4gIHRydWU7XHJcbn1cclxuXHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBXaGVuICB3ZSBzY3JvbGwgIG1vbnRoIGluIGNhbGVuZGFyICB0aGVuICB0cmlnZ2VyIHNwZWNpZmljIGV2ZW50XHJcblx0ICogQHBhcmFtIHllYXJcclxuXHQgKiBAcGFyYW0gbW9udGhcclxuXHQgKiBAcGFyYW0gY2FsZW5kYXJfcGFyYW1zX2FyclxyXG5cdCAqIEBwYXJhbSBkYXRlcGlja190aGlzXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX29uX2NoYW5nZV95ZWFyX21vbnRoKCB5ZWFyLCBtb250aCwgY2FsZW5kYXJfcGFyYW1zX2FyciwgZGF0ZXBpY2tfdGhpcyApe1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogICBXZSBuZWVkIHRvIHVzZSBpbnN0LmRyYXdNb250aCAgaW5zdGVhZCBvZiBtb250aCB2YXJpYWJsZS5cclxuXHRcdCAqICAgSXQgaXMgYmVjYXVzZSwgIGVhY2ggIHRpbWUsICB3aGVuIHdlIHVzZSBkeW5hbWljIGFybmdlIHNlbGVjdGlvbiwgIHRoZSBtb250aCBoZXJlIGFyZSBkaWZmZXJlbnRcclxuXHRcdCAqL1xyXG5cclxuXHRcdHZhciBpbnN0ID0galF1ZXJ5LmRhdGVwaWNrLl9nZXRJbnN0KCBkYXRlcGlja190aGlzICk7XHJcblxyXG5cdFx0alF1ZXJ5KCAnYm9keScgKS50cmlnZ2VyKCBcdCAgJ3dwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19jaGFuZ2VkX3llYXJfbW9udGgnXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBldmVudCBuYW1lXHJcblx0XHRcdFx0XHRcdFx0XHQgXHQsIFtpbnN0LmRyYXdZZWFyLCAoaW5zdC5kcmF3TW9udGgrMSksIGNhbGVuZGFyX3BhcmFtc19hcnIsIGRhdGVwaWNrX3RoaXNdXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0Ly8gVG8gY2F0Y2ggdGhpcyBldmVudDogalF1ZXJ5KCAnYm9keScgKS5vbignd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX2NoYW5nZWRfeWVhcl9tb250aCcsIGZ1bmN0aW9uKCBldmVudCwgeWVhciwgbW9udGgsIGNhbGVuZGFyX3BhcmFtc19hcnIsIGRhdGVwaWNrX3RoaXMgKSB7IC4uLiB9ICk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBseSBDU1MgdG8gY2FsZW5kYXIgZGF0ZSBjZWxsc1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIGRhdGVcdFx0XHRcdFx0LSAgSmF2YVNjcmlwdCBEYXRlIE9iajogIFx0XHRNb24gRGVjIDExIDIwMjMgMDA6MDA6MDAgR01UKzAyMDAgKEVhc3Rlcm4gRXVyb3BlYW4gU3RhbmRhcmQgVGltZSlcclxuXHQgKiBAcGFyYW0gY2FsZW5kYXJfcGFyYW1zX2Fyclx0LSAgQ2FsZW5kYXIgU2V0dGluZ3MgT2JqZWN0OiAgXHR7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiaHRtbF9pZFwiOiBcImNhbGVuZGFyX2Jvb2tpbmc0XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwidGV4dF9pZFwiOiBcImRhdGVfYm9va2luZzRcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJjYWxlbmRhcl9fYm9va2luZ19zdGFydF9kYXlfd2VlZWtcIjogMSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJjYWxlbmRhcl9fdmlld19fdmlzaWJsZV9tb250aHNcIjogMTIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwicmVzb3VyY2VfaWRcIjogNCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJhanhfbm9uY2VfY2FsZW5kYXJcIjogXCI8aW5wdXQgdHlwZT1cXFwiaGlkZGVuXFxcIiAuLi4gLz5cIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJib29rZWRfZGF0ZXNcIjoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjEyLTI4LTIwMjJcIjogW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImJvb2tpbmdfZGF0ZVwiOiBcIjIwMjItMTItMjggMDA6MDA6MDBcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImFwcHJvdmVkXCI6IFwiMVwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiYm9va2luZ19pZFwiOiBcIjI2XCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdF0sIC4uLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdzZWFzb25fY3VzdG9taXplX3BsdWdpbic6e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0wOVwiOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0xMFwiOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0xMVwiOiB0cnVlLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0ICogQHBhcmFtIGRhdGVwaWNrX3RoaXNcdFx0XHQtIHRoaXMgb2YgZGF0ZXBpY2sgT2JqXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyBbYm9vbGVhbixzdHJpbmddXHQtIFsge3RydWUgLWF2YWlsYWJsZSB8IGZhbHNlIC0gdW5hdmFpbGFibGV9LCAnQ1NTIGNsYXNzZXMgZm9yIGNhbGVuZGFyIGRheSBjZWxsJyBdXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX2FwcGx5X2Nzc190b19kYXlzKCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCBkYXRlcGlja190aGlzICl7XHJcblxyXG5cdFx0dmFyIHRvZGF5X2RhdGUgPSBuZXcgRGF0ZSggX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndG9kYXlfYXJyJyApWyAwIF0sIChwYXJzZUludCggX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndG9kYXlfYXJyJyApWyAxIF0gKSAtIDEpLCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0b2RheV9hcnInIClbIDIgXSwgMCwgMCwgMCApO1xyXG5cclxuXHRcdHZhciBjbGFzc19kYXkgID0gKCBkYXRlLmdldE1vbnRoKCkgKyAxICkgKyAnLScgKyBkYXRlLmdldERhdGUoKSArICctJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcdFx0XHRcdFx0XHQvLyAnMS05LTIwMjMnXHJcblx0XHR2YXIgc3FsX2NsYXNzX2RheSA9IHdwYmNfX2dldF9fc3FsX2NsYXNzX2RhdGUoIGRhdGUgKTtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAnMjAyMy0wMS0wOSdcclxuXHJcblx0XHR2YXIgY3NzX2RhdGVfX3N0YW5kYXJkICAgPSAgJ2NhbDRkYXRlLScgKyBjbGFzc19kYXk7XHJcblx0XHR2YXIgY3NzX2RhdGVfX2FkZGl0aW9uYWwgPSAnIHdwYmNfd2Vla2RheV8nICsgZGF0ZS5nZXREYXkoKSArICcgJztcclxuXHJcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdFx0Ly8gV0VFS0RBWVMgOjogU2V0IHVuYXZhaWxhYmxlIHdlZWsgZGF5cyBmcm9tIC0gU2V0dGluZ3MgR2VuZXJhbCBwYWdlIGluIFwiQXZhaWxhYmlsaXR5XCIgc2VjdGlvblxyXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAnYXZhaWxhYmlsaXR5X193ZWVrX2RheXNfdW5hdmFpbGFibGUnICkubGVuZ3RoOyBpKysgKXtcclxuXHRcdFx0aWYgKCBkYXRlLmdldERheSgpID09IF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2F2YWlsYWJpbGl0eV9fd2Vla19kYXlzX3VuYXZhaWxhYmxlJyApWyBpIF0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIFsgZmFsc2UsIGNzc19kYXRlX19zdGFuZGFyZCArICcgZGF0ZV91c2VyX3VuYXZhaWxhYmxlJyBcdCsgJyB3ZWVrZGF5c191bmF2YWlsYWJsZScgXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEJFRk9SRV9BRlRFUiA6OiBTZXQgdW5hdmFpbGFibGUgZGF5cyBCZWZvcmUgLyBBZnRlciB0aGUgVG9kYXkgZGF0ZVxyXG5cdFx0aWYgKCBcdCggKHdwYmNfZGF0ZXNfX2RheXNfYmV0d2VlbiggZGF0ZSwgdG9kYXlfZGF0ZSApKSA8IHBhcnNlSW50KF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2F2YWlsYWJpbGl0eV9fdW5hdmFpbGFibGVfZnJvbV90b2RheScgKSkgKVxyXG5cdFx0XHQgfHwgKFxyXG5cclxuXHRcdFx0XHQgICAoIHBhcnNlSW50KCAnMCcgKyBwYXJzZUludCggX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAnYXZhaWxhYmlsaXR5X19hdmFpbGFibGVfZnJvbV90b2RheScgKSApICkgPiAwIClcclxuXHRcdFx0XHQmJiAoIHdwYmNfZGF0ZXNfX2RheXNfYmV0d2VlbiggZGF0ZSwgdG9kYXlfZGF0ZSApID4gcGFyc2VJbnQoICcwJyArIHBhcnNlSW50KCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICdhdmFpbGFiaWxpdHlfX2F2YWlsYWJsZV9mcm9tX3RvZGF5JyApICkgKSApXHJcblx0XHRcdFx0KVxyXG5cdFx0KXtcclxuXHRcdFx0cmV0dXJuIFsgZmFsc2UsIGNzc19kYXRlX19zdGFuZGFyZCArICcgZGF0ZV91c2VyX3VuYXZhaWxhYmxlJyBcdFx0KyAnIGJlZm9yZV9hZnRlcl91bmF2YWlsYWJsZScgXTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTRUFTT05TIDo6ICBcdFx0XHRcdFx0Qm9va2luZyA+IFJlc291cmNlcyA+IEF2YWlsYWJpbGl0eSBwYWdlXHJcblx0XHR2YXIgICAgaXNfZGF0ZV9hdmFpbGFibGUgPSBjYWxlbmRhcl9wYXJhbXNfYXJyLnNlYXNvbl9jdXN0b21pemVfcGx1Z2luWyBzcWxfY2xhc3NfZGF5IF07XHJcblx0XHRpZiAoIGZhbHNlID09PSBpc19kYXRlX2F2YWlsYWJsZSApe1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL0ZpeEluOiA5LjUuNC40XHJcblx0XHRcdHJldHVybiBbIGZhbHNlLCBjc3NfZGF0ZV9fc3RhbmRhcmQgKyAnIGRhdGVfdXNlcl91bmF2YWlsYWJsZSdcdFx0KyAnIHNlYXNvbl91bmF2YWlsYWJsZScgXTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBSRVNPVVJDRV9VTkFWQUlMQUJMRSA6OiAgIFx0Qm9va2luZyA+IEN1c3RvbWl6ZSBwYWdlXHJcblx0XHRpZiAoIHdwYmNfaW5fYXJyYXkoY2FsZW5kYXJfcGFyYW1zX2Fyci5yZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlcywgc3FsX2NsYXNzX2RheSApICl7XHJcblx0XHRcdGlzX2RhdGVfYXZhaWxhYmxlID0gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRpZiAoICBmYWxzZSA9PT0gaXNfZGF0ZV9hdmFpbGFibGUgKXtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vRml4SW46IDkuNS40LjRcclxuXHRcdFx0cmV0dXJuIFsgZmFsc2UsIGNzc19kYXRlX19zdGFuZGFyZCArICcgZGF0ZV91c2VyX3VuYXZhaWxhYmxlJ1x0XHQrICcgcmVzb3VyY2VfdW5hdmFpbGFibGUnIF07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcblxyXG5cclxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG5cdFx0Ly8gSXMgYW55IGJvb2tpbmdzIGluIHRoaXMgZGF0ZSA/XHJcblx0XHRpZiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YoIGNhbGVuZGFyX3BhcmFtc19hcnIuYm9va2VkX2RhdGVzWyBjbGFzc19kYXkgXSApICkge1xyXG5cclxuXHRcdFx0dmFyIGJvb2tpbmdzX2luX2RhdGUgPSBjYWxlbmRhcl9wYXJhbXNfYXJyLmJvb2tlZF9kYXRlc1sgY2xhc3NfZGF5IF07XHJcblxyXG5cclxuXHRcdFx0aWYgKCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mKCBib29raW5nc19pbl9kYXRlWyAnc2VjXzAnIF0gKSApIHtcdFx0XHQvLyBcIkZ1bGwgZGF5XCIgYm9va2luZyAgLT4gKHNlY29uZHMgPT0gMClcclxuXHJcblx0XHRcdFx0Y3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gKCAnMCcgPT09IGJvb2tpbmdzX2luX2RhdGVbICdzZWNfMCcgXS5hcHByb3ZlZCApID8gJyBkYXRlMmFwcHJvdmUgJyA6ICcgZGF0ZV9hcHByb3ZlZCAnO1x0XHRcdFx0Ly8gUGVuZGluZyA9ICcwJyB8ICBBcHByb3ZlZCA9ICcxJ1xyXG5cdFx0XHRcdGNzc19kYXRlX19hZGRpdGlvbmFsICs9ICcgZnVsbF9kYXlfYm9va2luZyc7XHJcblxyXG5cdFx0XHRcdHJldHVybiBbIGZhbHNlLCBjc3NfZGF0ZV9fc3RhbmRhcmQgKyBjc3NfZGF0ZV9fYWRkaXRpb25hbCBdO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggT2JqZWN0LmtleXMoIGJvb2tpbmdzX2luX2RhdGUgKS5sZW5ndGggPiAwICl7XHRcdFx0XHQvLyBcIlRpbWUgc2xvdHNcIiBCb29raW5nc1xyXG5cclxuXHRcdFx0XHR2YXIgaXNfYXBwcm92ZWQgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRfLmVhY2goIGJvb2tpbmdzX2luX2RhdGUsIGZ1bmN0aW9uICggcF92YWwsIHBfa2V5LCBwX2RhdGEgKSB7XHJcblx0XHRcdFx0XHRpZiAoICFwYXJzZUludCggcF92YWwuYXBwcm92ZWQgKSApe1xyXG5cdFx0XHRcdFx0XHRpc19hcHByb3ZlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dmFyIHRzID0gcF92YWwuYm9va2luZ19kYXRlLnN1YnN0cmluZyggcF92YWwuYm9va2luZ19kYXRlLmxlbmd0aCAtIDEgKTtcclxuXHRcdFx0XHRcdGlmICggdHJ1ZSA9PT0gX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAnaXNfZW5hYmxlZF9jaGFuZ2Vfb3ZlcicgKSApe1xyXG5cdFx0XHRcdFx0XHRpZiAoIHRzID09ICcxJyApIHsgY3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gJyBjaGVja19pbl90aW1lJyArICgocGFyc2VJbnQocF92YWwuYXBwcm92ZWQpKSA/ICcgY2hlY2tfaW5fdGltZV9kYXRlX2FwcHJvdmVkJyA6ICcgY2hlY2tfaW5fdGltZV9kYXRlMmFwcHJvdmUnKTsgfVxyXG5cdFx0XHRcdFx0XHRpZiAoIHRzID09ICcyJyApIHsgY3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gJyBjaGVja19vdXRfdGltZScgKyAoKHBhcnNlSW50KHBfdmFsLmFwcHJvdmVkKSkgPyAnIGNoZWNrX291dF90aW1lX2RhdGVfYXBwcm92ZWQnIDogJyBjaGVja19vdXRfdGltZV9kYXRlMmFwcHJvdmUnKTsgfVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aWYgKCAhIGlzX2FwcHJvdmVkICl7XHJcblx0XHRcdFx0XHRjc3NfZGF0ZV9fYWRkaXRpb25hbCArPSAnIGRhdGUyYXBwcm92ZSB0aW1lc3BhcnRseSdcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gJyBkYXRlX2FwcHJvdmVkIHRpbWVzcGFydGx5J1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCAhIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2lzX2VuYWJsZWRfY2hhbmdlX292ZXInICkgKXtcclxuXHRcdFx0XHRcdGNzc19kYXRlX19hZGRpdGlvbmFsICs9ICcgdGltZXNfY2xvY2snXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdFx0cmV0dXJuIFsgdHJ1ZSwgY3NzX2RhdGVfX3N0YW5kYXJkICsgY3NzX2RhdGVfX2FkZGl0aW9uYWwgKyAnIGRhdGVfYXZhaWxhYmxlJyBdO1xyXG5cdH1cclxuXHJcbi8vVE9ETzogbmVlZCB0byAgdXNlIHdwYmNfY2FsZW5kYXIgc2NyaXB0LCAgaW5zdGVhZCBvZiB0aGlzIG9uZVxyXG5cdC8qKlxyXG5cdCAqIEFwcGx5IHNvbWUgQ1NTIGNsYXNzZXMsIHdoZW4gd2UgbW91c2Ugb3ZlciBzcGVjaWZpYyBkYXRlcyBpbiBjYWxlbmRhclxyXG5cdCAqIEBwYXJhbSB2YWx1ZVxyXG5cdCAqIEBwYXJhbSBkYXRlXHRcdFx0XHRcdC0gIEphdmFTY3JpcHQgRGF0ZSBPYmo6ICBcdFx0TW9uIERlYyAxMSAyMDIzIDAwOjAwOjAwIEdNVCswMjAwIChFYXN0ZXJuIEV1cm9wZWFuIFN0YW5kYXJkIFRpbWUpXHJcblx0ICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcdC0gIENhbGVuZGFyIFNldHRpbmdzIE9iamVjdDogIFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImh0bWxfaWRcIjogXCJjYWxlbmRhcl9ib29raW5nNFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInRleHRfaWRcIjogXCJkYXRlX2Jvb2tpbmc0XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX2Jvb2tpbmdfc3RhcnRfZGF5X3dlZWVrXCI6IDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzXCI6IDEyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInJlc291cmNlX2lkXCI6IDQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYWp4X25vbmNlX2NhbGVuZGFyXCI6IFwiPGlucHV0IHR5cGU9XFxcImhpZGRlblxcXCIgLi4uIC8+XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYm9va2VkX2RhdGVzXCI6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIxMi0yOC0yMDIyXCI6IFtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJib29raW5nX2RhdGVcIjogXCIyMDIyLTEyLTI4IDAwOjAwOjAwXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJhcHByb3ZlZFwiOiBcIjFcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImJvb2tpbmdfaWRcIjogXCIyNlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2Vhc29uX2N1c3RvbWl6ZV9wbHVnaW4nOntcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMDlcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTBcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTFcIjogdHJ1ZSwgLi4uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdCAqIEBwYXJhbSBkYXRlcGlja190aGlzXHRcdFx0LSB0aGlzIG9mIGRhdGVwaWNrIE9ialxyXG5cdCAqXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX29uX2RheXNfaG92ZXIoIHZhbHVlLCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCBkYXRlcGlja190aGlzICl7XHJcblxyXG5cdFx0XHRcdFx0aWYoIG51bGwgPT09IGRhdGUgKXtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHJcblxyXG5cdFx0XHRcdFx0Ly8gVGhlIHNhbWUgZnVuY3Rpb25zIGFzIGluIGNsaWVudC5jc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0Ly9UT0RPOiAyMDIzLTA2LTMwIDE3OjIyXHJcblx0XHRcdFx0XHRpZiAoIHRydWUgKXtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBia190eXBlID0gY2FsZW5kYXJfcGFyYW1zX2Fyci5yZXNvdXJjZV9pZFxyXG5cclxuXHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgaXNfY2FsZW5kYXJfYm9va2luZ191bnNlbGVjdGFibGUgPSBqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZ191bnNlbGVjdGFibGUnICsgYmtfdHlwZSApO1x0XHRcdFx0Ly9GaXhJbjogOC4wLjEuMlxyXG5cdFx0XHRcdFx0XHR2YXIgaXNfYm9va2luZ19mb3JtX2Fsc28gPSBqUXVlcnkoICcjYm9va2luZ19mb3JtX2RpdicgKyBia190eXBlICk7XHJcblx0XHRcdFx0XHRcdC8vIFNldCB1bnNlbGVjdGFibGUsICBpZiBvbmx5IEF2YWlsYWJpbGl0eSBDYWxlbmRhciAgaGVyZSAoYW5kIHdlIGRvIG5vdCBpbnNlcnQgQm9va2luZyBmb3JtIGJ5IG1pc3Rha2UpLlxyXG5cdFx0XHRcdFx0XHRpZiAoIChpc19jYWxlbmRhcl9ib29raW5nX3Vuc2VsZWN0YWJsZS5sZW5ndGggPT0gMSkgJiYgKGlzX2Jvb2tpbmdfZm9ybV9hbHNvLmxlbmd0aCAhPSAxKSApe1xyXG5cdFx0XHRcdFx0XHRcdGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIGJrX3R5cGUgKyAnIC5kYXRlcGljay1kYXlzLWNlbGwtb3ZlcicgKS5yZW1vdmVDbGFzcyggJ2RhdGVwaWNrLWRheXMtY2VsbC1vdmVyJyApOyAgICAgICAgLy8gY2xlYXIgYWxsIGhpZ2hsaWdodCBkYXlzIHNlbGVjdGlvbnNcclxuXHRcdFx0XHRcdFx0XHRqUXVlcnkoICcud3BiY19vbmx5X2NhbGVuZGFyICNjYWxlbmRhcl9ib29raW5nJyArIGJrX3R5cGUgKyAnIC5kYXRlcGljay1kYXlzLWNlbGwsICcgK1xyXG5cdFx0XHRcdFx0XHRcdFx0Jy53cGJjX29ubHlfY2FsZW5kYXIgI2NhbGVuZGFyX2Jvb2tpbmcnICsgYmtfdHlwZSArICcgLmRhdGVwaWNrLWRheXMtY2VsbCBhJyApLmNzcyggJ2N1cnNvcicsICdkZWZhdWx0JyApO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vRml4SW46IDguMC4xLjJcdGVuZFxyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHRcdGlmICggbnVsbCA9PT0gZGF0ZSApe1xyXG5cdFx0XHRqUXVlcnkoICcuZGF0ZXBpY2stZGF5cy1jZWxsLW92ZXInICkucmVtb3ZlQ2xhc3MoICdkYXRlcGljay1kYXlzLWNlbGwtb3ZlcicgKTsgICBcdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBoaWdobGlnaHQgZGF5cyBzZWxlY3Rpb25zXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgaW5zdCA9IGpRdWVyeS5kYXRlcGljay5fZ2V0SW5zdCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKSApO1xyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0ICAgKCAxID09IGluc3QuZGF0ZXMubGVuZ3RoKVx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgb25lIHNlbGVjdGVkIGRhdGVcclxuXHRcdFx0JiYgKCdkeW5hbWljJyA9PT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSkgXHRcdFx0XHRcdC8vIHdoaWxlIGhhdmUgcmFuZ2UgZGF5cyBzZWxlY3Rpb24gbW9kZVxyXG5cdFx0KXtcclxuXHJcblx0XHRcdHZhciB0ZF9jbGFzcztcclxuXHRcdFx0dmFyIHRkX292ZXJzID0gW107XHJcblx0XHRcdHZhciBpc19jaGVjayA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBzZWxjZXRlZF9maXJzdF9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBzZWxjZXRlZF9maXJzdF9kYXkuc2V0RnVsbFllYXIoaW5zdC5kYXRlc1swXS5nZXRGdWxsWWVhcigpLChpbnN0LmRhdGVzWzBdLmdldE1vbnRoKCkpLCAoaW5zdC5kYXRlc1swXS5nZXREYXRlKCkgKSApOyAvL0dldCBmaXJzdCBEYXRlXHJcblxyXG4gICAgICAgICAgICB3aGlsZSggIGlzX2NoZWNrICl7XHJcblxyXG5cdFx0XHRcdHRkX2NsYXNzID0gKHNlbGNldGVkX2ZpcnN0X2RheS5nZXRNb250aCgpICsgMSkgKyAnLScgKyBzZWxjZXRlZF9maXJzdF9kYXkuZ2V0RGF0ZSgpICsgJy0nICsgc2VsY2V0ZWRfZmlyc3RfZGF5LmdldEZ1bGxZZWFyKCk7XHJcblxyXG5cdFx0XHRcdHRkX292ZXJzWyB0ZF9vdmVycy5sZW5ndGggXSA9ICcjY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICsgJyAuY2FsNGRhdGUtJyArIHRkX2NsYXNzOyAgICAgICAgICAgICAgLy8gYWRkIHRvIGFycmF5IGZvciBsYXRlciBtYWtlIHNlbGVjdGlvbiBieSBjbGFzc1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChcclxuXHRcdFx0XHRcdCggICggZGF0ZS5nZXRNb250aCgpID09IHNlbGNldGVkX2ZpcnN0X2RheS5nZXRNb250aCgpICkgICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgKCBkYXRlLmdldERhdGUoKSA9PSBzZWxjZXRlZF9maXJzdF9kYXkuZ2V0RGF0ZSgpICkgICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgKCBkYXRlLmdldEZ1bGxZZWFyKCkgPT0gc2VsY2V0ZWRfZmlyc3RfZGF5LmdldEZ1bGxZZWFyKCkgKVxyXG5cdFx0XHRcdFx0KSB8fCAoIHNlbGNldGVkX2ZpcnN0X2RheSA+IGRhdGUgKVxyXG5cdFx0XHRcdCl7XHJcblx0XHRcdFx0XHRpc19jaGVjayA9ICBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNlbGNldGVkX2ZpcnN0X2RheS5zZXRGdWxsWWVhciggc2VsY2V0ZWRfZmlyc3RfZGF5LmdldEZ1bGxZZWFyKCksIChzZWxjZXRlZF9maXJzdF9kYXkuZ2V0TW9udGgoKSksIChzZWxjZXRlZF9maXJzdF9kYXkuZ2V0RGF0ZSgpICsgMSkgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gSGlnaGxpZ2h0IERheXNcclxuXHRcdFx0Zm9yICggdmFyIGk9MDsgaSA8IHRkX292ZXJzLmxlbmd0aCA7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgY2xhc3MgdG8gYWxsIGVsZW1lbnRzXHJcblx0XHRcdFx0alF1ZXJ5KCB0ZF9vdmVyc1tpXSApLmFkZENsYXNzKCdkYXRlcGljay1kYXlzLWNlbGwtb3ZlcicpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0ICAgIHJldHVybiB0cnVlO1xyXG5cdH1cclxuXHJcbi8vVE9ETzogbmVlZCB0byAgdXNlIHdwYmNfY2FsZW5kYXIgc2NyaXB0LCAgaW5zdGVhZCBvZiB0aGlzIG9uZVxyXG5cclxuXHQvKipcclxuXHQgKiBPbiBEQVlzIHNlbGVjdGlvbiBpbiBjYWxlbmRhclxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGRhdGVzX3NlbGVjdGlvblx0XHQtICBzdHJpbmc6XHRcdFx0ICcyMDIzLTAzLTA3IH4gMjAyMy0wMy0wNycgb3IgJzIwMjMtMDQtMTAsIDIwMjMtMDQtMTIsIDIwMjMtMDQtMDIsIDIwMjMtMDQtMDQnXHJcblx0ICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcdC0gIENhbGVuZGFyIFNldHRpbmdzIE9iamVjdDogIFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImh0bWxfaWRcIjogXCJjYWxlbmRhcl9ib29raW5nNFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInRleHRfaWRcIjogXCJkYXRlX2Jvb2tpbmc0XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX2Jvb2tpbmdfc3RhcnRfZGF5X3dlZWVrXCI6IDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzXCI6IDEyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInJlc291cmNlX2lkXCI6IDQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYWp4X25vbmNlX2NhbGVuZGFyXCI6IFwiPGlucHV0IHR5cGU9XFxcImhpZGRlblxcXCIgLi4uIC8+XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYm9va2VkX2RhdGVzXCI6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIxMi0yOC0yMDIyXCI6IFtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJib29raW5nX2RhdGVcIjogXCIyMDIyLTEyLTI4IDAwOjAwOjAwXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJhcHByb3ZlZFwiOiBcIjFcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImJvb2tpbmdfaWRcIjogXCIyNlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2Vhc29uX2N1c3RvbWl6ZV9wbHVnaW4nOntcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMDlcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTBcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTFcIjogdHJ1ZSwgLi4uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdCAqIEBwYXJhbSBkYXRlcGlja190aGlzXHRcdFx0LSB0aGlzIG9mIGRhdGVwaWNrIE9ialxyXG5cdCAqXHJcblx0ICogQHJldHVybnMgYm9vbGVhblxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19vbl9kYXlzX3NlbGVjdCggZGF0ZXNfc2VsZWN0aW9uLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCBkYXRlcGlja190aGlzID0gbnVsbCApe1xyXG5cclxuXHJcblx0XHQvLyBUaGUgc2FtZSBmdW5jdGlvbnMgYXMgaW4gY2xpZW50LmNzc1x0XHRcdC8vVE9ETzogMjAyMy0wNi0zMCAxNzoyMlxyXG5cdFx0aWYgKCB0cnVlICl7XHJcblxyXG5cdFx0XHR2YXIgYmtfdHlwZSA9IGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWRcclxuXHRcdFx0dmFyIGRhdGUgPSBkYXRlc19zZWxlY3Rpb247XHJcblxyXG5cdFx0XHQvLyBTZXQgdW5zZWxlY3RhYmxlLCAgaWYgb25seSBBdmFpbGFiaWxpdHkgQ2FsZW5kYXIgIGhlcmUgKGFuZCB3ZSBkbyBub3QgaW5zZXJ0IEJvb2tpbmcgZm9ybSBieSBtaXN0YWtlKS5cclxuXHRcdFx0dmFyIGlzX2NhbGVuZGFyX2Jvb2tpbmdfdW5zZWxlY3RhYmxlID0galF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmdfdW5zZWxlY3RhYmxlJyArIGJrX3R5cGUgKTtcdFx0XHRcdC8vRml4SW46IDguMC4xLjJcclxuXHRcdFx0dmFyIGlzX2Jvb2tpbmdfZm9ybV9hbHNvID0galF1ZXJ5KCAnI2Jvb2tpbmdfZm9ybV9kaXYnICsgYmtfdHlwZSApO1xyXG5cclxuXHRcdFx0aWYgKCAoaXNfY2FsZW5kYXJfYm9va2luZ191bnNlbGVjdGFibGUubGVuZ3RoID4gMCkgJiYgKGlzX2Jvb2tpbmdfZm9ybV9hbHNvLmxlbmd0aCA8PSAwKSApe1xyXG5cclxuXHRcdFx0XHR3cGJjX2NhbGVuZGFyX191bnNlbGVjdF9hbGxfZGF0ZXMoIGJrX3R5cGUgKTtcclxuXHRcdFx0XHRqUXVlcnkoICcud3BiY19vbmx5X2NhbGVuZGFyIC5wb3BvdmVyX2NhbGVuZGFyX2hvdmVyJyApLnJlbW92ZSgpOyAgICAgICAgICAgICAgICAgICAgICBcdFx0XHRcdFx0Ly9IaWRlIGFsbCBvcGVuZWQgcG9wb3ZlcnNcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvL0ZpeEluOiA4LjAuMS4yIGVuZFxyXG5cclxuXHRcdFx0alF1ZXJ5KCAnI2RhdGVfYm9va2luZycgKyBia190eXBlICkudmFsKCBkYXRlICk7XHJcblxyXG5cclxuXHJcblxyXG5cdFx0XHRqUXVlcnkoIFwiLmJvb2tpbmdfZm9ybV9kaXZcIiApLnRyaWdnZXIoIFwiZGF0ZV9zZWxlY3RlZFwiLCBbYmtfdHlwZSwgZGF0ZV0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gRnVuY3Rpb25hbGl0eSAgZnJvbSAgQm9va2luZyA+IEF2YWlsYWJpbGl0eSBwYWdlXHJcblxyXG5cdFx0XHR2YXIgaW5zdCA9IGpRdWVyeS5kYXRlcGljay5fZ2V0SW5zdCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKSApO1xyXG5cclxuXHRcdFx0dmFyIGRhdGVzX2FyciA9IFtdO1x0Ly8gIFsgXCIyMDIzLTA0LTA5XCIsIFwiMjAyMy0wNC0xMFwiLCBcIjIwMjMtMDQtMTFcIiBdXHJcblxyXG5cdFx0XHRpZiAoIC0xICE9PSBkYXRlc19zZWxlY3Rpb24uaW5kZXhPZiggJ34nICkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhbmdlIERheXNcclxuXHJcblx0XHRcdFx0ZGF0ZXNfYXJyID0gd3BiY19nZXRfZGF0ZXNfYXJyX19mcm9tX2RhdGVzX3JhbmdlX2pzKCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkYXRlc19zZXBhcmF0b3InIDogJyB+ICcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAnIH4gJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGF0ZXMnICAgICAgICAgICA6IGRhdGVzX3NlbGVjdGlvbiwgICAgXHRcdCAgIC8vICcyMDIzLTA0LTA0IH4gMjAyMy0wNC0wNydcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBEYXlzXHJcblx0XHRcdFx0ZGF0ZXNfYXJyID0gd3BiY19nZXRfZGF0ZXNfYXJyX19mcm9tX2RhdGVzX2NvbW1hX3NlcGFyYXRlZF9qcygge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGF0ZXNfc2VwYXJhdG9yJyA6ICcsICcsICAgICAgICAgICAgICAgICAgICAgICAgIFx0Ly8gICcsICdcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RhdGVzJyAgICAgICAgICAgOiBkYXRlc19zZWxlY3Rpb24sICAgIFx0XHRcdC8vICcyMDIzLTA0LTEwLCAyMDIzLTA0LTEyLCAyMDIzLTA0LTAyLCAyMDIzLTA0LTA0J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR3cGJjX2F2eV9hZnRlcl9kYXlzX3NlbGVjdGlvbl9fc2hvd19oZWxwX2luZm8oe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUnOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGF0ZXNfYXJyJyAgICAgICAgICAgICAgICAgICAgOiBkYXRlc19hcnIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkYXRlc19jbGlja19udW0nICAgICAgICAgICAgICA6IGluc3QuZGF0ZXMubGVuZ3RoLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncG9wb3Zlcl9oaW50cydcdFx0XHRcdFx0OiBjYWxlbmRhcl9wYXJhbXNfYXJyLnBvcG92ZXJfaGludHNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNob3cgaGVscCBpbmZvIGF0IHRoZSB0b3AgIHRvb2xiYXIgYWJvdXQgc2VsZWN0ZWQgZGF0ZXMgYW5kIGZ1dHVyZSBhY3Rpb25zXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHBhcmFtc1xyXG5cdFx0ICogXHRcdFx0XHRcdEV4YW1wbGUgMTogIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlOiBcImR5bmFtaWNcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVzX2FycjogIFsgXCIyMDIzLTA0LTAzXCIgXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVzX2NsaWNrX251bTogMVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3BvcG92ZXJfaGludHMnXHRcdFx0XHRcdDogY2FsZW5kYXJfcGFyYW1zX2Fyci5wb3BvdmVyX2hpbnRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0ICogXHRcdFx0XHRcdEV4YW1wbGUgMjogIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlOiBcImR5bmFtaWNcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZXNfYXJyOiBBcnJheSgxMCkgWyBcIjIwMjMtMDQtMDNcIiwgXCIyMDIzLTA0LTA0XCIsIFwiMjAyMy0wNC0wNVwiLCDigKYgXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZXNfY2xpY2tfbnVtOiAyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncG9wb3Zlcl9oaW50cydcdFx0XHRcdFx0OiBjYWxlbmRhcl9wYXJhbXNfYXJyLnBvcG92ZXJfaGludHNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfYXZ5X2FmdGVyX2RheXNfc2VsZWN0aW9uX19zaG93X2hlbHBfaW5mbyggcGFyYW1zICl7XHJcbi8vIGNvbnNvbGUubG9nKCBwYXJhbXMgKTtcdC8vXHRcdFsgXCIyMDIzLTA0LTA5XCIsIFwiMjAyMy0wNC0xMFwiLCBcIjIwMjMtMDQtMTFcIiBdXHJcblxyXG5cdFx0XHR2YXIgbWVzc2FnZSwgY29sb3I7XHJcblx0XHRcdGlmIChqUXVlcnkoICcjdWlfYnRuX2NzdG1fX3NldF9kYXlzX2N1c3RvbWl6ZV9wbHVnaW5fX2F2YWlsYWJsZScpLmlzKCc6Y2hlY2tlZCcpKXtcclxuXHRcdFx0XHQgbWVzc2FnZSA9IHBhcmFtcy5wb3BvdmVyX2hpbnRzLnRvb2xiYXJfdGV4dF9hdmFpbGFibGU7Ly8nU2V0IGRhdGVzIF9EQVRFU18gYXMgX0hUTUxfIGF2YWlsYWJsZS4nO1xyXG5cdFx0XHRcdCBjb2xvciA9ICcjMTFiZTRjJztcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRtZXNzYWdlID0gcGFyYW1zLnBvcG92ZXJfaGludHMudG9vbGJhcl90ZXh0X3VuYXZhaWxhYmxlOy8vJ1NldCBkYXRlcyBfREFURVNfIGFzIF9IVE1MXyB1bmF2YWlsYWJsZS4nO1xyXG5cdFx0XHRcdGNvbG9yID0gJyNlNDM5MzknO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRtZXNzYWdlID0gJzxzcGFuPicgKyBtZXNzYWdlICsgJzwvc3Bhbj4nO1xyXG5cclxuXHRcdFx0dmFyIGZpcnN0X2RhdGUgPSBwYXJhbXNbICdkYXRlc19hcnInIF1bIDAgXTtcclxuXHRcdFx0dmFyIGxhc3RfZGF0ZSAgPSAoICdkeW5hbWljJyA9PSBwYXJhbXMuY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUgKVxyXG5cdFx0XHRcdFx0XHRcdD8gcGFyYW1zWyAnZGF0ZXNfYXJyJyBdWyAocGFyYW1zWyAnZGF0ZXNfYXJyJyBdLmxlbmd0aCAtIDEpIF1cclxuXHRcdFx0XHRcdFx0XHQ6ICggcGFyYW1zWyAnZGF0ZXNfYXJyJyBdLmxlbmd0aCA+IDEgKSA/IHBhcmFtc1sgJ2RhdGVzX2FycicgXVsgMSBdIDogJyc7XHJcblxyXG5cdFx0XHRmaXJzdF9kYXRlID0galF1ZXJ5LmRhdGVwaWNrLmZvcm1hdERhdGUoICdkZCBNLCB5eScsIG5ldyBEYXRlKCBmaXJzdF9kYXRlICsgJ1QwMDowMDowMCcgKSApO1xyXG5cdFx0XHRsYXN0X2RhdGUgPSBqUXVlcnkuZGF0ZXBpY2suZm9ybWF0RGF0ZSggJ2RkIE0sIHl5JywgIG5ldyBEYXRlKCBsYXN0X2RhdGUgKyAnVDAwOjAwOjAwJyApICk7XHJcblxyXG5cclxuXHRcdFx0aWYgKCAnZHluYW1pYycgPT0gcGFyYW1zLmNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlICl7XHJcblx0XHRcdFx0aWYgKCAxID09IHBhcmFtcy5kYXRlc19jbGlja19udW0gKXtcclxuXHRcdFx0XHRcdGxhc3RfZGF0ZSA9ICdfX19fX19fX19fXydcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aWYgKCAnZmlyc3RfdGltZScgPT0galF1ZXJ5KCAnLndwYmNfYWp4X2N1c3RvbWl6ZV9wbHVnaW5fY29udGFpbmVyJyApLmF0dHIoICd3cGJjX2xvYWRlZCcgKSApe1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkoICcud3BiY19hanhfY3VzdG9taXplX3BsdWdpbl9jb250YWluZXInICkuYXR0ciggJ3dwYmNfbG9hZGVkJywgJ2RvbmUnIClcclxuXHRcdFx0XHRcdFx0d3BiY19ibGlua19lbGVtZW50KCAnLndwYmNfd2lkZ2V0X2NoYW5nZV9jYWxlbmRhcl9za2luJywgMywgMjIwICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoICdfREFURVNfJywgICAgJzwvc3Bhbj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLysgJzxkaXY+JyArICdmcm9tJyArICc8L2Rpdj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrICc8c3BhbiBjbGFzcz1cIndwYmNfYmlnX2RhdGVcIj4nICsgZmlyc3RfZGF0ZSArICc8L3NwYW4+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnPHNwYW4+JyArICctJyArICc8L3NwYW4+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnPHNwYW4gY2xhc3M9XCJ3cGJjX2JpZ19kYXRlXCI+JyArIGxhc3RfZGF0ZSArICc8L3NwYW4+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnPHNwYW4+JyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIGlmICggcGFyYW1zWyAnZGF0ZXNfYXJyJyBdLmxlbmd0aCA+IDEgKXtcclxuXHRcdFx0XHQvLyBcdGxhc3RfZGF0ZSA9ICcsICcgKyBsYXN0X2RhdGU7XHJcblx0XHRcdFx0Ly8gXHRsYXN0X2RhdGUgKz0gKCBwYXJhbXNbICdkYXRlc19hcnInIF0ubGVuZ3RoID4gMiApID8gJywgLi4uJyA6ICcnO1xyXG5cdFx0XHRcdC8vIH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gXHRsYXN0X2RhdGU9Jyc7XHJcblx0XHRcdFx0Ly8gfVxyXG5cdFx0XHRcdHZhciBkYXRlc19hcnIgPSBbXTtcclxuXHRcdFx0XHRmb3IoIHZhciBpID0gMDsgaSA8IHBhcmFtc1sgJ2RhdGVzX2FycicgXS5sZW5ndGg7IGkrKyApe1xyXG5cdFx0XHRcdFx0ZGF0ZXNfYXJyLnB1c2goICBqUXVlcnkuZGF0ZXBpY2suZm9ybWF0RGF0ZSggJ2RkIE0geXknLCAgbmV3IERhdGUoIHBhcmFtc1sgJ2RhdGVzX2FycicgXVsgaSBdICsgJ1QwMDowMDowMCcgKSApICApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmaXJzdF9kYXRlID0gZGF0ZXNfYXJyLmpvaW4oICcsICcgKTtcclxuXHRcdFx0XHRtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCAnX0RBVEVTXycsICAgICc8L3NwYW4+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnPHNwYW4gY2xhc3M9XCJ3cGJjX2JpZ19kYXRlXCI+JyArIGZpcnN0X2RhdGUgKyAnPC9zcGFuPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgJzxzcGFuPicgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCAnX0hUTUxfJyAsICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ3cGJjX2JpZ190ZXh0XCIgc3R5bGU9XCJjb2xvcjonK2NvbG9yKyc7XCI+JykgKyAnPHNwYW4+JztcclxuXHJcblx0XHRcdC8vbWVzc2FnZSArPSAnIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMWVtO1wiPicgKyAnIENsaWNrIG9uIEFwcGx5IGJ1dHRvbiB0byBhcHBseSBjdXN0b21pemVfcGx1Z2luLicgKyAnPC9kaXY+JztcclxuXHJcblx0XHRcdG1lc3NhZ2UgPSAnPGRpdiBjbGFzcz1cIndwYmNfdG9vbGJhcl9kYXRlc19oaW50c1wiPicgKyBtZXNzYWdlICsgJzwvZGl2Pic7XHJcblxyXG5cdFx0XHRqUXVlcnkoICcud3BiY19oZWxwX3RleHQnICkuaHRtbChcdG1lc3NhZ2UgKTtcclxuXHRcdH1cclxuXHJcblx0LyoqXHJcblx0ICogICBQYXJzZSBkYXRlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2V0IGRhdGVzIGFycmF5LCAgZnJvbSBjb21tYSBzZXBhcmF0ZWQgZGF0ZXNcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gcGFyYW1zICAgICAgID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiAnZGF0ZXNfc2VwYXJhdG9yJyA9PiAnLCAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlcyBzZXBhcmF0b3JcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogJ2RhdGVzJyAgICAgICAgICAgPT4gJzIwMjMtMDQtMDQsIDIwMjMtMDQtMDcsIDIwMjMtMDQtMDUnICAgICAgICAgLy8gRGF0ZXMgaW4gJ1ktbS1kJyBmb3JtYXQ6ICcyMDIzLTAxLTMxJ1xyXG5cdFx0XHRcdFx0XHRcdFx0IH1cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIGFycmF5ICAgICAgPSBbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqIFswXSA9PiAyMDIzLTA0LTA0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqIFsxXSA9PiAyMDIzLTA0LTA1XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqIFsyXSA9PiAyMDIzLTA0LTA2XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqIFszXSA9PiAyMDIzLTA0LTA3XHJcblx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHQgKlxyXG5cdFx0ICogRXhhbXBsZSAjMTogIHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19jb21tYV9zZXBhcmF0ZWRfanMoICB7ICAnZGF0ZXNfc2VwYXJhdG9yJyA6ICcsICcsICdkYXRlcycgOiAnMjAyMy0wNC0wNCwgMjAyMy0wNC0wNywgMjAyMy0wNC0wNScgIH0gICk7XHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19jb21tYV9zZXBhcmF0ZWRfanMoIHBhcmFtcyApe1xyXG5cclxuXHRcdFx0dmFyIGRhdGVzX2FyciA9IFtdO1xyXG5cclxuXHRcdFx0aWYgKCAnJyAhPT0gcGFyYW1zWyAnZGF0ZXMnIF0gKXtcclxuXHJcblx0XHRcdFx0ZGF0ZXNfYXJyID0gcGFyYW1zWyAnZGF0ZXMnIF0uc3BsaXQoIHBhcmFtc1sgJ2RhdGVzX3NlcGFyYXRvcicgXSApO1xyXG5cclxuXHRcdFx0XHRkYXRlc19hcnIuc29ydCgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBkYXRlc19hcnI7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBHZXQgZGF0ZXMgYXJyYXksICBmcm9tIHJhbmdlIGRheXMgc2VsZWN0aW9uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHBhcmFtcyAgICAgICA9ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqICdkYXRlc19zZXBhcmF0b3InID0+ICcgfiAnLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlcyBzZXBhcmF0b3JcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogJ2RhdGVzJyAgICAgICAgICAgPT4gJzIwMjMtMDQtMDQgfiAyMDIzLTA0LTA3JyAgICAgIC8vIERhdGVzIGluICdZLW0tZCcgZm9ybWF0OiAnMjAyMy0wMS0zMSdcclxuXHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4gYXJyYXkgICAgICAgID0gW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMF0gPT4gMjAyMy0wNC0wNFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMV0gPT4gMjAyMy0wNC0wNVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMl0gPT4gMjAyMy0wNC0wNlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbM10gPT4gMjAyMy0wNC0wN1xyXG5cdFx0XHRcdFx0XHRcdFx0ICBdXHJcblx0XHQgKlxyXG5cdFx0ICogRXhhbXBsZSAjMTogIHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19yYW5nZV9qcyggIHsgICdkYXRlc19zZXBhcmF0b3InIDogJyB+ICcsICdkYXRlcycgOiAnMjAyMy0wNC0wNCB+IDIwMjMtMDQtMDcnICB9ICApO1xyXG5cdFx0ICogRXhhbXBsZSAjMjogIHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19yYW5nZV9qcyggIHsgICdkYXRlc19zZXBhcmF0b3InIDogJyAtICcsICdkYXRlcycgOiAnMjAyMy0wNC0wNCAtIDIwMjMtMDQtMDcnICB9ICApO1xyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfcmFuZ2VfanMoIHBhcmFtcyApe1xyXG5cclxuXHRcdFx0dmFyIGRhdGVzX2FyciA9IFtdO1xyXG5cclxuXHRcdFx0aWYgKCAnJyAhPT0gcGFyYW1zWydkYXRlcyddICkge1xyXG5cclxuXHRcdFx0XHRkYXRlc19hcnIgPSBwYXJhbXNbICdkYXRlcycgXS5zcGxpdCggcGFyYW1zWyAnZGF0ZXNfc2VwYXJhdG9yJyBdICk7XHJcblx0XHRcdFx0dmFyIGNoZWNrX2luX2RhdGVfeW1kICA9IGRhdGVzX2FyclswXTtcclxuXHRcdFx0XHR2YXIgY2hlY2tfb3V0X2RhdGVfeW1kID0gZGF0ZXNfYXJyWzFdO1xyXG5cclxuXHRcdFx0XHRpZiAoICgnJyAhPT0gY2hlY2tfaW5fZGF0ZV95bWQpICYmICgnJyAhPT0gY2hlY2tfb3V0X2RhdGVfeW1kKSApe1xyXG5cclxuXHRcdFx0XHRcdGRhdGVzX2FyciA9IHdwYmNfZ2V0X2RhdGVzX2FycmF5X2Zyb21fc3RhcnRfZW5kX2RheXNfanMoIGNoZWNrX2luX2RhdGVfeW1kLCBjaGVja19vdXRfZGF0ZV95bWQgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGRhdGVzX2FycjtcclxuXHRcdH1cclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBHZXQgZGF0ZXMgYXJyYXkgYmFzZWQgb24gc3RhcnQgYW5kIGVuZCBkYXRlcy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQHBhcmFtIHN0cmluZyBzU3RhcnREYXRlIC0gc3RhcnQgZGF0ZTogMjAyMy0wNC0wOVxyXG5cdFx0XHQgKiBAcGFyYW0gc3RyaW5nIHNFbmREYXRlICAgLSBlbmQgZGF0ZTogICAyMDIzLTA0LTExXHJcblx0XHRcdCAqIEByZXR1cm4gYXJyYXkgICAgICAgICAgICAgLSBbIFwiMjAyMy0wNC0wOVwiLCBcIjIwMjMtMDQtMTBcIiwgXCIyMDIzLTA0LTExXCIgXVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0ZnVuY3Rpb24gd3BiY19nZXRfZGF0ZXNfYXJyYXlfZnJvbV9zdGFydF9lbmRfZGF5c19qcyggc1N0YXJ0RGF0ZSwgc0VuZERhdGUgKXtcclxuXHJcblx0XHRcdFx0c1N0YXJ0RGF0ZSA9IG5ldyBEYXRlKCBzU3RhcnREYXRlICsgJ1QwMDowMDowMCcgKTtcclxuXHRcdFx0XHRzRW5kRGF0ZSA9IG5ldyBEYXRlKCBzRW5kRGF0ZSArICdUMDA6MDA6MDAnICk7XHJcblxyXG5cdFx0XHRcdHZhciBhRGF5cz1bXTtcclxuXHJcblx0XHRcdFx0Ly8gU3RhcnQgdGhlIHZhcmlhYmxlIG9mZiB3aXRoIHRoZSBzdGFydCBkYXRlXHJcblx0XHRcdFx0YURheXMucHVzaCggc1N0YXJ0RGF0ZS5nZXRUaW1lKCkgKTtcclxuXHJcblx0XHRcdFx0Ly8gU2V0IGEgJ3RlbXAnIHZhcmlhYmxlLCBzQ3VycmVudERhdGUsIHdpdGggdGhlIHN0YXJ0IGRhdGUgLSBiZWZvcmUgYmVnaW5uaW5nIHRoZSBsb29wXHJcblx0XHRcdFx0dmFyIHNDdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCBzU3RhcnREYXRlLmdldFRpbWUoKSApO1xyXG5cdFx0XHRcdHZhciBvbmVfZGF5X2R1cmF0aW9uID0gMjQqNjAqNjAqMTAwMDtcclxuXHJcblx0XHRcdFx0Ly8gV2hpbGUgdGhlIGN1cnJlbnQgZGF0ZSBpcyBsZXNzIHRoYW4gdGhlIGVuZCBkYXRlXHJcblx0XHRcdFx0d2hpbGUoc0N1cnJlbnREYXRlIDwgc0VuZERhdGUpe1xyXG5cdFx0XHRcdFx0Ly8gQWRkIGEgZGF5IHRvIHRoZSBjdXJyZW50IGRhdGUgXCIrMSBkYXlcIlxyXG5cdFx0XHRcdFx0c0N1cnJlbnREYXRlLnNldFRpbWUoIHNDdXJyZW50RGF0ZS5nZXRUaW1lKCkgKyBvbmVfZGF5X2R1cmF0aW9uICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWRkIHRoaXMgbmV3IGRheSB0byB0aGUgYURheXMgYXJyYXlcclxuXHRcdFx0XHRcdGFEYXlzLnB1c2goIHNDdXJyZW50RGF0ZS5nZXRUaW1lKCkgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYURheXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGFEYXlzWyBpIF0gPSBuZXcgRGF0ZSggYURheXNbaV0gKTtcclxuXHRcdFx0XHRcdGFEYXlzWyBpIF0gPSBhRGF5c1sgaSBdLmdldEZ1bGxZZWFyKClcclxuXHRcdFx0XHRcdFx0XHRcdCsgJy0nICsgKCggKGFEYXlzWyBpIF0uZ2V0TW9udGgoKSArIDEpIDwgMTApID8gJzAnIDogJycpICsgKGFEYXlzWyBpIF0uZ2V0TW9udGgoKSArIDEpXHJcblx0XHRcdFx0XHRcdFx0XHQrICctJyArICgoICAgICAgICBhRGF5c1sgaSBdLmdldERhdGUoKSA8IDEwKSA/ICcwJyA6ICcnKSArICBhRGF5c1sgaSBdLmdldERhdGUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gT25jZSB0aGUgbG9vcCBoYXMgZmluaXNoZWQsIHJldHVybiB0aGUgYXJyYXkgb2YgZGF5cy5cclxuXHRcdFx0XHRyZXR1cm4gYURheXM7XHJcblx0XHRcdH1cclxuXHJcblxyXG4vKipcclxuICogU2Nyb2xsIHRvICBzcGVjaWZpYyBcIlllYXIgJiBNb250aFwiIFx0aW4gSW5saW5lIEJvb2tpbmcgQ2FsZW5kYXJcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHJlc291cmNlX2lkXHRcdDFcclxuICogQHBhcmFtIHtudW1iZXJ9IHllYXJcdFx0XHRcdDIwMjNcclxuICogQHBhcmFtIHtudW1iZXJ9IG1vbnRoXHRcdFx0MTJcdFx0XHQoZnJvbSAxIHRvICAxMilcclxuICpcclxuICogQHJldHVybnMge2Jvb2xlYW59XHRcdFx0Ly8gY2hhbmdlZCBvciBub3RcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19jaGFuZ2VfeWVhcl9tb250aCggcmVzb3VyY2VfaWQsIHllYXIsIG1vbnRoICl7XHJcblxyXG5cdHZhciBpbnN0ID0galF1ZXJ5LmRhdGVwaWNrLl9nZXRJbnN0KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQpICk7XHJcblxyXG5cdGlmICggZmFsc2UgIT0gaW5zdCApe1xyXG5cclxuXHRcdHllYXIgPSBwYXJzZUludCggeWVhciApO1xyXG5cdFx0bW9udGggPSBwYXJzZUludCggbW9udGggKSAtIDE7XHJcblxyXG5cdFx0aW5zdC5jdXJzb3JEYXRlID0gbmV3IERhdGUoKTtcclxuXHRcdGluc3QuY3Vyc29yRGF0ZS5zZXRGdWxsWWVhciggeWVhciwgbW9udGgsIDEgKTtcclxuXHRcdGluc3QuY3Vyc29yRGF0ZS5zZXRNb250aCggbW9udGggKTtcdFx0XHRcdFx0XHQvLyBJbiBzb21lIGNhc2VzLCAgdGhlIHNldEZ1bGxZZWFyIGNhbiAgc2V0ICBvbmx5IFllYXIsICBhbmQgbm90IHRoZSBNb250aCBhbmQgZGF5ICAgICAgLy9GaXhJbjo2LjIuMy41XHJcblx0XHRpbnN0LmN1cnNvckRhdGUuc2V0RGF0ZSggMSApO1xyXG5cclxuXHRcdGluc3QuZHJhd01vbnRoID0gaW5zdC5jdXJzb3JEYXRlLmdldE1vbnRoKCk7XHJcblx0XHRpbnN0LmRyYXdZZWFyICA9IGluc3QuY3Vyc29yRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG5cclxuXHRcdGpRdWVyeS5kYXRlcGljay5fbm90aWZ5Q2hhbmdlKCBpbnN0ICk7XHJcblx0XHRqUXVlcnkuZGF0ZXBpY2suX2FkanVzdEluc3REYXRlKCBpbnN0ICk7XHJcblx0XHRqUXVlcnkuZGF0ZXBpY2suX3Nob3dEYXRlKCBpbnN0ICk7XHJcblx0XHRqUXVlcnkuZGF0ZXBpY2suX3VwZGF0ZURhdGVwaWNrKCBpbnN0ICk7XHJcblxyXG5cdFx0cmV0dXJuICB0cnVlO1xyXG5cdH1cclxuXHRyZXR1cm4gIGZhbHNlO1xyXG59Il0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0Esa0NBQWtDQSxDQUFFQyxtQkFBbUIsRUFBRTtFQUNsRTtBQUFBOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQyxpQ0FBaUNBLENBQUVELG1CQUFtQixFQUFFO0VBRWhFLElBQ00sQ0FBQyxLQUFLRSxNQUFNLENBQUUsR0FBRyxHQUFHRixtQkFBbUIsQ0FBQ0csT0FBUSxDQUFDLENBQUNDLE1BQU0sQ0FBUztFQUFBLEdBQ2pFLElBQUksS0FBS0YsTUFBTSxDQUFFLEdBQUcsR0FBR0YsbUJBQW1CLENBQUNHLE9BQVEsQ0FBQyxDQUFDRSxRQUFRLENBQUUsYUFBYyxDQUFHLENBQUM7RUFBQSxFQUN0RjtJQUNFLE9BQU8sS0FBSztFQUNmOztFQUVBO0VBQ0E7RUFDQTtFQUNBTixrQ0FBa0MsQ0FBRUMsbUJBQW9CLENBQUM7O0VBR3pEO0VBQ0E7RUFDQTtFQUNBRSxNQUFNLENBQUUsR0FBRyxHQUFHRixtQkFBbUIsQ0FBQ0csT0FBUSxDQUFDLENBQUNHLElBQUksQ0FBRSxFQUFHLENBQUM7RUFDdERKLE1BQU0sQ0FBRSxHQUFHLEdBQUdGLG1CQUFtQixDQUFDRyxPQUFRLENBQUMsQ0FBQ0ksUUFBUSxDQUFDO0lBQ2pEQyxhQUFhLEVBQUcsU0FBQUEsY0FBV0MsSUFBSSxFQUFFO01BQzVCLE9BQU9DLGdE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 customize__ajax_request.php 0000666 00000113000 15167025561 0012220 0 ustar 00 <?php /** * @version 1.0 * @description Ajax and Requests Structure for WPBC_AJX__Customize_Plugin__Ajax_Request * @category Customize_Plugin Class * @author wpdevelop * * @web-site http://oplugins.com/ * @email info@oplugins.com * * @modified 2023-06-23 */ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly class WPBC_AJX__Customize_Plugin__Ajax_Request { // <editor-fold defaultstate="collapsed" desc=" /// R e q u e s t /// " > /** * Get params names for escaping and/or default value of such params * * @return array array ( 'resource_id' => array( 'validate' => 'digit_or_csd', 'default' => array( '1' ) ) * , ... ) */ static public function request_rules_structure(){ $default_resource_id = wpbc_get_default_resource(); $days_selection_arr = self::get_days_selection_parameters_arr(); $unavailable_weekdays_arr = self::get_calendar_unavailable_weekdays(); return array( 'do_action' => array( 'validate' => array( 'none', 'save_calendar_skin', 'save_calendar_dates_selection', 'save_calendar_weekdays_availability', 'save_calendar_additional', 'make_reset' ), 'default' => 'none' ) , 'customize_plugin__booking_skin' => array( 'validate' => 's', 'default' => '/css/skins/green-01.css' ) // get_bk_option( 'booking_skin' ) , 'current_step' => array( 'validate' => array( 'calendar_skin', 'calendar_size', 'calendar_dates_selection', 'calendar_weekdays_availability', 'calendar_additional' , 'form_structure', 'form_times', 'form_legend' , 'emails_active' , 'payments_active' , 'publish_resource' ) , 'default' => 'calendar_skin' ) , 'resource_id' => array( 'validate' => 'd', 'default' => $default_resource_id ) // 'digit_or_csd' can check about 'digit_or_csd' in arrays, as well // if ['0'] - All booking resources , 'dates_selection' => array( 'validate' => 's', 'default' => '' ) , 'dates_customize_plugin' => array( 'validate' => array( 'unavailable', 'available' ), 'default' => 'unavailable' ) , 'ui_clicked_element_id' => array( 'validate' => 's', 'default' => '' ) //, 'ui_usr__customize_plugin_selected_toolbar' => array( 'validate' => array( 'info', 'calendar_settings' ), 'default' => 'info' ) // Calendar settings , 'calendar__start_year' => array( 'validate' => 'd', 'default' => 0 ) , 'calendar__start_month' => array( 'validate' => 'd', 'default' => 0 ) , 'calendar__view__visible_months' => array( 'validate' => 'd', 'default' => 2 ) , 'calendar__view__months_in_row' => array( 'validate' => 'd', 'default' => '' ) , 'calendar__view__width' => array( 'validate' => 's', 'default' => '' ) , 'calendar__view__cell_height' => array( 'validate' => 's', 'default' => '' ) // '48px' || '' , 'calendar__timeslot_day_bg_as_available' => array( 'validate' => 's' , 'default' => ('On' === get_bk_option( 'booking_timeslot_day_bg_as_available' ) ) ? ' wpbc_timeslot_day_bg_as_available' : '' ) // Modes :: Selection of Days , 'calendar__days_selection_mode' => array( 'validate' => array( 'single', 'multiple', 'dynamic', 'fixed' ) , 'default' => $days_selection_arr['calendar__days_selection_mode'] ) , 'calendar__bk_1click_mode_days_num' => array( 'validate' => 'd', 'default' => $days_selection_arr['calendar__bk_1click_mode_days_num'] ) /* Number of days selection with 1 mouse click */ , 'calendar__bk_1click_mode_days_start' => array( 'validate' => 's', 'default' => $days_selection_arr['calendar__bk_1click_mode_days_start'] ) /* { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat } */ , 'calendar__bk_2clicks_mode_days_min' => array( 'validate' => 'd', 'default' => $days_selection_arr['calendar__bk_2clicks_mode_days_min'] ) /* Min. Number of days selection with 2 mouse clicks */ , 'calendar__bk_2clicks_mode_days_max' => array( 'validate' => 'd', 'default' => $days_selection_arr['calendar__bk_2clicks_mode_days_max'] ) /* Max. Number of days selection with 2 mouse clicks */ , 'calendar__bk_2clicks_mode_days_specific' => array( 'validate' => 's', 'default' => $days_selection_arr['calendar__bk_2clicks_mode_days_specific'] ) /* Example: '5,7' */ , 'calendar__bk_2clicks_mode_days_start' => array( 'validate' => 's', 'default' => $days_selection_arr['calendar__bk_2clicks_mode_days_start'] ) /* { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat } */ , 'calendar__booking_max_monthes_in_calendar' => array( 'validate' => 's', 'default' => get_bk_option( 'booking_max_monthes_in_calendar' ) ) , 'calendar__booking_start_day_weeek' => array( 'validate' => array( '0','1','2','3','4','5','6' ), 'default' => get_bk_option( 'booking_start_day_weeek' ) ) // Unavailable Weekdays & more... , 'availability__user_unavilable_days' => array( 'validate' => 's', 'default' => $unavailable_weekdays_arr['user_unavilable_days'] ) , 'availability__block_some_dates_from_today' => array( 'validate' => 'd', 'default' => $unavailable_weekdays_arr['block_some_dates_from_today'] ) , 'availability__wpbc_available_days_num_from_today' => array( 'validate' => 'd', 'default' => $unavailable_weekdays_arr['wpbc_available_days_num_from_today'] ) , 'availability__booking_unavailable_extra_in_out' => array( 'validate' => array( '', 'm', 'd' ), 'default' => $unavailable_weekdays_arr[ 'booking_unavailable_extra_in_out' ] ) , 'availability__booking_unavailable_extra_minutes_in' => array( 'validate' => 's', 'default' => $unavailable_weekdays_arr['booking_unavailable_extra_minutes_in'] ) , 'availability__booking_unavailable_extra_minutes_out' => array( 'validate' => 's', 'default' => $unavailable_weekdays_arr['booking_unavailable_extra_minutes_out'] ) , 'availability__booking_unavailable_extra_days_in' => array( 'validate' => 's', 'default' => $unavailable_weekdays_arr['booking_unavailable_extra_days_in'] ) , 'availability__booking_unavailable_extra_days_out' => array( 'validate' => 's', 'default' => $unavailable_weekdays_arr['booking_unavailable_extra_days_out'] ) ); } /** * Get default params * * @return array array ( 'ui_wh_modification_date_radio' => 0 * , ... ) */ static public function get__request_values__default() { $request_rules_structure = self::request_rules_structure(); $default_params_arr = array(); $structure_type = 'default'; foreach ( $request_rules_structure as $key => $value ) { $default_params_arr[ $key ] = $value[ $structure_type ]; } return $default_params_arr; } // </editor-fold> // <editor-fold defaultstate="collapsed" desc=" Support functions " > /** * Generate shortcode for booking form, from the parameters * * @param array $request_params array( 'resource_id' => 1 , 'calendar__view__visible_months' => $request_params['calendar__view__visible_months'] , 'calendar__view__months_in_row' => $request_params['calendar__view__months_in_row'] , 'calendar__view__width' => $request_params['calendar__view__width'] , 'calendar__view__cell_height' => $request_params['calendar__view__cell_height'] // '48px' || '' ) * * @return string */ public function get_shortcode__from_request__booking_form( $request_params = array() ){ $shortcode__booking_form_arr = array(); $shortcode__booking_form_arr[] = "[booking"; if ( ( ! empty( $request_params['resource_id'] ) ) && ( $request_params['resource_id'] > 1 ) ) { $shortcode__booking_form_arr[] = "type={$request_params['resource_id']}"; } if ( ( ! empty( $request_params['calendar__view__visible_months'] ) ) && ( $request_params['calendar__view__visible_months'] > 1 ) ) { $shortcode__booking_form_arr[] = "nummonths={$request_params['calendar__view__visible_months']}"; } if ( ( ! empty( $request_params['calendar__view__months_in_row'] ) ) || ( ! empty( $request_params['calendar__view__width'] ) ) || ( ! empty( $request_params['calendar__view__cell_height'] ) ) ) { $shortcode__booking_form_arr[] = "options='{calendar"; if ( ! empty( $request_params['calendar__view__months_in_row'] ) ) { $shortcode__booking_form_arr[] = "months_num_in_row={$request_params['calendar__view__months_in_row']}"; } if ( ! empty( $request_params['calendar__view__width'] ) ) { $shortcode__booking_form_arr[] = "width={$request_params['calendar__view__width']}"; } if ( ! empty( $request_params['calendar__view__cell_height'] ) ) { $shortcode__booking_form_arr[] = "cell_height={$request_params['calendar__view__cell_height']}"; } $shortcode__booking_form_arr[] = "}'"; } $shortcode__booking_form = implode( ' ', $shortcode__booking_form_arr ); $shortcode__booking_form .= ']'; return $shortcode__booking_form; } /** * Get days selection parameters, which saved in database * * @return array */ static public function get_days_selection_parameters_arr(){ $specific_days_selection = ( function_exists( 'wpbc_get_specific_range_dates__as_comma_list' ) ) ? wpbc_get_specific_range_dates__as_comma_list( get_bk_option( 'booking_range_selection_days_specific_num_dynamic' ) ) : ''; $data_arr = array(); // Modes :: Selection of Days $data_arr['calendar__days_selection_mode'] = ( 'range' === get_bk_option('booking_type_of_day_selections') ) ? get_bk_option('booking_range_selection_type') : get_bk_option( 'booking_type_of_day_selections'); $data_arr['calendar__bk_1click_mode_days_num'] = intval( get_bk_option( 'booking_range_selection_days_count' ) ); /* Number of days selection with 1 mouse click */ $data_arr['calendar__bk_1click_mode_days_start'] = get_bk_option( 'booking_range_start_day' ); /* { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat } */ $data_arr['calendar__bk_2clicks_mode_days_min'] = intval( get_bk_option( 'booking_range_selection_days_count_dynamic' ) ); /* Min. Number of days selection with 2 mouse clicks */ $data_arr['calendar__bk_2clicks_mode_days_max'] = intval( get_bk_option( 'booking_range_selection_days_max_count_dynamic' ) ); /* Max. Number of days selection with 2 mouse clicks */ $data_arr['calendar__bk_2clicks_mode_days_specific'] = $specific_days_selection; /* Example: '5,7' */ $data_arr['calendar__bk_2clicks_mode_days_start'] = get_bk_option( 'booking_range_start_day_dynamic' ); /* { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat } */ return $data_arr; } /** * Get unavailable weekdays, which saved in database * * @return array */ static public function get_calendar_unavailable_weekdays(){ $data_arr = array(); $data_arr['user_unavilable_days'] = array(); foreach ( range( 0, 6 ) as $val ) { if ( 'On' == get_bk_option( 'booking_unavailable_day' . $val ) ) { $data_arr['user_unavilable_days'][] = $val; } } $data_arr['user_unavilable_days'] = implode( ',', $data_arr['user_unavilable_days'] ); // Unavailable days from Today $data_arr['block_some_dates_from_today'] = get_bk_option( 'booking_unavailable_days_num_from_today' ); $data_arr['wpbc_available_days_num_from_today'] = intval( get_bk_option( 'booking_available_days_num_from_today' ) ); $data_arr['booking_unavailable_extra_in_out'] = get_bk_option( 'booking_unavailable_extra_in_out' ); $data_arr['booking_unavailable_extra_minutes_in'] = get_bk_option( 'booking_unavailable_extra_minutes_in' ); $data_arr['booking_unavailable_extra_minutes_out'] = get_bk_option( 'booking_unavailable_extra_minutes_out' ); $data_arr['booking_unavailable_extra_days_in'] = get_bk_option( 'booking_unavailable_extra_days_in' ); $data_arr['booking_unavailable_extra_days_out'] = get_bk_option( 'booking_unavailable_extra_days_out' ); return $data_arr; } // </editor-fold> // <editor-fold defaultstate="collapsed" desc=" /// A J A X /// " > // A J A X ===================================================================================================== /** * Define HOOKs for start loading Ajax */ public function define_ajax_hook(){ // Ajax Handlers. Note. "locale_for_ajax" rechecked in wpbc-ajax.php add_action( 'wp_ajax_' . 'WPBC_AJX_CUSTOMIZE_PLUGIN', array( $this, 'ajax_' . 'WPBC_AJX_CUSTOMIZE_PLUGIN' ) ); // Admin & Client (logged in usres) // Ajax Handlers for actions //add_action( 'wp_ajax_' . 'WPBC_AJX_BOOKING_ACTIONS', 'wpbc_ajax_' . 'WPBC_AJX_BOOKING_ACTIONS' ); // add_action( 'wp_ajax_nopriv_' . 'WPBC_AJX_BOOKING_LISTING', array( $this, 'ajax_' . 'WPBC_AJX_BOOKING_LISTING' ) ); // Client (not logged in) } /** * Ajax - Get Listing Data and Response to JS script */ public function ajax_WPBC_AJX_CUSTOMIZE_PLUGIN() { if ( ! isset( $_POST['search_params'] ) || empty( $_POST['search_params'] ) ) { exit; } // Security ----------------------------------------------------------------------------------------------- // in Ajax Post: 'nonce': wpbc_ajx_booking_listing.get_secure_param( 'nonce' ), $action_name = 'wpbc_ajx_customize_plugin_ajx' . '_wpbcnonce'; $nonce_post_key = 'nonce'; $result_check = check_ajax_referer( $action_name, $nonce_post_key ); $user_id = ( isset( $_REQUEST['wpbc_ajx_user_id'] ) ) ? intval( $_REQUEST['wpbc_ajx_user_id'] ) : wpbc_get_current_user_id(); /** * SQL --------------------------------------------------------------------------- * * in Ajax Post: 'search_params': wpbc_ajx_booking_listing.search_get_all_params() * * Use prefix "search_params", if Ajax sent - * $_REQUEST['search_params']['page_num'], $_REQUEST['search_params']['page_items_count'],.. */ $user_request = new WPBC_AJX__REQUEST( array( 'db_option_name' => 'booking_customize_plugin_request_params', 'user_id' => $user_id, 'request_rules_structure' => WPBC_AJX__Customize_Plugin__Ajax_Request::request_rules_structure() ) ); $request_prefix = 'search_params'; $request_params = $user_request->get_sanitized__in_request__value_or_default( $request_prefix ); // NOT Direct: $_REQUEST['search_params']['resource_id'] //---------------------------------------------------------------------------------------------------------- $data_arr = array(); $data_arr['ajx_after_action_message'] = ''; $data_arr['ajx_after_action_result'] = 1; $data_arr['calendar_settings'] = array( 'booking_change_over_days_triangles' => get_bk_option( 'booking_change_over_days_triangles' ) , 'booking_range_selection_time_is_active' => get_bk_option( 'booking_range_selection_time_is_active' ) , 'calendar__view__visible_months' => $request_params['calendar__view__visible_months'] , 'calendar__view__months_in_row' => $request_params['calendar__view__months_in_row'] , 'calendar__view__width' => $request_params['calendar__view__width'] , 'calendar__view__cell_height' => $request_params['calendar__view__cell_height'] // '48px' || '' , 'calendar__booking_max_monthes_in_calendar' => $request_params['calendar__booking_max_monthes_in_calendar'] , 'calendar__booking_start_day_weeek' => $request_params['calendar__booking_start_day_weeek'] , 'calendar_unavailable' => array() , 'calendar_dates_additional_info' => array() ); // Shortcode (for this configuration) $data_arr['calendar_settings']['shortcode__booking_form'] = $this->get_shortcode__from_request__booking_form( $request_params ); $data_arr['customize_steps'] = array(); $data_arr['customize_steps']['action'] = 'none'; $top_tab_slug = explode( '_', $request_params['current_step'] ); $top_tab_slug = ( ! empty( $top_tab_slug ) ) ? $top_tab_slug[0] : 'calendar'; // sub Tabs ----------------------------------------------------------------------------------------------- switch ( $top_tab_slug ) { case 'calendar': $data_arr['customize_steps']['steps_arr'] = array( 'calendar_skin' => array( 'class' => 'wpbc_option_step', 'html' => __( 'Calendar Skin', 'booking' ) ), 'calendar_size' => array( 'class' => 'wpbc_option_step', 'html' => __( 'Calendar size', 'booking' ) ), 'calendar_dates_selection' => array( 'class' => 'wpbc_option_step', 'html' => __( 'Dates selection', 'booking' ) ), 'calendar_weekdays_availability' => array( 'class' => 'wpbc_option_step', 'html' => __( 'Unavailable weekdays', 'booking' ) ), 'calendar_additional' => array( 'class' => 'wpbc_option_step', 'html' => __( 'Additional Settings', 'booking' ) ), ); break; case 'form': $data_arr['customize_steps']['steps_arr'] = array( 'form_structure' => array( 'class' => 'wpbc_option_step', 'html' => __( 'Form Structure', 'booking' ) ), 'form_times' => array( 'class' => 'wpbc_option_step', 'html' => __( 'Booked Times', 'booking' ) ), 'form_legend' => array( 'class' => 'wpbc_option_step', 'html' => __( 'Legend', 'booking' ) ) ); break; default: $data_arr['customize_steps']['steps_arr'] = array(); } // Steps: Current, Prior, Next & future action ---------------------------------------------------------- switch ( $request_params['current_step'] ) { case 'calendar_skin': $data_arr['customize_steps']['action'] = 'save_calendar_skin'; $data_arr['customize_steps']['current'] = $request_params['current_step']; $data_arr['customize_steps']['prior'] = ''; $data_arr['customize_steps']['next'] = 'calendar_size'; break; case 'calendar_size': $data_arr['customize_steps']['action'] = 'none'; $data_arr['customize_steps']['current'] = $request_params['current_step']; $data_arr['customize_steps']['prior'] = 'calendar_skin'; $data_arr['customize_steps']['next'] = 'calendar_dates_selection'; break; case 'calendar_dates_selection': $data_arr['customize_steps']['action'] = 'save_calendar_dates_selection'; $data_arr['customize_steps']['current'] = $request_params['current_step']; $data_arr['customize_steps']['prior'] = 'calendar_size'; $data_arr['customize_steps']['next'] = 'calendar_weekdays_availability'; break; case 'calendar_weekdays_availability': $data_arr['customize_steps']['action'] = 'save_calendar_weekdays_availability'; $data_arr['customize_steps']['current'] = $request_params['current_step']; $data_arr['customize_steps']['prior'] = 'calendar_dates_selection'; $data_arr['customize_steps']['next'] = 'calendar_additional'; break; case 'calendar_additional': $data_arr['customize_steps']['action'] = 'save_calendar_additional'; $data_arr['customize_steps']['current'] = $request_params['current_step']; $data_arr['customize_steps']['prior'] = 'calendar_weekdays_availability'; $data_arr['customize_steps']['next'] = 'form_structure'; break; case 2: break; default: // Default } // Actions ================================================================================================= if ( 'save_calendar_additional' == $request_params['do_action'] ) { $is_updated = update_bk_option( 'booking_max_monthes_in_calendar', $request_params['calendar__booking_max_monthes_in_calendar'] ); $is_updated = update_bk_option( 'booking_start_day_weeek', $request_params['calendar__booking_start_day_weeek'] ); } if ( 'save_calendar_weekdays_availability' == $request_params['do_action'] ) { // Update Weekdays Unavailability $request_el_arr = $request_params['availability__user_unavilable_days']; foreach ( range( 0, 6 ) as $val ) { if ( false !== strpos( $request_el_arr, $val ) ) { $is_updated = update_bk_option( 'booking_unavailable_day' . $val , 'On'); } else{ $is_updated = update_bk_option( 'booking_unavailable_day' . $val , 'Off'); } } $is_updated = update_bk_option( 'booking_unavailable_days_num_from_today', $request_params['availability__block_some_dates_from_today'] ); if ( class_exists( 'wpdev_bk_biz_m' ) ) { $is_updated = update_bk_option( 'booking_available_days_num_from_today', $request_params['availability__wpbc_available_days_num_from_today'] ); $is_updated = update_bk_option( 'booking_unavailable_extra_in_out', $request_params['availability__booking_unavailable_extra_in_out'] ); $is_updated = update_bk_option( 'booking_unavailable_extra_minutes_in', $request_params['availability__booking_unavailable_extra_minutes_in'] ); $is_updated = update_bk_option( 'booking_unavailable_extra_minutes_out', $request_params['availability__booking_unavailable_extra_minutes_out'] ); $is_updated = update_bk_option( 'booking_unavailable_extra_days_in', $request_params['availability__booking_unavailable_extra_days_in'] ); $is_updated = update_bk_option( 'booking_unavailable_extra_days_out', $request_params['availability__booking_unavailable_extra_days_out'] ); } } if ( 'save_calendar_dates_selection' == $request_params['do_action'] ) { if ( ( 'dynamic' == $request_params['calendar__days_selection_mode'] ) || ( 'fixed' == $request_params['calendar__days_selection_mode'] ) ) { $is_updated = update_bk_option( 'booking_type_of_day_selections', 'range' ); // 'single', 'multiple', 'range $is_updated = update_bk_option( 'booking_range_selection_type', $request_params['calendar__days_selection_mode'] ); // 'dynamic', 'fixed' } else { $is_updated = update_bk_option( 'booking_type_of_day_selections', $request_params['calendar__days_selection_mode'] ); } $is_updated = update_bk_option( 'booking_range_selection_days_count', max( intval( $request_params['calendar__bk_1click_mode_days_num'] ), 1 ) ); //max() :: If user set 0, then get minimum 1 value $is_updated = update_bk_option( 'booking_range_start_day', $request_params['calendar__bk_1click_mode_days_start'] ); $is_updated = update_bk_option( 'booking_range_selection_days_count_dynamic', max( intval( $request_params['calendar__bk_2clicks_mode_days_min'] ), 1 ) ); //max() :: If user set 0, then get minimum 1 value $is_updated = update_bk_option( 'booking_range_selection_days_max_count_dynamic', max( intval( $request_params['calendar__bk_2clicks_mode_days_max'] ), 1 ) ); if ( false !== strpos( $request_params['calendar__bk_2clicks_mode_days_specific'], '-' ) ) { // Replace 5,7-10,23 to 5,7,8,9,10,23 $request_params['calendar__bk_2clicks_mode_days_specific'] = ( function_exists( 'wpbc_get_specific_range_dates__as_comma_list' ) ) ? wpbc_get_specific_range_dates__as_comma_list( $request_params['calendar__bk_2clicks_mode_days_specific'] ) : ''; } // Check to have only digits and comma $request_params['calendar__bk_2clicks_mode_days_specific'] = wpbc_sanitize_digit_or_csd( $request_params['calendar__bk_2clicks_mode_days_specific'] ); $is_updated = update_bk_option( 'booking_range_selection_days_specific_num_dynamic', $request_params['calendar__bk_2clicks_mode_days_specific'] ); $calendar__bk_2clicks_mode_days_start = $request_params['calendar__bk_2clicks_mode_days_start']; if ( ( false !== strpos( $calendar__bk_2clicks_mode_days_start, '-1' ) ) || ( false !== strpos( $calendar__bk_2clicks_mode_days_start, '0,1,2,3,4,5,6' ) ) ){ $calendar__bk_2clicks_mode_days_start = '-1'; } $is_updated = update_bk_option( 'booking_range_start_day_dynamic', $calendar__bk_2clicks_mode_days_start ); $data_arr['ajx_after_action_message'] = __('Dates selection','booking') . ' - ' . __('Saved', 'booking') ; $data_arr['ajx_after_action_result'] = 1; } if ( 'save_calendar_skin' == $request_params['do_action'] ) { $is_updated = update_bk_option( 'booking_skin', $request_params['customize_plugin__booking_skin'] ); $data_arr['ajx_after_action_message'] = __('Calendar Skin','booking') . ' - ' . __('Saved', 'booking') ; $data_arr['ajx_after_action_result'] = 1; } // Get actual data for templates ========================================================================== // Modes :: Selection of Days $days_selection_arr = self::get_days_selection_parameters_arr(); $data_arr['calendar_settings']['calendar__days_selection_mode'] = $days_selection_arr['calendar__days_selection_mode']; /* 'single', 'multiple', 'dynamic', 'fixed' */ $data_arr['calendar_settings']['calendar__bk_1click_mode_days_num'] = $days_selection_arr['calendar__bk_1click_mode_days_num']; /* Number of days selection with 1 mouse click */ $data_arr['calendar_settings']['calendar__bk_1click_mode_days_start'] = $days_selection_arr['calendar__bk_1click_mode_days_start']; /* { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat } */ $data_arr['calendar_settings']['calendar__bk_2clicks_mode_days_min'] = $days_selection_arr['calendar__bk_2clicks_mode_days_min']; /* Min. Number of days selection with 2 mouse clicks */ $data_arr['calendar_settings']['calendar__bk_2clicks_mode_days_max'] = $days_selection_arr['calendar__bk_2clicks_mode_days_max']; /* Max. Number of days selection with 2 mouse clicks */ $data_arr['calendar_settings']['calendar__bk_2clicks_mode_days_specific'] = $days_selection_arr['calendar__bk_2clicks_mode_days_specific']; /* Example: '5,7' */ $data_arr['calendar_settings']['calendar__bk_2clicks_mode_days_start'] = $days_selection_arr['calendar__bk_2clicks_mode_days_start']; /* { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat } */ // Weekdays $unavailable_weekdays_arr = self::get_calendar_unavailable_weekdays(); $data_arr['calendar_settings']['calendar_unavailable']['user_unavilable_days'] = $unavailable_weekdays_arr['user_unavilable_days']; // UNAVAILABLE Today days $data_arr['calendar_settings']['calendar_unavailable']['block_some_dates_from_today'] = $unavailable_weekdays_arr['block_some_dates_from_today']; // Hints $last_unavailable_date = ''; $data_arr['calendar_settings']['calendar_unavailable']['block_some_dates_from_today__hint'] = ': <span style="text-transform: lowercase;font-size:0.9em;">' . __( 'None', 'booking' ) . '</span>'; if ( 1 == $unavailable_weekdays_arr['block_some_dates_from_today'] ){ $last_unavailable_date = wp_date( 'Y-m-d 00:00:00' ); $data_arr['calendar_settings']['calendar_unavailable']['block_some_dates_from_today__hint'] = ': ' . wp_date( 'd M', strtotime( $last_unavailable_date ) ); } if ( $unavailable_weekdays_arr['block_some_dates_from_today'] > 1 ){ $last_unavailable_date = wp_date( 'Y-m-d 00:00:00', strtotime( '+' . ( $unavailable_weekdays_arr['block_some_dates_from_today'] - 1 ) . ' days' ) ); $data_arr['calendar_settings']['calendar_unavailable']['block_some_dates_from_today__hint'] = ': ' . wp_date( 'd M' ) . ' - ' . wp_date( 'd M', strtotime( $last_unavailable_date ) ); } // AVAILABLE Today days $data_arr['calendar_settings']['calendar_unavailable']['wpbc_available_days_num_from_today'] = $unavailable_weekdays_arr['wpbc_available_days_num_from_today']; // Hints $start_available_date = ( '' == $last_unavailable_date ) ? wp_date( 'Y-m-d 00:00:00' ) : wp_date( 'Y-m-d 00:00:00', strtotime( '+1 day', strtotime( $last_unavailable_date ) ) ); if ( empty( $unavailable_weekdays_arr['wpbc_available_days_num_from_today'] ) ) { $last_available_date = ''; } else { $last_available_date = wp_date( 'Y-m-d 00:00:00', strtotime( '+' . ( $unavailable_weekdays_arr['wpbc_available_days_num_from_today'] ) . ' days' ) ); } if ( ! empty( $unavailable_weekdays_arr['wpbc_available_days_num_from_today'] ) ) { if ( strtotime($start_available_date) < strtotime($last_available_date) ) { $data_arr['calendar_settings']['calendar_unavailable']['wpbc_available_days_num_from_today__hint'] = ': ' . wp_date( 'd M, Y', strtotime( $start_available_date ) ) . ' - ' . wp_date( 'd M, Y', strtotime( $last_available_date ) ); } else if ( strtotime($start_available_date) == strtotime($last_available_date) ) { $data_arr['calendar_settings']['calendar_unavailable']['wpbc_available_days_num_from_today__hint'] = ': ' . wp_date( 'd M, Y', strtotime( $start_available_date ) ) ; }else{ $data_arr['calendar_settings']['calendar_unavailable']['wpbc_available_days_num_from_today__hint'] = ': <span style="text-transform: uppercase;font-size:1.1em;">' . __( 'None', 'booking' ) . '</span>' . ' - <span style="text-transform: lowercase;font-size:0.9em;">'. wp_date( 'd M, Y', strtotime( $start_available_date ) ) . ' > ' . wp_date( 'd M, Y', strtotime( $last_available_date ) ) .'</span>'; } } else { $data_arr['calendar_settings']['calendar_unavailable']['wpbc_available_days_num_from_today__hint'] = ': ' . wp_date( 'd M, Y', strtotime( $start_available_date ) ) . ' - ...'; } $data_arr['calendar_settings']['calendar_unavailable']['booking_unavailable_extra_in_out'] = $unavailable_weekdays_arr['booking_unavailable_extra_in_out']; $data_arr['calendar_settings']['calendar_unavailable']['booking_unavailable_extra_minutes_in'] = $unavailable_weekdays_arr['booking_unavailable_extra_minutes_in']; $data_arr['calendar_settings']['calendar_unavailable']['booking_unavailable_extra_minutes_out'] = $unavailable_weekdays_arr['booking_unavailable_extra_minutes_out']; $data_arr['calendar_settings']['calendar_unavailable']['booking_unavailable_extra_days_in'] = $unavailable_weekdays_arr['booking_unavailable_extra_days_in']; $data_arr['calendar_settings']['calendar_unavailable']['booking_unavailable_extra_days_out'] = $unavailable_weekdays_arr['booking_unavailable_extra_days_out']; // <editor-fold defaultstate="collapsed" desc=" Dates | Resources for calendar " > $data_arr['calendar_settings']['calendar_dates_rates'] = apply_filters( 'wpbc_get_calendar_dates_rates_arr', array(), $request_params['resource_id'] ); if ( ( 'On' == get_bk_option( 'booking_is_show_booked_data_in_tooltips' ) ) && ( function_exists( 'wpbc_get_additional_booking_info_to_dates_arr' ) ) ) { $data_arr['calendar_settings']['calendar_dates_additional_info'] = wpbc_get_additional_booking_info_to_dates_arr( $request_params['resource_id'] ); } $data_arr['calendar_settings']['booked_dates'] = wpbc__sql__get_booked_dates( array( 'resource_id' => $request_params['resource_id'] ) ); $data_arr['season_customize_plugin'] = wpbc__sql__get_season_availability( array( 'resource_id' => $request_params['resource_id'] ) ); $data_arr['resource_unavailable_dates'] = wpbc_resource__get_unavailable_dates($request_params['resource_id']); //---------------------------------------------------------------------------------------------------------- // Get booking resources (sql) $resources_arr = wpbc_ajx_get_all_booking_resources_arr(); /** * Array ( [0] => Array ( [booking_type_id] => 1 [title] => Standard [users] => 1 [import] => [export] => [cost] => 25 [default_form] => standard [prioritet] => 0 [parent] => 0 [visitors] => 2 ), ... */ $resources_arr_sorted = wpbc_ajx_get_sorted_booking_resources_arr( $resources_arr ); $data_arr['ajx_booking_resources'] = $resources_arr_sorted; //---------------------------------------------------------------------------------------------------------- $data_arr['ajx_nonce_calendar'] = wp_nonce_field( 'CALCULATE_THE_COST', 'wpbc_nonce' . 'CALCULATE_THE_COST' . $request_params['resource_id'], true, false ); $data_arr['popover_hints'] = array(); $data_arr['popover_hints']['season_unavailable'] = '<strong>' . __( 'Season unavailable day', 'booking' ) . '</strong><hr>' . sprintf( __( 'Change this date status at %sBooking %s Availability %s Season Availability page.', 'booking' ), '<br>', '>', '>' ); $data_arr['popover_hints']['weekdays_unavailable'] = '<strong>' . __( 'Unavailable week day', 'booking' ) . '</strong><hr>' . sprintf( __( 'Change this date status at %sBooking %s Settings General page %s in "Availability" section.', 'booking' ), '<br>', '>', '<br>' ); $data_arr['popover_hints']['before_after_unavailable'] = '<strong>' . __( 'Unavailable day, depends on today day', 'booking' ) . '</strong><hr>' . sprintf( __( 'Change this date status at %sBooking %s Settings General page %s in "Availability" section.', 'booking' ), '<br>', '>', '<br>' ); $data_arr['popover_hints']['toolbar_text'] = '<span style="font-size: 1.05em;line-height: 1.8em;">'. sprintf( __('%sSelect days%s in calendar then select %sAvailable%s / %sUnavailable%s status and click %sApply%s customize_plugin button.' ,'booking') , '<strong>', ' </strong>' , '<strong> ', ' </strong>' , '<strong> ', ' </strong>' , '<strong> ', ' </strong>' ) .'</span>'; $data_arr['popover_hints']['toolbar_text_available'] = sprintf( __( 'Set dates %s as %s available.', 'booking' ) , '_DATES_' , '_HTML_' ); $data_arr['popover_hints']['toolbar_text_unavailable'] = sprintf( __( 'Set dates %s as %s unavailable.', 'booking' ) , '_DATES_' , '_HTML_' ); // </editor-fold> // Clear here DATES selection in $request_params['dates_selection'] to not save such selection if ( 'make_reset' === $request_params['do_action'] ) { $is_reseted = $user_request->user_request_params__db_delete(); // Delete from DB $request_params['do_action'] = $is_reseted ? 'reset_done' : 'reset_error'; } else { $request_params_to_save = $request_params; // Do not safe such elements unset( $request_params_to_save['ui_clicked_element_id'] ); unset( $request_params_to_save['do_action'] ); unset( $request_params_to_save['dates_selection'] ); // Do not save "Do not change background color for partially booked days" option ! it must reflect from Booking > Settings General page and not from User options unset( $request_params_to_save['calendar__timeslot_day_bg_as_available'] ); //FixIn: 9.5.5.4 $is_success_update = $user_request->user_request_params__db_save( $request_params_to_save ); // Save to DB // - $request_params - serialized here automatically } //---------------------------------------------------------------------------------------------------------- // Send JSON. Its will make "wp_json_encode" - so pass only array, and This function call wp_die( '', '', array( 'response' => null, ) ) Pass JS OBJ: response_data in "jQuery.post( " function on success. wp_send_json( array( 'ajx_data' => $data_arr, 'ajx_search_params' => $_REQUEST[ $request_prefix ], // $_REQUEST[ 'search_params' ] 'ajx_cleaned_params' => $request_params ) ); } // </editor-fold> } /** * Just for loading CSS and JavaScript files */ if ( true ) { $ajx_customize_plugin_loading = new WPBC_AJX__Customize_Plugin__Ajax_Request; $ajx_customize_plugin_loading->define_ajax_hook(); }customize__templates.php 0000666 00000361566 15167025561 0011551 0 ustar 00 <?php /** * @version 1.0 * @description Templates for customize plugin pages * @category Customize_Plugin * @author wpdevelop * * @web-site http://oplugins.com/ * @email info@oplugins.com * * @modified 2023-06-23 */ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly class WPBC_AJX__Customize_Plugin__Templates { // <editor-fold defaultstate="collapsed" desc=" /// JS | CSS files | Tpl loading /// " > /** * Define HOOKs for loading CSS and JavaScript files */ public function init_load_css_js_tpl() { // Load only at specific Page if ( strpos( $_SERVER['REQUEST_URI'], 'page=wpbc-customize_plugin' ) !== false ) { add_action( 'wpbc_enqueue_js_files', array( $this, 'js_load_files' ), 50 ); add_action( 'wpbc_enqueue_css_files', array( $this, 'enqueue_css_files' ), 50 ); add_action( 'wpbc_hook_settings_page_footer', array( $this, 'hook__load_templates_at_footer' ) ); } } /** JS */ public function js_load_files( $where_to_load ) { $in_footer = true; if ( wpbc_is_customize_plugin_page() ) if ( ( is_admin() ) && ( in_array( $where_to_load, array( 'admin', 'both' ) ) ) ) { wp_enqueue_script( 'wpbc-ajx_inline_calendar' , trailingslashit( plugins_url( '', __FILE__ ) ) . '_out/customize__inline_calendar.js' , array( 'wpbc_all' ), WP_BK_VERSION_NUM, $in_footer ); wp_enqueue_script( 'wpbc-ajx_customize_plugin_page' , trailingslashit( plugins_url( '', __FILE__ ) ) . '_out/customize_plugin_page.js' /* wpbc_plugin_url( '/_out/js/codemirror.js' ) */ , array( 'wpbc_all' ), WP_BK_VERSION_NUM, $in_footer ); wp_enqueue_script( 'wpbc-general_ui_js_css' , wpbc_plugin_url( '/includes/_general_ui_js_css/_out/wpbc_main_ui_funcs.js' ) , array( 'wpbc_all' ), WP_BK_VERSION_NUM, $in_footer ); wp_enqueue_script( 'wpbc_all', wpbc_plugin_url( '/_dist/all/_out/wpbc_all.js' ), array( 'jquery' ), WP_BK_VERSION_NUM ); //FixIn: 9.8.6.1 wp_enqueue_script( 'wpbc-main-client', wpbc_plugin_url( '/js/client.js' ), array( 'wpbc-datepick' ), WP_BK_VERSION_NUM ); wp_enqueue_script( 'wpbc-times', wpbc_plugin_url( '/js/wpbc_times.js' ), array( 'wpbc-main-client' ), WP_BK_VERSION_NUM ); /** * * wp_localize_script( 'wpbc_all', 'wpbc_live_request_obj' * , array( * 'ajx_booking' => '', * 'reminders' => '' * ) * ); */ } } /** CSS */ public function enqueue_css_files( $where_to_load ) { if ( ( is_admin() ) && ( in_array( $where_to_load, array( 'admin', 'both' ) ) ) ) { wp_enqueue_style( 'wpbc-ajx_customize_plugin_page' , trailingslashit( plugins_url( '', __FILE__ ) ) . '_out/customize_plugin_page.css' //, wpbc_plugin_url( '/includes/listing_ajx_booking/o-ajx_booking-listing.css' ) , array(), WP_BK_VERSION_NUM ); } } // </editor-fold> // <editor-fold defaultstate="collapsed" desc=" /// Templates /// " > /** * Load Templates at footer of page * * @param $page string */ public function hook__load_templates_at_footer( $page ){ // page=wpbc&view_mode=vm_booking_listing if ( 'wpbc-ajx_booking_customize_plugin' === $page ) { // from >> do_action( 'wpbc_hook_settings_page_footer', 'wpbc-ajx_booking_customize_plugin' ); as customize_page.php in bottom of content method $this->template__main_page_content(); $this->template__inline_calendar(); $this->template__toolbar(); $this->template__toolbar__select_booking_resource(); $this->template__toolbar__horizontal_text_bar(); $this->template__toolbar__buttons_prior_next(); $this->template__status_bar__footer(); $this->template__widget__change_calendar_skin(); $this->template__widget__calendar_size(); $this->template__widget__plugin_shortcode(); $this->template__widget__calendar_dates_selection(); $this->template__widget__calendar_weekdays_availability(); $this->template__widget__calendar_additional(); } } // Templates =================================================================================================== /** * Template - Main * * Help Tips: * * <script type="text/html" id="tmpl-template_name_a"> * Escaped: {{data.test_key}} * HTML: {{{data.test_key}}} * JS: <# if (true) { alert( 1 ); } #> * </script> * * var template__var = wp.template( 'template_name_a' ); * * jQuery( '.content' ).html( template__var( { 'test_key' => '<strong>Data</strong>' } ) ); * * @return void */ private function template__main_page_content() { ?><script type="text/html" id="tmpl-wpbc_ajx_customize_plugin_main_page_content"> <div class="wpbc_ajx_cstm__container"> <div class="wpbc_ajx_cstm__section_left"> </div> <div class="wpbc_ajx_cstm__section_right"> <div class="wpbc_widgets"></div> </div> </div><# var template__customize_plugin__status_bar__footer = wp.template( 'wpbc_ajx_customize_plugin__status_bar__footer' ); #>{{{ template__customize_plugin__status_bar__footer( { 'ajx_data' : data.ajx_data, 'ajx_search_params' : data.ajx_search_params, 'ajx_cleaned_params' : data.ajx_cleaned_params } ) }}} </script><?php } /** * Template - Inline Calendar * * Help Tips: * * <script type="text/html" id="tmpl-template_name_a"> * Escaped: {{data.test_key}} * HTML: {{{data.test_key}}} * JS: <# if (true) { alert( 1 ); } #> * </script> * * var template__var = wp.template( 'template_name_a' ); * * jQuery( '.content' ).html( template__var( { 'test_key' => '<strong>Data</strong>' } ) ); * * @return void */ private function template__inline_calendar(){ ?><script type="text/html" id="tmpl-wpbc_ajx_customize_plugin__inline_calendar"> <div class="wpbc_ajx_cstm__calendar <# if ('On' == data.ajx_data.calendar_settings.booking_change_over_days_triangles ){ #>wpbc_change_over_triangle<# } #>"><?php _e( 'Calendar is loading...', 'booking' ); ?></div><?php echo '<div style="margin-top:15px;">' . wpbc_replace_shortcodes_in_booking_form__legend_items( '[legend_items ' . ' items="unavailable,available,pending,approved,partially"' . ' titles="' //.' unavailable={' . htmlspecialchars( __( "Unavailable", 'booking' ), ENT_QUOTES ) . '}' //.' pending={' . htmlspecialchars( __( "Pending", 'booking' ), ENT_QUOTES ) . '}' .'"' . ' text_for_day_cell="' . date( 'd' ) . '"' . ' unavailable_day_cell_tag="span"' .']' ) . '</div>'; ?></script><?php } // Top ======================================================================================================== /** * Tpl - top Toolbar * * Help Tips: * * <script type="text/html" id="tmpl-template_name_a"> * Escaped: {{data.test_key}} * HTML: {{{data.test_key}}} * JS: <# if (true) { alert( 1 ); } #> * </script> * * var template__var = wp.template( 'template_name_a' ); * * jQuery( '.content' ).html( template__var( { 'test_key' => '<strong>Data</strong>' } ) ); * * @return void */ private function template__toolbar() { ?><script type="text/html" id="tmpl-wpbc_ajx_customize_plugin_toolbar_page_content"><?php ?><div class="ui_container ui_container_toolbar ui_container_mini ui_container_calendar_skin ui_container_filter_row_1" ><?php // Here will be composed template with real HTML ?><div class="ui_group" id="wpbc_hidden_template__select_booking_resource" ><?php // array( 'class' => 'group_nowrap' ) // Elements at Several or One Line // Resource select-box here. Defined as template at: private function template_toolbar_select_booking_resource(){ ?></div><?php ?><# var toolbar__horizontal_text_bar = wp.template( 'wpbc_ajx_customize_plugin__toolbar__horizontal_text_bar' ); #><?php ?><div class="ui_group" id="wpbc_toolbar_dates_hint"><div class="ui_element">{{{toolbar__horizontal_text_bar( data.ajx_data )}}}</div></div><?php // array( 'class' => 'group_nowrap' ) // Elements at Several or One Line ?><div class="ui_group"><?php ?><# var toolbar__buttons_prior_next = wp.template( 'wpbc_ajx_customize_plugin__toolbar__buttons_prior_next' ); #>{{{toolbar__buttons_prior_next( data.ajx_data )}}}<?php /* ?> ?><div class="ui_element"><?php wpbc_ajx_cstm__ui__button_step_prior( array( 'do_action' => 'save_calendar_skin', 'current_step' => 'calendar_skin', 'ui_clicked_element_id' => 'btn_' . 'calendar_skin' ) ); ?></div><?php ?><div class="ui_element"><?php wpbc_ajx_cstm__ui__button_step_next( array( 'do_action' => 'save_calendar_skin', 'current_step' => 'form_structure', 'ui_clicked_element_id' => 'btn_' . 'form_structure' ) ); ?></div><?php <?php */ ?></div><?php ?></div><?php ?></script><?php } /** * Tpl - sub Steps Bar * @return void */ private function template__toolbar__horizontal_text_bar(){ ?><script type="text/html" id="tmpl-wpbc_ajx_customize_plugin__toolbar__horizontal_text_bar"><?php //wpbc_ui_control wpbc_ui_addon wpbc_text_bar // wpbc_option_step wpbc_passed_step ?><# var item_num = 0; var total_num = _.size( data['customize_steps']['steps_arr'] ); var is_passed_step = 'wpbc_passed_step'; _.each( data['customize_steps']['steps_arr'], function ( p_val_arr, p_key_id, p_data ) { if ( p_key_id == data['customize_steps']['current'] ) { is_passed_step = ''; } item_num++; #><span class="wpbc_ui_control wpbc_ui_addon wpbc_text_bar"> <span class="{{p_val_arr.class}} {{is_passed_step}} <# if ( p_key_id == data['customize_steps']['current'] ){ #>wpbc_selected_step<# } #>"> <# if ( ( false ) || ( '' !== is_passed_step ) ) { <?php /* if first "false" then show links only for PASSED sub tabs. */ ?> #> <a href="javascript:void(0)" onclick="javascript:wpbc_ajx_customize_plugin__send_request_with_params( { 'current_step': '{{p_key_id}}' });" > {{item_num}}. {{{p_val_arr.html}}} </a> <# } else { #> {{item_num}}. {{{p_val_arr.html}}} <# } #> </span></span><# if ( item_num < total_num ) { #><span class="wpbc_ui_control wpbc_ui_addon wpbc_text_bar"> <span class="wpbc_option_separator {{is_passed_step}} "> > </span> </span><# } }); #><?php ?></script><?php } /** * Tpl - "Previous" | "Next" buttons in sub Steps Bar * @return void */ private function template__toolbar__buttons_prior_next(){ ?><script type="text/html" id="tmpl-wpbc_ajx_customize_plugin__toolbar__buttons_prior_next"><?php //wpbc_ui_control wpbc_ui_addon wpbc_text_bar // wpbc_option_step wpbc_passed_step ?> <# if ( '' != data.customize_steps.prior ) { #> <div class="ui_element"> <a id="btn__toolbar__buttons_prior" class="wpbc_ui_control wpbc_ui_button wpbc_ui_button tooltip_top " style="" href="javascript:void(0)" onclick="javascript:wpbc_ajx_customize_plugin__send_request_with_params( { 'do_action': 'none', 'current_step': '{{data.customize_steps.prior}}', 'ui_clicked_element_id': 'btn__toolbar__buttons_prior' } ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' ); " title="Go to previous step"> <i class="menu_icon icon-1x wpbc_icn_arrow_back_ios"></i> <span><?php _e('Back','booking') ?> </span> </a> </div> <# } #> <# if ( '' != data.customize_steps.next ) { #> <div class="ui_element"> <a id="btn__toolbar__buttons_next" class="wpbc_ui_control wpbc_ui_button wpbc_ui_button wpbc_ui_button_primary tooltip_top " style="" href="javascript:void(0)" onclick="javascript:wpbc_ajx_customize_plugin__send_request_with_params( { 'do_action': '{{data.customize_steps.action}}', 'current_step': '{{data.customize_steps.next}}', 'ui_clicked_element_id': 'btn__toolbar__buttons_next' } ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' ); " title="Go to next step"> <span><?php _e('Save and continue','booking') ?> </span> <i class="menu_icon icon-1x wpbc_icn_arrow_forward_ios"></i> </a> </div> <# } #> <?php ?></script><?php } // Support ===================================================================================================== /** * Tpl - Shortcode widget * * @return void */ private function template__widget__plugin_shortcode(){ ?><script type="text/html" id="tmpl-wpbc_ajx_widget_plugin_shortcode"> <div class="wpbc_widget wpbc_widget_plugin_shortcode"> <div class="wpbc_widget_header"> <span class="wpbc_widget_header_text"><?php _e('Shortcodes', 'booking'); ?></span> <a href="/" class="wpbc_widget_header_settings_link"><i class="menu_icon icon-1x wpbc_icn_settings"></i></a> </div> <div class="wpbc_widget_content wpbc_ajx_toolbar" style="margin:0 0 20px;"> <div class="ui_container" > <div class="ui_group ui_group__change_plugin_shortcode"><?php // Calendar Visible Months wpbc_ajx_cstm__ui__template__shortcode_booking_form(); ?> </div> </div> </div> </div> </script><?php } /** * Tpl - "Booking Resources" selectbox * * Help Tips: * * <script type="text/html" id="tmpl-template_name_a"> * Escaped: {{data.test_key}} * HTML: {{{data.test_key}}} * JS: <# if (true) { alert( 1 ); } #> * </script> * * var template__var = wp.template( 'template_name_a' ); * * jQuery( '.content' ).html( template__var( { 'test_key' => '<strong>Data</strong>' } ) ); * * @return void */ private function template__toolbar__select_booking_resource(){ // Template ?><script type="text/html" id="tmpl-wpbc_ajx_select_booking_resource"><?php if ( ! class_exists('wpdev_bk_personal') ) { echo '</script>'; return false; } /* ?><# console.log( ' == TEMPLATE PARAMS "wpbc_ajx_change_booking_resource" == ', data ); #><?php */ $booking_action = 'select_booking_resource'; $el_id = 'ui_btn_' . $booking_action; if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { echo '</script>'; return false; } ?><div class="ui_element"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __( 'Booking resource', 'booking' ) . ':</span>' ) ); ?><select class="wpbc_ui_control wpbc_ui_select change_booking_resource_selectbox" id="<?php echo $el_id; ?>" name="<?php echo $el_id; ?>" <?php /* ?>onfocus="javascript:console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );"<?php /**/ ?> onchange="javascript:wpbc_admin_show_message_processing( '' );wpbc_ajx_customize_plugin__send_request_with_params( { 'resource_id': jQuery( this ).val() , 'dates_customize_plugin': jQuery( '.wpbc_radio__set_days_customize_plugin:checked' ).val() , 'dates_selection': '' , 'do_action': 'change_booking_resource' } );" ><# _.each( data.ajx_data.ajx_booking_resources, function ( p_resource, p_resource_id, p_data ){ #><option value="{{p_resource.booking_type_id}}" <# if ( data.ajx_cleaned_params.resource_id == p_resource.booking_type_id ) { #> selected="SELECTED" <# } #> style="<# if( undefined != p_resource.parent ) { if( '0' == p_resource.parent ) { #>font-weight:600;<# } else { #>font-size:0.95em;padding-left:20px;<# } } #>" ><# if( undefined != p_resource.parent ) { if( '0' != p_resource.parent ) { #> <# } } #>{{p_resource.title}}</option><# }); #> </select><?php ?></div> <div class="ui_element"><?php ?><div class="wpbc_ui_separtor" style="margin-left: 8px;"></div><?php ?></div><?php ?></script><?php } /** * Tpl - Footer - Skip | Reset buttons * * Help Tips: * * <script type="text/html" id="tmpl-template_name_a"> * Escaped: {{data.test_key}} * HTML: {{{data.test_key}}} * JS: <# if (true) { alert( 1 ); } #> * </script> * * var template__var = wp.template( 'template_name_a' ); * * jQuery( '.content' ).html( template__var( { 'test_key' => '<strong>Data</strong>' } ) ); * * @return void */ private function template__status_bar__footer() { ?><script type="text/html" id="tmpl-wpbc_ajx_customize_plugin__status_bar__footer"><?php ?><div class="wpbc_ajx_cstm__status_bar__footer wpbc_ajx_toolbar" style="margin: 10px 0 0;border-top: 1px solid #ccc;"><?php ?><div class="ui_container ui_container_toolbar ui_container_mini ui_container_calendar_skin ui_container_filter_row_1" style="border: none;background: transparent;" ><?php ?><div class="ui_group" style="flex:1 1 auto;"><?php ?><div class="ui_element"><?php wpbc_ajx_cstm__ui__reset_to_default__btn(); // Reset Button ?></div><?php ?><div class="ui_element"><?php wpbc_ajx_cstm__ui__skip_wizard__btn(); // Skip Wizard button ?></div><?php ?></div><?php /** * We do not need the sub tabs here ?><# var toolbar__horizontal_text_bar = wp.template( 'wpbc_ajx_customize_plugin__toolbar__horizontal_text_bar' ); #><?php ?><div class="ui_group" id="wpbc_toolbar_dates_hint"><div class="ui_element">{{{toolbar__horizontal_text_bar( data.ajx_data )}}}</div></div><?php // array( 'class' => 'group_nowrap' ) // Elements at Several or One Line */ ?><div class="ui_group"><?php ?><# var toolbar__buttons_prior_next = wp.template( 'wpbc_ajx_customize_plugin__toolbar__buttons_prior_next' ); #>{{{toolbar__buttons_prior_next( data.ajx_data )}}}<?php ?></div><?php ?></div><?php // ui_container ?></div><?php // wpbc_ajx_toolbar ?></script><?php } // Widgets ===================================================================================================== /** * Tpl - Calendar - Skin * * Help Tips: * * <script type="text/html" id="tmpl-template_name_a"> * Escaped: {{data.test_key}} * HTML: {{{data.test_key}}} * JS: <# if (true) { alert( 1 ); } #> * </script> * * var template__var = wp.template( 'template_name_a' ); * * jQuery( '.content' ).html( template__var( { 'test_key' => '<strong>Data</strong>' } ) ); * * @return void */ private function template__widget__change_calendar_skin(){ ?><script type="text/html" id="tmpl-wpbc_ajx_widget_change_calendar_skin"> <div class="wpbc_widget wpbc_widget_change_calendar_skin"> <div class="wpbc_widget_header"> <span class="wpbc_widget_header_text"><?php _e('Calendar Skin', 'booking'); ?></span> <a href="/" class="wpbc_widget_header_settings_link"><i class="menu_icon icon-1x wpbc_icn_settings"></i></a> </div> <div class="wpbc_widget_content wpbc_ajx_toolbar" style="margin:0 0 20px;"> <div class="ui_container" > <div class="ui_group ui_group__change_calendar_skin"><?php // Calendar skin ?><div class="ui_element ui_nowrap0"><?php $booking_action = 'set_calendar_skin'; $el_id = 'ui_btn_cstm__' . $booking_action ; wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __( 'Select the skin of the booking calendar', 'booking' ) . ':</span>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php wpbc_ajx_cstm__ui__calendar_skin_dropdown(); $is_apply_rotating_icon = false; wpbc_ajx_cstm__ui__selectbox_prior_btn( $el_id, $is_apply_rotating_icon ); wpbc_ajx_cstm__ui__selectbox_next_btn( $el_id, $is_apply_rotating_icon ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#ui_btn_cstm__set_calendar_skin option[value="<?php echo WPBC_PLUGIN_URL; ?>' + data.ajx_cleaned_params.customize_plugin__booking_skin + '"]' ).prop( 'selected', true ); wpbc__calendar__change_skin( '<?php echo WPBC_PLUGIN_URL; ?>' + data.ajx_cleaned_params.customize_plugin__booking_skin ); } ); <?php if (0) { ?></script><?php } ?> #><?php // Calendar Visible Months wpbc_ajx_cstm__ui__template__visible_months(); ?> </div> </div> </div> </div> </script><?php } /** * Tpl - Calendar - Size * @return void */ private function template__widget__calendar_size(){ ?><script type="text/html" id="tmpl-wpbc_ajx_widget_calendar_size"> <div class="wpbc_widget wpbc_widget_calendar_size"> <div class="wpbc_widget_header"> <span class="wpbc_widget_header_text"><?php _e('Calendar size', 'booking'); ?></span> <a href="/" class="wpbc_widget_header_settings_link"><i class="menu_icon icon-1x wpbc_icn_settings"></i></a> </div> <div class="wpbc_widget_content wpbc_ajx_toolbar" style="margin:0 0 20px;"> <div class="ui_container" > <div class="ui_group ui_group__change_calendar_size"><?php // Calendar Visible Months wpbc_ajx_cstm__ui__template__visible_months(); // Calendar Months Number in a Row wpbc_ajx_cstm__ui__template__months_in_row(); // Calendar - Width wpbc_ajx_cstm__ui__template__calendar_width(); // Calendar - Cell Height wpbc_ajx_cstm__ui__template__calendar_cell_height(); ?> </div> </div> <div class="ui_container ui_container_toolbar ui_container_small"> <div class="ui_group ui_group__change_calendar_size" style="flex: 1 1 auto;"><?php ?><div class="ui_element ui_nowrap0"><?php wpbc_ajx_cstm__ui__calendar_size_reset__btn(); ?></div><?php ?><div class="ui_element ui_nowrap0" style="margin-left:auto;"><?php wpbc_ajx_cstm__ui__calendar_size_apply__btn(); ?></div><?php ?> </div> </div> </div> </div> </script><?php } /** * Tpl - Calendar - Dates Selection * * Help Tips: * * <script type="text/html" id="tmpl-template_name_a"> * Escaped: {{data.test_key}} * HTML: {{{data.test_key}}} * JS: <# if (true) { alert( 1 ); } #> * </script> * * var template__var = wp.template( 'template_name_a' ); * * jQuery( '.content' ).html( template__var( { 'test_key' => '<strong>Data</strong>' } ) ); * * @return void */ private function template__widget__calendar_dates_selection(){ ?><script type="text/html" id="tmpl-wpbc_ajx_widget_calendar_dates_selection"> <div class="wpbc_widget wpbc_widget_calendar_dates_selection"> <div class="wpbc_widget_header"> <span class="wpbc_widget_header_text"><?php _e('Dates selection', 'booking'); ?></span> <a href="/" class="wpbc_widget_header_settings_link"><i class="menu_icon icon-1x wpbc_icn_settings"></i></a> </div> <div class="wpbc_widget_content wpbc_ajx_toolbar" style="margin:0 0 20px;"> <div class="ui_container" > <div class="ui_group ui_group__change_calendar_dates_selection"><?php // Calendar Visible Months wpbc_ajx_cstm__ui__template__calendar_dates_selection(); ?> </div> </div> </div> </div> <?php ?> <div class="wpbc_widget wpbc_widget_calendar_dates_selection_range"> <div class="wpbc_widget_header"> <span class="wpbc_widget_header_text"><?php _e('Range days selection', 'booking'); ?></span> <a href="/" class="wpbc_widget_header_settings_link"><i class="menu_icon icon-1x wpbc_icn_settings"></i></a> </div> <div class="wpbc_widget_content wpbc_ajx_toolbar" style="margin:0 0 20px;"> <div class="ui_container ui_container_toolbar ui_container_small"> <?php $is_blur = ( ! class_exists( 'wpdev_bk_biz_s' ) ) ? 'wpbc_blur' : ''; if ( ! empty( $is_blur ) ) { wpbc_ajx_cstm__ui__upgrade_note( 'biz_s', 'https://wpbookingcalendar.com/features/#range-days-selection' ); } ?> <div class="ui_group ui_group__change_calendar_dates_selection <?php echo $is_blur; ?>"> <?php wpbc_ajx_cstm__ui__template__calendar_dates_selection_range(); ?> </div> </div> </div> </div> </script><?php } /** * Tpl - Calendar - Weekdays Availability * * Help Tips: * * <script type="text/html" id="tmpl-template_name_a"> * Escaped: {{data.test_key}} * HTML: {{{data.test_key}}} * JS: <# if (true) { alert( 1 ); } #> * </script> * * var template__var = wp.template( 'template_name_a' ); * * jQuery( '.content' ).html( template__var( { 'test_key' => '<strong>Data</strong>' } ) ); * * @return void */ private function template__widget__calendar_weekdays_availability(){ ?><script type="text/html" id="tmpl-wpbc_ajx_widget_calendar_weekdays_availability"> <div class="wpbc_widget wpbc_widget_calendar_weekdays_availability"> <div class="wpbc_widget_header"> <span class="wpbc_widget_header_text"><?php _e('Unavailable week days', 'booking'); ?></span> <a href="/" class="wpbc_widget_header_settings_link"><i class="menu_icon icon-1x wpbc_icn_settings"></i></a> </div> <div class="wpbc_widget_content wpbc_ajx_toolbar" style="margin:0 0 20px;"> <div class="ui_container" > <div class="ui_group ui_group__change_calendar_weekdays_availability"><?php // Calendar unavailable weekdays wpbc_ajx_cstm__ui__template__calendar_weekdays_availability(); ?> </div> </div> </div> </div> <?php ?> <div class="wpbc_widget wpbc_widget_calendar_weekdays_availability_pro"> <div class="wpbc_widget_header"> <span class="wpbc_widget_header_text"><?php _e('Advanced availability', 'booking'); ?></span> <a href="/" class="wpbc_widget_header_settings_link"><i class="menu_icon icon-1x wpbc_icn_settings"></i></a> </div> <div class="wpbc_widget_content wpbc_ajx_toolbar" style="margin:0 0 20px;"> <div class="ui_container ui_container_toolbar ui_container_small0"> <div class="ui_group ui_group__change_calendar_today_availability"> <?php wpbc_ajx_cstm__ui__template__calendar_unavailable_from_today(); ?> </div> <?php $is_blur = ( ! class_exists( 'wpdev_bk_biz_m' ) ) ? 'wpbc_blur' : ''; if ( ! empty( $is_blur ) ) { ?><div class="clear" style="width:101%;height:50px;"></div><?php wpbc_ajx_cstm__ui__upgrade_note( 'biz_m', 'https://wpbookingcalendar.com/features/#availability-from-today' ); } ?> <div class="ui_group ui_group__change_calendar_weekdays_availability <?php echo $is_blur; ?>"> <?php wpbc_ajx_cstm__ui__template__calendar_limit_available_from_today(); wpbc_ajx_cstm__ui__template__calendar_unavailable_before_after_bookings(); ?> </div> </div> <div class="ui_container ui_container_toolbar ui_container_small"> <div class="ui_group ui_group__change_calendar_size" style="flex: 1 1 auto;"><?php ?><div class="ui_element ui_nowrap0" style="margin-left: auto;"><?php wpbc_ajx_cstm__ui__calendar_weekdays_availability_reset__btn(); ?></div><?php ?> </div> </div> </div> </div> </script><?php } /** * Tpl - Calendar - Size * @return void */ private function template__widget__calendar_additional(){ ?><script type="text/html" id="tmpl-wpbc_ajx_widget_calendar_additional"> <div class="wpbc_widget wpbc_widget_calendar_size"> <div class="wpbc_widget_header"> <span class="wpbc_widget_header_text"><?php _e( 'Additional Settings', 'booking' ); ?></span> <a href="/" class="wpbc_widget_header_settings_link"><i class="menu_icon icon-1x wpbc_icn_settings"></i></a> </div> <div class="wpbc_widget_content wpbc_ajx_toolbar" style="margin:0 0 20px;"> <div class="ui_container" > <div class="ui_group ui_group__change_calendar_size"><?php // Calendar months_to_scroll wpbc_ajx_cstm__ui__template__months_to_scroll(); wpbc_ajx_cstm__ui__template__start_day_weeek(); ?> </div> </div> </div> </div> </script><?php } // </editor-fold> } /** * Just for loading CSS and JavaScript files */ if ( true ) { $ajx_customize_plugin_loading = new WPBC_AJX__Customize_Plugin__Templates; $ajx_customize_plugin_loading->init_load_css_js_tpl(); } //////////////////////////////////////////////////////////////////////////////// // T e m p l a t e s UI //////////////////////////////////////////////////////////////////////////////// /** * Show Upgrade Note with link to specific feature. * * @param $version - 'free' | 'personal' | 'biz_s' | 'biz_m' | 'biz_l' | 'multiuser'; it's from wpbc_get_version_type__and_mu(); * @param $url - full URL * * @return void * * Example: wpbc_ajx_cstm__ui__upgrade_note( 'biz_s', 'https://wpbookingcalendar.com/features/#range-days-selection' ); */ function wpbc_ajx_cstm__ui__upgrade_note( $version, $url ){ $ver_title = $version; // wpbc_get_plugin_version_type(); $ver_title = str_replace( '_m', ' Medium', $ver_title ); $ver_title = str_replace( '_l', ' Large', $ver_title ); $ver_title = str_replace( '_s', ' Small', $ver_title ); $ver_title = str_replace( 'biz', 'Business', $ver_title ); $ver_title = ucwords( $ver_title ); ?> <div class="ui_group ui_group__upgrade"> <div class="wpbc_upgrade_note"> This <a target="_blank" href="<?php echo $url; ?>">feature</a> requires the <a target="_blank" href="<?php echo $url; ?>"><?php echo $ver_title; ?></a> <?php if ( 'multiuser' !== $version ) { ?> or higher versions <?php } ?> </div> </div> <?php } /** * Button - Skip Wizard * @return void */ function wpbc_ajx_cstm__ui__skip_wizard__btn(){ $params = array( 'type' => 'button' , 'title' => __( 'Skip Wizard', 'booking' ) . ' ', // Title of the button 'hint' => array( 'title' => __( 'Reset selected options to default values', 'booking' ), 'position' => 'top' ), // Hint 'link' => 'javascript:void(0)', // Direct link or skip it 'action' => "wpbc_ajx_customize_plugin__send_request_with_params( { 'do_action': 'make_finish', 'ui_clicked_element_id': 'btn__status_bar__skip_wizard' } ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );", // JavaScript 'icon' => array( 'icon_font' => 'wpbc_icn_rotate_left', //'wpbc_icn_rotate_left', wpbc_icn_close 'position' => 'left', 'icon_img' => '' ), 'class' => 'wpbc_ui_button', // '' | 'wpbc_ui_button_primary' 'style' => '', // Any CSS class here 'mobile_show_text' => true, // Show or hide text, when viewing on Mobile devices (small window size). 'attr' => array( 'id' => 'btn__status_bar__skip_wizard' ) ); wpbc_flex_button( $params ); } /** * Button - Reset Wizard to default values * @return void */ function wpbc_ajx_cstm__ui__reset_to_default__btn(){ $params = array( 'type' => 'button' , 'title' => __( 'Reset Wizard', 'booking' ) . ' ', // Title of the button 'hint' => array( 'title' => __( 'Reset selected options to default values', 'booking' ), 'position' => 'top' ), // Hint 'link' => 'javascript:void(0)', // Direct link or skip it 'action' => "wpbc_ajx_customize_plugin__send_request_with_params( { 'do_action': 'make_reset', 'ui_clicked_element_id': 'btn__status_bar__reset' } ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );", // JavaScript 'icon' => array( 'icon_font' => 'wpbc_icn_settings_backup_restore', //'wpbc_icn_rotate_left', 'position' => 'left', 'icon_img' => '' ), 'class' => 'wpbc_ui_button_danger', // '' | 'wpbc_ui_button_primary' 'style' => '', // Any CSS class here 'mobile_show_text' => true, // Show or hide text, when viewing on Mobile devices (small window size). 'attr' => array( 'id' => 'btn__status_bar__reset' ) ); wpbc_flex_button( $params ); } /** * Button - Select Prior Skin in select-box * @return void */ function wpbc_ajx_cstm__ui__selectbox_prior_btn( $dropdown_id, $is_apply_rotating_icon = true ){ $params_button = array( 'type' => 'button' , 'title' => '' // Title of the button // , 'hint' => array( 'title' => __('Previous' ,'booking') , 'position' => 'top' ) , 'link' => 'javascript:void(0)' // Direct link or skip it , 'action' => // "console.log( 'ON CLICK:', jQuery( '[name=\"set_days_customize_plugin\"]:checked' ).val() , jQuery( 'textarea[id^=\"date_booking\"]' ).val() );" // Some JavaScript to execure, for example run the function " var is_selected = jQuery( '#" . $dropdown_id . " option:selected' ).prop('selected', false).prev(); " . " if ( is_selected.length == 0 ){ " . " is_selected = jQuery( '#" . $dropdown_id . " option' ).last(); " . " } " . " if ( is_selected.length > 0 ){ " . " is_selected.prop('selected', true).trigger('change'); " . ( ( $is_apply_rotating_icon ) ? " wpbc_button_enable_loading_icon( this ); " : "" ) . " } else { " . " jQuery( this ).addClass( 'disabled' ); " . " } " , 'class' => 'wpbc_ui_button' // wpbc_ui_button | wpbc_ui_button_primary //, 'icon_position' => 'left' // Position of icon relative to Text: left | right , 'icon' => array( 'icon_font' => 'wpbc_icn_arrow_back_ios', // 'wpbc_icn_check_circle_outline', 'position' => 'left', 'icon_img' => '' ) , 'style' => '' // Any CSS class here , 'mobile_show_text' => false // Show or hide text, when viewing on Mobile devices (small window size). , 'attr' => array() ); wpbc_flex_button( $params_button ); } /** * Button - Select Next Skin in select-box * @return void */ function wpbc_ajx_cstm__ui__selectbox_next_btn( $dropdown_id, $is_apply_rotating_icon = true ){ $params_button = array( 'type' => 'button' , 'title' => '' // Title of the button // , 'hint' => array( 'title' => __('Next' ,'booking') , 'position' => 'top' ) , 'link' => 'javascript:void(0)' // Direct link or skip it , 'action' => //"console.log( 'ON CLICK:', jQuery( '[name=\"set_days_customize_plugin\"]:checked' ).val() , jQuery( 'textarea[id^=\"date_booking\"]' ).val() );" // Some JavaScript to execure, for example run the function " var is_selected = jQuery( '#" . $dropdown_id . " option:selected' ).prop('selected', false).next(); " . " if ( is_selected.length == 0 ){ " . " is_selected = jQuery( '#" . $dropdown_id . " option' ).first(); " . " } " . " if ( is_selected.length > 0 ){ " . " is_selected.prop('selected', true).trigger('change'); " . ( ( $is_apply_rotating_icon ) ? " wpbc_button_enable_loading_icon( this ); " : "" ) . " } else { " . " jQuery( this ).addClass( 'disabled' ); " . " } " , 'class' => 'wpbc_ui_button' // wpbc_ui_button | wpbc_ui_button_primary //, 'icon_position' => 'left' // Position of icon relative to Text: left | right , 'icon' => array( 'icon_font' => 'wpbc_icn_arrow_forward_ios', // 'wpbc_icn_check_circle_outline', 'position' => 'right', 'icon_img' => '' ) , 'style' => '' // Any CSS class here , 'mobile_show_text' => false // Show or hide text, when viewing on Mobile devices (small window size). , 'attr' => array() ); wpbc_flex_button( $params_button ); } /** * Textarea that show shortcode for booking form * @return void */ function wpbc_ajx_cstm__ui__template__shortcode_booking_form(){ $booking_action = 'set_shortcode_booking_form'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Booking form shortcode' ,'booking') . ':</span>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap" style="flex: 1 1 100%;"><?php $param_text = array( 'type' => 'text' , 'id' => $el_id , 'name' => $el_id , 'label' => '' , 'disabled' => false , 'class' => 'put-in' , 'style' => 'width:100%;height:auto;font-weight:600;' , 'placeholder' => '0' , 'attr' => array() , 'is_escape_value' => false , 'value' => "{{ data.ajx_data.calendar_settings.shortcode__booking_form }}" , 'onfocus' => 'this.select()' //, 'onkeydown' => "jQuery('.ui__set_booking_cost__section_in_booking_{{data['parsed_fields']['booking_id']}}').show();" // JavaScript code //, 'onchange' => "" , 'rows' => '4' , 'cols' => '50' , 'attr' => array( 'readonly' => 'readonly' ) ); wpbc_flex_textarea( $param_text ); //wpbc_flex_text( $param_text ); ?></div><?php } // <editor-fold defaultstate="collapsed" desc=" == Calendar Skin UI == " > /** * Select-box - Calendar skins * * @return void */ function wpbc_ajx_cstm__ui__calendar_skin_dropdown(){ $booking_action = 'set_calendar_skin'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } // Calendar Skin ///////////////////////////////////////////////////// $calendar_skins_options = array(); // Skins in the Custom User folder (need to create it manually): http://example.com/wp-content/uploads/wpbc_skins/ ( This folder do not owerwrited during update of plugin ) $upload_dir = wp_upload_dir(); //FixIn: 8.9.4.8 $files_in_folder = wpbc_dir_list( array( WPBC_PLUGIN_DIR . '/css/skins/', $upload_dir['basedir'].'/wpbc_skins/' ) ); // Folders where to look about calendar skins foreach ( $files_in_folder as $skin_file ) { // Example: $skin_file['/css/skins/standard.css'] => 'Standard'; //FixIn: 8.9.4.8 //FixIn: 9.1.2.10 $skin_file[1] = str_replace( array( WPBC_PLUGIN_DIR, WPBC_PLUGIN_URL , $upload_dir['basedir'] ), '', $skin_file[1] ); // Get relative path for calendar skin $calendar_skins_options[ WPBC_PLUGIN_URL . $skin_file[1] ] = $skin_file[2]; } $params_select = array( 'id' => $el_id // HTML ID of element , 'name' => $booking_action , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => 'wpbc_radio__set_days_customize_plugin' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $calendar_skins_options //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default , 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param('customize_plugin__booking_skin', jQuery(this).val().replace( '" . WPBC_PLUGIN_URL . "', '') );" // , 'onchange' => "jQuery(this).hide(); // var jButton = jQuery('#button_locale_for_booking{{data[\'parsed_fields\'][\'booking_id\']}}'); // jButton.show(); // wpbc_button_enable_loading_icon( jButton.get(0) ); " // . " wpbc_ajx_booking_ajax_action_request( { // 'booking_action' : '{$booking_action}', // 'booking_id' : {{data[\'parsed_fields\'][\'booking_id\']}}, // 'booking_meta_locale' : jQuery('#locale_for_booking{{data[\'parsed_fields\'][\'booking_id\']}} option:selected').val() // } );" ); wpbc_flex_select( $params_select ); } // </editor-fold> // <editor-fold defaultstate="collapsed" desc=" == Calendar Size UI == " > /** * Select-box - Number of Visible Months * * @return void */ function wpbc_ajx_cstm__ui__template__visible_months(){ $booking_action = 'set_calendar_visible_months'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Number of visible months' ,'booking') . ':</span>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php // Options $dropdown_options = array( 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12 ); $params_select = array( 'id' => $el_id // HTML ID of element , 'name' => $booking_action , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $dropdown_options //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__visible_months', jQuery(this).val() ); var t_visible_months = parseInt( wpbc_ajx_customize_plugin.search_get_param( 'calendar__view__visible_months' ) ); /* var t_months_in_row = ( 3 > t_visible_months ) ? '' : 2 ; wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__months_in_row', t_months_in_row ); */ wpbc_ajx_customize_plugin__send_request_with_params( {} ); wpbc_admin_show_message_processing( '' ); " ); wpbc_flex_select( $params_select ); wpbc_ajx_cstm__ui__selectbox_prior_btn( $el_id ); wpbc_ajx_cstm__ui__selectbox_next_btn( $el_id ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#<?php echo $el_id; ?> option[value="' + data.ajx_data.calendar_settings.calendar__view__visible_months + '"]' ).prop( 'selected', true ); } ); <?php if (0) { ?></script><?php } ?> #><?php } /** * Select-box - Number of Months in a Row * * @return void */ function wpbc_ajx_cstm__ui__template__months_in_row(){ $booking_action = 'set_calendar_months_in_row'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Number of months in a row' ,'booking') . ':</span>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php // Options $dropdown_options = array( '' => __('Default','booking'), 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6 ); $params_select = array( 'id' => $el_id // HTML ID of element , 'name' => $booking_action , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $dropdown_options //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__months_in_row', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {} );" ); wpbc_flex_select( $params_select ); wpbc_ajx_cstm__ui__selectbox_prior_btn( $el_id ); wpbc_ajx_cstm__ui__selectbox_next_btn( $el_id ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#<?php echo $el_id; ?> option[value="' + data.ajx_data.calendar_settings.calendar__view__months_in_row + '"]' ).prop( 'selected', true ); } ); <?php if (0) { ?></script><?php } ?> #><?php } /** * Width of Calendar * * @return void */ function wpbc_ajx_cstm__ui__template__calendar_width(){ $booking_action = 'set_calendar_width'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Maximum width of calendar' ,'booking') . ':</span>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php $param_text = array( 'type' => 'text' , 'id' => $el_id , 'name' => $el_id , 'label' => '' , 'disabled' => false , 'class' => '' , 'style' => 'width:5em;' , 'placeholder' => __( 'Default', 'booking' ) , 'attr' => array() , 'is_escape_value' => false , 'value' => "{{ data.ajx_data.calendar_settings.calendar__view__width.replace('px','').replace('%','') }}" , 'onfocus' => '' //, 'onkeydown' => "jQuery('.ui__set_booking_cost__section_in_booking_{{data['parsed_fields']['booking_id']}}').show();" // JavaScript code , 'onchange' => "var t_width = parseInt( jQuery(this).val() ); t_width = isNaN( t_width ) ? '' : t_width; var t_dim = jQuery( '#" . $el_id . "_dim' ).val(); if ( '%' == t_dim ){ t_width = ( t_width > 100) ? 100 : t_width; t_width = ( 0 === t_width ) ? '' : t_width; } t_dim = ( '' === t_width ) ? '' : t_dim; wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__width', t_width + t_dim );" // . " wpbc_ajx_customize_plugin__send_request_with_params( {} );" ); wpbc_flex_text( $param_text ); $params_select = array( 'id' => $el_id . '_dim' // HTML ID of element , 'name' => $el_id . '_dim' , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => array( '%' => '% ', 'px' => 'px ' ) //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "jQuery( '#" . $el_id . "' ).trigger( 'change' );" ); wpbc_flex_select( $params_select ); //wpbc_ajx_cstm__ui__select_skin_prior_btn( $el_id ); //wpbc_ajx_cstm__ui__select_skin_next_btn( $el_id ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ if ( -1 !== data.ajx_data.calendar_settings.calendar__view__width.indexOf('%') ) { jQuery( '#<?php echo $el_id; ?>_dim option[value="%"]' ).prop( 'selected', true ); } else { jQuery( '#<?php echo $el_id; ?>_dim option[value="px"]' ).prop( 'selected', true ); } } ); <?php if (0) { ?></script><?php } ?> #><?php } /** * Height of Calendar Cell * * @return void */ function wpbc_ajx_cstm__ui__template__calendar_cell_height(){ $booking_action = 'set_calendar_cell_height'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Height of calendar cell' ,'booking') . ':</span>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php $param_text = array( 'type' => 'text' , 'id' => $el_id , 'name' => $el_id , 'label' => '' , 'disabled' => false , 'class' => '' , 'style' => 'width:5em;' , 'placeholder' => __( 'Default', 'booking' ) , 'attr' => array() , 'is_escape_value' => false , 'value' => "{{ data.ajx_data.calendar_settings.calendar__view__cell_height.replace('px','').replace('%','') }}" , 'onfocus' => '' //, 'onkeydown' => "jQuery('.ui__set_booking_cost__section_in_booking_{{data['parsed_fields']['booking_id']}}').show();" // JavaScript code , 'onchange' => "var t_cell_height = parseInt( jQuery(this).val() ); t_cell_height = isNaN( t_cell_height ) ? '' : t_cell_height; var t_dim = jQuery( '#" . $el_id . "_dim' ).val(); t_dim = ( '' === t_cell_height ) ? '' : t_dim; wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__cell_height', t_cell_height + t_dim );" // . " wpbc_ajx_customize_plugin__send_request_with_params( {} );" ); wpbc_flex_text( $param_text ); $params_select = array( 'id' => $el_id . '_dim' // HTML ID of element , 'name' => $el_id . '_dim' , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => array( 'px' => 'px ' ) //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "jQuery( '#" . $el_id . "' ).trigger( 'change' );" ); wpbc_flex_select( $params_select ); //wpbc_ajx_cstm__ui__select_skin_prior_btn( $el_id ); //wpbc_ajx_cstm__ui__select_skin_next_btn( $el_id ); ?></div><?php } /** * Button - Apply * @return void */ function wpbc_ajx_cstm__ui__calendar_size_apply__btn(){ $params = array( 'type' => 'button' , 'title' => __( 'Apply Size', 'booking' ) . ' ', // Title of the button 'hint' => '', //array( 'title' => __( 'Reset selected options to default values', 'booking' ), 'position' => 'top' ), // Hint 'link' => 'javascript:void(0)', // Direct link or skip it 'action' => "wpbc_ajx_customize_plugin__send_request_with_params( { } ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );", // JavaScript 'icon' => array( 'icon_font' => 'wpbc_icn_check', //'wpbc_icn_rotate_left', wpbc_icn_close 'position' => 'left', 'icon_img' => '' ), 'class' => 'wpbc_ui_button', // '' | 'wpbc_ui_button_primary' 'style' => '', // Any CSS class here 'mobile_show_text' => true, // Show or hide text, when viewing on Mobile devices (small window size). 'attr' => array() ); wpbc_flex_button( $params ); } /** * Button - Reset Calendar Size * @return void */ function wpbc_ajx_cstm__ui__calendar_size_reset__btn(){ $params = array( 'type' => 'button' , 'title' => __( 'Reset Size', 'booking' ) . ' ', // Title of the button 'hint' => '',//array( 'title' => __( 'Reset selected options to default values', 'booking' ), 'position' => 'top' ), // Hint 'link' => 'javascript:void(0)', // Direct link or skip it 'action' => "wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__visible_months', 1 ); wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__months_in_row', '' ); wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__width', '' ); wpbc_ajx_customize_plugin.search_set_param( 'calendar__view__cell_height', '' ); wpbc_ajx_customize_plugin__send_request_with_params( {} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );", // JavaScript 'icon' => array( 'icon_font' => 'wpbc_icn_close', //'wpbc_icn_rotate_left', wpbc_icn_settings_backup_restore 'position' => 'left', 'icon_img' => '' ), 'class' => 'wpbc_ui_button_danger0', // '' | 'wpbc_ui_button_primary' 'style' => '', // Any CSS class here 'mobile_show_text' => true, // Show or hide text, when viewing on Mobile devices (small window size). 'attr' => array( 'id' => 'btn__status_bar__reset' ) ); wpbc_flex_button( $params ); } // </editor-fold> // <editor-fold defaultstate="collapsed" desc=" == Dates Selection UI == " > /** * Radio buttons - Dates selection mode * * @return void */ function wpbc_ajx_cstm__ui__template__calendar_dates_selection(){ $booking_action = 'set_calendar_dates_selection'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Days selection in calendar' ,'booking') . ':</span>' ) ); ?></div><?php ?><div class="ui_element"><?php $el_value = 'single'; ?><span class="wpbc_ui_control wpbc_ui_button <?php echo $el_id. '_' . $el_value . '__outer_button'; ?>" style="padding-right: 8px;"><?php $params_radio = array( 'id' => $el_id . '_' . $el_value // HTML ID of element , 'name' => $booking_action , 'label' => array( 'title' => __('Single day' ,'booking') , 'position' => 'right' ) , 'style' => 'margin:1px 0 0;' // CSS of select element , 'class' => 'wpbc_radio__set_days_availability' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $el_value // Some Value from options array that selected by default //, 'selected' => false //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code //, 'onchange' => "return false;" ); wpbc_flex_radio( $params_radio ); ?></span><?php ?></div><?php $el_value = 'multiple'; ?><div class="ui_element"><?php ?><span class="wpbc_ui_control wpbc_ui_button <?php echo $el_id. '_' . $el_value . '__outer_button'; ?>" style="padding-right: 8px;"><?php $params_radio = array( 'id' => $el_id . '_' . $el_value // HTML ID of element , 'name' => $booking_action , 'label' => array( 'title' => __('Multiple days' ,'booking') , 'position' => 'right' ) , 'style' => 'margin:1px 0 0;' // CSS of select element , 'class' => 'wpbc_radio__set_days_availability' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $el_value // Some Value from options array that selected by default //, 'selected' => false //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code ); wpbc_flex_radio( $params_radio ); ?></span><?php ?></div><?php // Set checked specific Radio button, depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ <?php foreach ( array( 'single', 'multiple' ) as $item_val) { ?> // Change and send Ajax jQuery( '#ui_btn_cstm__set_calendar_dates_selection_<?php echo $item_val; ?>' ).on( 'change', function ( event ){ <?php // It's required for not send request second time ! ?> jQuery( '#ui_btn_cstm__set_calendar_dates_selection_<?php echo $item_val; ?>' ).off( 'change' ); wpbc_ajx_customize_plugin.search_set_param( 'calendar__days_selection_mode', '<?php echo $item_val; ?>' ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_dates_selection'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' ); return false; } ); <?php // Helper, if we click on button side, and not at radio button or label, then make radio checked. ?> jQuery( '.ui_btn_cstm__set_calendar_dates_selection_<?php echo $item_val; ?>__outer_button' ).on( 'click', function (){ jQuery( '#ui_btn_cstm__set_calendar_dates_selection_<?php echo $item_val; ?>' ).prop( "checked", true ).trigger('change'); } ); <?php } ?> // Set checked or not, specific radio buttons if ( 'single' == data.ajx_data.calendar_settings.calendar__days_selection_mode ){ jQuery( '#ui_btn_cstm__set_calendar_dates_selection_single' ).prop( 'checked', true ); } if ( 'multiple' == data.ajx_data.calendar_settings.calendar__days_selection_mode ){ jQuery( '#ui_btn_cstm__set_calendar_dates_selection_multiple' ).prop( 'checked', true ); } } ); <?php if (0) { ?></script><?php } ?> #><?php // wpbc_ajx_cstm__ui__template__calendar_dates_selection_range(); } /** * Radio buttons - Range Dates selection mode - Business Small and higher * * @return void */ function wpbc_ajx_cstm__ui__template__calendar_dates_selection_range(){ $booking_action = 'set_calendar_dates_selection'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } $el_value = 'dynamic'; ?><div class="ui_element"><?php ?><span class="wpbc_ui_control wpbc_ui_button <?php echo $el_id. '_' . $el_value . '__outer_button'; ?>" style="padding-right: 8px;"><?php $params_radio = array( 'id' => $el_id . '_' . $el_value // HTML ID of element , 'name' => $booking_action , 'label' => array( 'title' => sprintf(__('2 mouse clicks' ,'booking'),'<strong>','</strong>','<strong>','</strong>') , 'position' => 'right' ) , 'style' => 'margin:1px 0 0;' // CSS of select element , 'class' => 'wpbc_radio__set_days_availability' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $el_value // Some Value from options array that selected by default //, 'selected' => false //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code ); wpbc_flex_radio( $params_radio ); ?></span><?php ?></div><?php ?><div class="ui_element_sub_section ui_element_sub_section_dynamic" ><?php wpbc_ajx_cstm__ui__template__calendar_dates_selection_range__min_max(); wpbc_ajx_cstm__ui__template__calendar_dates_selection_range__specific(); wpbc_ajx_cstm__ui__template__calendar_dates_selection_range__start_days(); ?></div><?php $el_value = 'fixed'; ?><div class="ui_element"><?php ?><span class="wpbc_ui_control wpbc_ui_button <?php echo $el_id. '_' . $el_value . '__outer_button'; ?>" style="padding-right: 8px;"><?php $params_radio = array( 'id' => $el_id . '_' . $el_value // HTML ID of element , 'name' => $booking_action , 'label' => array( 'title' => sprintf(__('1 mouse click' ,'booking'),'<strong>','</strong>','<strong>','</strong>') , 'position' => 'right' ) , 'style' => 'margin:1px 0 0;' // CSS of select element , 'class' => 'wpbc_radio__set_days_availability' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $el_value // Some Value from options array that selected by default //, 'selected' => false //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code ); wpbc_flex_radio( $params_radio ); ?></span><?php ?></div><?php ?><div class="ui_element_sub_section ui_element_sub_section_fixed" ><?php wpbc_ajx_cstm__ui__template__calendar_dates_selection_fixed__number(); wpbc_ajx_cstm__ui__template__calendar_dates_selection_fixed__start_days(); ?></div><?php // Set checked specific Radio button, depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ <?php foreach ( array( 'dynamic', 'fixed' ) as $item_val) { ?> // Change and send Ajax jQuery( '#ui_btn_cstm__set_calendar_dates_selection_<?php echo $item_val; ?>' ).on( 'change', function ( event ){ <?php // It's required for not send request second time ! ?> jQuery( '#ui_btn_cstm__set_calendar_dates_selection_<?php echo $item_val; ?>' ).off( 'change' ); wpbc_ajx_customize_plugin.search_set_param( 'calendar__days_selection_mode', '<?php echo $item_val; ?>' ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_dates_selection'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' ); jQuery( '.ui_element_sub_section_dynamic,.ui_element_sub_section_fixed').hide(); if ('fixed' == '<?php echo $item_val; ?>') { jQuery( '.ui_element_sub_section_fixed').show(); } else { jQuery( '.ui_element_sub_section_dynamic').show(); } return false; } ); <?php // Helper, if we click on button side, and not at radio button or label, then make radio checked. ?> jQuery( '.ui_btn_cstm__set_calendar_dates_selection_<?php echo $item_val; ?>__outer_button' ).on( 'click', function (){ jQuery( '#ui_btn_cstm__set_calendar_dates_selection_<?php echo $item_val; ?>' ).prop( "checked", true ).trigger('change'); } ); <?php } ?> // Set checked or not, specific radio buttons if ( 'dynamic' == data.ajx_data.calendar_settings.calendar__days_selection_mode ){ jQuery( '#ui_btn_cstm__set_calendar_dates_selection_dynamic' ).prop( 'checked', true ); } jQuery( '.ui_element_sub_section_dynamic,.ui_element_sub_section_fixed').hide(); if ( 'fixed' == data.ajx_data.calendar_settings.calendar__days_selection_mode ){ jQuery( '#ui_btn_cstm__set_calendar_dates_selection_fixed' ).prop( 'checked', true ); jQuery( '.ui_element_sub_section_fixed').show(); } else { jQuery( '.ui_element_sub_section_dynamic').show(); } } ); <?php if (0) { ?></script><?php } ?> #><?php } /** * Range Days Min - Max */ function wpbc_ajx_cstm__ui__template__calendar_dates_selection_range__min_max(){ $booking_action = 'set_calendar_dates_selection_dynamic'; $el_id = 'ui_btn_cstm__' . $booking_action . '_min'; /* ?><div class="ui_element ui_element_micro ui_nowrap0" style="flex:1 1 100%"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Min-max' ,'booking') . ':</span>' ) ); ?></div><?php */ $params = array( 'id' => $el_id // HTML ID of element , 'name' => $el_id , 'label' => __( 'From', 'booking' )//'<span class="" style="font-weight:600;">' . __( 'Days', 'booking' ) . ' <em style="color:#888;">(' . __( 'min-max', 'booking' ) . '):</em></span>' , 'style' => 'max-width: 50px;' // CSS of select element , 'class' => '' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'placeholder' => '1' , 'value' => "{{ data.ajx_data.calendar_settings.calendar__bk_2clicks_mode_days_min }}" //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val() , 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => " wpbc_ajx_customize_plugin.search_set_param( 'calendar__bk_2clicks_mode_days_min', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_dates_selection'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro" style="margin-right: 5px;"><?php wpbc_flex_text( $params ); ?></div><?php $el_id = 'ui_btn_cstm__' . $booking_action . '_max'; $params = array( 'id' => $el_id // HTML ID of element , 'name' => $el_id , 'label' => __( 'to', 'booking' )//'<span class="" style="font-weight:600;"> ‐ </span>' , 'style' => 'max-width: 50px;' // CSS of select element , 'class' => '' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'placeholder' => '30' , 'value' => "{{ data.ajx_data.calendar_settings.calendar__bk_2clicks_mode_days_max }}" //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val() , 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => " wpbc_ajx_customize_plugin.search_set_param( 'calendar__bk_2clicks_mode_days_max', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_dates_selection'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_text( $params ); ?></div><?php ?><div class="ui_element ui_element_micro"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => __('days' ,'booking') ) ); ?></div><?php } /** * Range Days Specific */ function wpbc_ajx_cstm__ui__template__calendar_dates_selection_range__specific(){ $booking_action = 'set_calendar_dates_selection_dynamic'; $el_id = 'ui_btn_cstm__' . $booking_action . '_specific'; ?><div class="ui_element ui_element_micro ui_nowrap0" style="flex:1 1 100%"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:400;">' . __('Specific days selections' ,'booking') . ':</span>' ) ); ?></div><?php $params = array( 'id' => $el_id // HTML ID of element , 'name' => $el_id , 'label' => ''//'<span class="" style="font-weight:600;">' . __( 'Days', 'booking' ) . ' <em style="color:#888;">(' . __( 'min-max', 'booking' ) . '):</em></span>' , 'style' => 'max-width: 100%;' // CSS of select element , 'class' => '' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'placeholder' => '7,14,21,28' , 'value' => "{{ data.ajx_data.calendar_settings.calendar__bk_2clicks_mode_days_specific }}" //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val() , 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => " wpbc_ajx_customize_plugin.search_set_param( 'calendar__bk_2clicks_mode_days_specific', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_dates_selection'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_text( $params ); ?></div><?php } /** * Range Days Start week days* */ function wpbc_ajx_cstm__ui__template__calendar_dates_selection_range__start_days(){ $booking_action = 'set_calendar_dates_selection_dynamic'; $el_id = 'ui_btn_cstm__' . $booking_action . '_start_days'; ?><div class="ui_element ui_element_micro ui_nowrap0" style="flex:1 1 100%"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:400;">' . __('Start day of range' ,'booking') . ':</span>' ) ); ?></div><?php //TODO: here 2023-07-02 // Set checked or unchecked checkboxes depends from data.ajx_data.calendar_settings.calendar__bk_2clicks_mode_days_start = "2,5 || "0,1,2,3,4,5,6" || "-1" // Then onchange send correct 'calendar__bk_2clicks_mode_days_start' value, for example if it's "0,1,2,3,4,5,6", then it have to be '-1' // And create the same UI for fixed 1 click // data.ajx_data.calendar_settings.calendar__bk_2clicks_mode_days_start = "2,5 || "0,1,2,3,4,5,6" || "-1" $week_days_arr = array( 0 => __( 'Su', 'booking' ) , 1 => __( 'Mo', 'booking' ) , 2 => __( 'Tu', 'booking' ) , 3 => __( 'We', 'booking' ) , 4 => __( 'Th', 'booking' ) , 5 => __( 'Fr', 'booking' ) , 6 => __( 'Sa', 'booking' ) ); foreach ( $week_days_arr as $day_key => $day_title ) { $params_checkbox = array( 'id' => $el_id . '_'.$day_key // HTML ID of element , 'name' => $el_id . '_'.$day_key , 'label' => array( 'title' => $day_title , 'position' => 'right' ) //FixIn: 9.6.1.5 , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $day_key // Some Value from optins array that selected by default , 'selected' => false // Selected or not //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code //, 'onchange' => "wpbc_ajx_booking_send_search_request_with_params( {'ui_usr__send_emails': (jQuery( this ).is(':checked') ? 'send' : 'not_send') } );" // JavaScript code , 'onchange' => " var sel_arr_el = wpbc_ajx_customize_plugin.search_get_param( 'calendar__bk_2clicks_mode_days_start' ); if ( -1 == sel_arr_el ){ sel_arr_el = '0,1,2,3,4,5,6'; } if ( jQuery( this ).is(':checked') ) { sel_arr_el = _.uniq( ['".$day_key."'].concat( sel_arr_el.split(',') ) ).sort().join( ','); } else { sel_arr_el = _.uniq( _.without( sel_arr_el.split(','), '".$day_key."' ) ).sort().join( ','); } wpbc_ajx_customize_plugin.search_set_param( 'calendar__bk_2clicks_mode_days_start', sel_arr_el ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_dates_selection'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_toggle( $params_checkbox ); ?></div><?php // Set checked specific Radio button, depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ if ( ( '-1' === data.ajx_data.calendar_settings.calendar__bk_2clicks_mode_days_start ) || ( -1 !== data.ajx_data.calendar_settings.calendar__bk_2clicks_mode_days_start.indexOf( '<?php echo $day_key; ?>' ) ) ){ jQuery( '#<?php echo $el_id . '_'.$day_key; ?>' ).prop( 'checked', true );//.trigger( 'change' ); } else { jQuery( '#<?php echo $el_id . '_'.$day_key; ?>' ).prop( 'checked', false );//.trigger( 'change' ); } } ); <?php if (0) { ?></script><?php } ?> #><?php } } /** * Fixed Days Number */ function wpbc_ajx_cstm__ui__template__calendar_dates_selection_fixed__number(){ $booking_action = 'set_calendar_dates_selection_fixed'; $el_id = 'ui_btn_cstm__' . $booking_action . '_number'; ?><div class="ui_element ui_element_micro ui_nowrap0" style="flex:1 1 100%"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:400;">' . __('Days selection number' ,'booking') . ':</span>' ) ); ?></div><?php $params = array( 'id' => $el_id // HTML ID of element , 'name' => $el_id , 'label' => ''//'<span class="" style="font-weight:600;">' . __( 'Days', 'booking' ) . ' <em style="color:#888;">(' . __( 'min-max', 'booking' ) . '):</em></span>' , 'style' => 'max-width: 100%;' // CSS of select element , 'class' => '' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'placeholder' => '7' , 'value' => "{{ data.ajx_data.calendar_settings.calendar__bk_1click_mode_days_num }}" //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val() , 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => " wpbc_ajx_customize_plugin.search_set_param( 'calendar__bk_1click_mode_days_num', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_dates_selection'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_text( $params ); ?></div><?php } /** * Fixed Days Start week days* */ function wpbc_ajx_cstm__ui__template__calendar_dates_selection_fixed__start_days(){ $booking_action = 'set_calendar_dates_selection_fixed'; $el_id = 'ui_btn_cstm__' . $booking_action . '_start_days'; ?><div class="ui_element ui_element_micro ui_nowrap0" style="flex:1 1 100%"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:400;">' . __('Start day of range' ,'booking') . ':</span>' ) ); ?></div><?php $week_days_arr = array( 0 => __( 'Su', 'booking' ) , 1 => __( 'Mo', 'booking' ) , 2 => __( 'Tu', 'booking' ) , 3 => __( 'We', 'booking' ) , 4 => __( 'Th', 'booking' ) , 5 => __( 'Fr', 'booking' ) , 6 => __( 'Sa', 'booking' ) ); foreach ( $week_days_arr as $day_key => $day_title ) { $params_checkbox = array( 'id' => $el_id . '_'.$day_key // HTML ID of element , 'name' => $el_id . '_'.$day_key , 'label' => array( 'title' => $day_title , 'position' => 'right' ) //FixIn: 9.6.1.5 , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $day_key // Some Value from optins array that selected by default , 'selected' => false // Selected or not //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code //, 'onchange' => "wpbc_ajx_booking_send_search_request_with_params( {'ui_usr__send_emails': (jQuery( this ).is(':checked') ? 'send' : 'not_send') } );" // JavaScript code , 'onchange' => " var sel_arr_el = wpbc_ajx_customize_plugin.search_get_param( 'calendar__bk_1click_mode_days_start' ); if ( -1 == sel_arr_el ){ sel_arr_el = '0,1,2,3,4,5,6'; } if ( jQuery( this ).is(':checked') ) { sel_arr_el = _.uniq( ['".$day_key."'].concat( sel_arr_el.split(',') ) ).sort().join( ','); } else { sel_arr_el = _.uniq( _.without( sel_arr_el.split(','), '".$day_key."' ) ).sort().join( ','); } wpbc_ajx_customize_plugin.search_set_param( 'calendar__bk_1click_mode_days_start', sel_arr_el ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_dates_selection'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_toggle( $params_checkbox ); ?></div><?php // Set checked specific Radio button, depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ if ( ( '-1' === data.ajx_data.calendar_settings.calendar__bk_1click_mode_days_start ) || ( -1 !== data.ajx_data.calendar_settings.calendar__bk_1click_mode_days_start.indexOf( '<?php echo $day_key; ?>' ) ) ){ jQuery( '#<?php echo $el_id . '_'.$day_key; ?>' ).prop( 'checked', true );//.trigger( 'change' ); } else { jQuery( '#<?php echo $el_id . '_'.$day_key; ?>' ).prop( 'checked', false );//.trigger( 'change' ); } } ); <?php if (0) { ?></script><?php } ?> #><?php } } // </editor-fold> // <editor-fold defaultstate="collapsed" desc=" == Unavailable Weekdays UI == " > /** * Unavailable - weekdays */ function wpbc_ajx_cstm__ui__template__calendar_weekdays_availability(){ $booking_action = 'set_calendar_weekdays_availability'; $el_id = 'ui_btn_cstm__' . $booking_action ; ?><div class="ui_element ui_element_micro ui_nowrap0" style="flex:1 1 100%"><?php wpbc_flex_label( array( 'id' => $el_id , 'style' => 'height: auto;line-height: 1.75em;' , 'label' => '<span class="" style="font-weight:400;">' . __('Check unavailable days in calendars. This option will overwrite all other settings.' ,'booking') . '</span>' ) ); ?></div><?php $week_days_arr = array( 0 => __( 'Su', 'booking' ) , 1 => __( 'Mo', 'booking' ) , 2 => __( 'Tu', 'booking' ) , 3 => __( 'We', 'booking' ) , 4 => __( 'Th', 'booking' ) , 5 => __( 'Fr', 'booking' ) , 6 => __( 'Sa', 'booking' ) ); foreach ( $week_days_arr as $day_key => $day_title ) { $params_checkbox = array( 'id' => $el_id . '_'.$day_key // HTML ID of element , 'name' => $el_id . '_'.$day_key , 'label' => array( 'title' => $day_title , 'position' => 'right' ) //FixIn: 9.6.1.5 , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $day_key // Some Value from optins array that selected by default , 'selected' => false // Selected or not //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code //, 'onchange' => "wpbc_ajx_booking_send_search_request_with_params( {'ui_usr__send_emails': (jQuery( this ).is(':checked') ? 'send' : 'not_send') } );" // JavaScript code , 'onchange' => " var sel_arr_el = wpbc_ajx_customize_plugin.search_get_param( 'availability__user_unavilable_days' ); if ( jQuery( this ).is(':checked') ) { sel_arr_el = _.uniq( ['".$day_key."'].concat( sel_arr_el.split(',') ) ).sort().join( ','); } else { sel_arr_el = _.uniq( _.without( sel_arr_el.split(','), '".$day_key."' ) ).sort().join( ','); } wpbc_ajx_customize_plugin.search_set_param( 'availability__user_unavilable_days', sel_arr_el ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_toggle( $params_checkbox ); ?></div><?php // Set checked specific Radio button, depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ if ( ( '-1' === data.ajx_data.calendar_settings.calendar_unavailable.user_unavilable_days ) || ( -1 !== data.ajx_data.calendar_settings.calendar_unavailable.user_unavilable_days.indexOf( '<?php echo $day_key; ?>' ) ) ){ jQuery( '#<?php echo $el_id . '_'.$day_key; ?>' ).prop( 'checked', true ); } else { jQuery( '#<?php echo $el_id . '_'.$day_key; ?>' ).prop( 'checked', false ); } } ); <?php if (0) { ?></script><?php } ?> #><?php } } /** * Unavailable - from Today */ function wpbc_ajx_cstm__ui__template__calendar_unavailable_from_today(){ $booking_action = 'set_calendar_unavailable_from_today'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<div class="" style="font-weight:400;">' . __( 'Unavailable days from today', 'booking' ) . ': ' . '<div><code id="' . $el_id . '_hint" style="font-weight:600;font-size:10px;padding:0;color: #626262;"></code></div>' . '</div>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php // Options $dropdown_options = range( 0, 31 ); $params_select = array( 'id' => $el_id // HTML ID of element , 'name' => $booking_action , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $dropdown_options //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'availability__block_some_dates_from_today', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); wpbc_flex_select( $params_select ); wpbc_ajx_cstm__ui__selectbox_prior_btn( $el_id ); wpbc_ajx_cstm__ui__selectbox_next_btn( $el_id ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#<?php echo $el_id; ?> option[value="' + data.ajx_data.calendar_settings.calendar_unavailable.block_some_dates_from_today + '"]' ).prop( 'selected', true ); jQuery( '#<?php echo $el_id; ?>_hint' ).html( '<span style="color: #cc3a5f;text-transform: uppercase;"><?php _e('Unavailable','booking') ?></span>' + data.ajx_data.calendar_settings.calendar_unavailable.block_some_dates_from_today__hint ); } ); <?php if (0) { ?></script><?php } ?> #><?php } /** * Limit Available - from Today */ function wpbc_ajx_cstm__ui__template__calendar_limit_available_from_today(){ $booking_action = 'set_calendar_limit_available_from_today'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<div class="" style="font-weight:400;">' . __( 'Limit available days from today', 'booking' ) . ': ' . '<div><code id="' . $el_id . '_hint" style="font-weight:600;font-size:10px;padding:0;color: #626262;"></code></div>' . '</div>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php // Options $dropdown_options = array( '' => ' - ' ); //foreach ( range( 365, 1, -1 ) as $value ) { foreach ( range( 1,365 ) as $value ) { $dropdown_options[ $value ] = $value; } $params_select = array( 'id' => $el_id // HTML ID of element , 'name' => $booking_action , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $dropdown_options //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'availability__wpbc_available_days_num_from_today', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); wpbc_flex_select( $params_select ); wpbc_ajx_cstm__ui__selectbox_prior_btn( $el_id ); wpbc_ajx_cstm__ui__selectbox_next_btn( $el_id ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#<?php echo $el_id; ?> option[value="' + data.ajx_data.calendar_settings.calendar_unavailable.wpbc_available_days_num_from_today + '"]' ).prop( 'selected', true ); jQuery( '#<?php echo $el_id; ?>_hint' ).html( '<span style="color: #50be31;text-transform: uppercase;"><?php _e('Available','booking') ?></span>' + data.ajx_data.calendar_settings.calendar_unavailable.wpbc_available_days_num_from_today__hint ); } ); <?php if (0) { ?></script><?php } ?> #><?php } /** * Radio buttons - Range Dates selection mode - Business Small and higher * * @return void */ function wpbc_ajx_cstm__ui__template__calendar_unavailable_before_after_bookings(){ $booking_action = 'set_calendar_unavailable_before_after_bookings'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="clear" style="height: 1px;width: 100%;border-top: 1px solid #ccc;margin: 15px 0 10px;"></div><?php ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'style' => 'height: auto;' , 'label' => '<span class="" style="font-weight:400;">' . __('Unavailable time before / after booking' ,'booking') .':</span>' ) ); ?></div><?php $el_value = ''; ?><div class="ui_element"><?php ?><span class="wpbc_ui_control wpbc_ui_button <?php echo $el_id. '_' . $el_value . '__outer_button'; ?>" style="padding-right: 8px;"><?php $params_radio = array( 'id' => $el_id . '_' . $el_value // HTML ID of element , 'name' => $booking_action , 'label' => array( 'title' => ucfirst( __( 'None', 'booking' ) ) , 'position' => 'right' ) , 'style' => 'margin:1px 0 0;' // CSS of select element , 'class' => 'wpbc_radio__set_days_availability' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $el_value // Some Value from options array that selected by default //, 'selected' => true //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code ); wpbc_flex_radio( $params_radio ); ?></span><?php ?></div><?php $el_value = 'm'; ?><div class="ui_element"><?php ?><span class="wpbc_ui_control wpbc_ui_button <?php echo $el_id. '_' . $el_value . '__outer_button'; ?>" style="padding-right: 8px;"><?php $params_radio = array( 'id' => $el_id . '_' . $el_value // HTML ID of element , 'name' => $booking_action , 'label' => array( 'title' => ucfirst( __( 'minutes', 'booking' ) ) . ' / ' . ucfirst( __( 'hours', 'booking' ) ) , 'position' => 'right' ) , 'style' => 'margin:1px 0 0;' // CSS of select element , 'class' => 'wpbc_radio__set_days_availability' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $el_value // Some Value from options array that selected by default //, 'selected' => false //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code ); wpbc_flex_radio( $params_radio ); ?></span><?php ?></div><?php ?><div class="ui_element_sub_section ui_element_sub_section_m" ><?php wpbc_ajx_cstm__ui__template__calendar_unavailable_before_after_bookings_minutes(); ?></div><?php $el_value = 'd'; ?><div class="ui_element"><?php ?><span class="wpbc_ui_control wpbc_ui_button <?php echo $el_id. '_' . $el_value . '__outer_button'; ?>" style="padding-right: 8px;"><?php $params_radio = array( 'id' => $el_id . '_' . $el_value // HTML ID of element , 'name' => $booking_action , 'label' => array( 'title' => ucfirst( __( 'day(s)', 'booking' ) ) , 'position' => 'right' ) , 'style' => 'margin:1px 0 0;' // CSS of select element , 'class' => 'wpbc_radio__set_days_availability' // CSS Class of select element , 'disabled' => false , 'attr' => array() // Any additional attributes, if this radio | checkbox element , 'legend' => '' // aria-label parameter , 'value' => $el_value // Some Value from options array that selected by default //, 'selected' => false //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).is(':checked') , 'in element:' , jQuery( this ) );" // JavaScript code ); wpbc_flex_radio( $params_radio ); ?></span><?php ?></div><?php ?><div class="ui_element_sub_section ui_element_sub_section_d" ><?php wpbc_ajx_cstm__ui__template__calendar_unavailable_before_after_bookings_days(); ?></div><?php ?><p><?php echo '<div id="'.$el_id.'_hint" style="font-weight:400;font-size:11px;margin-top:15px;">' . '<strong>' . __('Important!' ,'booking') . '</strong> ' . __( 'This feature is applying only for bookings for specific timeslots, or if activated check in/out time option.', 'booking' ) .'</div>' ?></p> <?php // Set checked specific Radio button, depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ <?php foreach ( array( '', 'm', 'd' ) as $item_val) { ?> // Change and send Ajax jQuery( '#ui_btn_cstm__set_calendar_unavailable_before_after_bookings_<?php echo $item_val; ?>' ).on( 'change', function ( event ){ <?php // It's required for not send request second time ! ?> jQuery( '#ui_btn_cstm__set_calendar_unavailable_before_after_bookings_<?php echo $item_val; ?>' ).off( 'change' ); wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_in_out', '<?php echo $item_val; ?>' ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' ); jQuery( '.ui_element_sub_section_d,.ui_element_sub_section_m').hide(); if ('m' == '<?php echo $item_val; ?>') { jQuery( '.ui_element_sub_section_m').show(); } if ('d' == '<?php echo $item_val; ?>') { jQuery( '.ui_element_sub_section_d').show(); } return false; } ); <?php // Helper, if we click on button side, and not at radio button or label, then make radio checked. ?> jQuery( '.ui_btn_cstm__set_calendar_unavailable_before_after_bookings_<?php echo $item_val; ?>__outer_button' ).on( 'click', function (){ jQuery( '#ui_btn_cstm__set_calendar_unavailable_before_after_bookings_<?php echo $item_val; ?>' ).prop( "checked", true ).trigger('change'); } ); <?php } ?> // Set checked or not, specific radio buttons jQuery( '#ui_btn_cstm__set_calendar_unavailable_before_after_bookings_' ).prop( 'checked', true ); jQuery( '.ui_element_sub_section_d,.ui_element_sub_section_m').hide(); if ( 'm' == data.ajx_data.calendar_settings.calendar_unavailable.booking_unavailable_extra_in_out ){ jQuery( '#ui_btn_cstm__set_calendar_unavailable_before_after_bookings_m' ).prop( 'checked', true ); jQuery( '.ui_element_sub_section_m').show(); } if ( 'd' == data.ajx_data.calendar_settings.calendar_unavailable.booking_unavailable_extra_in_out ){ jQuery( '#ui_btn_cstm__set_calendar_unavailable_before_after_bookings_d' ).prop( 'checked', true ); jQuery( '.ui_element_sub_section_d').show(); } <?php // Show possible selection in paid versions, while using lower version. if ( ! class_exists( 'wpdev_bk_biz_m' ) ) { ?> jQuery( '.ui_element_sub_section_m').show(); jQuery( '.ui_element_sub_section_d').show(); <?php } ?> } ); <?php if (0) { ?></script><?php } ?> #><?php } function wpbc_ajx_cstm__ui__template__calendar_unavailable_before_after_bookings_minutes(){ $booking_action = 'booking_unavailable_extra_minutes'; $el_id = 'ui_btn_cstm__' . $booking_action; // Options $extra_time = array(); $extra_time[''] = ' - '; foreach ( range( 5, 55 , 5 ) as $extra_num) { // Each 5 minutes $extra_time[ $extra_num . 'm' ] = $extra_num . ' ' . __( 'minutes', 'booking' ); } $extra_time[ '60' . 'm' ] = '1 ' . __( 'hour', 'booking' ); foreach ( range( 65, 115 , 5 ) as $extra_num) { // 1 hour + Each 5 minutes $extra_time[ $extra_num . 'm' ] = '1 ' . __( 'hour', 'booking' ) . ' ' . ($extra_num - 60 ) . ' ' . __( 'minutes', 'booking' ); } foreach ( range( 120, 1380 , 60 ) as $extra_num) { // Each Hour based on minutes $extra_time[ $extra_num . 'm' ] = ($extra_num / 60) . ' ' . __( 'hours', 'booking' ); } $params_select = array( 'id' => $el_id . '_in' // HTML ID of element , 'name' => $el_id . '_in' , 'label' => __( 'Before booking', 'booking' )//'<span class="" style="font-weight:600;">' . __( 'Days', 'booking' ) . ' <em style="color:#888;">(' . __( 'min-max', 'booking' ) . '):</em></span>' , 'style' => 'max-width: 100%;' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $extra_time //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_minutes_in', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_select( $params_select ); ?></div><?php $params_select = array( 'id' => $el_id . '_out' // HTML ID of element , 'name' => $el_id . '_out' , 'label' => __( 'After booking', 'booking' )//'<span class="" style="font-weight:600;">' . __( 'Days', 'booking' ) . ' <em style="color:#888;">(' . __( 'min-max', 'booking' ) . '):</em></span>' , 'style' => 'max-width: 100%;' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $extra_time //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_minutes_out', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_select( $params_select ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#<?php echo $el_id . '_in'; ?> option[value="' + data.ajx_data.calendar_settings.calendar_unavailable.booking_unavailable_extra_minutes_in + '"]' ).prop( 'selected', true ); jQuery( '#<?php echo $el_id . '_out'; ?> option[value="' + data.ajx_data.calendar_settings.calendar_unavailable.booking_unavailable_extra_minutes_out + '"]' ).prop( 'selected', true ); } ); <?php if (0) { ?></script><?php } ?> #><?php } function wpbc_ajx_cstm__ui__template__calendar_unavailable_before_after_bookings_days(){ $booking_action = 'booking_unavailable_extra_days'; $el_id = 'ui_btn_cstm__' . $booking_action; // Options $extra_time = array(); $extra_time[''] = ' - '; foreach ( range( 1, 30 , 1 ) as $extra_num) { // Each Day $extra_time[ $extra_num . 'd' ] = $extra_num . ' ' . __( 'day(s)', 'booking' ); } $params_select = array( 'id' => $el_id . '_in' // HTML ID of element , 'name' => $el_id . '_in' , 'label' => __( 'Before booking', 'booking' )//'<span class="" style="font-weight:600;">' . __( 'Days', 'booking' ) . ' <em style="color:#888;">(' . __( 'min-max', 'booking' ) . '):</em></span>' , 'style' => 'max-width: 100%;' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $extra_time //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_days_in', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_select( $params_select ); ?></div><?php $params_select = array( 'id' => $el_id . '_out' // HTML ID of element , 'name' => $el_id . '_out' , 'label' => __( 'After booking', 'booking' )//'<span class="" style="font-weight:600;">' . __( 'Days', 'booking' ) . ' <em style="color:#888;">(' . __( 'min-max', 'booking' ) . '):</em></span>' , 'style' => 'max-width: 100%;' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $extra_time //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_days_out', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );" ); ?><div class="ui_element ui_element_micro"><?php wpbc_flex_select( $params_select ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#<?php echo $el_id . '_in'; ?> option[value="' + data.ajx_data.calendar_settings.calendar_unavailable.booking_unavailable_extra_days_in + '"]' ).prop( 'selected', true ); jQuery( '#<?php echo $el_id . '_out'; ?> option[value="' + data.ajx_data.calendar_settings.calendar_unavailable.booking_unavailable_extra_days_out + '"]' ).prop( 'selected', true ); } ); <?php if (0) { ?></script><?php } ?> #><?php } /** * Button - Reset Calendar Availability * @return void */ function wpbc_ajx_cstm__ui__calendar_weekdays_availability_reset__btn(){ $params = array( 'type' => 'button' , 'title' => __( 'Reset availability', 'booking' ) . ' ', // Title of the button 'hint' => '',//array( 'title' => __( 'Reset selected options to default values', 'booking' ), 'position' => 'top' ), // Hint 'link' => 'javascript:void(0)', // Direct link or skip it 'action' => "wpbc_ajx_customize_plugin.search_set_param( 'availability__user_unavilable_days', '' ); wpbc_ajx_customize_plugin.search_set_param( 'availability__block_some_dates_from_today', 0 ); wpbc_ajx_customize_plugin.search_set_param( 'availability__wpbc_available_days_num_from_today', '' ); wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_in_out', '' ); wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_minutes_in', '' ); wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_minutes_out', '' ); wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_days_in', '' ); wpbc_ajx_customize_plugin.search_set_param( 'availability__booking_unavailable_extra_days_out', '' ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_weekdays_availability'} ); wpbc_button_enable_loading_icon( this ); wpbc_admin_show_message_processing( '' );", // JavaScript 'icon' => array( 'icon_font' => 'wpbc_icn_close', //'wpbc_icn_rotate_left', wpbc_icn_settings_backup_restore 'position' => 'left', 'icon_img' => '' ), 'class' => 'wpbc_ui_button_danger', // '' | 'wpbc_ui_button_primary' 'style' => '', // Any CSS class here 'mobile_show_text' => true, // Show or hide text, when viewing on Mobile devices (small window size). 'attr' => array( 'id' => 'btn__status_bar__reset' ) ); wpbc_flex_button( $params ); } // </editor-fold> // <editor-fold defaultstate="collapsed" desc=" == Calendar Additional Settings UI == " > /** * Select-box - Number of Months to Scroll * * @return void */ function wpbc_ajx_cstm__ui__template__months_to_scroll(){ $booking_action = 'set_booking_max_monthes_in_calendar'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Number of months to scroll' ,'booking') . ':</span>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php // Options $months_options = array(); for ($mm = 1; $mm < 12; $mm++) { $months_options[ $mm . 'm' ] = $mm . ' ' . __('month(s)' ,'booking'); } for ($yy = 1; $yy < 11; $yy++) { $months_options[ $yy . 'y' ] = $yy . ' ' . __('year(s)' ,'booking'); } $params_select = array( 'id' => $el_id // HTML ID of element , 'name' => $booking_action , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $months_options //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'calendar__booking_max_monthes_in_calendar', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_additional'} ); wpbc_admin_show_message_processing( '' ); " ); wpbc_flex_select( $params_select ); wpbc_ajx_cstm__ui__selectbox_prior_btn( $el_id ); wpbc_ajx_cstm__ui__selectbox_next_btn( $el_id ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#<?php echo $el_id; ?> option[value="' + data.ajx_data.calendar_settings.calendar__booking_max_monthes_in_calendar + '"]' ).prop( 'selected', true ); } ); <?php if (0) { ?></script><?php } ?> #><?php } /** * Select-box - Start week day * * @return void */ function wpbc_ajx_cstm__ui__template__start_day_weeek(){ $booking_action = 'set_booking_start_day_weeek'; $el_id = 'ui_btn_cstm__' . $booking_action ; //if ( ! wpbc_is_user_can( $booking_action, wpbc_get_current_user_id() ) ) { return false; } ?><div class="ui_element ui_nowrap0"><?php wpbc_flex_label( array( 'id' => $el_id , 'label' => '<span class="" style="font-weight:600;">' . __('Start Day of the week' ,'booking') . ':</span>' ) ); ?></div><?php ?><div class="ui_element ui_nowrap"><?php // Options $options = array( '0' => __('Sunday' ,'booking') , '1' => __('Monday' ,'booking') , '2' => __('Tuesday' ,'booking') , '3' => __('Wednesday' ,'booking') , '4' => __('Thursday' ,'booking') , '5' => __('Friday' ,'booking') , '6' => __('Saturday' ,'booking') ); $params_select = array( 'id' => $el_id // HTML ID of element , 'name' => $booking_action , 'label' => '' //__( 'Select the skin of the booking calendar', 'booking' )//__('Calendar Skin', 'booking') , 'style' => '' // CSS of select element , 'class' => '' // CSS Class of select element //, 'multiple' => true //, 'attr' => array( 'value_of_selected_option' => '{{selected_locale_value}}' ) // Any additional attributes, if this radio | checkbox element , 'disabled' => false , 'disabled_options' => array() // If some options disabled, then it has to list here , 'options' => $options //, 'value' => isset( $escaped_search_request_params[ $el_id ] ) ? $escaped_search_request_params[ $el_id ] : $defaults[ $el_id ] // Some Value from options array that selected by default //, 'onfocus' => "console.log( 'ON FOCUS:', jQuery( this ).val(), 'in element:' , jQuery( this ) );" // JavaScript code , 'onchange' => "wpbc_ajx_customize_plugin.search_set_param( 'calendar__booking_start_day_weeek', jQuery(this).val() ); wpbc_ajx_customize_plugin__send_request_with_params( {'do_action': 'save_calendar_additional'} ); wpbc_admin_show_message_processing( '' ); " ); wpbc_flex_select( $params_select ); wpbc_ajx_cstm__ui__selectbox_prior_btn( $el_id ); wpbc_ajx_cstm__ui__selectbox_next_btn( $el_id ); ?></div><?php // Set checked specific OPTION depends on last action from user ?><# <?php if (0) { ?><script type="text/javascript"><?php } ?> jQuery( document ).ready( function (){ // Set selected option in dropdown list based on data. value jQuery( '#<?php echo $el_id; ?> option[value="' + data.ajx_data.calendar_settings.calendar__booking_start_day_weeek + '"]' ).prop( 'selected', true ); } ); <?php if (0) { ?></script><?php } ?> #><?php } // </editor-fold>