"use strict";
// ---------------------------------------------------------------------------------------------------------------------
// == A j a x A d d N e w B o o k i n g ==
// ---------------------------------------------------------------------------------------------------------------------
/**
* Submit new booking
*
* @param params = {
'resource_id' : resource_id,
'dates_ddmmyy_csv' : document.getElementById( 'date_booking' + resource_id ).value,
'formdata' : formdata,
'booking_hash' : my_booking_hash,
'custom_form' : my_booking_form,
'captcha_chalange' : captcha_chalange,
'captcha_user_input' : user_captcha,
'is_emails_send' : is_send_emeils,
'active_locale' : wpdev_active_locale
}
*
*/
function wpbc_ajx_booking__create(params) {
console.groupCollapsed('WPBC_AJX_BOOKING__CREATE');
console.groupCollapsed('== Before Ajax Send ==');
console.log(params);
console.groupEnd();
params = wpbc_captcha__simple__maybe_remove_in_ajx_params(params);
// Trigger hook before sending request to create the booking.
jQuery('body').trigger('wpbc_before_booking_create', [params['resource_id'], params]);
// Start Ajax.
jQuery.post(wpbc_url_ajax, {
action: 'WPBC_AJX_BOOKING__CREATE',
wpbc_ajx_user_id: _wpbc.get_secure_param('user_id'),
nonce: _wpbc.get_secure_param('nonce'),
wpbc_ajx_locale: _wpbc.get_secure_param('locale'),
calendar_request_params: params
/**
* Usually params = { 'resource_id' : resource_id,
* 'dates_ddmmyy_csv' : document.getElementById( 'date_booking' + resource_id ).value,
* 'formdata' : formdata,
* 'booking_hash' : my_booking_hash,
* 'custom_form' : my_booking_form,
*
* 'captcha_chalange' : captcha_chalange,
* 'user_captcha' : user_captcha,
*
* 'is_emails_send' : is_send_emeils,
* 'active_locale' : wpdev_active_locale
* }
*/
},
/**
* 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_BOOKING__CREATE == ');
for (var obj_key in response_data) {
console.groupCollapsed('==' + obj_key + '==');
console.log(' : ' + obj_key + ' : ', response_data[obj_key]);
console.groupEnd();
}
console.groupEnd();
//
// -------------------------------------------------------------------------------------------------
// This section execute, when server response with String instead of Object -- Usually it's because of mistake in code !
// -------------------------------------------------------------------------------------------------
if (typeof response_data !== 'object' || response_data === null) {
var calendar_id = wpbc_get_resource_id__from_ajx_post_data_url(this.data);
var jq_node = '#booking_form' + calendar_id;
if ('' == response_data) {
response_data = '' + 'Error! Server respond with empty string!' + ' ';
}
// Show Message
wpbc_front_end__show_message(response_data, {
'type': 'error',
'show_here': {
'jq_node': jq_node,
'where': 'after'
},
'is_append': true,
'style': 'text-align:left;',
'delay': 0
});
// Enable Submit | Hide spin loader
wpbc_booking_form__on_response__ui_elements_enable(calendar_id);
return;
}
//
//
// -------------------------------------------------------------------------------------------------
// This section execute, when we have KNOWN errors from Booking Calendar
// -------------------------------------------------------------------------------------------------
if ('ok' != response_data['ajx_data']['status']) {
switch (response_data['ajx_data']['status_error']) {
case 'captcha_simple_wrong':
wpbc_captcha__simple__update({
'resource_id': response_data['resource_id'],
'url': response_data['ajx_data']['captcha__simple']['url'],
'challenge': response_data['ajx_data']['captcha__simple']['challenge'],
'message': response_data['ajx_data']['ajx_after_action_message']
});
break;
case 'resource_id_incorrect':
// Show Error Message - incorrect booking resource ID during submit of booking.
var message_id = wpbc_front_end__show_message(response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g, "
"), {
'type': 'undefined' !== typeof response_data['ajx_data']['ajx_after_action_message_status'] ? response_data['ajx_data']['ajx_after_action_message_status'] : 'warning',
'delay': 0,
'show_here': {
'where': 'after',
'jq_node': '#booking_form' + params['resource_id']
}
});
break;
case 'booking_can_not_save':
// We can not save booking, because dates are booked or can not save in same booking resource all the dates
var message_id = wpbc_front_end__show_message(response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g, "
"), {
'type': 'undefined' !== typeof response_data['ajx_data']['ajx_after_action_message_status'] ? response_data['ajx_data']['ajx_after_action_message_status'] : 'warning',
'delay': 0,
'show_here': {
'where': 'after',
'jq_node': '#booking_form' + params['resource_id']
}
});
// Enable Submit | Hide spin loader
wpbc_booking_form__on_response__ui_elements_enable(response_data['resource_id']);
break;
default:
//
// --------------------------------------------------------------------------------------------------------------------------------
if ('undefined' !== typeof response_data['ajx_data']['ajx_after_action_message'] && '' != response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g, "
")) {
var calendar_id = wpbc_get_resource_id__from_ajx_post_data_url(this.data);
var jq_node = '#booking_form' + calendar_id;
var ajx_after_booking_message = response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g, "
");
console.log(ajx_after_booking_message);
wpbc_front_end__show_message(ajx_after_booking_message, {
'type': 'undefined' !== typeof response_data['ajx_data']['ajx_after_action_message_status'] ? response_data['ajx_data']['ajx_after_action_message_status'] : 'warning',
'delay': 0,
'show_here': {
'jq_node': jq_node,
'where': 'after'
}
});
}
//
}
// -------------------------------------------------------------------------------------------------
// Reactivate calendar again ?
// -------------------------------------------------------------------------------------------------
// Enable Submit | Hide spin loader
wpbc_booking_form__on_response__ui_elements_enable(response_data['resource_id']);
// Unselect dates
wpbc_calendar__unselect_all_dates(response_data['resource_id']);
// 'resource_id' => $params['resource_id'],
// 'booking_hash' => $booking_hash,
// 'request_uri' => $_SERVER['REQUEST_URI'], // Is it the same as window.location.href or
// 'custom_form' => $params['custom_form'], // Optional.
// 'aggregate_resource_id_str' => implode( ',', $params['aggregate_resource_id_arr'] ) // Optional. Resource ID from aggregate parameter in shortcode.
// Load new data in calendar.
wpbc_calendar__load_data__ajx({
'resource_id': response_data['resource_id'] // It's from response ...AJX_BOOKING__CREATE of initial sent resource_id
,
'booking_hash': response_data['ajx_cleaned_params']['booking_hash'] // ?? we can not use it, because HASH chnaged in any case!
,
'request_uri': response_data['ajx_cleaned_params']['request_uri'],
'custom_form': response_data['ajx_cleaned_params']['custom_form']
// Aggregate booking resources, if any ?
,
'aggregate_resource_id_str': _wpbc.booking__get_param_value(response_data['resource_id'], 'aggregate_resource_id_arr').join(',')
});
// Exit
return;
}
//
/*
// Show Calendar
wpbc_calendar__loading__stop( response_data[ 'resource_id' ] );
// -------------------------------------------------------------------------------------------------
// Bookings - Dates
_wpbc.bookings_in_calendar__set_dates( response_data[ 'resource_id' ], response_data[ 'ajx_data' ]['dates'] );
// Bookings - Child or only single booking resource in dates
_wpbc.booking__set_param_value( response_data[ 'resource_id' ], 'resources_id_arr__in_dates', response_data[ 'ajx_data' ][ 'resources_id_arr__in_dates' ] );
// -------------------------------------------------------------------------------------------------
// Update calendar
wpbc_calendar__update_look( response_data[ 'resource_id' ] );
*/
// Hide spin loader
wpbc_booking_form__spin_loader__hide(response_data['resource_id']);
// Hide booking form
wpbc_booking_form__animated__hide(response_data['resource_id']);
// Show Confirmation | Payment section
wpbc_show_thank_you_message_after_booking(response_data);
// Trigger hook after a booking was created or updated successfully.
jQuery('body').trigger('wpbc_booking_form_submit_success', [response_data['resource_id'], response_data, params]);
setTimeout(function () {
wpbc_do_scroll('#wpbc_scroll_point_' + response_data['resource_id'], 10);
}, 500);
}).fail(
//
function (jqXHR, textStatus, errorThrown) {
if (window.console && window.console.log) {
console.log('Ajax_Error', jqXHR, textStatus, errorThrown);
}
// -------------------------------------------------------------------------------------------------
// This section execute, when NONCE field was not passed or some error happened at server!
// -------------------------------------------------------------------------------------------------
// Get Content of Error Message
var error_message = '' + 'Error!' + ' ' + errorThrown;
if (jqXHR.status) {
error_message += ' (' + jqXHR.status + ')';
if (403 == jqXHR.status) {
error_message += '
Probably nonce for this page has been expired. Please reload the page.';
error_message += '
Otherwise, please check this troubleshooting instruction.
';
}
}
if (jqXHR.responseText) {
// Escape tags in Error message
error_message += '
Response' + jqXHR.responseText.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'") + '
';
}
error_message = error_message.replace(/\n/g, "
");
var calendar_id = wpbc_get_resource_id__from_ajx_post_data_url(this.data);
var jq_node = '#booking_form' + calendar_id;
// Show Message
wpbc_front_end__show_message(error_message, {
'type': 'error',
'show_here': {
'jq_node': jq_node,
'where': 'after'
},
'is_append': true,
'style': 'text-align:left;',
'delay': 0
});
// Enable Submit | Hide spin loader
wpbc_booking_form__on_response__ui_elements_enable(calendar_id);
}
//
)
// .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
return true;
}
//
/**
* Update image in captcha and show warning message
*
* @param params
*
* Example of 'params' : {
* 'resource_id': response_data[ 'resource_id' ],
* 'url' : response_data[ 'ajx_data' ][ 'captcha__simple' ][ 'url' ],
* 'challenge' : response_data[ 'ajx_data' ][ 'captcha__simple' ][ 'challenge' ],
* 'message' : response_data[ 'ajx_data' ][ 'ajx_after_action_message' ].replace( /\n/g, "
" )
* }
*/
function wpbc_captcha__simple__update(params) {
document.getElementById('captcha_input' + params['resource_id']).value = '';
document.getElementById('captcha_img' + params['resource_id']).src = params['url'];
document.getElementById('wpdev_captcha_challenge_' + params['resource_id']).value = params['challenge'];
// Show warning After CAPTCHA Img
var message_id = wpbc_front_end__show_message__warning('#captcha_input' + params['resource_id'] + ' + img', params['message'], 'text');
// Animate
jQuery('#' + message_id + ', ' + '#captcha_input' + params['resource_id']).fadeOut(350).fadeIn(300).fadeOut(350).fadeIn(400).animate({
opacity: 1
}, 4000);
// Focus text field
jQuery('#captcha_input' + params['resource_id']).trigger('focus'); // FixIn: 8.7.11.12.
// Enable Submit | Hide spin loader
wpbc_booking_form__on_response__ui_elements_enable(params['resource_id']);
}
/**
* If the captcha elements not exist in the booking form, then remove parameters relative captcha
* @param params
* @returns obj
*/
function wpbc_captcha__simple__maybe_remove_in_ajx_params(params) {
if (!wpbc_captcha__simple__is_exist_in_form(params['resource_id'])) {
delete params['captcha_chalange'];
delete params['captcha_user_input'];
}
return params;
}
/**
* Check if CAPTCHA exist in the booking form
* @param resource_id
* @returns {boolean}
*/
function wpbc_captcha__simple__is_exist_in_form(resource_id) {
return 0 !== jQuery('#wpdev_captcha_challenge_' + resource_id).length || 0 !== jQuery('#captcha_input' + resource_id).length;
}
//
//
/**
* Disable Send button | Show Spin Loader
*
* @param resource_id
*/
function wpbc_booking_form__on_submit__ui_elements_disable(resource_id) {
// Disable Submit
wpbc_booking_form__send_button__disable(resource_id);
// Show Spin loader in booking form
wpbc_booking_form__spin_loader__show(resource_id);
}
/**
* Enable Send button | Hide Spin Loader
*
* @param resource_id
*/
function wpbc_booking_form__on_response__ui_elements_enable(resource_id) {
// Enable Submit
wpbc_booking_form__send_button__enable(resource_id);
// Hide Spin loader in booking form
wpbc_booking_form__spin_loader__hide(resource_id);
}
/**
* Enable Submit button
* @param resource_id
*/
function wpbc_booking_form__send_button__enable(resource_id) {
// Activate Send button
jQuery('#booking_form_div' + resource_id + ' input[type=button]').prop("disabled", false);
jQuery('#booking_form_div' + resource_id + ' button').prop("disabled", false);
}
/**
* Disable Submit button and show spin
*
* @param resource_id
*/
function wpbc_booking_form__send_button__disable(resource_id) {
// Disable Send button
jQuery('#booking_form_div' + resource_id + ' input[type=button]').prop("disabled", true);
jQuery('#booking_form_div' + resource_id + ' button').prop("disabled", true);
}
/**
* Disable 'This' button
*
* @param _this
*/
function wpbc_booking_form__this_button__disable(_this) {
// Disable Send button
jQuery(_this).prop("disabled", true);
}
/**
* Show booking form Spin Loader
* @param resource_id
*/
function wpbc_booking_form__spin_loader__show(resource_id) {
var $form_container = jQuery('#booking_form_div' + resource_id);
var loader_text = 'Saving';
if ('undefined' !== typeof _wpbc && _wpbc.get_message) {
loader_text = _wpbc.get_message('message_booking_saving') || loader_text;
}
var loader_html = '';
// Remove any previous inline loader before adding the submit overlay.
jQuery('#wpbc_booking_form_spin_loader' + resource_id).remove();
if ($form_container.length && $form_container.is(':visible')) {
$form_container.addClass('wpbc_booking_form_is_submitting');
$form_container.prepend(loader_html);
return;
}
// Fallback for any unexpected legacy markup without #booking_form_div{resource_id}.
jQuery('#booking_form' + resource_id).after('');
}
/**
* Remove / Hide booking form Spin Loader
* @param resource_id
*/
function wpbc_booking_form__spin_loader__hide(resource_id) {
// Remove Spin Loader
jQuery('#wpbc_booking_form_spin_loader' + resource_id).remove();
jQuery('#booking_form_div' + resource_id).removeClass('wpbc_booking_form_is_submitting');
}
/**
* Hide booking form wth animation
*
* @param resource_id
*/
function wpbc_booking_form__animated__hide(resource_id) {
jQuery('#booking_form' + resource_id).hide();
}
//
//
/**
*
* @param parent_html_id
*/
/**
* Show micro Spin Loader
*
* @param id ID of Loader, for later hide it by using wpbc__spin_loader__micro__hide( id ) OR wpbc__spin_loader__mini__hide( id )
* @param jq_node_where_insert such as '#estimate_booking_night_cost_hint10' OR '.estimate_booking_night_cost_hint10'
*/
function wpbc__spin_loader__micro__show__inside(id, jq_node_where_insert) {
wpbc__spin_loader__mini__show(id, {
'color': '#444',
'show_here': {
'where': 'inside',
'jq_node': jq_node_where_insert
},
'style': 'position: relative;display: inline-flex;flex-flow: column nowrap;justify-content: center;align-items: center;margin: 7px 12px;',
'class': 'wpbc_one_spin_loader_micro'
});
}
/**
* Remove spinner
* @param id
*/
function wpbc__spin_loader__micro__hide(id) {
wpbc__spin_loader__mini__hide(id);
}
/**
* Show mini Spin Loader
* @param parent_html_id
*/
function wpbc__spin_loader__mini__show(parent_html_id, params = {}) {
var params_default = {
'color': '#0071ce',
'show_here': {
'jq_node': '',
// any jQuery node definition
'where': 'after' // 'inside' | 'before' | 'after' | 'right' | 'left'
},
'style': 'position: relative;min-height: 2.8rem;',
'class': 'wpbc_one_spin_loader_mini 0wpbc_spin_loader_one_new'
};
for (var p_key in params) {
params_default[p_key] = params[p_key];
}
params = params_default;
if ('undefined' !== typeof params['color'] && '' != params['color']) {
params['color'] = 'border-color:' + params['color'] + ';';
}
var spinner_html = '';
if ('' == params['show_here']['jq_node']) {
params['show_here']['jq_node'] = '#' + parent_html_id;
}
// Show Spin Loader
if ('after' == params['show_here']['where']) {
jQuery(params['show_here']['jq_node']).after(spinner_html);
} else {
jQuery(params['show_here']['jq_node']).html(spinner_html);
}
}
/**
* Remove / Hide mini Spin Loader
* @param parent_html_id
*/
function wpbc__spin_loader__mini__hide(parent_html_id) {
// Remove Spin Loader
jQuery('#wpbc_mini_spin_loader' + parent_html_id).remove();
}
//
//TODO: what about showing only Thank you. message without payment forms.
/**
* Show 'Thank you'. message and payment forms
*
* @param response_data
*/
function wpbc_show_thank_you_message_after_booking(response_data) {
if ('undefined' !== typeof response_data['ajx_confirmation']['ty_is_redirect'] && 'undefined' !== typeof response_data['ajx_confirmation']['ty_url'] && 'page' == response_data['ajx_confirmation']['ty_is_redirect'] && '' != response_data['ajx_confirmation']['ty_url']) {
jQuery('body').trigger('wpbc_booking_created', [response_data['resource_id'], response_data]); // FixIn: 10.0.0.30.
window.location.href = response_data['ajx_confirmation']['ty_url'];
return;
}
var resource_id = response_data['resource_id'];
var confirm_content = '';
if ('undefined' === typeof response_data['ajx_confirmation']['ty_message']) {
response_data['ajx_confirmation']['ty_message'] = '';
}
if ('undefined' === typeof response_data['ajx_confirmation']['ty_payment_payment_description']) {
response_data['ajx_confirmation']['ty_payment_payment_description'] = '';
}
if ('undefined' === typeof response_data['ajx_confirmation']['payment_cost']) {
response_data['ajx_confirmation']['payment_cost'] = '';
}
if ('undefined' === typeof response_data['ajx_confirmation']['ty_payment_gateways']) {
response_data['ajx_confirmation']['ty_payment_gateways'] = '';
}
var ty_message_hide = '' == response_data['ajx_confirmation']['ty_message'] ? 'wpbc_ty_hide' : '';
var ty_payment_payment_description_hide = '' == response_data['ajx_confirmation']['ty_payment_payment_description'].replace(/\\n/g, '') ? 'wpbc_ty_hide' : '';
var ty_booking_costs_hide = '' == response_data['ajx_confirmation']['payment_cost'] ? 'wpbc_ty_hide' : '';
var ty_payment_gateways_hide = '' == response_data['ajx_confirmation']['ty_payment_gateways'].replace(/\\n/g, '') ? 'wpbc_ty_hide' : '';
if ('wpbc_ty_hide' != ty_payment_gateways_hide) {
jQuery('.wpbc_ty__content_text.wpbc_ty__content_gateways').html(''); // Reset all other possible gateways before showing new one.
}
confirm_content += `
`;
confirm_content += ` `;
confirm_content += `
${response_data['ajx_confirmation']['ty_message']}
`;
confirm_content += `
`;
if ('' !== response_data['ajx_confirmation']['ty_message_booking_id']) {
confirm_content += ` `;
}
confirm_content += `
`;
confirm_content += `
${response_data['ajx_confirmation']['ty_payment_payment_description'].replace(/\\n/g, '')}
`;
if ('' !== response_data['ajx_confirmation']['ty_customer_details']) {
confirm_content += `
${response_data['ajx_confirmation']['ty_customer_details']}
`;
}
if ('' !== response_data['ajx_confirmation']['ty_booking_details']) {
confirm_content += `
${response_data['ajx_confirmation']['ty_booking_details']}
`;
}
confirm_content += `
${response_data['ajx_confirmation']['ty_booking_costs']}
`;
confirm_content += `
${response_data['ajx_confirmation']['ty_payment_gateways'].replace(/\\n/g, '').replace(/ajax_script/gi, 'script')}
`;
confirm_content += `
`;
confirm_content += `
`;
confirm_content += `
`;
jQuery('#booking_form' + resource_id).after(confirm_content);
//FixIn: 10.0.0.30 // event name // Resource ID - '1'
jQuery('body').trigger('wpbc_booking_created', [resource_id, response_data]);
// To catch this event: jQuery( 'body' ).on('wpbc_booking_created', function( event, resource_id, params ) { console.log( event, resource_id, params ); } );
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvX2NhcGFjaXR5L19vdXQvY3JlYXRlX2Jvb2tpbmcuanMiLCJuYW1lcyI6WyJ3cGJjX2FqeF9ib29raW5nX19jcmVhdGUiLCJwYXJhbXMiLCJjb25zb2xlIiwiZ3JvdXBDb2xsYXBzZWQiLCJsb2ciLCJncm91cEVuZCIsIndwYmNfY2FwdGNoYV9fc2ltcGxlX19tYXliZV9yZW1vdmVfaW5fYWp4X3BhcmFtcyIsImpRdWVyeSIsInRyaWdnZXIiLCJwb3N0Iiwid3BiY191cmxfYWpheCIsImFjdGlvbiIsIndwYmNfYWp4X3VzZXJfaWQiLCJfd3BiYyIsImdldF9zZWN1cmVfcGFyYW0iLCJub25jZSIsIndwYmNfYWp4X2xvY2FsZSIsImNhbGVuZGFyX3JlcXVlc3RfcGFyYW1zIiwicmVzcG9uc2VfZGF0YSIsInRleHRTdGF0dXMiLCJqcVhIUiIsIm9ial9rZXkiLCJjYWxlbmRhcl9pZCIsIndwYmNfZ2V0X3Jlc291cmNlX2lkX19mcm9tX2FqeF9wb3N0X2RhdGFfdXJsIiwiZGF0YSIsImpxX25vZGUiLCJ3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlIiwid3BiY19ib29raW5nX2Zvcm1fX29uX3Jlc3BvbnNlX191aV9lbGVtZW50c19lbmFibGUiLCJ3cGJjX2NhcHRjaGFfX3NpbXBsZV9fdXBkYXRlIiwibWVzc2FnZV9pZCIsInJlcGxhY2UiLCJhanhfYWZ0ZXJfYm9va2luZ19tZXNzYWdlIiwid3BiY19jYWxlbmRhcl9fdW5zZWxlY3RfYWxsX2RhdGVzIiwid3BiY19jYWxlbmRhcl9fbG9hZF9kYXRhX19hangiLCJib29raW5nX19nZXRfcGFyYW1fdmFsdWUiLCJqb2luIiwid3BiY19ib29raW5nX2Zvcm1fX3NwaW5fbG9hZGVyX19oaWRlIiwid3BiY19ib29raW5nX2Zvcm1fX2FuaW1hdGVkX19oaWRlIiwid3BiY19zaG93X3RoYW5rX3lvdV9tZXNzYWdlX2FmdGVyX2Jvb2tpbmciLCJzZXRUaW1lb3V0Iiwid3BiY19kb19zY3JvbGwiLCJmYWlsIiwiZXJyb3JUaHJvd24iLCJ3aW5kb3ciLCJlcnJvcl9tZXNzYWdlIiwic3RhdHVzIiwicmVzcG9uc2VUZXh0IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInZhbHVlIiwic3JjIiwid3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fd2FybmluZyIsImZhZGVPdXQiLCJmYWRlSW4iLCJhbmltYXRlIiwib3BhY2l0eSIsIndwYmNfY2FwdGNoYV9fc2ltcGxlX19pc19leGlzdF9pbl9mb3JtIiwicmVzb3VyY2VfaWQiLCJsZW5ndGgiLCJ3cGJjX2Jvb2tpbmdfZm9ybV9fb25fc3VibWl0X191aV9lbGVtZW50c19kaXNhYmxlIiwid3BiY19ib29raW5nX2Zvcm1fX3NlbmRfYnV0dG9uX19kaXNhYmxlIiwid3BiY19ib29raW5nX2Zvcm1fX3NwaW5fbG9hZGVyX19zaG93Iiwid3BiY19ib29raW5nX2Zvcm1fX3NlbmRfYnV0dG9uX19lbmFibGUiLCJwcm9wIiwid3BiY19ib29raW5nX2Zvcm1fX3RoaXNfYnV0dG9uX19kaXNhYmxlIiwiX3RoaXMiLCIkZm9ybV9jb250YWluZXIiLCJsb2FkZXJfdGV4dCIsImdldF9tZXNzYWdlIiwibG9hZGVyX2h0bWwiLCJyZW1vdmUiLCJpcyIsImFkZENsYXNzIiwicHJlcGVuZCIsImFmdGVyIiwicmVtb3ZlQ2xhc3MiLCJoaWRlIiwid3BiY19fc3Bpbl9sb2FkZXJfX21pY3JvX19zaG93X19pbnNpZGUiLCJpZCIsImpxX25vZGVfd2hlcmVfaW5zZXJ0Iiwid3BiY19fc3Bpbl9sb2FkZXJfX21pbmlfX3Nob3ciLCJ3cGJjX19zcGluX2xvYWRlcl9fbWljcm9fX2hpZGUiLCJ3cGJjX19zcGluX2xvYWRlcl9fbWluaV9faGlkZSIsInBhcmVudF9odG1sX2lkIiwicGFyYW1zX2RlZmF1bHQiLCJwX2tleSIsInNwaW5uZXJfaHRtbCIsImh0bWwiLCJsb2NhdGlvbiIsImhyZWYiLCJjb25maXJtX2NvbnRlbnQiLCJ0eV9tZXNzYWdlX2hpZGUiLCJ0eV9wYXltZW50X3BheW1lbnRfZGVzY3JpcHRpb25faGlkZSIsInR5X2Jvb2tpbmdfY29zdHNfaGlkZSIsInR5X3BheW1lbnRfZ2F0ZXdheXNfaGlkZSJdLCJzb3VyY2VzIjpbImluY2x1ZGVzL19jYXBhY2l0eS9fc3JjL2NyZWF0ZV9ib29raW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09ICBBIGogYSB4ICAgIEEgZCBkICAgIE4gZSB3ICAgIEIgbyBvIGsgaSBuIGcgID09XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcbi8qKlxyXG4gKiBTdWJtaXQgbmV3IGJvb2tpbmdcclxuICpcclxuICogQHBhcmFtIHBhcmFtcyAgID0gICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzb3VyY2VfaWQnICAgICAgICA6IHJlc291cmNlX2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRlc19kZG1teXlfY3N2JyAgIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdkYXRlX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9ybWRhdGEnICAgICAgICAgICA6IGZvcm1kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib29raW5nX2hhc2gnICAgICAgIDogbXlfYm9va2luZ19oYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b21fZm9ybScgICAgICAgIDogbXlfYm9va2luZ19mb3JtLFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FwdGNoYV9jaGFsYW5nZScgICA6IGNhcHRjaGFfY2hhbGFuZ2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhcHRjaGFfdXNlcl9pbnB1dCcgOiB1c2VyX2NhcHRjaGEsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc19lbWFpbHNfc2VuZCcgICAgIDogaXNfc2VuZF9lbWVpbHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGl2ZV9sb2NhbGUnICAgICAgOiB3cGRldl9hY3RpdmVfbG9jYWxlXHJcblx0XHRcdFx0XHRcdH1cclxuICpcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2Jvb2tpbmdfX2NyZWF0ZSggcGFyYW1zICl7XHJcblxyXG5cdGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoICdXUEJDX0FKWF9CT09LSU5HX19DUkVBVEUnICk7XHJcblx0Y29uc29sZS5ncm91cENvbGxhcHNlZCggJz09IEJlZm9yZSBBamF4IFNlbmQgPT0nICk7XHJcblx0Y29uc29sZS5sb2coIHBhcmFtcyApO1xyXG5cdGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuXHJcblx0cGFyYW1zID0gd3BiY19jYXB0Y2hhX19zaW1wbGVfX21heWJlX3JlbW92ZV9pbl9hanhfcGFyYW1zKCBwYXJhbXMgKTtcclxuXHJcblx0Ly8gVHJpZ2dlciBob29rICBiZWZvcmUgc2VuZGluZyByZXF1ZXN0ICB0byAgY3JlYXRlIHRoZSBib29raW5nLlxyXG5cdGpRdWVyeSggJ2JvZHknICkudHJpZ2dlciggJ3dwYmNfYmVmb3JlX2Jvb2tpbmdfY3JlYXRlJywgWyBwYXJhbXNbJ3Jlc291cmNlX2lkJ10sIHBhcmFtcyBdICk7XHJcblxyXG5cdC8vIFN0YXJ0IEFqYXguXHJcblx0alF1ZXJ5LnBvc3QoIHdwYmNfdXJsX2FqYXgsXHJcblx0XHR7XHJcblx0XHRcdGFjdGlvbiAgICAgICAgICAgICAgICAgOiAnV1BCQ19BSlhfQk9PS0lOR19fQ1JFQVRFJyxcclxuXHRcdFx0d3BiY19hanhfdXNlcl9pZCAgICAgICA6IF93cGJjLmdldF9zZWN1cmVfcGFyYW0oICd1c2VyX2lkJyApLFxyXG5cdFx0XHRub25jZSAgICAgICAgICAgICAgICAgIDogX3dwYmMuZ2V0X3NlY3VyZV9wYXJhbSggJ25vbmNlJyApLFxyXG5cdFx0XHR3cGJjX2FqeF9sb2NhbGUgICAgICAgIDogX3dwYmMuZ2V0X3NlY3VyZV9wYXJhbSggJ2xvY2FsZScgKSxcclxuXHRcdFx0Y2FsZW5kYXJfcmVxdWVzdF9wYXJhbXM6IHBhcmFtcyxcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqICBVc3VhbGx5ICBwYXJhbXMgPSB7ICdyZXNvdXJjZV9pZCcgICAgICAgIDogcmVzb3VyY2VfaWQsXHJcblx0XHRcdCAqXHRcdFx0XHRcdFx0J2RhdGVzX2RkbW15eV9jc3YnICAgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2RhdGVfYm9va2luZycgKyByZXNvdXJjZV9pZCApLnZhbHVlLFxyXG5cdFx0XHQgKlx0XHRcdFx0XHRcdCdmb3JtZGF0YScgICAgICAgICAgIDogZm9ybWRhdGEsXHJcblx0XHRcdCAqXHRcdFx0XHRcdFx0J2Jvb2tpbmdfaGFzaCcgICAgICAgOiBteV9ib29raW5nX2hhc2gsXHJcblx0XHRcdCAqXHRcdFx0XHRcdFx0J2N1c3RvbV9mb3JtJyAgICAgICAgOiBteV9ib29raW5nX2Zvcm0sXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqXHRcdFx0XHRcdFx0J2NhcHRjaGFfY2hhbGFuZ2UnICAgOiBjYXB0Y2hhX2NoYWxhbmdlLFxyXG5cdFx0XHQgKlx0XHRcdFx0XHRcdCd1c2VyX2NhcHRjaGEnICAgICAgIDogdXNlcl9jYXB0Y2hhLFxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKlx0XHRcdFx0XHRcdCdpc19lbWFpbHNfc2VuZCcgICAgIDogaXNfc2VuZF9lbWVpbHMsXHJcblx0XHRcdCAqXHRcdFx0XHRcdFx0J2FjdGl2ZV9sb2NhbGUnICAgICAgOiB3cGRldl9hY3RpdmVfbG9jYWxlXHJcblx0XHRcdCAqXHRcdFx0XHR9XHJcblx0XHRcdCAqL1xyXG5cdFx0fSxcclxuXHJcblx0XHRcdFx0LyoqXHJcblx0XHRcdFx0ICogUyB1IGMgYyBlIHMgc1xyXG5cdFx0XHRcdCAqXHJcblx0XHRcdFx0ICogQHBhcmFtIHJlc3BvbnNlX2RhdGFcdFx0LVx0aXRzIG9iamVjdCByZXR1cm5lZCBmcm9tICBBamF4IC0gY2xhc3MtbGl2ZS1zZWFyY2cucGhwXHJcblx0XHRcdFx0ICogQHBhcmFtIHRleHRTdGF0dXNcdFx0LVx0J3N1Y2Nlc3MnXHJcblx0XHRcdFx0ICogQHBhcmFtIGpxWEhSXHRcdFx0XHQtXHRPYmplY3RcclxuXHRcdFx0XHQgKi9cclxuXHRcdFx0XHRmdW5jdGlvbiAoIHJlc3BvbnNlX2RhdGEsIHRleHRTdGF0dXMsIGpxWEhSICkge1xyXG5jb25zb2xlLmxvZyggJyA9PSBSZXNwb25zZSBXUEJDX0FKWF9CT09LSU5HX19DUkVBVEUgPT0gJyApO1xyXG5mb3IgKCB2YXIgb2JqX2tleSBpbiByZXNwb25zZV9kYXRhICl7XHJcblx0Y29uc29sZS5ncm91cENvbGxhcHNlZCggJz09JyArIG9ial9rZXkgKyAnPT0nICk7XHJcblx0Y29uc29sZS5sb2coICcgOiAnICsgb2JqX2tleSArICcgOiAnLCByZXNwb25zZV9kYXRhWyBvYmpfa2V5IF0gKTtcclxuXHRjb25zb2xlLmdyb3VwRW5kKCk7XHJcbn1cclxuY29uc29sZS5ncm91cEVuZCgpO1xyXG5cclxuXHJcblx0XHRcdFx0XHQvLyA8ZWRpdG9yLWZvbGQgICAgIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiICAgICBkZXNjPVwiID0gRXJyb3IgTWVzc2FnZSEgU2VydmVyIHJlc3BvbnNlIHdpdGggU3RyaW5nLiAgLT4gIEVfWF9JX1QgIFwiICA+XHJcblx0XHRcdFx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHRcdFx0XHQvLyBUaGlzIHNlY3Rpb24gZXhlY3V0ZSwgIHdoZW4gc2VydmVyIHJlc3BvbnNlIHdpdGggIFN0cmluZyBpbnN0ZWFkIG9mIE9iamVjdCAtLSBVc3VhbGx5ICBpdCdzIGJlY2F1c2Ugb2YgbWlzdGFrZSBpbiBjb2RlICFcclxuXHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0XHRcdGlmICggKHR5cGVvZiByZXNwb25zZV9kYXRhICE9PSAnb2JqZWN0JykgfHwgKHJlc3BvbnNlX2RhdGEgPT09IG51bGwpICl7XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgY2FsZW5kYXJfaWQgPSB3cGJjX2dldF9yZXNvdXJjZV9pZF9fZnJvbV9hanhfcG9zdF9kYXRhX3VybCggdGhpcy5kYXRhICk7XHJcblx0XHRcdFx0XHRcdHZhciBqcV9ub2RlID0gJyNib29raW5nX2Zvcm0nICsgY2FsZW5kYXJfaWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoICcnID09IHJlc3BvbnNlX2RhdGEgKXtcclxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZV9kYXRhID0gJzxzdHJvbmc+JyArICdFcnJvciEgU2VydmVyIHJlc3BvbmQgd2l0aCBlbXB0eSBzdHJpbmchJyArICc8L3N0cm9uZz4gJyA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0Ly8gU2hvdyBNZXNzYWdlXHJcblx0XHRcdFx0XHRcdHdwYmNfZnJvbnRfZW5kX19zaG93X21lc3NhZ2UoIHJlc3BvbnNlX2RhdGEgLCB7ICd0eXBlJyAgICAgOiAnZXJyb3InLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2hvd19oZXJlJzogeydqcV9ub2RlJzoganFfbm9kZSwgJ3doZXJlJzogJ2FmdGVyJ30sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdpc19hcHBlbmQnOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc3R5bGUnICAgIDogJ3RleHQtYWxpZ246bGVmdDsnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGVsYXknICAgIDogMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdFx0XHQvLyBFbmFibGUgU3VibWl0IHwgSGlkZSBzcGluIGxvYWRlclxyXG5cdFx0XHRcdFx0XHR3cGJjX2Jvb2tpbmdfZm9ybV9fb25fcmVzcG9uc2VfX3VpX2VsZW1lbnRzX2VuYWJsZSggY2FsZW5kYXJfaWQgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8gPC9lZGl0b3ItZm9sZD5cclxuXHJcblxyXG5cdFx0XHRcdFx0Ly8gPGVkaXRvci1mb2xkICAgICBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiAgICAgZGVzYz1cIiAgPT0gIFRoaXMgc2VjdGlvbiBleGVjdXRlLCAgd2hlbiB3ZSBoYXZlIEtOT1dOIGVycm9ycyBmcm9tIEJvb2tpbmcgQ2FsZW5kYXIuICAtPiAgRV9YX0lfVCAgXCIgID5cclxuXHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0XHRcdC8vIFRoaXMgc2VjdGlvbiBleGVjdXRlLCAgd2hlbiB3ZSBoYXZlIEtOT1dOIGVycm9ycyBmcm9tIEJvb2tpbmcgQ2FsZW5kYXJcclxuXHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0XHRcdFx0XHRpZiAoICdvaycgIT0gcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnc3RhdHVzJyBdICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3dpdGNoICggcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnc3RhdHVzX2Vycm9yJyBdICl7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2NhcHRjaGFfc2ltcGxlX3dyb25nJzpcclxuXHRcdFx0XHRcdFx0XHRcdHdwYmNfY2FwdGNoYV9fc2ltcGxlX191cGRhdGUoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncmVzb3VyY2VfaWQnOiByZXNwb25zZV9kYXRhWyAncmVzb3VyY2VfaWQnIF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3VybCcgICAgICAgIDogcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnY2FwdGNoYV9fc2ltcGxlJyBdWyAndXJsJyBdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdjaGFsbGVuZ2UnICA6IHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2NhcHRjaGFfX3NpbXBsZScgXVsgJ2NoYWxsZW5nZScgXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J21lc3NhZ2UnICAgIDogcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9tZXNzYWdlJyBdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgJ3Jlc291cmNlX2lkX2luY29ycmVjdCc6XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTaG93IEVycm9yIE1lc3NhZ2UgLSBpbmNvcnJlY3QgIGJvb2tpbmcgcmVzb3VyY2UgSUQgZHVyaW5nIHN1Ym1pdCBvZiBib29raW5nLlxyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIG1lc3NhZ2VfaWQgPSB3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlKCByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdhanhfYWZ0ZXJfYWN0aW9uX21lc3NhZ2UnIF0ucmVwbGFjZSggL1xcbi9nLCBcIjxiciAvPlwiICksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3R5cGUnIDogKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgKHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZV9zdGF0dXMnIF0pKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9tZXNzYWdlX3N0YXR1cycgXSA6ICd3YXJuaW5nJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkZWxheScgICAgOiAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3Nob3dfaGVyZSc6IHsgJ3doZXJlJzogJ2FmdGVyJywgJ2pxX25vZGUnOiAnI2Jvb2tpbmdfZm9ybScgKyBwYXJhbXNbICdyZXNvdXJjZV9pZCcgXSB9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2Jvb2tpbmdfY2FuX25vdF9zYXZlJzpcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFdlIGNhbiBub3Qgc2F2ZSBib29raW5nLCBiZWNhdXNlIGRhdGVzIGFyZSBib29rZWQgb3IgY2FuIG5vdCBzYXZlIGluIHNhbWUgYm9va2luZyByZXNvdXJjZSBhbGwgdGhlIGRhdGVzXHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgbWVzc2FnZV9pZCA9IHdwYmNfZnJvbnRfZW5kX19zaG93X21lc3NhZ2UoIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndHlwZScgOiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAocmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9tZXNzYWdlX3N0YXR1cycgXSkpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdhanhfYWZ0ZXJfYWN0aW9uX21lc3NhZ2Vfc3RhdHVzJyBdIDogJ3dhcm5pbmcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RlbGF5JyAgICA6IDAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2hvd19oZXJlJzogeyAnd2hlcmUnOiAnYWZ0ZXInLCAnanFfbm9kZSc6ICcjYm9va2luZ19mb3JtJyArIHBhcmFtc1sgJ3Jlc291cmNlX2lkJyBdIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRW5hYmxlIFN1Ym1pdCB8IEhpZGUgc3BpbiBsb2FkZXJcclxuXHRcdFx0XHRcdFx0XHRcdHdwYmNfYm9va2luZ19mb3JtX19vbl9yZXNwb25zZV9fdWlfZWxlbWVudHNfZW5hYmxlKCByZXNwb25zZV9kYXRhWyAncmVzb3VyY2VfaWQnIF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblxyXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gPGVkaXRvci1mb2xkICAgICBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M9XCIgPSBGb3IgZGVidWcgb25seSA/IC0tICBTaG93IE1lc3NhZ2UgdW5kZXIgdGhlIGZvcm0gPSBcIiAgPlxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoICd1bmRlZmluZWQnICE9PSB0eXBlb2YgKHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXSkgKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgJiYgKCAnJyAhPSByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdhanhfYWZ0ZXJfYWN0aW9uX21lc3NhZ2UnIF0ucmVwbGFjZSggL1xcbi9nLCBcIjxiciAvPlwiICkgKVxyXG5cdFx0XHRcdFx0XHRcdFx0KXtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBjYWxlbmRhcl9pZCA9IHdwYmNfZ2V0X3Jlc291cmNlX2lkX19mcm9tX2FqeF9wb3N0X2RhdGFfdXJsKCB0aGlzLmRhdGEgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGpxX25vZGUgPSAnI2Jvb2tpbmdfZm9ybScgKyBjYWxlbmRhcl9pZDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBhanhfYWZ0ZXJfYm9va2luZ19tZXNzYWdlID0gcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9tZXNzYWdlJyBdLnJlcGxhY2UoIC9cXG4vZywgXCI8YnIgLz5cIiApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyggYWp4X2FmdGVyX2Jvb2tpbmdfbWVzc2FnZSApO1xuXHRcdFx0XHRcdFx0XHRcdFx0d3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZSggYWp4X2FmdGVyX2Jvb2tpbmdfbWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndHlwZScgOiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAocmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9tZXNzYWdlX3N0YXR1cycgXSkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdhanhfYWZ0ZXJfYWN0aW9uX21lc3NhZ2Vfc3RhdHVzJyBdIDogJ3dhcm5pbmcnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RlbGF5JyAgICA6IDAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2hvd19oZXJlJzoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2pxX25vZGUnOiBqcV9ub2RlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3doZXJlJyAgOiAnYWZ0ZXInXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gPC9lZGl0b3ItZm9sZD5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0XHRcdFx0Ly8gUmVhY3RpdmF0ZSBjYWxlbmRhciBhZ2FpbiA/XHJcblx0XHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0XHRcdFx0Ly8gRW5hYmxlIFN1Ym1pdCB8IEhpZGUgc3BpbiBsb2FkZXJcclxuXHRcdFx0XHRcdFx0d3BiY19ib29raW5nX2Zvcm1fX29uX3Jlc3BvbnNlX191aV9lbGVtZW50c19lbmFibGUoIHJlc3BvbnNlX2RhdGFbICdyZXNvdXJjZV9pZCcgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gVW5zZWxlY3QgIGRhdGVzXHJcblx0XHRcdFx0XHRcdHdwYmNfY2FsZW5kYXJfX3Vuc2VsZWN0X2FsbF9kYXRlcyggcmVzcG9uc2VfZGF0YVsgJ3Jlc291cmNlX2lkJyBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyAncmVzb3VyY2VfaWQnICAgID0+ICRwYXJhbXNbJ3Jlc291cmNlX2lkJ10sXHJcblx0XHRcdFx0XHRcdC8vICdib29raW5nX2hhc2gnICAgPT4gJGJvb2tpbmdfaGFzaCxcclxuXHRcdFx0XHRcdFx0Ly8gJ3JlcXVlc3RfdXJpJyAgICA9PiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGl0IHRoZSBzYW1lIGFzIHdpbmRvdy5sb2NhdGlvbi5ocmVmIG9yXHJcblx0XHRcdFx0XHRcdC8vICdjdXN0b21fZm9ybScgICAgPT4gJHBhcmFtc1snY3VzdG9tX2Zvcm0nXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcHRpb25hbC5cclxuXHRcdFx0XHRcdFx0Ly8gJ2FnZ3JlZ2F0ZV9yZXNvdXJjZV9pZF9zdHInID0+IGltcGxvZGUoICcsJywgJHBhcmFtc1snYWdncmVnYXRlX3Jlc291cmNlX2lkX2FyciddICkgICAgIC8vIE9wdGlvbmFsLiBSZXNvdXJjZSBJRCAgIGZyb20gIGFnZ3JlZ2F0ZSBwYXJhbWV0ZXIgaW4gc2hvcnRjb2RlLlxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gTG9hZCBuZXcgZGF0YSBpbiBjYWxlbmRhci5cclxuXHRcdFx0XHRcdFx0d3BiY19jYWxlbmRhcl9fbG9hZF9kYXRhX19hangoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgJ3Jlc291cmNlX2lkJyA6IHJlc3BvbnNlX2RhdGFbICdyZXNvdXJjZV9pZCcgXVx0XHRcdFx0XHRcdFx0Ly8gSXQncyBmcm9tIHJlc3BvbnNlIC4uLkFKWF9CT09LSU5HX19DUkVBVEUgb2YgaW5pdGlhbCBzZW50IHJlc291cmNlX2lkXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQsICdib29raW5nX2hhc2gnOiByZXNwb25zZV9kYXRhWyAnYWp4X2NsZWFuZWRfcGFyYW1zJyBdWydib29raW5nX2hhc2gnXSBcdC8vID8/IHdlIGNhbiBub3QgdXNlIGl0LCAgYmVjYXVzZSBIQVNIIGNobmFnZWQgaW4gYW55ICBjYXNlIVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LCAncmVxdWVzdF91cmknIDogcmVzcG9uc2VfZGF0YVsgJ2FqeF9jbGVhbmVkX3BhcmFtcycgXVsncmVxdWVzdF91cmknXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LCAnY3VzdG9tX2Zvcm0nIDogcmVzcG9uc2VfZGF0YVsgJ2FqeF9jbGVhbmVkX3BhcmFtcycgXVsnY3VzdG9tX2Zvcm0nXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEFnZ3JlZ2F0ZSBib29raW5nIHJlc291cmNlcywgIGlmIGFueSA/XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQsICdhZ2dyZWdhdGVfcmVzb3VyY2VfaWRfc3RyJyA6IF93cGJjLmJvb2tpbmdfX2dldF9wYXJhbV92YWx1ZSggcmVzcG9uc2VfZGF0YVsgJ3Jlc291cmNlX2lkJyBdLCAnYWdncmVnYXRlX3Jlc291cmNlX2lkX2FycicgKS5qb2luKCcsJylcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdFx0XHQvLyBFeGl0XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyA8L2VkaXRvci1mb2xkPlxyXG5cclxuXHJcbi8qXHJcblx0Ly8gU2hvdyBDYWxlbmRhclxyXG5cdHdwYmNfY2FsZW5kYXJfX2xvYWRpbmdfX3N0b3AoIHJlc3BvbnNlX2RhdGFbICdyZXNvdXJjZV9pZCcgXSApO1xyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gQm9va2luZ3MgLSBEYXRlc1xyXG5cdF93cGJjLmJvb2tpbmdzX2luX2NhbGVuZGFyX19zZXRfZGF0ZXMoICByZXNwb25zZV9kYXRhWyAncmVzb3VyY2VfaWQnIF0sIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsnZGF0ZXMnXSAgKTtcclxuXHJcblx0Ly8gQm9va2luZ3MgLSBDaGlsZCBvciBvbmx5IHNpbmdsZSBib29raW5nIHJlc291cmNlIGluIGRhdGVzXHJcblx0X3dwYmMuYm9va2luZ19fc2V0X3BhcmFtX3ZhbHVlKCByZXNwb25zZV9kYXRhWyAncmVzb3VyY2VfaWQnIF0sICdyZXNvdXJjZXNfaWRfYXJyX19pbl9kYXRlcycsIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ3Jlc291cmNlc19pZF9hcnJfX2luX2RhdGVzJyBdICk7XHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvLyBVcGRhdGUgY2FsZW5kYXJcclxuXHR3cGJjX2NhbGVuZGFyX191cGRhdGVfbG9vayggcmVzcG9uc2VfZGF0YVsgJ3Jlc291cmNlX2lkJyBdICk7XHJcbiovXHJcblxyXG5cdFx0XHRcdFx0Ly8gSGlkZSBzcGluIGxvYWRlclxyXG5cdFx0XHRcdFx0d3BiY19ib29raW5nX2Zvcm1fX3NwaW5fbG9hZGVyX19oaWRlKCByZXNwb25zZV9kYXRhWyAncmVzb3VyY2VfaWQnIF0gKTtcclxuXHJcblx0XHRcdFx0XHQvLyBIaWRlIGJvb2tpbmcgZm9ybVxyXG5cdFx0XHRcdFx0d3BiY19ib29raW5nX2Zvcm1fX2FuaW1hdGVkX19oaWRlKCByZXNwb25zZV9kYXRhWyAncmVzb3VyY2VfaWQnIF0gKTtcclxuXHJcblx0XHRcdFx0XHQvLyBTaG93IENvbmZpcm1hdGlvbiB8IFBheW1lbnQgc2VjdGlvblxyXG5cdFx0XHRcdFx0d3BiY19zaG93X3RoYW5rX3lvdV9tZXNzYWdlX2FmdGVyX2Jvb2tpbmcoIHJlc3BvbnNlX2RhdGEgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBUcmlnZ2VyIGhvb2sgYWZ0ZXIgYSBib29raW5nIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlxyXG5cdFx0XHRcdFx0alF1ZXJ5KCAnYm9keScgKS50cmlnZ2VyKCAnd3BiY19ib29raW5nX2Zvcm1fc3VibWl0X3N1Y2Nlc3MnLCBbIHJlc3BvbnNlX2RhdGFbICdyZXNvdXJjZV9pZCcgXSwgcmVzcG9uc2VfZGF0YSwgcGFyYW1zIF0gKTtcclxuXHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKXtcclxuXHRcdFx0XHRcdFx0d3BiY19kb19zY3JvbGwoICcjd3BiY19zY3JvbGxfcG9pbnRfJyArIHJlc3BvbnNlX2RhdGFbICdyZXNvdXJjZV9pZCcgXSwgMTAgKTtcclxuXHRcdFx0XHRcdH0sIDUwMCApO1xyXG5cclxuXHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0ICApLmZhaWwoXHJcblx0XHRcdFx0ICAvLyA8ZWRpdG9yLWZvbGQgICAgIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiICAgICAgICAgICAgICAgICAgICAgICAgZGVzYz1cIiA9IFRoaXMgc2VjdGlvbiBleGVjdXRlLCAgd2hlbiAgTk9OQ0UgZmllbGQgd2FzIG5vdCBwYXNzZWQgb3Igc29tZSBlcnJvciBoYXBwZW5lZCBhdCAgc2VydmVyISA9IFwiICA+XHJcblx0XHRcdFx0ICBmdW5jdGlvbiAoIGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biApIHsgICAgaWYgKCB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgKXsgY29uc29sZS5sb2coICdBamF4X0Vycm9yJywganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duICk7IH1cclxuXHJcblx0XHRcdFx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHRcdFx0XHQvLyBUaGlzIHNlY3Rpb24gZXhlY3V0ZSwgIHdoZW4gIE5PTkNFIGZpZWxkIHdhcyBub3QgcGFzc2VkIG9yIHNvbWUgZXJyb3IgaGFwcGVuZWQgYXQgIHNlcnZlciFcclxuXHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0XHRcdFx0XHQvLyBHZXQgQ29udGVudCBvZiBFcnJvciBNZXNzYWdlXHJcblx0XHRcdFx0XHR2YXIgZXJyb3JfbWVzc2FnZSA9ICc8c3Ryb25nPicgKyAnRXJyb3IhJyArICc8L3N0cm9uZz4gJyArIGVycm9yVGhyb3duIDtcclxuXHRcdFx0XHRcdGlmICgganFYSFIuc3RhdHVzICl7XHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJyAoPGI+JyArIGpxWEhSLnN0YXR1cyArICc8L2I+KSc7XHJcblx0XHRcdFx0XHRcdGlmICg0MDMgPT0ganFYSFIuc3RhdHVzICl7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSArPSAnPGJyPiBQcm9iYWJseSBub25jZSBmb3IgdGhpcyBwYWdlIGhhcyBiZWVuIGV4cGlyZWQuIFBsZWFzZSA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgb25jbGljaz1cImphdmFzY3JpcHQ6bG9jYXRpb24ucmVsb2FkKCk7XCI+cmVsb2FkIHRoZSBwYWdlPC9hPi4nO1xyXG5cdFx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJzxicj4gT3RoZXJ3aXNlLCBwbGVhc2UgY2hlY2sgdGhpcyA8YSBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7XCIgaHJlZj1cImh0dHBzOi8vd3Bib29raW5nY2FsZW5kYXIuY29tL2ZhcS9yZXF1ZXN0LWRvLW5vdC1wYXNzLXNlY3VyaXR5LWNoZWNrLz9hZnRlcl91cGRhdGU9MTAuMS4xXCI+dHJvdWJsZXNob290aW5nIGluc3RydWN0aW9uPC9hPi48YnI+J1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGpxWEhSLnJlc3BvbnNlVGV4dCApe1xyXG5cdFx0XHRcdFx0XHQvLyBFc2NhcGUgdGFncyBpbiBFcnJvciBtZXNzYWdlXHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJzxicj48c3Ryb25nPlJlc3BvbnNlPC9zdHJvbmc+PGRpdiBzdHlsZT1cInBhZGRpbmc6IDAgMTBweDttYXJnaW46IDAgMCAxMHB4O2JvcmRlci1yYWRpdXM6M3B4OyBib3gtc2hhZG93OjBweCAwcHggMXB4ICNhM2EzYTM7XCI+JyArIGpxWEhSLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgLnJlcGxhY2UoLycvZywgXCImIzM5O1wiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsnPC9kaXY+JztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlLnJlcGxhY2UoIC9cXG4vZywgXCI8YnIgLz5cIiApO1xyXG5cclxuXHRcdFx0XHRcdHZhciBjYWxlbmRhcl9pZCA9IHdwYmNfZ2V0X3Jlc291cmNlX2lkX19mcm9tX2FqeF9wb3N0X2RhdGFfdXJsKCB0aGlzLmRhdGEgKTtcclxuXHRcdFx0XHRcdHZhciBqcV9ub2RlID0gJyNib29raW5nX2Zvcm0nICsgY2FsZW5kYXJfaWQ7XHJcblxyXG5cdFx0XHRcdFx0Ly8gU2hvdyBNZXNzYWdlXHJcblx0XHRcdFx0XHR3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlKCBlcnJvcl9tZXNzYWdlICwgeyAndHlwZScgICAgIDogJ2Vycm9yJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdzaG93X2hlcmUnOiB7J2pxX25vZGUnOiBqcV9ub2RlLCAnd2hlcmUnOiAnYWZ0ZXInfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdpc19hcHBlbmQnOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3N0eWxlJyAgICA6ICd0ZXh0LWFsaWduOmxlZnQ7JyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkZWxheScgICAgOiAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdFx0Ly8gRW5hYmxlIFN1Ym1pdCB8IEhpZGUgc3BpbiBsb2FkZXJcclxuXHRcdFx0XHRcdHdwYmNfYm9va2luZ19mb3JtX19vbl9yZXNwb25zZV9fdWlfZWxlbWVudHNfZW5hYmxlKCBjYWxlbmRhcl9pZCApO1xyXG5cdFx0XHQgIFx0IH1cclxuXHRcdFx0XHQgLy8gPC9lZGl0b3ItZm9sZD5cclxuXHRcdFx0ICApXHJcblx0ICAgICAgICAgIC8vIC5kb25lKCAgIGZ1bmN0aW9uICggZGF0YSwgdGV4dFN0YXR1cywganFYSFIgKSB7ICAgaWYgKCB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgKXsgY29uc29sZS5sb2coICdzZWNvbmQgc3VjY2VzcycsIGRhdGEsIHRleHRTdGF0dXMsIGpxWEhSICk7IH0gICAgfSlcclxuXHRcdFx0ICAvLyAuYWx3YXlzKCBmdW5jdGlvbiAoIGRhdGFfanFYSFIsIHRleHRTdGF0dXMsIGpxWEhSX2Vycm9yVGhyb3duICkgeyAgIGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICl7IGNvbnNvbGUubG9nKCAnYWx3YXlzIGZpbmlzaGVkJywgZGF0YV9qcVhIUiwgdGV4dFN0YXR1cywganFYSFJfZXJyb3JUaHJvd24gKTsgfSAgICAgfSlcclxuXHRcdFx0ICA7ICAvLyBFbmQgQWpheFxyXG5cclxuXHRyZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuXHJcblx0Ly8gPGVkaXRvci1mb2xkICAgICBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M9XCIgID09ICBDQVBUQ0hBID09ICBcIiAgPlxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGUgaW1hZ2UgaW4gY2FwdGNoYSBhbmQgc2hvdyB3YXJuaW5nIG1lc3NhZ2VcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBwYXJhbXNcclxuXHQgKlxyXG5cdCAqIEV4YW1wbGUgb2YgJ3BhcmFtcycgOiB7XHJcblx0ICpcdFx0XHRcdFx0XHRcdCdyZXNvdXJjZV9pZCc6IHJlc3BvbnNlX2RhdGFbICdyZXNvdXJjZV9pZCcgXSxcclxuXHQgKlx0XHRcdFx0XHRcdFx0J3VybCcgICAgICAgIDogcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnY2FwdGNoYV9fc2ltcGxlJyBdWyAndXJsJyBdLFxyXG5cdCAqXHRcdFx0XHRcdFx0XHQnY2hhbGxlbmdlJyAgOiByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdjYXB0Y2hhX19zaW1wbGUnIF1bICdjaGFsbGVuZ2UnIF0sXHJcblx0ICpcdFx0XHRcdFx0XHRcdCdtZXNzYWdlJyAgICA6IHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKVxyXG5cdCAqXHRcdFx0XHRcdFx0fVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfY2FwdGNoYV9fc2ltcGxlX191cGRhdGUoIHBhcmFtcyApe1xyXG5cclxuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnY2FwdGNoYV9pbnB1dCcgKyBwYXJhbXNbICdyZXNvdXJjZV9pZCcgXSApLnZhbHVlID0gJyc7XHJcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2NhcHRjaGFfaW1nJyArIHBhcmFtc1sgJ3Jlc291cmNlX2lkJyBdICkuc3JjID0gcGFyYW1zWyAndXJsJyBdO1xyXG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGRldl9jYXB0Y2hhX2NoYWxsZW5nZV8nICsgcGFyYW1zWyAncmVzb3VyY2VfaWQnIF0gKS52YWx1ZSA9IHBhcmFtc1sgJ2NoYWxsZW5nZScgXTtcclxuXHJcblx0XHQvLyBTaG93IHdhcm5pbmcgXHRcdEFmdGVyIENBUFRDSEEgSW1nXHJcblx0dmFyIG1lc3NhZ2VfaWQgPSB3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX193YXJuaW5nKCAnI2NhcHRjaGFfaW5wdXQnICsgcGFyYW1zWyAncmVzb3VyY2VfaWQnIF0gKyAnICsgaW1nJywgcGFyYW1zWyAnbWVzc2FnZScgXSwgJ3RleHQnICk7XG5cclxuXHRcdC8vIEFuaW1hdGVcclxuXHRcdGpRdWVyeSggJyMnICsgbWVzc2FnZV9pZCArICcsICcgKyAnI2NhcHRjaGFfaW5wdXQnICsgcGFyYW1zWyAncmVzb3VyY2VfaWQnIF0gKS5mYWRlT3V0KCAzNTAgKS5mYWRlSW4oIDMwMCApLmZhZGVPdXQoIDM1MCApLmZhZGVJbiggNDAwICkuYW5pbWF0ZSgge29wYWNpdHk6IDF9LCA0MDAwICk7XHJcblx0XHQvLyBGb2N1cyB0ZXh0ICBmaWVsZFxyXG5cdFx0alF1ZXJ5KCAnI2NhcHRjaGFfaW5wdXQnICsgcGFyYW1zWyAncmVzb3VyY2VfaWQnIF0gKS50cmlnZ2VyKCAnZm9jdXMnICk7ICAgIFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpeEluOiA4LjcuMTEuMTIuXHJcblxyXG5cclxuXHRcdC8vIEVuYWJsZSBTdWJtaXQgfCBIaWRlIHNwaW4gbG9hZGVyXHJcblx0XHR3cGJjX2Jvb2tpbmdfZm9ybV9fb25fcmVzcG9uc2VfX3VpX2VsZW1lbnRzX2VuYWJsZSggcGFyYW1zWyAncmVzb3VyY2VfaWQnIF0gKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGUgY2FwdGNoYSBlbGVtZW50cyBub3QgZXhpc3QgIGluIHRoZSBib29raW5nIGZvcm0sICB0aGVuICByZW1vdmUgcGFyYW1ldGVycyByZWxhdGl2ZSBjYXB0Y2hhXHJcblx0ICogQHBhcmFtIHBhcmFtc1xyXG5cdCAqIEByZXR1cm5zIG9ialxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfY2FwdGNoYV9fc2ltcGxlX19tYXliZV9yZW1vdmVfaW5fYWp4X3BhcmFtcyggcGFyYW1zICl7XHJcblxyXG5cdFx0aWYgKCAhIHdwYmNfY2FwdGNoYV9fc2ltcGxlX19pc19leGlzdF9pbl9mb3JtKCBwYXJhbXNbICdyZXNvdXJjZV9pZCcgXSApICl7XHJcblx0XHRcdGRlbGV0ZSBwYXJhbXNbICdjYXB0Y2hhX2NoYWxhbmdlJyBdO1xyXG5cdFx0XHRkZWxldGUgcGFyYW1zWyAnY2FwdGNoYV91c2VyX2lucHV0JyBdO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHBhcmFtcztcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVjayBpZiBDQVBUQ0hBIGV4aXN0IGluIHRoZSBib29raW5nIGZvcm1cclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2NhcHRjaGFfX3NpbXBsZV9faXNfZXhpc3RfaW5fZm9ybSggcmVzb3VyY2VfaWQgKXtcclxuXHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRcdFx0XHQoMCAhPT0galF1ZXJ5KCAnI3dwZGV2X2NhcHRjaGFfY2hhbGxlbmdlXycgKyByZXNvdXJjZV9pZCApLmxlbmd0aClcclxuXHRcdFx0XHRcdCB8fCAoMCAhPT0galF1ZXJ5KCAnI2NhcHRjaGFfaW5wdXQnICsgcmVzb3VyY2VfaWQgKS5sZW5ndGgpXHJcblx0XHRcdFx0KTtcclxuXHR9XHJcblxyXG5cdC8vIDwvZWRpdG9yLWZvbGQ+XHJcblxyXG5cclxuXHQvLyA8ZWRpdG9yLWZvbGQgICAgIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiICAgICAgICAgICAgICAgICAgICAgICAgZGVzYz1cIiAgPT0gIFNlbmQgQnV0dG9uIHwgRm9ybSBTcGluIExvYWRlciAgPT0gIFwiICA+XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc2FibGUgU2VuZCBidXR0b24gIHwgIFNob3cgU3BpbiBMb2FkZXJcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSByZXNvdXJjZV9pZFxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYm9va2luZ19mb3JtX19vbl9zdWJtaXRfX3VpX2VsZW1lbnRzX2Rpc2FibGUoIHJlc291cmNlX2lkICl7XHJcblxyXG5cdFx0Ly8gRGlzYWJsZSBTdWJtaXRcclxuXHRcdHdwYmNfYm9va2luZ19mb3JtX19zZW5kX2J1dHRvbl9fZGlzYWJsZSggcmVzb3VyY2VfaWQgKTtcclxuXHJcblx0XHQvLyBTaG93IFNwaW4gbG9hZGVyIGluIGJvb2tpbmcgZm9ybVxyXG5cdFx0d3BiY19ib29raW5nX2Zvcm1fX3NwaW5fbG9hZGVyX19zaG93KCByZXNvdXJjZV9pZCApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlIFNlbmQgYnV0dG9uICB8ICAgSGlkZSBTcGluIExvYWRlclxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHJlc291cmNlX2lkXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19ib29raW5nX2Zvcm1fX29uX3Jlc3BvbnNlX191aV9lbGVtZW50c19lbmFibGUocmVzb3VyY2VfaWQpe1xyXG5cclxuXHRcdC8vIEVuYWJsZSBTdWJtaXRcclxuXHRcdHdwYmNfYm9va2luZ19mb3JtX19zZW5kX2J1dHRvbl9fZW5hYmxlKCByZXNvdXJjZV9pZCApO1xyXG5cclxuXHRcdC8vIEhpZGUgU3BpbiBsb2FkZXIgaW4gYm9va2luZyBmb3JtXHJcblx0XHR3cGJjX2Jvb2tpbmdfZm9ybV9fc3Bpbl9sb2FkZXJfX2hpZGUoIHJlc291cmNlX2lkICk7XHJcblx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW5hYmxlIFN1Ym1pdCBidXR0b25cclxuXHRcdCAqIEBwYXJhbSByZXNvdXJjZV9pZFxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2Jvb2tpbmdfZm9ybV9fc2VuZF9idXR0b25fX2VuYWJsZSggcmVzb3VyY2VfaWQgKXtcclxuXHJcblx0XHRcdC8vIEFjdGl2YXRlIFNlbmQgYnV0dG9uXHJcblx0XHRcdGpRdWVyeSggJyNib29raW5nX2Zvcm1fZGl2JyArIHJlc291cmNlX2lkICsgJyBpbnB1dFt0eXBlPWJ1dHRvbl0nICkucHJvcCggXCJkaXNhYmxlZFwiLCBmYWxzZSApO1xyXG5cdFx0XHRqUXVlcnkoICcjYm9va2luZ19mb3JtX2RpdicgKyByZXNvdXJjZV9pZCArICcgYnV0dG9uJyApLnByb3AoIFwiZGlzYWJsZWRcIiwgZmFsc2UgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERpc2FibGUgU3VibWl0IGJ1dHRvbiAgYW5kIHNob3cgIHNwaW5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gd3BiY19ib29raW5nX2Zvcm1fX3NlbmRfYnV0dG9uX19kaXNhYmxlKCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHRcdFx0Ly8gRGlzYWJsZSBTZW5kIGJ1dHRvblxyXG5cdFx0XHRqUXVlcnkoICcjYm9va2luZ19mb3JtX2RpdicgKyByZXNvdXJjZV9pZCArICcgaW5wdXRbdHlwZT1idXR0b25dJyApLnByb3AoIFwiZGlzYWJsZWRcIiwgdHJ1ZSApO1xyXG5cdFx0XHRqUXVlcnkoICcjYm9va2luZ19mb3JtX2RpdicgKyByZXNvdXJjZV9pZCArICcgYnV0dG9uJyApLnByb3AoIFwiZGlzYWJsZWRcIiwgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGlzYWJsZSAnVGhpcycgYnV0dG9uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIF90aGlzXHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfYm9va2luZ19mb3JtX190aGlzX2J1dHRvbl9fZGlzYWJsZSggX3RoaXMgKXtcclxuXHJcblx0XHRcdC8vIERpc2FibGUgU2VuZCBidXR0b25cclxuXHRcdFx0alF1ZXJ5KCBfdGhpcyApLnByb3AoIFwiZGlzYWJsZWRcIiwgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2hvdyBib29raW5nIGZvcm0gIFNwaW4gTG9hZGVyXHJcblx0XHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gd3BiY19ib29raW5nX2Zvcm1fX3NwaW5fbG9hZGVyX19zaG93KCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHRcdFx0dmFyICRmb3JtX2NvbnRhaW5lciA9IGpRdWVyeSggJyNib29raW5nX2Zvcm1fZGl2JyArIHJlc291cmNlX2lkICk7XHJcblx0XHRcdHZhciBsb2FkZXJfdGV4dCAgICAgPSAnU2F2aW5nJztcclxuXHRcdFx0aWYgKCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIF93cGJjICYmIF93cGJjLmdldF9tZXNzYWdlICkge1xyXG5cdFx0XHRcdGxvYWRlcl90ZXh0ID0gX3dwYmMuZ2V0X21lc3NhZ2UoICdtZXNzYWdlX2Jvb2tpbmdfc2F2aW5nJyApIHx8IGxvYWRlcl90ZXh0O1xuXHRcdFx0fVxyXG5cdFx0XHR2YXIgbG9hZGVyX2h0bWwgICAgID0gJzxkaXYgaWQ9XCJ3cGJjX2Jvb2tpbmdfZm9ybV9zcGluX2xvYWRlcicgKyByZXNvdXJjZV9pZCArICdcIiBjbGFzcz1cIndwYmNfYm9va2luZ19mb3JtX3NwaW5fbG9hZGVyIHdwYmNfYm9va2luZ19mb3JtX3N1Ym1pdF9vdmVybGF5XCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiPidcclxuXHRcdFx0XHRcdFx0XHRcdCsgJzxkaXYgY2xhc3M9XCJ3cGJjX3NwaW5zX2xvYWRpbmdfY29udGFpbmVyXCI+J1xyXG5cdFx0XHRcdFx0XHRcdFx0KyAnPGRpdiBjbGFzcz1cIndwYmNfYm9va2luZ19mb3JtX3NwaW5fbG9hZGVyXCI+PGRpdiBjbGFzcz1cIndwYmNfc3BpbnNfbG9hZGVyX3dyYXBwZXJcIj48ZGl2IGNsYXNzPVwid3BiY19zcGluX2xvYWRlcl9vbmVfbmV3XCI+PC9kaXY+PC9kaXY+PC9kaXY+J1xyXG5cdFx0XHRcdFx0XHRcdFx0KyAnPHNwYW4+JyArIGxvYWRlcl90ZXh0ICsgJy4uLjwvc3Bhbj4nXHJcblx0XHRcdFx0XHRcdFx0XHQrICc8L2Rpdj4nXHJcblx0XHRcdFx0XHRcdFx0XHQrICc8L2Rpdj4nO1xyXG5cclxuXHRcdFx0Ly8gUmVtb3ZlIGFueSBwcmV2aW91cyBpbmxpbmUgbG9hZGVyIGJlZm9yZSBhZGRpbmcgdGhlIHN1Ym1pdCBvdmVybGF5LlxyXG5cdFx0XHRqUXVlcnkoICcjd3BiY19ib29raW5nX2Zvcm1fc3Bpbl9sb2FkZXInICsgcmVzb3VyY2VfaWQgKS5yZW1vdmUoKTtcclxuXHJcblx0XHRcdGlmICggJGZvcm1fY29udGFpbmVyLmxlbmd0aCAmJiAkZm9ybV9jb250YWluZXIuaXMoICc6dmlzaWJsZScgKSApIHtcclxuXHRcdFx0XHQkZm9ybV9jb250YWluZXIuYWRkQ2xhc3MoICd3cGJjX2Jvb2tpbmdfZm9ybV9pc19zdWJtaXR0aW5nJyApO1xyXG5cdFx0XHRcdCRmb3JtX2NvbnRhaW5lci5wcmVwZW5kKCBsb2FkZXJfaHRtbCApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRmFsbGJhY2sgZm9yIGFueSB1bmV4cGVjdGVkIGxlZ2FjeSBtYXJrdXAgd2l0aG91dCAjYm9va2luZ19mb3JtX2RpdntyZXNvdXJjZV9pZH0uXHJcblx0XHRcdGpRdWVyeSggJyNib29raW5nX2Zvcm0nICsgcmVzb3VyY2VfaWQgKS5hZnRlcihcclxuXHRcdFx0XHQnPGRpdiBpZD1cIndwYmNfYm9va2luZ19mb3JtX3NwaW5fbG9hZGVyJyArIHJlc291cmNlX2lkICsgJ1wiIGNsYXNzPVwid3BiY19ib29raW5nX2Zvcm1fc3Bpbl9sb2FkZXJcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj48ZGl2IGNsYXNzPVwid3BiY19zcGluc19sb2FkZXJfd3JhcHBlclwiPjxkaXYgY2xhc3M9XCJ3cGJjX3NwaW5fbG9hZGVyX29uZV9uZXdcIj48L2Rpdj48L2Rpdj48L2Rpdj4nXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW1vdmUgLyBIaWRlIGJvb2tpbmcgZm9ybSAgU3BpbiBMb2FkZXJcclxuXHRcdCAqIEBwYXJhbSByZXNvdXJjZV9pZFxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2Jvb2tpbmdfZm9ybV9fc3Bpbl9sb2FkZXJfX2hpZGUoIHJlc291cmNlX2lkICl7XHJcblxyXG5cdFx0XHQvLyBSZW1vdmUgU3BpbiBMb2FkZXJcclxuXHRcdFx0alF1ZXJ5KCAnI3dwYmNfYm9va2luZ19mb3JtX3NwaW5fbG9hZGVyJyArIHJlc291cmNlX2lkICkucmVtb3ZlKCk7XHJcblx0XHRcdGpRdWVyeSggJyNib29raW5nX2Zvcm1fZGl2JyArIHJlc291cmNlX2lkICkucmVtb3ZlQ2xhc3MoICd3cGJjX2Jvb2tpbmdfZm9ybV9pc19zdWJtaXR0aW5nJyApO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhpZGUgYm9va2luZyBmb3JtIHd0aCBhbmltYXRpb25cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gd3BiY19ib29raW5nX2Zvcm1fX2FuaW1hdGVkX19oaWRlKCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHRcdFx0alF1ZXJ5KCAnI2Jvb2tpbmdfZm9ybScgKyByZXNvdXJjZV9pZCApLmhpZGUoKTtcclxuXHRcdH1cclxuXHQvLyA8L2VkaXRvci1mb2xkPlxyXG5cclxuXHJcblx0Ly8gPGVkaXRvci1mb2xkICAgICBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M9XCIgID09ICBNaW5pIFNwaW4gTG9hZGVyICA9PSAgXCIgID5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gcGFyZW50X2h0bWxfaWRcclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2hvdyBtaWNybyBTcGluIExvYWRlclxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSBpZFx0XHRcdFx0XHRcdElEIG9mIExvYWRlciwgIGZvciBsYXRlciAgaGlkZSBpdCBieSAgdXNpbmcgXHRcdHdwYmNfX3NwaW5fbG9hZGVyX19taWNyb19faGlkZSggaWQgKSBPUiB3cGJjX19zcGluX2xvYWRlcl9fbWluaV9faGlkZSggaWQgKVxyXG5cdFx0ICogQHBhcmFtIGpxX25vZGVfd2hlcmVfaW5zZXJ0XHRcdHN1Y2ggYXMgJyNlc3RpbWF0ZV9ib29raW5nX25pZ2h0X2Nvc3RfaGludDEwJyAgIE9SICAnLmVzdGltYXRlX2Jvb2tpbmdfbmlnaHRfY29zdF9oaW50MTAnXHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfX3NwaW5fbG9hZGVyX19taWNyb19fc2hvd19faW5zaWRlKCBpZCAsIGpxX25vZGVfd2hlcmVfaW5zZXJ0ICl7XHJcblxyXG5cdFx0XHRcdHdwYmNfX3NwaW5fbG9hZGVyX19taW5pX19zaG93KCBpZCwge1xyXG5cdFx0XHRcdFx0J2NvbG9yJyAgOiAnIzQ0NCcsXHJcblx0XHRcdFx0XHQnc2hvd19oZXJlJzoge1xyXG5cdFx0XHRcdFx0XHQnd2hlcmUnICA6ICdpbnNpZGUnLFxyXG5cdFx0XHRcdFx0XHQnanFfbm9kZSc6IGpxX25vZGVfd2hlcmVfaW5zZXJ0XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0J3N0eWxlJyAgICA6ICdwb3NpdGlvbjogcmVsYXRpdmU7ZGlzcGxheTogaW5saW5lLWZsZXg7ZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO2p1c3RpZnktY29udGVudDogY2VudGVyO2FsaWduLWl0ZW1zOiBjZW50ZXI7bWFyZ2luOiA3cHggMTJweDsnLFxyXG5cdFx0XHRcdFx0J2NsYXNzJyAgICA6ICd3cGJjX29uZV9zcGluX2xvYWRlcl9taWNybydcclxuXHRcdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW1vdmUgc3Bpbm5lclxyXG5cdFx0ICogQHBhcmFtIGlkXHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfX3NwaW5fbG9hZGVyX19taWNyb19faGlkZSggaWQgKXtcclxuXHRcdCAgICB3cGJjX19zcGluX2xvYWRlcl9fbWluaV9faGlkZSggaWQgKTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTaG93IG1pbmkgU3BpbiBMb2FkZXJcclxuXHRcdCAqIEBwYXJhbSBwYXJlbnRfaHRtbF9pZFxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX19zcGluX2xvYWRlcl9fbWluaV9fc2hvdyggcGFyZW50X2h0bWxfaWQgLCBwYXJhbXMgPSB7fSApe1xyXG5cclxuXHRcdFx0dmFyIHBhcmFtc19kZWZhdWx0ID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQnY29sb3InICAgIDogJyMwMDcxY2UnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnc2hvd19oZXJlJzoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdqcV9ub2RlJzogJycsXHRcdFx0XHRcdC8vIGFueSBqUXVlcnkgbm9kZSBkZWZpbml0aW9uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0J3doZXJlJyAgOiAnYWZ0ZXInXHRcdFx0XHQvLyAnaW5zaWRlJyB8ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdyaWdodCcgfCAnbGVmdCdcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0J3N0eWxlJyAgICA6ICdwb3NpdGlvbjogcmVsYXRpdmU7bWluLWhlaWdodDogMi44cmVtOycsXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdjbGFzcycgICAgOiAnd3BiY19vbmVfc3Bpbl9sb2FkZXJfbWluaSAwd3BiY19zcGluX2xvYWRlcl9vbmVfbmV3J1xyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0Zm9yICggdmFyIHBfa2V5IGluIHBhcmFtcyApe1xyXG5cdFx0XHRcdHBhcmFtc19kZWZhdWx0WyBwX2tleSBdID0gcGFyYW1zWyBwX2tleSBdO1xyXG5cdFx0XHR9XHJcblx0XHRcdHBhcmFtcyA9IHBhcmFtc19kZWZhdWx0O1xyXG5cclxuXHRcdFx0aWYgKCAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAocGFyYW1zWydjb2xvciddKSkgJiYgKCcnICE9IHBhcmFtc1snY29sb3InXSkgKXtcclxuXHRcdFx0XHRwYXJhbXNbJ2NvbG9yJ10gPSAnYm9yZGVyLWNvbG9yOicgKyBwYXJhbXNbJ2NvbG9yJ10gKyAnOyc7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBzcGlubmVyX2h0bWwgPSAnPGRpdiBpZD1cIndwYmNfbWluaV9zcGluX2xvYWRlcicgKyBwYXJlbnRfaHRtbF9pZCArICdcIiBjbGFzcz1cIndwYmNfYm9va2luZ19mb3JtX3NwaW5fbG9hZGVyXCIgc3R5bGU9XCInICsgcGFyYW1zWyAnc3R5bGUnIF0gKyAnXCI+PGRpdiBjbGFzcz1cIndwYmNfc3BpbnNfbG9hZGVyX3dyYXBwZXJcIj48ZGl2IGNsYXNzPVwiJyArIHBhcmFtc1sgJ2NsYXNzJyBdICsgJ1wiIHN0eWxlPVwiJyArIHBhcmFtc1sgJ2NvbG9yJyBdICsgJ1wiPjwvZGl2PjwvZGl2PjwvZGl2Pic7XHJcblxyXG5cdFx0XHRpZiAoICcnID09IHBhcmFtc1sgJ3Nob3dfaGVyZScgXVsgJ2pxX25vZGUnIF0gKXtcclxuXHRcdFx0XHRwYXJhbXNbICdzaG93X2hlcmUnIF1bICdqcV9ub2RlJyBdID0gJyMnICsgcGFyZW50X2h0bWxfaWQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNob3cgU3BpbiBMb2FkZXJcclxuXHRcdFx0aWYgKCAnYWZ0ZXInID09IHBhcmFtc1sgJ3Nob3dfaGVyZScgXVsgJ3doZXJlJyBdICl7XHJcblx0XHRcdFx0alF1ZXJ5KCBwYXJhbXNbICdzaG93X2hlcmUnIF1bICdqcV9ub2RlJyBdICkuYWZ0ZXIoIHNwaW5uZXJfaHRtbCApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGpRdWVyeSggcGFyYW1zWyAnc2hvd19oZXJlJyBdWyAnanFfbm9kZScgXSApLmh0bWwoIHNwaW5uZXJfaHRtbCApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW1vdmUgLyBIaWRlIG1pbmkgU3BpbiBMb2FkZXJcclxuXHRcdCAqIEBwYXJhbSBwYXJlbnRfaHRtbF9pZFxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX19zcGluX2xvYWRlcl9fbWluaV9faGlkZSggcGFyZW50X2h0bWxfaWQgKXtcclxuXHJcblx0XHRcdC8vIFJlbW92ZSBTcGluIExvYWRlclxyXG5cdFx0XHRqUXVlcnkoICcjd3BiY19taW5pX3NwaW5fbG9hZGVyJyArIHBhcmVudF9odG1sX2lkICkucmVtb3ZlKCk7XHJcblx0XHR9XHJcblxyXG5cdC8vIDwvZWRpdG9yLWZvbGQ+XHJcblxyXG4vL1RPRE86IHdoYXQgIGFib3V0IHNob3dpbmcgb25seSAgVGhhbmsgeW91LiBtZXNzYWdlIHdpdGhvdXQgcGF5bWVudCBmb3Jtcy5cclxuLyoqXHJcbiAqIFNob3cgJ1RoYW5rIHlvdScuIG1lc3NhZ2UgYW5kIHBheW1lbnQgZm9ybXNcclxuICpcclxuICogQHBhcmFtIHJlc3BvbnNlX2RhdGFcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfc2hvd190aGFua195b3VfbWVzc2FnZV9hZnRlcl9ib29raW5nKCByZXNwb25zZV9kYXRhICl7XHJcblxyXG5cdGlmIChcclxuIFx0XHQgICAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAocmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV9pc19yZWRpcmVjdCcgXSkpXHJcblx0XHQmJiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAocmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV91cmwnIF0pKVxyXG5cdFx0JiYgKCdwYWdlJyA9PSByZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X2lzX3JlZGlyZWN0JyBdKVxyXG5cdFx0JiYgKCcnICE9IHJlc3BvbnNlX2RhdGFbICdhanhfY29uZmlybWF0aW9uJyBdWyAndHlfdXJsJyBdKVxyXG5cdCl7XHJcblx0XHRqUXVlcnkoICdib2R5JyApLnRyaWdnZXIoICd3cGJjX2Jvb2tpbmdfY3JlYXRlZCcsIFsgcmVzcG9uc2VfZGF0YVsgJ3Jlc291cmNlX2lkJyBdICwgcmVzcG9uc2VfZGF0YSBdICk7XHRcdFx0Ly8gRml4SW46IDEwLjAuMC4zMC5cclxuXHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV91cmwnIF07XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHR2YXIgcmVzb3VyY2VfaWQgPSByZXNwb25zZV9kYXRhWyAncmVzb3VyY2VfaWQnIF1cclxuXHR2YXIgY29uZmlybV9jb250ZW50ID0nJztcclxuXHJcblx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIChyZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X21lc3NhZ2UnIF0pICl7XHJcblx0XHRcdFx0XHQgIFx0XHRcdCByZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X21lc3NhZ2UnIF0gPSAnJztcclxuXHR9XHJcblx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIChyZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X3BheW1lbnRfcGF5bWVudF9kZXNjcmlwdGlvbicgXSApICl7XHJcblx0XHQgXHRcdFx0ICBcdFx0XHQgcmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV9wYXltZW50X3BheW1lbnRfZGVzY3JpcHRpb24nIF0gPSAnJztcclxuXHR9XHJcblx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIChyZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3BheW1lbnRfY29zdCcgXSApICl7XHJcblx0XHRcdFx0XHQgIFx0XHRcdCByZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3BheW1lbnRfY29zdCcgXSA9ICcnO1xyXG5cdH1cclxuXHRpZiAoICd1bmRlZmluZWQnID09PSB0eXBlb2YgKHJlc3BvbnNlX2RhdGFbICdhanhfY29uZmlybWF0aW9uJyBdWyAndHlfcGF5bWVudF9nYXRld2F5cycgXSApICl7XHJcblx0XHRcdFx0XHQgIFx0XHRcdCByZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X3BheW1lbnRfZ2F0ZXdheXMnIF0gPSAnJztcclxuXHR9XHJcblx0dmFyIHR5X21lc3NhZ2VfaGlkZSBcdFx0XHRcdFx0XHQ9ICgnJyA9PSByZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X21lc3NhZ2UnIF0pID8gJ3dwYmNfdHlfaGlkZScgOiAnJztcclxuXHR2YXIgdHlfcGF5bWVudF9wYXltZW50X2Rlc2NyaXB0aW9uX2hpZGUgXHQ9ICgnJyA9PSByZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X3BheW1lbnRfcGF5bWVudF9kZXNjcmlwdGlvbicgXS5yZXBsYWNlKCAvXFxcXG4vZywgJycgKSkgPyAnd3BiY190eV9oaWRlJyA6ICcnO1xyXG5cdHZhciB0eV9ib29raW5nX2Nvc3RzX2hpZGUgXHRcdFx0XHQ9ICgnJyA9PSByZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3BheW1lbnRfY29zdCcgXSkgPyAnd3BiY190eV9oaWRlJyA6ICcnO1xyXG5cdHZhciB0eV9wYXltZW50X2dhdGV3YXlzX2hpZGUgXHRcdFx0PSAoJycgPT0gcmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV9wYXltZW50X2dhdGV3YXlzJyBdLnJlcGxhY2UoIC9cXFxcbi9nLCAnJyApKSA/ICd3cGJjX3R5X2hpZGUnIDogJyc7XHJcblxyXG5cdGlmICggJ3dwYmNfdHlfaGlkZScgIT0gdHlfcGF5bWVudF9nYXRld2F5c19oaWRlICl7XHJcblx0XHRqUXVlcnkoICcud3BiY190eV9fY29udGVudF90ZXh0LndwYmNfdHlfX2NvbnRlbnRfZ2F0ZXdheXMnICkuaHRtbCggJycgKTtcdC8vIFJlc2V0ICBhbGwgIG90aGVyIHBvc3NpYmxlIGdhdGV3YXlzIGJlZm9yZSBzaG93aW5nIG5ldyBvbmUuXHJcblx0fVxyXG5cclxuXHRjb25maXJtX2NvbnRlbnQgKz0gYDxkaXYgaWQ9XCJ3cGJjX3Njcm9sbF9wb2ludF8ke3Jlc291cmNlX2lkfVwiPjwvZGl2PmA7XHJcblx0Y29uZmlybV9jb250ZW50ICs9IGAgIDxkaXYgY2xhc3M9XCJ3cGJjX2FmdGVyX2Jvb2tpbmdfdGhhbmtfeW91X3NlY3Rpb25cIj5gO1xyXG5cdGNvbmZpcm1fY29udGVudCArPSBgICAgIDxkaXYgY2xhc3M9XCJ3cGJjX3R5X19tZXNzYWdlICR7dHlfbWVzc2FnZV9oaWRlfVwiPiR7cmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV9tZXNzYWdlJyBdfTwvZGl2PmA7XHJcbiAgICBjb25maXJtX2NvbnRlbnQgKz0gYCAgICA8ZGl2IGNsYXNzPVwid3BiY190eV9fY29udGFpbmVyXCI+YDtcclxuXHRpZiAoICcnICE9PSByZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X21lc3NhZ2VfYm9va2luZ19pZCcgXSApe1xyXG5cdFx0Y29uZmlybV9jb250ZW50ICs9IGAgICAgICA8ZGl2IGNsYXNzPVwid3BiY190eV9faGVhZGVyXCI+JHtyZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X21lc3NhZ2VfYm9va2luZ19pZCcgXX08L2Rpdj5gO1xyXG5cdH1cclxuICAgIGNvbmZpcm1fY29udGVudCArPSBgICAgICAgPGRpdiBjbGFzcz1cIndwYmNfdHlfX2NvbnRlbnRcIj5gO1xyXG5cdGNvbmZpcm1fY29udGVudCArPSBgICAgICAgICA8ZGl2IGNsYXNzPVwid3BiY190eV9fY29udGVudF90ZXh0IHdwYmNfdHlfX3BheW1lbnRfZGVzY3JpcHRpb24gJHt0eV9wYXltZW50X3BheW1lbnRfZGVzY3JpcHRpb25faGlkZX1cIj4ke3Jlc3BvbnNlX2RhdGFbICdhanhfY29uZmlybWF0aW9uJyBdWyAndHlfcGF5bWVudF9wYXltZW50X2Rlc2NyaXB0aW9uJyBdLnJlcGxhY2UoIC9cXFxcbi9nLCAnJyApfTwvZGl2PmA7XHJcblx0aWYgKCAnJyAhPT0gcmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV9jdXN0b21lcl9kZXRhaWxzJyBdICl7XHJcblx0XHRjb25maXJtX2NvbnRlbnQgKz0gYCAgICAgIFx0PGRpdiBjbGFzcz1cIndwYmNfdHlfX2NvbnRlbnRfdGV4dCB3cGJjX2NvbHNfMlwiPiR7cmVzcG9uc2VfZGF0YVsnYWp4X2NvbmZpcm1hdGlvbiddWyd0eV9jdXN0b21lcl9kZXRhaWxzJ119PC9kaXY+YDtcclxuXHR9XHJcblx0aWYgKCAnJyAhPT0gcmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV9ib29raW5nX2RldGFpbHMnIF0gKXtcclxuXHRcdGNvbmZpcm1fY29udGVudCArPSBgICAgICAgXHQ8ZGl2IGNsYXNzPVwid3BiY190eV9fY29udGVudF90ZXh0IHdwYmNfY29sc18yXCI+JHtyZXNwb25zZV9kYXRhWydhanhfY29uZmlybWF0aW9uJ11bJ3R5X2Jvb2tpbmdfZGV0YWlscyddfTwvZGl2PmA7XHJcblx0fVxyXG5cdGNvbmZpcm1fY29udGVudCArPSBgICAgICAgICA8ZGl2IGNsYXNzPVwid3BiY190eV9fY29udGVudF90ZXh0IHdwYmNfdHlfX2NvbnRlbnRfY29zdHMgJHt0eV9ib29raW5nX2Nvc3RzX2hpZGV9XCI+JHtyZXNwb25zZV9kYXRhWyAnYWp4X2NvbmZpcm1hdGlvbicgXVsgJ3R5X2Jvb2tpbmdfY29zdHMnIF19PC9kaXY+YDtcclxuXHRjb25maXJtX2NvbnRlbnQgKz0gYCAgICAgICAgPGRpdiBjbGFzcz1cIndwYmNfdHlfX2NvbnRlbnRfdGV4dCB3cGJjX3R5X19jb250ZW50X2dhdGV3YXlzICR7dHlfcGF5bWVudF9nYXRld2F5c19oaWRlfVwiPiR7cmVzcG9uc2VfZGF0YVsgJ2FqeF9jb25maXJtYXRpb24nIF1bICd0eV9wYXltZW50X2dhdGV3YXlzJyBdLnJlcGxhY2UoIC9cXFxcbi9nLCAnJyApLnJlcGxhY2UoIC9hamF4X3NjcmlwdC9naSwgJ3NjcmlwdCcgKX08L2Rpdj5gO1xyXG4gICAgY29uZmlybV9jb250ZW50ICs9IGAgICAgICA8L2Rpdj5gO1xyXG4gICAgY29uZmlybV9jb250ZW50ICs9IGAgICAgPC9kaXY+YDtcclxuXHRjb25maXJtX2NvbnRlbnQgKz0gYDwvZGl2PmA7XHJcblxyXG4gXHRqUXVlcnkoICcjYm9va2luZ19mb3JtJyArIHJlc291cmNlX2lkICkuYWZ0ZXIoIGNvbmZpcm1fY29udGVudCApO1xyXG5cclxuXHJcblx0Ly9GaXhJbjogMTAuMC4wLjMwXHRcdC8vIGV2ZW50IG5hbWVcdFx0XHQvLyBSZXNvdXJjZSBJRFx0LVx0JzEnXHJcblx0alF1ZXJ5KCAnYm9keScgKS50cmlnZ2VyKCAnd3BiY19ib29raW5nX2NyZWF0ZWQnLCBbIHJlc291cmNlX2lkICwgcmVzcG9uc2VfZGF0YSBdICk7XHJcblx0Ly8gVG8gY2F0Y2ggdGhpcyBldmVudDogalF1ZXJ5KCAnYm9keScgKS5vbignd3BiY19ib29raW5nX2NyZWF0ZWQnLCBmdW5jdGlvbiggZXZlbnQsIHJlc291cmNlX2lkLCBwYXJhbXMgKSB7IGNvbnNvbGUubG9nKCBldmVudCwgcmVzb3VyY2VfaWQsIHBhcmFtcyApOyB9ICk7XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZOztBQUVaO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSx3QkFBd0JBLENBQUVDLE1BQU0sRUFBRTtFQUUxQ0MsT0FBTyxDQUFDQyxj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