| 1 |
"use strict"; |
| 2 |
|
| 3 |
/** Add Appointment administrator inspector and non-submitting helper tools. */ |
| 4 |
(function ($) { |
| 5 |
'use strict'; |
| 6 |
|
| 7 |
var summary_timer = 0; |
| 8 |
var labels = window.wpbc_add_appointment_page_config || {}; |
| 9 |
|
| 10 |
/** Apply the administrator page context before any Provider calendar loads. */ |
| 11 |
function apply_booking_context() { |
| 12 |
if ('undefined' === typeof window._wpbc) { |
| 13 |
return; |
| 14 |
} |
| 15 |
window._wpbc.set_other_param('this_page_booking_hash', ''); |
| 16 |
window._wpbc.set_other_param('this_page_allow_past', labels.allowPast ? 1 : 0); |
| 17 |
window._wpbc.set_other_param('this_page_allow_past_arr', labels.allowPastDateArr || []); |
| 18 |
window._wpbc.set_other_param('this_page_admin_booking_nonce', String(labels.adminBookingNonce || '')); |
| 19 |
} |
| 20 |
|
| 21 |
/** Switch one shared right-sidebar panel. */ |
| 22 |
function switch_right_panel($tab) { |
| 23 |
var panel_id = $tab.attr('aria-controls'); |
| 24 |
var $tabs = $tab.closest('.wpbc_add_appointment__rightbar_tabs').find('[role="tab"]'); |
| 25 |
var $panels = $('.wpbc_add_appointment__rightbar').find('[role="tabpanel"]'); |
| 26 |
$tabs.attr('aria-selected', 'false'); |
| 27 |
$tab.attr('aria-selected', 'true'); |
| 28 |
$panels.attr({ |
| 29 |
hidden: true, |
| 30 |
'aria-hidden': 'true' |
| 31 |
}); |
| 32 |
$('#' + panel_id).removeAttr('hidden').attr('aria-hidden', 'false'); |
| 33 |
} |
| 34 |
|
| 35 |
/** Return trimmed visible text from the first matching element. */ |
| 36 |
function get_text($root, selector) { |
| 37 |
return String($root.find(selector).first().text() || '').replace(/\s+/g, ' ').trim(); |
| 38 |
} |
| 39 |
|
| 40 |
/** Return the display value of one native Booking Form field. */ |
| 41 |
function get_field_value($field) { |
| 42 |
var value; |
| 43 |
if (!$field.length) { |
| 44 |
return ''; |
| 45 |
} |
| 46 |
if ($field.is('select')) { |
| 47 |
value = $field.find('option:selected').text(); |
| 48 |
} else { |
| 49 |
value = $field.val(); |
| 50 |
} |
| 51 |
return String(value || '').replace(/\s+/g, ' ').trim(); |
| 52 |
} |
| 53 |
|
| 54 |
/** Update one summary value and its empty-state presentation. */ |
| 55 |
function set_summary_value(key, value) { |
| 56 |
var $target = $('[data-wpbc-add-appointment-summary="' + key + '"]'); |
| 57 |
var is_empty = '' === String(value || '').trim(); |
| 58 |
$target.text(is_empty ? labels.emptyLabel || 'Not selected' : value); |
| 59 |
$target.toggleClass('is-empty', is_empty); |
| 60 |
} |
| 61 |
|
| 62 |
/** |
| 63 |
* Expand one Settings inspector group through the shared collapsible API. |
| 64 |
* |
| 65 |
* @param {string} group_name Group data key. |
| 66 |
* @param {string} focus_selector Optional control to focus after expansion. |
| 67 |
* @return {void} |
| 68 |
*/ |
| 69 |
function open_inspector_group(group_name, focus_selector) { |
| 70 |
var $group = $('.wpbc_add_appointment__inspector_overview .wpbc_ui__collapsible_group[data-group="' + group_name + '"]').first(); |
| 71 |
var root; |
| 72 |
var api; |
| 73 |
if (!$group.length) { |
| 74 |
return; |
| 75 |
} |
| 76 |
root = $group.closest('.wpbc_collapsible').get(0); |
| 77 |
api = root && root.__wpbc_collapsible_instance; |
| 78 |
if (api && 'function' === typeof api.expand) { |
| 79 |
api.expand($group.get(0)); |
| 80 |
} else { |
| 81 |
$group.siblings('.wpbc_ui__collapsible_group').each(function () { |
| 82 |
var $sibling = $(this); |
| 83 |
$sibling.removeClass('is-open'); |
| 84 |
$sibling.children('.group__header').attr('aria-expanded', 'false'); |
| 85 |
$sibling.children('.group__fields').attr({ |
| 86 |
hidden: true, |
| 87 |
'aria-hidden': 'true' |
| 88 |
}); |
| 89 |
}); |
| 90 |
$group.addClass('is-open'); |
| 91 |
$group.children('.group__header').attr('aria-expanded', 'true'); |
| 92 |
$group.children('.group__fields').removeAttr('hidden').attr('aria-hidden', 'false'); |
| 93 |
} |
| 94 |
window.requestAnimationFrame(function () { |
| 95 |
$group.get(0).scrollIntoView({ |
| 96 |
behavior: 'smooth', |
| 97 |
block: 'start' |
| 98 |
}); |
| 99 |
if (focus_selector) { |
| 100 |
window.setTimeout(function () { |
| 101 |
$(focus_selector).first().trigger('focus'); |
| 102 |
}, 250); |
| 103 |
} |
| 104 |
}); |
| 105 |
} |
| 106 |
|
| 107 |
/** Format the effective before/after Service buffers. */ |
| 108 |
function get_buffer_summary($source) { |
| 109 |
var before = $source.attr('data-buffer-before'); |
| 110 |
var after = $source.attr('data-buffer-after'); |
| 111 |
if ('undefined' === typeof before) { |
| 112 |
before = $source.attr('data-summary-buffer-before'); |
| 113 |
after = $source.attr('data-summary-buffer-after'); |
| 114 |
} |
| 115 |
if ('undefined' === typeof before || 'undefined' === typeof after) { |
| 116 |
return ''; |
| 117 |
} |
| 118 |
return String(before) + ' / ' + String(after) + ' ' + (labels.minutesLabel || 'min'); |
| 119 |
} |
| 120 |
|
| 121 |
/** Read the most useful customer identity from the loaded Booking Form. */ |
| 122 |
function get_customer_summary($form) { |
| 123 |
var first = get_field_value($form.find('[name^="firstname"]').first()); |
| 124 |
var last = get_field_value($form.find('[name^="secondname"], [name^="lastname"]').first()); |
| 125 |
var email = get_field_value($form.find('[name^="email"]').first()); |
| 126 |
var name = String(first + ' ' + last).trim(); |
| 127 |
return name || email; |
| 128 |
} |
| 129 |
|
| 130 |
/** Mirror live Appointment and native Booking Form values into the inspector. */ |
| 131 |
function refresh_summary() { |
| 132 |
var $root = $('.wpbc_add_appointment__canvas .wpbc_booking_appointment').first(); |
| 133 |
var $native = $root.find('.wpbc_booking_appointment__native_form').first(); |
| 134 |
var $form = $native.find('form').first(); |
| 135 |
var $service = $root.find('input[name="wpbc_appointment_service"]:checked').closest('.wpbc_booking_appointment__choice'); |
| 136 |
var $provider = $root.find('input[name="wpbc_appointment_provider"]:checked').closest('.wpbc_booking_appointment__choice'); |
| 137 |
var $selected = $root.find('.wpbc_booking_appointment__selected').first(); |
| 138 |
var $detail_source = $provider.length ? $provider : $service.length ? $service : $selected; |
| 139 |
var stage = $root.attr('data-appointment-stage') || 'service'; |
| 140 |
var step = get_text($root, '.wpbc_booking_appointment__progress_step.is-active .wpbc_booking_appointment__progress_label'); |
| 141 |
var service = $service.attr('data-summary-service') || $selected.attr('data-summary-service') || ''; |
| 142 |
var provider = $provider.attr('data-summary-provider') || ''; |
| 143 |
var duration = $detail_source.attr('data-summary-duration') || ''; |
| 144 |
var price = $detail_source.attr('data-summary-price') || ''; |
| 145 |
if ($native.length) { |
| 146 |
service = $native.attr('data-service-title') || service; |
| 147 |
provider = $native.attr('data-provider-title') || provider; |
| 148 |
duration = $native.attr('data-duration-label') || duration; |
| 149 |
price = $native.attr('data-service-cost-label') || price; |
| 150 |
$detail_source = $native; |
| 151 |
} |
| 152 |
set_summary_value('step', step || stage); |
| 153 |
set_summary_value('service', service); |
| 154 |
set_summary_value('provider', provider); |
| 155 |
set_summary_value('duration', duration); |
| 156 |
set_summary_value('buffers', get_buffer_summary($detail_source)); |
| 157 |
set_summary_value('price', price); |
| 158 |
set_summary_value('date', get_field_value($form.find('[id^="date_booking"]').first())); |
| 159 |
set_summary_value('time', get_field_value($form.find('[name^="starttime"]').first())); |
| 160 |
set_summary_value('customer', get_customer_summary($form)); |
| 161 |
set_summary_value('form', $native.attr('data-form-slug') || ''); |
| 162 |
set_summary_value('emails', $('#is_send_email_for_pending').is(':checked') ? labels.enabledLabel || 'Enabled' : labels.disabledLabel || 'Disabled'); |
| 163 |
$('[data-wpbc-add-appointment-start-over]').prop('hidden', 'service' === stage); |
| 164 |
$('[data-wpbc-add-appointment-autofill]').prop('disabled', !$form.length); |
| 165 |
} |
| 166 |
|
| 167 |
/** Debounce summary work during large AJAX Booking Form DOM insertions. */ |
| 168 |
function schedule_summary_refresh() { |
| 169 |
window.clearTimeout(summary_timer); |
| 170 |
summary_timer = window.setTimeout(refresh_summary, 20); |
| 171 |
} |
| 172 |
|
| 173 |
/** Fill sample customer fields in the current form without submitting it. */ |
| 174 |
function auto_fill_booking_form() { |
| 175 |
var $form = $('.wpbc_add_appointment__canvas .wpbc_booking_appointment__native_form form').first(); |
| 176 |
if (!$form.length) { |
| 177 |
return; |
| 178 |
} |
| 179 |
$form.find('input, textarea, select').each(function () { |
| 180 |
var $field = $(this); |
| 181 |
var name = String($field.attr('name') || '').toLowerCase(); |
| 182 |
var type = String($field.attr('type') || '').toLowerCase(); |
| 183 |
var ignored = /date_booking|starttime|endtime|durationtime|rangetime|captcha|coupon|service_id|appointment_/.test(name); |
| 184 |
var value = ''; |
| 185 |
if (ignored || $field.is(':disabled') || 'hidden' === type || 'button' === type || 'submit' === type || 'radio' === type) { |
| 186 |
return; |
| 187 |
} |
| 188 |
if ('checkbox' === type) { |
| 189 |
if ($field.prop('required')) { |
| 190 |
$field.prop('checked', true).trigger('change'); |
| 191 |
} |
| 192 |
return; |
| 193 |
} |
| 194 |
if ($field.is('select')) { |
| 195 |
if (!$field.val()) { |
| 196 |
var $option = $field.find('option:not(:disabled)').filter(function () { |
| 197 |
return '' !== String($(this).val() || ''); |
| 198 |
}).first(); |
| 199 |
if ($option.length) { |
| 200 |
$field.val($option.val()).trigger('change'); |
| 201 |
} |
| 202 |
} |
| 203 |
return; |
| 204 |
} |
| 205 |
if (/^firstname/.test(name)) { |
| 206 |
value = 'John'; |
| 207 |
} else if (/^(secondname|lastname)/.test(name)) { |
| 208 |
value = 'Smith'; |
| 209 |
} else if (/^email/.test(name) || 'email' === type) { |
| 210 |
value = '[email protected]'; |
| 211 |
} else if (/^phone/.test(name) || 'tel' === type) { |
| 212 |
value = '0000000000'; |
| 213 |
} else if ($field.is('textarea')) { |
| 214 |
value = '---'; |
| 215 |
} |
| 216 |
if (value && !$field.val()) { |
| 217 |
$field.val(value).trigger('input').trigger('change'); |
| 218 |
} |
| 219 |
}); |
| 220 |
schedule_summary_refresh(); |
| 221 |
} |
| 222 |
|
| 223 |
/** Copy the authoritative Appointment correction into its convenience slider. */ |
| 224 |
function synchronize_cost_correction_range() { |
| 225 |
var $number_field = $('#wpbc_add_appointment_cost_correction'); |
| 226 |
var $range = $('[data-wpbc-admin-cost-correction-range="1"]').first(); |
| 227 |
var number_value; |
| 228 |
if (!$number_field.length || !$range.length) { |
| 229 |
return; |
| 230 |
} |
| 231 |
number_value = Number($number_field.val()); |
| 232 |
if ('' === String($number_field.val() || '').trim() || !isFinite(number_value)) { |
| 233 |
$range.val('0'); |
| 234 |
return; |
| 235 |
} |
| 236 |
$range.val(String(number_value)); |
| 237 |
} |
| 238 |
|
| 239 |
/** Copy the convenience slider into the authoritative Appointment number input. */ |
| 240 |
function synchronize_cost_correction_number() { |
| 241 |
var $number_field = $('#wpbc_add_appointment_cost_correction'); |
| 242 |
var $range = $('[data-wpbc-admin-cost-correction-range="1"]').first(); |
| 243 |
if (!$number_field.length || !$range.length) { |
| 244 |
return; |
| 245 |
} |
| 246 |
$number_field.val($range.val()).trigger('input'); |
| 247 |
} |
| 248 |
|
| 249 |
/** Clear an unsaved or successfully submitted Appointment correction draft. */ |
| 250 |
function clear_cost_correction() { |
| 251 |
var $number_field = $('#wpbc_add_appointment_cost_correction'); |
| 252 |
if (!$number_field.length) { |
| 253 |
return; |
| 254 |
} |
| 255 |
$number_field.val(''); |
| 256 |
synchronize_cost_correction_range(); |
| 257 |
} |
| 258 |
|
| 259 |
/** |
| 260 |
* Add an explicitly entered correction to the active Appointment request. |
| 261 |
* |
| 262 |
* The inspector is outside the AJAX-inserted native Booking Form. Requiring |
| 263 |
* the submitted Provider to match the active Appointment form prevents this |
| 264 |
* page-only draft from affecting an unrelated booking-create event. |
| 265 |
* |
| 266 |
* @param {Event} event jQuery event. |
| 267 |
* @param {number} resource_id Submitted Provider resource ID. |
| 268 |
* @param {Object} params Mutable booking-create request parameters. |
| 269 |
* @return {void} |
| 270 |
*/ |
| 271 |
function add_cost_correction_to_appointment_request(event, resource_id, params) { |
| 272 |
var number_field = document.getElementById('wpbc_add_appointment_cost_correction'); |
| 273 |
var $native_form = $('.wpbc_add_appointment__canvas .wpbc_booking_appointment__native_form[data-provider-id="' + Number(resource_id || 0) + '"]').first(); |
| 274 |
var raw_cost; |
| 275 |
if (!params || !number_field || !$native_form.length) { |
| 276 |
return; |
| 277 |
} |
| 278 |
delete params.wpbc_admin_cost_correction; |
| 279 |
raw_cost = String(number_field.value || '').trim(); |
| 280 |
if ('' === raw_cost || !number_field.checkValidity()) { |
| 281 |
return; |
| 282 |
} |
| 283 |
params.wpbc_admin_cost_correction = raw_cost; |
| 284 |
} |
| 285 |
$(document).on('click', '.wpbc_add_appointment__rightbar_tabs [role="tab"]', function (event) { |
| 286 |
event.preventDefault(); |
| 287 |
switch_right_panel($(this)); |
| 288 |
}); |
| 289 |
$(document).on('click', '[data-wpbc-add-appointment-start-over]', function () { |
| 290 |
clear_cost_correction(); |
| 291 |
var $action = $('.wpbc_add_appointment__canvas [data-wpbc-appointment-action="start-over"]').first(); |
| 292 |
if (!$action.length) { |
| 293 |
$action = $('.wpbc_add_appointment__canvas [data-appointment-back="service"]').first(); |
| 294 |
} |
| 295 |
if ($action.length) { |
| 296 |
$action.trigger('click'); |
| 297 |
} |
| 298 |
}); |
| 299 |
$(document).on('click', '.wpbc_add_appointment__canvas [data-wpbc-appointment-action="start-over"]', clear_cost_correction); |
| 300 |
$(document).on('click', '[data-wpbc-add-appointment-open-group]', function (event) { |
| 301 |
event.preventDefault(); |
| 302 |
open_inspector_group($(this).attr('data-wpbc-add-appointment-open-group'), $(this).attr('data-wpbc-add-appointment-focus') || ''); |
| 303 |
}); |
| 304 |
$(document).on('click', '[data-wpbc-add-appointment-autofill]', auto_fill_booking_form); |
| 305 |
$(document).on('input change wpbc_booking_date_or_option_selected', '.wpbc_add_appointment__canvas, #is_send_email_for_pending', schedule_summary_refresh); |
| 306 |
$(document).on('input', '#wpbc_add_appointment_cost_correction', synchronize_cost_correction_range); |
| 307 |
$(document).on('input', '.wpbc_add_appointment__cost_correction [data-wpbc-admin-cost-correction-range="1"]', synchronize_cost_correction_number); |
| 308 |
$('body').on('wpbc_before_booking_create.wpbc_add_appointment_cost_correction', add_cost_correction_to_appointment_request); |
| 309 |
$('body').on('wpbc_booking_form_submit_success.wpbc_add_appointment_cost_correction', clear_cost_correction); |
| 310 |
$(function () { |
| 311 |
var stage = document.querySelector('.wpbc_add_appointment__canvas .wpbc_booking_appointment__stage'); |
| 312 |
apply_booking_context(); |
| 313 |
refresh_summary(); |
| 314 |
synchronize_cost_correction_range(); |
| 315 |
if (stage && window.MutationObserver) { |
| 316 |
new MutationObserver(schedule_summary_refresh).observe(stage, { |
| 317 |
childList: true, |
| 318 |
subtree: true |
| 319 |
}); |
| 320 |
} |
| 321 |
}); |
| 322 |
})(jQuery); |
| 323 |
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1hZGQtYXBwb2ludG1lbnQvX291dC9hZGRfYXBwb2ludG1lbnRfcGFnZS5qcyIsIm5hbWVzIjpbIiQiLCJzdW1tYXJ5X3RpbWVyIiwibGFiZWxzIiwid2luZG93Iiwid3BiY19hZGRfYXBwb2ludG1lbnRfcGFnZV9jb25maWciLCJhcHBseV9ib29raW5nX2NvbnRleHQiLCJfd3BiYyIsInNldF9vdGhlcl9wYXJhbSIsImFsbG93UGFzdCIsImFsbG93UGFzdERhdGVBcnIiLCJTdHJpbmciLCJhZG1pbkJvb2tpbmdOb25jZSIsInN3aXRjaF9yaWdodF9wYW5lbCIsIiR0YWIiLCJwYW5lbF9pZCIsImF0dHIiLCIkdGFicyIsImNsb3Nlc3QiLCJmaW5kIiwiJHBhbmVscyIsImhpZGRlbiIsInJlbW92ZUF0dHIiLCJnZXRfdGV4dCIsIiRyb290Iiwic2VsZWN0b3IiLCJmaXJzdCIsInRleHQiLCJyZXBsYWNlIiwidHJpbSIsImdldF9maWVsZF92YWx1ZSIsIiRmaWVsZCIsInZhbHVlIiwibGVuZ3RoIiwiaXMiLCJ2YWwiLCJzZXRfc3VtbWFyeV92YWx1ZSIsImtleSIsIiR0YXJnZXQiLCJpc19lbXB0eSIsImVtcHR5TGFiZWwiLCJ0b2dnbGVDbGFzcyIsIm9wZW5faW5zcGVjdG9yX2dyb3VwIiwiZ3JvdXBfbmFtZSIsImZvY3VzX3NlbGVjdG9yIiwiJGdyb3VwIiwicm9vdCIsImFwaSIsImdldCIsIl9fd3BiY19jb2xsYXBzaWJsZV9pbnN0YW5jZSIsImV4cGFuZCIsInNpYmxpbmdzIiwiZWFjaCIsIiRzaWJsaW5nIiwicmVtb3ZlQ2xhc3MiLCJjaGlsZHJlbiIsImFkZENsYXNzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2Nyb2xsSW50b1ZpZXciLCJiZWhhdmlvciIsImJsb2NrIiwic2V0VGltZW91dCIsInRyaWdnZXIiLCJnZXRfYnVmZmVyX3N1bW1hcnkiLCIkc291cmNlIiwiYmVmb3JlIiwiYWZ0ZXIiLCJtaW51dGVzTGFiZWwiLCJnZXRfY3VzdG9tZXJfc3VtbWFyeSIsIiRmb3JtIiwibGFzdCIsImVtYWlsIiwibmFtZSIsInJlZnJlc2hfc3VtbWFyeSIsIiRuYXRpdmUiLCIkc2VydmljZSIsIiRwcm92aWRlciIsIiRzZWxlY3RlZCIsIiRkZXRhaWxfc291cmNlIiwic3RhZ2UiLCJzdGVwIiwic2VydmljZSIsInByb3ZpZGVyIiwiZHVyYXRpb24iLCJwcmljZSIsImVuYWJsZWRMYWJlbCIsImRpc2FibGVkTGFiZWwiLCJwcm9wIiwic2NoZWR1bGVfc3VtbWFyeV9yZWZyZXNoIiwiY2xlYXJUaW1lb3V0IiwiYXV0b19maWxsX2Jvb2tpbmdfZm9ybSIsInRvTG93ZXJDYXNlIiwidHlwZSIsImlnbm9yZWQiLCJ0ZXN0IiwiJG9wdGlvbiIsImZpbHRlciIsInN5bmNocm9uaXplX2Nvc3RfY29ycmVjdGlvbl9yYW5nZSIsIiRudW1iZXJfZmllbGQiLCIkcmFuZ2UiLCJudW1iZXJfdmFsdWUiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInN5bmNocm9uaXplX2Nvc3RfY29ycmVjdGlvbl9udW1iZXIiLCJjbGVhcl9jb3N0X2NvcnJlY3Rpb24iLCJhZGRfY29zdF9jb3JyZWN0aW9uX3RvX2FwcG9pbnRtZW50X3JlcXVlc3QiLCJldmVudCIsInJlc291cmNlX2lkIiwicGFyYW1zIiwibnVtYmVyX2ZpZWxkIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsIiRuYXRpdmVfZm9ybSIsInJhd19jb3N0Iiwid3BiY19hZG1pbl9jb3N0X2NvcnJlY3Rpb24iLCJjaGVja1ZhbGlkaXR5Iiwib24iLCJwcmV2ZW50RGVmYXVsdCIsIiRhY3Rpb24iLCJxdWVyeVNlbGVjdG9yIiwiTXV0YXRpb25PYnNlcnZlciIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwialF1ZXJ5Il0sInNvdXJjZXMiOlsiaW5jbHVkZXMvcGFnZS1hZGQtYXBwb2ludG1lbnQvX3NyYy9hZGRfYXBwb2ludG1lbnRfcGFnZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQWRkIEFwcG9pbnRtZW50IGFkbWluaXN0cmF0b3IgaW5zcGVjdG9yIGFuZCBub24tc3VibWl0dGluZyBoZWxwZXIgdG9vbHMuICovXG4oIGZ1bmN0aW9uICggJCApIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBzdW1tYXJ5X3RpbWVyID0gMDtcblx0dmFyIGxhYmVscyA9IHdpbmRvdy53cGJjX2FkZF9hcHBvaW50bWVudF9wYWdlX2NvbmZpZyB8fCB7fTtcblxuXHQvKiogQXBwbHkgdGhlIGFkbWluaXN0cmF0b3IgcGFnZSBjb250ZXh0IGJlZm9yZSBhbnkgUHJvdmlkZXIgY2FsZW5kYXIgbG9hZHMuICovXG5cdGZ1bmN0aW9uIGFwcGx5X2Jvb2tpbmdfY29udGV4dCgpIHtcblx0XHRpZiAoICd1bmRlZmluZWQnID09PSB0eXBlb2Ygd2luZG93Ll93cGJjICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHdpbmRvdy5fd3BiYy5zZXRfb3RoZXJfcGFyYW0oICd0aGlzX3BhZ2VfYm9va2luZ19oYXNoJywgJycgKTtcblx0XHR3aW5kb3cuX3dwYmMuc2V0X290aGVyX3BhcmFtKCAndGhpc19wYWdlX2FsbG93X3Bhc3QnLCBsYWJlbHMuYWxsb3dQYXN0ID8gMSA6IDAgKTtcblx0XHR3aW5kb3cuX3dwYmMuc2V0X290aGVyX3BhcmFtKCAndGhpc19wYWdlX2FsbG93X3Bhc3RfYXJyJywgbGFiZWxzLmFsbG93UGFzdERhdGVBcnIgfHwgW10gKTtcblx0XHR3aW5kb3cuX3dwYmMuc2V0X290aGVyX3BhcmFtKCAndGhpc19wYWdlX2FkbWluX2Jvb2tpbmdfbm9uY2UnLCBTdHJpbmcoIGxhYmVscy5hZG1pbkJvb2tpbmdOb25jZSB8fCAnJyApICk7XG5cdH1cblxuXHQvKiogU3dpdGNoIG9uZSBzaGFyZWQgcmlnaHQtc2lkZWJhciBwYW5lbC4gKi9cblx0ZnVuY3Rpb24gc3dpdGNoX3JpZ2h0X3BhbmVsKCAkdGFiICkge1xuXHRcdHZhciBwYW5lbF9pZCA9ICR0YWIuYXR0ciggJ2FyaWEtY29udHJvbHMnICk7XG5cdFx0dmFyICR0YWJzID0gJHRhYi5jbG9zZXN0KCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19yaWdodGJhcl90YWJzJyApLmZpbmQoICdbcm9sZT1cInRhYlwiXScgKTtcblx0XHR2YXIgJHBhbmVscyA9ICQoICcud3BiY19hZGRfYXBwb2ludG1lbnRfX3JpZ2h0YmFyJyApLmZpbmQoICdbcm9sZT1cInRhYnBhbmVsXCJdJyApO1xuXG5cdFx0JHRhYnMuYXR0ciggJ2FyaWEtc2VsZWN0ZWQnLCAnZmFsc2UnICk7XG5cdFx0JHRhYi5hdHRyKCAnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyApO1xuXHRcdCRwYW5lbHMuYXR0ciggeyBoaWRkZW46IHRydWUsICdhcmlhLWhpZGRlbic6ICd0cnVlJyB9ICk7XG5cdFx0JCggJyMnICsgcGFuZWxfaWQgKS5yZW1vdmVBdHRyKCAnaGlkZGVuJyApLmF0dHIoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcblx0fVxuXG5cdC8qKiBSZXR1cm4gdHJpbW1lZCB2aXNpYmxlIHRleHQgZnJvbSB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudC4gKi9cblx0ZnVuY3Rpb24gZ2V0X3RleHQoICRyb290LCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gU3RyaW5nKCAkcm9vdC5maW5kKCBzZWxlY3RvciApLmZpcnN0KCkudGV4dCgpIHx8ICcnICkucmVwbGFjZSggL1xccysvZywgJyAnICkudHJpbSgpO1xuXHR9XG5cblx0LyoqIFJldHVybiB0aGUgZGlzcGxheSB2YWx1ZSBvZiBvbmUgbmF0aXZlIEJvb2tpbmcgRm9ybSBmaWVsZC4gKi9cblx0ZnVuY3Rpb24gZ2V0X2ZpZWxkX3ZhbHVlKCAkZmllbGQgKSB7XG5cdFx0dmFyIHZhbHVlO1xuXG5cdFx0aWYgKCAhICRmaWVsZC5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHRcdGlmICggJGZpZWxkLmlzKCAnc2VsZWN0JyApICkge1xuXHRcdFx0dmFsdWUgPSAkZmllbGQuZmluZCggJ29wdGlvbjpzZWxlY3RlZCcgKS50ZXh0KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbHVlID0gJGZpZWxkLnZhbCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiBTdHJpbmcoIHZhbHVlIHx8ICcnICkucmVwbGFjZSggL1xccysvZywgJyAnICkudHJpbSgpO1xuXHR9XG5cblx0LyoqIFVwZGF0ZSBvbmUgc3VtbWFyeSB2YWx1ZSBhbmQgaXRzIGVtcHR5LXN0YXRlIHByZXNlbnRhdGlvbi4gKi9cblx0ZnVuY3Rpb24gc2V0X3N1bW1hcnlfdmFsdWUoIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyICR0YXJnZXQgPSAkKCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtc3VtbWFyeT1cIicgKyBrZXkgKyAnXCJdJyApO1xuXHRcdHZhciBpc19lbXB0eSA9ICcnID09PSBTdHJpbmcoIHZhbHVlIHx8ICcnICkudHJpbSgpO1xuXG5cdFx0JHRhcmdldC50ZXh0KCBpc19lbXB0eSA/ICggbGFiZWxzLmVtcHR5TGFiZWwgfHwgJ05vdCBzZWxlY3RlZCcgKSA6IHZhbHVlICk7XG5cdFx0JHRhcmdldC50b2dnbGVDbGFzcyggJ2lzLWVtcHR5JywgaXNfZW1wdHkgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeHBhbmQgb25lIFNldHRpbmdzIGluc3BlY3RvciBncm91cCB0aHJvdWdoIHRoZSBzaGFyZWQgY29sbGFwc2libGUgQVBJLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBfbmFtZSBHcm91cCBkYXRhIGtleS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGZvY3VzX3NlbGVjdG9yIE9wdGlvbmFsIGNvbnRyb2wgdG8gZm9jdXMgYWZ0ZXIgZXhwYW5zaW9uLlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gb3Blbl9pbnNwZWN0b3JfZ3JvdXAoIGdyb3VwX25hbWUsIGZvY3VzX3NlbGVjdG9yICkge1xuXHRcdHZhciAkZ3JvdXAgPSAkKCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19pbnNwZWN0b3Jfb3ZlcnZpZXcgLndwYmNfdWlfX2NvbGxhcHNpYmxlX2dyb3VwW2RhdGEtZ3JvdXA9XCInICsgZ3JvdXBfbmFtZSArICdcIl0nICkuZmlyc3QoKTtcblx0XHR2YXIgcm9vdDtcblx0XHR2YXIgYXBpO1xuXG5cdFx0aWYgKCAhICRncm91cC5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cm9vdCA9ICRncm91cC5jbG9zZXN0KCAnLndwYmNfY29sbGFwc2libGUnICkuZ2V0KCAwICk7XG5cdFx0YXBpID0gcm9vdCAmJiByb290Ll9fd3BiY19jb2xsYXBzaWJsZV9pbnN0YW5jZTtcblxuXHRcdGlmICggYXBpICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBhcGkuZXhwYW5kICkge1xuXHRcdFx0YXBpLmV4cGFuZCggJGdyb3VwLmdldCggMCApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRncm91cC5zaWJsaW5ncyggJy53cGJjX3VpX19jb2xsYXBzaWJsZV9ncm91cCcgKS5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciAkc2libGluZyA9ICQoIHRoaXMgKTtcblx0XHRcdFx0JHNpYmxpbmcucmVtb3ZlQ2xhc3MoICdpcy1vcGVuJyApO1xuXHRcdFx0XHQkc2libGluZy5jaGlsZHJlbiggJy5ncm91cF9faGVhZGVyJyApLmF0dHIoICdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyApO1xuXHRcdFx0XHQkc2libGluZy5jaGlsZHJlbiggJy5ncm91cF9fZmllbGRzJyApLmF0dHIoIHsgaGlkZGVuOiB0cnVlLCAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSApO1xuXHRcdFx0fSApO1xuXHRcdFx0JGdyb3VwLmFkZENsYXNzKCAnaXMtb3BlbicgKTtcblx0XHRcdCRncm91cC5jaGlsZHJlbiggJy5ncm91cF9faGVhZGVyJyApLmF0dHIoICdhcmlhLWV4cGFuZGVkJywgJ3RydWUnICk7XG5cdFx0XHQkZ3JvdXAuY2hpbGRyZW4oICcuZ3JvdXBfX2ZpZWxkcycgKS5yZW1vdmVBdHRyKCAnaGlkZGVuJyApLmF0dHIoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcblx0XHR9XG5cblx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHQkZ3JvdXAuZ2V0KCAwICkuc2Nyb2xsSW50b1ZpZXcoIHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9ICk7XG5cdFx0XHRpZiAoIGZvY3VzX3NlbGVjdG9yICkge1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCQoIGZvY3VzX3NlbGVjdG9yICkuZmlyc3QoKS50cmlnZ2VyKCAnZm9jdXMnICk7XG5cdFx0XHRcdH0sIDI1MCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdC8qKiBGb3JtYXQgdGhlIGVmZmVjdGl2ZSBiZWZvcmUvYWZ0ZXIgU2VydmljZSBidWZmZXJzLiAqL1xuXHRmdW5jdGlvbiBnZXRfYnVmZmVyX3N1bW1hcnkoICRzb3VyY2UgKSB7XG5cdFx0dmFyIGJlZm9yZSA9ICRzb3VyY2UuYXR0ciggJ2RhdGEtYnVmZmVyLWJlZm9yZScgKTtcblx0XHR2YXIgYWZ0ZXIgPSAkc291cmNlLmF0dHIoICdkYXRhLWJ1ZmZlci1hZnRlcicgKTtcblxuXHRcdGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBiZWZvcmUgKSB7XG5cdFx0XHRiZWZvcmUgPSAkc291cmNlLmF0dHIoICdkYXRhLXN1bW1hcnktYnVmZmVyLWJlZm9yZScgKTtcblx0XHRcdGFmdGVyID0gJHNvdXJjZS5hdHRyKCAnZGF0YS1zdW1tYXJ5LWJ1ZmZlci1hZnRlcicgKTtcblx0XHR9XG5cdFx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGJlZm9yZSB8fCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGFmdGVyICkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdHJldHVybiBTdHJpbmcoIGJlZm9yZSApICsgJyAvICcgKyBTdHJpbmcoIGFmdGVyICkgKyAnICcgKyAoIGxhYmVscy5taW51dGVzTGFiZWwgfHwgJ21pbicgKTtcblx0fVxuXG5cdC8qKiBSZWFkIHRoZSBtb3N0IHVzZWZ1bCBjdXN0b21lciBpZGVudGl0eSBmcm9tIHRoZSBsb2FkZWQgQm9va2luZyBGb3JtLiAqL1xuXHRmdW5jdGlvbiBnZXRfY3VzdG9tZXJfc3VtbWFyeSggJGZvcm0gKSB7XG5cdFx0dmFyIGZpcnN0ID0gZ2V0X2ZpZWxkX3ZhbHVlKCAkZm9ybS5maW5kKCAnW25hbWVePVwiZmlyc3RuYW1lXCJdJyApLmZpcnN0KCkgKTtcblx0XHR2YXIgbGFzdCA9IGdldF9maWVsZF92YWx1ZSggJGZvcm0uZmluZCggJ1tuYW1lXj1cInNlY29uZG5hbWVcIl0sIFtuYW1lXj1cImxhc3RuYW1lXCJdJyApLmZpcnN0KCkgKTtcblx0XHR2YXIgZW1haWwgPSBnZXRfZmllbGRfdmFsdWUoICRmb3JtLmZpbmQoICdbbmFtZV49XCJlbWFpbFwiXScgKS5maXJzdCgpICk7XG5cdFx0dmFyIG5hbWUgPSBTdHJpbmcoIGZpcnN0ICsgJyAnICsgbGFzdCApLnRyaW0oKTtcblxuXHRcdHJldHVybiBuYW1lIHx8IGVtYWlsO1xuXHR9XG5cblx0LyoqIE1pcnJvciBsaXZlIEFwcG9pbnRtZW50IGFuZCBuYXRpdmUgQm9va2luZyBGb3JtIHZhbHVlcyBpbnRvIHRoZSBpbnNwZWN0b3IuICovXG5cdGZ1bmN0aW9uIHJlZnJlc2hfc3VtbWFyeSgpIHtcblx0XHR2YXIgJHJvb3QgPSAkKCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19jYW52YXMgLndwYmNfYm9va2luZ19hcHBvaW50bWVudCcgKS5maXJzdCgpO1xuXHRcdHZhciAkbmF0aXZlID0gJHJvb3QuZmluZCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX25hdGl2ZV9mb3JtJyApLmZpcnN0KCk7XG5cdFx0dmFyICRmb3JtID0gJG5hdGl2ZS5maW5kKCAnZm9ybScgKS5maXJzdCgpO1xuXHRcdHZhciAkc2VydmljZSA9ICRyb290LmZpbmQoICdpbnB1dFtuYW1lPVwid3BiY19hcHBvaW50bWVudF9zZXJ2aWNlXCJdOmNoZWNrZWQnICkuY2xvc2VzdCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2Nob2ljZScgKTtcblx0XHR2YXIgJHByb3ZpZGVyID0gJHJvb3QuZmluZCggJ2lucHV0W25hbWU9XCJ3cGJjX2FwcG9pbnRtZW50X3Byb3ZpZGVyXCJdOmNoZWNrZWQnICkuY2xvc2VzdCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX2Nob2ljZScgKTtcblx0XHR2YXIgJHNlbGVjdGVkID0gJHJvb3QuZmluZCggJy53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX3NlbGVjdGVkJyApLmZpcnN0KCk7XG5cdFx0dmFyICRkZXRhaWxfc291cmNlID0gJHByb3ZpZGVyLmxlbmd0aCA/ICRwcm92aWRlciA6ICggJHNlcnZpY2UubGVuZ3RoID8gJHNlcnZpY2UgOiAkc2VsZWN0ZWQgKTtcblx0XHR2YXIgc3RhZ2UgPSAkcm9vdC5hdHRyKCAnZGF0YS1hcHBvaW50bWVudC1zdGFnZScgKSB8fCAnc2VydmljZSc7XG5cdFx0dmFyIHN0ZXAgPSBnZXRfdGV4dCggJHJvb3QsICcud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19wcm9ncmVzc19zdGVwLmlzLWFjdGl2ZSAud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19wcm9ncmVzc19sYWJlbCcgKTtcblx0XHR2YXIgc2VydmljZSA9ICRzZXJ2aWNlLmF0dHIoICdkYXRhLXN1bW1hcnktc2VydmljZScgKSB8fCAkc2VsZWN0ZWQuYXR0ciggJ2RhdGEtc3VtbWFyeS1zZXJ2aWNlJyApIHx8ICcnO1xuXHRcdHZhciBwcm92aWRlciA9ICRwcm92aWRlci5hdHRyKCAnZGF0YS1zdW1tYXJ5LXByb3ZpZGVyJyApIHx8ICcnO1xuXHRcdHZhciBkdXJhdGlvbiA9ICRkZXRhaWxfc291cmNlLmF0dHIoICdkYXRhLXN1bW1hcnktZHVyYXRpb24nICkgfHwgJyc7XG5cdFx0dmFyIHByaWNlID0gJGRldGFpbF9zb3VyY2UuYXR0ciggJ2RhdGEtc3VtbWFyeS1wcmljZScgKSB8fCAnJztcblxuXHRcdGlmICggJG5hdGl2ZS5sZW5ndGggKSB7XG5cdFx0XHRzZXJ2aWNlID0gJG5hdGl2ZS5hdHRyKCAnZGF0YS1zZXJ2aWNlLXRpdGxlJyApIHx8IHNlcnZpY2U7XG5cdFx0XHRwcm92aWRlciA9ICRuYXRpdmUuYXR0ciggJ2RhdGEtcHJvdmlkZXItdGl0bGUnICkgfHwgcHJvdmlkZXI7XG5cdFx0XHRkdXJhdGlvbiA9ICRuYXRpdmUuYXR0ciggJ2RhdGEtZHVyYXRpb24tbGFiZWwnICkgfHwgZHVyYXRpb247XG5cdFx0XHRwcmljZSA9ICRuYXRpdmUuYXR0ciggJ2RhdGEtc2VydmljZS1jb3N0LWxhYmVsJyApIHx8IHByaWNlO1xuXHRcdFx0JGRldGFpbF9zb3VyY2UgPSAkbmF0aXZlO1xuXHRcdH1cblxuXHRcdHNldF9zdW1tYXJ5X3ZhbHVlKCAnc3RlcCcsIHN0ZXAgfHwgc3RhZ2UgKTtcblx0XHRzZXRfc3VtbWFyeV92YWx1ZSggJ3NlcnZpY2UnLCBzZXJ2aWNlICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdwcm92aWRlcicsIHByb3ZpZGVyICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdkdXJhdGlvbicsIGR1cmF0aW9uICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdidWZmZXJzJywgZ2V0X2J1ZmZlcl9zdW1tYXJ5KCAkZGV0YWlsX3NvdXJjZSApICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdwcmljZScsIHByaWNlICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdkYXRlJywgZ2V0X2ZpZWxkX3ZhbHVlKCAkZm9ybS5maW5kKCAnW2lkXj1cImRhdGVfYm9va2luZ1wiXScgKS5maXJzdCgpICkgKTtcblx0XHRzZXRfc3VtbWFyeV92YWx1ZSggJ3RpbWUnLCBnZXRfZmllbGRfdmFsdWUoICRmb3JtLmZpbmQoICdbbmFtZV49XCJzdGFydHRpbWVcIl0nICkuZmlyc3QoKSApICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdjdXN0b21lcicsIGdldF9jdXN0b21lcl9zdW1tYXJ5KCAkZm9ybSApICk7XG5cdFx0c2V0X3N1bW1hcnlfdmFsdWUoICdmb3JtJywgJG5hdGl2ZS5hdHRyKCAnZGF0YS1mb3JtLXNsdWcnICkgfHwgJycgKTtcblx0XHRzZXRfc3VtbWFyeV92YWx1ZSggJ2VtYWlscycsICQoICcjaXNfc2VuZF9lbWFpbF9mb3JfcGVuZGluZycgKS5pcyggJzpjaGVja2VkJyApID8gKCBsYWJlbHMuZW5hYmxlZExhYmVsIHx8ICdFbmFibGVkJyApIDogKCBsYWJlbHMuZGlzYWJsZWRMYWJlbCB8fCAnRGlzYWJsZWQnICkgKTtcblx0XHQkKCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtc3RhcnQtb3Zlcl0nICkucHJvcCggJ2hpZGRlbicsICdzZXJ2aWNlJyA9PT0gc3RhZ2UgKTtcblx0XHQkKCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtYXV0b2ZpbGxdJyApLnByb3AoICdkaXNhYmxlZCcsICEgJGZvcm0ubGVuZ3RoICk7XG5cdH1cblxuXHQvKiogRGVib3VuY2Ugc3VtbWFyeSB3b3JrIGR1cmluZyBsYXJnZSBBSkFYIEJvb2tpbmcgRm9ybSBET00gaW5zZXJ0aW9ucy4gKi9cblx0ZnVuY3Rpb24gc2NoZWR1bGVfc3VtbWFyeV9yZWZyZXNoKCkge1xuXHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHN1bW1hcnlfdGltZXIgKTtcblx0XHRzdW1tYXJ5X3RpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIHJlZnJlc2hfc3VtbWFyeSwgMjAgKTtcblx0fVxuXG5cdC8qKiBGaWxsIHNhbXBsZSBjdXN0b21lciBmaWVsZHMgaW4gdGhlIGN1cnJlbnQgZm9ybSB3aXRob3V0IHN1Ym1pdHRpbmcgaXQuICovXG5cdGZ1bmN0aW9uIGF1dG9fZmlsbF9ib29raW5nX2Zvcm0oKSB7XG5cdFx0dmFyICRmb3JtID0gJCggJy53cGJjX2FkZF9hcHBvaW50bWVudF9fY2FudmFzIC53cGJjX2Jvb2tpbmdfYXBwb2ludG1lbnRfX25hdGl2ZV9mb3JtIGZvcm0nICkuZmlyc3QoKTtcblxuXHRcdGlmICggISAkZm9ybS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0JGZvcm0uZmluZCggJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0JyApLmVhY2goIGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciAkZmllbGQgPSAkKCB0aGlzICk7XG5cdFx0XHR2YXIgbmFtZSA9IFN0cmluZyggJGZpZWxkLmF0dHIoICduYW1lJyApIHx8ICcnICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHZhciB0eXBlID0gU3RyaW5nKCAkZmllbGQuYXR0ciggJ3R5cGUnICkgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0dmFyIGlnbm9yZWQgPSAvZGF0ZV9ib29raW5nfHN0YXJ0dGltZXxlbmR0aW1lfGR1cmF0aW9udGltZXxyYW5nZXRpbWV8Y2FwdGNoYXxjb3Vwb258c2VydmljZV9pZHxhcHBvaW50bWVudF8vLnRlc3QoIG5hbWUgKTtcblx0XHRcdHZhciB2YWx1ZSA9ICcnO1xuXG5cdFx0XHRpZiAoIGlnbm9yZWQgfHwgJGZpZWxkLmlzKCAnOmRpc2FibGVkJyApIHx8ICdoaWRkZW4nID09PSB0eXBlIHx8ICdidXR0b24nID09PSB0eXBlIHx8ICdzdWJtaXQnID09PSB0eXBlIHx8ICdyYWRpbycgPT09IHR5cGUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICggJ2NoZWNrYm94JyA9PT0gdHlwZSApIHtcblx0XHRcdFx0aWYgKCAkZmllbGQucHJvcCggJ3JlcXVpcmVkJyApICkge1xuXHRcdFx0XHRcdCRmaWVsZC5wcm9wKCAnY2hlY2tlZCcsIHRydWUgKS50cmlnZ2VyKCAnY2hhbmdlJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICggJGZpZWxkLmlzKCAnc2VsZWN0JyApICkge1xuXHRcdFx0XHRpZiAoICEgJGZpZWxkLnZhbCgpICkge1xuXHRcdFx0XHRcdHZhciAkb3B0aW9uID0gJGZpZWxkLmZpbmQoICdvcHRpb246bm90KDpkaXNhYmxlZCknICkuZmlsdGVyKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJycgIT09IFN0cmluZyggJCggdGhpcyApLnZhbCgpIHx8ICcnICk7XG5cdFx0XHRcdFx0fSApLmZpcnN0KCk7XG5cdFx0XHRcdFx0aWYgKCAkb3B0aW9uLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdCRmaWVsZC52YWwoICRvcHRpb24udmFsKCkgKS50cmlnZ2VyKCAnY2hhbmdlJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoIC9eZmlyc3RuYW1lLy50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdHZhbHVlID0gJ0pvaG4nO1xuXHRcdFx0fSBlbHNlIGlmICggL14oc2Vjb25kbmFtZXxsYXN0bmFtZSkvLnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0dmFsdWUgPSAnU21pdGgnO1xuXHRcdFx0fSBlbHNlIGlmICggL15lbWFpbC8udGVzdCggbmFtZSApIHx8ICdlbWFpbCcgPT09IHR5cGUgKSB7XG5cdFx0XHRcdHZhbHVlID0gJ2JsYW5rQHdwYm9va2luZ21hbmFnZXIuY29tJztcblx0XHRcdH0gZWxzZSBpZiAoIC9ecGhvbmUvLnRlc3QoIG5hbWUgKSB8fCAndGVsJyA9PT0gdHlwZSApIHtcblx0XHRcdFx0dmFsdWUgPSAnMDAwMDAwMDAwMCc7XG5cdFx0XHR9IGVsc2UgaWYgKCAkZmllbGQuaXMoICd0ZXh0YXJlYScgKSApIHtcblx0XHRcdFx0dmFsdWUgPSAnLS0tJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWx1ZSAmJiAhICRmaWVsZC52YWwoKSApIHtcblx0XHRcdFx0JGZpZWxkLnZhbCggdmFsdWUgKS50cmlnZ2VyKCAnaW5wdXQnICkudHJpZ2dlciggJ2NoYW5nZScgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHRzY2hlZHVsZV9zdW1tYXJ5X3JlZnJlc2goKTtcblx0fVxuXG5cdC8qKiBDb3B5IHRoZSBhdXRob3JpdGF0aXZlIEFwcG9pbnRtZW50IGNvcnJlY3Rpb24gaW50byBpdHMgY29udmVuaWVuY2Ugc2xpZGVyLiAqL1xuXHRmdW5jdGlvbiBzeW5jaHJvbml6ZV9jb3N0X2NvcnJlY3Rpb25fcmFuZ2UoKSB7XG5cdFx0dmFyICRudW1iZXJfZmllbGQgPSAkKCAnI3dwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicgKTtcblx0XHR2YXIgJHJhbmdlID0gJCggJ1tkYXRhLXdwYmMtYWRtaW4tY29zdC1jb3JyZWN0aW9uLXJhbmdlPVwiMVwiXScgKS5maXJzdCgpO1xuXHRcdHZhciBudW1iZXJfdmFsdWU7XG5cblx0XHRpZiAoICEgJG51bWJlcl9maWVsZC5sZW5ndGggfHwgISAkcmFuZ2UubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG51bWJlcl92YWx1ZSA9IE51bWJlciggJG51bWJlcl9maWVsZC52YWwoKSApO1xuXHRcdGlmICggJycgPT09IFN0cmluZyggJG51bWJlcl9maWVsZC52YWwoKSB8fCAnJyApLnRyaW0oKSB8fCAhIGlzRmluaXRlKCBudW1iZXJfdmFsdWUgKSApIHtcblx0XHRcdCRyYW5nZS52YWwoICcwJyApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCRyYW5nZS52YWwoIFN0cmluZyggbnVtYmVyX3ZhbHVlICkgKTtcblx0fVxuXG5cdC8qKiBDb3B5IHRoZSBjb252ZW5pZW5jZSBzbGlkZXIgaW50byB0aGUgYXV0aG9yaXRhdGl2ZSBBcHBvaW50bWVudCBudW1iZXIgaW5wdXQuICovXG5cdGZ1bmN0aW9uIHN5bmNocm9uaXplX2Nvc3RfY29ycmVjdGlvbl9udW1iZXIoKSB7XG5cdFx0dmFyICRudW1iZXJfZmllbGQgPSAkKCAnI3dwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicgKTtcblx0XHR2YXIgJHJhbmdlID0gJCggJ1tkYXRhLXdwYmMtYWRtaW4tY29zdC1jb3JyZWN0aW9uLXJhbmdlPVwiMVwiXScgKS5maXJzdCgpO1xuXG5cdFx0aWYgKCAhICRudW1iZXJfZmllbGQubGVuZ3RoIHx8ICEgJHJhbmdlLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkbnVtYmVyX2ZpZWxkLnZhbCggJHJhbmdlLnZhbCgpICkudHJpZ2dlciggJ2lucHV0JyApO1xuXHR9XG5cblx0LyoqIENsZWFyIGFuIHVuc2F2ZWQgb3Igc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCBBcHBvaW50bWVudCBjb3JyZWN0aW9uIGRyYWZ0LiAqL1xuXHRmdW5jdGlvbiBjbGVhcl9jb3N0X2NvcnJlY3Rpb24oKSB7XG5cdFx0dmFyICRudW1iZXJfZmllbGQgPSAkKCAnI3dwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicgKTtcblxuXHRcdGlmICggISAkbnVtYmVyX2ZpZWxkLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkbnVtYmVyX2ZpZWxkLnZhbCggJycgKTtcblx0XHRzeW5jaHJvbml6ZV9jb3N0X2NvcnJlY3Rpb25fcmFuZ2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gZXhwbGljaXRseSBlbnRlcmVkIGNvcnJlY3Rpb24gdG8gdGhlIGFjdGl2ZSBBcHBvaW50bWVudCByZXF1ZXN0LlxuXHQgKlxuXHQgKiBUaGUgaW5zcGVjdG9yIGlzIG91dHNpZGUgdGhlIEFKQVgtaW5zZXJ0ZWQgbmF0aXZlIEJvb2tpbmcgRm9ybS4gUmVxdWlyaW5nXG5cdCAqIHRoZSBzdWJtaXR0ZWQgUHJvdmlkZXIgdG8gbWF0Y2ggdGhlIGFjdGl2ZSBBcHBvaW50bWVudCBmb3JtIHByZXZlbnRzIHRoaXNcblx0ICogcGFnZS1vbmx5IGRyYWZ0IGZyb20gYWZmZWN0aW5nIGFuIHVucmVsYXRlZCBib29raW5nLWNyZWF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgalF1ZXJ5IGV2ZW50LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmVzb3VyY2VfaWQgU3VibWl0dGVkIFByb3ZpZGVyIHJlc291cmNlIElELlxuXHQgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIE11dGFibGUgYm9va2luZy1jcmVhdGUgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gYWRkX2Nvc3RfY29ycmVjdGlvbl90b19hcHBvaW50bWVudF9yZXF1ZXN0KCBldmVudCwgcmVzb3VyY2VfaWQsIHBhcmFtcyApIHtcblx0XHR2YXIgbnVtYmVyX2ZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2FkZF9hcHBvaW50bWVudF9jb3N0X2NvcnJlY3Rpb24nICk7XG5cdFx0dmFyICRuYXRpdmVfZm9ybSA9ICQoICcud3BiY19hZGRfYXBwb2ludG1lbnRfX2NhbnZhcyAud3BiY19ib29raW5nX2FwcG9pbnRtZW50X19uYXRpdmVfZm9ybVtkYXRhLXByb3ZpZGVyLWlkPVwiJyArIE51bWJlciggcmVzb3VyY2VfaWQgfHwgMCApICsgJ1wiXScgKS5maXJzdCgpO1xuXHRcdHZhciByYXdfY29zdDtcblxuXHRcdGlmICggISBwYXJhbXMgfHwgISBudW1iZXJfZmllbGQgfHwgISAkbmF0aXZlX2Zvcm0ubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSBwYXJhbXMud3BiY19hZG1pbl9jb3N0X2NvcnJlY3Rpb247XG5cdFx0cmF3X2Nvc3QgPSBTdHJpbmcoIG51bWJlcl9maWVsZC52YWx1ZSB8fCAnJyApLnRyaW0oKTtcblx0XHRpZiAoICcnID09PSByYXdfY29zdCB8fCAhIG51bWJlcl9maWVsZC5jaGVja1ZhbGlkaXR5KCkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cGFyYW1zLndwYmNfYWRtaW5fY29zdF9jb3JyZWN0aW9uID0gcmF3X2Nvc3Q7XG5cdH1cblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2xpY2snLCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19yaWdodGJhcl90YWJzIFtyb2xlPVwidGFiXCJdJywgZnVuY3Rpb24gKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHN3aXRjaF9yaWdodF9wYW5lbCggJCggdGhpcyApICk7XG5cdH0gKTtcblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2xpY2snLCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtc3RhcnQtb3Zlcl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0Y2xlYXJfY29zdF9jb3JyZWN0aW9uKCk7XG5cdFx0dmFyICRhY3Rpb24gPSAkKCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19jYW52YXMgW2RhdGEtd3BiYy1hcHBvaW50bWVudC1hY3Rpb249XCJzdGFydC1vdmVyXCJdJyApLmZpcnN0KCk7XG5cdFx0aWYgKCAhICRhY3Rpb24ubGVuZ3RoICkge1xuXHRcdFx0JGFjdGlvbiA9ICQoICcud3BiY19hZGRfYXBwb2ludG1lbnRfX2NhbnZhcyBbZGF0YS1hcHBvaW50bWVudC1iYWNrPVwic2VydmljZVwiXScgKS5maXJzdCgpO1xuXHRcdH1cblx0XHRpZiAoICRhY3Rpb24ubGVuZ3RoICkge1xuXHRcdFx0JGFjdGlvbi50cmlnZ2VyKCAnY2xpY2snICk7XG5cdFx0fVxuXHR9ICk7XG5cdCQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcud3BiY19hZGRfYXBwb2ludG1lbnRfX2NhbnZhcyBbZGF0YS13cGJjLWFwcG9pbnRtZW50LWFjdGlvbj1cInN0YXJ0LW92ZXJcIl0nLCBjbGVhcl9jb3N0X2NvcnJlY3Rpb24gKTtcblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2xpY2snLCAnW2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtb3Blbi1ncm91cF0nLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0b3Blbl9pbnNwZWN0b3JfZ3JvdXAoICQoIHRoaXMgKS5hdHRyKCAnZGF0YS13cGJjLWFkZC1hcHBvaW50bWVudC1vcGVuLWdyb3VwJyApLCAkKCB0aGlzICkuYXR0ciggJ2RhdGEtd3BiYy1hZGQtYXBwb2ludG1lbnQtZm9jdXMnICkgfHwgJycgKTtcblx0fSApO1xuXG5cdCQoIGRvY3VtZW50ICkub24oICdjbGljaycsICdbZGF0YS13cGJjLWFkZC1hcHBvaW50bWVudC1hdXRvZmlsbF0nLCBhdXRvX2ZpbGxfYm9va2luZ19mb3JtICk7XG5cdCQoIGRvY3VtZW50ICkub24oICdpbnB1dCBjaGFuZ2Ugd3BiY19ib29raW5nX2RhdGVfb3Jfb3B0aW9uX3NlbGVjdGVkJywgJy53cGJjX2FkZF9hcHBvaW50bWVudF9fY2FudmFzLCAjaXNfc2VuZF9lbWFpbF9mb3JfcGVuZGluZycsIHNjaGVkdWxlX3N1bW1hcnlfcmVmcmVzaCApO1xuXHQkKCBkb2N1bWVudCApLm9uKCAnaW5wdXQnLCAnI3dwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicsIHN5bmNocm9uaXplX2Nvc3RfY29ycmVjdGlvbl9yYW5nZSApO1xuXHQkKCBkb2N1bWVudCApLm9uKCAnaW5wdXQnLCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19jb3N0X2NvcnJlY3Rpb24gW2RhdGEtd3BiYy1hZG1pbi1jb3N0LWNvcnJlY3Rpb24tcmFuZ2U9XCIxXCJdJywgc3luY2hyb25pemVfY29zdF9jb3JyZWN0aW9uX251bWJlciApO1xuXHQkKCAnYm9keScgKS5vbiggJ3dwYmNfYmVmb3JlX2Jvb2tpbmdfY3JlYXRlLndwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicsIGFkZF9jb3N0X2NvcnJlY3Rpb25fdG9fYXBwb2ludG1lbnRfcmVxdWVzdCApO1xuXHQkKCAnYm9keScgKS5vbiggJ3dwYmNfYm9va2luZ19mb3JtX3N1Ym1pdF9zdWNjZXNzLndwYmNfYWRkX2FwcG9pbnRtZW50X2Nvc3RfY29ycmVjdGlvbicsIGNsZWFyX2Nvc3RfY29ycmVjdGlvbiApO1xuXG5cdCQoIGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgc3RhZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYWRkX2FwcG9pbnRtZW50X19jYW52YXMgLndwYmNfYm9va2luZ19hcHBvaW50bWVudF9fc3RhZ2UnICk7XG5cdFx0YXBwbHlfYm9va2luZ19jb250ZXh0KCk7XG5cdFx0cmVmcmVzaF9zdW1tYXJ5KCk7XG5cdFx0c3luY2hyb25pemVfY29zdF9jb3JyZWN0aW9uX3JhbmdlKCk7XG5cdFx0aWYgKCBzdGFnZSAmJiB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciApIHtcblx0XHRcdG5ldyBNdXRhdGlvbk9ic2VydmVyKCBzY2hlZHVsZV9zdW1tYXJ5X3JlZnJlc2ggKS5vYnNlcnZlKCBzdGFnZSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSApO1xuXHRcdH1cblx0fSApO1xufSApKCBqUXVlcnkgKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLENBQUUsVUFBV0EsQ0FBQyxFQUFHO0VBQ2hCLFlBQVk7O0VBRVosSUFBSUMsYUFBYSxHQUFHLENBQUM7RUFDckIsSUFBSUMsTUFBTSxHQUFHQyxNQUFNLENBQUNDLGdDQUFnQyxJQUFJLENBQUMsQ0FBQzs7RUFFMUQ7RUFDQSxTQUFTQyxxQkFBcUJBLENBQUEsRUFBRztJQUNoQyxJQUFLLFdBQVcsS0FBSyxPQUFPRixNQUFNLENBQUNHLEtBQUssRUFBRztNQUMxQztJQUNEO0lBRUFILE1BQU0sQ0FBQ0csS0FBSyxDQUFDQyxlQUFlLENBQUUsd0JBQXdCLEVBQUUsRUFBRyxDQUFDO0lBQzVESixNQUFNLENBQUNHLEtBQUssQ0FBQ0MsZUFBZSxDQUFFLHNCQUFzQixFQUFFTCxNQUFNLENBQUNNLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBRSxDQUFDO0lBQ2hGTCxNQUFNLENBQUNHLEtBQUssQ0FBQ0MsZUFBZSxDQUFFLDBCQUEwQixFQUFFTCxNQUFNLENBQUNPLGdCQUFnQixJQUFJLEVB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QUVaLHFCQUFzQixDQUFDO0VBRS9IdkcsQ0FBQyxDQUFFNkcsUUFBUyxDQUFDLENBQUNNLEVBQUUsQ0FBRSxPQUFPLEVBQUUsd0NBQXdDLEVBQUUsVUFBV1YsS0FBSyxFQUFHO0lBQ3ZGQSxLQUFLLENBQUNXLGNBQWMsQ0FBQyxDQUFDO0lBQ3RCM0Usb0JBQW9CLENBQUV6QyxDQUFDLENBQUUsSUFBSyxDQUFDLENBQUNlLElBQUksQ0FBRSxzQ0FBdUMsQ0FBQyxFQUFFZixDQUFDLENBQUUsSUFBSyxDQUFDLENBQUNlLElBQUksQ0FBRSxpQ0FBa0MsQ0FBQyxJQUFJLEVBQUcsQ0FBQztFQUM1SSxDQUFFLENBQUM7RUFFSGYsQ0FBQyxDQUFFNkcsUUFBUyxDQUFDLENBQUNNLEVBQUUsQ0FBRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUxQixzQkFBdUIsQ0FBQztFQUMzRnpGLENBQUMsQ0FBRTZHLFFBQVMsQ0FBQyxDQUFDTSxFQUFFLENBQUUsbURBQW1ELEVBQUUsMkRBQTJELEVBQUU1Qix3QkFBeUIsQ0FBQztFQUM5SnZGLENBQUMsQ0FBRTZHLFFBQVMsQ0FBQyxDQUFDTSxFQUFFLENBQUUsT0FBTyxFQUFFLHVDQUF1QyxFQUFFbkIsaUNBQWtDLENBQUM7RUFDdkdoRyxDQUFDLENBQUU2RyxRQUFTLENBQUMsQ0FBQ00sRUFBRSxDQUFFLE9BQU8sRUFBRSxvRkFBb0YsRUFBRWIsa0NBQW1DLENBQUM7RUFDckp0RyxDQUFDLENBQUUsTUFBTyxDQUFDLENBQUNtSCxFQUFFLENBQUUsaUVBQWlFLEVBQUVYLDBDQUEyQyxDQUFDO0VBQy9IeEcsQ0FBQyxDQUFFLE1BQU8sQ0FBQyxDQUFDbUgsRUFBRSxDQUFFLHVFQUF1RSxFQUFFWixxQkFBc0IsQ0FBQztFQUVoSHZHLENBQUMsQ0FBRSxZQUFZO0lBQ2QsSUFBSThFLEtBQUssR0FBRytCLFFBQVEsQ0FBQ1MsYUFBYSxDQUFFLGdFQUFpRSxDQUFDO0lBQ3RHakgscUJBQXFCLENBQUMsQ0FBQztJQUN2Qm1FLGVBQWUsQ0FBQyxDQUFDO0lBQ2pCd0IsaUNBQWlDLENBQUMsQ0FBQztJQUNuQyxJQUFLbEIsS0FBSyxJQUFJM0UsTUFBTSxDQUFDb0gsZ0JBQWdCLEVBQUc7TUFDdkMsSUFBSUEsZ0JBQWdCLENBQUVoQyx3QkFBeUIsQ0FBQyxDQUFDaUMsT0FBTyxDQUFFMUMsS0FBSyxFQUFFO1FBQUUyQyxTQUFTLEVBQUUsSUFBSTtRQUFFQyxPQUFPLEVBQUU7TUFBSyxDQUFFLENBQUM7SUFDdEc7RUFDRCxDQUFFLENBQUM7QUFDSixDQUFDLEVBQUlDLE1BQU8sQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ== |
| 324 |
|