PluginProbe
Booking Calendar / 11.8.4
Booking Calendar v11.8.4
11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 All 204 releases
booking / includes / page-setup / _out / setup_first_run_popup.js

setup_first_run_popup.js in Booking Calendar 11.8.4, at includes/page-setup/_out/setup_first_run_popup.js

278 lines 32.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 /**
4 * First-install Setup Wizard and starter-pages prompt adapter.
5 *
6 * @package Booking Calendar
7 * @since 11.8.1
8 */
9 (function (window, document, $) {
10 'use strict';
11
12 var config = window.wpbc_setup_wizard_first_run_popup_vars || {};
13 var setup_prompt = config.setup_prompt || {};
14 var booking_pages_prompt = config.booking_pages_prompt || {};
15 var setup_request = null;
16 var booking_pages_request = null;
17 var booking_pages_dialog_started = false;
18 var redirect_started = false;
19 var previous_focus = null;
20
21 /**
22 * Persist the one-time Setup prompt choice without delaying dismissal.
23 *
24 * @param {string} choice Choice identifier: start or dismiss.
25 * @return {jqXHR|null} Active persistence request, or null when unavailable.
26 */
27 function persist_setup_choice(choice) {
28 if (setup_request) {
29 return setup_request;
30 }
31 if (!config.ajax_url || !setup_prompt.action || !setup_prompt.nonce) {
32 return null;
33 }
34 setup_request = $.post(config.ajax_url, {
35 action: setup_prompt.action,
36 nonce: setup_prompt.nonce,
37 choice: choice
38 });
39 return setup_request;
40 }
41
42 /**
43 * Persist permanent dismissal of the starter booking-pages prompt.
44 *
45 * @return {jqXHR|null} Active persistence request, or null when unavailable.
46 */
47 function persist_booking_pages_dismissal() {
48 if (booking_pages_request) {
49 return booking_pages_request;
50 }
51 if (!config.ajax_url || !booking_pages_prompt.action || !booking_pages_prompt.nonce) {
52 return null;
53 }
54 booking_pages_request = $.post(config.ajax_url, {
55 action: booking_pages_prompt.action,
56 nonce: booking_pages_prompt.nonce
57 });
58 return booking_pages_request;
59 }
60
61 /**
62 * Restore useful page focus after the automatic dialog closes.
63 *
64 * @return {void}
65 */
66 function restore_focus() {
67 var fallback_focus;
68 if (previous_focus && document.body !== previous_focus && document.contains(previous_focus)) {
69 previous_focus.focus();
70 return;
71 }
72 fallback_focus = document.querySelector('#wpbc_booking_listing_add_booking_button, .wpbc_ui_el__top_nav a, #wpbody-content h1');
73 if (fallback_focus && 'function' === typeof fallback_focus.focus) {
74 fallback_focus.focus();
75 }
76 }
77
78 /**
79 * Confirm that an AJAX response represents a saved WordPress choice.
80 *
81 * @param {Object} response WordPress AJAX response.
82 * @return {boolean} True when the server saved the requested state.
83 */
84 function is_success_response(response) {
85 return !!(response && true === response.success);
86 }
87
88 /**
89 * Check whether the starter-pages dialog has usable preloaded data.
90 *
91 * @return {boolean} True when the dialog can be presented.
92 */
93 function can_show_booking_pages_dialog() {
94 return !!(!booking_pages_dialog_started && booking_pages_prompt.available && Array.isArray(booking_pages_prompt.booking_pages) && booking_pages_prompt.booking_pages.length && document.getElementById('tmpl-wpbc-setup-wizard-booking-pages-popup'));
95 }
96
97 /**
98 * Create and show the WordPress-templated starter booking-pages dialog.
99 *
100 * @param {boolean} should_consume_prompt Whether closing consumes automatic display.
101 * @return {void}
102 */
103 function show_booking_pages_dialog(should_consume_prompt) {
104 var template;
105 var $modal;
106 var dismissal_started = false;
107 if (!can_show_booking_pages_dialog() || !window.wp || 'function' !== typeof window.wp.template || 'function' !== typeof $.fn.wpbc_my_modal) {
108 restore_focus();
109 return;
110 }
111 booking_pages_dialog_started = true;
112 template = window.wp.template('wpbc-setup-wizard-booking-pages-popup');
113 $(document.body).append(template({
114 booking_pages: booking_pages_prompt.booking_pages
115 }));
116 $modal = $('#wpbc_setup_wizard_booking_pages_popup');
117 $modal.find('.wpbc_setup_wizard_booking_pages_popup__image img').on('error.wpbcSetupBookingPages', function () {
118 $(this).closest('.wpbc_setup_wizard_booking_pages_popup__image').remove();
119 });
120 $modal.on('shown.wpbc.modal.wpbcSetupBookingPages', function () {
121 $modal.attr('aria-hidden', 'false');
122 $('.modal-backdrop').last().addClass('wpbc_setup_wizard_first_run_popup__backdrop');
123 $modal.find('[data-wpbc-booking-pages-open]').first().trigger('focus');
124 });
125 $modal.on('hide.wpbc.modal.wpbcSetupBookingPages', function () {
126 if (should_consume_prompt && !dismissal_started) {
127 dismissal_started = true;
128 persist_booking_pages_dismissal();
129 }
130 });
131 $modal.on('hidden.wpbc.modal.wpbcSetupBookingPages', function () {
132 $modal.attr('aria-hidden', 'true').remove();
133 booking_pages_dialog_started = false;
134 restore_focus();
135 });
136 $modal.on('click.wpbcSetupBookingPages', '[data-wpbc-booking-pages-dismiss]', function (event) {
137 event.preventDefault();
138 $modal.wpbc_my_modal('hide');
139 });
140 $modal.wpbc_my_modal({
141 backdrop: 'static',
142 keyboard: true,
143 show: true
144 });
145 }
146
147 /**
148 * Create and show the WordPress-templated first-run Setup dialog.
149 *
150 * @return {void}
151 */
152 function show_setup_dialog() {
153 var template;
154 var $modal;
155 var choice_started = false;
156 var selected_choice = '';
157 var dismissal_request_finished = false;
158 var dismissal_saved = false;
159 var setup_dialog_hidden = false;
160
161 /**
162 * Continue only after both AJAX persistence and modal removal finish.
163 *
164 * @return {void}
165 */
166 function finish_setup_dismissal() {
167 if (!dismissal_request_finished || !setup_dialog_hidden) {
168 return;
169 }
170 if (dismissal_saved && can_show_booking_pages_dialog()) {
171 show_booking_pages_dialog(true);
172 return;
173 }
174 restore_focus();
175 }
176 if (!config.ajax_url || !setup_prompt.action || !setup_prompt.nonce || !setup_prompt.setup_url || !window.wp || 'function' !== typeof window.wp.template || 'function' !== typeof $.fn.wpbc_my_modal || !document.getElementById('tmpl-wpbc-setup-wizard-first-run-popup')) {
177 return;
178 }
179 template = window.wp.template('wpbc-setup-wizard-first-run-popup');
180 $(document.body).append(template({}));
181 $modal = $('#wpbc_setup_wizard_first_run_popup');
182 $modal.on('shown.wpbc.modal.wpbcSetupFirstRun', function () {
183 $modal.attr('aria-hidden', 'false');
184 $('.modal-backdrop').last().addClass('wpbc_setup_wizard_first_run_popup__backdrop');
185 $modal.find('[data-wpbc-setup-first-run-start]').trigger('focus');
186 });
187 $modal.on('hide.wpbc.modal.wpbcSetupFirstRun', function () {
188 var request;
189 if (!choice_started) {
190 choice_started = true;
191 selected_choice = 'dismiss';
192 request = persist_setup_choice('dismiss');
193 if (request) {
194 request.done(function (response) {
195 dismissal_saved = is_success_response(response);
196 });
197 request.always(function () {
198 dismissal_request_finished = true;
199 finish_setup_dismissal();
200 });
201 } else {
202 dismissal_request_finished = true;
203 }
204 }
205 });
206 $modal.on('hidden.wpbc.modal.wpbcSetupFirstRun', function () {
207 $modal.attr('aria-hidden', 'true').remove();
208 setup_dialog_hidden = true;
209 restore_focus();
210 if ('dismiss' === selected_choice) {
211 finish_setup_dismissal();
212 }
213 });
214 $modal.on('click.wpbcSetupFirstRun', '[data-wpbc-setup-first-run-dismiss]', function (event) {
215 event.preventDefault();
216 $modal.wpbc_my_modal('hide');
217 });
218 $modal.on('click.wpbcSetupFirstRun', '[data-wpbc-setup-first-run-start]', function (event) {
219 var request;
220 event.preventDefault();
221 choice_started = true;
222 selected_choice = 'start';
223 request = persist_setup_choice('start');
224 if (request) {
225 request.always(function () {
226 if (!redirect_started) {
227 redirect_started = true;
228 window.location.assign(setup_prompt.setup_url);
229 }
230 });
231 } else if (!redirect_started) {
232 redirect_started = true;
233 window.location.assign(setup_prompt.setup_url);
234 }
235 $modal.wpbc_my_modal('hide');
236 });
237 $modal.wpbc_my_modal({
238 backdrop: 'static',
239 keyboard: true,
240 show: true
241 });
242 }
243
244 /**
245 * Start the first eligible dialog without allowing both to overlap.
246 *
247 * @return {void}
248 */
249 function initialize_prompts() {
250 previous_focus = document.activeElement;
251 if (setup_prompt.show) {
252 show_setup_dialog();
253 return;
254 }
255 if (booking_pages_prompt.show) {
256 show_booking_pages_dialog(true);
257 }
258 }
259
260 /**
261 * Reopen the starter-pages dialog from an explicit Booking Listing control.
262 *
263 * Manual opening never re-enables or consumes automatic first-run display.
264 * Focus returns to the invoking button after the dialog closes.
265 *
266 * @param {Event} event Browser click event.
267 * @return {void}
268 */
269 function open_booking_pages_dialog_manually(event) {
270 event.preventDefault();
271 previous_focus = event.currentTarget;
272 show_booking_pages_dialog(false);
273 }
274 $(document).on('click.wpbcSetupBookingPagesLauncher', '[data-wpbc-booking-pages-open-dialog]', open_booking_pages_dialog_manually);
275 $(initialize_prompts);
276 })(window, document, window.jQuery);
277 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1zZXR1cC9fb3V0L3NldHVwX2ZpcnN0X3J1bl9wb3B1cC5qcyIsIm5hbWVzIjpbIndpbmRvdyIsImRvY3VtZW50IiwiJCIsImNvbmZpZyIsIndwYmNfc2V0dXBfd2l6YXJkX2ZpcnN0X3J1bl9wb3B1cF92YXJzIiwic2V0dXBfcHJvbXB0IiwiYm9va2luZ19wYWdlc19wcm9tcHQiLCJzZXR1cF9yZXF1ZXN0IiwiYm9va2luZ19wYWdlc19yZXF1ZXN0IiwiYm9va2luZ19wYWdlc19kaWFsb2dfc3RhcnRlZCIsInJlZGlyZWN0X3N0YXJ0ZWQiLCJwcmV2aW91c19mb2N1cyIsInBlcnNpc3Rfc2V0dXBfY2hvaWNlIiwiY2hvaWNlIiwiYWpheF91cmwiLCJhY3Rpb24iLCJub25jZSIsInBvc3QiLCJwZXJzaXN0X2Jvb2tpbmdfcGFnZXNfZGlzbWlzc2FsIiwicmVzdG9yZV9mb2N1cyIsImZhbGxiYWNrX2ZvY3VzIiwiYm9keSIsImNvbnRhaW5zIiwiZm9jdXMiLCJxdWVyeVNlbGVjdG9yIiwiaXNfc3VjY2Vzc19yZXNwb25zZSIsInJlc3BvbnNlIiwic3VjY2VzcyIsImNhbl9zaG93X2Jvb2tpbmdfcGFnZXNfZGlhbG9nIiwiYXZhaWxhYmxlIiwiQXJyYXkiLCJpc0FycmF5IiwiYm9va2luZ19wYWdlcyIsImxlbmd0aCIsImdldEVsZW1lbnRCeUlkIiwic2hvd19ib29raW5nX3BhZ2VzX2RpYWxvZyIsInNob3VsZF9jb25zdW1lX3Byb21wdCIsInRlbXBsYXRlIiwiJG1vZGFsIiwiZGlzbWlzc2FsX3N0YXJ0ZWQiLCJ3cCIsImZuIiwid3BiY19teV9tb2RhbCIsImFwcGVuZCIsImZpbmQiLCJvbiIsImNsb3Nlc3QiLCJyZW1vdmUiLCJhdHRyIiwibGFzdCIsImFkZENsYXNzIiwiZmlyc3QiLCJ0cmlnZ2VyIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImJhY2tkcm9wIiwia2V5Ym9hcmQiLCJzaG93Iiwic2hvd19zZXR1cF9kaWFsb2ciLCJjaG9pY2Vfc3RhcnRlZCIsInNlbGVjdGVkX2Nob2ljZSIsImRpc21pc3NhbF9yZXF1ZXN0X2ZpbmlzaGVkIiwiZGlzbWlzc2FsX3NhdmVkIiwic2V0dXBfZGlhbG9nX2hpZGRlbiIsImZpbmlzaF9zZXR1cF9kaXNtaXNzYWwiLCJzZXR1cF91cmwiLCJyZXF1ZXN0IiwiZG9uZSIsImFsd2F5cyIsImxvY2F0aW9uIiwiYXNzaWduIiwiaW5pdGlhbGl6ZV9wcm9tcHRzIiwiYWN0aXZlRWxlbWVudCIsIm9wZW5fYm9va2luZ19wYWdlc19kaWFsb2dfbWFudWFsbHkiLCJjdXJyZW50VGFyZ2V0IiwialF1ZXJ5Il0sInNvdXJjZXMiOlsiaW5jbHVkZXMvcGFnZS1zZXR1cC9fc3JjL3NldHVwX2ZpcnN0X3J1bl9wb3B1cC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpcnN0LWluc3RhbGwgU2V0dXAgV2l6YXJkIGFuZCBzdGFydGVyLXBhZ2VzIHByb21wdCBhZGFwdGVyLlxuICpcbiAqIEBwYWNrYWdlIEJvb2tpbmcgQ2FsZW5kYXJcbiAqIEBzaW5jZSAgIDExLjguMVxuICovXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGRvY3VtZW50LCAkICkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGNvbmZpZyA9IHdpbmRvdy53cGJjX3NldHVwX3dpemFyZF9maXJzdF9ydW5fcG9wdXBfdmFycyB8fCB7fTtcblx0dmFyIHNldHVwX3Byb21wdCA9IGNvbmZpZy5zZXR1cF9wcm9tcHQgfHwge307XG5cdHZhciBib29raW5nX3BhZ2VzX3Byb21wdCA9IGNvbmZpZy5ib29raW5nX3BhZ2VzX3Byb21wdCB8fCB7fTtcblx0dmFyIHNldHVwX3JlcXVlc3QgPSBudWxsO1xuXHR2YXIgYm9va2luZ19wYWdlc19yZXF1ZXN0ID0gbnVsbDtcblx0dmFyIGJvb2tpbmdfcGFnZXNfZGlhbG9nX3N0YXJ0ZWQgPSBmYWxzZTtcblx0dmFyIHJlZGlyZWN0X3N0YXJ0ZWQgPSBmYWxzZTtcblx0dmFyIHByZXZpb3VzX2ZvY3VzID0gbnVsbDtcblxuXHQvKipcblx0ICogUGVyc2lzdCB0aGUgb25lLXRpbWUgU2V0dXAgcHJvbXB0IGNob2ljZSB3aXRob3V0IGRlbGF5aW5nIGRpc21pc3NhbC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNob2ljZSBDaG9pY2UgaWRlbnRpZmllcjogc3RhcnQgb3IgZGlzbWlzcy5cblx0ICogQHJldHVybiB7anFYSFJ8bnVsbH0gQWN0aXZlIHBlcnNpc3RlbmNlIHJlcXVlc3QsIG9yIG51bGwgd2hlbiB1bmF2YWlsYWJsZS5cblx0ICovXG5cdGZ1bmN0aW9uIHBlcnNpc3Rfc2V0dXBfY2hvaWNlKCBjaG9pY2UgKSB7XG5cdFx0aWYgKCBzZXR1cF9yZXF1ZXN0ICkge1xuXHRcdFx0cmV0dXJuIHNldHVwX3JlcXVlc3Q7XG5cdFx0fVxuXG5cdFx0aWYgKCAhIGNvbmZpZy5hamF4X3VybCB8fCAhIHNldHVwX3Byb21wdC5hY3Rpb24gfHwgISBzZXR1cF9wcm9tcHQubm9uY2UgKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRzZXR1cF9yZXF1ZXN0ID0gJC5wb3N0KCBjb25maWcuYWpheF91cmwsIHtcblx0XHRcdGFjdGlvbjogc2V0dXBfcHJvbXB0LmFjdGlvbixcblx0XHRcdG5vbmNlOiBzZXR1cF9wcm9tcHQubm9uY2UsXG5cdFx0XHRjaG9pY2U6IGNob2ljZVxuXHRcdH0gKTtcblxuXHRcdHJldHVybiBzZXR1cF9yZXF1ZXN0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFBlcnNpc3QgcGVybWFuZW50IGRpc21pc3NhbCBvZiB0aGUgc3RhcnRlciBib29raW5nLXBhZ2VzIHByb21wdC5cblx0ICpcblx0ICogQHJldHVybiB7anFYSFJ8bnVsbH0gQWN0aXZlIHBlcnNpc3RlbmNlIHJlcXVlc3QsIG9yIG51bGwgd2hlbiB1bmF2YWlsYWJsZS5cblx0ICovXG5cdGZ1bmN0aW9uIHBlcnNpc3RfYm9va2luZ19wYWdlc19kaXNtaXNzYWwoKSB7XG5cdFx0aWYgKCBib29raW5nX3BhZ2VzX3JlcXVlc3QgKSB7XG5cdFx0XHRyZXR1cm4gYm9va2luZ19wYWdlc19yZXF1ZXN0O1xuXHRcdH1cblxuXHRcdGlmICggISBjb25maWcuYWpheF91cmwgfHwgISBib29raW5nX3BhZ2VzX3Byb21wdC5hY3Rpb24gfHwgISBib29raW5nX3BhZ2VzX3Byb21wdC5ub25jZSApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGJvb2tpbmdfcGFnZXNfcmVxdWVzdCA9ICQucG9zdCggY29uZmlnLmFqYXhfdXJsLCB7XG5cdFx0XHRhY3Rpb246IGJvb2tpbmdfcGFnZXNfcHJvbXB0LmFjdGlvbixcblx0XHRcdG5vbmNlOiBib29raW5nX3BhZ2VzX3Byb21wdC5ub25jZVxuXHRcdH0gKTtcblxuXHRcdHJldHVybiBib29raW5nX3BhZ2VzX3JlcXVlc3Q7XG5cdH1cblxuXHQvKipcblx0ICogUmVzdG9yZSB1c2VmdWwgcGFnZSBmb2N1cyBhZnRlciB0aGUgYXV0b21hdGljIGRpYWxvZyBjbG9zZXMuXG5cdCAqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiByZXN0b3JlX2ZvY3VzKCkge1xuXHRcdHZhciBmYWxsYmFja19mb2N1cztcblxuXHRcdGlmICggcHJldmlvdXNfZm9jdXMgJiYgZG9jdW1lbnQuYm9keSAhPT0gcHJldmlvdXNfZm9jdXMgJiYgZG9jdW1lbnQuY29udGFpbnMoIHByZXZpb3VzX2ZvY3VzICkgKSB7XG5cdFx0XHRwcmV2aW91c19mb2N1cy5mb2N1cygpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZhbGxiYWNrX2ZvY3VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJyN3cGJjX2Jvb2tpbmdfbGlzdGluZ19hZGRfYm9va2luZ19idXR0b24sIC53cGJjX3VpX2VsX190b3BfbmF2IGEsICN3cGJvZHktY29udGVudCBoMScgKTtcblx0XHRpZiAoIGZhbGxiYWNrX2ZvY3VzICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBmYWxsYmFja19mb2N1cy5mb2N1cyApIHtcblx0XHRcdGZhbGxiYWNrX2ZvY3VzLmZvY3VzKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpcm0gdGhhdCBhbiBBSkFYIHJlc3BvbnNlIHJlcHJlc2VudHMgYSBzYXZlZCBXb3JkUHJlc3MgY2hvaWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgV29yZFByZXNzIEFKQVggcmVzcG9uc2UuXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgc2VydmVyIHNhdmVkIHRoZSByZXF1ZXN0ZWQgc3RhdGUuXG5cdCAqL1xuXHRmdW5jdGlvbiBpc19zdWNjZXNzX3Jlc3BvbnNlKCByZXNwb25zZSApIHtcblx0XHRyZXR1cm4gISEgKCByZXNwb25zZSAmJiB0cnVlID09PSByZXNwb25zZS5zdWNjZXNzICk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgd2hldGhlciB0aGUgc3RhcnRlci1wYWdlcyBkaWFsb2cgaGFzIHVzYWJsZSBwcmVsb2FkZWQgZGF0YS5cblx0ICpcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIHRoZSBkaWFsb2cgY2FuIGJlIHByZXNlbnRlZC5cblx0ICovXG5cdGZ1bmN0aW9uIGNhbl9zaG93X2Jvb2tpbmdfcGFnZXNfZGlhbG9nKCkge1xuXHRcdHJldHVybiAhISAoXG5cdFx0XHQhIGJvb2tpbmdfcGFnZXNfZGlhbG9nX3N0YXJ0ZWQgJiZcblx0XHRcdGJvb2tpbmdfcGFnZXNfcHJvbXB0LmF2YWlsYWJsZSAmJlxuXHRcdFx0QXJyYXkuaXNBcnJheSggYm9va2luZ19wYWdlc19wcm9tcHQuYm9va2luZ19wYWdlcyApICYmXG5cdFx0XHRib29raW5nX3BhZ2VzX3Byb21wdC5ib29raW5nX3BhZ2VzLmxlbmd0aCAmJlxuXHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd0bXBsLXdwYmMtc2V0dXAtd2l6YXJkLWJvb2tpbmctcGFnZXMtcG9wdXAnIClcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhbmQgc2hvdyB0aGUgV29yZFByZXNzLXRlbXBsYXRlZCBzdGFydGVyIGJvb2tpbmctcGFnZXMgZGlhbG9nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZF9jb25zdW1lX3Byb21wdCBXaGV0aGVyIGNsb3NpbmcgY29uc3VtZXMgYXV0b21hdGljIGRpc3BsYXkuXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBzaG93X2Jvb2tpbmdfcGFnZXNfZGlhbG9nKCBzaG91bGRfY29uc3VtZV9wcm9tcHQgKSB7XG5cdFx0dmFyIHRlbXBsYXRlO1xuXHRcdHZhciAkbW9kYWw7XG5cdFx0dmFyIGRpc21pc3NhbF9zdGFydGVkID0gZmFsc2U7XG5cblx0XHRpZiAoXG5cdFx0XHQhIGNhbl9zaG93X2Jvb2tpbmdfcGFnZXNfZGlhbG9nKCkgfHxcblx0XHRcdCEgd2luZG93LndwIHx8ICdmdW5jdGlvbicgIT09IHR5cGVvZiB3aW5kb3cud3AudGVtcGxhdGUgfHxcblx0XHRcdCdmdW5jdGlvbicgIT09IHR5cGVvZiAkLmZuLndwYmNfbXlfbW9kYWxcblx0XHQpIHtcblx0XHRcdHJlc3RvcmVfZm9jdXMoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRib29raW5nX3BhZ2VzX2RpYWxvZ19zdGFydGVkID0gdHJ1ZTtcblx0XHR0ZW1wbGF0ZSA9IHdpbmRvdy53cC50ZW1wbGF0ZSggJ3dwYmMtc2V0dXAtd2l6YXJkLWJvb2tpbmctcGFnZXMtcG9wdXAnICk7XG5cdFx0JCggZG9jdW1lbnQuYm9keSApLmFwcGVuZCggdGVtcGxhdGUoIHsgYm9va2luZ19wYWdlczogYm9va2luZ19wYWdlc19wcm9tcHQuYm9va2luZ19wYWdlcyB9ICkgKTtcblx0XHQkbW9kYWwgPSAkKCAnI3dwYmNfc2V0dXBfd2l6YXJkX2Jvb2tpbmdfcGFnZXNfcG9wdXAnICk7XG5cdFx0JG1vZGFsLmZpbmQoICcud3BiY19zZXR1cF93aXphcmRfYm9va2luZ19wYWdlc19wb3B1cF9faW1hZ2UgaW1nJyApLm9uKCAnZXJyb3Iud3BiY1NldHVwQm9va2luZ1BhZ2VzJywgZnVuY3Rpb24oKSB7XG5cdFx0XHQkKCB0aGlzICkuY2xvc2VzdCggJy53cGJjX3NldHVwX3dpemFyZF9ib29raW5nX3BhZ2VzX3BvcHVwX19pbWFnZScgKS5yZW1vdmUoKTtcblx0XHR9ICk7XG5cblx0XHQkbW9kYWwub24oICdzaG93bi53cGJjLm1vZGFsLndwYmNTZXR1cEJvb2tpbmdQYWdlcycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0JG1vZGFsLmF0dHIoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcblx0XHRcdCQoICcubW9kYWwtYmFja2Ryb3AnICkubGFzdCgpLmFkZENsYXNzKCAnd3BiY19zZXR1cF93aXphcmRfZmlyc3RfcnVuX3BvcHVwX19iYWNrZHJvcCcgKTtcblx0XHRcdCRtb2RhbC5maW5kKCAnW2RhdGEtd3BiYy1ib29raW5nLXBhZ2VzLW9wZW5dJyApLmZpcnN0KCkudHJpZ2dlciggJ2ZvY3VzJyApO1xuXHRcdH0gKTtcblxuXHRcdCRtb2RhbC5vbiggJ2hpZGUud3BiYy5tb2RhbC53cGJjU2V0dXBCb29raW5nUGFnZXMnLCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc2hvdWxkX2NvbnN1bWVfcHJvbXB0ICYmICEgZGlzbWlzc2FsX3N0YXJ0ZWQgKSB7XG5cdFx0XHRcdGRpc21pc3NhbF9zdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0cGVyc2lzdF9ib29raW5nX3BhZ2VzX2Rpc21pc3NhbCgpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHRcdCRtb2RhbC5vbiggJ2hpZGRlbi53cGJjLm1vZGFsLndwYmNTZXR1cEJvb2tpbmdQYWdlcycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0JG1vZGFsLmF0dHIoICdhcmlhLWhpZGRlbicsICd0cnVlJyApLnJlbW92ZSgpO1xuXHRcdFx0Ym9va2luZ19wYWdlc19kaWFsb2dfc3RhcnRlZCA9IGZhbHNlO1xuXHRcdFx0cmVzdG9yZV9mb2N1cygpO1xuXHRcdH0gKTtcblxuXHRcdCRtb2RhbC5vbiggJ2NsaWNrLndwYmNTZXR1cEJvb2tpbmdQYWdlcycsICdbZGF0YS13cGJjLWJvb2tpbmctcGFnZXMtZGlzbWlzc10nLCBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0JG1vZGFsLndwYmNfbXlfbW9kYWwoICdoaWRlJyApO1xuXHRcdH0gKTtcblxuXHRcdCRtb2RhbC53cGJjX215X21vZGFsKCB7XG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogdHJ1ZSxcblx0XHRcdHNob3c6IHRydWVcblx0XHR9ICk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuZCBzaG93IHRoZSBXb3JkUHJlc3MtdGVtcGxhdGVkIGZpcnN0LXJ1biBTZXR1cCBkaWFsb2cuXG5cdCAqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBzaG93X3NldHVwX2RpYWxvZygpIHtcblx0XHR2YXIgdGVtcGxhdGU7XG5cdFx0dmFyICRtb2RhbDtcblx0XHR2YXIgY2hvaWNlX3N0YXJ0ZWQgPSBmYWxzZTtcblx0XHR2YXIgc2VsZWN0ZWRfY2hvaWNlID0gJyc7XG5cdFx0dmFyIGRpc21pc3NhbF9yZXF1ZXN0X2ZpbmlzaGVkID0gZmFsc2U7XG5cdFx0dmFyIGRpc21pc3NhbF9zYXZlZCA9IGZhbHNlO1xuXHRcdHZhciBzZXR1cF9kaWFsb2dfaGlkZGVuID0gZmFsc2U7XG5cblx0XHQvKipcblx0XHQgKiBDb250aW51ZSBvbmx5IGFmdGVyIGJvdGggQUpBWCBwZXJzaXN0ZW5jZSBhbmQgbW9kYWwgcmVtb3ZhbCBmaW5pc2guXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZpbmlzaF9zZXR1cF9kaXNtaXNzYWwoKSB7XG5cdFx0XHRpZiAoICEgZGlzbWlzc2FsX3JlcXVlc3RfZmluaXNoZWQgfHwgISBzZXR1cF9kaWFsb2dfaGlkZGVuICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGlzbWlzc2FsX3NhdmVkICYmIGNhbl9zaG93X2Jvb2tpbmdfcGFnZXNfZGlhbG9nKCkgKSB7XG5cdFx0XHRcdHNob3dfYm9va2luZ19wYWdlc19kaWFsb2coIHRydWUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN0b3JlX2ZvY3VzKCk7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0ISBjb25maWcuYWpheF91cmwgfHwgISBzZXR1cF9wcm9tcHQuYWN0aW9uIHx8ICEgc2V0dXBfcHJvbXB0Lm5vbmNlIHx8ICEgc2V0dXBfcHJvbXB0LnNldHVwX3VybCB8fFxuXHRcdFx0ISB3aW5kb3cud3AgfHwgJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHdpbmRvdy53cC50ZW1wbGF0ZSB8fCAnZnVuY3Rpb24nICE9PSB0eXBlb2YgJC5mbi53cGJjX215X21vZGFsIHx8XG5cdFx0XHQhIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAndG1wbC13cGJjLXNldHVwLXdpemFyZC1maXJzdC1ydW4tcG9wdXAnIClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0ZW1wbGF0ZSA9IHdpbmRvdy53cC50ZW1wbGF0ZSggJ3dwYmMtc2V0dXAtd2l6YXJkLWZpcnN0LXJ1bi1wb3B1cCcgKTtcblx0XHQkKCBkb2N1bWVudC5ib2R5ICkuYXBwZW5kKCB0ZW1wbGF0ZSgge30gKSApO1xuXHRcdCRtb2RhbCA9ICQoICcjd3BiY19zZXR1cF93aXphcmRfZmlyc3RfcnVuX3BvcHVwJyApO1xuXG5cdFx0JG1vZGFsLm9uKCAnc2hvd24ud3BiYy5tb2RhbC53cGJjU2V0dXBGaXJzdFJ1bicsIGZ1bmN0aW9uKCkge1xuXHRcdFx0JG1vZGFsLmF0dHIoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcblx0XHRcdCQoICcubW9kYWwtYmFja2Ryb3AnICkubGFzdCgpLmFkZENsYXNzKCAnd3BiY19zZXR1cF93aXphcmRfZmlyc3RfcnVuX3BvcHVwX19iYWNrZHJvcCcgKTtcblx0XHRcdCRtb2RhbC5maW5kKCAnW2RhdGEtd3BiYy1zZXR1cC1maXJzdC1ydW4tc3RhcnRdJyApLnRyaWdnZXIoICdmb2N1cycgKTtcblx0XHR9ICk7XG5cblx0XHQkbW9kYWwub24oICdoaWRlLndwYmMubW9kYWwud3BiY1NldHVwRmlyc3RSdW4nLCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciByZXF1ZXN0O1xuXG5cdFx0XHRpZiAoICEgY2hvaWNlX3N0YXJ0ZWQgKSB7XG5cdFx0XHRcdGNob2ljZV9zdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0c2VsZWN0ZWRfY2hvaWNlID0gJ2Rpc21pc3MnO1xuXHRcdFx0XHRyZXF1ZXN0ID0gcGVyc2lzdF9zZXR1cF9jaG9pY2UoICdkaXNtaXNzJyApO1xuXHRcdFx0XHRpZiAoIHJlcXVlc3QgKSB7XG5cdFx0XHRcdFx0cmVxdWVzdC5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRcdFx0XHRkaXNtaXNzYWxfc2F2ZWQgPSBpc19zdWNjZXNzX3Jlc3BvbnNlKCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRyZXF1ZXN0LmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRkaXNtaXNzYWxfcmVxdWVzdF9maW5pc2hlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRmaW5pc2hfc2V0dXBfZGlzbWlzc2FsKCk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRpc21pc3NhbF9yZXF1ZXN0X2ZpbmlzaGVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHRcdCRtb2RhbC5vbiggJ2hpZGRlbi53cGJjLm1vZGFsLndwYmNTZXR1cEZpcnN0UnVuJywgZnVuY3Rpb24oKSB7XG5cdFx0XHQkbW9kYWwuYXR0ciggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICkucmVtb3ZlKCk7XG5cdFx0XHRzZXR1cF9kaWFsb2dfaGlkZGVuID0gdHJ1ZTtcblx0XHRcdHJlc3RvcmVfZm9jdXMoKTtcblx0XHRcdGlmICggJ2Rpc21pc3MnID09PSBzZWxlY3RlZF9jaG9pY2UgKSB7XG5cdFx0XHRcdGZpbmlzaF9zZXR1cF9kaXNtaXNzYWwoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHQkbW9kYWwub24oICdjbGljay53cGJjU2V0dXBGaXJzdFJ1bicsICdbZGF0YS13cGJjLXNldHVwLWZpcnN0LXJ1bi1kaXNtaXNzXScsIGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHQkbW9kYWwud3BiY19teV9tb2RhbCggJ2hpZGUnICk7XG5cdFx0fSApO1xuXG5cdFx0JG1vZGFsLm9uKCAnY2xpY2sud3BiY1NldHVwRmlyc3RSdW4nLCAnW2RhdGEtd3BiYy1zZXR1cC1maXJzdC1ydW4tc3RhcnRdJywgZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJlcXVlc3Q7XG5cblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRjaG9pY2Vfc3RhcnRlZCA9IHRydWU7XG5cdFx0XHRzZWxlY3RlZF9jaG9pY2UgPSAnc3RhcnQnO1xuXHRcdFx0cmVxdWVzdCA9IHBlcnNpc3Rfc2V0dXBfY2hvaWNlKCAnc3RhcnQnICk7XG5cdFx0XHRpZiAoIHJlcXVlc3QgKSB7XG5cdFx0XHRcdHJlcXVlc3QuYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoICEgcmVkaXJlY3Rfc3RhcnRlZCApIHtcblx0XHRcdFx0XHRcdHJlZGlyZWN0X3N0YXJ0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmFzc2lnbiggc2V0dXBfcHJvbXB0LnNldHVwX3VybCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fSBlbHNlIGlmICggISByZWRpcmVjdF9zdGFydGVkICkge1xuXHRcdFx0XHRyZWRpcmVjdF9zdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmFzc2lnbiggc2V0dXBfcHJvbXB0LnNldHVwX3VybCApO1xuXHRcdFx0fVxuXHRcdFx0JG1vZGFsLndwYmNfbXlfbW9kYWwoICdoaWRlJyApO1xuXHRcdH0gKTtcblxuXHRcdCRtb2RhbC53cGJjX215X21vZGFsKCB7XG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogdHJ1ZSxcblx0XHRcdHNob3c6IHRydWVcblx0XHR9ICk7XG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIGZpcnN0IGVsaWdpYmxlIGRpYWxvZyB3aXRob3V0IGFsbG93aW5nIGJvdGggdG8gb3ZlcmxhcC5cblx0ICpcblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIGluaXRpYWxpemVfcHJvbXB0cygpIHtcblx0XHRwcmV2aW91c19mb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cblx0XHRpZiAoIHNldHVwX3Byb21wdC5zaG93ICkge1xuXHRcdFx0c2hvd19zZXR1cF9kaWFsb2coKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGJvb2tpbmdfcGFnZXNfcHJvbXB0LnNob3cgKSB7XG5cdFx0XHRzaG93X2Jvb2tpbmdfcGFnZXNfZGlhbG9nKCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlb3BlbiB0aGUgc3RhcnRlci1wYWdlcyBkaWFsb2cgZnJvbSBhbiBleHBsaWNpdCBCb29raW5nIExpc3RpbmcgY29udHJvbC5cblx0ICpcblx0ICogTWFudWFsIG9wZW5pbmcgbmV2ZXIgcmUtZW5hYmxlcyBvciBjb25zdW1lcyBhdXRvbWF0aWMgZmlyc3QtcnVuIGRpc3BsYXkuXG5cdCAqIEZvY3VzIHJldHVybnMgdG8gdGhlIGludm9raW5nIGJ1dHRvbiBhZnRlciB0aGUgZGlhbG9nIGNsb3Nlcy5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgQnJvd3NlciBjbGljayBldmVudC5cblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIG9wZW5fYm9va2luZ19wYWdlc19kaWFsb2dfbWFudWFsbHkoIGV2ZW50ICkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0cHJldmlvdXNfZm9jdXMgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuXHRcdHNob3dfYm9va2luZ19wYWdlc19kaWFsb2coIGZhbHNlICk7XG5cdH1cblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2xpY2sud3BiY1NldHVwQm9va2luZ1BhZ2VzTGF1bmNoZXInLCAnW2RhdGEtd3BiYy1ib29raW5nLXBhZ2VzLW9wZW4tZGlhbG9nXScsIG9wZW5fYm9va2luZ19wYWdlc19kaWFsb2dfbWFudWFsbHkgKTtcblx0JCggaW5pdGlhbGl6ZV9wcm9tcHRzICk7XG59KCB3aW5kb3csIGRvY3VtZW50LCB3aW5kb3cualF1ZXJ5ICkgKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRSxXQUFVQSxNQUFNLEVBQUVDLFFBQVEsRUFBRUMsQ0FBQyxFQUFHO0VBQ2pDLFlBQVk7O0VBRVosSUFBSUMsTUFBTSxHQUFHSCxNQUFNLENBQUNJLHNDQUFzQyxJQUFJLENBQUMsQ0FBQztFQUNoRSxJQUFJQyxZQUFZLEdBQUdGLE1BQU0sQ0FBQ0UsWUFBWSxJQUFJLENBQUMsQ0FBQztFQUM1QyxJQUFJQyxvQkFBb0IsR0FBR0gsTUFBTSxDQUFDRyxvQkFBb0IsSUFBSSxDQUFDLENBQUM7RUFDNUQsSUFBSUMsYUFBYSxHQUFHLElBQUk7RUFDeEIsSUFBSUMscUJBQXFCLEdBQUcsSUFBSTtFQUNoQyxJQUFJQyw0QkFBNEIsR0FBRyxLQUFLO0VBQ3hDLElBQUlDLGdCQUFnQixHQUFHLEtBQUs7RUFDNUIsSUFBSUMsY0FBYyxHQUFHLElBQUk7O0VBRXpCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDLFNBQVNDLG9CQUFvQkEsQ0FBRUMs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RCxPQUFPLEVBQUc7UUFDZEEsT0FBTyxDQUFDRSxNQUFNLENBQUUsWUFBVztVQUMxQixJQUFLLENBQUUxRCxnQkFBZ0IsRUFBRztZQUN6QkEsZ0JBQWdCLEdBQUcsSUFBSTtZQUN2QlYsTUFBTSxDQUFDcUUsUUFBUSxDQUFDQyxNQUFNLENBQUVqRSxZQUFZLENBQUM0RCxTQUFVLENBQUM7VUFDakQ7UUFDRCxDQUFFLENBQUM7TUFDSixDQUFDLE1BQU0sSUFBSyxDQUFFdkQsZ0JBQWdCLEVBQUc7UUFDaENBLGdCQUFnQixHQUFHLElBQUk7UUFDdkJWLE1BQU0sQ0FBQ3FFLFFBQVEsQ0FBQ0MsTUFBTSxDQUFFakUsWUFBWSxDQUFDNEQsU0FBVSxDQUFDO01BQ2pEO01BQ0EzQixNQUFNLENBQUNJLGFBQWEsQ0FBRSxNQUFPLENBQUM7SUFDL0IsQ0FBRSxDQUFDO0lBRUhKLE1BQU0sQ0FBQ0ksYUFBYSxDQUFFO01BQ3JCYSxRQUFRLEVBQUUsUUFBUTtNQUNsQkMsUUFBUSxFQUFFLElBQUk7TUFDZEMsSUFBSSxFQUFFO0lBQ1AsQ0FBRSxDQUFDO0VBQ0o7O0VBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtFQUNDLFNBQVNjLGtCQUFrQkEsQ0FBQSxFQUFHO0lBQzdCNUQsY0FBYyxHQUFHVixRQUFRLENBQUN1RSxhQUFhO0lBRXZDLElBQUtuRSxZQUFZLENBQUNvRCxJQUFJLEVBQUc7TUFDeEJDLGlCQUFpQixDQUFDLENBQUM7TUFDbkI7SUFDRDtJQUVBLElBQUtwRCxvQkFBb0IsQ0FBQ21ELElBQUksRUFBRztNQUNoQ3RCLHlCQUF5QixDQUFFLElBQUssQ0FBQztJQUNsQztFQUNEOztFQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDLFNBQVNzQyxrQ0FBa0NBLENBQUVwQixLQUFLLEVBQUc7SUFDcERBLEtBQUssQ0FBQ0MsY0FBYyxDQUFDLENBQUM7SUFDdEIzQyxjQUFjLEdBQUcwQyxLQUFLLENBQUNxQixhQUFhO0lBQ3BDdkMseUJBQXlCLENBQUUsS0FBTSxDQUFDO0VBQ25DO0VBRUFqQyxDQUFDLENBQUVELFFBQVMsQ0FBQyxDQUFDNEMsRUFBRSxDQUFFLHFDQUFxQyxFQUFFLHVDQUF1QyxFQUFFNEIsa0NBQW1DLENBQUM7RUFDdEl2RSxDQUFDLENBQUVxRSxrQkFBbUIsQ0FBQztBQUN4QixDQUFDLEVBQUV2RSxNQUFNLEVBQUVDLFFBQVEsRUFBRUQsTUFBTSxDQUFDMkUsTUFBTyxDQUFDIiwiaWdub3JlTGlzdCI6W119
278