PluginProbe
Booking Calendar / 11.9
Booking Calendar v11.9
11.9 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 All 205 releases
booking / includes / page-form-builder / form-details / _out / current-form-details-ui.js

current-form-details-ui.js in Booking Calendar 11.9, at includes/page-form-builder/form-details/_out/current-form-details-ui.js

239 lines 30.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 /* globals window, document */
4 (function (w, d) {
5 'use strict';
6
7 var api = w.WPBC_BFB_Form_Details = w.WPBC_BFB_Form_Details || {};
8 var is_ready = false;
9 function get_input_el(setting_key) {
10 var id = 'wpbc_bfb_setting__' + setting_key;
11 return d.getElementById(id);
12 }
13 function get_picture_url_el() {
14 return get_input_el('bfb_form_details__picture_url');
15 }
16 function get_preview_img_el() {
17 var root = d.querySelector('[data-wpbc-bfb-form-details-media="1"]');
18 return root ? root.querySelector('.wpbc_bfb__form_details_media__img') : null;
19 }
20 function get_preview_placeholder_el() {
21 var root = d.querySelector('[data-wpbc-bfb-form-details-media="1"]');
22 return root ? root.querySelector('.wpbc_bfb__form_details_media__placeholder') : null;
23 }
24 function get_preview_img_el__at_top_toolbar() {
25 var el = d.querySelector('.wpbc_bfb__hint__top_bar .wpbc_bfb__form_details_media__img');
26 return el ? el : null;
27 }
28 function get_preview_placeholder_el__at_top_toolbar() {
29 var el = d.querySelector('.wpbc_bfb__hint__top_bar .wpbc_bfb__form_details_media__placeholder');
30 return el ? el : null;
31 }
32 function show_hide_preview_image(url, img, ph) {
33 if (!img || !ph) {
34 return;
35 }
36 if (typeof url === 'string' && url.trim()) {
37 img.src = url;
38 img.style.display = 'block';
39 ph.style.display = 'none';
40 } else {
41 img.src = '';
42 img.style.display = 'none';
43 ph.style.display = 'block';
44 }
45 }
46 function set_preview_image(url) {
47 var img = get_preview_img_el();
48 var ph = get_preview_placeholder_el();
49 show_hide_preview_image(url, img, ph);
50 img = get_preview_img_el__at_top_toolbar();
51 ph = get_preview_placeholder_el__at_top_toolbar();
52 show_hide_preview_image(url, img, ph);
53 }
54 function sanitize_form_name(raw_value) {
55 var val = typeof raw_value === 'string' ? raw_value : '';
56 val = val.trim();
57
58 // Prefer core sanitize if available.
59 if (w.WPBC_BFB_Core && w.WPBC_BFB_Core.Sanitize && typeof w.WPBC_BFB_Core.Sanitize.to_token === 'function') {
60 return w.WPBC_BFB_Core.Sanitize.to_token(val);
61 }
62
63 // Fallback: allow a-z 0-9 _ only.
64 val = val.toLowerCase();
65 val = val.replace(/[^a-z0-9_]+/g, '_');
66 val = val.replace(/^_+|_+$/g, '');
67 return val;
68 }
69 function apply_loaded_data(detail) {
70 if (!w.jQuery) {
71 return;
72 }
73 var loaded = detail && typeof detail.loaded_data === 'object' && detail.loaded_data ? detail.loaded_data : {};
74 var form_name_el = get_input_el('bfb_form_details__form_name');
75 var title_el = get_input_el('bfb_form_details__title');
76 var picture_url_el = get_picture_url_el();
77 var desc_el = get_input_el('bfb_form_details__description');
78 var form_name = loaded.form_name || detail.form_name || 'standard';
79 var title = typeof loaded.title === 'string' && loaded.title.trim() ? loaded.title.trim() : form_name;
80 var picture_url = typeof loaded.picture_url === 'string' && loaded.picture_url.trim() ? loaded.picture_url.trim() : '';
81 var description = typeof loaded.description === 'string' && loaded.description.trim() ? loaded.description.trim() : '';
82 if (form_name_el) {
83 form_name_el.value = form_name;
84 }
85 if (title_el) {
86 title_el.value = title;
87 }
88 if (picture_url_el) {
89 picture_url_el.value = picture_url;
90 }
91 if (desc_el) {
92 desc_el.value = description;
93 }
94 set_preview_image(picture_url);
95
96 // Optional: update the existing hint title, if present.
97 var $hint_title = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__hint__form_name__title a.value');
98 var $hint_pic = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__form_details_media__img');
99 var $hint_slug = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__hint__form_name__slug span.value');
100 var $hint_title_i = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__hint__form_name__title i');
101 if ($hint_title.length) {
102 $hint_title.text(title);
103 }
104 if ($hint_title.length) {
105 $hint_title.attr("title", description);
106 }
107 if ($hint_pic.length) {
108 $hint_pic.attr("src", picture_url);
109 }
110 if ($hint_slug.length) {
111 $hint_slug.text(form_name);
112 }
113 w.jQuery('.wpbc_bfb__hint__form_name__label').css('display', 'flex');
114 if (picture_url) {
115 w.jQuery('.wpbc_bfb__hint__top_bar.wpbc_bfb__hint__form_name .wpbc_bfb__form_details_media__preview img').css('display', 'block');
116 w.jQuery('.wpbc_bfb__hint__top_bar.wpbc_bfb__hint__form_name .wpbc_bfb__form_details_media__preview .wpbc_bfb__form_details_media__placeholder').css('display', 'none');
117 }
118 }
119
120 /**
121 * Sync UI after picture URL change.
122 *
123 * @return void
124 */
125 function on_picture_url_changed() {
126 var picture_url_el = get_picture_url_el();
127 var url = picture_url_el && typeof picture_url_el.value === 'string' ? picture_url_el.value : '';
128 set_preview_image(url);
129
130 // Keep existing hint image in sync (if present).
131 if (w.jQuery) {
132 var $hint_pic = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__form_details_media__img');
133 if ($hint_pic.length) {
134 $hint_pic.attr('src', url);
135 }
136 }
137 }
138 function remove_selected_image() {
139 var picture_url_el = get_picture_url_el();
140 if (picture_url_el) {
141 picture_url_el.value = '';
142 }
143 on_picture_url_changed();
144 }
145 function bind_ui() {
146 if (is_ready) {
147 return;
148 }
149 is_ready = true;
150
151 // Load values when current form is loaded/saved via AJAX.
152 d.addEventListener('wpbc:bfb:form:ajax_loaded', function (e) {
153 apply_loaded_data(e && e.detail ? e.detail : null);
154 }, {
155 passive: true
156 });
157 d.addEventListener('wpbc:bfb:form:ajax_saved', function (e) {
158 apply_loaded_data(e && e.detail ? e.detail : null);
159 }, {
160 passive: true
161 });
162
163 // React to URL changes (manual edits + programmatic set from uploader).
164 var picture_url_el = get_picture_url_el();
165 if (picture_url_el) {
166 picture_url_el.addEventListener('input', on_picture_url_changed, {
167 passive: true
168 });
169 picture_url_el.addEventListener('change', on_picture_url_changed, {
170 passive: true
171 });
172
173 // Your custom uploader hook (jQuery event).
174 if (w.jQuery) {
175 w.jQuery(picture_url_el).on('wpbc_media_upload_url_set', function () {
176 on_picture_url_changed();
177 });
178 }
179 }
180
181 // Remove button stays native.
182 var btn_remove = d.getElementById('wpbc_bfb__form_details_remove_image');
183 if (btn_remove) {
184 btn_remove.addEventListener('click', function (evt) {
185 evt.preventDefault();
186 remove_selected_image();
187 });
188 }
189
190 // Optional: keyboard support for clickable preview (if it’s a DIV).
191 var btn_img = d.querySelector('.wpbc_bfb__form_details_media__preview');
192 if (btn_img) {
193 btn_img.addEventListener('keydown', function (evt) {
194 if ('Enter' === evt.key || ' ' === evt.key) {
195 evt.preventDefault();
196 btn_img.click();
197 }
198 });
199 }
200
201 // Sanitize slug on blur (keep your existing code).
202 var form_name_el = get_input_el('bfb_form_details__form_name');
203 if (form_name_el) {
204 form_name_el.addEventListener('blur', function () {
205 form_name_el.value = sanitize_form_name(form_name_el.value);
206 });
207 }
208 }
209 function boot() {
210 bind_ui();
211 bind_events();
212 }
213 if (d.readyState === 'loading') {
214 d.addEventListener('DOMContentLoaded', boot, {
215 once: true
216 });
217 } else {
218 boot();
219 }
220
221 // Public helpers.
222 api.apply_loaded_data = apply_loaded_data;
223
224 // == Top Toolbar Form Name and Picture tumb ======================================================================
225 function bind_events() {
226 // On click on Booking form Title in top toolbar.
227 d.addEventListener('click', function (ev) {
228 var btn = ev.target && ev.target.closest('.wpbc_bfb__hint__top_bar .wpbc_bfb__hint__form_name__title .value');
229 if (!btn) {
230 return;
231 }
232 ev.preventDefault();
233 // Open "From Details" inspector sidebar.
234 d.querySelector('[role="tab"][aria-controls="wpbc_bfb__inspector_form_details"]').click();
235 });
236 }
237 })(window, document);
238 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZm9ybS1kZXRhaWxzL19vdXQvY3VycmVudC1mb3JtLWRldGFpbHMtdWkuanMiLCJuYW1lcyI6WyJ3IiwiZCIsImFwaSIsIldQQkNfQkZCX0Zvcm1fRGV0YWlscyIsImlzX3JlYWR5IiwiZ2V0X2lucHV0X2VsIiwic2V0dGluZ19rZXkiLCJpZCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0X3BpY3R1cmVfdXJsX2VsIiwiZ2V0X3ByZXZpZXdfaW1nX2VsIiwicm9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRfcHJldmlld19wbGFjZWhvbGRlcl9lbCIsImdldF9wcmV2aWV3X2ltZ19lbF9fYXRfdG9wX3Rvb2xiYXIiLCJlbCIsImdldF9wcmV2aWV3X3BsYWNlaG9sZGVyX2VsX19hdF90b3BfdG9vbGJhciIsInNob3dfaGlkZV9wcmV2aWV3X2ltYWdlIiwidXJsIiwiaW1nIiwicGgiLCJ0cmltIiwic3JjIiwic3R5bGUiLCJkaXNwbGF5Iiwic2V0X3ByZXZpZXdfaW1hZ2UiLCJzYW5pdGl6ZV9mb3JtX25hbWUiLCJyYXdfdmFsdWUiLCJ2YWwiLCJXUEJDX0JGQl9Db3JlIiwiU2FuaXRpemUiLCJ0b190b2tlbiIsInRvTG93ZXJDYXNlIiwicmVwbGFjZSIsImFwcGx5X2xvYWRlZF9kYXRhIiwiZGV0YWlsIiwialF1ZXJ5IiwibG9hZGVkIiwibG9hZGVkX2RhdGEiLCJmb3JtX25hbWVfZWwiLCJ0aXRsZV9lbCIsInBpY3R1cmVfdXJsX2VsIiwiZGVzY19lbCIsImZvcm1fbmFtZSIsInRpdGxlIiwicGljdHVyZV91cmwiLCJkZXNjcmlwdGlvbiIsInZhbHVlIiwiJGhpbnRfdGl0bGUiLCIkaGludF9waWMiLCIkaGludF9zbHVnIiwiJGhpbnRfdGl0bGVfaSIsImxlbmd0aCIsInRleHQiLCJhdHRyIiwiY3NzIiwib25fcGljdHVyZV91cmxfY2hhbmdlZCIsInJlbW92ZV9zZWxlY3RlZF9pbWFnZSIsImJpbmRfdWkiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInBhc3NpdmUiLCJvbiIsImJ0bl9yZW1vdmUiLCJldnQiLCJwcmV2ZW50RGVmYXVsdCIsImJ0bl9pbWciLCJrZXkiLCJjbGljayIsImJvb3QiLCJiaW5kX2V2ZW50cyIsInJlYWR5U3RhdGUiLCJvbmNlIiwiZXYiLCJidG4iLCJ0YXJnZXQiLCJjbG9zZXN0Iiwid2luZG93IiwiZG9jdW1lbnQiXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9mb3JtLWRldGFpbHMvX3NyYy9jdXJyZW50LWZvcm0tZGV0YWlscy11aS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWxzIHdpbmRvdywgZG9jdW1lbnQgKi9cclxuKGZ1bmN0aW9uICh3LCBkKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHR2YXIgYXBpID0gdy5XUEJDX0JGQl9Gb3JtX0RldGFpbHMgPSB3LldQQkNfQkZCX0Zvcm1fRGV0YWlscyB8fCB7fTtcclxuXHJcblx0dmFyIGlzX3JlYWR5ID0gZmFsc2U7XHJcblxyXG5cdGZ1bmN0aW9uIGdldF9pbnB1dF9lbChzZXR0aW5nX2tleSkge1xyXG5cdFx0dmFyIGlkID0gJ3dwYmNfYmZiX3NldHRpbmdfXycgKyBzZXR0aW5nX2tleTtcclxuXHRcdHJldHVybiBkLmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldF9waWN0dXJlX3VybF9lbCgpIHtcclxuXHRcdHJldHVybiBnZXRfaW5wdXRfZWwoJ2JmYl9mb3JtX2RldGFpbHNfX3BpY3R1cmVfdXJsJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRfcHJldmlld19pbWdfZWwoKSB7XHJcblx0XHR2YXIgcm9vdCA9IGQucXVlcnlTZWxlY3RvcignW2RhdGEtd3BiYy1iZmItZm9ybS1kZXRhaWxzLW1lZGlhPVwiMVwiXScpO1xyXG5cdFx0cmV0dXJuIHJvb3QgPyByb290LnF1ZXJ5U2VsZWN0b3IoJy53cGJjX2JmYl9fZm9ybV9kZXRhaWxzX21lZGlhX19pbWcnKSA6IG51bGw7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRfcHJldmlld19wbGFjZWhvbGRlcl9lbCgpIHtcclxuXHRcdHZhciByb290ID0gZC5xdWVyeVNlbGVjdG9yKCdbZGF0YS13cGJjLWJmYi1mb3JtLWRldGFpbHMtbWVkaWE9XCIxXCJdJyk7XHJcblx0XHRyZXR1cm4gcm9vdCA/IHJvb3QucXVlcnlTZWxlY3RvcignLndwYmNfYmZiX19mb3JtX2RldGFpbHNfbWVkaWFfX3BsYWNlaG9sZGVyJykgOiBudWxsO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0X3ByZXZpZXdfaW1nX2VsX19hdF90b3BfdG9vbGJhcigpIHtcclxuXHRcdHZhciBlbCA9IGQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9faGludF9fdG9wX2JhciAud3BiY19iZmJfX2Zvcm1fZGV0YWlsc19tZWRpYV9faW1nJyApO1xyXG5cdFx0cmV0dXJuIGVsID8gZWwgOiBudWxsO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0X3ByZXZpZXdfcGxhY2Vob2xkZXJfZWxfX2F0X3RvcF90b29sYmFyKCkge1xyXG5cdFx0dmFyIGVsID0gZC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19oaW50X190b3BfYmFyIC53cGJjX2JmYl9fZm9ybV9kZXRhaWxzX21lZGlhX19wbGFjZWhvbGRlcicgKTtcclxuXHRcdHJldHVybiBlbCA/IGVsIDogbnVsbDtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNob3dfaGlkZV9wcmV2aWV3X2ltYWdlKHVybCwgaW1nLCBwaCkge1xyXG5cclxuXHRcdGlmICggISBpbWcgfHwgISBwaCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLnRyaW0oKSApIHtcclxuXHRcdFx0aW1nLnNyYyA9IHVybDtcclxuXHRcdFx0aW1nLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cdFx0XHRwaC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aW1nLnNyYyA9ICcnO1xyXG5cdFx0XHRpbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0cGguc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRfcHJldmlld19pbWFnZSh1cmwpIHtcclxuXHJcblx0XHR2YXIgaW1nID0gZ2V0X3ByZXZpZXdfaW1nX2VsKCk7XHJcblx0XHR2YXIgcGggID0gZ2V0X3ByZXZpZXdfcGxhY2Vob2xkZXJfZWwoKTtcclxuXHRcdHNob3dfaGlkZV9wcmV2aWV3X2ltYWdlKCB1cmwsIGltZywgcGggKTtcclxuXHJcblx0XHRpbWcgPSBnZXRfcHJldmlld19pbWdfZWxfX2F0X3RvcF90b29sYmFyKCk7XHJcblx0XHRwaCAgPSBnZXRfcHJldmlld19wbGFjZWhvbGRlcl9lbF9fYXRfdG9wX3Rvb2xiYXIoKTtcclxuXHRcdHNob3dfaGlkZV9wcmV2aWV3X2ltYWdlKCB1cmwsIGltZywgcGggKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNhbml0aXplX2Zvcm1fbmFtZShyYXdfdmFsdWUpIHtcclxuXHRcdHZhciB2YWwgPSAodHlwZW9mIHJhd192YWx1ZSA9PT0gJ3N0cmluZycpID8gcmF3X3ZhbHVlIDogJyc7XHJcblx0XHR2YWwgPSB2YWwudHJpbSgpO1xyXG5cclxuXHRcdC8vIFByZWZlciBjb3JlIHNhbml0aXplIGlmIGF2YWlsYWJsZS5cclxuXHRcdGlmICggdy5XUEJDX0JGQl9Db3JlICYmIHcuV1BCQ19CRkJfQ29yZS5TYW5pdGl6ZSAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9Db3JlLlNhbml0aXplLnRvX3Rva2VuID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRyZXR1cm4gdy5XUEJDX0JGQl9Db3JlLlNhbml0aXplLnRvX3Rva2VuKHZhbCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRmFsbGJhY2s6IGFsbG93IGEteiAwLTkgXyBvbmx5LlxyXG5cdFx0dmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XHJcblx0XHR2YWwgPSB2YWwucmVwbGFjZSgvW15hLXowLTlfXSsvZywgJ18nKTtcclxuXHRcdHZhbCA9IHZhbC5yZXBsYWNlKC9eXyt8XyskL2csICcnKTtcclxuXHRcdHJldHVybiB2YWw7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBhcHBseV9sb2FkZWRfZGF0YShkZXRhaWwpIHtcclxuXHRcdGlmICggISB3LmpRdWVyeSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBsb2FkZWQgPSAoZGV0YWlsICYmIHR5cGVvZiBkZXRhaWwubG9hZGVkX2RhdGEgPT09ICdvYmplY3QnICYmIGRldGFpbC5sb2FkZWRfZGF0YSkgPyBkZXRhaWwubG9hZGVkX2RhdGEgOiB7fTtcclxuXHJcblx0XHR2YXIgZm9ybV9uYW1lX2VsICAgPSBnZXRfaW5wdXRfZWwoJ2JmYl9mb3JtX2RldGFpbHNfX2Zvcm1fbmFtZScpO1xyXG5cdFx0dmFyIHRpdGxlX2VsICAgICAgID0gZ2V0X2lucHV0X2VsKCdiZmJfZm9ybV9kZXRhaWxzX190aXRsZScpO1xyXG5cdFx0dmFyIHBpY3R1cmVfdXJsX2VsID0gZ2V0X3BpY3R1cmVfdXJsX2VsKCk7XHJcblx0XHR2YXIgZGVzY19lbCAgICAgICAgPSBnZXRfaW5wdXRfZWwoJ2JmYl9mb3JtX2RldGFpbHNfX2Rlc2NyaXB0aW9uJyk7XHJcblxyXG5cdFx0dmFyIGZvcm1fbmFtZSAgID0gbG9hZGVkLmZvcm1fbmFtZSB8fCBkZXRhaWwuZm9ybV9uYW1lIHx8ICdzdGFuZGFyZCc7XHJcblx0XHR2YXIgdGl0bGUgICAgICAgPSAodHlwZW9mIGxvYWRlZC50aXRsZSA9PT0gJ3N0cmluZycgJiYgbG9hZGVkLnRpdGxlLnRyaW0oKSkgPyBsb2FkZWQudGl0bGUudHJpbSgpIDogZm9ybV9uYW1lO1xyXG5cdFx0dmFyIHBpY3R1cmVfdXJsID0gKHR5cGVvZiBsb2FkZWQucGljdHVyZV91cmwgPT09ICdzdHJpbmcnICYmIGxvYWRlZC5waWN0dXJlX3VybC50cmltKCkpID8gbG9hZGVkLnBpY3R1cmVfdXJsLnRyaW0oKSA6ICcnO1xyXG5cdFx0dmFyIGRlc2NyaXB0aW9uID0gKHR5cGVvZiBsb2FkZWQuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIGxvYWRlZC5kZXNjcmlwdGlvbi50cmltKCkpID8gbG9hZGVkLmRlc2NyaXB0aW9uLnRyaW0oKSA6ICcnO1xyXG5cclxuXHRcdGlmICggZm9ybV9uYW1lX2VsICkgeyBmb3JtX25hbWVfZWwudmFsdWUgPSBmb3JtX25hbWU7IH1cclxuXHRcdGlmICggdGl0bGVfZWwgKSB7IHRpdGxlX2VsLnZhbHVlID0gdGl0bGU7IH1cclxuXHRcdGlmICggcGljdHVyZV91cmxfZWwgKSB7IHBpY3R1cmVfdXJsX2VsLnZhbHVlID0gcGljdHVyZV91cmw7IH1cclxuXHRcdGlmICggZGVzY19lbCApIHsgZGVzY19lbC52YWx1ZSA9IGRlc2NyaXB0aW9uOyB9XHJcblxyXG5cdFx0c2V0X3ByZXZpZXdfaW1hZ2UocGljdHVyZV91cmwpO1xyXG5cclxuXHRcdC8vIE9wdGlvbmFsOiB1cGRhdGUgdGhlIGV4aXN0aW5nIGhpbnQgdGl0bGUsIGlmIHByZXNlbnQuXHJcblx0XHR2YXIgJGhpbnRfdGl0bGUgPSB3LmpRdWVyeSgnLndwYmNfYmZiX19oaW50X19mb3JtX25hbWUgLndwYmNfYmZiX19oaW50X19mb3JtX25hbWVfX3RpdGxlIGEudmFsdWUnKTtcclxuXHRcdHZhciAkaGludF9waWMgPSB3LmpRdWVyeSgnLndwYmNfYmZiX19oaW50X19mb3JtX25hbWUgLndwYmNfYmZiX19mb3JtX2RldGFpbHNfbWVkaWFfX2ltZycpO1xyXG5cdFx0dmFyICRoaW50X3NsdWcgPSB3LmpRdWVyeSgnLndwYmNfYmZiX19oaW50X19mb3JtX25hbWUgLndwYmNfYmZiX19oaW50X19mb3JtX25hbWVfX3NsdWcgc3Bhbi52YWx1ZScpO1xyXG5cdFx0dmFyICRoaW50X3RpdGxlX2kgPSB3LmpRdWVyeSgnLndwYmNfYmZiX19oaW50X19mb3JtX25hbWUgLndwYmNfYmZiX19oaW50X19mb3JtX25hbWVfX3RpdGxlIGknKTtcclxuXHRcdGlmICggJGhpbnRfdGl0bGUubGVuZ3RoICkgeyAkaGludF90aXRsZS50ZXh0KHRpdGxlKTsgfVxyXG5cdFx0aWYgKCAkaGludF90aXRsZS5sZW5ndGggKSB7ICRoaW50X3RpdGxlLmF0dHIoXCJ0aXRsZVwiLCBkZXNjcmlwdGlvbik7IH1cclxuXHRcdGlmICggJGhpbnRfcGljLmxlbmd0aCApIHsgJGhpbnRfcGljLmF0dHIoXCJzcmNcIiwgcGljdHVyZV91cmwpOyB9XHJcblx0XHRpZiAoICRoaW50X3NsdWcubGVuZ3RoICkgeyAkaGludF9zbHVnLnRleHQoIGZvcm1fbmFtZSApOyB9XHJcblx0XHR3LmpRdWVyeSggJy53cGJjX2JmYl9faGludF9fZm9ybV9uYW1lX19sYWJlbCcgKS5jc3MoICdkaXNwbGF5JywgJ2ZsZXgnICk7XHJcblx0XHRpZiAocGljdHVyZV91cmwpe1xyXG5cdFx0XHR3LmpRdWVyeSggJy53cGJjX2JmYl9faGludF9fdG9wX2Jhci53cGJjX2JmYl9faGludF9fZm9ybV9uYW1lIC53cGJjX2JmYl9fZm9ybV9kZXRhaWxzX21lZGlhX19wcmV2aWV3IGltZycgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xyXG5cdFx0XHR3LmpRdWVyeSggJy53cGJjX2JmYl9faGludF9fdG9wX2Jhci53cGJjX2JmYl9faGludF9fZm9ybV9uYW1lIC53cGJjX2JmYl9fZm9ybV9kZXRhaWxzX21lZGlhX19wcmV2aWV3IC53cGJjX2JmYl9fZm9ybV9kZXRhaWxzX21lZGlhX19wbGFjZWhvbGRlcicgKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU3luYyBVSSBhZnRlciBwaWN0dXJlIFVSTCBjaGFuZ2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHZvaWRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiBvbl9waWN0dXJlX3VybF9jaGFuZ2VkKCkge1xyXG5cclxuXHRcdHZhciBwaWN0dXJlX3VybF9lbCA9IGdldF9waWN0dXJlX3VybF9lbCgpO1xyXG5cdFx0dmFyIHVybCA9ICggcGljdHVyZV91cmxfZWwgJiYgdHlwZW9mIHBpY3R1cmVfdXJsX2VsLnZhbHVlID09PSAnc3RyaW5nJyApID8gcGljdHVyZV91cmxfZWwudmFsdWUgOiAnJztcclxuXHJcblx0XHRzZXRfcHJldmlld19pbWFnZSggdXJsICk7XHJcblxyXG5cdFx0Ly8gS2VlcCBleGlzdGluZyBoaW50IGltYWdlIGluIHN5bmMgKGlmIHByZXNlbnQpLlxyXG5cdFx0aWYgKCB3LmpRdWVyeSApIHtcclxuXHRcdFx0dmFyICRoaW50X3BpYyA9IHcualF1ZXJ5KCAnLndwYmNfYmZiX19oaW50X19mb3JtX25hbWUgLndwYmNfYmZiX19mb3JtX2RldGFpbHNfbWVkaWFfX2ltZycgKTtcclxuXHRcdFx0aWYgKCAkaGludF9waWMubGVuZ3RoICkge1xyXG5cdFx0XHRcdCRoaW50X3BpYy5hdHRyKCAnc3JjJywgdXJsICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbW92ZV9zZWxlY3RlZF9pbWFnZSgpIHtcclxuXHJcblx0XHR2YXIgcGljdHVyZV91cmxfZWwgPSBnZXRfcGljdHVyZV91cmxfZWwoKTtcclxuXHJcblx0XHRpZiAoIHBpY3R1cmVfdXJsX2VsICkge1xyXG5cdFx0XHRwaWN0dXJlX3VybF9lbC52YWx1ZSA9ICcnO1xyXG5cdFx0fVxyXG5cclxuXHRcdG9uX3BpY3R1cmVfdXJsX2NoYW5nZWQoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGJpbmRfdWkoKSB7XHJcblxyXG5cdFx0aWYgKCBpc19yZWFkeSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0aXNfcmVhZHkgPSB0cnVlO1xyXG5cclxuXHRcdC8vIExvYWQgdmFsdWVzIHdoZW4gY3VycmVudCBmb3JtIGlzIGxvYWRlZC9zYXZlZCB2aWEgQUpBWC5cclxuXHRcdGQuYWRkRXZlbnRMaXN0ZW5lciggJ3dwYmM6YmZiOmZvcm06YWpheF9sb2FkZWQnLCBmdW5jdGlvbiAoIGUgKSB7XHJcblx0XHRcdGFwcGx5X2xvYWRlZF9kYXRhKCBlICYmIGUuZGV0YWlsID8gZS5kZXRhaWwgOiBudWxsICk7XHJcblx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSApO1xyXG5cclxuXHRcdGQuYWRkRXZlbnRMaXN0ZW5lciggJ3dwYmM6YmZiOmZvcm06YWpheF9zYXZlZCcsIGZ1bmN0aW9uICggZSApIHtcclxuXHRcdFx0YXBwbHlfbG9hZGVkX2RhdGEoIGUgJiYgZS5kZXRhaWwgPyBlLmRldGFpbCA6IG51bGwgKTtcclxuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9ICk7XHJcblxyXG5cdFx0Ly8gUmVhY3QgdG8gVVJMIGNoYW5nZXMgKG1hbnVhbCBlZGl0cyArIHByb2dyYW1tYXRpYyBzZXQgZnJvbSB1cGxvYWRlcikuXHJcblx0XHR2YXIgcGljdHVyZV91cmxfZWwgPSBnZXRfcGljdHVyZV91cmxfZWwoKTtcclxuXHRcdGlmICggcGljdHVyZV91cmxfZWwgKSB7XHJcblxyXG5cdFx0XHRwaWN0dXJlX3VybF9lbC5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXQnLCBvbl9waWN0dXJlX3VybF9jaGFuZ2VkLCB7IHBhc3NpdmU6IHRydWUgfSApO1xyXG5cdFx0XHRwaWN0dXJlX3VybF9lbC5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgb25fcGljdHVyZV91cmxfY2hhbmdlZCwgeyBwYXNzaXZlOiB0cnVlIH0gKTtcclxuXHJcblx0XHRcdC8vIFlvdXIgY3VzdG9tIHVwbG9hZGVyIGhvb2sgKGpRdWVyeSBldmVudCkuXHJcblx0XHRcdGlmICggdy5qUXVlcnkgKSB7XHJcblx0XHRcdFx0dy5qUXVlcnkoIHBpY3R1cmVfdXJsX2VsICkub24oICd3cGJjX21lZGlhX3VwbG9hZF91cmxfc2V0JywgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0b25fcGljdHVyZV91cmxfY2hhbmdlZCgpO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJlbW92ZSBidXR0b24gc3RheXMgbmF0aXZlLlxyXG5cdFx0dmFyIGJ0bl9yZW1vdmUgPSBkLmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2Zvcm1fZGV0YWlsc19yZW1vdmVfaW1hZ2UnICk7XHJcblx0XHRpZiAoIGJ0bl9yZW1vdmUgKSB7XHJcblx0XHRcdGJ0bl9yZW1vdmUuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKCBldnQgKSB7XHJcblx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0cmVtb3ZlX3NlbGVjdGVkX2ltYWdlKCk7XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBPcHRpb25hbDoga2V5Ym9hcmQgc3VwcG9ydCBmb3IgY2xpY2thYmxlIHByZXZpZXcgKGlmIGl04oCZcyBhIERJVikuXHJcblx0XHR2YXIgYnRuX2ltZyA9IGQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fZm9ybV9kZXRhaWxzX21lZGlhX19wcmV2aWV3JyApO1xyXG5cdFx0aWYgKCBidG5faW1nICkge1xyXG5cdFx0XHRidG5faW1nLmFkZEV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgZnVuY3Rpb24gKCBldnQgKSB7XHJcblx0XHRcdFx0aWYgKCAnRW50ZXInID09PSBldnQua2V5IHx8ICcgJyA9PT0gZXZ0LmtleSApIHtcclxuXHRcdFx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0YnRuX2ltZy5jbGljaygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNhbml0aXplIHNsdWcgb24gYmx1ciAoa2VlcCB5b3VyIGV4aXN0aW5nIGNvZGUpLlxyXG5cdFx0dmFyIGZvcm1fbmFtZV9lbCA9IGdldF9pbnB1dF9lbCggJ2JmYl9mb3JtX2RldGFpbHNfX2Zvcm1fbmFtZScgKTtcclxuXHRcdGlmICggZm9ybV9uYW1lX2VsICkge1xyXG5cdFx0XHRmb3JtX25hbWVfZWwuYWRkRXZlbnRMaXN0ZW5lciggJ2JsdXInLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0Zm9ybV9uYW1lX2VsLnZhbHVlID0gc2FuaXRpemVfZm9ybV9uYW1lKCBmb3JtX25hbWVfZWwudmFsdWUgKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYm9vdCgpIHtcclxuXHRcdGJpbmRfdWkoKTtcclxuXHRcdGJpbmRfZXZlbnRzKCk7XHJcblx0fVxyXG5cclxuXHRpZiAoIGQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnICkge1xyXG5cdFx0ZC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgYm9vdCwgeyBvbmNlOiB0cnVlIH0pO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRib290KCk7XHJcblx0fVxyXG5cclxuXHQvLyBQdWJsaWMgaGVscGVycy5cclxuXHRhcGkuYXBwbHlfbG9hZGVkX2RhdGEgPSBhcHBseV9sb2FkZWRfZGF0YTtcclxuXHJcblx0Ly8gPT0gVG9wIFRvb2xiYXIgRm9ybSBOYW1lICBhbmQgUGljdHVyZSB0dW1iID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHRmdW5jdGlvbiBiaW5kX2V2ZW50cygpIHtcclxuXHRcdC8vIE9uIGNsaWNrIG9uIEJvb2tpbmcgZm9ybSBUaXRsZSBpbiAgdG9wICB0b29sYmFyLlxyXG5cdFx0ZC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBmdW5jdGlvbiAoZXYpIHtcclxuXHRcdFx0dmFyIGJ0biA9IGV2LnRhcmdldCAmJiBldi50YXJnZXQuY2xvc2VzdCggJy53cGJjX2JmYl9faGludF9fdG9wX2JhciAud3BiY19iZmJfX2hpbnRfX2Zvcm1fbmFtZV9fdGl0bGUgLnZhbHVlJyApO1xyXG5cdFx0XHRpZiAoICEgYnRuICkgeyByZXR1cm47IH1cclxuXHRcdFx0ZXYucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0Ly8gT3BlbiBcIkZyb20gRGV0YWlsc1wiIGluc3BlY3RvciBzaWRlYmFyLlxyXG5cdFx0XHRkLnF1ZXJ5U2VsZWN0b3IoICdbcm9sZT1cInRhYlwiXVthcmlhLWNvbnRyb2xzPVwid3BiY19iZmJfX2luc3BlY3Rvcl9mb3JtX2RldGFpbHNcIl0nICkuY2xpY2soKTtcclxuXHRcdH0gKTtcclxuXHR9XHJcblxyXG59KSh3aW5kb3csIGRvY3VtZW50KTtcclxuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0EsQ0FBQyxVQUFVQSxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUNoQixZQUFZOztFQUVaLElBQUlDLEdBQUcsR0FBR0YsQ0FBQyxDQUFDRyxxQkFBcUIsR0FBR0gsQ0FBQyxDQUFDRyxxQkFBcUIsSUFBSSxDQUFDLENBQUM7RUFFakUsSUFBSUMsUUFBUSxHQUFHLEtBQUs7RUFFcEIsU0FBU0MsWUFBWUEsQ0FBQ0MsV0FBVyxFQUFFO0lBQ2xDLElBQUlDLEVBQUUsR0FBRyxvQkFBb0IsR0FBR0QsV0FBVztJQUMzQyxPQUFPTCxDQUFDLENBQUNPLGNBQWMsQ0FBQ0QsRUFBRSxDQUFDO0VBQzVCO0VBRUEsU0FBU0Usa0JBQWtCQSxDQUFBLEVBQUc7SUFDN0IsT0FBT0osWUFBWSxDQUFDLCtCQUErQixDQUFDO0VBQ3JEO0VBRUEsU0FBU0ssa0JBQWtCQSxDQUFBLEVBQUc7SUFDN0IsSUFBSUMsSUFBSSxHQUFHVixDQUFDLENBQUNXLGFBQWEsQ0FBQyx3Q0FBd0MsQ0FBQztJQUNwRSxPQUFPRCxJQUFJLEdBQUdBLElBQUksQ0FBQ0MsYUFBYSxDQUFDLG9DQUFvQyxDQUFDLEdBQUcsSUFBSTtFQUM5RTtFQUVBLFNBQVNDLDBCQUEwQkEsQ0FBQSxFQUFHO0lBQ3JDLElBQUlGLElBQUksR0FBR1YsQ0FB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
239