| 1 |
"use strict"; |
| 2 |
|
| 3 |
// File: /includes/page-form-builder/field-packs/submit/_out/submit.js |
| 4 |
(function (w) { |
| 5 |
'use strict'; |
| 6 |
|
| 7 |
var Core = w.WPBC_BFB_Core || {}; |
| 8 |
var registry = Core.WPBC_BFB_Field_Renderer_Registry; |
| 9 |
var Base = Core.WPBC_BFB_Field_Base; |
| 10 |
if (!registry || typeof registry.register !== 'function' || !Base) { |
| 11 |
_wpbc?.dev?.error?.('WPBC_BFB_Field_Submit', 'Core registry/base missing'); |
| 12 |
return; |
| 13 |
} |
| 14 |
|
| 15 |
/** |
| 16 |
* WPBC BFB: Field Renderer for "submit" (Schema-driven, template-literal render) |
| 17 |
* - Inspector is rendered by Factory (from PHP schema). |
| 18 |
* - No wp.template usage for preview. |
| 19 |
*/ |
| 20 |
class WPBC_BFB_Field_Submit extends Base { |
| 21 |
/** |
| 22 |
* Return default props for "submit" field. |
| 23 |
* Must stay in sync with PHP schema defaults. |
| 24 |
* |
| 25 |
* @returns {Object} |
| 26 |
*/ |
| 27 |
static get_defaults() { |
| 28 |
return { |
| 29 |
type: 'submit', |
| 30 |
label: 'Send', |
| 31 |
name: '', |
| 32 |
html_id: '', |
| 33 |
cssclass: 'wpbc_bfb__btn wpbc_bfb__btn--primary', |
| 34 |
help: '', |
| 35 |
usage_key: 'submit' |
| 36 |
}; |
| 37 |
} |
| 38 |
|
| 39 |
/** |
| 40 |
* Render the preview markup into the field element. |
| 41 |
* |
| 42 |
* @param {HTMLElement} el Field root element inside the canvas. |
| 43 |
* @param {Object} data Field props (already normalized by schema). |
| 44 |
* @param {Object} ctx Context: { builder, sanit, ... } |
| 45 |
* @returns {void} |
| 46 |
*/ |
| 47 |
static render(el, data, ctx) { |
| 48 |
if (!el) { |
| 49 |
return; |
| 50 |
} |
| 51 |
|
| 52 |
// Normalize against defaults first. |
| 53 |
const d = this.normalize_data(data); |
| 54 |
|
| 55 |
// ----- Core sanitize helpers (static) ----- |
| 56 |
const eh = v => Core.WPBC_BFB_Sanitize.escape_html(v); |
| 57 |
const sid = v => Core.WPBC_BFB_Sanitize.sanitize_html_id(v); |
| 58 |
const sname = v => Core.WPBC_BFB_Sanitize.sanitize_html_name(v); |
| 59 |
const sclass = v => Core.WPBC_BFB_Sanitize.sanitize_css_classlist(v); |
| 60 |
const truthy = v => Core.WPBC_BFB_Sanitize.is_truthy(v); |
| 61 |
const one_of = (v, list, def) => list.indexOf(v) !== -1 ? v : def; |
| 62 |
|
| 63 |
// Public attributes. |
| 64 |
const html_id = d.html_id ? sid(String(d.html_id)) : ''; |
| 65 |
const name_val = d.name ? sname(String(d.name)) : ''; |
| 66 |
const css_next = sclass(String(d.cssclass || '')); |
| 67 |
|
| 68 |
// Persist core-related props on dataset (do not mutate wrapper classes directly). |
| 69 |
if ('cssclass' in d && el.dataset.cssclass !== css_next) { |
| 70 |
el.dataset.cssclass = css_next; |
| 71 |
} |
| 72 |
if ('html_id' in d && el.dataset.html_id !== html_id) { |
| 73 |
el.dataset.html_id = html_id; |
| 74 |
} |
| 75 |
|
| 76 |
// Attribute fragments. |
| 77 |
const id_attr = html_id ? ` id="${eh(html_id)}"` : ''; |
| 78 |
const name_attr = name_val ? ` name="${eh(name_val)}"` : ''; |
| 79 |
const cls_attr = ` class="wpbc_button wpbc_button_primary ${css_next ? eh(css_next) : ''}"`; |
| 80 |
|
| 81 |
// Optional help text below the button. |
| 82 |
const help_html = d.help ? `<div class="wpbc_bfb__help">${eh(d.help)}</div>` : ''; |
| 83 |
|
| 84 |
// Render preview HTML (no actions; prevent real submit via type="button"). |
| 85 |
el.innerHTML = ` |
| 86 |
<span class="wpbc_bfb__noaction wpbc_bfb__no-drag-zone" inert=""> |
| 87 |
<div class="wpbc_bfb__field-preview"> |
| 88 |
<button type="button"${cls_attr}${id_attr}${name_attr}> |
| 89 |
${eh(d.label || 'Send')} |
| 90 |
</button> |
| 91 |
</div> |
| 92 |
${help_html} |
| 93 |
</span> |
| 94 |
`; |
| 95 |
|
| 96 |
// Overlay (handles/toolbars). |
| 97 |
Core.UI?.WPBC_BFB_Overlay?.ensure?.(ctx?.builder, el); |
| 98 |
} |
| 99 |
|
| 100 |
/** |
| 101 |
* Optional hook executed after field is dropped from the palette. |
| 102 |
* |
| 103 |
* @param {Object} data |
| 104 |
* @param {HTMLElement} el |
| 105 |
* @param {Object} ctx |
| 106 |
* @returns {void} |
| 107 |
*/ |
| 108 |
static on_field_drop(data, el, ctx) { |
| 109 |
// Keep base behavior (auto-name from label, etc.). |
| 110 |
super.on_field_drop?.(data, el, ctx); |
| 111 |
} |
| 112 |
} |
| 113 |
try { |
| 114 |
registry.register('submit', WPBC_BFB_Field_Submit); |
| 115 |
} catch (e) { |
| 116 |
_wpbc?.dev?.error?.('WPBC_BFB_Field_Submit.register', e); |
| 117 |
} |
| 118 |
|
| 119 |
// ----------------------------------------------------------------------------------------------------------------- |
| 120 |
// Export for "Booking Form" (Advanced Form shortcode) |
| 121 |
// ----------------------------------------------------------------------------------------------------------------- |
| 122 |
/** |
| 123 |
* Register Booking Form exporter callback (Advanced Form) for "submit". |
| 124 |
* |
| 125 |
* This exporter: |
| 126 |
* - Emits the shortcode: |
| 127 |
* [submit "Label"] |
| 128 |
* where "Label" defaults to "Send" when empty. |
| 129 |
* - Behavior is compatible with the previous centralized exporter: |
| 130 |
* • uses Core.WPBC_BFB_Sanitize.escape_for_shortcode() when available, |
| 131 |
* • does not wrap the shortcode in extra HTML, |
| 132 |
* • leaves help text handling to WPBC_BFB_Exporter.render_field_node(). |
| 133 |
*/ |
| 134 |
function register_submit_booking_form_exporter() { |
| 135 |
var Exp = w.WPBC_BFB_Exporter; |
| 136 |
if (!Exp || typeof Exp.register !== 'function') { |
| 137 |
return; |
| 138 |
} |
| 139 |
if (typeof Exp.has_exporter === 'function' && Exp.has_exporter('submit')) { |
| 140 |
return; |
| 141 |
} |
| 142 |
var S = Core.WPBC_BFB_Sanitize || {}; |
| 143 |
var esc_html = S.escape_html || function (v) { |
| 144 |
return String(v); |
| 145 |
}; |
| 146 |
var sid = S.sanitize_html_id || function (v) { |
| 147 |
return String(v).trim(); |
| 148 |
}; |
| 149 |
var scls = S.sanitize_css_classlist || function (v) { |
| 150 |
return String(v).trim(); |
| 151 |
}; |
| 152 |
var esc_sc = S.escape_for_shortcode || function (v) { |
| 153 |
return String(v); |
| 154 |
}; |
| 155 |
|
| 156 |
/** |
| 157 |
* @type {WPBC_BFB_ExporterCallback} |
| 158 |
* @param {Object} field |
| 159 |
* @param {function(string):void} emit |
| 160 |
* @param {Object} [extras] |
| 161 |
*/ |
| 162 |
var exporter_callback = function (field, emit, extras) { |
| 163 |
extras = extras || {}; |
| 164 |
|
| 165 |
// Merge with defaults to ensure all props (label, html_id, cssclass, …) are present. |
| 166 |
var defs = WPBC_BFB_Field_Submit.get_defaults(); |
| 167 |
var d = Object.assign({}, defs, field || {}); |
| 168 |
|
| 169 |
// Label (shortcode argument). |
| 170 |
var raw_label = d && typeof d.label === 'string' && d.label.length ? d.label : 'Send'; |
| 171 |
var label = '"' + esc_sc(String(raw_label)) + '"'; |
| 172 |
|
| 173 |
// ID / class wrapper around the shortcode (layout-only, no behavior). |
| 174 |
var html_id = d.html_id ? sid(String(d.html_id)) : ''; |
| 175 |
var cls_raw = String(d.cssclass_extra || d.cssclass || d.class || ''); |
| 176 |
var cls_val = scls(cls_raw); |
| 177 |
|
| 178 |
// Ensure unique id across the export tree (shared Set from the export context). |
| 179 |
var used_ids = extras && extras.ctx && extras.ctx.usedIds; |
| 180 |
if (html_id && used_ids instanceof Set) { |
| 181 |
var unique = html_id, |
| 182 |
i = 2; |
| 183 |
while (used_ids.has(unique)) { |
| 184 |
unique = html_id + '_' + i++; |
| 185 |
} |
| 186 |
used_ids.add(unique); |
| 187 |
html_id = unique; |
| 188 |
} |
| 189 |
var id_attr = html_id ? ' id="' + esc_html(html_id) + '"' : ''; |
| 190 |
var cls_attr = cls_val ? ' class="' + esc_html(cls_val) + '"' : ''; |
| 191 |
|
| 192 |
// Only wrap in <span ... style="flex:1;"> if id or class exists (matches other packs). |
| 193 |
var has_wrapper = !!(id_attr || cls_attr); |
| 194 |
var open = has_wrapper ? '<span' + id_attr + cls_attr + ' style="flex:1;">' : ''; |
| 195 |
var close = has_wrapper ? '</span>' : ''; |
| 196 |
|
| 197 |
// Shortcode itself remains legacy-compatible: - [submit "Send"] //. |
| 198 |
emit(open + '[submit ' + label + ']' + close); |
| 199 |
}; |
| 200 |
Exp.register('submit', exporter_callback); |
| 201 |
} |
| 202 |
if (w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.register === 'function') { |
| 203 |
register_submit_booking_form_exporter(); |
| 204 |
} else if (typeof document !== 'undefined') { |
| 205 |
document.addEventListener('wpbc:bfb:exporter-ready', register_submit_booking_form_exporter, { |
| 206 |
once: true |
| 207 |
}); |
| 208 |
} |
| 209 |
|
| 210 |
// ----------------------------------------------------------------------------------------------------------------- |
| 211 |
// Export for "Booking Data" (Content of booking fields data) |
| 212 |
// ----------------------------------------------------------------------------------------------------------------- |
| 213 |
/** |
| 214 |
* Register Booking Data exporter callback ("Content of booking fields data") for "submit". |
| 215 |
* |
| 216 |
* Submit is a control element and does not carry user-entered values, |
| 217 |
* so it is intentionally omitted from the "Content of booking fields data" output. |
| 218 |
*/ |
| 219 |
function register_submit_booking_data_exporter() { |
| 220 |
var C = w.WPBC_BFB_ContentExporter; |
| 221 |
if (!C || typeof C.register !== 'function') { |
| 222 |
return; |
| 223 |
} |
| 224 |
if (typeof C.has_exporter === 'function' && C.has_exporter('submit')) { |
| 225 |
return; |
| 226 |
} |
| 227 |
|
| 228 |
/** |
| 229 |
* @param {Object} field |
| 230 |
* @param {function(string):void} emit |
| 231 |
* @param {Object} [extras] |
| 232 |
* @returns {void} |
| 233 |
*/ |
| 234 |
var exporter_callback = function (field, emit, extras) { |
| 235 |
// Intentionally empty: submit has no data token/value. |
| 236 |
return; |
| 237 |
}; |
| 238 |
C.register('submit', exporter_callback); |
| 239 |
} |
| 240 |
if (w.WPBC_BFB_ContentExporter && typeof w.WPBC_BFB_ContentExporter.register === 'function') { |
| 241 |
register_submit_booking_data_exporter(); |
| 242 |
} else if (typeof document !== 'undefined') { |
| 243 |
document.addEventListener('wpbc:bfb:content-exporter-ready', register_submit_booking_data_exporter, { |
| 244 |
once: true |
| 245 |
}); |
| 246 |
} |
| 247 |
})(window); |
| 248 |
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZmllbGQtcGFja3Mvc3VibWl0L19vdXQvc3VibWl0LmpzIiwibmFtZXMiOlsidyIsIkNvcmUiLCJXUEJDX0JGQl9Db3JlIiwicmVnaXN0cnkiLCJXUEJDX0JGQl9GaWVsZF9SZW5kZXJlcl9SZWdpc3RyeSIsIkJhc2UiLCJXUEJDX0JGQl9GaWVsZF9CYXNlIiwicmVnaXN0ZXIiLCJfd3BiYyIsImRldiIsImVycm9yIiwiV1BCQ19CRkJfRmllbGRfU3VibWl0IiwiZ2V0X2RlZmF1bHRzIiwidHlwZSIsImxhYmVsIiwibmFtZSIsImh0bWxfaWQiLCJjc3NjbGFzcyIsImhlbHAiLCJ1c2FnZV9rZXkiLCJyZW5kZXIiLCJlbCIsImRhdGEiLCJjdHgiLCJkIiwibm9ybWFsaXplX2RhdGEiLCJlaCIsInYiLCJXUEJDX0JGQl9TYW5pdGl6ZSIsImVzY2FwZV9odG1sIiwic2lkIiwic2FuaXRpemVfaHRtbF9pZCIsInNuYW1lIiwic2FuaXRpemVfaHRtbF9uYW1lIiwic2NsYXNzIiwic2FuaXRpemVfY3NzX2NsYXNzbGlzdCIsInRydXRoeSIsImlzX3RydXRoeSIsIm9uZV9vZiIsImxpc3QiLCJkZWYiLCJpbmRleE9mIiwiU3RyaW5nIiwibmFtZV92YWwiLCJjc3NfbmV4dCIsImRhdGFzZXQiLCJpZF9hdHRyIiwibmFtZV9hdHRyIiwiY2xzX2F0dHIiLCJoZWxwX2h0bWwiLCJpbm5lckhUTUwiLCJVSSIsIldQQkNfQkZCX092ZXJsYXkiLCJlbnN1cmUiLCJidWlsZGVyIiwib25fZmllbGRfZHJvcCIsImUiLCJyZWdpc3Rlcl9zdWJtaXRfYm9va2luZ19mb3JtX2V4cG9ydGVyIiwiRXhwIiwiV1BCQ19CRkJfRXhwb3J0ZXIiLCJoYXNfZXhwb3J0ZXIiLCJTIiwiZXNjX2h0bWwiLCJ0cmltIiwic2NscyIsImVzY19zYyIsImVzY2FwZV9mb3Jfc2hvcnRjb2RlIiwiZXhwb3J0ZXJfY2FsbGJhY2siLCJmaWVsZCIsImVtaXQiLCJleHRyYXMiLCJkZWZzIiwiT2JqZWN0IiwiYXNzaWduIiwicmF3X2xhYmVsIiwibGVuZ3RoIiwiY2xzX3JhdyIsImNzc2NsYXNzX2V4dHJhIiwiY2xhc3MiLCJjbHNfdmFsIiwidXNlZF9pZHMiLCJ1c2VkSWRzIiwiU2V0IiwidW5pcXVlIiwiaSIsImhhcyIsImFkZCIsImhhc193cmFwcGVyIiwib3BlbiIsImNsb3NlIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsInJlZ2lzdGVyX3N1Ym1pdF9ib29raW5nX2RhdGFfZXhwb3J0ZXIiLCJDIiwiV1BCQ19CRkJfQ29udGVudEV4cG9ydGVyIiwid2luZG93Il0sInNvdXJjZXMiOlsiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZmllbGQtcGFja3Mvc3VibWl0L19zcmMvc3VibWl0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9maWVsZC1wYWNrcy9zdWJtaXQvX291dC9zdWJtaXQuanNcclxuKGZ1bmN0aW9uICggdyApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBDb3JlICAgICA9IHcuV1BCQ19CRkJfQ29yZSB8fCB7fTtcclxuXHR2YXIgcmVnaXN0cnkgPSBDb3JlLldQQkNfQkZCX0ZpZWxkX1JlbmRlcmVyX1JlZ2lzdHJ5O1xyXG5cdHZhciBCYXNlICAgICA9IENvcmUuV1BCQ19CRkJfRmllbGRfQmFzZTtcclxuXHJcblx0aWYgKCAhIHJlZ2lzdHJ5IHx8IHR5cGVvZiByZWdpc3RyeS5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhIEJhc2UgKSB7XHJcblx0XHRfd3BiYz8uZGV2Py5lcnJvcj8uKCAnV1BCQ19CRkJfRmllbGRfU3VibWl0JywgJ0NvcmUgcmVnaXN0cnkvYmFzZSBtaXNzaW5nJyApO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV1BCQyBCRkI6IEZpZWxkIFJlbmRlcmVyIGZvciBcInN1Ym1pdFwiIChTY2hlbWEtZHJpdmVuLCB0ZW1wbGF0ZS1saXRlcmFsIHJlbmRlcilcclxuXHQgKiAtIEluc3BlY3RvciBpcyByZW5kZXJlZCBieSBGYWN0b3J5IChmcm9tIFBIUCBzY2hlbWEpLlxyXG5cdCAqIC0gTm8gd3AudGVtcGxhdGUgdXNhZ2UgZm9yIHByZXZpZXcuXHJcblx0ICovXHJcblx0Y2xhc3MgV1BCQ19CRkJfRmllbGRfU3VibWl0IGV4dGVuZHMgQmFzZSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm4gZGVmYXVsdCBwcm9wcyBmb3IgXCJzdWJtaXRcIiBmaWVsZC5cclxuXHRcdCAqIE11c3Qgc3RheSBpbiBzeW5jIHdpdGggUEhQIHNjaGVtYSBkZWZhdWx0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgZ2V0X2RlZmF1bHRzKCkge1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHR5cGUgICAgICA6ICdzdWJtaXQnLFxyXG5cdFx0XHRcdGxhYmVsICAgICA6ICdTZW5kJyxcclxuXHRcdFx0XHRuYW1lICAgICAgOiAnJyxcclxuXHRcdFx0XHRodG1sX2lkICAgOiAnJyxcclxuXHRcdFx0XHRjc3NjbGFzcyAgOiAnd3BiY19iZmJfX2J0biB3cGJjX2JmYl9fYnRuLS1wcmltYXJ5JyxcclxuXHRcdFx0XHRoZWxwICAgICAgOiAnJyxcclxuXHRcdFx0XHR1c2FnZV9rZXkgOiAnc3VibWl0J1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyIHRoZSBwcmV2aWV3IG1hcmt1cCBpbnRvIHRoZSBmaWVsZCBlbGVtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsICAgRmllbGQgcm9vdCBlbGVtZW50IGluc2lkZSB0aGUgY2FudmFzLlxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9ICAgICAgZGF0YSBGaWVsZCBwcm9wcyAoYWxyZWFkeSBub3JtYWxpemVkIGJ5IHNjaGVtYSkuXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBjdHggIENvbnRleHQ6IHsgYnVpbGRlciwgc2FuaXQsIC4uLiB9XHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHJlbmRlciggZWwsIGRhdGEsIGN0eCApIHtcclxuXHJcblx0XHRcdGlmICggISBlbCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5vcm1hbGl6ZSBhZ2FpbnN0IGRlZmF1bHRzIGZpcnN0LlxyXG5cdFx0XHRjb25zdCBkID0gdGhpcy5ub3JtYWxpemVfZGF0YSggZGF0YSApO1xyXG5cclxuXHRcdFx0Ly8gLS0tLS0gQ29yZSBzYW5pdGl6ZSBoZWxwZXJzIChzdGF0aWMpIC0tLS0tXHJcblx0XHRcdGNvbnN0IGVoICAgICAgPSAoIHYgKSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmVzY2FwZV9odG1sKCB2ICk7XHJcblx0XHRcdGNvbnN0IHNpZCAgICAgPSAoIHYgKSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfaWQoIHYgKTtcclxuXHRcdFx0Y29uc3Qgc25hbWUgICA9ICggdiApID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9uYW1lKCB2ICk7XHJcblx0XHRcdGNvbnN0IHNjbGFzcyAgPSAoIHYgKSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2Nzc19jbGFzc2xpc3QoIHYgKTtcclxuXHRcdFx0Y29uc3QgdHJ1dGh5ICA9ICggdiApID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuaXNfdHJ1dGh5KCB2ICk7XHJcblx0XHRcdGNvbnN0IG9uZV9vZiAgPSAoIHYsIGxpc3QsIGRlZiApID0+ICggbGlzdC5pbmRleE9mKCB2ICkgIT09IC0xID8gdiA6IGRlZiApO1xyXG5cclxuXHRcdFx0Ly8gUHVibGljIGF0dHJpYnV0ZXMuXHJcblx0XHRcdGNvbnN0IGh0bWxfaWQgICAgPSBkLmh0bWxfaWQgPyBzaWQoIFN0cmluZyggZC5odG1sX2lkICkgKSA6ICcnO1xyXG5cdFx0XHRjb25zdCBuYW1lX3ZhbCAgID0gZC5uYW1lID8gc25hbWUoIFN0cmluZyggZC5uYW1lICkgKSA6ICcnO1xyXG5cdFx0XHRjb25zdCBjc3NfbmV4dCAgID0gc2NsYXNzKCBTdHJpbmcoIGQuY3NzY2xhc3MgfHwgJycgKSApO1xyXG5cclxuXHJcblx0XHRcdC8vIFBlcnNpc3QgY29yZS1yZWxhdGVkIHByb3BzIG9uIGRhdGFzZXQgKGRvIG5vdCBtdXRhdGUgd3JhcHBlciBjbGFzc2VzIGRpcmVjdGx5KS5cclxuXHRcdFx0aWYgKCAnY3NzY2xhc3MnIGluIGQgJiYgZWwuZGF0YXNldC5jc3NjbGFzcyAhPT0gY3NzX25leHQgKSB7XHJcblx0XHRcdFx0ZWwuZGF0YXNldC5jc3NjbGFzcyA9IGNzc19uZXh0O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggJ2h0bWxfaWQnIGluIGQgJiYgZWwuZGF0YXNldC5odG1sX2lkICE9PSBodG1sX2lkICkge1xyXG5cdFx0XHRcdGVsLmRhdGFzZXQuaHRtbF9pZCA9IGh0bWxfaWQ7XHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHQvLyBBdHRyaWJ1dGUgZnJhZ21lbnRzLlxyXG5cdFx0XHRjb25zdCBpZF9hdHRyICAgPSBodG1sX2lkID8gYCBpZD1cIiR7ZWgoIGh0bWxfaWQgKX1cImAgOiAnJztcclxuXHRcdFx0Y29uc3QgbmFtZV9hdHRyID0gbmFtZV92YWwgPyBgIG5hbWU9XCIke2VoKCBuYW1lX3ZhbCApfVwiYCA6ICcnO1xyXG5cdFx0XHRjb25zdCBjbHNfYXR0ciAgPSBgIGNsYXNzPVwid3BiY19idXR0b24gd3BiY19idXR0b25fcHJpbWFyeSAke2Nzc19uZXh0ID8gZWgoIGNzc19uZXh0ICkgOiAnJ31cImA7XG5cclxuXHRcdFx0Ly8gT3B0aW9uYWwgaGVscCB0ZXh0IGJlbG93IHRoZSBidXR0b24uXHJcblx0XHRcdGNvbnN0IGhlbHBfaHRtbCA9IGQuaGVscCA/IGA8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2hlbHBcIj4ke2VoKCBkLmhlbHAgKX08L2Rpdj5gIDogJyc7XHJcblxyXG5cdFx0XHQvLyBSZW5kZXIgcHJldmlldyBIVE1MIChubyBhY3Rpb25zOyBwcmV2ZW50IHJlYWwgc3VibWl0IHZpYSB0eXBlPVwiYnV0dG9uXCIpLlxyXG5cdFx0XHRlbC5pbm5lckhUTUwgPSBgXHJcblx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ3cGJjX2JmYl9fbm9hY3Rpb24gd3BiY19iZmJfX25vLWRyYWctem9uZVwiIGluZXJ0PVwiXCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2ZpZWxkLXByZXZpZXdcIj5cclxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIke2Nsc19hdHRyfSR7aWRfYXR0cn0ke25hbWVfYXR0cn0+XHJcblx0XHRcdFx0XHRcdFx0JHtlaCggZC5sYWJlbCB8fCAnU2VuZCcgKX1cclxuXHRcdFx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdCR7aGVscF9odG1sfVxyXG5cdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0YDtcclxuXHJcblx0XHRcdC8vIE92ZXJsYXkgKGhhbmRsZXMvdG9vbGJhcnMpLlxyXG5cdFx0XHRDb3JlLlVJPy5XUEJDX0JGQl9PdmVybGF5Py5lbnN1cmU/LiggY3R4Py5idWlsZGVyLCBlbCApO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9wdGlvbmFsIGhvb2sgZXhlY3V0ZWQgYWZ0ZXIgZmllbGQgaXMgZHJvcHBlZCBmcm9tIHRoZSBwYWxldHRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSAgICAgIGRhdGFcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBjdHhcclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgb25fZmllbGRfZHJvcCggZGF0YSwgZWwsIGN0eCApIHtcclxuXHRcdFx0Ly8gS2VlcCBiYXNlIGJlaGF2aW9yIChhdXRvLW5hbWUgZnJvbSBsYWJlbCwgZXRjLikuXHJcblx0XHRcdHN1cGVyLm9uX2ZpZWxkX2Ryb3A/LiggZGF0YSwgZWwsIGN0eCApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dHJ5IHtcclxuXHRcdHJlZ2lzdHJ5LnJlZ2lzdGVyKCAnc3VibWl0JywgV1BCQ19CRkJfRmllbGRfU3VibWl0ICk7XHJcblx0fSBjYXRjaCAoIGUgKSB7IF93cGJjPy5kZXY/LmVycm9yPy4oICdXUEJDX0JGQl9GaWVsZF9TdWJtaXQucmVnaXN0ZXInLCBlICk7IH1cclxuXHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gRXhwb3J0IGZvciBcIkJvb2tpbmcgRm9ybVwiIChBZHZhbmNlZCBGb3JtIHNob3J0Y29kZSlcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIFJlZ2lzdGVyIEJvb2tpbmcgRm9ybSBleHBvcnRlciBjYWxsYmFjayAoQWR2YW5jZWQgRm9ybSkgZm9yIFwic3VibWl0XCIuXHJcblx0ICpcclxuXHQgKiBUaGlzIGV4cG9ydGVyOlxyXG5cdCAqICAtIEVtaXRzIHRoZSBzaG9ydGNvZGU6XHJcblx0ICogICAgICAgIFtzdWJtaXQgXCJMYWJlbFwiXVxyXG5cdCAqICAgIHdoZXJlIFwiTGFiZWxcIiBkZWZhdWx0cyB0byBcIlNlbmRcIiB3aGVuIGVtcHR5LlxyXG5cdCAqICAtIEJlaGF2aW9yIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMgY2VudHJhbGl6ZWQgZXhwb3J0ZXI6XHJcblx0ICogICAgICDigKIgdXNlcyBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmVzY2FwZV9mb3Jfc2hvcnRjb2RlKCkgd2hlbiBhdmFpbGFibGUsXHJcblx0ICogICAgICDigKIgZG9lcyBub3Qgd3JhcCB0aGUgc2hvcnRjb2RlIGluIGV4dHJhIEhUTUwsXHJcblx0ICogICAgICDigKIgbGVhdmVzIGhlbHAgdGV4dCBoYW5kbGluZyB0byBXUEJDX0JGQl9FeHBvcnRlci5yZW5kZXJfZmllbGRfbm9kZSgpLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHJlZ2lzdGVyX3N1Ym1pdF9ib29raW5nX2Zvcm1fZXhwb3J0ZXIoKSB7XHJcblxyXG5cdFx0dmFyIEV4cCA9IHcuV1BCQ19CRkJfRXhwb3J0ZXI7XHJcblx0XHRpZiAoICEgRXhwIHx8IHR5cGVvZiBFeHAucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfVxyXG5cdFx0aWYgKCB0eXBlb2YgRXhwLmhhc19leHBvcnRlciA9PT0gJ2Z1bmN0aW9uJyAmJiBFeHAuaGFzX2V4cG9ydGVyKCAnc3VibWl0JyApICkgeyByZXR1cm47IH1cclxuXHJcblx0XHR2YXIgUyAgICAgICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplIHx8IHt9O1xyXG5cdFx0dmFyIGVzY19odG1sID0gUy5lc2NhcGVfaHRtbCAgICAgICAgICAgIHx8IGZ1bmN0aW9uKCB2ICl7IHJldHVybiBTdHJpbmcoIHYgKTsgfTtcclxuXHRcdHZhciBzaWQgICAgICA9IFMuc2FuaXRpemVfaHRtbF9pZCAgICAgICB8fCBmdW5jdGlvbiggdiApeyByZXR1cm4gU3RyaW5nKCB2ICkudHJpbSgpOyB9O1xyXG5cdFx0dmFyIHNjbHMgICAgID0gUy5zYW5pdGl6ZV9jc3NfY2xhc3NsaXN0IHx8IGZ1bmN0aW9uKCB2ICl7IHJldHVybiBTdHJpbmcoIHYgKS50cmltKCk7IH07XHJcblx0XHR2YXIgZXNjX3NjICAgPSBTLmVzY2FwZV9mb3Jfc2hvcnRjb2RlICAgfHwgZnVuY3Rpb24oIHYgKXsgcmV0dXJuIFN0cmluZyggdiApOyB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHR5cGUge1dQQkNfQkZCX0V4cG9ydGVyQ2FsbGJhY2t9XHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICAgICAgICAgICAgZmllbGRcclxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKTp2b2lkfSBlbWl0XHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICAgICAgICAgICAgW2V4dHJhc11cclxuXHRcdCAqL1xyXG5cdFx0dmFyIGV4cG9ydGVyX2NhbGxiYWNrID0gZnVuY3Rpb24oIGZpZWxkLCBlbWl0LCBleHRyYXMgKSB7XHJcblx0XHRcdGV4dHJhcyA9IGV4dHJhcyB8fCB7fTtcclxuXHJcblx0XHRcdC8vIE1lcmdlIHdpdGggZGVmYXVsdHMgdG8gZW5zdXJlIGFsbCBwcm9wcyAobGFiZWwsIGh0bWxfaWQsIGNzc2NsYXNzLCDigKYpIGFyZSBwcmVzZW50LlxyXG5cdFx0XHR2YXIgZGVmcyA9IFdQQkNfQkZCX0ZpZWxkX1N1Ym1pdC5nZXRfZGVmYXVsdHMoKTtcclxuXHRcdFx0dmFyIGQgICAgPSBPYmplY3QuYXNzaWduKCB7fSwgZGVmcywgZmllbGQgfHwge30gKTtcclxuXHJcblx0XHRcdC8vIExhYmVsIChzaG9ydGNvZGUgYXJndW1lbnQpLlxyXG5cdFx0XHR2YXIgcmF3X2xhYmVsID0gKCBkICYmIHR5cGVvZiBkLmxhYmVsID09PSAnc3RyaW5nJyAmJiBkLmxhYmVsLmxlbmd0aCApID8gZC5sYWJlbCA6ICdTZW5kJztcclxuXHRcdFx0dmFyIGxhYmVsID0gJ1wiJyArIGVzY19zYyggU3RyaW5nKCByYXdfbGFiZWwgKSApICsgJ1wiJztcclxuXHJcblx0XHRcdC8vIElEIC8gY2xhc3Mgd3JhcHBlciBhcm91bmQgdGhlIHNob3J0Y29kZSAobGF5b3V0LW9ubHksIG5vIGJlaGF2aW9yKS5cclxuXHRcdFx0dmFyIGh0bWxfaWQgPSBkLmh0bWxfaWQgPyBzaWQoIFN0cmluZyggZC5odG1sX2lkICkgKSA6ICcnO1xyXG5cdFx0XHR2YXIgY2xzX3JhdyA9IFN0cmluZyggZC5jc3NjbGFzc19leHRyYSB8fCBkLmNzc2NsYXNzIHx8IGQuY2xhc3MgfHwgJycgKTtcclxuXHRcdFx0dmFyIGNsc192YWwgPSBzY2xzKCBjbHNfcmF3ICk7XHJcblxyXG5cdFx0XHQvLyBFbnN1cmUgdW5pcXVlIGlkIGFjcm9zcyB0aGUgZXhwb3J0IHRyZWUgKHNoYXJlZCBTZXQgZnJvbSB0aGUgZXhwb3J0IGNvbnRleHQpLlxyXG5cdFx0XHR2YXIgdXNlZF9pZHMgPSBleHRyYXMgJiYgZXh0cmFzLmN0eCAmJiBleHRyYXMuY3R4LnVzZWRJZHM7XHJcblx0XHRcdGlmICggaHRtbF9pZCAmJiB1c2VkX2lkcyBpbnN0YW5jZW9mIFNldCApIHtcclxuXHRcdFx0XHR2YXIgdW5pcXVlID0gaHRtbF9pZCwgaSA9IDI7XHJcblx0XHRcdFx0d2hpbGUgKCB1c2VkX2lkcy5oYXMoIHVuaXF1ZSApICkge1xyXG5cdFx0XHRcdFx0dW5pcXVlID0gaHRtbF9pZCArICdfJyArICggaSsrICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHVzZWRfaWRzLmFkZCggdW5pcXVlICk7XHJcblx0XHRcdFx0aHRtbF9pZCA9IHVuaXF1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGlkX2F0dHIgID0gaHRtbF9pZCA/ICcgaWQ9XCInICsgZXNjX2h0bWwoIGh0bWxfaWQgKSArICdcIicgOiAnJztcclxuXHRcdFx0dmFyIGNsc19hdHRyID0gY2xzX3ZhbCA/ICcgY2xhc3M9XCInICsgZXNjX2h0bWwoIGNsc192YWwgKSArICdcIicgOiAnJztcclxuXHJcblx0XHRcdC8vIE9ubHkgd3JhcCBpbiA8c3BhbiAuLi4gc3R5bGU9XCJmbGV4OjE7XCI+IGlmIGlkIG9yIGNsYXNzIGV4aXN0cyAobWF0Y2hlcyBvdGhlciBwYWNrcykuXHJcblx0XHRcdHZhciBoYXNfd3JhcHBlciA9ICEhICggaWRfYXR0ciB8fCBjbHNfYXR0ciApO1xyXG5cdFx0XHR2YXIgb3BlbiAgICAgICAgPSBoYXNfd3JhcHBlciA/ICggJzxzcGFuJyArIGlkX2F0dHIgKyBjbHNfYXR0ciArICcgc3R5bGU9XCJmbGV4OjE7XCI+JyApIDogJyc7XHJcblx0XHRcdHZhciBjbG9zZSAgICAgICA9IGhhc193cmFwcGVyID8gJzwvc3Bhbj4nIDogJyc7XHJcblxyXG5cdFx0XHQvLyBTaG9ydGNvZGUgaXRzZWxmIHJlbWFpbnMgbGVnYWN5LWNvbXBhdGlibGU6IC0gICAgW3N1Ym1pdCBcIlNlbmRcIl0gLy8uXHJcblx0XHRcdGVtaXQoIG9wZW4gKyAnW3N1Ym1pdCAnICsgbGFiZWwgKyAnXScgKyBjbG9zZSApO1xyXG5cdFx0fTtcclxuXHJcblx0XHRFeHAucmVnaXN0ZXIoICdzdWJtaXQnLCBleHBvcnRlcl9jYWxsYmFjayApO1xyXG5cdH1cclxuXHJcblx0aWYgKCB3LldQQkNfQkZCX0V4cG9ydGVyICYmIHR5cGVvZiB3LldQQkNfQkZCX0V4cG9ydGVyLnJlZ2lzdGVyID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0cmVnaXN0ZXJfc3VibWl0X2Jvb2tpbmdfZm9ybV9leHBvcnRlcigpO1xyXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgKSB7XHJcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnd3BiYzpiZmI6ZXhwb3J0ZXItcmVhZHknLCByZWdpc3Rlcl9zdWJtaXRfYm9va2luZ19mb3JtX2V4cG9ydGVyLCB7IG9uY2U6IHRydWUgfSApO1xyXG5cdH1cclxuXHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gRXhwb3J0IGZvciBcIkJvb2tpbmcgRGF0YVwiIChDb250ZW50IG9mIGJvb2tpbmcgZmllbGRzIGRhdGEpXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvKipcclxuXHQgKiBSZWdpc3RlciBCb29raW5nIERhdGEgZXhwb3J0ZXIgY2FsbGJhY2sgKFwiQ29udGVudCBvZiBib29raW5nIGZpZWxkcyBkYXRhXCIpIGZvciBcInN1Ym1pdFwiLlxyXG5cdCAqXHJcblx0ICogU3VibWl0IGlzIGEgY29udHJvbCBlbGVtZW50IGFuZCBkb2VzIG5vdCBjYXJyeSB1c2VyLWVudGVyZWQgdmFsdWVzLFxyXG5cdCAqIHNvIGl0IGlzIGludGVudGlvbmFsbHkgb21pdHRlZCBmcm9tIHRoZSBcIkNvbnRlbnQgb2YgYm9va2luZyBmaWVsZHMgZGF0YVwiIG91dHB1dC5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiByZWdpc3Rlcl9zdWJtaXRfYm9va2luZ19kYXRhX2V4cG9ydGVyKCkge1xyXG5cclxuXHRcdHZhciBDID0gdy5XUEJDX0JGQl9Db250ZW50RXhwb3J0ZXI7XHJcblx0XHRpZiAoICEgQyB8fCB0eXBlb2YgQy5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuOyB9XHJcblx0XHRpZiAoIHR5cGVvZiBDLmhhc19leHBvcnRlciA9PT0gJ2Z1bmN0aW9uJyAmJiBDLmhhc19leHBvcnRlciggJ3N1Ym1pdCcgKSApIHsgcmV0dXJuOyB9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICAgICAgICAgICAgZmllbGRcclxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKTp2b2lkfSBlbWl0XHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICAgICAgICAgICAgW2V4dHJhc11cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHR2YXIgZXhwb3J0ZXJfY2FsbGJhY2sgPSBmdW5jdGlvbiggZmllbGQsIGVtaXQsIGV4dHJhcyApIHtcclxuXHRcdFx0Ly8gSW50ZW50aW9uYWxseSBlbXB0eTogc3VibWl0IGhhcyBubyBkYXRhIHRva2VuL3ZhbHVlLlxyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9O1xyXG5cclxuXHRcdEMucmVnaXN0ZXIoICdzdWJtaXQnLCBleHBvcnRlcl9jYWxsYmFjayApO1xyXG5cdH1cclxuXHJcblx0aWYgKCB3LldQQkNfQkZCX0NvbnRlbnRFeHBvcnRlciAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9Db250ZW50RXhwb3J0ZXIucmVnaXN0ZXIgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRyZWdpc3Rlcl9zdWJtaXRfYm9va2luZ19kYXRhX2V4cG9ydGVyKCk7XHJcblx0fSBlbHNlIGlmICggdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyApIHtcclxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICd3cGJjOmJmYjpjb250ZW50LWV4cG9ydGVyLXJlYWR5JywgcmVnaXN0ZXJfc3VibWl0X2Jvb2tpbmdfZGF0YV9leHBvcnRlciwgeyBvbmNlOiB0cnVlIH0gKTtcclxuXHR9XHJcblxyXG59KSggd2luZG93ICk7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLENBQUMsVUFBV0EsQ0FBQyxFQUFHO0VBQ2YsWUFBWTs7RUFFWixJQUFJQyxJQUFJLEdBQU9ELENBQUMsQ0FBQ0UsYUFBYSxJQUFJLENBQUMsQ0FBQztFQUNwQyxJQUFJQyxRQUFRLEdBQUdGLElBQUksQ0FBQ0csZ0NBQWdDO0VBQ3BELElBQUlDLElBQUksR0FBT0osSUFBSSxDQUFDSyxtQkFBbUI7RUFFdkMsSUFBSyxDQUFFSCxRQUFRLElBQUksT0FBT0EsUUFBUSxDQUFDSSxRQUFRLEtBQUssVUFBVSxJQUFJLENB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 |
| 249 |
|