| 1 |
"use strict";// --------------------------------------------------------------------------------------------------------------------- |
| 2 |
// == File /includes/page-form-builder/_out/core/bfb-core.js == | 2025-09-10 15:47 |
| 3 |
// --------------------------------------------------------------------------------------------------------------------- |
| 4 |
(function(w){'use strict';// Single global namespace (idempotent & load-order safe). |
| 5 |
const Core=w.WPBC_BFB_Core=w.WPBC_BFB_Core||{};const UI=Core.UI=Core.UI||{};/**
|
| 6 |
* Core sanitize/escape/normalize helpers.
|
| 7 |
* All methods use snake_case; camelCase aliases are provided for backwards compatibility.
|
| 8 |
*/Core.WPBC_BFB_Sanitize=class{/**
|
| 9 |
* Escape text for safe use in CSS selectors.
|
| 10 |
* @param {string} s - raw selector fragment
|
| 11 |
* @returns {string}
|
| 12 |
*/static esc_css(s){return w.CSS&&w.CSS.escape?w.CSS.escape(String(s)):String(s).replace(/([^\w-])/g,'\\$1');}/**
|
| 13 |
* Escape a value for attribute selectors, e.g. [data-id="<value>"].
|
| 14 |
* @param {string} v
|
| 15 |
* @returns {string}
|
| 16 |
*/static esc_attr_value_for_selector(v){return String(v).replace(/\\/g,'\\\\').replace(/"/g,'\\"').replace(/\n/g,'\\A ').replace(/\]/g,'\\]');}/**
|
| 17 |
* Sanitize into a broadly compatible HTML id: letters, digits, - _ : . ; must start with a letter.
|
| 18 |
* @param {string} v
|
| 19 |
* @returns {string}
|
| 20 |
*/static sanitize_html_id(v){let s=(v==null?'':String(v)).trim();s=s.replace(/\s+/g,'-').replace(/[^A-Za-z0-9\-_\:.]/g,'-').replace(/-+/g,'-').replace(/^[-_.:]+|[-_.:]+$/g,'');if(!s)return'field';if(!/^[A-Za-z]/.test(s))s='f-'+s;return s;}/**
|
| 21 |
* Sanitize into a safe HTML name token: letters, digits, _ -
|
| 22 |
* Must start with a letter; no dots/brackets/spaces.
|
| 23 |
* @param {string} v
|
| 24 |
* @returns {string}
|
| 25 |
*/static sanitize_html_name(v){let s=(v==null?'':String(v)).trim();s=s.replace(/\s+/g,'_').replace(/[^A-Za-z0-9_-]/g,'_').replace(/_+/g,'_');if(!s){s='field';}if(!/^[A-Za-z]/.test(s)){s='f_'+s;}return s;}/**
|
| 26 |
* Escape for HTML text/attributes (not URLs).
|
| 27 |
* @param {any} v
|
| 28 |
* @returns {string}
|
| 29 |
*/static escape_html(v){if(v==null){return'';}return String(v).replace(/&/g,'&').replace(/"/g,'"').replace(/'/g,''').replace(/</g,'<').replace(/>/g,'>');}/**
|
| 30 |
* Escape minimal set for attribute-safety without slugging.
|
| 31 |
* Keeps original human text; escapes &, <, >, " and ' only.
|
| 32 |
* @param {string} s
|
| 33 |
* @returns {string}
|
| 34 |
*/static escape_value_for_attr(s){return String(s==null?'':s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''');}/**
|
| 35 |
* Sanitize a space-separated CSS class list.
|
| 36 |
* @param {any} v
|
| 37 |
* @returns {string}
|
| 38 |
*/static sanitize_css_classlist(v){if(v==null)return'';return String(v).replace(/[^\w\- ]+/g,' ').replace(/\s+/g,' ').trim();}// == NEW == |
| 39 |
/**
|
| 40 |
* Turn an arbitrary value into a conservative "token" (underscores, hyphens allowed).
|
| 41 |
* Useful for shortcode tokens, ids in plain text, etc.
|
| 42 |
* @param {any} v
|
| 43 |
* @returns {string}
|
| 44 |
*/static to_token(v){return String(v??'').trim().replace(/\s+/g,'_').replace(/[^A-Za-z0-9_\-]/g,'');}/**
|
| 45 |
* Convert to kebab-case (letters, digits, hyphens).
|
| 46 |
* @param {any} v
|
| 47 |
* @returns {string}
|
| 48 |
*/static to_kebab(v){return String(v??'').trim().replace(/[_\s]+/g,'-').replace(/[^A-Za-z0-9-]/g,'').replace(/-+/g,'-').toLowerCase();}/**
|
| 49 |
* Truthy normalization for form-like inputs: true, 'true', 1, '1', 'yes', 'on'.
|
| 50 |
* @param {any} v
|
| 51 |
* @returns {boolean}
|
| 52 |
*/static is_truthy(v){if(typeof v==='boolean')return v;const s=String(v??'').trim().toLowerCase();return s==='true'||s==='1'||s==='yes'||s==='on';}/**
|
| 53 |
* Coerce to boolean with an optional default for empty values.
|
| 54 |
* @param {any} v
|
| 55 |
* @param {boolean} [def=false]
|
| 56 |
* @returns {boolean}
|
| 57 |
*/static coerce_boolean(v,def=false){if(v==null||v==='')return def;return this.is_truthy(v);}/**
|
| 58 |
* Parse a "percent-like" value ('33'|'33%'|33) with fallback.
|
| 59 |
* @param {string|number|null|undefined} v
|
| 60 |
* @param {number} fallback_value
|
| 61 |
* @returns {number}
|
| 62 |
*/static parse_percent(v,fallback_value){if(v==null){return fallback_value;}const s=String(v).trim();const n=parseFloat(s.replace(/%/g,''));return Number.isFinite(n)?n:fallback_value;}/**
|
| 63 |
* Clamp a number to the [min, max] range.
|
| 64 |
* @param {number} n
|
| 65 |
* @param {number} min
|
| 66 |
* @param {number} max
|
| 67 |
* @returns {number}
|
| 68 |
*/static clamp(n,min,max){return Math.max(min,Math.min(max,n));}/**
|
| 69 |
* Escape a value for inclusion inside a quoted HTML attribute (double quotes).
|
| 70 |
* Replaces newlines with spaces and double quotes with single quotes.
|
| 71 |
* @param {any} v
|
| 72 |
* @returns {string}
|
| 73 |
*/static escape_for_attr_quoted(v){if(v==null)return'';return String(v).replace(/\r?\n/g,' ').replace(/"/g,'\'');}/**
|
| 74 |
* Escape for shortcode-like tokens where double quotes and newlines should be neutralized.
|
| 75 |
* @param {any} v
|
| 76 |
* @returns {string}
|
| 77 |
*/static escape_for_shortcode(v){return String(v??'').replace(/"/g,'\\"').replace(/\r?\n/g,' ');}/**
|
| 78 |
* JSON.parse with fallback (no throw).
|
| 79 |
* @param {string} s
|
| 80 |
* @param {any} [fallback=null]
|
| 81 |
* @returns {any}
|
| 82 |
*/static safe_json_parse(s,fallback=null){try{return JSON.parse(s);}catch(_){return fallback;}}/**
|
| 83 |
* Stringify data-* attribute value safely (objects -> JSON, others -> String).
|
| 84 |
* @param {any} v
|
| 85 |
* @returns {string}
|
| 86 |
*/static stringify_data_value(v){if(typeof v==='object'&&v!==null){try{return JSON.stringify(v);}catch{console.error('WPBC: stringify_data_value');return'';}}return String(v);}// ------------------------------------------------------------------------------------------------------------- |
| 87 |
// Strict value guards for CSS lengths and hex colors (defense-in-depth). |
| 88 |
// ------------------------------------------------------------------------------------------------------------- |
| 89 |
/**
|
| 90 |
* Sanitize a CSS length. Allows: px, %, rem, em (lower/upper).
|
| 91 |
* Returns fallback if invalid.
|
| 92 |
* @param {any} v
|
| 93 |
* @param {string} [fallback='100%']
|
| 94 |
* @returns {string}
|
| 95 |
*/static sanitize_css_len(v,fallback='100%'){const s=String(v??'').trim();const m=s.match(/^(-?\d+(?:\.\d+)?)(px|%|rem|em)$/i);return m?m[0]:String(fallback);}/**
|
| 96 |
* Sanitize a hex color. Allows #rgb or #rrggbb (case-insensitive).
|
| 97 |
* Returns fallback if invalid.
|
| 98 |
* @param {any} v
|
| 99 |
* @param {string} [fallback='#e0e0e0']
|
| 100 |
* @returns {string}
|
| 101 |
*/static sanitize_hex_color(v,fallback='#e0e0e0'){const s=String(v??'').trim();return /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.test(s)?s:String(fallback);}};/**
|
| 102 |
* WPBC ID / Name service. Generates, sanitizes, and ensures uniqueness for field ids/names/html_ids within the
|
| 103 |
* canvas.
|
| 104 |
*/Core.WPBC_BFB_IdService=class{/**
|
| 105 |
* Constructor. Set root container of the form pages.
|
| 106 |
*
|
| 107 |
* @param {HTMLElement} pages_container - Root container of the form pages.
|
| 108 |
*/constructor(pages_container){this.pages_container=pages_container;}/**
|
| 109 |
* Ensure a unique **internal** field id (stored in data-id) within the canvas.
|
| 110 |
* Starts from a desired id (already sanitized or not) and appends suffixes if needed.
|
| 111 |
*
|
| 112 |
* @param {string} baseId - Desired id.
|
| 113 |
* @returns {string} Unique id.
|
| 114 |
*/ensure_unique_field_id(baseId,currentEl=null){const base=Core.WPBC_BFB_Sanitize.sanitize_html_id(baseId);let id=base||'field';const esc=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);const escUid=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);const notSelf=currentEl?.dataset?.uid?`:not([data-uid="${escUid(currentEl.dataset.uid)}"])`:'';while(this.pages_container?.querySelector(`.wpbc_bfb__panel--preview .wpbc_bfb__field${notSelf}[data-id="${esc(id)}"], .wpbc_bfb__panel--preview .wpbc_bfb__section${notSelf}[data-id="${esc(id)}"]`)){// Excludes self by data-uid . |
| 115 |
const found=this.pages_container.querySelector(`.wpbc_bfb__panel--preview .wpbc_bfb__field[data-id="${esc(id)}"], .wpbc_bfb__panel--preview .wpbc_bfb__section[data-id="${esc(id)}"]`);if(found&¤tEl&&found===currentEl){break;}id=`${base||'field'}-${Math.random().toString(36).slice(2,5)}`;}return id;}/**
|
| 116 |
* Ensure a unique HTML name across the form.
|
| 117 |
*
|
| 118 |
* @param {string} base - Desired base name (un/sanitized).
|
| 119 |
* @param {HTMLElement|null} currentEl - If provided, ignore conflicts with this element.
|
| 120 |
* @returns {string} Unique name.
|
| 121 |
*/ensure_unique_field_name(base,currentEl=null){let name=base||'field';const esc=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);const escUid=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);// Exclude the current field *and any DOM mirrors of it* (same data-uid) |
| 122 |
const uid=currentEl?.dataset?.uid;const notSelf=uid?`:not([data-uid="${escUid(uid)}"])`:'';while(true){const selector=`.wpbc_bfb__panel--preview .wpbc_bfb__field${notSelf}[data-name="${esc(name)}"]`;const clashes=this.pages_container?.querySelectorAll(selector)||[];if(clashes.length===0)break;// nobody else uses this name |
| 123 |
const m=name.match(/-(\d+)$/);name=m?name.replace(/-\d+$/,'-'+(Number(m[1])+1)):`${base}-2`;}return name;}/**
|
| 124 |
* Set field's INTERNAL id (data-id) on an element. Ensures uniqueness and optionally asks caller to refresh
|
| 125 |
* preview.
|
| 126 |
*
|
| 127 |
* @param {HTMLElement} field_el - Field element in the canvas.
|
| 128 |
* @param {string} newIdRaw - Desired id (un/sanitized).
|
| 129 |
* @param {boolean} [renderPreview=false] - Caller can decide to re-render preview.
|
| 130 |
* @returns {string} Applied unique id.
|
| 131 |
*/set_field_id(field_el,newIdRaw,renderPreview=false){const desired=Core.WPBC_BFB_Sanitize.sanitize_html_id(newIdRaw);const unique=this.ensure_unique_field_id(desired,field_el);field_el.setAttribute('data-id',unique);if(renderPreview){// Caller decides if / when to render. |
| 132 |
}return unique;}/**
|
| 133 |
* Set field's REQUIRED HTML name (data-name). Ensures sanitized + unique per form.
|
| 134 |
* Falls back to sanitized internal id if user provides empty value.
|
| 135 |
*
|
| 136 |
* @param {HTMLElement} field_el - Field element in the canvas.
|
| 137 |
* @param {string} newNameRaw - Desired name (un/sanitized).
|
| 138 |
* @param {boolean} [renderPreview=false] - Caller can decide to re-render preview.
|
| 139 |
* @returns {string} Applied unique name.
|
| 140 |
*/set_field_name(field_el,newNameRaw,renderPreview=false){const raw=(newNameRaw==null?'':String(newNameRaw)).trim();const base=raw?Core.WPBC_BFB_Sanitize.sanitize_html_name(raw):Core.WPBC_BFB_Sanitize.sanitize_html_name(field_el.getAttribute('data-id')||'field');const unique=this.ensure_unique_field_name(base,field_el);field_el.setAttribute('data-name',unique);if(renderPreview){// Caller decides if / when to render. |
| 141 |
}return unique;}/**
|
| 142 |
* Set field's OPTIONAL public HTML id (data-html_id). Empty value removes the attribute.
|
| 143 |
* Ensures sanitization + uniqueness among other declared HTML ids.
|
| 144 |
*
|
| 145 |
* @param {HTMLElement} field_el - Field element in the canvas.
|
| 146 |
* @param {string} newHtmlIdRaw - Desired html_id (optional).
|
| 147 |
* @param {boolean} [renderPreview=false] - Caller can decide to re-render preview.
|
| 148 |
* @returns {string} The applied html_id or empty string if removed.
|
| 149 |
*/set_field_html_id(field_el,newHtmlIdRaw,renderPreview=false){const raw=(newHtmlIdRaw==null?'':String(newHtmlIdRaw)).trim();if(raw===''){field_el.removeAttribute('data-html_id');if(renderPreview){// Caller decides if / when to render. |
| 150 |
}return'';}const desired=Core.WPBC_BFB_Sanitize.sanitize_html_id(raw);let htmlId=desired;const esc=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);const escUid=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);while(true){const uid=field_el?.dataset?.uid;const notSelf=uid?`:not([data-uid="${escUid(uid)}"])`:'';const clashInCanvas=this.pages_container?.querySelector(`.wpbc_bfb__panel--preview .wpbc_bfb__field${notSelf}[data-html_id="${esc(htmlId)}"],`+`.wpbc_bfb__panel--preview .wpbc_bfb__section${notSelf}[data-html_id="${esc(htmlId)}"]`);const domClash=document.getElementById(htmlId);// Allow when the only "clash" is inside this same field (e.g., the input you just rendered) |
| 151 |
const domClashIsSelf=domClash===field_el||domClash&&field_el.contains(domClash);if(!clashInCanvas&&(!domClash||domClashIsSelf)){break;}const m=htmlId.match(/-(\d+)$/);htmlId=m?htmlId.replace(/-\d+$/,'-'+(Number(m[1])+1)):`${desired}-2`;}field_el.setAttribute('data-html_id',htmlId);if(renderPreview){// Caller decides if / when to render. |
| 152 |
}return htmlId;}};/**
|
| 153 |
* WPBC Layout service. Encapsulates column width math with gap handling, presets, and utilities.
|
| 154 |
*/Core.WPBC_BFB_LayoutService=class{/**
|
| 155 |
* Constructor. Set options with gap between columns (%).
|
| 156 |
*
|
| 157 |
* @param {{ col_gap_percent?: number }} [opts] - Options with gap between columns (%).
|
| 158 |
*/constructor(opts={}){this.col_gap_percent=Number.isFinite(+opts.col_gap_percent)?+opts.col_gap_percent:3;}/**
|
| 159 |
* Compute normalized flex-basis values for a row, respecting column gaps.
|
| 160 |
* Returns bases that sum to available = 100 - (n-1)*gap.
|
| 161 |
*
|
| 162 |
* @param {HTMLElement} row_el - Row element containing .wpbc_bfb__column children.
|
| 163 |
* @param {number} [gap_percent=this.col_gap_percent] - Gap percent between columns.
|
| 164 |
* @returns {{available:number,bases:number[]}} Available space and basis values.
|
| 165 |
*/compute_effective_bases_from_row(row_el,gap_percent=this.col_gap_percent){const cols=Array.from(row_el?.querySelectorAll(':scope > .wpbc_bfb__column')||[]);const n=cols.length||1;const raw=cols.map(col=>{const w=col.style.flexBasis||'';const p=Core.WPBC_BFB_Sanitize.parse_percent(w,NaN);return Number.isFinite(p)?p:100/n;});const sum_raw=raw.reduce((a,b)=>a+b,0)||100;const gp=Number.isFinite(+gap_percent)?+gap_percent:3;const total_gaps=Math.max(0,n-1)*gp;const available=Math.max(0,100-total_gaps);const scale=available/sum_raw;return{available,bases:raw.map(p=>Math.max(0,p*scale))};}/**
|
| 166 |
* Apply computed bases to the row's columns (sets flex-basis %).
|
| 167 |
*
|
| 168 |
* @param {HTMLElement} row_el - Row element.
|
| 169 |
* @param {number[]} bases - Array of basis values (percent of full 100).
|
| 170 |
* @returns {void}
|
| 171 |
*/apply_bases_to_row(row_el,bases){const cols=Array.from(row_el?.querySelectorAll(':scope > .wpbc_bfb__column')||[]);cols.forEach((col,i)=>{const p=bases[i]??0;col.style.flexBasis=`${p}%`;});}/**
|
| 172 |
* Distribute columns evenly, respecting gap.
|
| 173 |
*
|
| 174 |
* @param {HTMLElement} row_el - Row element.
|
| 175 |
* @param {number} [gap_percent=this.col_gap_percent] - Gap percent.
|
| 176 |
* @returns {void}
|
| 177 |
*/set_equal_bases(row_el,gap_percent=this.col_gap_percent){const cols=Array.from(row_el?.querySelectorAll(':scope > .wpbc_bfb__column')||[]);const n=cols.length||1;const gp=Number.isFinite(+gap_percent)?+gap_percent:3;const total_gaps=Math.max(0,n-1)*gp;const available=Math.max(0,100-total_gaps);const each=available/n;this.apply_bases_to_row(row_el,Array(n).fill(each));}/**
|
| 178 |
* Apply a preset of relative weights to a row/section.
|
| 179 |
*
|
| 180 |
* @param {HTMLElement} sectionOrRow - .wpbc_bfb__section or its child .wpbc_bfb__row.
|
| 181 |
* @param {number[]} weights - Relative weights (e.g., [1,3,1]).
|
| 182 |
* @param {number} [gap_percent=this.col_gap_percent] - Gap percent.
|
| 183 |
* @returns {void}
|
| 184 |
*/apply_layout_preset(sectionOrRow,weights,gap_percent=this.col_gap_percent){const row=sectionOrRow?.classList?.contains('wpbc_bfb__row')?sectionOrRow:sectionOrRow?.querySelector(':scope > .wpbc_bfb__row');if(!row){return;}const cols=Array.from(row.querySelectorAll(':scope > .wpbc_bfb__column')||[]);const n=cols.length||1;if(!Array.isArray(weights)||weights.length!==n){this.set_equal_bases(row,gap_percent);return;}const sum=weights.reduce((a,b)=>a+Math.max(0,Number(b)||0),0)||1;const gp=Number.isFinite(+gap_percent)?+gap_percent:3;const available=Math.max(0,100-Math.max(0,n-1)*gp);const bases=weights.map(w=>Math.max(0,(Number(w)||0)/sum*available));this.apply_bases_to_row(row,bases);}/**
|
| 185 |
* Build preset weight lists for a given column count.
|
| 186 |
*
|
| 187 |
* @param {number} n - Column count.
|
| 188 |
* @returns {number[][]} List of weight arrays.
|
| 189 |
*/build_presets_for_columns(n){switch(n){case 1:return[[1]];case 2:return[[1,2],[2,1],[1,3],[3,1]];case 3:return[[1,3,1],[1,2,1],[2,1,1],[1,1,2]];case 4:return[[1,2,2,1],[2,1,1,1],[1,1,1,2]];default:return[Array(n).fill(1)];}}/**
|
| 190 |
* Format a human-readable label like "50%/25%/25%" from weights.
|
| 191 |
*
|
| 192 |
* @param {number[]} weights - Weight list.
|
| 193 |
* @returns {string} Label string.
|
| 194 |
*/format_preset_label(weights){const sum=weights.reduce((a,b)=>a+(Number(b)||0),0)||1;return weights.map(w=>Math.round((Number(w)||0)/sum*100)).join('%/')+'%';}/**
|
| 195 |
* Parse comma/space separated weights into numbers.
|
| 196 |
*
|
| 197 |
* @param {string} input - User input like "20,60,20".
|
| 198 |
* @returns {number[]} Parsed weights.
|
| 199 |
*/parse_weights(input){if(!input){return[];}return String(input).replace(/[^\d,.\s]/g,'').split(/[\s,]+/).map(s=>parseFloat(s)).filter(n=>Number.isFinite(n)&&n>=0);}};/**
|
| 200 |
* WPBC Usage Limit service.
|
| 201 |
* Counts field usage by key, compares to palette limits, and updates palette UI.
|
| 202 |
*/Core.WPBC_BFB_UsageLimitService=class{/**
|
| 203 |
* Constructor. Set pages_container and palette_ul.
|
| 204 |
*
|
| 205 |
* @param {HTMLElement} pages_container - Canvas root that holds placed fields.
|
| 206 |
* @param {HTMLElement[]|null} palette_uls?: Palettes UL with .wpbc_bfb__field items (may be null).
|
| 207 |
*/constructor(pages_container,palette_uls){this.pages_container=pages_container;// Normalize to an array; we’ll still be robust if none provided. |
| 208 |
this.palette_uls=Array.isArray(palette_uls)?palette_uls:palette_uls?[palette_uls]:[];}/**
|
| 209 |
* Parse usage limit from raw dataset value. Missing/invalid -> Infinity.
|
| 210 |
*
|
| 211 |
* @param {string|number|null|undefined} raw - Raw attribute value.
|
| 212 |
* @returns {number} Limit number or Infinity.
|
| 213 |
*/static parse_usage_limit(raw){if(raw==null){return Infinity;}const n=parseInt(raw,10);return Number.isFinite(n)?n:Infinity;}/**
|
| 214 |
* Count how many instances exist per usage_key in the canvas.
|
| 215 |
*
|
| 216 |
* @returns {Record<string, number>} Map of usage_key -> count.
|
| 217 |
*/count_usage_by_key(){const used={};const all=this.pages_container?.querySelectorAll('.wpbc_bfb__panel--preview .wpbc_bfb__field:not(.is-invalid)')||[];all.forEach(el=>{const key=el.dataset.usage_key||el.dataset.type||el.dataset.id;if(!key){return;}used[key]=(used[key]||0)+1;});return used;}/**
|
| 218 |
* Return palette limit for a given usage key (id of the palette item).
|
| 219 |
*
|
| 220 |
* @param {string} key - Usage key.
|
| 221 |
* @returns {number} Limit value or Infinity.
|
| 222 |
*/get_limit_for_key(key){if(!key){return Infinity;}// Query across all palettes present now (stored + any newly added in DOM). |
| 223 |
const roots=this.palette_uls?.length?this.palette_uls:document.querySelectorAll('.wpbc_bfb__panel_field_types__ul');const allPaletteFields=Array.from(roots).flatMap(r=>Array.from(r.querySelectorAll('.wpbc_bfb__field')));let limit=Infinity;allPaletteFields.forEach(el=>{const usage_key=el.dataset.usage_key||el.dataset.id;if(el.dataset.id===key||usage_key===key){const n=Core.WPBC_BFB_UsageLimitService.parse_usage_limit(el.dataset.usagenumber);// Choose the smallest finite limit (safest if palettes disagree). |
| 224 |
if(n<limit){limit=n;}}});return limit;}/**
|
| 225 |
* Disable/enable palette items based on current usage counts and limits.
|
| 226 |
*
|
| 227 |
* @returns {void}
|
| 228 |
*/update_palette_ui(){// Always compute usage from the canvas: |
| 229 |
const usage=this.count_usage_by_key();// Update all palettes currently in DOM (not just the initially captured ones) |
| 230 |
const palettes=document.querySelectorAll('.wpbc_bfb__panel_field_types__ul');palettes.forEach(pal=>{pal.querySelectorAll('.wpbc_bfb__field').forEach(panel_field=>{const paletteId=panel_field.dataset.id;const usageKey=panel_field.dataset.usage_key||paletteId;const raw_limit=panel_field.dataset.usagenumber;const perElLimit=Core.WPBC_BFB_UsageLimitService.parse_usage_limit(raw_limit);// Effective limit across all palettes is the global limit for this key. |
| 231 |
const globalLimit=this.get_limit_for_key(usageKey);const limit=Number.isFinite(globalLimit)?globalLimit:perElLimit;// prefer global min |
| 232 |
const current=usage[usageKey]||0;const disable=Number.isFinite(limit)&¤t>=limit;panel_field.style.pointerEvents=disable?'none':'';panel_field.style.opacity=disable?'0.4':'';panel_field.setAttribute('aria-disabled',disable?'true':'false');if(disable){panel_field.setAttribute('tabindex','-1');}else{panel_field.removeAttribute('tabindex');}});});}/**
|
| 233 |
* Return how many valid instances with this usage key exist in the canvas.
|
| 234 |
*
|
| 235 |
* @param {string} key - Usage key of a palette item.
|
| 236 |
* @returns {number} Count of existing non-invalid instances.
|
| 237 |
*/count_for_key(key){if(!key){return 0;}return(this.pages_container?.querySelectorAll(`.wpbc_bfb__panel--preview .wpbc_bfb__field[data-usage_key="${Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(key)}"]:not(.is-invalid), |
| 238 |
.wpbc_bfb__panel--preview .wpbc_bfb__field[data-type="${Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(key)}"]:not(.is-invalid)`)||[]).length;}/**
|
| 239 |
* Alias for limit lookup (readability).
|
| 240 |
*
|
| 241 |
* @param {string} key - Usage key of a palette item.
|
| 242 |
* @returns {number} Limit value or Infinity.
|
| 243 |
*/limit_for_key(key){return this.get_limit_for_key(key);}/**
|
| 244 |
* Remaining slots for this key (Infinity if unlimited).
|
| 245 |
*
|
| 246 |
* @param {string} key - Usage key of a palette item.
|
| 247 |
* @returns {number} Remaining count (>= 0) or Infinity.
|
| 248 |
*/remaining_for_key(key){const limit=this.limit_for_key(key);if(limit===Infinity){return Infinity;}const used=this.count_for_key(key);return Math.max(0,limit-used);}/**
|
| 249 |
* True if you can add `delta` more items for this key.
|
| 250 |
*
|
| 251 |
* @param {string} key - Usage key of a palette item.
|
| 252 |
* @param {number} [delta=1] - How many items you intend to add.
|
| 253 |
* @returns {boolean} Whether adding is allowed.
|
| 254 |
*/can_add(key,delta=1){const rem=this.remaining_for_key(key);return rem===Infinity?true:rem>=delta;}/**
|
| 255 |
* UI-facing gate: alert when exceeded. Returns boolean allowed/blocked.
|
| 256 |
*
|
| 257 |
* @param {string} key - Usage key of a palette item.
|
| 258 |
* @param {{label?: string, delta?: number}} [opts={}] - Optional UI info.
|
| 259 |
* @returns {boolean} True if allowed, false if blocked.
|
| 260 |
*/gate_or_alert(key,{label=key,delta=1}={}){if(this.can_add(key,delta)){return true;}const limit=this.limit_for_key(key);alert(`Only ${limit} instance${limit>1?'s':''} of "${label}" allowed.`);return false;}/**
|
| 261 |
* Backward-compatible alias used elsewhere in the codebase. - Check whether another instance with the given
|
| 262 |
* usage key can be added.
|
| 263 |
*
|
| 264 |
* @param {string} key - Usage key of a palette item.
|
| 265 |
* @returns {boolean} Whether adding one more is allowed.
|
| 266 |
*/is_usage_ok(key){return this.can_add(key,1);}};/**
|
| 267 |
* Constant event names for the builder.
|
| 268 |
*/Core.WPBC_BFB_Events=Object.freeze({SELECT:'wpbc:bfb:select',CLEAR_SELECTION:'wpbc:bfb:clear-selection',FIELD_ADD:'wpbc:bfb:field:add',FIELD_REMOVE:'wpbc:bfb:field:remove',STRUCTURE_CHANGE:'wpbc:bfb:structure:change',STRUCTURE_LOADED:'wpbc:bfb:structure:loaded'});/**
|
| 269 |
* Lightweight event bus that emits to both the pages container and document.
|
| 270 |
*/Core.WPBC_BFB_EventBus=class{/**
|
| 271 |
* @param {HTMLElement} scope_el - Element to dispatch bubbled events from.
|
| 272 |
*/constructor(scope_el){this.scope_el=scope_el;}/**
|
| 273 |
* Emit a DOM CustomEvent with payload.
|
| 274 |
*
|
| 275 |
* @param {string} type - Event type (use Core.WPBC_BFB_Events. when possible).
|
| 276 |
* @param {Object} [detail={}] - Arbitrary serializable payload.
|
| 277 |
* @returns {void}
|
| 278 |
*/emit(type,detail={}){if(!this.scope_el){return;}this.scope_el.dispatchEvent(new CustomEvent(type,{detail:{...detail},bubbles:true}));}/**
|
| 279 |
* Subscribe to an event on document.
|
| 280 |
*
|
| 281 |
* @param {string} type - Event type.
|
| 282 |
* @param {(ev:CustomEvent)=>void} handler - Handler function.
|
| 283 |
* @returns {void}
|
| 284 |
*/on(type,handler){document.addEventListener(type,handler);}/**
|
| 285 |
* Unsubscribe from an event on document.
|
| 286 |
*
|
| 287 |
* @param {string} type - Event type.
|
| 288 |
* @param {(ev:CustomEvent)=>void} handler - Handler function.
|
| 289 |
* @returns {void}
|
| 290 |
*/off(type,handler){document.removeEventListener(type,handler);}};/**
|
| 291 |
* SortableJS manager: single point for consistent DnD config.
|
| 292 |
*/Core.WPBC_BFB_SortableManager=class{/**
|
| 293 |
* @param {WPBC_Form_Builder} builder - The active builder instance.
|
| 294 |
* @param {{ groupName?: string, animation?: number, ghostClass?: string, chosenClass?: string, dragClass?:
|
| 295 |
* string }} [opts={}] - Visual/behavior options.
|
| 296 |
*/constructor(builder,opts={}){this.builder=builder;const gid=this.builder?.instance_id||Math.random().toString(36).slice(2,8);this.opts={// groupName : 'form', |
| 297 |
groupName:`form-${gid}`,animation:150,ghostClass:'wpbc_bfb__drag-ghost',chosenClass:'wpbc_bfb__highlight',dragClass:'wpbc_bfb__drag-active',...opts};/** @type {Set<HTMLElement>} */this._containers=new Set();/**
|
| 298 |
* Guard against lost mouseup / pointerup events.
|
| 299 |
*
|
| 300 |
* @type {boolean}
|
| 301 |
*/this._drag_fail_safe_bound=false;this._bind_drag_fail_safe();}/**
|
| 302 |
* Cleanup drag UI state.
|
| 303 |
*
|
| 304 |
* This is a defensive cleanup for cases when Chrome or a browser extension
|
| 305 |
* loses the final mouseup / pointerup event during fallback dragging.
|
| 306 |
*
|
| 307 |
* @returns {void}
|
| 308 |
*/_cleanup_drag_ui(){this._dragState=null;this._toggle_dnd_root_flags(false);this.builder?._remove_dragging_class?.();// Remove only fallback mirrors. Do not touch real dragged elements. |
| 309 |
document.querySelectorAll('.sortable-fallback[data-drag-role], .wpbc_bfb__simple_list_fallback').forEach(el=>{if(el.parentNode){el.parentNode.removeChild(el);}});}/**
|
| 310 |
* Bind global fail-safe listeners for drag cleanup.
|
| 311 |
*
|
| 312 |
* @returns {void}
|
| 313 |
*/_bind_drag_fail_safe(){if(this._drag_fail_safe_bound){return;}this._drag_fail_safe_bound=true;const finish_drag=()=>{window.requestAnimationFrame(()=>{this._cleanup_drag_ui();});};['mouseup','pointerup','touchend','dragend'].forEach(evt_name=>{document.addEventListener(evt_name,finish_drag,true);});window.addEventListener('blur',finish_drag,true);document.addEventListener('visibilitychange',()=>{if(document.hidden){finish_drag();}},true);}/**
|
| 314 |
* Tag the drag mirror (element under cursor) with role: 'palette' | 'canvas'.
|
| 315 |
* Works with Sortable's fallback mirror (.sortable-fallback / .sortable-drag) and with your dragClass
|
| 316 |
* (.wpbc_bfb__drag-active).
|
| 317 |
*/_tag_drag_mirror(evt){const fromPalette=this.builder?.palette_uls?.includes?.(evt.from);const role=fromPalette?'palette':'canvas';// Wait a tick so the mirror exists. - The window.requestAnimationFrame() method tells the browser you wish to perform an animation. |
| 318 |
requestAnimationFrame(()=>{const mirror=document.querySelector('.sortable-fallback, .sortable-drag, .'+this.opts.dragClass);if(mirror){mirror.setAttribute('data-drag-role',role);}});}_toggle_dnd_root_flags(active,from_palette=false){// set to root element of an HTML document, which is the <html>. |
| 319 |
const root=document.documentElement;if(active){root.classList.add('wpbc_bfb__dnd-active');if(from_palette){root.classList.add('wpbc_bfb__drag-from-palette');}}else{root.classList.remove('wpbc_bfb__dnd-active','wpbc_bfb__drag-from-palette');}}/**
|
| 320 |
* Ensure a simple vertical sortable list.
|
| 321 |
*
|
| 322 |
* This configuration is intended for inspector/sidebar lists such as:
|
| 323 |
* - dropdown choices
|
| 324 |
* - radio options
|
| 325 |
* - checkbox options
|
| 326 |
*
|
| 327 |
* It is intentionally much simpler than the canvas DnD config and does not
|
| 328 |
* use the column edge-fence / sticky-target logic.
|
| 329 |
*
|
| 330 |
* @param {HTMLElement} container - Sortable list container.
|
| 331 |
* @param {{ handle_selector?: string, draggable_selector?: string, onUpdate?: Function }} [handlers={}] -
|
| 332 |
* Optional handlers/selectors.
|
| 333 |
* @returns {void}
|
| 334 |
*/ensure_simple_list(container,handlers={}){if(!container||typeof Sortable==='undefined'){return;}if(Sortable.get?.(container)){return;}const common={animation:this.opts.animation,ghostClass:this.opts.ghostClass,chosenClass:this.opts.chosenClass,dragClass:this.opts.dragClass,forceFallback:true,// For a single scrollable sidebar list this is usually more stable. |
| 335 |
fallbackOnBody:false,fallbackTolerance:8,removeCloneOnHide:true,onStart:()=>{this.builder?._add_dragging_class?.();this._toggle_dnd_root_flags(true,false);},onEnd:()=>{setTimeout(()=>{this.builder?._remove_dragging_class?.();},50);this._toggle_dnd_root_flags(false);this._dragState=null;this._cleanup_drag_ui();}};Sortable.create(container,{...common,group:{name:this.opts.groupName,pull:false,put:false},sort:true,direction:'vertical',handle:handlers.handle_selector||'.wpbc_bfb__drag-handle',draggable:handlers.draggable_selector||'.wpbc_bfb__sortable-row',fallbackClass:'wpbc_bfb__simple_list_fallback',filter:['input','textarea','select','button','a','.wpbc_bfb__no-drag-zone','.wpbc_bfb__no-drag-zone *'].join(','),preventOnFilter:false,invertSwap:false,swapThreshold:0.30,invertedSwapThreshold:0.60,emptyInsertThreshold:8,dragoverBubble:false,scroll:true,scrollSensitivity:60,scrollSpeed:14,onUpdate:handlers.onUpdate||function(){}});this._containers.add(container);}/**
|
| 336 |
* Ensure Sortable is attached to a container with role 'palette' or 'canvas'.
|
| 337 |
*
|
| 338 |
* -- Handle selectors: handle: '.section-drag-handle, .wpbc_bfb__drag-handle, .wpbc_bfb__drag-anywhere,
|
| 339 |
* [data-draggable="true"]'
|
| 340 |
* -- Draggable gate: draggable: '.wpbc_bfb__field:not([data-draggable="false"]), .wpbc_bfb__section'
|
| 341 |
* -- Filter (overlay-safe): ignore everything in overlay except the handle -
|
| 342 |
* '.wpbc_bfb__overlay-controls
|
| 343 |
* *:not(.wpbc_bfb__drag-handle):not(.section-drag-handle):not(.wpbc_icn_drag_indicator)'
|
| 344 |
* -- No-drag wrapper: use .wpbc_bfb__no-drag-zone inside renderers for inputs/widgets.
|
| 345 |
* -- Focus guard (optional): flip [data-draggable] on focusin/focusout to prevent accidental drags while
|
| 346 |
* typing.
|
| 347 |
*
|
| 348 |
* @param {HTMLElement} container - The element to enhance with Sortable.
|
| 349 |
* @param {'palette'|'canvas'} role - Behavior profile to apply.
|
| 350 |
* @param {{ onAdd?: Function }} [handlers={}] - Optional handlers.
|
| 351 |
* @returns {void}
|
| 352 |
*/ensure(container,role,handlers={}){if(!container||typeof Sortable==='undefined'){return;}if(Sortable.get?.(container)){return;}const sortable_kind=handlers.sortable_kind||'';if(sortable_kind==='simple_list'){this.ensure_simple_list(container,handlers);return;}const common={animation:this.opts.animation,ghostClass:this.opts.ghostClass,chosenClass:this.opts.chosenClass,dragClass:this.opts.dragClass,// == Element under the cursor == Ensure we drag a real DOM mirror you can style via CSS (cross-browser). |
| 353 |
forceFallback:true,fallbackOnBody:true,fallbackTolerance:8,removeCloneOnHide:true,// Add body/html flags so you can style differently when dragging from palette. |
| 354 |
onStart:evt=>{this.builder?._add_dragging_class?.();const fromPalette=this.builder?.palette_uls?.includes?.(evt.from);this._toggle_dnd_root_flags(true,fromPalette);// set to root HTML document: html.wpbc_bfb__dnd-active.wpbc_bfb__drag-from-palette . |
| 355 |
this._tag_drag_mirror(evt);// Add 'data-drag-role' attribute to element under cursor. |
| 356 |
},onEnd:()=>{setTimeout(()=>{this.builder._remove_dragging_class();},50);this._toggle_dnd_root_flags(false);}};if(role==='palette'){Sortable.create(container,{...common,group:{name:this.opts.groupName,pull:'clone',put:false},sort:false});this._containers.add(container);return;}// role === 'canvas'. |
| 357 |
Sortable.create(container,{...common,group:{name:this.opts.groupName,pull:true,put:(to,from,draggedEl)=>{return draggedEl.classList.contains('wpbc_bfb__field')||draggedEl.classList.contains('wpbc_bfb__section');}},// ---------- DnD Handlers -------------- // Grab anywhere on fields that opt-in with the class or attribute. - Sections still require their dedicated handle. |
| 358 |
handle:'.section-drag-handle, .wpbc_bfb__drag-handle, .wpbc_bfb__drag-anywhere, [data-draggable="true"]',draggable:'.wpbc_bfb__field:not([data-draggable="false"]), .wpbc_bfb__section',// Per-field opt-out with [data-draggable="false"] (e.g., while editing). |
| 359 |
// ---------- Filters - No DnD ---------- // Declarative “no-drag zones”: anything inside these wrappers won’t start a drag. |
| 360 |
filter:['.wpbc_bfb__no-drag-zone','.wpbc_bfb__no-drag-zone *','.wpbc_bfb__column-resizer',// Ignore the resizer rails during DnD (prevents edge “snap”). |
| 361 |
// In the overlay toolbar, block everything EXCEPT the drag handle (and its icon). |
| 362 |
'.wpbc_bfb__overlay-controls *:not(.wpbc_bfb__drag-handle):not(.section-drag-handle):not(.wpbc_icn_drag_indicator)'].join(','),preventOnFilter:false,// ---------- anti-jitter tuning ---------- |
| 363 |
direction:'vertical',// columns are vertical lists. |
| 364 |
invertSwap:true,// use swap on inverted overlap. |
| 365 |
swapThreshold:0.65,// be less eager to swap. |
| 366 |
invertedSwapThreshold:0.85,// require deeper overlap when inverted. |
| 367 |
emptyInsertThreshold:24,// don’t jump into empty containers too early. |
| 368 |
dragoverBubble:false,// keep dragover local. |
| 369 |
scroll:true,scrollSensitivity:40,scrollSpeed:10,/**
|
| 370 |
* Enter/leave hysteresis for cross-column moves. Only allow dropping into `to` when the pointer is
|
| 371 |
* well inside it.
|
| 372 |
*/onMove:(evt,originalEvent)=>{const{to,from}=evt;if(!to||!from){return true;}const in_preview_canvas=!!to.closest('.wpbc_bfb__panel--preview');if(!in_preview_canvas){return true;}// Only gate columns (not page containers), and only for cross-column moves in the same row |
| 373 |
const isColumn=to.classList?.contains('wpbc_bfb__column');if(!isColumn)return true;const fromRow=from.closest('.wpbc_bfb__row');const toRow=to.closest('.wpbc_bfb__row');if(fromRow&&toRow&&fromRow!==toRow)return true;const rect=to.getBoundingClientRect();const evtX=originalEvent.touches?.[0]?.clientX??originalEvent.clientX;const evtY=originalEvent.touches?.[0]?.clientY??originalEvent.clientY;// --- Edge fence (like you had), but clamped for tiny columns |
| 374 |
const paddingX=Core.WPBC_BFB_Sanitize.clamp(rect.width*0.20,12,36);const paddingY=Core.WPBC_BFB_Sanitize.clamp(rect.height*0.10,6,16);// Looser Y if the column is visually tiny/empty |
| 375 |
const isVisuallyEmpty=to.childElementCount===0||rect.height<64;const innerTop=rect.top+(isVisuallyEmpty?4:paddingY);const innerBottom=rect.bottom-(isVisuallyEmpty?4:paddingY);const innerLeft=rect.left+paddingX;const innerRight=rect.right-paddingX;const insideX=evtX>innerLeft&&evtX<innerRight;const insideY=evtY>innerTop&&evtY<innerBottom;if(!(insideX&&insideY))return false;// stay in current column until well inside new one |
| 376 |
// --- Sticky target commit distance: only switch if we’re clearly inside the new column |
| 377 |
const ds=this._dragState;if(ds){if(ds.stickyTo&&ds.stickyTo!==to){// require a deeper penetration to switch columns |
| 378 |
const commitX=Core.WPBC_BFB_Sanitize.clamp(rect.width*0.25,18,40);// 25% or 18–40px |
| 379 |
const commitY=Core.WPBC_BFB_Sanitize.clamp(rect.height*0.15,10,28);// 15% or 10–28px |
| 380 |
const deepInside=evtX>rect.left+commitX&&evtX<rect.right-commitX&&evtY>rect.top+commitY&&evtY<rect.bottom-commitY;if(!deepInside)return false;}// We accept the new target now. |
| 381 |
ds.stickyTo=to;ds.lastSwitchTs=performance.now();}return true;},onStart:evt=>{this.builder?._add_dragging_class?.();// Match the flags we set in common so CSS stays consistent on canvas drags too. |
| 382 |
const fromPalette=this.builder?.palette_uls?.includes?.(evt.from);this._toggle_dnd_root_flags(true,fromPalette);// set to root HTML document: html.wpbc_bfb__dnd-active.wpbc_bfb__drag-from-palette . |
| 383 |
this._tag_drag_mirror(evt);// Tag the mirror under cursor. |
| 384 |
this._dragState={stickyTo:null,lastSwitchTs:0};// per-drag state. |
| 385 |
},onEnd:()=>{setTimeout(()=>{this.builder._remove_dragging_class();},50);this._toggle_dnd_root_flags(false);// set to root HTML document without these classes: html.wpbc_bfb__dnd-active.wpbc_bfb__drag-from-palette . |
| 386 |
this._dragState=null;},// ---------------------------------------- |
| 387 |
// onAdd: handlers.onAdd || this.builder.handle_on_add.bind( this.builder ) |
| 388 |
onAdd:evt=>{if(this._on_add_section(evt)){return;}// Fallback: original handler for normal fields. |
| 389 |
(handlers.onAdd||this.builder.handle_on_add.bind(this.builder))(evt);},onUpdate:()=>{this.builder.bus?.emit?.(Core.WPBC_BFB_Events.STRUCTURE_CHANGE,{reason:'sort-update'});}});this._containers.add(container);}/**
|
| 390 |
* Handle adding/moving sections via Sortable onAdd.
|
| 391 |
* Returns true if handled (i.e., it was a section), false to let the default field handler run.
|
| 392 |
*
|
| 393 |
* - Palette -> canvas: remove the placeholder clone and build a fresh section via add_section()
|
| 394 |
* - Canvas -> canvas: keep the moved DOM (and its children), just re-wire overlays/sortables/metadata
|
| 395 |
*
|
| 396 |
* @param {Sortable.SortableEvent} evt
|
| 397 |
* @returns {boolean}
|
| 398 |
*/_on_add_section(evt){const item=evt.item;if(!item){return false;}// Identify sections both from palette items (li clones) and real canvas nodes. |
| 399 |
const data=Core.WPBC_Form_Builder_Helper.get_all_data_attributes(item);const isSection=item.classList.contains('wpbc_bfb__section')||(data?.type||item.dataset?.type)==='section';if(!isSection){return false;}const fromPalette=this.builder?.palette_uls?.includes?.(evt.from)===true;if(!fromPalette){// Canvas -> canvas move: DO NOT rebuild/remove; preserve children. |
| 400 |
this.builder.add_overlay_toolbar?.(item);// ensure overlay exists |
| 401 |
this.builder.pages_sections?.init_all_nested_sortables?.(item);// ensure inner sortables |
| 402 |
// Ensure metadata present/updated |
| 403 |
item.dataset.type='section';const cols=item.querySelectorAll(':scope > .wpbc_bfb__row > .wpbc_bfb__column').length||1;item.dataset.columns=String(cols);// Select & notify subscribers (layout/min guards, etc.) |
| 404 |
this.builder.select_field?.(item);this.builder.bus?.emit?.(Core.WPBC_BFB_Events.STRUCTURE_CHANGE,{el:item,reason:'section-move'});this.builder.usage?.update_palette_ui?.();return true;// handled. |
| 405 |
}// Palette -> canvas: build a brand-new section using the same path as the dropdown/menu |
| 406 |
const to=evt.to?.closest?.('.wpbc_bfb__column, .wpbc_bfb__form_preview_section_container')||evt.to;const cols=parseInt(data?.columns||item.dataset.columns||1,10)||1;// Remove the palette clone placeholder. |
| 407 |
item.parentNode&&item.parentNode.removeChild(item);// Create the real section. |
| 408 |
this.builder.pages_sections.add_section(to,cols);// Insert at the precise drop index. |
| 409 |
const section=to.lastElementChild;// add_section appends to end. |
| 410 |
if(evt.newIndex!=null&&evt.newIndex<to.children.length-1){const ref=to.children[evt.newIndex]||null;to.insertBefore(section,ref);}// Finalize: overlay, selection, events, usage refresh. |
| 411 |
this.builder.add_overlay_toolbar?.(section);this.builder.select_field?.(section);this.builder.bus?.emit?.(Core.WPBC_BFB_Events.FIELD_ADD,{el:section,id:section.dataset.id,uid:section.dataset.uid});this.builder.usage?.update_palette_ui?.();return true;}/**
|
| 412 |
* Destroy all Sortable instances created by this manager.
|
| 413 |
*
|
| 414 |
* @returns {void}
|
| 415 |
*/destroyAll(){this._containers.forEach(el=>{const inst=Sortable.get?.(el);if(inst){inst.destroy();}});this._containers.clear();}};/**
|
| 416 |
* Small DOM contract and renderer helper
|
| 417 |
*
|
| 418 |
* @type {Readonly<{
|
| 419 |
* SELECTORS: {pagePanel: string, field: string, validField: string, section: string, column:
|
| 420 |
* string, row: string, overlay: string}, CLASSES: {selected: string}, ATTR: {id: string, name: string, htmlId:
|
| 421 |
* string, usageKey: string, uid: string}}
|
| 422 |
* >}
|
| 423 |
*/Core.WPBC_BFB_DOM=Object.freeze({SELECTORS:{pagePanel:'.wpbc_bfb__panel--preview',field:'.wpbc_bfb__field',validField:'.wpbc_bfb__field:not(.is-invalid)',section:'.wpbc_bfb__section',column:'.wpbc_bfb__column',row:'.wpbc_bfb__row',overlay:'.wpbc_bfb__overlay-controls'},CLASSES:{selected:'is-selected'},ATTR:{id:'data-id',name:'data-name',htmlId:'data-html_id',usageKey:'data-usage_key',uid:'data-uid'}});Core.WPBC_Form_Builder_Helper=class{/**
|
| 424 |
* Create an HTML element.
|
| 425 |
*
|
| 426 |
* @param {string} tag - HTML tag name.
|
| 427 |
* @param {string} [class_name=''] - Optional CSS class name.
|
| 428 |
* @param {string} [inner_html=''] - Optional innerHTML.
|
| 429 |
* @returns {HTMLElement} Created element.
|
| 430 |
*/static create_element(tag,class_name='',inner_html=''){const el=document.createElement(tag);if(class_name){el.className=class_name;}if(inner_html){el.innerHTML=inner_html;}return el;}/**
|
| 431 |
* Set multiple `data-*` attributes on a given element.
|
| 432 |
*
|
| 433 |
* @param {HTMLElement} el - Target element.
|
| 434 |
* @param {Object} data_obj - Key-value pairs for data attributes.
|
| 435 |
* @returns {void}
|
| 436 |
*/static set_data_attributes(el,data_obj){Object.entries(data_obj).forEach(([key,val])=>{// Previously: 2025-09-01 17:09: |
| 437 |
// const value = (typeof val === 'object') ? JSON.stringify( val ) : val; |
| 438 |
//New: |
| 439 |
let value;if(typeof val==='object'&&val!==null){try{value=JSON.stringify(val);}catch{value='';}}else{value=val;}el.setAttribute('data-'+key,value);});}/**
|
| 440 |
* Get all `data-*` attributes from an element and parse JSON where possible.
|
| 441 |
*
|
| 442 |
* @param {HTMLElement} el - Element to extract data from.
|
| 443 |
* @returns {Object} Parsed key-value map of data attributes.
|
| 444 |
*/static get_all_data_attributes(el){const data={};if(!el||!el.attributes){return data;}Array.from(el.attributes).forEach(attr=>{if(attr.name.startsWith('data-')){const key=attr.name.replace(/^data-/,'');try{data[key]=JSON.parse(attr.value);}catch(e){data[key]=attr.value;}}});// Only default the label if it's truly absent (undefined/null), not when it's an empty string. |
| 445 |
const hasExplicitLabel=Object.prototype.hasOwnProperty.call(data,'label');if(!hasExplicitLabel&&data.id){data.label=data.id.charAt(0).toUpperCase()+data.id.slice(1);}return data;}/**
|
| 446 |
* Render a simple label + type preview (used for unknown or fallback fields).
|
| 447 |
*
|
| 448 |
* @param {Object} field_data - Field data object.
|
| 449 |
* @returns {string} HTML content.
|
| 450 |
*/static render_field_inner_html(field_data){// Make the fallback preview respect an empty label. |
| 451 |
const hasLabel=Object.prototype.hasOwnProperty.call(field_data,'label');const label=hasLabel?String(field_data.label):String(field_data.id||'(no label)');const type=String(field_data.type||'unknown');const is_required=field_data.required===true||field_data.required==='true'||field_data.required===1||field_data.required==='1';const wrapper=document.createElement('div');const spanLabel=document.createElement('span');spanLabel.className='wpbc_bfb__field-label';spanLabel.textContent=label+(is_required?' *':'');wrapper.appendChild(spanLabel);const spanType=document.createElement('span');spanType.className='wpbc_bfb__field-type';spanType.textContent=type;wrapper.appendChild(spanType);return wrapper.innerHTML;}/**
|
| 452 |
* Debounce a function.
|
| 453 |
*
|
| 454 |
* @param {Function} fn - Function to debounce.
|
| 455 |
* @param {number} wait - Delay in ms.
|
| 456 |
* @returns {Function} Debounced function.
|
| 457 |
*/static debounce(fn,wait=120){let t=null;return function debounced(...args){if(t){clearTimeout(t);}t=setTimeout(()=>fn.apply(this,args),wait);};}};// Renderer registry. Allows late registration and avoids tight coupling to a global map. |
| 458 |
Core.WPBC_BFB_Field_Renderer_Registry=function(){const map=new Map();return{register(type,ClassRef){map.set(String(type),ClassRef);},get(type){return map.get(String(type));}};}();})(window);// --------------------------------------------------------------------------------------------------------------------- |
| 459 |
// == File /includes/page-form-builder/_out/core/bfb-fields.js == | 2025-09-10 15:47 |
| 460 |
// --------------------------------------------------------------------------------------------------------------------- |
| 461 |
(function(w){'use strict';// Single global namespace (idempotent & load-order safe). |
| 462 |
const Core=w.WPBC_BFB_Core=w.WPBC_BFB_Core||{};const UI=Core.UI=Core.UI||{};/**
|
| 463 |
* Base class for field renderers (static-only contract).
|
| 464 |
* ================================================================================================================
|
| 465 |
* Contract exposed to the builder (static methods on the CLASS itself):
|
| 466 |
* - render(el, data, ctx) // REQUIRED
|
| 467 |
* - on_field_drop(data, el, meta) // OPTIONAL (default provided)
|
| 468 |
*
|
| 469 |
* Helpers for subclasses:
|
| 470 |
* - get_defaults() -> per-field defaults (MUST override in subclass to set type/label)
|
| 471 |
* - normalize_data(d) -> shallow merge with defaults
|
| 472 |
* - get_template(id) -> per-id cached wp.template compiler
|
| 473 |
*
|
| 474 |
* Subclass usage:
|
| 475 |
* class WPBC_BFB_Field_Text extends Core.WPBC_BFB_Field_Base { static get_defaults(){ ... } }
|
| 476 |
* WPBC_BFB_Field_Text.template_id = 'wpbc-bfb-field-text';
|
| 477 |
* ================================================================================================================
|
| 478 |
*/Core.WPBC_BFB_Field_Base=class{/**
|
| 479 |
* Default field data (generic baseline).
|
| 480 |
* Subclasses MUST override to provide { type, label } appropriate for the field.
|
| 481 |
* @returns {Object}
|
| 482 |
*/static get_defaults(){return{type:'field',label:'Field',name:'field',html_id:'',placeholder:'',required:false,minlength:'',maxlength:'',pattern:'',cssclass:'',help:''};}/**
|
| 483 |
* Shallow-merge incoming data with defaults.
|
| 484 |
* @param {Object} data
|
| 485 |
* @returns {Object}
|
| 486 |
*/static normalize_data(data){var d=data||{};var defaults=this.get_defaults();var out={};var k;for(k in defaults){if(Object.prototype.hasOwnProperty.call(defaults,k)){out[k]=defaults[k];}}for(k in d){if(Object.prototype.hasOwnProperty.call(d,k)){out[k]=d[k];}}return out;}/**
|
| 487 |
* Compile and cache a wp.template by id (per-id cache).
|
| 488 |
* @param {string} template_id
|
| 489 |
* @returns {Function|null}
|
| 490 |
*/static get_template(template_id){// Accept either "wpbc-bfb-field-text" or "tmpl-wpbc-bfb-field-text". |
| 491 |
if(!template_id||!window.wp||!wp.template){return null;}const domId=template_id.startsWith('tmpl-')?template_id:'tmpl-'+template_id;if(!document.getElementById(domId)){return null;}if(!Core.__bfb_tpl_cache_map){Core.__bfb_tpl_cache_map={};}// Normalize id for the compiler & cache. // wp.template expects id WITHOUT the "tmpl-" prefix ! |
| 492 |
const key=template_id.replace(/^tmpl-/,'');if(Core.__bfb_tpl_cache_map[key]){return Core.__bfb_tpl_cache_map[key];}const compiler=wp.template(key);// <-- normalized id here |
| 493 |
if(compiler){Core.__bfb_tpl_cache_map[key]=compiler;}return compiler;}/**
|
| 494 |
* REQUIRED: render preview into host element (full redraw; idempotent).
|
| 495 |
* Subclasses should set static `template_id` to a valid wp.template id.
|
| 496 |
* @param {HTMLElement} el
|
| 497 |
* @param {Object} data
|
| 498 |
* @param {{mode?:string,builder?:any,tpl?:Function,sanit?:any}} ctx
|
| 499 |
* @returns {void}
|
| 500 |
*/static render(el,data,ctx){if(!el){return;}var compile=this.get_template(this.template_id);var d=this.normalize_data(data);var s=ctx&&ctx.sanit?ctx.sanit:Core.WPBC_BFB_Sanitize;// Sanitize critical attributes before templating. |
| 501 |
if(s){d.html_id=d.html_id?s.sanitize_html_id(String(d.html_id)):'';d.name=s.sanitize_html_name(String(d.name||d.id||'field'));}else{d.html_id=d.html_id?String(d.html_id):'';d.name=String(d.name||d.id||'field');}// Fall back to generic preview if template not available. |
| 502 |
if(compile){el.innerHTML=compile(d);// After render, set attribute values via DOM so quotes/newlines are handled correctly. |
| 503 |
const input=el.querySelector('input, textarea, select');if(input){if(d.placeholder!=null)input.setAttribute('placeholder',String(d.placeholder));if(d.title!=null)input.setAttribute('title',String(d.title));}}else{el.innerHTML=Core.WPBC_Form_Builder_Helper.render_field_inner_html(d);}el.dataset.type=d.type||'field';el.setAttribute('data-label',d.label!=null?String(d.label):'');// allow "". |
| 504 |
}/**
|
| 505 |
* OPTIONAL hook executed after field is dropped/loaded/preview.
|
| 506 |
* Default extended:
|
| 507 |
* - On first drop: stamp default label (existing behavior) and mark field as "fresh" for auto-name.
|
| 508 |
* - On load: mark as loaded so later label edits do not rename the saved name.
|
| 509 |
*/static on_field_drop(data,el,meta){const context=meta&&meta.context?String(meta.context):'';// ----------------------------------------------------------------------------------------- |
| 510 |
// NEW: Seed default "help" (and keep it in Structure) for all field packs that define it. |
| 511 |
// This fixes the mismatch where: |
| 512 |
// - UI shows default help via normalize_data() / templates |
| 513 |
// - but get_structure() / exporters see `help` as undefined/empty. |
| 514 |
// |
| 515 |
// Behavior: |
| 516 |
// - Runs ONLY on initial drop (context === 'drop'). |
| 517 |
// - If get_defaults() exposes a non-empty "help", and data.help is |
| 518 |
// missing / null / empty string -> we persist the default into `data` |
| 519 |
// and notify Structure so exports see it. |
| 520 |
// - On "load" we do nothing, so existing forms where user *cleared* |
| 521 |
// help will not be overridden. |
| 522 |
// ----------------------------------------------------------------------------------------- |
| 523 |
if(context==='drop'&&data){try{const defs=typeof this.get_defaults==='function'?this.get_defaults():null;if(defs&&Object.prototype.hasOwnProperty.call(defs,'help')){const current=Object.prototype.hasOwnProperty.call(data,'help')?data.help:undefined;const hasValue=current!==undefined&¤t!==null&&String(current)!=='';const defaultVal=defs.help;if(!hasValue&&defaultVal!=null&&String(defaultVal)!==''){// 1) persist into data object (used by Structure). |
| 524 |
data.help=defaultVal;// 2) mirror into dataset (for any DOM-based consumers). |
| 525 |
if(el){el.dataset.help=String(defaultVal);// 3) notify Structure / listeners (if available). |
| 526 |
try{Core.Structure?.update_field_prop?.(el,'help',defaultVal);el.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'help',value:defaultVal}}));}catch(_inner){}}}}}catch(_e){}}// ----------------------------------------------------------------------------------------- |
| 527 |
if(context==='drop'&&!Object.prototype.hasOwnProperty.call(data,'label')){const defs=this.get_defaults();data.label=defs.label||'Field';el.setAttribute('data-label',data.label);}// Mark provenance flags. |
| 528 |
if(context==='drop'){el.dataset.fresh='1';// can auto-name on first label edit. |
| 529 |
el.dataset.autoname='1';el.dataset.was_loaded='0';// Seed a provisional unique name immediately. |
| 530 |
try{const b=meta?.builder;if(b?.id&&(!el.hasAttribute('data-name')||!el.getAttribute('data-name'))){const S=Core.WPBC_BFB_Sanitize;const base=S.sanitize_html_name(el.getAttribute('data-id')||data?.id||data?.type||'field');const uniq=b.id.ensure_unique_field_name(base,el);el.setAttribute('data-name',uniq);el.dataset.name_user_touched='0';}}catch(_){}}else if(context==='load'){el.dataset.fresh='0';el.dataset.autoname='0';el.dataset.was_loaded='1';// never rename names for loaded fields. |
| 531 |
}}// --- Auto Rename "Fresh" field, on entering the new Label --- |
| 532 |
/**
|
| 533 |
* Create a conservative field "name" from a human label.
|
| 534 |
* Uses the same constraints as sanitize_html_name (letters/digits/_- and leading letter).
|
| 535 |
*/static name_from_label(label){const s=Core.WPBC_BFB_Sanitize.sanitize_html_name(String(label??''));return s.toLowerCase()||'field';}/**
|
| 536 |
* Auto-fill data-name from label ONLY for freshly dropped fields that were not edited yet.
|
| 537 |
* - Never runs for sections.
|
| 538 |
* - Never runs for loaded/existing fields.
|
| 539 |
* - Stops as soon as user edits the Name manually.
|
| 540 |
*
|
| 541 |
* @param {WPBC_Form_Builder} builder
|
| 542 |
* @param {HTMLElement} el - .wpbc_bfb__field element
|
| 543 |
* @param {string} labelVal
|
| 544 |
*/static maybe_autoname_from_label(builder,el,labelVal){if(!builder||!el)return;if(el.classList.contains('wpbc_bfb__section'))return;const allowAuto=el.dataset.autoname==='1';const userTouched=el.dataset.name_user_touched==='1';const isLoaded=el.dataset.was_loaded==='1';if(!allowAuto||userTouched||isLoaded)return;// Only override placeholder-y names |
| 545 |
const S=Core.WPBC_BFB_Sanitize;const base=this.name_from_label(labelVal);const unique=builder.id.ensure_unique_field_name(base,el);el.setAttribute('data-name',unique);const ins=document.getElementById('wpbc_bfb__inspector');const nameCtrl=ins?.querySelector('[data-inspector-key="name"]');if(nameCtrl&&'value'in nameCtrl&&nameCtrl.value!==unique)nameCtrl.value=unique;}};/**
|
| 546 |
* Select_Base (shared base for select-like packs)
|
| 547 |
*
|
| 548 |
* @type {Core.WPBC_BFB_Select_Base}
|
| 549 |
*/Core.WPBC_BFB_Select_Base=class extends Core.WPBC_BFB_Field_Base{static template_id=null;// main preview template id |
| 550 |
static option_row_template_id='wpbc-bfb-inspector-select-option-row';// row tpl id |
| 551 |
static kind='select';static __root_wired=false;static __root_node=null;// Single source of selectors used by the inspector UI. |
| 552 |
static ui={list:'.wpbc_bfb__options_list',holder:'.wpbc_bfb__options_state[data-inspector-key="options"]',row:'.wpbc_bfb__options_row',label:'.wpbc_bfb__opt-label',value:'.wpbc_bfb__opt-value',toggle:'.wpbc_bfb__opt-selected-chk',add_btn:'.js-add-option',drag_handle:'.wpbc_bfb__drag-handle',multiple_chk:'.js-opt-multiple[data-inspector-key="multiple"]',default_text:'.js-default-value[data-inspector-key="default_value"]',placeholder_input:'.js-placeholder[data-inspector-key="placeholder"]',placeholder_note:'.js-placeholder-note',size_input:'.inspector__input[data-inspector-key="size"]',// Dropdown menu integration. |
| 553 |
menu_root:'.wpbc_ui_el__dropdown',menu_toggle:'[data-toggle="wpbc_dropdown"]',menu_action:'.ul_dropdown_menu_li_action[data-action]',// Value-differs toggle. |
| 554 |
value_differs_chk:'.js-value-differs[data-inspector-key="value_differs"]'};/**
|
| 555 |
* Build option value from label.
|
| 556 |
* - If `differs === true` -> generate token (slug-like machine value).
|
| 557 |
* - If `differs === false` -> keep human text; escape only dangerous chars.
|
| 558 |
* @param {string} label
|
| 559 |
* @param {boolean} differs
|
| 560 |
* @returns {string}
|
| 561 |
*/static build_value_from_label(label,differs){const S=Core.WPBC_BFB_Sanitize;if(differs){return S&&typeof S.to_token==='function'?S.to_token(String(label||'')):String(label||'').trim().toLowerCase().replace(/\s+/g,'_').replace(/[^\w-]/g,'');}// single-input mode: keep human text; template will escape safely. |
| 562 |
return String(label==null?'':label);}/**
|
| 563 |
* Is the “value differs from label” toggle enabled?
|
| 564 |
* @param {HTMLElement} panel
|
| 565 |
* @returns {boolean}
|
| 566 |
*/static is_value_differs_enabled(panel){const chk=panel?.querySelector(this.ui.value_differs_chk);return!!(chk&&chk.checked);}/**
|
| 567 |
* Ensure visibility/enabled state of Value inputs based on the toggle.
|
| 568 |
* When disabled -> hide Value inputs and keep them mirrored from Label.
|
| 569 |
* @param {HTMLElement} panel
|
| 570 |
* @returns {void}
|
| 571 |
*/static sync_value_inputs_visibility(panel){const differs=this.is_value_differs_enabled(panel);const rows=panel?.querySelectorAll(this.ui.row)||[];for(let i=0;i<rows.length;i++){const r=rows[i];const lbl_in=r.querySelector(this.ui.label);const val_in=r.querySelector(this.ui.value);if(!val_in)continue;if(differs){// Re-enable & show value input |
| 572 |
val_in.removeAttribute('disabled');val_in.style.display='';// If we have a cached custom value and the row wasn't edited while OFF, restore it |
| 573 |
const hasCache=!!val_in.dataset.cached_value;const userEdited=r.dataset.value_user_touched==='1';if(hasCache&&!userEdited){val_in.value=val_in.dataset.cached_value;}else if(!hasCache){// No cache: if value is just a mirrored label, offer a tokenized default |
| 574 |
const lbl=lbl_in?lbl_in.value:'';const mirrored=this.build_value_from_label(lbl,/*differs=*/false);if(val_in.value===mirrored){val_in.value=this.build_value_from_label(lbl,/*differs=*/true);}}}else{// ON -> OFF: cache once, then mirror |
| 575 |
if(!val_in.dataset.cached_value){val_in.dataset.cached_value=val_in.value||'';}const lbl=lbl_in?lbl_in.value:'';val_in.value=this.build_value_from_label(lbl,/*differs=*/false);val_in.setAttribute('disabled','disabled');val_in.style.display='none';// NOTE: do NOT mark as user_touched here |
| 576 |
}}}/**
|
| 577 |
* Return whether this row’s value has been edited by user.
|
| 578 |
* @param {HTMLElement} row
|
| 579 |
* @returns {boolean}
|
| 580 |
*/static is_row_value_user_touched(row){return row?.dataset?.value_user_touched==='1';}/**
|
| 581 |
* Mark this row’s value as edited by user.
|
| 582 |
* @param {HTMLElement} row
|
| 583 |
*/static mark_row_value_user_touched(row){if(row)row.dataset.value_user_touched='1';}/**
|
| 584 |
* Initialize “freshness” flags on a row (value untouched).
|
| 585 |
* Call on creation/append of rows.
|
| 586 |
* @param {HTMLElement} row
|
| 587 |
*/static init_row_fresh_flags(row){if(row){if(!row.dataset.value_user_touched){row.dataset.value_user_touched='0';}}}// ---- defaults (packs can override) ---- |
| 588 |
static get_defaults(){return{type:this.kind,label:'Select',name:'',html_id:'',placeholder:'--- Select ---',required:false,multiple:false,size:null,cssclass:'',help:'',default_value:'',options:[{label:'Option 1',value:'Option 1',selected:false},{label:'Option 2',value:'Option 2',selected:false},{label:'Option 3',value:'Option 3',selected:false},{label:'Option 4',value:'Option 4',selected:false}],min_width:'240px'};}// ---- preview render (idempotent) ---- |
| 589 |
static render(el,data,ctx){if(!el)return;const d=this.normalize_data(data);if(d.min_width!=null){el.dataset.min_width=String(d.min_width);try{el.style.setProperty('--wpbc-col-min',String(d.min_width));}catch(_){}}if(d.html_id!=null)el.dataset.html_id=String(d.html_id||'');if(d.cssclass!=null)el.dataset.cssclass=String(d.cssclass||'');if(d.placeholder!=null)el.dataset.placeholder=String(d.placeholder||'');const tpl=this.get_template(this.template_id);if(typeof tpl!=='function'){el.innerHTML='<div class="wpbc_bfb__error" role="alert">Template not found: '+this.template_id+'.</div>';return;}try{el.innerHTML=tpl(d);}catch(e){window._wpbc?.dev?.error?.('Select_Base.render',e);el.innerHTML='<div class="wpbc_bfb__error" role="alert">Error rendering field preview.</div>';return;}el.dataset.type=d.type||this.kind;el.setAttribute('data-label',d.label!=null?String(d.label):'');try{Core.UI?.WPBC_BFB_Overlay?.ensure?.(ctx?.builder,el);}catch(_){}if(!el.dataset.options&&Array.isArray(d.options)&&d.options.length){try{el.dataset.options=JSON.stringify(d.options);}catch(_){}}}// ---- drop seeding (options + placeholder) ---- |
| 590 |
static on_field_drop(data,el,meta){try{super.on_field_drop?.(data,el,meta);}catch(_){}const is_drop=meta&&meta.context==='drop';if(is_drop){if(!Array.isArray(data.options)||!data.options.length){const opts=(this.get_defaults().options||[]).map(o=>({label:o.label,value:o.value,selected:!!o.selected}));data.options=opts;try{el.dataset.options=JSON.stringify(opts);el.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'options',value:opts}}));Core.Structure?.update_field_prop?.(el,'options',opts);}catch(_){}}const ph=(data.placeholder??'').toString().trim();if(!ph){const dflt=this.get_defaults().placeholder||'--- Select ---';data.placeholder=dflt;try{el.dataset.placeholder=String(dflt);el.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'placeholder',value:dflt}}));Core.Structure?.update_field_prop?.(el,'placeholder',dflt);}catch(_){}}}}// ============================== |
| 591 |
// Inspector helpers (snake_case) |
| 592 |
// ============================== |
| 593 |
static get_panel_root(el){return el?.closest?.('.wpbc_bfb__inspector__body')||el?.closest?.('.wpbc_bfb__inspector')||null;}static get_list(panel){return panel?panel.querySelector(this.ui.list):null;}static get_holder(panel){return panel?panel.querySelector(this.ui.holder):null;}static make_uid(){return'wpbc_ins_auto_opt_'+Math.random().toString(36).slice(2,10);}static append_row(panel,data){const list=this.get_list(panel);if(!list)return;const idx=list.children.length;const rowd=Object.assign({label:'',value:'',selected:false,index:idx},data||{});if(!rowd.uid)rowd.uid=this.make_uid();const tpl_id=this.option_row_template_id;const tpl=window.wp&&wp.template?wp.template(tpl_id):null;const html=tpl?tpl(rowd):null;// In append_row() -> fallback HTML. |
| 594 |
const wrap=document.createElement('div');wrap.innerHTML=html||'<div class="wpbc_bfb__options_row" data-index="'+(rowd.index||0)+'">'+'<span class="wpbc_bfb__drag-handle"><span class="wpbc_icn_drag_indicator"></span></span>'+'<input type="text" class="wpbc_bfb__opt-label" placeholder="Label" value="'+(rowd.label||'')+'">'+'<input type="text" class="wpbc_bfb__opt-value" placeholder="Value" value="'+(rowd.value||'')+'">'+'<div class="wpbc_bfb__opt-selected">'+'<div class="inspector__control wpbc_ui__toggle">'+'<input type="checkbox" class="wpbc_bfb__opt-selected-chk inspector__input" id="'+rowd.uid+'" role="switch" '+(rowd.selected?'checked aria-checked="true"':'aria-checked="false"')+'>'+'<label class="wpbc_ui__toggle_icon_radio" for="'+rowd.uid+'"></label>'+'<label class="wpbc_ui__toggle_label" for="'+rowd.uid+'">Default</label>'+'</div>'+'</div>'+// 3-dot dropdown (uses existing plugin dropdown JS). |
| 595 |
'<div class="wpbc_ui_el wpbc_ui_el_container wpbc_ui_el__dropdown">'+'<a href="javascript:void(0)" data-toggle="wpbc_dropdown" aria-expanded="false" class="ul_dropdown_menu_toggle">'+'<i class="menu_icon icon-1x wpbc_icn_more_vert"></i>'+'</a>'+'<ul class="ul_dropdown_menu" role="menu" style="right:0px; left:auto;">'+'<li>'+'<a class="ul_dropdown_menu_li_action" data-action="add_after" href="javascript:void(0)">'+'Add New'+'<i class="menu_icon icon-1x wpbc_icn_add_circle"></i>'+'</a>'+'</li>'+'<li>'+'<a class="ul_dropdown_menu_li_action" data-action="duplicate" href="javascript:void(0)">'+'Duplicate'+'<i class="menu_icon icon-1x wpbc_icn_content_copy"></i>'+'</a>'+'</li>'+'<li class="divider"></li>'+'<li>'+'<a class="ul_dropdown_menu_li_action" data-action="remove" href="javascript:void(0)">'+'Remove'+'<i class="menu_icon icon-1x wpbc_icn_delete_outline"></i>'+'</a>'+'</li>'+'</ul>'+'</div>'+'</div>';const node=wrap.firstElementChild;if(!node){return;}// pre-hide Value input if toggle is OFF **before** appending. |
| 596 |
const differs=this.is_value_differs_enabled(panel);const valIn=node.querySelector(this.ui.value);const lblIn=node.querySelector(this.ui.label);if(!differs&&valIn){if(!valIn.dataset.cached_value){valIn.dataset.cached_value=valIn.value||'';}if(lblIn)valIn.value=this.build_value_from_label(lblIn.value,false);valIn.setAttribute('disabled','disabled');valIn.style.display='none';}this.init_row_fresh_flags(node);list.appendChild(node);// Keep your existing post-append sync as a safety net |
| 597 |
this.sync_value_inputs_visibility(panel);}static close_dropdown(anchor_el){try{var root=anchor_el?.closest?.(this.ui.menu_root);if(root){// If your dropdown toggler toggles a class like 'open', close it. |
| 598 |
root.classList.remove('open');// Or if it relies on aria-expanded on the toggle. |
| 599 |
var t=root.querySelector(this.ui.menu_toggle);if(t){t.setAttribute('aria-expanded','false');}}}catch(_){}}static insert_after(new_node,ref_node){if(ref_node?.parentNode){if(ref_node.nextSibling){ref_node.parentNode.insertBefore(new_node,ref_node.nextSibling);}else{ref_node.parentNode.appendChild(new_node);}}}static commit_options(panel){const list=this.get_list(panel);const holder=this.get_holder(panel);if(!list||!holder)return;const differs=this.is_value_differs_enabled(panel);const rows=list.querySelectorAll(this.ui.row);const options=[];for(let i=0;i<rows.length;i++){const r=rows[i];const lbl_in=r.querySelector(this.ui.label);const val_in=r.querySelector(this.ui.value);const chk=r.querySelector(this.ui.toggle);const lbl=lbl_in&&lbl_in.value||'';let val=val_in&&val_in.value||'';// If single-input mode -> hard mirror to label. |
| 600 |
if(!differs){// single-input mode: mirror Label, minimal escaping (no slug). |
| 601 |
val=this.build_value_from_label(lbl,/*differs=*/false);if(val_in){val_in.value=val;// keep hidden input in sync for any previews/debug. |
| 602 |
}}const sel=!!(chk&&chk.checked);options.push({label:lbl,value:val,selected:sel});}try{holder.value=JSON.stringify(options);holder.dispatchEvent(new Event('input',{bubbles:true}));holder.dispatchEvent(new Event('change',{bubbles:true}));panel.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'options',value:options}}));}catch(_){}this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);// Mirror to the selected field element so canvas/export sees current options immediately. |
| 603 |
const field=panel.__selectbase_field||document.querySelector('.wpbc_bfb__field.is-selected, .wpbc_bfb__field--selected');if(field){try{field.dataset.options=JSON.stringify(options);}catch(_){}Core.Structure?.update_field_prop?.(field,'options',options);field.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'options',value:options}}));}}static ensure_sortable(panel){const list=this.get_list(panel);if(!list){return;}try{const existing=window.Sortable?.get?.(list);if(existing){return;}const builder=window.wpbc_bfb_api?.get_builder?.()||window.wpbc_bfb||null;// Prefer the shared Sortable manager so the sidebar list uses |
| 604 |
// the dedicated "simple_list" config instead of the canvas config. |
| 605 |
if(builder&&builder.sortable&&typeof builder.sortable.ensure==='function'){builder.sortable.ensure(list,'canvas',{sortable_kind:'simple_list',handle_selector:this.ui.drag_handle,draggable_selector:this.ui.row,onUpdate:()=>{this.commit_options(panel);}});}else if(window.Sortable?.create){// Fallback if builder is not ready for some reason. |
| 606 |
window.Sortable.create(list,{handle:this.ui.drag_handle,draggable:this.ui.row,animation:120,forceFallback:true,fallbackOnBody:false,fallbackTolerance:8,removeCloneOnHide:true,onUpdate:()=>{this.commit_options(panel);}});}list.dataset.sortable_init='1';}catch(e){window._wpbc?.dev?.error?.('Select_Base.ensure_sortable',e);}}static rebuild_if_empty(panel){const list=this.get_list(panel);const holder=this.get_holder(panel);if(!list||!holder||list.children.length)return;let data=[];try{data=JSON.parse(holder.value||'[]');}catch(_){data=[];}if(!Array.isArray(data)||!data.length){data=(this.get_defaults().options||[]).slice(0);try{holder.value=JSON.stringify(data);holder.dispatchEvent(new Event('input',{bubbles:true}));holder.dispatchEvent(new Event('change',{bubbles:true}));}catch(_){}}for(let i=0;i<data.length;i++){this.append_row(panel,{label:data[i]?.label||'',value:data[i]?.value||'',selected:!!data[i]?.selected,index:i,uid:this.make_uid()});}this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);this.sync_value_inputs_visibility(panel);}static has_row_defaults(panel){const checks=panel?.querySelectorAll(this.ui.toggle);if(!checks?.length)return false;for(let i=0;i<checks.length;i++)if(checks[i].checked)return true;return false;}static is_multiple_enabled(panel){const chk=panel?.querySelector(this.ui.multiple_chk);return!!(chk&&chk.checked);}static has_text_default_value(panel){const dv=panel?.querySelector(this.ui.default_text);return!!(dv&&String(dv.value||'').trim().length);}static sync_default_value_lock(panel){const input=panel?.querySelector(this.ui.default_text);const note=panel?.querySelector('.js-default-value-note');if(!input)return;const lock=this.has_row_defaults(panel);input.disabled=!!lock;if(lock){input.setAttribute('aria-disabled','true');if(note)note.style.display='';}else{input.removeAttribute('aria-disabled');if(note)note.style.display='none';}}static sync_placeholder_lock(panel){const input=panel?.querySelector(this.ui.placeholder_input);const note=panel?.querySelector(this.ui.placeholder_note);// NEW: compute multiple and toggle row visibility |
| 607 |
const isMultiple=this.is_multiple_enabled(panel);const placeholderRow=input?.closest('.inspector__row')||null;const sizeInput=panel?.querySelector(this.ui.size_input)||null;const sizeRow=sizeInput?.closest('.inspector__row')||null;// Show placeholder only for single-select; show size only for multiple |
| 608 |
if(placeholderRow)placeholderRow.style.display=isMultiple?'none':'';if(sizeRow)sizeRow.style.display=isMultiple?'':'none';// Existing behavior (keep as-is) |
| 609 |
if(!input)return;const lock=isMultiple||this.has_row_defaults(panel)||this.has_text_default_value(panel);if(note&&!note.id)note.id='wpbc_placeholder_note_'+Math.random().toString(36).slice(2,10);input.disabled=!!lock;if(lock){input.setAttribute('aria-disabled','true');if(note){note.style.display='';input.setAttribute('aria-describedby',note.id);}}else{input.removeAttribute('aria-disabled');input.removeAttribute('aria-describedby');if(note)note.style.display='none';}}static enforce_single_default(panel,clicked){if(this.is_multiple_enabled(panel))return;const checks=panel?.querySelectorAll(this.ui.toggle);if(!checks?.length)return;if(clicked&&clicked.checked){for(let i=0;i<checks.length;i++)if(checks[i]!==clicked){checks[i].checked=false;checks[i].setAttribute('aria-checked','false');}clicked.setAttribute('aria-checked','true');return;}let kept=false;for(let j=0;j<checks.length;j++)if(checks[j].checked){if(!kept){kept=true;}else{checks[j].checked=false;checks[j].setAttribute('aria-checked','false');}}this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);}// ---- one-time bootstrap of a panel ---- |
| 610 |
static bootstrap_panel(panel){if(!panel)return;if(!panel.querySelector('.wpbc_bfb__options_editor'))return;// only select-like UIs |
| 611 |
if(panel.dataset.selectbase_bootstrapped==='1'){this.ensure_sortable(panel);return;}this.rebuild_if_empty(panel);this.ensure_sortable(panel);panel.dataset.selectbase_bootstrapped='1';this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);this.sync_value_inputs_visibility(panel);}// ---- hook into inspector lifecycle (fires ONCE) ---- |
| 612 |
static wire_once(){if(Core.__selectbase_wired)return;Core.__selectbase_wired=true;const on_ready_or_render=ev=>{const panel=ev?.detail?.panel;const field=ev?.detail?.el||ev?.detail?.field||null;if(!panel)return;if(field)panel.__selectbase_field=field;this.bootstrap_panel(panel);// If the inspector root was remounted, ensure root listeners are (re)bound. |
| 613 |
this.wire_root_listeners();};document.addEventListener('wpbc_bfb_inspector_ready',on_ready_or_render);document.addEventListener('wpbc_bfb_inspector_render',on_ready_or_render);this.wire_root_listeners();}static wire_root_listeners(){// If already wired AND the stored root is still in the DOM, bail out. |
| 614 |
if(this.__root_wired&&this.__root_node?.isConnected)return;const root=document.getElementById('wpbc_bfb__inspector');if(!root){// Root missing (e.g., SPA re-render) — clear flags so we can wire later. |
| 615 |
this.__root_wired=false;this.__root_node=null;return;}this.__root_node=root;this.__root_wired=true;root.dataset.selectbase_root_wired='1';const get_panel=target=>target?.closest?.('.wpbc_bfb__inspector__body')||root.querySelector('.wpbc_bfb__inspector__body')||null;// Click handlers: add / delete / duplicate |
| 616 |
root.addEventListener('click',e=>{const panel=get_panel(e.target);if(!panel)return;this.bootstrap_panel(panel);const ui=this.ui;// Existing "Add option" button (top toolbar) |
| 617 |
const add=e.target.closest?.(ui.add_btn);if(add){this.append_row(panel,{label:'',value:'',selected:false});this.commit_options(panel);this.sync_value_inputs_visibility(panel);return;}// Dropdown menu actions. |
| 618 |
const menu_action=e.target.closest?.(ui.menu_action);if(menu_action){e.preventDefault();e.stopPropagation();const action=(menu_action.getAttribute('data-action')||'').toLowerCase();const row=menu_action.closest?.(ui.row);if(!row){this.close_dropdown(menu_action);return;}if('add_after'===action){// Add empty row after current |
| 619 |
const prev_count=this.get_list(panel)?.children.length||0;this.append_row(panel,{label:'',value:'',selected:false});// Move the newly added last row just after current row to preserve "add after" |
| 620 |
const list=this.get_list(panel);if(list&&list.lastElementChild&&list.lastElementChild!==row){this.insert_after(list.lastElementChild,row);}this.commit_options(panel);this.sync_value_inputs_visibility(panel);}else if('duplicate'===action){const lbl=(row.querySelector(ui.label)||{}).value||'';const val=(row.querySelector(ui.value)||{}).value||'';const sel=!!(row.querySelector(ui.toggle)||{}).checked;this.append_row(panel,{label:lbl,value:val,selected:sel,uid:this.make_uid()});// Place the new row right after the current. |
| 621 |
const list=this.get_list(panel);if(list&&list.lastElementChild&&list.lastElementChild!==row){this.insert_after(list.lastElementChild,row);}this.enforce_single_default(panel,null);this.commit_options(panel);this.sync_value_inputs_visibility(panel);}else if('remove'===action){if(row&&row.parentNode)row.parentNode.removeChild(row);this.commit_options(panel);this.sync_value_inputs_visibility(panel);}this.close_dropdown(menu_action);return;}},true);// Input delegation. |
| 622 |
root.addEventListener('input',e=>{const panel=get_panel(e.target);if(!panel){return;}const ui=this.ui;const is_label_or_value=e.target.classList?.contains('wpbc_bfb__opt-label')||e.target.classList?.contains('wpbc_bfb__opt-value');const is_toggle=e.target.classList?.contains('wpbc_bfb__opt-selected-chk');const is_multiple=e.target.matches?.(ui.multiple_chk);const is_default_text=e.target.matches?.(ui.default_text);const is_value_differs=e.target.matches?.(ui.value_differs_chk);// Handle "value differs" toggle live |
| 623 |
if(is_value_differs){this.sync_value_inputs_visibility(panel);this.commit_options(panel);return;}// Track when the user edits VALUE explicitly |
| 624 |
if(e.target.classList?.contains('wpbc_bfb__opt-value')){const row=e.target.closest(this.ui.row);this.mark_row_value_user_touched(row);// Keep the cache updated so toggling OFF/ON later restores the latest custom value |
| 625 |
e.target.dataset.cached_value=e.target.value||'';}// Auto-fill VALUE from LABEL if value is fresh (and differs is ON); if differs is OFF, we mirror anyway in commit |
| 626 |
if(e.target.classList?.contains('wpbc_bfb__opt-label')){const row=e.target.closest(ui.row);const val_in=row?.querySelector(ui.value);const differs=this.is_value_differs_enabled(panel);if(val_in){if(!differs){// single-input mode: mirror human label with minimal escaping |
| 627 |
val_in.value=this.build_value_from_label(e.target.value,false);}else if(!this.is_row_value_user_touched(row)){// separate-value mode, only while fresh |
| 628 |
val_in.value=this.build_value_from_label(e.target.value,true);}}}if(is_label_or_value||is_toggle||is_multiple){if(is_toggle)e.target.setAttribute('aria-checked',e.target.checked?'true':'false');if(is_toggle||is_multiple)this.enforce_single_default(panel,is_toggle?e.target:null);this.commit_options(panel);}if(is_default_text){this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);const holder=this.get_holder(panel);if(holder){holder.dispatchEvent(new Event('input',{bubbles:true}));holder.dispatchEvent(new Event('change',{bubbles:true}));}}},true);// Change delegation |
| 629 |
root.addEventListener('change',e=>{const panel=get_panel(e.target);if(!panel)return;const ui=this.ui;const is_toggle=e.target.classList?.contains('wpbc_bfb__opt-selected-chk');const is_multi=e.target.matches?.(ui.multiple_chk);if(!is_toggle&&!is_multi)return;if(is_toggle)e.target.setAttribute('aria-checked',e.target.checked?'true':'false');this.enforce_single_default(panel,is_toggle?e.target:null);this.commit_options(panel);},true);// Lazy bootstrap |
| 630 |
root.addEventListener('mouseenter',e=>{const panel=get_panel(e.target);if(panel&&e.target?.closest?.(this.ui.list))this.bootstrap_panel(panel);},true);root.addEventListener('mousedown',e=>{const panel=get_panel(e.target);if(panel&&e.target?.closest?.(this.ui.drag_handle))this.bootstrap_panel(panel);},true);}};try{Core.WPBC_BFB_Select_Base.wire_once();}catch(_){}// Try immediately (if root is already in DOM), then again on DOMContentLoaded. |
| 631 |
Core.WPBC_BFB_Select_Base.wire_root_listeners();document.addEventListener('DOMContentLoaded',()=>{Core.WPBC_BFB_Select_Base.wire_root_listeners();});})(window);// --------------------------------------------------------------------------------------------------------------------- |
| 632 |
// == File /includes/page-form-builder/_out/core/bfb-ui.js == | 2025-09-10 15:47 |
| 633 |
// --------------------------------------------------------------------------------------------------------------------- |
| 634 |
(function(w,d){'use strict';// Single global namespace (idempotent & load-order safe). |
| 635 |
const Core=w.WPBC_BFB_Core=w.WPBC_BFB_Core||{};const UI=Core.UI=Core.UI||{};// --- Highlight Element, like Generator brn - Tiny UI helpers ------------------------------------ |
| 636 |
UI._pulse_timers=UI._pulse_timers||new Map();// el -> timer_id |
| 637 |
UI._pulse_meta=UI._pulse_meta||new Map();// el -> { token, last_ts, debounce_id, color_set } |
| 638 |
// Pulse tuning (milliseconds). |
| 639 |
UI.PULSE_THROTTLE_MS=Number.isFinite(UI.PULSE_THROTTLE_MS)?UI.PULSE_THROTTLE_MS:500;UI.PULSE_DEBOUNCE_MS=Number.isFinite(UI.PULSE_DEBOUNCE_MS)?UI.PULSE_DEBOUNCE_MS:750;// Debounce STRUCTURE_CHANGE for continuous inspector controls (sliders / scrubbing). |
| 640 |
// Tune: 180..350 is usually a sweet spot. |
| 641 |
UI.STRUCTURE_CHANGE_DEBOUNCE_MS=Number.isFinite(UI.STRUCTURE_CHANGE_DEBOUNCE_MS)?UI.STRUCTURE_CHANGE_DEBOUNCE_MS:180;// Change this to tune speed: 50..120 ms is a good range. Can be configured in <div data-len-group data-len-throttle="180">...</div>. |
| 642 |
UI.VALUE_SLIDER_THROTTLE_MS=Number.isFinite(UI.VALUE_SLIDER_THROTTLE_MS)?UI.VALUE_SLIDER_THROTTLE_MS:120;/**
|
| 643 |
* Cancel any running pulse sequence for an element.
|
| 644 |
* Uses token invalidation so already-scheduled callbacks become no-ops.
|
| 645 |
*
|
| 646 |
* @param {HTMLElement} el
|
| 647 |
*/UI.cancel_pulse=function(el){if(!el){return;}try{clearTimeout(UI._pulse_timers.get(el));}catch(_){}UI._pulse_timers.delete(el);var meta=UI._pulse_meta.get(el)||{};meta.token=(Number.isFinite(meta.token)?meta.token:0)+1;meta.color_set=false;try{el.classList.remove('wpbc_bfb__scroll-pulse','wpbc_bfb__highlight-pulse');}catch(_){}try{el.style.removeProperty('--wpbc-bfb-pulse-color');}catch(_){}UI._pulse_meta.set(el,meta);try{clearTimeout(meta.debounce_id);}catch(_){}meta.debounce_id=0;};/**
|
| 648 |
* Force-restart a CSS animation on a class.
|
| 649 |
* @param {HTMLElement} el
|
| 650 |
* @param {string} cls
|
| 651 |
*/UI._restart_css_animation=function(el,cls){if(!el){return;}try{el.classList.remove(cls);}catch(_){}// Force reflow so the next add() retriggers the keyframes. |
| 652 |
void el.offsetWidth;try{el.classList.add(cls);}catch(_){}};/**
|
| 653 |
Single pulse (back-compat).
|
| 654 |
@param {HTMLElement} el
|
| 655 |
@param {number} dur_ms
|
| 656 |
*/UI.pulse_once=function(el,dur_ms){if(!el){return;}var cls='wpbc_bfb__scroll-pulse';var ms=Number.isFinite(dur_ms)?dur_ms:700;UI.cancel_pulse(el);var meta=UI._pulse_meta.get(el)||{};var token=(Number.isFinite(meta.token)?meta.token:0)+1;meta.token=token;UI._pulse_meta.set(el,meta);UI._restart_css_animation(el,cls);var t=setTimeout(function(){// ignore if a newer pulse started. |
| 657 |
var m=UI._pulse_meta.get(el)||{};if(m.token!==token){return;}try{el.classList.remove(cls);}catch(_){}UI._pulse_timers.delete(el);},ms);UI._pulse_timers.set(el,t);};/**
|
| 658 |
Multi-blink sequence with optional per-call color override.
|
| 659 |
@param {HTMLElement} el
|
| 660 |
@param {number} [times=3]
|
| 661 |
@param {number} [on_ms=280]
|
| 662 |
@param {number} [off_ms=180]
|
| 663 |
@param {string} [hex_color] Optional CSS color (e.g. '#ff4d4f' or 'rgb(...)').
|
| 664 |
*/UI.pulse_sequence=function(el,times,on_ms,off_ms,hex_color){if(!el||!d.body.contains(el)){return;}var cls='wpbc_bfb__highlight-pulse';var count=Number.isFinite(times)?times:2;var on=Number.isFinite(on_ms)?on_ms:280;var off=Number.isFinite(off_ms)?off_ms:180;// Throttle: avoid reflow spam if called repeatedly while typing/dragging. |
| 665 |
var meta=UI._pulse_meta.get(el)||{};var now=Date.now();var throttle_ms=Number.isFinite(UI.PULSE_THROTTLE_MS)?UI.PULSE_THROTTLE_MS:120;if(Number.isFinite(meta.last_ts)&&now-meta.last_ts<throttle_ms){return;}meta.last_ts=now;// cancel any running pulse and reset class (token invalidation). |
| 666 |
UI.cancel_pulse(el);// new token for this run |
| 667 |
var token=(Number.isFinite(meta.token)?meta.token:0)+1;meta.token=token;var have_color=!!hex_color&&typeof hex_color==='string';if(have_color){try{el.style.setProperty('--wpbc-bfb-pulse-color',hex_color);}catch(_){}meta.color_set=true;}UI._pulse_meta.set(el,meta);var i=0;(function tick(){var m=UI._pulse_meta.get(el)||{};if(m.token!==token){// canceled/replaced |
| 668 |
return;}if(i>=count){UI._pulse_timers.delete(el);if(have_color){try{el.style.removeProperty('--wpbc-bfb-pulse-color');}catch(_){}}return;}UI._restart_css_animation(el,cls);UI._pulse_timers.set(el,setTimeout(function(){// ON -> OFF |
| 669 |
var m2=UI._pulse_meta.get(el)||{};if(m2.token!==token){return;}try{el.classList.remove(cls);}catch(_){}UI._pulse_timers.set(el,setTimeout(function(){// OFF gap -> next |
| 670 |
var m3=UI._pulse_meta.get(el)||{};if(m3.token!==token){return;}i++;tick();},off));},on));})();};/**
|
| 671 |
* Debounced query + pulse.
|
| 672 |
* Useful for `input` events (sliders / typing) to avoid forced reflow spam.
|
| 673 |
*
|
| 674 |
* @param {HTMLElement|string} root_or_selector
|
| 675 |
* @param {string} selector
|
| 676 |
* @param {number} wait_ms
|
| 677 |
* @param {number} [a]
|
| 678 |
* @param {number} [b]
|
| 679 |
* @param {number} [c]
|
| 680 |
* @param {string} [color]
|
| 681 |
*/UI.pulse_query_debounced=function(root_or_selector,selector,wait_ms,a,b,c,color){var root=typeof root_or_selector==='string'?d:root_or_selector||d;var sel=typeof root_or_selector==='string'?root_or_selector:selector;if(!sel){return;}var el=root.querySelector(sel);if(!el){return;}var def_ms=Number.isFinite(UI.PULSE_DEBOUNCE_MS)?UI.PULSE_DEBOUNCE_MS:120;var ms=Number.isFinite(wait_ms)?wait_ms:def_ms;var meta=UI._pulse_meta.get(el)||{};try{clearTimeout(meta.debounce_id);}catch(_){}meta.debounce_id=setTimeout(function(){UI.pulse_sequence(el,a,b,c,color);},ms);UI._pulse_meta.set(el,meta);};/**
|
| 682 |
Query + pulse:
|
| 683 |
(BC) If only 3rd arg is a number and no 4th/5th -> single long pulse.
|
| 684 |
Otherwise -> strong sequence (defaults 3×280/180).
|
| 685 |
Optional 6th arg: color.
|
| 686 |
@param {HTMLElement|string} root_or_selector
|
| 687 |
@param {string} [selector]
|
| 688 |
@param {number} [a]
|
| 689 |
@param {number} [b]
|
| 690 |
|
| 691 |
@param {number} [c]
|
| 692 |
|
| 693 |
@param {string} [color]
|
| 694 |
*/UI.pulse_query=function(root_or_selector,selector,a,b,c,color){var root=typeof root_or_selector==='string'?d:root_or_selector||d;var sel=typeof root_or_selector==='string'?root_or_selector:selector;if(!sel){return;}var el=root.querySelector(sel);if(!el){return;}// Back-compat: UI.pulseQuery(root, sel, dur_ms) |
| 695 |
if(Number.isFinite(a)&&b===undefined&&c===undefined){return UI.pulse_once(el,a);}// New: sequence; params optional; supports optional color. |
| 696 |
UI.pulse_sequence(el,a,b,c,color);};/**
|
| 697 |
Convenience helper (snake_case) to call a strong pulse with options.
|
| 698 |
|
| 699 |
@param {HTMLElement} el
|
| 700 |
|
| 701 |
@param {Object} [opts]
|
| 702 |
|
| 703 |
@param {number} [opts.times=3]
|
| 704 |
|
| 705 |
@param {number} [opts.on_ms=280]
|
| 706 |
|
| 707 |
@param {number} [opts.off_ms=180]
|
| 708 |
|
| 709 |
@param {string} [opts.color]
|
| 710 |
*/UI.pulse_sequence_strong=function(el,opts){opts=opts||{};UI.pulse_sequence(el,Number.isFinite(opts.times)?opts.times:3,Number.isFinite(opts.on_ms)?opts.on_ms:280,Number.isFinite(opts.off_ms)?opts.off_ms:180,opts.color);};/**
|
| 711 |
* Base class for BFB modules.
|
| 712 |
*/UI.WPBC_BFB_Module=class{/** @param {WPBC_Form_Builder} builder */constructor(builder){this.builder=builder;}/** Initialize the module. */init(){}/** Cleanup the module. */destroy(){}};/**
|
| 713 |
* Central overlay/controls manager for fields/sections.
|
| 714 |
* Pure UI composition; all actions route back into the builder instance.
|
| 715 |
*/UI.WPBC_BFB_Overlay=class{/**
|
| 716 |
* Ensure an overlay exists and is wired up on the element.
|
| 717 |
* @param {WPBC_Form_Builder} builder
|
| 718 |
* @param {HTMLElement} el - field or section element
|
| 719 |
*/static ensure(builder,el){if(!el){return;}const isSection=el.classList.contains('wpbc_bfb__section');// let overlay = el.querySelector( Core.WPBC_BFB_DOM.SELECTORS.overlay ); |
| 720 |
let overlay=el.querySelector(`:scope > ${Core.WPBC_BFB_DOM.SELECTORS.overlay}`);if(!overlay){overlay=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__overlay-controls');el.prepend(overlay);}// Drag handle. |
| 721 |
if(!overlay.querySelector('.wpbc_bfb__drag-handle')){const dragClass=isSection?'wpbc_bfb__drag-handle section-drag-handle':'wpbc_bfb__drag-handle';overlay.appendChild(Core.WPBC_Form_Builder_Helper.create_element('span',dragClass,'<span class="wpbc_icn_drag_indicator"></span>'));}// SETTINGS button (shown for both fields & sections). |
| 722 |
if(!overlay.querySelector('.wpbc_bfb__settings-btn')){const settings_btn=Core.WPBC_Form_Builder_Helper.create_element('button','wpbc_bfb__settings-btn','<i class="menu_icon icon-1x wpbc_icn_settings"></i>');settings_btn.type='button';settings_btn.title='Open settings';settings_btn.onclick=e=>{e.preventDefault();// Select THIS element and scroll it into view. |
| 723 |
builder.select_field(el,{scrollIntoView:true});// Auto-open Inspector from the overlay “Settings” button. |
| 724 |
wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',{panel_id:'wpbc_bfb__inspector',tab_id:'wpbc_tab_inspector'});// Try to bring the inspector into view / focus first input. |
| 725 |
const ins=document.getElementById('wpbc_bfb__inspector');if(ins){ins.scrollIntoView({behavior:'smooth',block:'nearest'});// Focus first interactive control (best-effort). |
| 726 |
setTimeout(()=>{const focusable=ins.querySelector('input,select,textarea,button,[contenteditable],[tabindex]:not([tabindex="-1"])');focusable?.focus?.();},260);}};overlay.appendChild(settings_btn);}overlay.setAttribute('role','toolbar');overlay.setAttribute('aria-label',el.classList.contains('wpbc_bfb__section')?'Section tools':'Field tools');return overlay;}};/**
|
| 727 |
* WPBC Layout Chips helper - visual layout picker (chips), e.g., "50%/50%", to a section overlay.
|
| 728 |
*
|
| 729 |
* Renders Equal/Presets/Custom chips into a host container and wires them to apply the layout.
|
| 730 |
*/UI.WPBC_BFB_Layout_Chips=class{/** Read per-column min (px) from CSS var set by the guard. */static _get_col_min_px(col){const v=getComputedStyle(col).getPropertyValue('--wpbc-col-min')||'0';const n=parseFloat(v);return Number.isFinite(n)?Math.max(0,n):0;}/**
|
| 731 |
* Turn raw weights (e.g. [1,1], [2,1,1]) into effective "available-%" bases that
|
| 732 |
* (a) sum to the row's available %, and (b) meet every column's min px.
|
| 733 |
* Returns an array of bases (numbers) or null if impossible to satisfy mins.
|
| 734 |
*/static _fit_weights_respecting_min(builder,row,weights){const cols=Array.from(row.querySelectorAll(':scope > .wpbc_bfb__column'));const n=cols.length;if(!n)return null;if(!Array.isArray(weights)||weights.length!==n)return null;// available % after gaps (from LayoutService) |
| 735 |
const gp=builder.col_gap_percent;const eff=builder.layout.compute_effective_bases_from_row(row,gp);const availPct=eff.available;// e.g. 94 if 2 cols and 3% gap |
| 736 |
const rowPx=row.getBoundingClientRect().width;const availPx=rowPx*(availPct/100);// collect minima in % of "available" |
| 737 |
const minPct=cols.map(c=>{const minPx=UI.WPBC_BFB_Layout_Chips._get_col_min_px(c);if(availPx<=0)return 0;return minPx/availPx*availPct;});// If mins alone don't fit, bail. |
| 738 |
const sumMin=minPct.reduce((a,b)=>a+b,0);if(sumMin>availPct-1e-6){return null;// impossible to respect mins; don't apply preset |
| 739 |
}// Target percentages from weights, normalized to availPct. |
| 740 |
const wSum=weights.reduce((a,w)=>a+(Number(w)||0),0)||n;const targetPct=weights.map(w=>(Number(w)||0)/wSum*availPct);// Lock columns that would be below min, then distribute the remainder |
| 741 |
// across the remaining columns proportionally to their targetPct. |
| 742 |
const locked=new Array(n).fill(false);let lockedSum=0;for(let i=0;i<n;i++){if(targetPct[i]<minPct[i]){locked[i]=true;lockedSum+=minPct[i];}}let remaining=availPct-lockedSum;const freeIdx=[];let freeTargetSum=0;for(let i=0;i<n;i++){if(!locked[i]){freeIdx.push(i);freeTargetSum+=targetPct[i];}}const result=new Array(n).fill(0);// Seed locked with their minima. |
| 743 |
for(let i=0;i<n;i++){if(locked[i])result[i]=minPct[i];}if(freeIdx.length===0){// everything locked exactly at min; any leftover (shouldn't happen) |
| 744 |
// would be ignored to keep simplicity and stability. |
| 745 |
return result;}if(remaining<=0){// nothing left to distribute; keep exactly mins on locked, |
| 746 |
// nothing for free (degenerate but consistent) |
| 747 |
return result;}if(freeTargetSum<=0){// distribute equally among free columns |
| 748 |
const each=remaining/freeIdx.length;freeIdx.forEach(i=>result[i]=each);return result;}// Distribute remaining proportionally to free columns' targetPct |
| 749 |
freeIdx.forEach(i=>{result[i]=remaining*(targetPct[i]/freeTargetSum);});return result;}/** Apply a preset but guard it by minima; returns true if applied, false if skipped. */static _apply_preset_with_min_guard(builder,section_el,weights){const row=section_el.querySelector(':scope > .wpbc_bfb__row');if(!row)return false;const fitted=UI.WPBC_BFB_Layout_Chips._fit_weights_respecting_min(builder,row,weights);if(!fitted){builder?._announce?.('Not enough space for this layout because of fields’ minimum widths.');return false;}// `fitted` already sums to the row’s available %, so we can apply bases directly. |
| 750 |
builder.layout.apply_bases_to_row(row,fitted);return true;}/**
|
| 751 |
* Build and append layout chips for a section.
|
| 752 |
*
|
| 753 |
* @param {WPBC_Form_Builder} builder - The form builder instance.
|
| 754 |
* @param {HTMLElement} section_el - The .wpbc_bfb__section element.
|
| 755 |
* @param {HTMLElement} host_el - Container where chips should be rendered.
|
| 756 |
* @returns {void}
|
| 757 |
*/static render_for_section(builder,section_el,host_el){if(!builder||!section_el||!host_el){return;}const row=section_el.querySelector(':scope > .wpbc_bfb__row');if(!row){return;}const cols=row.querySelectorAll(':scope > .wpbc_bfb__column').length||1;// Clear host. |
| 758 |
host_el.innerHTML='';// Equal chip. |
| 759 |
host_el.appendChild(UI.WPBC_BFB_Layout_Chips._make_chip(builder,section_el,Array(cols).fill(1),'Equal'));// Presets based on column count. |
| 760 |
const presets=builder.layout.build_presets_for_columns(cols);presets.forEach(weights=>{host_el.appendChild(UI.WPBC_BFB_Layout_Chips._make_chip(builder,section_el,weights,null));});// Custom chip. |
| 761 |
const customBtn=document.createElement('button');customBtn.type='button';customBtn.className='wpbc_bfb__layout_chip';customBtn.textContent='Custom…';customBtn.title=`Enter ${cols} percentages`;customBtn.addEventListener('click',()=>{const example=cols===2?'50,50':cols===3?'20,60,20':'25,25,25,25';const text=prompt(`Enter ${cols} percentages (comma or space separated):`,example);if(text==null)return;const weights=builder.layout.parse_weights(text);if(weights.length!==cols){alert(`Please enter exactly ${cols} numbers.`);return;}// OLD: |
| 762 |
// builder.layout.apply_layout_preset( section_el, weights, builder.col_gap_percent ); |
| 763 |
// Guarded apply:. |
| 764 |
if(!UI.WPBC_BFB_Layout_Chips._apply_preset_with_min_guard(builder,section_el,weights)){return;}host_el.querySelectorAll('.wpbc_bfb__layout_chip').forEach(c=>c.classList.remove('is-active'));customBtn.classList.add('is-active');});host_el.appendChild(customBtn);}/**
|
| 765 |
* Create a single layout chip button.
|
| 766 |
*
|
| 767 |
* @private
|
| 768 |
* @param {WPBC_Form_Builder} builder
|
| 769 |
* @param {HTMLElement} section_el
|
| 770 |
* @param {number[]} weights
|
| 771 |
* @param {string|null} label
|
| 772 |
* @returns {HTMLButtonElement}
|
| 773 |
*/static _make_chip(builder,section_el,weights,label=null){const btn=document.createElement('button');btn.type='button';btn.className='wpbc_bfb__layout_chip';const title=label||builder.layout.format_preset_label(weights);btn.title=title;// Visual miniature. |
| 774 |
const vis=document.createElement('div');vis.className='wpbc_bfb__layout_chip-vis';const sum=weights.reduce((a,b)=>a+(Number(b)||0),0)||1;weights.forEach(w=>{const bar=document.createElement('span');bar.style.flex=`0 0 calc( ${((Number(w)||0)/sum*100).toFixed(3)}% - 1.5px )`;vis.appendChild(bar);});btn.appendChild(vis);const txt=document.createElement('span');txt.className='wpbc_bfb__layout_chip-label';txt.textContent=label||builder.layout.format_preset_label(weights);btn.appendChild(txt);btn.addEventListener('click',()=>{// OLD: |
| 775 |
// builder.layout.apply_layout_preset( section_el, weights, builder.col_gap_percent ); |
| 776 |
// NEW: |
| 777 |
if(!UI.WPBC_BFB_Layout_Chips._apply_preset_with_min_guard(builder,section_el,weights)){return;// do not toggle active if we didn't change layout |
| 778 |
}btn.parentElement?.querySelectorAll('.wpbc_bfb__layout_chip').forEach(c=>c.classList.remove('is-active'));btn.classList.add('is-active');});return btn;}};/**
|
| 779 |
* Selection controller for fields and announcements.
|
| 780 |
*/UI.WPBC_BFB_Selection_Controller=class extends UI.WPBC_BFB_Module{init(){this._selected_uid=null;this.builder.select_field=this.select_field.bind(this);this.builder.get_selected_field=this.get_selected_field.bind(this);this._on_clear=this.on_clear.bind(this);// Centralized delete command used by keyboard + inspector + overlay. |
| 781 |
this.builder.delete_item=el=>{if(!el){return null;}const b=this.builder;const neighbor=b._find_neighbor_selectable?.(el)||null;el.remove();// Use local Core constants (not a global) to avoid ReferenceErrors. |
| 782 |
b.bus?.emit?.(Core.WPBC_BFB_Events.FIELD_REMOVE,{el,id:el?.dataset?.id,uid:el?.dataset?.uid});b.usage?.update_palette_ui?.();// Notify generic structure listeners, too: |
| 783 |
b.bus?.emit?.(Core.WPBC_BFB_Events.STRUCTURE_CHANGE,{reason:'delete',el});// Defer selection a tick so the DOM is fully settled before Inspector hydrates. |
| 784 |
requestAnimationFrame(()=>{// This calls inspector.bind_to_field() and opens the Inspector panel. |
| 785 |
b.select_field?.(neighbor||null,{scrollIntoView:!!neighbor});});return neighbor;};this.builder.bus.on(Core.WPBC_BFB_Events.CLEAR_SELECTION,this._on_clear);this.builder.bus.on(Core.WPBC_BFB_Events.STRUCTURE_LOADED,this._on_clear);// delegated click selection (capture ensures we win before bubbling to containers). |
| 786 |
this._on_canvas_click=this._handle_canvas_click.bind(this);this.builder.pages_container.addEventListener('click',this._on_canvas_click,true);}destroy(){this.builder.bus.off(Core.WPBC_BFB_Events.CLEAR_SELECTION,this._on_clear);if(this._on_canvas_click){this.builder.pages_container.removeEventListener('click',this._on_canvas_click,true);this._on_canvas_click=null;}}/**
|
| 787 |
* Delegated canvas click -> select closest field/section (inner beats outer).
|
| 788 |
* @private
|
| 789 |
* @param {MouseEvent} e
|
| 790 |
*/_handle_canvas_click(e){const root=this.builder.pages_container;if(!root)return;// Ignore clicks on controls/handles/resizers, etc. |
| 791 |
const IGNORE=['.wpbc_bfb__overlay-controls','.wpbc_bfb__layout_picker','.wpbc_bfb__drag-handle','.wpbc_bfb__field-remove-btn','.wpbc_bfb__field-move-up','.wpbc_bfb__field-move-down','.wpbc_bfb__column-resizer'].join(',');if(e.target.closest(IGNORE)){return;// let those controls do their own thing. |
| 792 |
}// Find the closest selectable (field OR section) from the click target. |
| 793 |
let hit=e.target.closest?.(`${Core.WPBC_BFB_DOM.SELECTORS.validField}, ${Core.WPBC_BFB_DOM.SELECTORS.section}, .wpbc_bfb__column`);if(!hit||!root.contains(hit)){this.select_field(null);// Clear selection on blank click. |
| 794 |
return;// Empty space is handled elsewhere. |
| 795 |
}// NEW: if user clicked a COLUMN -> remember tab key on its SECTION, but still select the section. |
| 796 |
let preselect_tab_key=null;if(hit.classList.contains('wpbc_bfb__column')){const row=hit.closest('.wpbc_bfb__row');const cols=row?Array.from(row.querySelectorAll(':scope > .wpbc_bfb__column')):[];const idx=Math.max(0,cols.indexOf(hit));const sec=hit.closest('.wpbc_bfb__section');if(sec){preselect_tab_key=String(idx+1);// tabs are 1-based in ui-column-styles.js |
| 797 |
// Hint for the renderer (it reads this BEFORE rendering and restores the tab). |
| 798 |
sec.dataset.col_styles_active_tab=preselect_tab_key;// promote selection to the section (same UX as before). |
| 799 |
hit=sec;// NEW: visually mark which column is being edited |
| 800 |
if(UI&&UI.WPBC_BFB_Column_Styles&&UI.WPBC_BFB_Column_Styles.set_selected_col_flag){UI.WPBC_BFB_Column_Styles.set_selected_col_flag(sec,preselect_tab_key);}}}// Select and stop bubbling so outer containers don’t reselect a parent. |
| 801 |
this.select_field(hit);e.stopPropagation();// Also set the tab after the inspector renders (works even if it was already open). |
| 802 |
if(preselect_tab_key){(window.requestAnimationFrame||setTimeout)(function(){try{const ins=document.getElementById('wpbc_bfb__inspector');const tabs=ins&&ins.querySelector('[data-bfb-slot="column_styles"] [data-wpbc-tabs]');if(tabs&&window.wpbc_ui_tabs&&typeof window.wpbc_ui_tabs.set_active==='function'){window.wpbc_ui_tabs.set_active(tabs,preselect_tab_key);}}catch(_e){}},0);// Politely ask the Inspector to focus/open the "Column Styles" group and tab. |
| 803 |
wpbc_bfb__dispatch_event_safe('wpbc_bfb:inspector_focus',{group:'column_styles',tab_key:preselect_tab_key});}}/**
|
| 804 |
* Select a field element or clear selection.
|
| 805 |
*
|
| 806 |
* @param {HTMLElement|null} field_el
|
| 807 |
* @param {{scrollIntoView?: boolean}} [opts = {}]
|
| 808 |
*/select_field(field_el,{scrollIntoView=false}={}){const root=this.builder.pages_container;const prevEl=this.get_selected_field?.()||null;// the one we’re leaving. |
| 809 |
// Ignore elements not in the canvas. |
| 810 |
if(field_el&&!root.contains(field_el)){field_el=null;// treat as "no selection". |
| 811 |
}// NEW: if we are leaving a section, clear its column highlight |
| 812 |
if(prevEl&&prevEl!==field_el&&prevEl.classList?.contains('wpbc_bfb__section')&&UI?.WPBC_BFB_Column_Styles?.clear_selected_col_flag){UI.WPBC_BFB_Column_Styles.clear_selected_col_flag(prevEl);}// If we're leaving a field, permanently stop auto-name for it. |
| 813 |
if(prevEl&&prevEl!==field_el&&prevEl.classList?.contains('wpbc_bfb__field')){prevEl.dataset.autoname='0';prevEl.dataset.fresh='0';}root.querySelectorAll('.is-selected').forEach(n=>{n.classList.remove('is-selected');});if(!field_el){const prev=this._selected_uid||null;this._selected_uid=null;this.builder.inspector?.clear?.();root.classList.remove('has-selection');this.builder.bus.emit(Core.WPBC_BFB_Events.CLEAR_SELECTION,{prev_uid:prev,source:'builder'});// Auto-open "Add Fields" when nothing is selected. |
| 814 |
wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',{panel_id:'wpbc_bfb__palette_add_new',tab_id:'wpbc_tab_library'});return;}field_el.classList.add('is-selected');this._selected_uid=field_el.getAttribute('data-uid')||null;// Fallback: ensure sections announce themselves as type="section". |
| 815 |
if(field_el.classList.contains('wpbc_bfb__section')&&!field_el.dataset.type){field_el.dataset.type='section';}if(scrollIntoView){field_el.scrollIntoView({behavior:'smooth',block:'center'});}this.builder.inspector?.bind_to_field?.(field_el);// Fallback: ensure inspector enhancers (incl. ValueSlider) run every bind. |
| 816 |
try{const ins=document.getElementById('wpbc_bfb__inspector')||document.querySelector('.wpbc_bfb__inspector');if(ins){UI.InspectorEnhancers?.scan?.(ins);// runs all enhancers |
| 817 |
UI.WPBC_BFB_ValueSlider?.init_on?.(ins);// extra belt-and-suspenders |
| 818 |
}}catch(_){}// NEW: when selecting a section, reflect its active tab as the highlighted column. |
| 819 |
if(field_el.classList.contains('wpbc_bfb__section')&&UI?.WPBC_BFB_Column_Styles?.set_selected_col_flag){var k=field_el.dataset&&field_el.dataset.col_styles_active_tab?field_el.dataset.col_styles_active_tab:'1';UI.WPBC_BFB_Column_Styles.set_selected_col_flag(field_el,k);}// Keep sections & fields in the same flow: |
| 820 |
// 1) Generic hydrator for simple dataset-backed controls. |
| 821 |
if(field_el){UI.WPBC_BFB_Inspector_Bridge._generic_hydrate_controls?.(this.builder,field_el);UI.WPBC_BFB_Inspector_Bridge._hydrate_special_controls?.(this.builder,field_el);}// Auto-open Inspector when a user selects a field/section . |
| 822 |
wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',{panel_id:'wpbc_bfb__inspector',tab_id:'wpbc_tab_inspector'});root.classList.add('has-selection');this.builder.bus.emit(Core.WPBC_BFB_Events.SELECT,{uid:this._selected_uid,el:field_el});const label=field_el?.querySelector('.wpbc_bfb__field-label')?.textContent||(field_el.classList.contains('wpbc_bfb__section')?'section':'')||field_el?.dataset?.id||'item';this.builder._announce('Selected '+label+'.');}/** @returns {HTMLElement|null} */get_selected_field(){if(!this._selected_uid){return null;}const esc_attr=Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(this._selected_uid);return this.builder.pages_container.querySelector(`.wpbc_bfb__field[data-uid="${esc_attr}"], .wpbc_bfb__section[data-uid="${esc_attr}"]`);}/** @param {CustomEvent} ev */on_clear(ev){const src=ev?.detail?.source??ev?.source;if(src!=='builder'){this.select_field(null);}}};/**
|
| 823 |
* Bridges the builder with the Inspector and sanitizes id/name edits.
|
| 824 |
*/UI.WPBC_BFB_Inspector_Bridge=class extends UI.WPBC_BFB_Module{init(){this._attach_inspector();this._bind_id_sanitizer();this._open_inspector_after_field_added();this._bind_focus_shortcuts();}_attach_inspector(){const b=this.builder;const attach=()=>{if(typeof window.WPBC_BFB_Inspector==='function'){b.inspector=new WPBC_BFB_Inspector(document.getElementById('wpbc_bfb__inspector'),b);this._bind_id_sanitizer();document.removeEventListener('wpbc_bfb_inspector_ready',attach);}};// Ensure we bind after late ready as well. |
| 825 |
if(typeof window.WPBC_BFB_Inspector==='function'){attach();}else{b.inspector={bind_to_field(){},clear(){}};document.addEventListener('wpbc_bfb_inspector_ready',attach);setTimeout(attach,0);}}/**
|
| 826 |
* Listen for "focus" hints from the canvas and open the right group/tab.
|
| 827 |
* - Supports: group === 'column_styles'
|
| 828 |
* - Also scrolls the group into view.
|
| 829 |
*/_bind_focus_shortcuts(){/** @param {CustomEvent} e */const on_focus=e=>{try{const grp_key=e&&e.detail&&e.detail.group;const tab_key=e&&e.detail&&e.detail.tab_key;if(!grp_key){return;}const ins=document.getElementById('wpbc_bfb__inspector')||document.querySelector('.wpbc_bfb__inspector');if(!ins){return;}if(grp_key==='column_styles'){// Find the Column Styles slot/group. |
| 830 |
const slot=ins.querySelector('[data-bfb-slot="column_styles"]')||ins.querySelector('[data-inspector-group-key="column_styles"]');if(slot){// Open collapsible container if present. |
| 831 |
const group_wrap=slot.closest('.inspector__group')||slot.closest('[data-inspector-group]');if(group_wrap&&!group_wrap.classList.contains('is-open')){group_wrap.classList.add('is-open');// Mirror ARIA state if your header uses aria-expanded. |
| 832 |
const header_btn=group_wrap.querySelector('[aria-expanded]');if(header_btn){header_btn.setAttribute('aria-expanded','true');}}// Optional: set the requested tab key if tabs exist in this group. |
| 833 |
if(tab_key){const tabs=slot.querySelector('[data-wpbc-tabs]');if(tabs&&window.wpbc_ui_tabs&&typeof window.wpbc_ui_tabs.set_active==='function'){window.wpbc_ui_tabs.set_active(tabs,String(tab_key));}}// Bring into view for convenience. |
| 834 |
try{// Uncomment (Only if needed) this to AUTO SCROLL to specific COLUMN in the section:. |
| 835 |
// slot.scrollIntoView( { behavior: 'smooth', block: 'nearest' } ); |
| 836 |
}catch(_e){}}}}catch(_e){}};this._on_inspector_focus=on_focus;document.addEventListener('wpbc_bfb:inspector_focus',on_focus,true);}destroy(){try{if(this._on_inspector_focus){document.removeEventListener('wpbc_bfb:inspector_focus',this._on_inspector_focus,true);this._on_inspector_focus=null;}}catch(_e){}}/**
|
| 837 |
* Hydrate inspector inputs for "special" keys that we handle explicitly.
|
| 838 |
* Works for both fields and sections.
|
| 839 |
* @param {WPBC_Form_Builder} builder
|
| 840 |
* @param {HTMLElement} sel
|
| 841 |
*/static _hydrate_special_controls(builder,sel){const ins=document.getElementById('wpbc_bfb__inspector');if(!ins||!sel)return;const setVal=(key,val)=>{const ctrl=ins.querySelector(`[data-inspector-key="${key}"]`);if(ctrl&&'value'in ctrl)ctrl.value=String(val??'');};// Internal id / name / public html_id. |
| 842 |
setVal('id',sel.getAttribute('data-id')||'');setVal('name',sel.getAttribute('data-name')||'');setVal('html_id',sel.getAttribute('data-html_id')||'');// Section-only extras are harmless to set for fields (controls may not exist). |
| 843 |
setVal('cssclass',sel.getAttribute('data-cssclass')||'');setVal('label',sel.getAttribute('data-label')||'');}/**
|
| 844 |
* Hydrate inspector inputs that declare a generic dataset mapping via
|
| 845 |
* [data-inspector-key] but do NOT declare a custom value_from adapter.
|
| 846 |
* This makes sections follow the same data flow as fields with almost no glue.
|
| 847 |
*
|
| 848 |
* @param {WPBC_Form_Builder} builder
|
| 849 |
* @param {HTMLElement} sel - currently selected field/section
|
| 850 |
*/static _generic_hydrate_controls(builder,sel){const ins=document.getElementById('wpbc_bfb__inspector');if(!ins||!sel)return;const SKIP=/^(id|name|html_id|cssclass|label)$/;// handled by _hydrate_special_controls |
| 851 |
// NEW: read schema for the selected element’s type. |
| 852 |
const schemas=window.WPBC_BFB_Schemas||{};const typeKey=sel.dataset&&sel.dataset.type||'';const schemaEntry=schemas[typeKey]||null;const propsSchema=schemaEntry&&schemaEntry.schema&&schemaEntry.schema.props?schemaEntry.schema.props:{};const hasOwn=Function.prototype.call.bind(Object.prototype.hasOwnProperty);const getDefault=key=>{const meta=propsSchema[key];return meta&&hasOwn(meta,'default')?meta.default:undefined;};ins.querySelectorAll('[data-inspector-key]').forEach(ctrl=>{const key=String(ctrl.dataset?.inspectorKey||'').toLowerCase();if(!key||SKIP.test(key))return;// Element-level lock. |
| 853 |
const dl=(ctrl.dataset?.locked||'').trim().toLowerCase();if(dl==='1'||dl==='true'||dl==='yes')return;// Respect explicit adapters. |
| 854 |
if(ctrl.dataset?.value_from||ctrl.dataset?.valueFrom)return;const raw=sel.dataset?sel.dataset[key]:undefined;const hasRaw=sel.dataset?hasOwn(sel.dataset,key):false;const defValue=getDefault(key);// Best-effort control typing with schema default fallback when value is absent. |
| 855 |
if(ctrl instanceof HTMLInputElement&&(ctrl.type==='checkbox'||ctrl.type==='radio')){// If dataset is missing the key entirely -> use schema default (boolean). |
| 856 |
if(!hasRaw){ctrl.checked=!!defValue;}else{// An explicit empty value is the legacy persisted representation of false. |
| 857 |
ctrl.checked=Core.WPBC_BFB_Sanitize.coerce_boolean(raw,false);}}else if('value'in ctrl){if(hasRaw){ctrl.value=raw!=null?String(raw):'';}else{ctrl.value=defValue==null?'':String(defValue);}}});}_bind_id_sanitizer(){const b=this.builder;const ins=document.getElementById('wpbc_bfb__inspector');if(!ins){return;}if(ins.__wpbc_bfb_id_sanitizer_bound){return;}ins.__wpbc_bfb_id_sanitizer_bound=true;const handler=e=>{const t=e.target;if(!t||!('value'in t)){return;}const key=(t.dataset?.inspectorKey||'').toLowerCase();const sel=b.get_selected_field?.();const isSection=sel?.classList?.contains('wpbc_bfb__section');if(!sel)return;// Unified emitter that always includes the element reference. |
| 858 |
const EV=Core.WPBC_BFB_Events;// STRUCTURE_CHANGE can be "expensive" because other listeners may trigger full canvas refresh. |
| 859 |
// Debounce only continuous controls (e.g. value slider scrubbing) on the INPUT phase. |
| 860 |
const ensure_sc_debounce_state=()=>{if(b.__wpbc_bfb_sc_debounce_state){return b.__wpbc_bfb_sc_debounce_state;}b.__wpbc_bfb_sc_debounce_state={timer_id:0,pending_payload:null};return b.__wpbc_bfb_sc_debounce_state;};const cancel_sc_debounced_emit=()=>{const st=b.__wpbc_bfb_sc_debounce_state;if(!st)return;try{clearTimeout(st.timer_id);}catch(_){}st.timer_id=0;st.pending_payload=null;};const bus_emit_change=(reason,extra={})=>{// If we’re committing something (change/blur/etc), drop any pending "input" emit. |
| 861 |
cancel_sc_debounced_emit();b.bus?.emit?.(EV.STRUCTURE_CHANGE,{reason,el:sel,...extra});};const bus_emit_change_debounced=(reason,extra={},wait_ms)=>{const st=ensure_sc_debounce_state();const ms=Number.isFinite(wait_ms)?wait_ms:Number.isFinite(UI.STRUCTURE_CHANGE_DEBOUNCE_MS)?UI.STRUCTURE_CHANGE_DEBOUNCE_MS:240;// Capture the CURRENT selected element into the payload now (stable ref). |
| 862 |
st.pending_payload={reason,el:sel,...extra,debounced:true};try{clearTimeout(st.timer_id);}catch(_){}st.timer_id=setTimeout(function(){st.timer_id=0;const payload=st.pending_payload;st.pending_payload=null;if(payload){b.bus?.emit?.(EV.STRUCTURE_CHANGE,payload);}},ms);};// ---- FIELD/SECTION: internal id ---- |
| 863 |
if(key==='id'){const unique=b.id.set_field_id(sel,t.value);if(b.preview_mode&&!isSection){b.render_preview(sel);}if(t.value!==unique){t.value=unique;}bus_emit_change('id-change');return;}// ---- FIELD/SECTION: public HTML id ---- |
| 864 |
if(key==='html_id'){const applied=b.id.set_field_html_id(sel,t.value);// For sections, also set the real DOM id so anchors/CSS can target it. |
| 865 |
if(isSection){sel.id=applied||'';}else if(b.preview_mode){b.render_preview(sel);}if(t.value!==applied){t.value=applied;}bus_emit_change('html-id-change');return;}// ---- FIELDS ONLY: name ---- |
| 866 |
if(key==='name'&&!isSection){// Live typing: sanitize only (NO uniqueness yet) to avoid "-2" spam |
| 867 |
if(e.type==='input'){const before=t.value;const sanitized=Core.WPBC_BFB_Sanitize.sanitize_html_name(before);if(before!==sanitized){// optional: preserve caret to avoid jump |
| 868 |
const selStart=t.selectionStart,selEnd=t.selectionEnd;t.value=sanitized;try{t.setSelectionRange(selStart,selEnd);}catch(_){}}return;// uniqueness on change/blur |
| 869 |
}// Commit (change/blur) |
| 870 |
const raw=String(t.value??'').trim();if(!raw){// RESEED: keep name non-empty and provisional (autoname stays ON) |
| 871 |
const S=Core.WPBC_BFB_Sanitize;const base=S.sanitize_html_name(sel.getAttribute('data-id')||sel.dataset.id||sel.dataset.type||'field');const uniq=b.id.ensure_unique_field_name(base,sel);sel.setAttribute('data-name',uniq);sel.dataset.autoname='1';sel.dataset.name_user_touched='0';// Keep DOM in sync if we’re not re-rendering |
| 872 |
if(!b.preview_mode){const ctrl=sel.querySelector('input,textarea,select');if(ctrl)ctrl.setAttribute('name',uniq);}else{b.render_preview(sel);}if(t.value!==uniq)t.value=uniq;bus_emit_change('name-reseed');return;}// Non-empty commit: user takes control; disable autoname going forward |
| 873 |
sel.dataset.name_user_touched='1';sel.dataset.autoname='0';const sanitized=Core.WPBC_BFB_Sanitize.sanitize_html_name(raw);const unique=b.id.set_field_name(sel,sanitized);if(!b.preview_mode){const ctrl=sel.querySelector('input,textarea,select');if(ctrl)ctrl.setAttribute('name',unique);}else{b.render_preview(sel);}if(t.value!==unique)t.value=unique;bus_emit_change('name-change');return;}// ---- SECTIONS & FIELDS: cssclass (live apply; no re-render) ---- |
| 874 |
if(key==='cssclass'){const next=Core.WPBC_BFB_Sanitize.sanitize_css_classlist(t.value||'');const desiredArr=next.split(/\s+/).filter(Boolean);const desiredSet=new Set(desiredArr);// Core classes are never touched. |
| 875 |
const isCore=cls=>cls==='is-selected'||cls.startsWith('wpbc_');// Snapshot before mutating (DOMTokenList is live). |
| 876 |
const beforeClasses=Array.from(sel.classList);const customBefore=beforeClasses.filter(c=>!isCore(c));// Remove stray non-core classes not in desired. |
| 877 |
customBefore.forEach(c=>{if(!desiredSet.has(c))sel.classList.remove(c);});// Add missing desired classes in one go. |
| 878 |
const missing=desiredArr.filter(c=>!customBefore.includes(c));if(missing.length)sel.classList.add(...missing);// Keep dataset in sync (avoid useless attribute writes). |
| 879 |
if(sel.getAttribute('data-cssclass')!==next){sel.setAttribute('data-cssclass',next);}// Emit only if something actually changed. |
| 880 |
const afterClasses=Array.from(sel.classList);const changed=afterClasses.length!==beforeClasses.length||beforeClasses.some((c,i)=>c!==afterClasses[i]);const detail={key:'cssclass',phase:e.type};if(isSection){bus_emit_change('cssclass-change',detail);}else{bus_emit_change('prop-change',detail);}return;}// ---- SECTIONS: label ---- |
| 881 |
if(isSection&&key==='label'){const val=String(t.value??'');sel.setAttribute('data-label',val);bus_emit_change('label-change');return;}// ---- FIELDS: label (auto-name while typing; freeze on commit) ---- |
| 882 |
if(!isSection&&key==='label'){const val=String(t.value??'');sel.dataset.label=val;// while typing, allow auto-name (if flags permit) |
| 883 |
try{Core.WPBC_BFB_Field_Base.maybe_autoname_from_label(b,sel,val);}catch(_){}// if user committed the label (blur/change), freeze future auto-name |
| 884 |
if(e.type!=='input'){sel.dataset.autoname='0';// stop future label->name sync |
| 885 |
sel.dataset.fresh='0';// also kill the "fresh" escape hatch |
| 886 |
}// Optional UI nicety: disable Name when auto is ON, enable when OFF |
| 887 |
const ins=document.getElementById('wpbc_bfb__inspector');const nameCtrl=ins?.querySelector('[data-inspector-key="name"]');if(nameCtrl){const autoActive=(sel.dataset.autoname??'1')!=='0'&&sel.dataset.name_user_touched!=='1'&&sel.dataset.was_loaded!=='1';nameCtrl.toggleAttribute('disabled',autoActive);if(autoActive&&!nameCtrl.placeholder){nameCtrl.placeholder=b?.i18n?.auto_from_label??'auto — from label';}if(!autoActive&&nameCtrl.placeholder===(b?.i18n?.auto_from_label??'auto — from label')){nameCtrl.placeholder='';}}// Always re-render the preview so label changes are visible immediately. |
| 888 |
b.render_preview(sel);bus_emit_change('label-change');return;}// ---- DEFAULT (GENERIC): dataset writer for both fields & sections ---- |
| 889 |
// Any inspector control with [data-inspector-key] that doesn't have a custom |
| 890 |
// adapter/value_from will simply read/write sel.dataset[key]. |
| 891 |
if(key){const selfLocked=/^(1|true|yes)$/i.test((t.dataset?.locked||'').trim());if(selfLocked){return;}// Skip keys we handled above to avoid double work. |
| 892 |
if(key==='id'||key==='name'||key==='html_id'||key==='cssclass'||key==='label'){return;}let nextVal='';if(t instanceof HTMLInputElement&&(t.type==='checkbox'||t.type==='radio')){// Persist both boolean states explicitly so schema defaults cannot replace false. |
| 893 |
nextVal=t.checked?'true':'false';}else if('value'in t){nextVal=String(t.value??'');}// Persist to dataset. |
| 894 |
if(sel?.dataset)sel.dataset[key]=nextVal;// Generator controls are "UI inputs" — avoid STRUCTURE_CHANGE spam while dragging/typing. |
| 895 |
const is_gen_key=key.indexOf('gen_')===0;// Re-render on visual keys so preview stays in sync (calendar label/help, etc.). |
| 896 |
const visualKeys=new Set(['help','placeholder','min_width','cssclass']);if(!isSection&&(visualKeys.has(key)||key.startsWith('ui_'))){// Light heuristic: only re-render on commit for heavy inputs; live for short ones is fine. |
| 897 |
if(e.type==='change'||key==='help'||key==='placeholder'){b.render_preview(sel);}}if(!(is_gen_key&&e.type==='input')){// Debounce continuous value slider input events to avoid full-canvas refresh spam. |
| 898 |
// We detect the slider group via [data-len-group] wrapper. |
| 899 |
const is_len_group_ctrl=!!(t&&t.closest&&t.closest('[data-len-group]'));if(is_len_group_ctrl&&e.type==='input'){bus_emit_change_debounced('prop-change',{key,phase:e.type});}else{bus_emit_change('prop-change',{key,phase:e.type});}}return;}};ins.addEventListener('change',handler,true);// reflect instantly while typing as well. |
| 900 |
ins.addEventListener('input',handler,true);}/**
|
| 901 |
* Open Inspector after a field is added.
|
| 902 |
* @private
|
| 903 |
*/_open_inspector_after_field_added(){const EV=Core.WPBC_BFB_Events;this.builder?.bus?.on?.(EV.FIELD_ADD,e=>{const el=e?.detail?.el||null;if(el&&this.builder?.select_field){this.builder.select_field(el,{scrollIntoView:true});}// Show Inspector Palette. |
| 904 |
wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',{panel_id:'wpbc_bfb__inspector',tab_id:'wpbc_tab_inspector'});});}};/**
|
| 905 |
* Keyboard shortcuts for selection, deletion, and movement.
|
| 906 |
*/UI.WPBC_BFB_Keyboard_Controller=class extends UI.WPBC_BFB_Module{init(){this._on_key=this.on_key.bind(this);document.addEventListener('keydown',this._on_key,true);}destroy(){document.removeEventListener('keydown',this._on_key,true);}/** @param {KeyboardEvent} e */on_key(e){const b=this.builder;const is_typing=this._is_typing_anywhere();if(e.key==='Escape'){if(is_typing){return;}this.builder.bus.emit(Core.WPBC_BFB_Events.CLEAR_SELECTION,{source:'esc'});return;}const selected=b.get_selected_field?.();if(!selected||is_typing){return;}if(e.key==='Delete'||e.key==='Backspace'){e.preventDefault();b.delete_item?.(selected);return;}if((e.altKey||e.ctrlKey||e.metaKey)&&(e.key==='ArrowUp'||e.key==='ArrowDown')&&!e.shiftKey){e.preventDefault();const dir=e.key==='ArrowUp'?'up':'down';b.move_item?.(selected,dir);return;}if(e.key==='Enter'){e.preventDefault();b.select_field(selected,{scrollIntoView:true});}}/** @returns {boolean} */_is_typing_anywhere(){const a=document.activeElement;const tag=a?.tagName;if(tag==='INPUT'||tag==='TEXTAREA'||tag==='SELECT'||a?.isContentEditable===true){return true;}const ins=document.getElementById('wpbc_bfb__inspector');return!!(ins&&a&&ins.contains(a));}};/**
|
| 907 |
* Column resize logic for section rows.
|
| 908 |
*/UI.WPBC_BFB_Resize_Controller=class extends UI.WPBC_BFB_Module{init(){this.builder.init_resize_handler=this.handle_resize.bind(this);}/**
|
| 909 |
* read the CSS var (kept local so it doesn’t depend on the Min-Width module)
|
| 910 |
*
|
| 911 |
* @param col
|
| 912 |
* @returns {number|number}
|
| 913 |
* @private
|
| 914 |
*/_get_col_min_px(col){const v=getComputedStyle(col).getPropertyValue('--wpbc-col-min')||'0';const n=parseFloat(v);return Number.isFinite(n)?Math.max(0,n):0;}/** @param {MouseEvent} e */handle_resize(e){const b=this.builder;e.preventDefault();if(e.button!==0)return;const resizer=e.currentTarget;const row_el=resizer.parentElement;const cols=Array.from(row_el.querySelectorAll(':scope > .wpbc_bfb__column'));const left_col=resizer?.previousElementSibling;const right_col=resizer?.nextElementSibling;if(!left_col||!right_col||!left_col.classList.contains('wpbc_bfb__column')||!right_col.classList.contains('wpbc_bfb__column'))return;const left_index=cols.indexOf(left_col);const right_index=cols.indexOf(right_col);if(left_index===-1||right_index!==left_index+1)return;const start_x=e.clientX;const left_start_px=left_col.getBoundingClientRect().width;const right_start_px=right_col.getBoundingClientRect().width;const pair_px=Math.max(0,left_start_px+right_start_px);const gp=b.col_gap_percent;const computed=b.layout.compute_effective_bases_from_row(row_el,gp);const available=computed.available;// % of the “full 100” after gaps |
| 915 |
const bases=computed.bases.slice(0);// current effective % |
| 916 |
const pair_avail=bases[left_index]+bases[right_index];// Bail if we can’t compute sane deltas. |
| 917 |
if(!pair_px||!Number.isFinite(pair_avail)||pair_avail<=0)return;// --- MIN CLAMPS (pixels) ------------------------------------------------- |
| 918 |
const pctToPx=pct=>pair_px*(pct/pair_avail);// pair-local percent -> px |
| 919 |
const genericMinPct=Math.min(0.1,available);// original 0.1% floor (in “available %” space) |
| 920 |
const genericMinPx=pctToPx(genericMinPct);const leftMinPx=Math.max(this._get_col_min_px(left_col),genericMinPx);const rightMinPx=Math.max(this._get_col_min_px(right_col),genericMinPx);// freeze text selection + cursor |
| 921 |
const prev_user_select=document.body.style.userSelect;document.body.style.userSelect='none';row_el.style.cursor='col-resize';const on_mouse_move=ev=>{if(!pair_px)return;// work in pixels, clamp by each side’s min |
| 922 |
const delta_px=ev.clientX-start_x;let newLeftPx=left_start_px+delta_px;newLeftPx=Math.max(leftMinPx,Math.min(pair_px-rightMinPx,newLeftPx));const newRightPx=pair_px-newLeftPx;// translate back to pair-local percentages |
| 923 |
const newLeftPct=newLeftPx/pair_px*pair_avail;const newBases=bases.slice(0);newBases[left_index]=newLeftPct;newBases[right_index]=pair_avail-newLeftPct;b.layout.apply_bases_to_row(row_el,newBases);};const on_mouse_up=()=>{document.removeEventListener('mousemove',on_mouse_move);document.removeEventListener('mouseup',on_mouse_up);window.removeEventListener('mouseup',on_mouse_up);document.removeEventListener('mouseleave',on_mouse_up);document.body.style.userSelect=prev_user_select||'';row_el.style.cursor='';// normalize to the row’s available % again |
| 924 |
const normalized=b.layout.compute_effective_bases_from_row(row_el,gp);b.layout.apply_bases_to_row(row_el,normalized.bases);};document.addEventListener('mousemove',on_mouse_move);document.addEventListener('mouseup',on_mouse_up);window.addEventListener('mouseup',on_mouse_up);document.addEventListener('mouseleave',on_mouse_up);}};/**
|
| 925 |
* Page and section creation, rebuilding, and nested Sortable setup.
|
| 926 |
*/UI.WPBC_BFB_Pages_Sections=class extends UI.WPBC_BFB_Module{init(){this.builder.add_page=opts=>this.add_page(opts);this.builder.add_section=(container,cols)=>this.add_section(container,cols);this.builder.rebuild_section=(section_data,container)=>this.rebuild_section(section_data,container);this.builder.init_all_nested_sortables=el=>this.init_all_nested_sortables(el);this.builder.init_section_sortable=el=>this.init_section_sortable(el);this.builder.pages_sections=this;}/**
|
| 927 |
* Give every field/section in a cloned subtree a fresh data-uid so
|
| 928 |
* uniqueness checks don't exclude their originals.
|
| 929 |
*/_retag_uids_in_subtree(root){const b=this.builder;if(!root)return;const nodes=[];if(root.classList?.contains('wpbc_bfb__section')||root.classList?.contains('wpbc_bfb__field')){nodes.push(root);}nodes.push(...root.querySelectorAll('.wpbc_bfb__section, .wpbc_bfb__field'));nodes.forEach(el=>{const prefix=el.classList.contains('wpbc_bfb__section')?'s':'f';el.dataset.uid=`${prefix}-${++b._uid_counter}-${Date.now()}-${Math.random().toString(36).slice(2,7)}`;});}/**
|
| 930 |
* Bump "foo", "foo-2", "foo-3", ...
|
| 931 |
*/_make_unique(base,taken){const s=Core.WPBC_BFB_Sanitize;let v=String(base||'');if(!v)v='field';const m=v.match(/-(\d+)$/);let n=m?parseInt(m[1],10)||1:1;let stem=m?v.replace(/-\d+$/,''):v;while(taken.has(v)){n=Math.max(2,n+1);v=`${stem}-${n}`;}taken.add(v);return v;}/**
|
| 932 |
* Strict, one-pass de-duplication for a newly-inserted subtree.
|
| 933 |
* - Ensures unique data-id (internal), data-name (fields), data-html_id (public)
|
| 934 |
* - Also updates DOM: <section id>, <input id>, <label for>, and input[name].
|
| 935 |
*/_dedupe_subtree_strict(root){const b=this.builder;const s=Core.WPBC_BFB_Sanitize;if(!root||!b?.pages_container)return;// 1) Build "taken" sets from outside the subtree. |
| 936 |
const takenDataId=new Set();const takenDataName=new Set();const takenHtmlId=new Set();const takenDomId=new Set();// All fields/sections outside root |
| 937 |
b.pages_container.querySelectorAll('.wpbc_bfb__field, .wpbc_bfb__section').forEach(el=>{if(root.contains(el))return;const did=el.getAttribute('data-id');const dnam=el.getAttribute('data-name');const hid=el.getAttribute('data-html_id');if(did)takenDataId.add(did);if(dnam)takenDataName.add(dnam);if(hid)takenHtmlId.add(hid);});// All DOM ids outside root (labels, inputs, anything) |
| 938 |
document.querySelectorAll('[id]').forEach(el=>{if(root.contains(el))return;if(el.id)takenDomId.add(el.id);});const nodes=[];if(root.classList?.contains('wpbc_bfb__section')||root.classList?.contains('wpbc_bfb__field')){nodes.push(root);}nodes.push(...root.querySelectorAll('.wpbc_bfb__section, .wpbc_bfb__field'));// 2) Walk the subtree and fix collisions deterministically. |
| 939 |
nodes.forEach(el=>{const isField=el.classList.contains('wpbc_bfb__field');const isSection=el.classList.contains('wpbc_bfb__section');// INTERNAL data-id |
| 940 |
{const raw=el.getAttribute('data-id')||'';const base=s.sanitize_html_id(raw)||(isSection?'section':'field');const uniq=this._make_unique(base,takenDataId);if(uniq!==raw)el.setAttribute('data-id',uniq);}// HTML name (fields only) |
| 941 |
if(isField){const raw=el.getAttribute('data-name')||'';if(raw){const base=s.sanitize_html_name(raw);const uniq=this._make_unique(base,takenDataName);if(uniq!==raw){el.setAttribute('data-name',uniq);// Update inner control immediately |
| 942 |
const input=el.querySelector('input, textarea, select');if(input)input.setAttribute('name',uniq);}}}// Public HTML id (fields + sections) |
| 943 |
{const raw=el.getAttribute('data-html_id')||'';if(raw){const base=s.sanitize_html_id(raw);// Reserve against BOTH known data-html_id and real DOM ids. |
| 944 |
const combinedTaken=new Set([...takenHtmlId,...takenDomId]);let candidate=this._make_unique(base,combinedTaken);// Record into the real sets so future checks see the reservation. |
| 945 |
takenHtmlId.add(candidate);takenDomId.add(candidate);if(candidate!==raw)el.setAttribute('data-html_id',candidate);// Reflect to DOM immediately |
| 946 |
if(isSection){el.id=candidate||'';}else{const input=el.querySelector('input, textarea, select');const label=el.querySelector('label.wpbc_bfb__field-label');if(input)input.id=candidate||'';if(label)label.htmlFor=candidate||'';}}else if(isSection){// Ensure no stale DOM id if data-html_id was cleared |
| 947 |
el.removeAttribute('id');}}});}_make_add_columns_control(page_el,section_container,insert_pos='bottom'){// Accept insert_pos ('top'|'bottom'), default 'bottom'. |
| 948 |
const tpl=document.getElementById('wpbc_bfb__add_columns_template');if(!tpl){return null;}// Clone *contents* (not the id), unhide, and add a page-scoped class. |
| 949 |
const src=tpl.content&&tpl.content.firstElementChild?tpl.content.firstElementChild:tpl.firstElementChild;if(!src){return null;}const clone=src.cloneNode(true);clone.removeAttribute('hidden');if(clone.id){clone.removeAttribute('id');}clone.querySelectorAll('[id]').forEach(n=>n.removeAttribute('id'));// Mark where this control inserts sections. |
| 950 |
clone.dataset.insert=insert_pos;// 'top' | 'bottom' |
| 951 |
// // Optional UI hint for users (keeps existing markup intact). |
| 952 |
// const hint = clone.querySelector( '.nav-tab-text .selected_value' ); |
| 953 |
// if ( hint ) { |
| 954 |
// hint.textContent = (insert_pos === 'top') ? ' (add at top)' : ' (add at bottom)'; |
| 955 |
// } |
| 956 |
// Click on options - add section with N columns. |
| 957 |
clone.addEventListener('click',e=>{const a=e.target.closest('.ul_dropdown_menu_li_action_add_sections');if(!a){return;}e.preventDefault();// Read N either from data-cols or fallback to parsing text like "3 Columns". |
| 958 |
let cols=parseInt(a.dataset.cols||(a.textContent.match(/\b(\d+)\s*Column/i)?.[1]??'1'),10);cols=Math.max(1,Math.min(4,cols));// NEW: honor the control's insertion position |
| 959 |
this.add_section(section_container,cols,insert_pos);// Reflect last choice (unchanged) |
| 960 |
const val=clone.querySelector('.selected_value');if(val){val.textContent=` (${cols})`;}});return clone;}/**
|
| 961 |
* @param {{scroll?: boolean}} [opts = {}]
|
| 962 |
* @returns {HTMLElement}
|
| 963 |
*/add_page({scroll=true}={}){const b=this.builder;const page_el=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__panel wpbc_bfb__panel--preview wpbc_bfb_form wpbc_container wpbc_form wpbc_container_booking_form');page_el.setAttribute('data-page',++b.page_counter);// "Page 1 | X" - Render page Title with Remove X button. |
| 964 |
const controls_html=UI.render_wp_template('wpbc-bfb-tpl-page-remove',{page_number:b.page_counter});page_el.innerHTML=controls_html+'<div class="wpbc_bfb__form_preview_section_container wpbc_wizard__border_container"></div>';b.pages_container.appendChild(page_el);if(scroll){page_el.scrollIntoView({behavior:'smooth',block:'start'});}const section_container=page_el.querySelector('.wpbc_bfb__form_preview_section_container');const section_count_on_add_page=2;this.init_section_sortable(section_container);this.add_section(section_container,section_count_on_add_page);// Dropdown control cloned from the hidden template. |
| 965 |
const controls_host_top=page_el.querySelector('.wpbc_bfb__controls');const ctrl_top=this._make_add_columns_control(page_el,section_container,'top');if(ctrl_top){controls_host_top.appendChild(ctrl_top);}// Bottom control bar after the section container. |
| 966 |
const controls_host_bottom=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__controls wpbc_bfb__controls--bottom');section_container.after(controls_host_bottom);const ctrl_bottom=this._make_add_columns_control(page_el,section_container,'bottom');if(ctrl_bottom){controls_host_bottom.appendChild(ctrl_bottom);}return page_el;}/**
|
| 967 |
* @param {HTMLElement} container
|
| 968 |
* @param {number} cols
|
| 969 |
* @param {'top'|'bottom'} [insert_pos='bottom'] // NEW
|
| 970 |
*/add_section(container,cols,insert_pos='bottom'){const b=this.builder;cols=Math.max(1,parseInt(cols,10)||1);const section=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__section');section.setAttribute('data-id',`section-${++b.section_counter}-${Date.now()}`);section.setAttribute('data-uid',`s-${++b._uid_counter}-${Date.now()}-${Math.random().toString(36).slice(2,7)}`);section.setAttribute('data-type','section');section.setAttribute('data-label','Section');section.setAttribute('data-columns',String(cols));// Do not persist or seed per-column styles by default (opt-in via inspector). |
| 971 |
const row=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__row wpbc__row');for(let i=0;i<cols;i++){const col=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__column wpbc__field');col.style.flexBasis=100/cols+'%';// No default CSS vars here; real columns remain unaffected until user activates styles. |
| 972 |
b.init_sortable?.(col);row.appendChild(col);if(i<cols-1){const resizer=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__column-resizer');resizer.addEventListener('mousedown',b.init_resize_handler);row.appendChild(resizer);}}section.appendChild(row);b.layout.set_equal_bases(row,b.col_gap_percent);b.add_overlay_toolbar(section);section.setAttribute('tabindex','0');this.init_all_nested_sortables(section);// Insertion policy: top | bottom. |
| 973 |
if(insert_pos==='top'&&container.firstElementChild){container.insertBefore(section,container.firstElementChild);}else{container.appendChild(section);}}/**
|
| 974 |
* @param {Object} section_data
|
| 975 |
* @param {HTMLElement} container
|
| 976 |
* @returns {HTMLElement} The rebuilt section element.
|
| 977 |
*/rebuild_section(section_data,container){const b=this.builder;const cols_data=Array.isArray(section_data?.columns)?section_data.columns:[];this.add_section(container,cols_data.length||1);const section=container.lastElementChild;if(!section.dataset.uid){section.setAttribute('data-uid',`s-${++b._uid_counter}-${Date.now()}-${Math.random().toString(36).slice(2,7)}`);}section.setAttribute('data-id',section_data?.id||`section-${++b.section_counter}-${Date.now()}`);section.setAttribute('data-type','section');section.setAttribute('data-label',section_data?.label||'Section');section.setAttribute('data-columns',String((section_data?.columns||[]).length||1));// Persisted attributes |
| 978 |
if(section_data?.html_id){section.setAttribute('data-html_id',String(section_data.html_id));// give the container a real id so anchors/CSS can target it |
| 979 |
section.id=String(section_data.html_id);}// NEW: restore persisted per-column styles (raw JSON string). |
| 980 |
if(section_data?.col_styles!=null){const json=String(section_data.col_styles);section.setAttribute('data-col_styles',json);try{section.dataset.col_styles=json;}catch(_e){}}// (No render_preview() call here on purpose: sections’ builder DOM uses .wpbc_bfb__row/.wpbc_bfb__column.) |
| 981 |
if(section_data?.cssclass){section.setAttribute('data-cssclass',String(section_data.cssclass));// keep core classes, then add custom class(es) |
| 982 |
String(section_data.cssclass).split(/\s+/).filter(Boolean).forEach(cls=>section.classList.add(cls));}const row=section.querySelector('.wpbc_bfb__row');// Delegate parsing + activation + application to the Column Styles service. |
| 983 |
try{const json=section.getAttribute('data-col_styles')||(section.dataset?section.dataset.col_styles||'':'');const arr=UI.WPBC_BFB_Column_Styles.parse_col_styles(json);UI.WPBC_BFB_Column_Styles.apply(section,arr);}catch(_e){}cols_data.forEach((col_data,index)=>{const columns_only=row.querySelectorAll(':scope > .wpbc_bfb__column');const col=columns_only[index];col.style.flexBasis=col_data.width||'100%';(col_data.items||[]).forEach(item=>{if(!item||!item.type){return;}if(item.type==='field'){const el=b.build_field(item.data);if(el){col.appendChild(el);b.trigger_field_drop_callback(el,'load');}return;}if(item.type==='section'){this.rebuild_section(item.data,col);}});});const computed=b.layout.compute_effective_bases_from_row(row,b.col_gap_percent);b.layout.apply_bases_to_row(row,computed.bases);this.init_all_nested_sortables(section);// NEW: retag UIDs first (so uniqueness checks don't exclude originals), then dedupe all keys. |
| 984 |
this._retag_uids_in_subtree(section);this._dedupe_subtree_strict(section);return section;}/** @param {HTMLElement} container */init_all_nested_sortables(container){const b=this.builder;if(container.classList.contains('wpbc_bfb__form_preview_section_container')){this.init_section_sortable(container);}container.querySelectorAll('.wpbc_bfb__section').forEach(section=>{section.querySelectorAll('.wpbc_bfb__column').forEach(col=>{this.init_section_sortable(col);});});}/** @param {HTMLElement} container */init_section_sortable(container){const b=this.builder;if(!container){return;}const is_column=container.classList.contains('wpbc_bfb__column');const is_top_level=container.classList.contains('wpbc_bfb__form_preview_section_container');if(!is_column&&!is_top_level){return;}b.init_sortable?.(container);}};/**
|
| 985 |
* Serialization and deserialization of pages/sections/fields.
|
| 986 |
*/UI.WPBC_BFB_Structure_IO=class extends UI.WPBC_BFB_Module{init(){this.builder.get_structure=()=>this.serialize();this.builder.load_saved_structure=(s,opts)=>this.deserialize(s,opts);}/** |
| 987 |
* Normalize option values when a field explicitly disables separate values. |
| 988 |
* |
| 989 |
* Older Builder versions persisted an unchecked value_differs toggle as an |
| 990 |
* empty string. Treat that explicit legacy value as false, while retaining |
| 991 |
* the schema default when the property is genuinely absent. |
| 992 |
* |
| 993 |
* @param {Object} field_data Serialized field data. |
| 994 |
* @returns {Object} Normalized serialized field data. |
| 995 |
*/_normalize_field_option_values(field_data){const has_value_differs=Object.prototype.hasOwnProperty.call(field_data,'value_differs');if(!has_value_differs){return field_data;}const value_differs=Core.WPBC_BFB_Sanitize.coerce_boolean(field_data.value_differs,false);field_data.value_differs=value_differs;if(!value_differs&&Array.isArray(field_data.options)){field_data.options=field_data.options.map(option_record=>{if(!option_record||typeof option_record!=='object'){return option_record;}return Object.assign({},option_record,{value:String(option_record.label==null?'':option_record.label)});});}return field_data;}/** @returns {Array} */serialize(){const b=this.builder;this._normalize_ids();this._normalize_names();const pages=[];b.pages_container.querySelectorAll('.wpbc_bfb__panel--preview').forEach((page_el,page_index)=>{const container=page_el.querySelector('.wpbc_bfb__form_preview_section_container');const content=[];if(!container){pages.push({page:page_index+1,content});return;}container.querySelectorAll(':scope > *').forEach(child=>{if(child.classList.contains('wpbc_bfb__section')){content.push({type:'section',data:this.serialize_section(child)});return;}if(child.classList.contains('wpbc_bfb__field')){if(child.classList.contains('is-invalid')){return;}const f_data=this._normalize_field_option_values(Core.WPBC_Form_Builder_Helper.get_all_data_attributes(child));// Drop ephemeral/editor-only flags |
| 996 |
['uid','fresh','autoname','was_loaded','name_user_touched'].forEach(k=>{if(k in f_data)delete f_data[k];});content.push({type:'field',data:f_data});}});pages.push({page:page_index+1,content});});return pages;}/**
|
| 997 |
* @param {HTMLElement} section_el
|
| 998 |
* @returns {{id:string,label:string,html_id:string,cssclass:string,col_styles:string,columns:Array}}
|
| 999 |
*/serialize_section(section_el){const row=section_el.querySelector(':scope > .wpbc_bfb__row');// NEW: read per-column styles from dataset/attributes (underscore & hyphen) |
| 1000 |
var col_styles_raw=section_el.getAttribute('data-col_styles')||(section_el.dataset?section_el.dataset.col_styles:'')||'';const base={id:section_el.dataset.id,label:section_el.dataset.label||'',html_id:section_el.dataset.html_id||'',cssclass:section_el.dataset.cssclass||'',col_styles:String(col_styles_raw)// <-- NEW: keep as raw JSON string |
| 1001 |
};if(!row){return Object.assign({},base,{columns:[]});}const columns=[];row.querySelectorAll(':scope > .wpbc_bfb__column').forEach(function(col){const width=col.style.flexBasis||'100%';const items=[];Array.prototype.forEach.call(col.children,function(child){if(child.classList.contains('wpbc_bfb__section')){items.push({type:'section',data:this.serialize_section(child)});return;}if(child.classList.contains('wpbc_bfb__field')){if(child.classList.contains('is-invalid')){return;}const f_data=this._normalize_field_option_values(Core.WPBC_Form_Builder_Helper.get_all_data_attributes(child));['uid','fresh','autoname','was_loaded','name_user_touched'].forEach(function(k){if(k in f_data){delete f_data[k];}});items.push({type:'field',data:f_data});}}.bind(this));columns.push({width:width,items:items});}.bind(this));// Clamp persisted col_styles to the actual number of columns on Save. |
| 1002 |
try{const colCount=columns.length;const raw=String(col_styles_raw||'').trim();if(raw){let arr=[];try{const parsed=JSON.parse(raw);arr=Array.isArray(parsed)?parsed:parsed&&Array.isArray(parsed.columns)?parsed.columns:[];}catch(_e){arr=[];}if(colCount<=0){base.col_styles='[]';}else{if(arr.length>colCount)arr.length=colCount;while(arr.length<colCount)arr.push({});base.col_styles=JSON.stringify(arr);}}else{base.col_styles='';}}catch(_e){}return Object.assign({},base,{columns:columns});}/**
|
| 1003 |
* @param {Array} structure
|
| 1004 |
* @param {{deferIfTyping?: boolean}} [opts = {}]
|
| 1005 |
*/deserialize(structure,{deferIfTyping=true}={}){const b=this.builder;if(deferIfTyping&&this._is_typing_in_inspector()){clearTimeout(this._defer_timer);this._defer_timer=setTimeout(()=>{this.deserialize(structure,{deferIfTyping:false});},150);return;}b.pages_container.innerHTML='';b.page_counter=0;(structure||[]).forEach(page_data=>{const page_el=b.pages_sections.add_page({scroll:false});const section_container=page_el.querySelector('.wpbc_bfb__form_preview_section_container');section_container.innerHTML='';b.init_section_sortable?.(section_container);(page_data.content||[]).forEach(item=>{if(item.type==='section'){// Now returns the element; attributes (incl. col_styles) are applied inside rebuild. |
| 1006 |
b.pages_sections.rebuild_section(item.data,section_container);return;}if(item.type==='field'){const el=b.build_field(item.data);if(el){section_container.appendChild(el);b.trigger_field_drop_callback(el,'load');}}});});b.usage?.update_palette_ui?.();b.bus.emit(Core.WPBC_BFB_Events.STRUCTURE_LOADED,{structure});}_normalize_ids(){const b=this.builder;b.pages_container.querySelectorAll('.wpbc_bfb__panel--preview .wpbc_bfb__field:not(.is-invalid)').forEach(el=>{const data=Core.WPBC_Form_Builder_Helper.get_all_data_attributes(el);const want=Core.WPBC_BFB_Sanitize.sanitize_html_id(data.id||'')||'field';const uniq=b.id.ensure_unique_field_id(want,el);if(data.id!==uniq){el.setAttribute('data-id',uniq);if(b.preview_mode){b.render_preview(el);}}});}_normalize_names(){const b=this.builder;b.pages_container.querySelectorAll('.wpbc_bfb__panel--preview .wpbc_bfb__field:not(.is-invalid)').forEach(el=>{const data=Core.WPBC_Form_Builder_Helper.get_all_data_attributes(el);const base=Core.WPBC_BFB_Sanitize.sanitize_html_name(data.name!=null?data.name:data.id)||'field';const uniq=b.id.ensure_unique_field_name(base,el);if(data.name!==uniq){el.setAttribute('data-name',uniq);if(b.preview_mode){b.render_preview(el);}}});}/** @returns {boolean} */_is_typing_in_inspector(){const ins=document.getElementById('wpbc_bfb__inspector');return!!(ins&&document.activeElement&&ins.contains(document.activeElement));}};/**
|
| 1007 |
* Minimal, standalone guard that enforces per-column min widths based on fields' data-min_width.
|
| 1008 |
*
|
| 1009 |
* @type {UI.WPBC_BFB_Min_Width_Guard}
|
| 1010 |
*/UI.WPBC_BFB_Min_Width_Guard=class extends UI.WPBC_BFB_Module{constructor(builder){super(builder);this._on_field_add=this._on_field_add.bind(this);this._on_field_remove=this._on_field_remove.bind(this);this._on_structure_loaded=this._on_structure_loaded.bind(this);this._on_structure_change=this._on_structure_change.bind(this);this._on_window_resize=this._on_window_resize.bind(this);this._pending_rows=new Set();this._pending_all=false;this._raf_id=0;}init(){const EV=Core.WPBC_BFB_Events;this.builder?.bus?.on?.(EV.FIELD_ADD,this._on_field_add);this.builder?.bus?.on?.(EV.FIELD_REMOVE,this._on_field_remove);this.builder?.bus?.on?.(EV.STRUCTURE_LOADED,this._on_structure_loaded);// Refresh selectively on structure change (NOT on every prop input). |
| 1011 |
this.builder?.bus?.on?.(EV.STRUCTURE_CHANGE,this._on_structure_change);window.addEventListener('resize',this._on_window_resize,{passive:true});this._schedule_refresh_all();}destroy(){const EV=Core.WPBC_BFB_Events;this.builder?.bus?.off?.(EV.FIELD_ADD,this._on_field_add);this.builder?.bus?.off?.(EV.FIELD_REMOVE,this._on_field_remove);this.builder?.bus?.off?.(EV.STRUCTURE_LOADED,this._on_structure_loaded);this.builder?.bus?.off?.(EV.STRUCTURE_CHANGE,this._on_structure_change);window.removeEventListener('resize',this._on_window_resize);}_on_field_add(e){this._schedule_refresh_all();// if you really want to be minimal work here, keep your row-only version. |
| 1012 |
}_on_field_remove(e){const src_el=e?.detail?.el||null;const row=src_el&&src_el.closest?src_el.closest('.wpbc_bfb__row'):null;if(row){this._schedule_refresh_row(row);}else{this._schedule_refresh_all();}}_on_structure_loaded(){this._schedule_refresh_all();}_on_structure_change(e){const reason=e?.detail?.reason||'';const key=e?.detail?.key||'';// Ignore noisy prop changes that don't affect min widths. |
| 1013 |
if(reason==='prop-change'&&key!=='min_width'){return;}const el=e?.detail?.el||null;const row=el?.closest?.('.wpbc_bfb__row')||null;if(row){this._schedule_refresh_row(row);}else{this._schedule_refresh_all();}}_on_window_resize(){this._schedule_refresh_all();}_schedule_refresh_row(row_el){if(!row_el)return;this._pending_rows.add(row_el);this._kick_raf();}_schedule_refresh_all(){this._pending_all=true;this._pending_rows.clear();this._kick_raf();}_kick_raf(){if(this._raf_id)return;this._raf_id=(window.requestAnimationFrame||setTimeout)(()=>{this._raf_id=0;if(this._pending_all){this._pending_all=false;this.refresh_all();return;}const rows=Array.from(this._pending_rows);this._pending_rows.clear();rows.forEach(r=>this.refresh_row(r));},0);}refresh_all(){this.builder?.pages_container?.querySelectorAll?.('.wpbc_bfb__row')?.forEach?.(row=>this.refresh_row(row));}refresh_row(row_el){if(!row_el)return;const cols=row_el.querySelectorAll(':scope > .wpbc_bfb__column');// 1) Recalculate each column’s required min px and write it to the CSS var. |
| 1014 |
cols.forEach(col=>this.apply_col_min(col));// 2) Enforce it at the CSS level right away so layout can’t render narrower. |
| 1015 |
cols.forEach(col=>{const px=parseFloat(getComputedStyle(col).getPropertyValue('--wpbc-col-min')||'0')||0;col.style.minWidth=px>0?Math.round(px)+'px':'';});// 3) Normalize current bases so the row respects all mins without overflow. |
| 1016 |
try{const b=this.builder;const gp=b.col_gap_percent;const eff=b.layout.compute_effective_bases_from_row(row_el,gp);// { bases, available } |
| 1017 |
// Re-fit *current* bases against mins (same algorithm layout chips use). |
| 1018 |
const fitted=UI.WPBC_BFB_Layout_Chips._fit_weights_respecting_min(b,row_el,eff.bases);if(Array.isArray(fitted)){const changed=fitted.some((v,i)=>Math.abs(v-eff.bases[i])>0.01);if(changed){b.layout.apply_bases_to_row(row_el,fitted);}}}catch(e){w._wpbc?.dev?.error?.('WPBC_BFB_Min_Width_Guard - refresh_row',e);}}apply_col_min(col_el){if(!col_el)return;let max_px=0;const colRect=col_el.getBoundingClientRect();col_el.querySelectorAll(':scope > .wpbc_bfb__field').forEach(field=>{const raw=field.getAttribute('data-min_width');let px=0;if(raw){const s=String(raw).trim().toLowerCase();if(s.endsWith('%')){const n=parseFloat(s);if(Number.isFinite(n)&&colRect.width>0){px=n/100*colRect.width;}else{px=0;}}else{px=this.parse_len_px(s);}}else{const cs=getComputedStyle(field);px=parseFloat(cs.minWidth||'0')||0;}if(px>max_px)max_px=px;});col_el.style.setProperty('--wpbc-col-min',max_px>0?Math.round(max_px)+'px':'0px');}parse_len_px(value){if(value==null)return 0;const s=String(value).trim().toLowerCase();if(s==='')return 0;if(s.endsWith('px')){const n=parseFloat(s);return Number.isFinite(n)?n:0;}if(s.endsWith('rem')||s.endsWith('em')){const n=parseFloat(s);const base=parseFloat(getComputedStyle(document.documentElement).fontSize)||16;return Number.isFinite(n)?n*base:0;}const n=parseFloat(s);return Number.isFinite(n)?n:0;}};/**
|
| 1019 |
* WPBC_BFB_Toggle_Normalizer
|
| 1020 |
*
|
| 1021 |
* Converts plain checkboxes into toggle UI:
|
| 1022 |
* <div class="inspector__control wpbc_ui__toggle">
|
| 1023 |
* <input type="checkbox" id="{unique}" data-inspector-key="..." class="inspector__input" role="switch"
|
| 1024 |
* aria-checked="true|false">
|
| 1025 |
* <label class="wpbc_ui__toggle_icon" for="{unique}"></label>
|
| 1026 |
* <label class="wpbc_ui__toggle_label" for="{unique}">Label</label>
|
| 1027 |
* </div>
|
| 1028 |
*
|
| 1029 |
* - Skips inputs already inside `.wpbc_ui__toggle`.
|
| 1030 |
* - Reuses an existing <label for="..."> text if present; otherwise falls back to nearby labels or attributes.
|
| 1031 |
* - Auto-generates a unique id when absent.
|
| 1032 |
*/UI.WPBC_BFB_Toggle_Normalizer=class{/**
|
| 1033 |
* Upgrade all raw checkboxes in a container to toggles.
|
| 1034 |
* @param {HTMLElement} root_el
|
| 1035 |
*/static upgrade_checkboxes_in(root_el){if(!root_el||!root_el.querySelectorAll){return;}var inputs=root_el.querySelectorAll('input[type="checkbox"]');if(!inputs.length){return;}Array.prototype.forEach.call(inputs,function(input){// 1) Skip if already inside toggle wrapper. |
| 1036 |
if(input.closest('.wpbc_ui__toggle')){return;}// Skip rows / where input checkbox explicitly marked with attribute 'data-wpbc-ui-no-toggle'. |
| 1037 |
if(input.hasAttribute('data-wpbc-ui-no-toggle')){return;}// 2) Ensure unique id; prefer existing. |
| 1038 |
var input_id=input.getAttribute('id');if(!input_id){var key=input.dataset&&input.dataset.inspectorKey?String(input.dataset.inspectorKey):'opt';input_id=UI.WPBC_BFB_Toggle_Normalizer.generate_unique_id('wpbc_ins_auto_'+key+'_');input.setAttribute('id',input_id);}// 3) Find best label text. |
| 1039 |
var label_text=UI.WPBC_BFB_Toggle_Normalizer.resolve_label_text(root_el,input,input_id);// 4) Build the toggle wrapper. |
| 1040 |
var wrapper=document.createElement('div');wrapper.className='inspector__control wpbc_ui__toggle';// Keep original input; just move it into wrapper. |
| 1041 |
input.classList.add('inspector__input');input.setAttribute('role','switch');input.setAttribute('aria-checked',input.checked?'true':'false');var icon_label=document.createElement('label');icon_label.className='wpbc_ui__toggle_icon';icon_label.setAttribute('for',input_id);var text_label=document.createElement('label');text_label.className='wpbc_ui__toggle_label';text_label.setAttribute('for',input_id);text_label.appendChild(document.createTextNode(label_text));// 5) Insert wrapper into DOM near the input. |
| 1042 |
// Preferred: replace the original labeled row if it matches typical inspector layout. |
| 1043 |
var replaced=UI.WPBC_BFB_Toggle_Normalizer.try_replace_known_row(input,wrapper,label_text);if(!replaced){if(!input.parentNode)return;// NEW guard |
| 1044 |
// Fallback: just wrap the input in place and append labels. |
| 1045 |
input.parentNode.insertBefore(wrapper,input);wrapper.appendChild(input);wrapper.appendChild(icon_label);wrapper.appendChild(text_label);}// 6) ARIA sync on change. |
| 1046 |
input.addEventListener('change',function(){input.setAttribute('aria-checked',input.checked?'true':'false');});});}/**
|
| 1047 |
* Generate a unique id with a given prefix.
|
| 1048 |
* @param {string} prefix
|
| 1049 |
* @returns {string}
|
| 1050 |
*/static generate_unique_id(prefix){var base=String(prefix||'wpbc_ins_auto_');var uid=Math.random().toString(36).slice(2,8);var id=base+uid;// Minimal collision guard in the current document scope. |
| 1051 |
while(document.getElementById(id)){uid=Math.random().toString(36).slice(2,8);id=base+uid;}return id;}/**
|
| 1052 |
* Resolve the best human label for an input.
|
| 1053 |
* Priority:
|
| 1054 |
* 1) <label for="{id}">text</label>
|
| 1055 |
* 2) nearest sibling/parent .inspector__label text
|
| 1056 |
* 3) input.getAttribute('aria-label') || data-label || data-inspector-key || name || 'Option'
|
| 1057 |
* @param {HTMLElement} root_el
|
| 1058 |
* @param {HTMLInputElement} input
|
| 1059 |
* @param {string} input_id
|
| 1060 |
* @returns {string}
|
| 1061 |
*/static resolve_label_text(root_el,input,input_id){// for= association |
| 1062 |
if(input_id){var assoc=root_el.querySelector('label[for="'+UI.WPBC_BFB_Toggle_Normalizer.css_escape(input_id)+'"]');if(assoc&&assoc.textContent){var txt=assoc.textContent.trim();// Remove the old label from DOM; its text will be used by toggle. |
| 1063 |
assoc.parentNode&&assoc.parentNode.removeChild(assoc);if(txt){return txt;}}}// nearby inspector label |
| 1064 |
var near_label=input.closest('.inspector__row');if(near_label){var il=near_label.querySelector('.inspector__label');if(il&&il.textContent){var t2=il.textContent.trim();// If this row had the standard label+control, drop the old text label to avoid duplicates. |
| 1065 |
il.parentNode&&il.parentNode.removeChild(il);if(t2){return t2;}}}// fallbacks |
| 1066 |
var aria=input.getAttribute('aria-label');if(aria){return aria;}if(input.dataset&&input.dataset.label){return String(input.dataset.label);}if(input.dataset&&input.dataset.inspectorKey){return String(input.dataset.inspectorKey);}if(input.name){return String(input.name);}return'Option';}/**
|
| 1067 |
* Try to replace a known inspector row pattern with a toggle wrapper.
|
| 1068 |
* Patterns:
|
| 1069 |
* <div.inspector__row>
|
| 1070 |
* <label.inspector__label>Text</label>
|
| 1071 |
* <div.inspector__control> [input[type=checkbox]] </div>
|
| 1072 |
* </div>
|
| 1073 |
*
|
| 1074 |
* @param {HTMLInputElement} input
|
| 1075 |
* @param {HTMLElement} wrapper
|
| 1076 |
* @returns {boolean} replaced
|
| 1077 |
*/static try_replace_known_row(input,wrapper,label_text){var row=input.closest('.inspector__row');var ctrl_wrap=input.parentElement;if(row&&ctrl_wrap&&ctrl_wrap.classList.contains('inspector__control')){// Clear control wrap and reinsert toggle structure. |
| 1078 |
while(ctrl_wrap.firstChild){ctrl_wrap.removeChild(ctrl_wrap.firstChild);}row.classList.add('inspector__row--toggle');ctrl_wrap.classList.add('wpbc_ui__toggle');ctrl_wrap.appendChild(input);var input_id=input.getAttribute('id');var icon_lbl=document.createElement('label');icon_lbl.className='wpbc_ui__toggle_icon';icon_lbl.setAttribute('for',input_id);var text_lbl=document.createElement('label');text_lbl.className='wpbc_ui__toggle_label';text_lbl.setAttribute('for',input_id);if(label_text){text_lbl.appendChild(document.createTextNode(label_text));}// If the row previously had a .inspector__label (we removed it in resolve_label_text), |
| 1079 |
// we intentionally do NOT recreate it; the toggle text label becomes the visible one. |
| 1080 |
// The text content is already resolved in resolve_label_text() and set below by caller. |
| 1081 |
ctrl_wrap.appendChild(icon_lbl);ctrl_wrap.appendChild(text_lbl);return true;}// Not a known pattern; caller will wrap in place. |
| 1082 |
return false;}/**
|
| 1083 |
* CSS.escape polyfill for selectors.
|
| 1084 |
* @param {string} s
|
| 1085 |
* @returns {string}
|
| 1086 |
*/static css_escape(s){s=String(s);if(window.CSS&&typeof window.CSS.escape==='function'){return window.CSS.escape(s);}return s.replace(/([^\w-])/g,'\\$1');}};/**
|
| 1087 |
* Apply all UI normalizers/enhancers to a container (post-render).
|
| 1088 |
* Keep this file small and add more normalizers later in one place.
|
| 1089 |
*
|
| 1090 |
* @param {HTMLElement} root
|
| 1091 |
*/UI.apply_post_render=function(root){if(!root){return;}try{UI.WPBC_BFB_ValueSlider?.init_on?.(root);}catch(e){/* noop */}try{var T=UI.WPBC_BFB_Toggle_Normalizer;if(T&&typeof T.upgrade_checkboxes_in==='function'){T.upgrade_checkboxes_in(root);}}catch(e){w._wpbc?.dev?.error?.('apply_post_render.toggle',e);}// Accessibility: keep aria-checked in sync for all toggles inside root. |
| 1092 |
try{root.querySelectorAll('.wpbc_ui__toggle input[type="checkbox"]').forEach(function(cb){if(cb.__wpbc_aria_hooked){return;}cb.__wpbc_aria_hooked=true;cb.setAttribute('aria-checked',cb.checked?'true':'false');// Delegate ‘change’ just once per render – native delegation still works fine for your logic. |
| 1093 |
cb.addEventListener('change',()=>{cb.setAttribute('aria-checked',cb.checked?'true':'false');},{passive:true});});}catch(e){w._wpbc?.dev?.error?.('apply_post_render.aria',e);}};UI.InspectorEnhancers=UI.InspectorEnhancers||function(){var regs=[];function register(name,selector,init,destroy){regs.push({name,selector,init,destroy});}function scan(root){if(!root)return;regs.forEach(function(r){root.querySelectorAll(r.selector).forEach(function(node){node.__wpbc_eh=node.__wpbc_eh||{};if(node.__wpbc_eh[r.name])return;try{r.init&&r.init(node,root);node.__wpbc_eh[r.name]=true;}catch(_e){}});});}function destroy(root){if(!root)return;regs.forEach(function(r){root.querySelectorAll(r.selector).forEach(function(node){try{r.destroy&&r.destroy(node,root);}catch(_e){}if(node.__wpbc_eh)delete node.__wpbc_eh[r.name];});});}return{register,scan,destroy};}();UI.WPBC_BFB_ValueSlider={init_on(root){var groups=(root.nodeType===1?[root]:[]).concat([].slice.call(root.querySelectorAll?.('[data-len-group]')||[]));groups.forEach(function(g){if(!g.matches||!g.matches('[data-len-group]'))return;if(g.__wpbc_len_wired)return;var number=g.querySelector('[data-len-value]');var range=g.querySelector('[data-len-range]');var unit=g.querySelector('[data-len-unit]');if(!number||!range)return;// Mirror constraints if missing on the range. |
| 1094 |
['min','max','step'].forEach(function(a){if(!range.hasAttribute(a)&&number.hasAttribute(a)){range.setAttribute(a,number.getAttribute(a));}});function sync_range_from_number(){if(range.value!==number.value){range.value=number.value;}}function dispatch_input(el){try{el.dispatchEvent(new Event('input',{bubbles:true}));}catch(_e){}}function dispatch_change(el){try{el.dispatchEvent(new Event('change',{bubbles:true}));}catch(_e){}}// Throttle range->number syncing (time-based). |
| 1095 |
var timer_id=0;var pending_val=null;var pending_change=false;var last_flush_ts=0;// Change this to tune speed: 50..120 ms is a good range. |
| 1096 |
var min_interval_ms=parseInt(g.dataset.lenThrottle||UI.VALUE_SLIDER_THROTTLE_MS,10);min_interval_ms=Number.isFinite(min_interval_ms)?Math.max(0,min_interval_ms):120;function flush_range_to_number(){timer_id=0;if(pending_val==null){return;}var next=String(pending_val);pending_val=null;if(number.value!==next){number.value=next;// IMPORTANT: only 'input' while dragging. |
| 1097 |
dispatch_input(number);}if(pending_change){pending_change=false;dispatch_change(number);}last_flush_ts=Date.now();}function schedule_range_to_number(val,emit_change){pending_val=val;if(emit_change){pending_change=true;}// If commit requested, flush immediately. |
| 1098 |
if(pending_change){if(timer_id){clearTimeout(timer_id);timer_id=0;}flush_range_to_number();return;}var now=Date.now();var delta=now-last_flush_ts;// If enough time passed, flush immediately; else schedule. |
| 1099 |
if(delta>=min_interval_ms){flush_range_to_number();return;}if(timer_id){return;}timer_id=setTimeout(flush_range_to_number,Math.max(0,min_interval_ms-delta));}function on_number_input(){sync_range_from_number();}function on_number_change(){sync_range_from_number();}function on_range_input(){schedule_range_to_number(range.value,false);}function on_range_change(){schedule_range_to_number(range.value,true);}number.addEventListener('input',on_number_input);number.addEventListener('change',on_number_change);range.addEventListener('input',on_range_input);range.addEventListener('change',on_range_change);if(unit){unit.addEventListener('change',function(){// We just nudge the number so upstream handlers re-run. |
| 1100 |
try{number.dispatchEvent(new Event('input',{bubbles:true}));}catch(_e){}});}// Initial sync |
| 1101 |
sync_range_from_number();g.__wpbc_len_wired={destroy(){number.removeEventListener('input',on_number_input);number.removeEventListener('change',on_number_change);range.removeEventListener('input',on_range_input);range.removeEventListener('change',on_range_change);}};});},destroy_on(root){var groups=(root&&root.nodeType===1?[root]:[]).concat([].slice.call(root.querySelectorAll?.('[data-len-group]')||[]));groups.forEach(function(g){if(!g.matches||!g.matches('[data-len-group]'))return;try{g.__wpbc_len_wired&&g.__wpbc_len_wired.destroy&&g.__wpbc_len_wired.destroy();}catch(_e){}delete g.__wpbc_len_wired;});}};// Register with the global enhancers hub. |
| 1102 |
UI.InspectorEnhancers&&UI.InspectorEnhancers.register('value-slider','[data-len-group]',function(el,_root){UI.WPBC_BFB_ValueSlider.init_on(el);},function(el,_root){UI.WPBC_BFB_ValueSlider.destroy_on(el);});// Single, load-order-safe patch so enhancers auto-run on every bind. |
| 1103 |
(function patchInspectorEnhancers(){function applyPatch(){var Inspector=w.WPBC_BFB_Inspector;if(!Inspector||Inspector.__wpbc_enhancers_patched)return false;Inspector.__wpbc_enhancers_patched=true;var orig=Inspector.prototype.bind_to_field;Inspector.prototype.bind_to_field=function(el){orig.call(this,el);try{var ins=this.panel||document.getElementById('wpbc_bfb__inspector')||document.querySelector('.wpbc_bfb__inspector');UI.InspectorEnhancers&&UI.InspectorEnhancers.scan(ins);}catch(_e){}};// Initial scan if the DOM is already present. |
| 1104 |
try{var insEl=document.getElementById('wpbc_bfb__inspector')||document.querySelector('.wpbc_bfb__inspector');UI.InspectorEnhancers&&UI.InspectorEnhancers.scan(insEl);}catch(_e){}return true;}// Try now; if Inspector isn’t defined yet, patch when it becomes ready. |
| 1105 |
if(!applyPatch()){document.addEventListener('wpbc_bfb_inspector_ready',function(){applyPatch();},{once:true});}})();})(window,document);// --------------------------------------------------------------------------------------------------------------------- |
| 1106 |
// == File /includes/page-form-builder/__js/core/bfb-sync-code-tools-tab.js | 2026-04-06 | 16:38 |
| 1107 |
// --------------------------------------------------------------------------------------------------------------------- |
| 1108 |
(function(w,d){'use strict';/**
|
| 1109 |
* Dispatch request to show a right sidebar panel.
|
| 1110 |
*
|
| 1111 |
* @param {string} panel_id
|
| 1112 |
* @param {string} tab_id
|
| 1113 |
*
|
| 1114 |
* @return {void}
|
| 1115 |
*/function wpbc_bfb__dispatch_show_panel(panel_id,tab_id){var event_detail;if(!panel_id||!tab_id){return;}event_detail={panel_id:panel_id,tab_id:tab_id};if(typeof w.wpbc_bfb__dispatch_event_safe==='function'){w.wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',event_detail);return;}d.dispatchEvent(new CustomEvent('wpbc_bfb:show_panel',{detail:event_detail}));}/**
|
| 1116 |
* Sync right sidebar with top mode tabs.
|
| 1117 |
*
|
| 1118 |
* Uses top tabs nav attribute `data-active-tab` as the source of truth.
|
| 1119 |
* This avoids false detection on initial page load, because top panels are
|
| 1120 |
* hidden by inline style `display:none`, not by the `hidden` attribute.
|
| 1121 |
*/class WPBC_BFB_Mode_Rightbar_Sync{constructor(){this.top_tabs_nav=null;this.advanced_tab_wrap=null;this.advanced_panel=null;this.mutation_observer=null;this.last_mode='';this.sync_rightbar_mode=this.sync_rightbar_mode.bind(this);this.handle_click=this.handle_click.bind(this);}/**
|
| 1122 |
* Init controller.
|
| 1123 |
*
|
| 1124 |
* @return {void}
|
| 1125 |
*/init(){this.top_tabs_nav=d.getElementById('wpbc_bfb__top_horisontal_nav');this.advanced_tab_wrap=d.querySelector('.wpbc_bfb__rightbar_tab_wrap--advanced_tools');this.advanced_panel=d.getElementById('wpbc_bfb__inspector_advanced_tools');if(!this.advanced_tab_wrap||!this.advanced_panel){return;}// Observe active tab changes in the top tabs nav. |
| 1126 |
if(this.top_tabs_nav){this.mutation_observer=new MutationObserver(this.sync_rightbar_mode);this.mutation_observer.observe(this.top_tabs_nav,{attributes:true,attributeFilter:['data-active-tab']});}// Fallback for click-driven switching. |
| 1127 |
d.addEventListener('click',this.handle_click,true);// Initial sync. |
| 1128 |
this.sync_rightbar_mode();}/**
|
| 1129 |
* Get active top tab id.
|
| 1130 |
*
|
| 1131 |
* Priority:
|
| 1132 |
* 1. data-active-tab from top tabs nav
|
| 1133 |
* 2. active CSS class in nav
|
| 1134 |
* 3. visible top panel fallback
|
| 1135 |
*
|
| 1136 |
* @return {string}
|
| 1137 |
*/get_active_top_tab_id(){var active_tab_id='';var active_link=null;var advanced_panel=null;var builder_panel=null;if(this.top_tabs_nav){active_tab_id=String(this.top_tabs_nav.getAttribute('data-active-tab')||'').trim();if(''!==active_tab_id){return active_tab_id;}active_link=this.top_tabs_nav.querySelector('.wpbc_ui_el__horis_nav_item.active [data-wpbc-bfb-tab]');if(active_link){active_tab_id=String(active_link.getAttribute('data-wpbc-bfb-tab')||'').trim();if(''!==active_tab_id){return active_tab_id;}}}// Final fallback: detect visible panel. |
| 1138 |
advanced_panel=d.querySelector('.wpbc_bfb__top_tab_section__advanced_tab');builder_panel=d.querySelector('.wpbc_bfb__top_tab_section__builder_tab');if(this.is_element_visible(advanced_panel)){return'advanced_tab';}if(this.is_element_visible(builder_panel)){return'builder_tab';}return'';}/**
|
| 1139 |
* Check element visibility.
|
| 1140 |
*
|
| 1141 |
* @param {HTMLElement|null} el
|
| 1142 |
*
|
| 1143 |
* @return {boolean}
|
| 1144 |
*/is_element_visible(el){var style;if(!el){return false;}style=w.getComputedStyle(el);if(!style){return false;}if('none'===style.display){return false;}if('hidden'===style.visibility){return false;}return true;}/**
|
| 1145 |
* Check if Advanced Mode is active.
|
| 1146 |
*
|
| 1147 |
* @return {boolean}
|
| 1148 |
*/is_advanced_mode_active(){return'advanced_tab'===this.get_active_top_tab_id();}/**
|
| 1149 |
* Show Code Tools tab button.
|
| 1150 |
*
|
| 1151 |
* @return {void}
|
| 1152 |
*/show_advanced_tools_tab(){this.advanced_tab_wrap.removeAttribute('hidden');this.advanced_tab_wrap.setAttribute('aria-hidden','false');}/**
|
| 1153 |
* Hide Code Tools tab button.
|
| 1154 |
*
|
| 1155 |
* @return {void}
|
| 1156 |
*/hide_advanced_tools_tab(){this.advanced_tab_wrap.setAttribute('hidden','true');this.advanced_tab_wrap.setAttribute('aria-hidden','true');}/**
|
| 1157 |
* Check if Code Tools panel is currently active.
|
| 1158 |
*
|
| 1159 |
* @return {boolean}
|
| 1160 |
*/is_advanced_tools_panel_active(){return!!(this.advanced_panel&&!this.advanced_panel.hasAttribute('hidden'));}/**
|
| 1161 |
* Open Code Tools panel.
|
| 1162 |
*
|
| 1163 |
* @return {void}
|
| 1164 |
*/open_advanced_tools_panel(){wpbc_bfb__dispatch_show_panel('wpbc_bfb__inspector_advanced_tools','wpbc_tab_advanced_tools');}/**
|
| 1165 |
* Open default builder rightbar panel.
|
| 1166 |
*
|
| 1167 |
* @return {void}
|
| 1168 |
*/open_default_visual_panel(){wpbc_bfb__dispatch_show_panel('wpbc_bfb__palette_add_new','wpbc_tab_library');}/**
|
| 1169 |
* Sync rightbar mode with top tabs mode.
|
| 1170 |
*
|
| 1171 |
* @return {void}
|
| 1172 |
*/sync_rightbar_mode(){var is_advanced_mode=this.is_advanced_mode_active();if(is_advanced_mode){this.show_advanced_tools_tab();if('advanced'!==this.last_mode){this.open_advanced_tools_panel();}this.last_mode='advanced';return;}if(this.is_advanced_tools_panel_active()){this.open_default_visual_panel();}this.hide_advanced_tools_tab();this.last_mode='builder';}/**
|
| 1173 |
* Fallback click handler for top tabs.
|
| 1174 |
*
|
| 1175 |
* @param {Event} event
|
| 1176 |
*
|
| 1177 |
* @return {void}
|
| 1178 |
*/handle_click(event){var target=event.target.closest('[data-wpbc-bfb-tab]');var this_obj=this;if(!target){return;}setTimeout(function(){this_obj.sync_rightbar_mode();},0);}}if(d.readyState==='loading'){d.addEventListener('DOMContentLoaded',function(){new WPBC_BFB_Mode_Rightbar_Sync().init();});}else{new WPBC_BFB_Mode_Rightbar_Sync().init();}})(window,document);// --------------------------------------------------------------------------------------------------------------------- |
| 1179 |
// == File /includes/page-form-builder/_out/core/bfb-inspector.js == Time point: 2025-09-06 14:08 |
| 1180 |
// --------------------------------------------------------------------------------------------------------------------- |
| 1181 |
(function(w){'use strict';// 1) Actions registry. |
| 1182 |
/** @type {Record<string, (ctx: InspectorActionContext) => void>} */const __INSPECTOR_ACTIONS_MAP__=Object.create(null);// Built-ins. |
| 1183 |
__INSPECTOR_ACTIONS_MAP__['deselect']=({builder})=>{builder?.select_field?.(null);};__INSPECTOR_ACTIONS_MAP__['scrollto']=({builder,el})=>{if(!el||!document.body.contains(el))return;builder?.select_field?.(el,{scrollIntoView:true});el.classList.add('wpbc_bfb__scroll-pulse');setTimeout(()=>el.classList.remove('wpbc_bfb__scroll-pulse'),700);};__INSPECTOR_ACTIONS_MAP__['move-up']=({builder,el})=>{if(!el)return;builder?.move_item?.(el,'up');// Scroll after the DOM has settled. |
| 1184 |
requestAnimationFrame(()=>__INSPECTOR_ACTIONS_MAP__['scrollto']({builder,el}));};__INSPECTOR_ACTIONS_MAP__['move-down']=({builder,el})=>{if(!el)return;builder?.move_item?.(el,'down');// Scroll after the DOM has settled. |
| 1185 |
requestAnimationFrame(()=>__INSPECTOR_ACTIONS_MAP__['scrollto']({builder,el}));};__INSPECTOR_ACTIONS_MAP__['delete']=({builder,el,confirm=w.confirm})=>{if(!el)return;const is_field=el.classList.contains('wpbc_bfb__field');const label=is_field?el.querySelector('.wpbc_bfb__field-label')?.textContent||el.dataset?.id||'field':el.dataset?.id||'section';UI.Modal_Confirm_Delete.open(label,()=>{// Central command will remove, emit events, and reselect neighbor (which re-binds Inspector). |
| 1186 |
builder?.delete_item?.(el);});};__INSPECTOR_ACTIONS_MAP__['duplicate']=({builder,el})=>{if(!el)return;const clone=builder?.duplicate_item?.(el);if(clone)builder?.select_field?.(clone,{scrollIntoView:true});};// Public API. |
| 1187 |
w.WPBC_BFB_Inspector_Actions={run(name,ctx){const fn=__INSPECTOR_ACTIONS_MAP__[name];if(typeof fn==='function')fn(ctx);else console.warn('WPBC. Inspector action not found:',name);},register(name,handler){if(!name||typeof handler!=='function'){throw new Error('register(name, handler): invalid arguments');}__INSPECTOR_ACTIONS_MAP__[name]=handler;},has(name){return typeof __INSPECTOR_ACTIONS_MAP__[name]==='function';}};// 2) Inspector Factory. |
| 1188 |
var UI=w.WPBC_BFB_Core.UI=w.WPBC_BFB_Core.UI||{};// Global Hybrid++ registries (keep public). |
| 1189 |
w.wpbc_bfb_inspector_factory_slots=w.wpbc_bfb_inspector_factory_slots||{};w.wpbc_bfb_inspector_factory_value_from=w.wpbc_bfb_inspector_factory_value_from||{};// Define Factory only if missing (no early return for the whole bundle). |
| 1190 |
// always define/replace Factory |
| 1191 |
{/**
|
| 1192 |
* Utility: create element with attributes and children.
|
| 1193 |
*
|
| 1194 |
* @param {string} tag
|
| 1195 |
* @param {Object=} attrs
|
| 1196 |
* @param {(Node|string|Array<Node|string>)=} children
|
| 1197 |
* @returns {HTMLElement}
|
| 1198 |
*/function el(tag,attrs,children){var node=document.createElement(tag);if(attrs){Object.keys(attrs).forEach(function(k){var v=attrs[k];if(v==null)return;if(k==='class'){node.className=v;return;}if(k==='dataset'){Object.keys(v).forEach(function(dk){node.dataset[dk]=String(v[dk]);});return;}if(k==='checked'&&typeof v==='boolean'){if(v)node.setAttribute('checked','checked');return;}if(k==='disabled'&&typeof v==='boolean'){if(v)node.setAttribute('disabled','disabled');return;}// normalize boolean attributes to strings. |
| 1199 |
if(typeof v==='boolean'){node.setAttribute(k,v?'true':'false');return;}node.setAttribute(k,String(v));});}if(children){(Array.isArray(children)?children:[children]).forEach(function(c){if(c==null)return;node.appendChild(typeof c==='string'?document.createTextNode(c):c);});}return node;}/**
|
| 1200 |
* Build a toggle control row (checkbox rendered as toggle).
|
| 1201 |
*
|
| 1202 |
* Structure:
|
| 1203 |
* <div class="inspector__row inspector__row--toggle">
|
| 1204 |
* <div class="inspector__control wpbc_ui__toggle">
|
| 1205 |
* <input type="checkbox" id="ID" data-inspector-key="KEY" class="inspector__input" checked>
|
| 1206 |
* <label class="wpbc_ui__toggle_icon" for="ID"></label>
|
| 1207 |
* <label class="wpbc_ui__toggle_label" for="ID">Label text</label>
|
| 1208 |
* </div>
|
| 1209 |
* </div>
|
| 1210 |
*
|
| 1211 |
* @param {string} input_id
|
| 1212 |
* @param {string} key
|
| 1213 |
* @param {boolean} checked
|
| 1214 |
* @param {string} label_text
|
| 1215 |
* @returns {HTMLElement}
|
| 1216 |
*/function build_toggle_row(input_id,key,checked,label_text){var row_el=el('div',{'class':'inspector__row inspector__row--toggle'});var ctrl_wrap=el('div',{'class':'inspector__control wpbc_ui__toggle'});var input_el=el('input',{id:input_id,type:'checkbox','data-inspector-key':key,'class':'inspector__input',checked:!!checked,role:'switch','aria-checked':!!checked});var icon_lbl=el('label',{'class':'wpbc_ui__toggle_icon','for':input_id});var text_lbl=el('label',{'class':'wpbc_ui__toggle_label','for':input_id},label_text||'');ctrl_wrap.appendChild(input_el);ctrl_wrap.appendChild(icon_lbl);ctrl_wrap.appendChild(text_lbl);row_el.appendChild(ctrl_wrap);return row_el;}/**
|
| 1217 |
* Utility: choose initial value from data or schema default.
|
| 1218 |
*/function get_initial_value(key,data,props_schema){if(data&&Object.prototype.hasOwnProperty.call(data,key))return data[key];var meta=props_schema&&props_schema[key];return meta&&Object.prototype.hasOwnProperty.call(meta,'default')?meta.default:'';}/**
|
| 1219 |
* Utility: coerce value by schema type.
|
| 1220 |
*/function coerce_by_type(value,type){switch(type){case'number':case'int':case'float':if(value===''||value==null){return'';}var n=Number(value);return isNaN(n)?'':n;case'boolean':return!!value;case'array':return Array.isArray(value)?value:[];default:return value==null?'':String(value);}}/**
|
| 1221 |
* Normalize <select> options (array of {value,label} or map {value:label}).
|
| 1222 |
*/function normalize_select_options(options){if(Array.isArray(options)){return options.map(function(o){if(typeof o==='object'&&o&&'value'in o){return{value:String(o.value),label:String(o.label||o.value)};}return{value:String(o),label:String(o)};});}if(options&&typeof options==='object'){return Object.keys(options).map(function(k){return{value:String(k),label:String(options[k])};});}return[];}/** Parse a CSS length like "120px" or "80%" into { value:number, unit:string }. */function parse_len(value,fallback_unit){value=value==null?'':String(value).trim();var m=value.match(/^(-?\d+(?:\.\d+)?)(px|%|rem|em)$/i);if(m){return{value:parseFloat(m[1]),unit:m[2].toLowerCase()};}// plain number -> assume fallback unit |
| 1223 |
if(value!==''&&!isNaN(Number(value))){return{value:Number(value),unit:fallback_unit||'px'};}return{value:0,unit:fallback_unit||'px'};}/** Clamp helper. */function clamp_num(v,min,max){if(typeof v!=='number'||isNaN(v))return min!=null?min:0;if(min!=null&&v<min)v=min;if(max!=null&&v>max)v=max;return v;}// Initialize Coloris pickers in a given root. |
| 1224 |
// Relies on Coloris being enqueued (see bfb-bootstrap.php). |
| 1225 |
function init_coloris_pickers(root){if(!root||!w.Coloris)return;// Mark inputs we want Coloris to handle. |
| 1226 |
var inputs=root.querySelectorAll('input[data-inspector-type="color"]');if(!inputs.length)return;// Add a stable class for Coloris targeting; avoid double-initializing. |
| 1227 |
inputs.forEach(function(input){if(input.classList.contains('wpbc_bfb_coloris'))return;input.classList.add('wpbc_bfb_coloris');});// Create/refresh a Coloris instance bound to these inputs. |
| 1228 |
// Keep HEX output to match schema defaults (e.g., "#e0e0e0"). |
| 1229 |
try{w.Coloris({el:'.wpbc_bfb_coloris',alpha:false,format:'hex',themeMode:'auto'});// Coloris already dispatches 'input' events on value changes. |
| 1230 |
}catch(e){// Non-fatal: if Coloris throws (rare), the text input still works. |
| 1231 |
console.warn('WPBC Inspector: Coloris init failed:',e);}}/**
|
| 1232 |
* Build: slider + number in one row (writes to a single data key).
|
| 1233 |
* Control meta: { type:'range_number', key, label, min, max, step }
|
| 1234 |
*/function build_range_number_row(input_id,key,label_text,value,meta){var row_el=el('div',{'class':'inspector__row'});var label_el=el('label',{'for':input_id,'class':'inspector__label'},label_text||key||'');var ctrl=el('div',{'class':'inspector__control'});var min=meta&&meta.min!=null?meta.min:0;var max=meta&&meta.max!=null?meta.max:100;var step=meta&&meta.step!=null?meta.step:1;var group=el('div',{'class':'wpbc_len_group wpbc_inline_inputs','data-len-group':key});var range=el('input',{type:'range','class':'inspector__input','data-len-range':'',min:String(min),max:String(max),step:String(step),value:String(value==null||value===''?min:value)});var num=el('input',{id:input_id,type:'number','class':'inspector__input inspector__w_30','data-len-value':'','data-inspector-key':key,min:String(min),max:String(max),step:String(step),value:value==null||value===''?String(min):String(value)});group.appendChild(range);group.appendChild(num);ctrl.appendChild(group);row_el.appendChild(label_el);row_el.appendChild(ctrl);return row_el;}/**
|
| 1235 |
* Build: (number + unit) + slider, writing a *single* combined string to `key`.
|
| 1236 |
* Control meta:
|
| 1237 |
* {
|
| 1238 |
* type:'len', key, label, units:['px','%','rem','em'],
|
| 1239 |
* slider: { px:{min:0,max:512,step:1}, '%':{min:0,max:100,step:1}, rem:{min:0,max:10,step:0.1}, em:{...} },
|
| 1240 |
* fallback_unit:'px'
|
| 1241 |
* }
|
| 1242 |
*/function build_len_compound_row(control,props_schema,data,uid){var key=control.key;var label_text=control.label||key||'';var def_str=get_initial_value(key,data,props_schema);var fallback_u=control.fallback_unit||'px';var parsed=parse_len(def_str,fallback_u);var row=el('div',{'class':'inspector__row'});var label=el('label',{'class':'inspector__label'},label_text);var ctrl=el('div',{'class':'inspector__control'});var units=Array.isArray(control.units)&&control.units.length?control.units:['px','%','rem','em'];var slider_map=control.slider||{'px':{min:0,max:512,step:1},'%':{min:0,max:100,step:1},'rem':{min:0,max:10,step:0.1},'em':{min:0,max:10,step:0.1}};// Host with a hidden input that carries data-inspector-key to reuse the standard handler. |
| 1243 |
var group=el('div',{'class':'wpbc_len_group','data-len-group':key});var inline=el('div',{'class':'wpbc_inline_inputs'});var num=el('input',{type:'number','class':'inspector__input','data-len-value':'',min:'0',step:'any',value:String(parsed.value)});var sel=el('select',{'class':'inspector__input','data-len-unit':''});units.forEach(function(u){var opt=el('option',{value:u},u);if(u===parsed.unit)opt.setAttribute('selected','selected');sel.appendChild(opt);});inline.appendChild(num);inline.appendChild(sel);// Slider (unit-aware) |
| 1244 |
var current=slider_map[parsed.unit]||slider_map[units[0]];var range=el('input',{type:'range','class':'inspector__input','data-len-range':'',min:String(current.min),max:String(current.max),step:String(current.step),value:String(clamp_num(parsed.value,current.min,current.max))});// Hidden writer input that the default Inspector handler will catch. |
| 1245 |
var hidden=el('input',{type:'text','class':'inspector__input',style:'display:none','aria-hidden':'true',tabindex:'-1',id:'wpbc_ins_'+key+'_'+uid+'_len_hidden','data-inspector-key':key,value:String(parsed.value)+parsed.unit});group.appendChild(inline);group.appendChild(range);group.appendChild(hidden);ctrl.appendChild(group);row.appendChild(label);row.appendChild(ctrl);return row;}/**
|
| 1246 |
* Wire syncing for any .wpbc_len_group inside a given root (panel).
|
| 1247 |
* - range ⇄ number sync
|
| 1248 |
* - unit switches update slider bounds
|
| 1249 |
* - hidden writer (if present) gets updated and emits 'input'
|
| 1250 |
*/function wire_len_group(root){if(!root)return;function find_group(el){return el&&el.closest&&el.closest('.wpbc_len_group');}root.addEventListener('input',function(e){var t=e.target;// Slider moved -> update number (and writer/hidden) |
| 1251 |
if(t&&t.hasAttribute('data-len-range')){var g=find_group(t);if(!g)return;var num=g.querySelector('[data-len-value]');if(num){num.value=t.value;}var writer=g.querySelector('[data-inspector-key]');if(writer&&writer.type==='text'){var unit=g.querySelector('[data-len-unit]');unit=unit?unit.value:'px';writer.value=String(t.value)+String(unit);// trigger standard inspector handler: |
| 1252 |
writer.dispatchEvent(new Event('input',{bubbles:true}));}else{// Plain range_number case (number has data-inspector-key) -> fire input on number |
| 1253 |
if(num&&num.hasAttribute('data-inspector-key')){num.dispatchEvent(new Event('input',{bubbles:true}));}}}// Number typed -> update slider and writer/hidden |
| 1254 |
if(t&&t.hasAttribute('data-len-value')){var g=find_group(t);if(!g)return;var r=g.querySelector('[data-len-range]');if(r){// clamp within slider bounds if present |
| 1255 |
var min=Number(r.min);var max=Number(r.max);var v=Number(t.value);if(!isNaN(v)){v=clamp_num(v,isNaN(min)?undefined:min,isNaN(max)?undefined:max);r.value=String(v);if(String(v)!==t.value)t.value=String(v);}}var writer=g.querySelector('[data-inspector-key]');if(writer&&writer.type==='text'){var unit=g.querySelector('[data-len-unit]');unit=unit?unit.value:'px';writer.value=String(t.value||0)+String(unit);writer.dispatchEvent(new Event('input',{bubbles:true}));}// else: number itself likely carries data-inspector-key (range_number); default handler will run. |
| 1256 |
}},true);root.addEventListener('change',function(e){var t=e.target;// Unit changed -> update slider limits and writer/hidden |
| 1257 |
if(t&&t.hasAttribute('data-len-unit')){var g=find_group(t);if(!g)return;// Find the control meta via a data attribute on group if provided |
| 1258 |
// (Factory path sets nothing here; we re-derive from current slider bounds.) |
| 1259 |
var r=g.querySelector('[data-len-range]');var num=g.querySelector('[data-len-value]');var writer=g.querySelector('[data-inspector-key]');var unit=t.value||'px';// Adjust slider bounds heuristically (match Factory defaults) |
| 1260 |
var bounds_by_unit={'px':{min:0,max:512,step:1},'%':{min:0,max:100,step:1},'rem':{min:0,max:10,step:0.1},'em':{min:0,max:10,step:0.1}};if(r){var b=bounds_by_unit[unit]||bounds_by_unit['px'];r.min=String(b.min);r.max=String(b.max);r.step=String(b.step);// clamp to new bounds |
| 1261 |
var v=Number(num&&num.value?num.value:r.value);if(!isNaN(v)){v=clamp_num(v,b.min,b.max);r.value=String(v);if(num)num.value=String(v);}}if(writer&&writer.type==='text'){var v=num&&num.value?num.value:r?r.value:'0';writer.value=String(v)+String(unit);writer.dispatchEvent(new Event('input',{bubbles:true}));}}},true);}// ============================================================================================================= |
| 1262 |
// == C O N T R O L == |
| 1263 |
// ============================================================================================================= |
| 1264 |
/**
|
| 1265 |
* Schema > Inspector > Control Element, e.g. Input! Build a single control row:
|
| 1266 |
* <div class="inspector__row">
|
| 1267 |
* <label class="inspector__label" for="...">Label</label>
|
| 1268 |
* <div class="inspector__control"><input|textarea|select class="inspector__input" ...></div>
|
| 1269 |
* </div>
|
| 1270 |
*
|
| 1271 |
* @param {Object} control - schema control meta ({type,key,label,...})
|
| 1272 |
* @param {Object} props_schema - schema.props
|
| 1273 |
* @param {Object} data - current element data-* map
|
| 1274 |
* @param {string} uid - unique suffix for input ids
|
| 1275 |
* @param {Object} ctx - { el, builder, type, data }
|
| 1276 |
* @returns {HTMLElement}
|
| 1277 |
*/function build_control(control,props_schema,data,uid,ctx){var type=control.type;var key=control.key;var label_text=control.label||key||'';var prop_meta=key?props_schema[key]||{type:'string'}:{type:'string'};var value=coerce_by_type(get_initial_value(key,data,props_schema),prop_meta.type);// Allow value_from override (computed at render-time). |
| 1278 |
if(control&&control.value_from&&w.wpbc_bfb_inspector_factory_value_from[control.value_from]){try{var computed=w.wpbc_bfb_inspector_factory_value_from[control.value_from](ctx||{});value=coerce_by_type(computed,prop_meta.type);}catch(e){console.warn('value_from failed for',control.value_from,e);}}var input_id='wpbc_ins_'+key+'_'+uid;var row_el=el('div',{'class':'inspector__row'});var label_el=el('label',{'for':input_id,'class':'inspector__label'},label_text);var ctrl_wrap=el('div',{'class':'inspector__control'});var field_el;// --- slot host (named UI injection) ----------------------------------- |
| 1279 |
if(type==='slot'&&control.slot){// add a marker class for the layout chips row |
| 1280 |
var classes='inspector__row inspector__row--slot';if(control.slot==='layout_chips')classes+=' inspector__row--layout-chips';var slot_row=el('div',{'class':classes});if(label_text)slot_row.appendChild(el('label',{'class':'inspector__label'},label_text));// add a data attribute on the host so both CSS and the safety-net can target it |
| 1281 |
var host_attrs={'class':'inspector__control'};if(control.slot==='layout_chips')host_attrs['data-bfb-slot']='layout_chips';var slot_host=el('div',host_attrs);slot_row.appendChild(slot_host);var slot_fn=w.wpbc_bfb_inspector_factory_slots[control.slot];if(typeof slot_fn==='function'){setTimeout(function(){try{slot_fn(slot_host,ctx||{});}catch(e){console.warn('slot "'+control.slot+'" failed:',e);}},0);}else{slot_host.appendChild(el('div',{'class':'wpbc_bfb__slot__missing'},'[slot: '+control.slot+']'));}return slot_row;}if(type==='textarea'){field_el=el('textarea',{id:input_id,'data-inspector-key':key,rows:control.rows||3,'class':'inspector__input'},value==null?'':String(value));}else if(type==='select'){field_el=el('select',{id:input_id,'data-inspector-key':key,'class':'inspector__input'});normalize_select_options(control.options||[]).forEach(function(opt){var opt_el=el('option',{value:opt.value},opt.label);if(String(value)===opt.value)opt_el.setAttribute('selected','selected');field_el.appendChild(opt_el);});}else if(type==='checkbox'){// field_el = el( 'input', { id: input_id, type: 'checkbox', 'data-inspector-key': key, checked: !!value, 'class': 'inspector__input' } ); //. |
| 1282 |
// Render as toggle UI instead of label-left + checkbox. Note: we return the full toggle row here and skip the default row/label flow below. |
| 1283 |
return build_toggle_row(input_id,key,!!value,label_text);}else if(type==='range_number'){// --- new: slider + number (single key). |
| 1284 |
var rn_id='wpbc_ins_'+key+'_'+uid;var rn_val=value;// from get_initial_value/prop_meta already. |
| 1285 |
return build_range_number_row(rn_id,key,label_text,rn_val,control);}else if(type==='len'){// --- new: length compound (value+unit+slider -> writes a single string key). |
| 1286 |
return build_len_compound_row(control,props_schema,data,uid);}else if(type==='color'){// Color picker (Coloris). Store as string (e.g., "#e0e0e0"). |
| 1287 |
field_el=el('input',{id:input_id,type:'text','data-inspector-key':key,'data-inspector-type':'color','data-coloris':'','class':'inspector__input','data-default-color':value!=null&&value!==''?String(value):control.placeholder||''});if(value!==''){field_el.value=String(value);}}else{// text/number default. |
| 1288 |
var attrs={id:input_id,type:type==='number'?'number':'text','data-inspector-key':key,'class':'inspector__input'};// number constraints (schema or control) |
| 1289 |
if(type==='number'){if(Object.prototype.hasOwnProperty.call(prop_meta,'min'))attrs.min=prop_meta.min;if(Object.prototype.hasOwnProperty.call(prop_meta,'max'))attrs.max=prop_meta.max;if(Object.prototype.hasOwnProperty.call(prop_meta,'step'))attrs.step=prop_meta.step;if(Object.prototype.hasOwnProperty.call(control,'min'))attrs.min=control.min;if(Object.prototype.hasOwnProperty.call(control,'max'))attrs.max=control.max;if(Object.prototype.hasOwnProperty.call(control,'step'))attrs.step=control.step;}field_el=el('input',attrs);if(value!=='')field_el.value=String(value);}ctrl_wrap.appendChild(field_el);row_el.appendChild(label_el);row_el.appendChild(ctrl_wrap);return row_el;}/**
|
| 1290 |
* Schema > Inspector > Groups! Build an inspector group (collapsible).
|
| 1291 |
* Structure:
|
| 1292 |
* <section class="wpbc_bfb__inspector__group wpbc_ui__collapsible_group is-open" data-group="...">
|
| 1293 |
* <button type="button" class="group__header" role="button" aria-expanded="true" aria-controls="wpbc_collapsible_panel_X">
|
| 1294 |
* <h3>Group Title</h3>
|
| 1295 |
* <i class="wpbc_ui_el__vert_menu_root_section_icon menu_icon icon-1x wpbc-bi-chevron-right"></i>
|
| 1296 |
* </button>
|
| 1297 |
* <div class="group__fields" id="wpbc_collapsible_panel_X" aria-hidden="false"> …rows… </div>
|
| 1298 |
* </section>
|
| 1299 |
*
|
| 1300 |
* @param {Object} group
|
| 1301 |
* @param {Object} props_schema
|
| 1302 |
* @param {Object} data
|
| 1303 |
* @param {string} uid
|
| 1304 |
* @param {Object} ctx
|
| 1305 |
* @returns {HTMLElement}
|
| 1306 |
*/function build_group(group,props_schema,data,uid,ctx){var is_open=!!group.open;var panel_id='wpbc_collapsible_panel_'+uid+'_'+(group.key||'g');var section=el('section',{'class':'wpbc_bfb__inspector__group wpbc_ui__collapsible_group'+(is_open?' is-open':''),'data-group':group.key||''});var header_btn=el('button',{type:'button','class':'group__header',role:'button','aria-expanded':is_open?'true':'false','aria-controls':panel_id},[el('h3',null,group.title||group.label||group.key||''),el('i',{'class':'wpbc_ui_el__vert_menu_root_section_icon menu_icon icon-1x wpbc-bi-chevron-right'})]);var fields=el('div',{'class':'group__fields',id:panel_id,'aria-hidden':is_open?'false':'true'});function asArray(x){if(Array.isArray(x))return x;if(x&&typeof x==='object')return Object.values(x);return x!=null?[x]:[];}asArray(group.controls).forEach(function(control){fields.appendChild(build_control(control,props_schema,data,uid,ctx));});section.appendChild(header_btn);section.appendChild(fields);return section;}/**
|
| 1307 |
* Schema > Inspector > Header! Build inspector header with action buttons wired to existing data-action handlers.
|
| 1308 |
*
|
| 1309 |
* @param {Array<string>} header_actions
|
| 1310 |
* @param {string} title_text
|
| 1311 |
* @returns {HTMLElement}
|
| 1312 |
*/function build_header(inspector_ui,title_fallback,schema_for_type){inspector_ui=inspector_ui||{};schema_for_type=schema_for_type||{};var variant=inspector_ui.header_variant||'minimal';var headerActions=inspector_ui.header_actions||schema_for_type.header_actions||['deselect','scrollto','move-up','move-down','duplicate','delete'];var title=inspector_ui.title||title_fallback||'';var description=inspector_ui.description||'';// helper to create a button for either header style |
| 1313 |
function actionBtn(act,minimal){if(minimal){return el('button',{type:'button','class':'button-link','data-action':act},'');}// toolbar variant (rich) |
| 1314 |
var iconMap={'deselect':'wpbc_icn_remove_done','scrollto':'wpbc_icn_ads_click filter_center_focus','move-up':'wpbc_icn_arrow_upward','move-down':'wpbc_icn_arrow_downward','duplicate':'wpbc_icn_content_copy','delete':'wpbc_icn_delete_outline'};var classes='button button-secondary wpbc_ui_control wpbc_ui_button';if(act==='delete')classes+=' wpbc_ui_button_danger button-link-delete';var btn=el('button',{type:'button','class':classes,'data-action':act,'aria-label':act.replace(/-/g,' ')});if(act==='delete'){btn.appendChild(el('span',{'class':'in-button-text'},'Delete'));btn.appendChild(document.createTextNode(' '));// minor spacing before icon |
| 1315 |
}btn.appendChild(el('i',{'class':'menu_icon icon-1x '+(iconMap[act]||'')}));return btn;}// === minimal header (existing look; default) === |
| 1316 |
if(variant!=='toolbar'){var header=el('header',{'class':'wpbc_bfb__inspector__header'});header.appendChild(el('h3',null,title||''));var actions=el('div',{'class':'wpbc_bfb__inspector__header_actions'});headerActions.forEach(function(act){actions.appendChild(actionBtn(act,/*minimal*/true));});header.appendChild(actions);return header;}// === toolbar header (rich title/desc + grouped buttons) === |
| 1317 |
var root=el('div',{'class':'wpbc_bfb__inspector__head'});var wrap=el('div',{'class':'header_container'});var left=el('div',{'class':'header_title_content'});var h3=el('h3',{'class':'title'},title||'');left.appendChild(h3);if(description){left.appendChild(el('div',{'class':'desc'},description));}var right=el('div',{'class':'actions wpbc_ajx_toolbar wpbc_no_borders'});var uiC=el('div',{'class':'ui_container ui_container_small'});var uiG=el('div',{'class':'ui_group'});// Split into visual groups: first 2, next 2, then the rest. |
| 1318 |
var g1=el('div',{'class':'ui_element'});var g2=el('div',{'class':'ui_element'});var g3=el('div',{'class':'ui_element'});headerActions.slice(0,2).forEach(function(act){g1.appendChild(actionBtn(act,false));});headerActions.slice(2,4).forEach(function(act){g2.appendChild(actionBtn(act,false));});headerActions.slice(4).forEach(function(act){g3.appendChild(actionBtn(act,false));});uiG.appendChild(g1);uiG.appendChild(g2);uiG.appendChild(g3);uiC.appendChild(uiG);right.appendChild(uiC);wrap.appendChild(left);wrap.appendChild(right);root.appendChild(wrap);return root;}function factory_render(panel_el,schema_for_type,data,opts){if(!panel_el)return panel_el;schema_for_type=schema_for_type||{};var props_schema=schema_for_type.schema&&schema_for_type.schema.props?schema_for_type.schema.props:{};var inspector_ui=schema_for_type.inspector_ui||{};var groups=inspector_ui.groups||[];var header_actions=inspector_ui.header_actions||schema_for_type.header_actions||[];var title_text=opts&&opts.title||inspector_ui.title||schema_for_type.label||data&&data.label||'';// Prepare rendering context for slots/value_from, etc. |
| 1319 |
var ctx={el:opts&&opts.el||null,builder:opts&&opts.builder||null,type:opts&&opts.type||null,data:data||{}};// clear panel. |
| 1320 |
while(panel_el.firstChild)panel_el.removeChild(panel_el.firstChild);var uid=Math.random().toString(36).slice(2,8);// header. |
| 1321 |
panel_el.appendChild(build_header(inspector_ui,title_text,schema_for_type));// groups. |
| 1322 |
groups.forEach(function(g){panel_el.appendChild(build_group(g,props_schema,data||{},uid,ctx));});// ARIA sync for toggles created here (ensure aria-checked matches state). |
| 1323 |
try{// Centralized UI normalizers (toggles + A11y): handled in Core. |
| 1324 |
UI.apply_post_render(panel_el);try{wire_len_group(panel_el);// Initialize Coloris on color inputs rendered in this panel. |
| 1325 |
init_coloris_pickers(panel_el);}catch(_){}}catch(_){}return panel_el;}UI.WPBC_BFB_Inspector_Factory={render:factory_render};// overwrite/refresh |
| 1326 |
// ---- Built-in slot + value_from for Sections ---- |
| 1327 |
function slot_layout_chips(host,ctx){try{var L=w.WPBC_BFB_Core&&w.WPBC_BFB_Core.UI&&w.WPBC_BFB_Core.UI.WPBC_BFB_Layout_Chips;if(L&&typeof L.render_for_section==='function'){L.render_for_section(ctx.builder,ctx.el,host);}else{host.appendChild(document.createTextNode('[layout_chips not available]'));}}catch(e){console.warn('wpbc_bfb_slot_layout_chips failed:',e);}}w.wpbc_bfb_inspector_factory_slots.layout_chips=slot_layout_chips;function value_from_compute_section_columns(ctx){try{var row=ctx&&ctx.el&&ctx.el.querySelector&&ctx.el.querySelector(':scope > .wpbc_bfb__row');if(!row)return 1;var n=row.querySelectorAll(':scope > .wpbc_bfb__column').length||1;if(n<1)n=1;if(n>4)n=4;return n;}catch(_){return 1;}}w.wpbc_bfb_inspector_factory_value_from.compute_section_columns=value_from_compute_section_columns;}// 3) Inspector class. |
| 1328 |
class WPBC_BFB_Inspector{constructor(panel_el,builder){this.panel=panel_el||this._create_fallback_panel();this.builder=builder;this.selected_el=null;this._render_timer=null;this._on_delegated_input=e=>this._apply_control_from_event(e);this._on_delegated_change=e=>this._apply_control_from_event(e);this.panel.addEventListener('input',this._on_delegated_input,true);this.panel.addEventListener('change',this._on_delegated_change,true);this._on_delegated_click=e=>{const btn=e.target.closest('[data-action]');if(!btn||!this.panel.contains(btn))return;e.preventDefault();e.stopPropagation();const action=btn.getAttribute('data-action');const el=this.selected_el;if(!el)return;w.WPBC_BFB_Inspector_Actions?.run(action,{builder:this.builder,el,panel:this.panel,event:e});if(action==='delete')this.clear();};this.panel.addEventListener('click',this._on_delegated_click);}_post_render_ui(){try{var UI=w.WPBC_BFB_Core&&w.WPBC_BFB_Core.UI;if(UI&&typeof UI.apply_post_render==='function'){UI.apply_post_render(this.panel);}// NEW: wire slider/number/unit syncing for length & range_number groups. |
| 1329 |
try{wire_len_group(this.panel);init_coloris_pickers(this.panel);}catch(_){}}catch(e){_wpbc?.dev?.error?.('inspector._post_render_ui',e);}}_apply_control_from_event(e){if(!this.panel.contains(e.target))return;const t=/** @type {HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement} */e.target;const key=t?.dataset?.inspectorKey;if(!key)return;const el=this.selected_el;if(!el||!document.body.contains(el))return;let v;if(t instanceof HTMLInputElement&&t.type==='checkbox'){v=!!t.checked;t.setAttribute('aria-checked',v?'true':'false');// Keep ARIA state in sync for toggles (schema and template paths). |
| 1330 |
}else if(t instanceof HTMLInputElement&&t.type==='number'){v=t.value===''?'':Number(t.value);}else{v=t.value;}if(key==='id'){const unique=this.builder?.id?.set_field_id?.(el,v);if(unique!=null&&t.value!==unique)t.value=unique;}else if(key==='name'){const unique=this.builder?.id?.set_field_name?.(el,v);if(unique!=null&&t.value!==unique)t.value=unique;}else if(key==='html_id'){const applied=this.builder?.id?.set_field_html_id?.(el,v);if(applied!=null&&t.value!==applied)t.value=applied;}else if(key==='columns'&&el.classList.contains('wpbc_bfb__section')){const v_int=parseInt(String(v),10);if(Number.isFinite(v_int)){const clamped=w.WPBC_BFB_Core.WPBC_BFB_Sanitize.clamp(v_int,1,4);this.builder?.set_section_columns?.(el,clamped);if(String(clamped)!==t.value)t.value=String(clamped);}}else{if(t instanceof HTMLInputElement&&t.type==='checkbox'){el.setAttribute('data-'+key,String(!!v));}else if(t instanceof HTMLInputElement&&t.type==='number'){if(t.value===''||!Number.isFinite(v)){el.removeAttribute('data-'+key);}else{el.setAttribute('data-'+key,String(v));}}else if(v==null){el.removeAttribute('data-'+key);}else{el.setAttribute('data-'+key,typeof v==='object'?JSON.stringify(v):String(v));}}// Update preview/overlay |
| 1331 |
if(el.classList.contains('wpbc_bfb__field')){if(this.builder?.preview_mode)this.builder.render_preview(el);else this.builder.add_overlay_toolbar(el);}else{this.builder.add_overlay_toolbar(el);}if(this._needs_rerender(el,key,e)){this._schedule_render_preserving_focus(0);}}_needs_rerender(el,key,_e){if(el.classList.contains('wpbc_bfb__section')&&key==='columns')return true;return false;}bind_to_field(field_el){this.selected_el=field_el;this.render();}clear(){this.selected_el=null;if(this._render_timer){clearTimeout(this._render_timer);this._render_timer=null;}// Also clear the section-cols hint on empty state. |
| 1332 |
this.panel.removeAttribute('data-bfb-section-cols');this.panel.innerHTML='<div class="wpbc_bfb__inspector__empty">Select a field to edit its options.</div>';}_schedule_render_preserving_focus(delay=200){const active=/** @type {HTMLInputElement|HTMLTextAreaElement|HTMLElement|null} */document.activeElement;const activeKey=active?.dataset?.inspectorKey||null;let selStart=null,selEnd=null;if(active&&'selectionStart'in active&&'selectionEnd'in active){// @ts-ignore |
| 1333 |
selStart=active.selectionStart;// @ts-ignore |
| 1334 |
selEnd=active.selectionEnd;}if(this._render_timer)clearTimeout(this._render_timer);this._render_timer=/** @type {unknown} */setTimeout(()=>{this.render();if(activeKey){const next=/** @type {HTMLInputElement|HTMLTextAreaElement|HTMLElement|null} */this.panel.querySelector(`[data-inspector-key="${activeKey}"]`);if(next){next.focus();try{if(selStart!=null&&selEnd!=null&&typeof next.setSelectionRange==='function'){// @ts-ignore |
| 1335 |
next.setSelectionRange(selStart,selEnd);}}catch(e){_wpbc?.dev?.error('_render_timer',e);}}}},delay);}render(){const el=this.selected_el;if(!el||!document.body.contains(el))return this.clear();// Reset section-cols hint unless we set it later for a section. |
| 1336 |
this.panel.removeAttribute('data-bfb-section-cols');const prev_scroll=this.panel.scrollTop;// Section |
| 1337 |
if(el.classList.contains('wpbc_bfb__section')){let tpl=null;try{tpl=w.wp&&wp.template&&document.getElementById('tmpl-wpbc-bfb-inspector-section')?wp.template('wpbc-bfb-inspector-section'):null;}catch(_){tpl=null;}if(tpl){this.panel.innerHTML=tpl({});this._enforce_default_group_open();this._set_panel_section_cols(el);this._post_render_ui();this.panel.scrollTop=prev_scroll;return;}const Factory=w.WPBC_BFB_Core.UI&&w.WPBC_BFB_Core.UI.WPBC_BFB_Inspector_Factory;const schemas=w.WPBC_BFB_Schemas||{};const entry=schemas['section']||null;if(entry&&Factory){this.panel.innerHTML='';Factory.render(this.panel,entry,{},{el,builder:this.builder,type:'section',title:entry.label||'Section'});this._enforce_default_group_open();// --- Safety net: if for any reason the slot didn’t render chips, inject them now. |
| 1338 |
try{const hasSlotHost=this.panel.querySelector('[data-bfb-slot="layout_chips"]')||this.panel.querySelector('.inspector__row--layout-chips .wpbc_bfb__layout_chips')||this.panel.querySelector('#wpbc_bfb__layout_chips_host');const hasChips=!!this.panel.querySelector('.wpbc_bfb__layout_chip');if(!hasChips){// Create a host if missing and render chips into it. |
| 1339 |
const host=function ensureHost(root){let h=root.querySelector('[data-bfb-slot="layout_chips"]')||root.querySelector('.inspector__row--layout-chips .wpbc_bfb__layout_chips')||root.querySelector('#wpbc_bfb__layout_chips_host');if(h)return h;// Fallback host inside (or after) the “layout” group |
| 1340 |
const fields=root.querySelector('.wpbc_bfb__inspector__group[data-group="layout"] .group__fields')||root.querySelector('.group__fields')||root;const row=document.createElement('div');row.className='inspector__row inspector__row--layout-chips';const lab=document.createElement('label');lab.className='inspector__label';lab.textContent='Layout';const ctl=document.createElement('div');ctl.className='inspector__control';h=document.createElement('div');h.className='wpbc_bfb__layout_chips';h.setAttribute('data-bfb-slot','layout_chips');ctl.appendChild(h);row.appendChild(lab);row.appendChild(ctl);fields.appendChild(row);return h;}(this.panel);const L=w.WPBC_BFB_Core&&w.WPBC_BFB_Core.UI&&w.WPBC_BFB_Core.UI.WPBC_BFB_Layout_Chips;if(L&&typeof L.render_for_section==='function'){host.innerHTML='';L.render_for_section(this.builder,el,host);}}}catch(e){_wpbc?.dev?.error('WPBC_BFB_Inspector - render',e);}this._set_panel_section_cols(el);this.panel.scrollTop=prev_scroll;return;}this.panel.innerHTML='<div class="wpbc_bfb__inspector__empty">Select a field to edit its options.</div>';return;}// Field |
| 1341 |
if(!el.classList.contains('wpbc_bfb__field'))return this.clear();const data=w.WPBC_BFB_Core.WPBC_Form_Builder_Helper.get_all_data_attributes(el);const type=data.type||'text';function _get_tpl(id){if(!w.wp||!wp.template)return null;if(!document.getElementById('tmpl-'+id))return null;try{return wp.template(id);}catch(e){return null;}}const tpl_id=`wpbc-bfb-inspector-${type}`;const tpl=_get_tpl(tpl_id);const generic_tpl=_get_tpl('wpbc-bfb-inspector-generic');const schemas=w.WPBC_BFB_Schemas||{};const schema_for_type=schemas[type]||null;const Factory=w.WPBC_BFB_Core.UI&&w.WPBC_BFB_Core.UI.WPBC_BFB_Inspector_Factory;if(tpl){// NEW: merge schema defaults so missing keys (esp. booleans) honor defaults on first paint |
| 1342 |
const hasOwn=Function.call.bind(Object.prototype.hasOwnProperty);const props=schema_for_type&&schema_for_type.schema&&schema_for_type.schema.props?schema_for_type.schema.props:{};const merged={...data};if(props){Object.keys(props).forEach(k=>{const meta=props[k]||{};if(!hasOwn(data,k)){if(hasOwn(meta,'default')){// Coerce booleans to a real boolean; leave others as-is |
| 1343 |
merged[k]=meta.type==='boolean'?!!meta.default:meta.default;}}else if(meta.type==='boolean'){// Explicit empty values are legacy unchecked booleans, not missing defaults. |
| 1344 |
merged[k]=w.WPBC_BFB_Core.WPBC_BFB_Sanitize.coerce_boolean(data[k],false);}else if(data[k]===''&&hasOwn(meta,'default')){merged[k]=meta.default;}});}this.panel.innerHTML=tpl(merged);this._post_render_ui();}else if(schema_for_type&&Factory){this.panel.innerHTML='';Factory.render(this.panel,schema_for_type,{...data},{el,builder:this.builder,type,title:data.label||''});// Ensure toggle normalizers and slider/number/unit wiring are attached. |
| 1345 |
this._post_render_ui();}else if(generic_tpl){this.panel.innerHTML=generic_tpl({...data});this._post_render_ui();}else{const msg=`There are no Inspector wp.template "${tpl_id}" or Schema for this "${String(type||'')}" element.`;this.panel.innerHTML='';const div=document.createElement('div');div.className='wpbc_bfb__inspector__empty';div.textContent=msg;// safe. |
| 1346 |
this.panel.appendChild(div);}this._enforce_default_group_open();this.panel.scrollTop=prev_scroll;}_enforce_default_group_open(){const groups=Array.from(this.panel.querySelectorAll('.wpbc_bfb__inspector__group'));if(!groups.length)return;let found=false;groups.forEach(g=>{if(!found&&g.classList.contains('is-open')){found=true;}else{if(g.classList.contains('is-open')){g.classList.remove('is-open');g.dispatchEvent(new Event('wpbc:collapsible:close',{bubbles:true}));}else{g.classList.remove('is-open');}}});if(!found){groups[0].classList.add('is-open');groups[0].dispatchEvent(new Event('wpbc:collapsible:open',{bubbles:true}));}}/**
|
| 1347 |
* Set data-bfb-section-cols on the inspector panel based on the current section.
|
| 1348 |
* Uses the registered compute fn if available; falls back to direct DOM.
|
| 1349 |
* @param {HTMLElement} sectionEl
|
| 1350 |
*/_set_panel_section_cols(sectionEl){try{// Prefer the already-registered value_from helper if present. |
| 1351 |
var compute=w.wpbc_bfb_inspector_factory_value_from&&w.wpbc_bfb_inspector_factory_value_from.compute_section_columns;var cols=1;if(typeof compute==='function'){cols=compute({el:sectionEl})||1;}else{// Fallback: compute directly from the DOM. |
| 1352 |
var row=sectionEl&§ionEl.querySelector(':scope > .wpbc_bfb__row');cols=row?row.querySelectorAll(':scope > .wpbc_bfb__column').length||1:1;if(cols<1)cols=1;if(cols>4)cols=4;}this.panel.setAttribute('data-bfb-section-cols',String(cols));}catch(_){}}_create_fallback_panel(){const p=document.createElement('div');p.id='wpbc_bfb__inspector';p.className='wpbc_bfb__inspector';document.body.appendChild(p);return/** @type {HTMLDivElement} */p;}}// Export class + ready signal. |
| 1353 |
w.WPBC_BFB_Inspector=WPBC_BFB_Inspector;document.dispatchEvent(new Event('wpbc_bfb_inspector_ready'));})(window);
|
| 1354 |
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2Rpc3QvYmZiL19vdXQvd3BiY19iZmIuanMiLCJuYW1lcyI6WyJ3IiwiQ29yZSIsIldQQkNfQkZCX0NvcmUiLCJVSSIsIldQQkNfQkZCX1Nhbml0aXplIiwiZXNjX2NzcyIsInMiLCJDU1MiLCJlc2NhcGUiLCJTdHJpbmciLCJyZXBsYWNlIiwiZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yIiwidiIsInNhbml0aXplX2h0bWxfaWQiLCJ0cmltIiwidGVzdCIsInNhbml0aXplX2h0bWxfbmFtZSIsImVzY2FwZV9odG1sIiwiZXNjYXBlX3ZhbHVlX2Zvcl9hdHRyIiwic2FuaXRpemVfY3NzX2NsYXNzbGlzdCIsInRvX3Rva2VuIiwidG9fa2ViYWIiLCJ0b0xvd2VyQ2FzZSIsImlzX3RydXRoeSIsImNvZXJjZV9ib29sZWFuIiwiZGVmIiwicGFyc2VfcGVyY2VudCIsImZhbGxiYWNrX3ZhbHVlIiwibiIsInBhcnNlRmxvYXQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImNsYW1wIiwibWluIiwibWF4IiwiTWF0aCIsImVzY2FwZV9mb3JfYXR0cl9xdW90ZWQiLCJlc2NhcGVfZm9yX3Nob3J0Y29kZSIsInNhZmVfanNvbl9wYXJzZSIsImZhbGxiYWNrIiwiSlNPTiIsInBhcnNlIiwiXyIsInN0cmluZ2lmeV9kYXRhX3ZhbHVlIiwic3RyaW5naWZ5IiwiY29uc29sZSIsImVycm9yIiwic2FuaXRpemVfY3NzX2xlbiIsIm0iLCJtYXRjaCIsInNhbml0aXplX2hleF9jb2xvciIsIldQQkNfQkZCX0lkU2VydmljZSIsImNvbnN0cnVjdG9yIiwicGFnZXNfY29udGFpbmVyIiwiZW5zdXJlX3VuaXF1ZV9maWVsZF9pZCIsImJhc2VJZCIsImN1cnJlbnRFbCIsImJhc2UiLCJpZCIsImVzYyIsImVzY1VpZCIsIm5vdFNlbGYiLCJkYXRhc2V0IiwidWlkIiwicXVlcnlTZWxlY3RvciIsImZvdW5kIiwicmFuZG9tIiwidG9TdHJpbmciLCJzbGljZSIsImVuc3VyZV91bmlxdWVfZmllbGRfbmFtZSIsIm5hbWUiLCJzZWxlY3RvciIsImNsYXNoZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGVuZ3RoIiwic2V0X2ZpZWxkX2lkIiwiZmllbGRfZWwiLCJuZXdJZFJhdyIsInJlbmRlclByZXZpZXciLCJkZXNpcmVkIiwidW5pcXVlIiwic2V0QXR0cmlidXRlIiwic2V0X2ZpZWxkX25hbWUiLCJuZXdOYW1lUmF3IiwicmF3IiwiZ2V0QXR0cmlidXRlIiwic2V0X2ZpZWxkX2h0bWxfaWQiLCJuZXdIdG1sSWRSYXciLCJyZW1vdmVBdHRyaWJ1dGUiLCJodG1sSWQiLCJjbGFzaEluQ2FudmFzIiwiZG9tQ2xhc2giLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiZG9tQ2xhc2hJc1NlbGYiLCJjb250YWlucyIsIldQQkNfQkZCX0xheW91dFNlcnZpY2UiLCJvcHRzIiwiY29sX2dhcF9wZXJjZW50IiwiY29tcHV0ZV9lZmZlY3RpdmVfYmFzZXNfZnJvbV9yb3ciLCJyb3dfZWwiLCJnYXBfcGVyY2VudCIsImNvbHMiLCJBcnJheSIsImZyb20iLCJtYXAiLCJjb2wiLCJzdHlsZSIsImZsZXhCYXNpcyIsInAiLCJOYU4iLCJzdW1fcmF3IiwicmVkdWNlIiwiYSIsImIiLCJncCIsInRvdGFsX2dhcHMiLCJhdmFpbGFibGUiLCJzY2FsZSIsImJhc2VzIiwiYXBwbHlfYmFzZXNfdG9fcm93IiwiZm9yRWFjaCIsImkiLCJzZXRfZXF1YWxfYmFzZXMiLCJlYWNoIiwiZmlsbCIsImFwcGx5X2xheW91dF9wcmVzZXQiLCJzZWN0aW9uT3JSb3ciLCJ3ZWlnaHRzIiwicm93IiwiY2xhc3NMaXN0IiwiaXNBcnJheSIsInN1bSIsImJ1aWxkX3ByZXNldHNfZm9yX2NvbHVtbnMiLCJmb3JtYXRfcHJlc2V0X2xhYmVsIiwicm91bmQiLCJqb2luIiwicGFyc2Vfd2VpZ2h0cyIsImlucHV0Iiwic3BsaXQiLCJmaWx0ZXIiLCJXUEJDX0JGQl9Vc2FnZUxpbWl0U2VydmljZSIsInBhbGV0dGVfdWxzIiwicGFyc2VfdXNhZ2VfbGltaXQiLCJJbmZpbml0eSIsInBhcnNlSW50IiwiY291bnRfdXNhZ2VfYnlfa2V5IiwidXNlZCIsImFsbCIsImVsIiwia2V5IiwidXNhZ2Vfa2V5IiwidHlwZSIsImdldF9saW1pdF9mb3Jfa2V5Iiwicm9vdHMiLCJhbGxQYWxldHRlRmllbGRzIiwiZmxhdE1hcCIsInIiLCJsaW1pdCIsInVzYWdlbnVtYmVyIiwidXBkYXRlX3BhbGV0dGVfdWkiLCJ1c2FnZSIsInBhbGV0dGVzIiwicGFsIiwicGFuZWxfZmllbGQiLCJwYWxldHRlSWQiLCJ1c2FnZUtleSIsInJhd19saW1pdCIsInBlckVsTGltaXQiLCJnbG9iYWxMaW1pdCIsImN1cnJlbnQiLCJkaXNhYmxlIiwicG9pbnRlckV2ZW50cyIsIm9wYWNpdHkiLCJjb3VudF9mb3Jfa2V5IiwibGltaXRfZm9yX2tleSIsInJlbWFpbmluZ19mb3Jfa2V5IiwiY2FuX2FkZCIsImRlbHRhIiwicmVtIiwiZ2F0ZV9vcl9hbGVydCIsImxhYmVsIiwiYWxlcnQiLCJpc191c2FnZV9vayIsIldQQkNfQkZCX0V2ZW50cyIsIk9iamVjdCIsImZyZWV6ZSIsIlNFTEVDVCIsIkNMRUFSX1NFTEVDVElPTiIsIkZJRUxEX0FERCIsIkZJRUxEX1JFTU9WRSIsIlNUUlVDVFVSRV9DSEFOR0UiLCJTVFJVQ1RVUkVfTE9BREVEIiwiV1BCQ19CRkJfRXZlbnRCdXMiLCJzY29wZV9lbCIsImVtaXQiLCJkZXRhaWwiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJidWJibGVzIiwib24iLCJoYW5kbGVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9mZiIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJXUEJDX0JGQl9Tb3J0YWJsZU1hbmFnZXIiLCJidWlsZGVyIiwiZ2lkIiwiaW5zdGFuY2VfaWQiLCJncm91cE5hbWUiLCJhbmltYXRpb24iLCJnaG9zdENsYXNzIiwiY2hvc2VuQ2xhc3MiLCJkcmFnQ2xhc3MiLCJfY29udGFpbmVycyIsIlNldCIsIl9kcmFnX2ZhaWxfc2FmZV9ib3VuZCIsIl9iaW5kX2RyYWdfZmFpbF9zYWZlIiwiX2NsZWFudXBfZHJhZ191aSIsIl9kcmFnU3RhdGUiLCJfdG9nZ2xlX2RuZF9yb290X2ZsYWdzIiwiX3JlbW92ZV9kcmFnZ2luZ19jbGFzcyIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImZpbmlzaF9kcmFnIiwid2luZG93IiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiZXZ0X25hbWUiLCJoaWRkZW4iLCJfdGFnX2RyYWdfbWlycm9yIiwiZXZ0IiwiZnJvbVBhbGV0dGUiLCJpbmNsdWRlcyIsInJvbGUiLCJtaXJyb3IiLCJhY3RpdmUiLCJmcm9tX3BhbGV0dGUiLCJyb290IiwiZG9jdW1lbnRFbGVtZW50IiwiYWRkIiwicmVtb3ZlIiwiZW5zdXJlX3NpbXBsZV9saXN0IiwiY29udGFpbmVyIiwiaGFuZGxlcnMiLCJTb3J0YWJsZSIsImdldCIsImNvbW1vbiIsImZvcmNlRmFsbGJhY2siLCJmYWxsYmFja09uQm9keSIsImZhbGxiYWNrVG9sZXJhbmNlIiwicmVtb3ZlQ2xvbmVPbkhpZGUiLCJvblN0YXJ0IiwiX2FkZF9kcmFnZ2luZ19jbGFzcyIsIm9uRW5kIiwic2V0VGltZW91dCIsImNyZWF0ZSIsImdyb3VwIiwicHVsbCIsInB1dCIsInNvcnQiLCJkaXJlY3Rpb24iLCJoYW5kbGUiLCJoYW5kbGVfc2VsZWN0b3IiLCJkcmFnZ2FibGUiLCJkcmFnZ2FibGVfc2VsZWN0b3IiLCJmYWxsYmFja0NsYXNzIiwicHJldmVudE9uRmlsdGVyIiwiaW52ZXJ0U3dhcCIsInN3YXBUaHJlc2hvbGQiLCJpbnZlcnRlZFN3YXBUaHJlc2hvbGQiLCJlbXB0eUluc2VydFRocmVzaG9sZCIsImRyYWdvdmVyQnViYmxlIiwic2Nyb2xsIiwic2Nyb2xsU2Vuc2l0aXZpdHkiLCJzY3JvbGxTcGVlZCIsIm9uVXBkYXRlIiwiZW5zdXJlIiwic29ydGFibGVfa2luZCIsInRvIiwiZHJhZ2dlZEVsIiwib25Nb3ZlIiwib3JpZ2luYWxFdmVudCIsImluX3ByZXZpZXdfY2FudmFzIiwiY2xvc2VzdCIsImlzQ29sdW1uIiwiZnJvbVJvdyIsInRvUm93IiwicmVjdCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImV2dFgiLCJ0b3VjaGVzIiwiY2xpZW50WCIsImV2dFkiLCJjbGllbnRZIiwicGFkZGluZ1giLCJ3aWR0aCIsInBhZGRpbmdZIiwiaGVpZ2h0IiwiaXNWaXN1YWxseUVtcHR5IiwiY2hpbGRFbGVtZW50Q291bnQiLCJpbm5lclRvcCIsInRvcCIsImlubmVyQm90dG9tIiwiYm90dG9tIiwiaW5uZXJMZWZ0IiwibGVmdCIsImlubmVyUmlnaHQiLCJyaWdodCIsImluc2lkZVgiLCJpbnNpZGVZIiwiZHMiLCJzdGlja3lUbyIsImNvbW1pdFgiLCJjb21taXRZIiwiZGVlcEluc2lkZSIsImxhc3RTd2l0Y2hUcyIsInBlcmZvcm1hbmNlIiwibm93Iiwib25BZGQiLCJfb25fYWRkX3NlY3Rpb24iLCJoYW5kbGVfb25fYWRkIiwiYmluZCIsImJ1cyIsInJlYXNvbiIsIml0ZW0iLCJkYXRhIiwiV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyIiwiZ2V0X2FsbF9kYXRhX2F0dHJpYnV0ZXMiLCJpc1NlY3Rpb24iLCJhZGRfb3ZlcmxheV90b29sYmFyIiwicGFnZXNfc2VjdGlvbnMiLCJpbml0X2FsbF9uZXN0ZWRfc29ydGFibGVzIiwiY29sdW1ucyIsInNlbGVjdF9maWVsZCIsImFkZF9zZWN0aW9uIiwic2VjdGlvbiIsImxhc3RFbGVtZW50Q2hpbGQiLCJuZXdJbmRleCIsImNoaWxkcmVuIiwicmVmIiwiaW5zZXJ0QmVmb3JlIiwiZGVzdHJveUFsbCIsImluc3QiLCJkZXN0cm95IiwiY2xlYXIiLCJXUEJDX0JGQl9ET00iLCJTRUxFQ1RPUlMiLCJwYWdlUGFuZWwiLCJmaWVsZCIsInZhbGlkRmllbGQiLCJjb2x1bW4iLCJvdmVybGF5IiwiQ0xBU1NFUyIsInNlbGVjdGVkIiwiQVRUUiIsImNyZWF0ZV9lbGVtZW50IiwidGFnIiwiY2xhc3NfbmFtZSIsImlubmVyX2h0bWwiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiaW5uZXJIVE1MIiwic2V0X2RhdGFfYXR0cmlidXRlcyIsImRhdGFfb2JqIiwiZW50cmllcyIsInZhbCIsInZhbHVlIiwiYXR0cmlidXRlcyIsImF0dHIiLCJzdGFydHNXaXRoIiwiZSIsImhhc0V4cGxpY2l0TGFiZWwiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInJlbmRlcl9maWVsZF9pbm5lcl9odG1sIiwiZmllbGRfZGF0YSIsImhhc0xhYmVsIiwiaXNfcmVxdWlyZWQiLCJyZXF1aXJlZCIsIndyYXBwZXIiLCJzcGFuTGFiZWwiLCJ0ZXh0Q29udGVudCIsImFwcGVuZENoaWxkIiwic3BhblR5cGUiLCJkZWJvdW5jZSIsImZuIiwid2FpdCIsInQiLCJkZWJvdW5jZWQiLCJhcmdzIiwiY2xlYXJUaW1lb3V0IiwiYXBwbHkiLCJXUEJDX0JGQl9GaWVsZF9SZW5kZXJlcl9SZWdpc3RyeSIsIk1hcCIsInJlZ2lzdGVyIiwiQ2xhc3NSZWYiLCJzZXQiLCJXUEJDX0JGQl9GaWVsZF9CYXNlIiwiZ2V0X2RlZmF1bHRzIiwiaHRtbF9pZCIsInBsYWNlaG9sZGVyIiwibWlubGVuZ3RoIiwibWF4bGVuZ3RoIiwicGF0dGVybiIsImNzc2NsYXNzIiwiaGVscCIsIm5vcm1hbGl6ZV9kYXRhIiwiZCIsImRlZmF1bHRzIiwib3V0IiwiayIsImdldF90ZW1wbGF0ZSIsInRlbXBsYXRlX2lkIiwid3AiLCJ0ZW1wbGF0ZSIsImRvbUlkIiwiX19iZmJfdHBsX2NhY2hlX21hcCIsImNvbXBpbGVyIiwicmVuZGVyIiwiY3R4IiwiY29tcGlsZSIsInNhbml0IiwidGl0bGUiLCJvbl9maWVsZF9kcm9wIiwibWV0YSIsImNvbnRleHQiLCJkZWZzIiwidW5kZWZpbmVkIiwiaGFzVmFsdWUiLCJkZWZhdWx0VmFsIiwiU3RydWN0dXJlIiwidXBkYXRlX2ZpZWxkX3Byb3AiLCJfaW5uZXIiLCJfZSIsImZyZXNoIiwiYXV0b25hbWUiLCJ3YXNfbG9hZGVkIiwiaGFzQXR0cmlidXRlIiwiUyIsInVuaXEiLCJuYW1lX3VzZXJfdG91Y2hlZCIsIm5hbWVfZnJvbV9sYWJlbCIsIm1heWJlX2F1dG9uYW1lX2Zyb21fbGFiZWwiLCJsYWJlbFZhbCIsImFsbG93QXV0byIsInVzZXJUb3VjaGVkIiwiaXNMb2FkZWQiLCJpbnMiLCJuYW1lQ3RybCIsIldQQkNfQkZCX1NlbGVjdF9CYXNlIiwib3B0aW9uX3Jvd190ZW1wbGF0ZV9pZCIsImtpbmQiLCJfX3Jvb3Rfd2lyZWQiLCJfX3Jvb3Rfbm9kZSIsInVpIiwibGlzdCIsImhvbGRlciIsInRvZ2dsZSIsImFkZF9idG4iLCJkcmFnX2hhbmRsZSIsIm11bHRpcGxlX2NoayIsImRlZmF1bHRfdGV4dCIsInBsYWNlaG9sZGVyX2lucHV0IiwicGxhY2Vob2xkZXJfbm90ZSIsInNpemVfaW5wdXQiLCJtZW51X3Jvb3QiLCJtZW51X3RvZ2dsZSIsIm1lbnVfYWN0aW9uIiwidmFsdWVfZGlmZmVyc19jaGsiLCJidWlsZF92YWx1ZV9mcm9tX2xhYmVsIiwiZGlmZmVycyIsImlzX3ZhbHVlX2RpZmZlcnNfZW5hYmxlZCIsInBhbmVsIiwiY2hrIiwiY2hlY2tlZCIsInN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkiLCJyb3dzIiwibGJsX2luIiwidmFsX2luIiwiZGlzcGxheSIsImhhc0NhY2hlIiwiY2FjaGVkX3ZhbHVlIiwidXNlckVkaXRlZCIsInZhbHVlX3VzZXJfdG91Y2hlZCIsImxibCIsIm1pcnJvcmVkIiwiaXNfcm93X3ZhbHVlX3VzZXJfdG91Y2hlZCIsIm1hcmtfcm93X3ZhbHVlX3VzZXJfdG91Y2hlZCIsImluaXRfcm93X2ZyZXNoX2ZsYWdzIiwibXVsdGlwbGUiLCJzaXplIiwiZGVmYXVsdF92YWx1ZSIsIm9wdGlvbnMiLCJtaW5fd2lkdGgiLCJzZXRQcm9wZXJ0eSIsInRwbCIsIl93cGJjIiwiZGV2IiwiV1BCQ19CRkJfT3ZlcmxheSIsImlzX2Ryb3AiLCJvIiwicGgiLCJkZmx0IiwiZ2V0X3BhbmVsX3Jvb3QiLCJnZXRfbGlzdCIsImdldF9ob2xkZXIiLCJtYWtlX3VpZCIsImFwcGVuZF9yb3ciLCJpZHgiLCJyb3dkIiwiYXNzaWduIiwiaW5kZXgiLCJ0cGxfaWQiLCJodG1sIiwid3JhcCIsIm5vZGUiLCJmaXJzdEVsZW1lbnRDaGlsZCIsInZhbEluIiwibGJsSW4iLCJjbG9zZV9kcm9wZG93biIsImFuY2hvcl9lbCIsImluc2VydF9hZnRlciIsIm5ld19ub2RlIiwicmVmX25vZGUiLCJuZXh0U2libGluZyIsImNvbW1pdF9vcHRpb25zIiwic2VsIiwicHVzaCIsIkV2ZW50Iiwic3luY19kZWZhdWx0X3ZhbHVlX2xvY2siLCJzeW5jX3BsYWNlaG9sZGVyX2xvY2siLCJfX3NlbGVjdGJhc2VfZmllbGQiLCJlbnN1cmVfc29ydGFibGUiLCJleGlzdGluZyIsIndwYmNfYmZiX2FwaSIsImdldF9idWlsZGVyIiwid3BiY19iZmIiLCJzb3J0YWJsZSIsInNvcnRhYmxlX2luaXQiLCJyZWJ1aWxkX2lmX2VtcHR5IiwiaGFzX3Jvd19kZWZhdWx0cyIsImNoZWNrcyIsImlzX211bHRpcGxlX2VuYWJsZWQiLCJoYXNfdGV4dF9kZWZhdWx0X3ZhbHVlIiwiZHYiLCJub3RlIiwibG9jayIsImRpc2FibGVkIiwiaXNNdWx0aXBsZSIsInBsYWNlaG9sZGVyUm93Iiwic2l6ZUlucHV0Iiwic2l6ZVJvdyIsImVuZm9yY2Vfc2luZ2xlX2RlZmF1bHQiLCJjbGlja2VkIiwia2VwdCIsImoiLCJib290c3RyYXBfcGFuZWwiLCJzZWxlY3RiYXNlX2Jvb3RzdHJhcHBlZCIsIndpcmVfb25jZSIsIl9fc2VsZWN0YmFzZV93aXJlZCIsIm9uX3JlYWR5X29yX3JlbmRlciIsImV2Iiwid2lyZV9yb290X2xpc3RlbmVycyIsImlzQ29ubmVjdGVkIiwic2VsZWN0YmFzZV9yb290X3dpcmVkIiwiZ2V0X3BhbmVsIiwidGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJhY3Rpb24iLCJwcmV2X2NvdW50IiwiaXNfbGFiZWxfb3JfdmFsdWUiLCJpc190b2dnbGUiLCJpc19tdWx0aXBsZSIsIm1hdGNoZXMiLCJpc19kZWZhdWx0X3RleHQiLCJpc192YWx1ZV9kaWZmZXJzIiwiaXNfbXVsdGkiLCJfcHVsc2VfdGltZXJzIiwiX3B1bHNlX21ldGEiLCJQVUxTRV9USFJPVFRMRV9NUyIsIlBVTFNFX0RFQk9VTkNFX01TIiwiU1RSVUNUVVJFX0NIQU5HRV9ERUJPVU5DRV9NUyIsIlZBTFVFX1NMSURFUl9USFJPVFRMRV9NUyIsImNhbmNlbF9wdWxzZSIsImRlbGV0ZSIsInRva2VuIiwiY29sb3Jfc2V0IiwicmVtb3ZlUHJvcGVydHkiLCJkZWJvdW5jZV9pZCIsIl9yZXN0YXJ0X2Nzc19hbmltYXRpb24iLCJjbHMiLCJvZmZzZXRXaWR0aCIsInB1bHNlX29uY2UiLCJkdXJfbXMiLCJtcyIsInB1bHNlX3NlcXVlbmNlIiwidGltZXMiLCJvbl9tcyIsIm9mZl9tcyIsImhleF9jb2xvciIsImJvZHkiLCJjb3VudCIsIkRhdGUiLCJ0aHJvdHRsZV9tcyIsImxhc3RfdHMiLCJoYXZlX2NvbG9yIiwidGljayIsIm0yIiwibTMiLCJwdWxzZV9xdWVyeV9kZWJvdW5jZWQiLCJyb290X29yX3NlbGVjdG9yIiwid2FpdF9tcyIsImMiLCJjb2xvciIsImRlZl9tcyIsInB1bHNlX3F1ZXJ5IiwicHVsc2Vfc2VxdWVuY2Vfc3Ryb25nIiwiV1BCQ19CRkJfTW9kdWxlIiwiaW5pdCIsInByZXBlbmQiLCJzZXR0aW5nc19idG4iLCJvbmNsaWNrIiwic2Nyb2xsSW50b1ZpZXciLCJ3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSIsInBhbmVsX2lkIiwidGFiX2lkIiwiYmVoYXZpb3IiLCJibG9jayIsImZvY3VzYWJsZSIsImZvY3VzIiwiV1BCQ19CRkJfTGF5b3V0X0NoaXBzIiwiX2dldF9jb2xfbWluX3B4IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImdldFByb3BlcnR5VmFsdWUiLCJfZml0X3dlaWdodHNfcmVzcGVjdGluZ19taW4iLCJlZmYiLCJsYXlvdXQiLCJhdmFpbFBjdCIsInJvd1B4IiwiYXZhaWxQeCIsIm1pblBjdCIsIm1pblB4Iiwic3VtTWluIiwid1N1bSIsInRhcmdldFBjdCIsImxvY2tlZCIsImxvY2tlZFN1bSIsInJlbWFpbmluZyIsImZyZWVJZHgiLCJmcmVlVGFyZ2V0U3VtIiwicmVzdWx0IiwiX2FwcGx5X3ByZXNldF93aXRoX21pbl9ndWFyZCIsInNlY3Rpb25fZWwiLCJmaXR0ZWQiLCJfYW5ub3VuY2UiLCJyZW5kZXJfZm9yX3NlY3Rpb24iLCJob3N0X2VsIiwiX21ha2VfY2hpcCIsInByZXNldHMiLCJjdXN0b21CdG4iLCJleGFtcGxlIiwidGV4dCIsInByb21wdCIsImJ0biIsInZpcyIsImJhciIsImZsZXgiLCJ0b0ZpeGVkIiwidHh0IiwicGFyZW50RWxlbWVudCIsIldQQkNfQkZCX1NlbGVjdGlvbl9Db250cm9sbGVyIiwiX3NlbGVjdGVkX3VpZCIsImdldF9zZWxlY3RlZF9maWVsZCIsIl9vbl9jbGVhciIsIm9uX2NsZWFyIiwiZGVsZXRlX2l0ZW0iLCJuZWlnaGJvciIsIl9maW5kX25laWdoYm9yX3NlbGVjdGFibGUiLCJfb25fY2FudmFzX2NsaWNrIiwiX2hhbmRsZV9jYW52YXNfY2xpY2siLCJJR05PUkUiLCJoaXQiLCJwcmVzZWxlY3RfdGFiX2tleSIsImluZGV4T2YiLCJzZWMiLCJjb2xfc3R5bGVzX2FjdGl2ZV90YWIiLCJXUEJDX0JGQl9Db2x1bW5fU3R5bGVzIiwic2V0X3NlbGVjdGVkX2NvbF9mbGFnIiwidGFicyIsIndwYmNfdWlfdGFicyIsInNldF9hY3RpdmUiLCJ0YWJfa2V5IiwicHJldkVsIiwiY2xlYXJfc2VsZWN0ZWRfY29sX2ZsYWciLCJwcmV2IiwiaW5zcGVjdG9yIiwicHJldl91aWQiLCJzb3VyY2UiLCJiaW5kX3RvX2ZpZWxkIiwiSW5zcGVjdG9yRW5oYW5jZXJzIiwic2NhbiIsIldQQkNfQkZCX1ZhbHVlU2xpZGVyIiwiaW5pdF9vbiIsIldQQkNfQkZCX0luc3BlY3Rvcl9CcmlkZ2UiLCJfZ2VuZXJpY19oeWRyYXRlX2NvbnRyb2xzIiwiX2h5ZHJhdGVfc3BlY2lhbF9jb250cm9scyIsImVzY19hdHRyIiwic3JjIiwiX2F0dGFjaF9pbnNwZWN0b3IiLCJfYmluZF9pZF9zYW5pdGl6ZXIiLCJfb3Blbl9pbnNwZWN0b3JfYWZ0ZXJfZmllbGRfYWRkZWQiLCJfYmluZF9mb2N1c19zaG9ydGN1dHMiLCJhdHRhY2giLCJXUEJDX0JGQl9JbnNwZWN0b3IiLCJvbl9mb2N1cyIsImdycF9rZXkiLCJzbG90IiwiZ3JvdXBfd3JhcCIsImhlYWRlcl9idG4iLCJfb25faW5zcGVjdG9yX2ZvY3VzIiwic2V0VmFsIiwiY3RybCIsIlNLSVAiLCJzY2hlbWFzIiwiV1BCQ19CRkJfU2NoZW1hcyIsInR5cGVLZXkiLCJzY2hlbWFFbnRyeSIsInByb3BzU2NoZW1hIiwic2NoZW1hIiwicHJvcHMiLCJoYXNPd24iLCJGdW5jdGlvbiIsImdldERlZmF1bHQiLCJkZWZhdWx0IiwiaW5zcGVjdG9yS2V5IiwiZGwiLCJ2YWx1ZV9mcm9tIiwidmFsdWVGcm9tIiwiaGFzUmF3IiwiZGVmVmFsdWUiLCJIVE1MSW5wdXRFbGVtZW50IiwiX193cGJjX2JmYl9pZF9zYW5pdGl6ZXJfYm91bmQiLCJFViIsImVuc3VyZV9zY19kZWJvdW5jZV9zdGF0ZSIsIl9fd3BiY19iZmJfc2NfZGVib3VuY2Vfc3RhdGUiLCJ0aW1lcl9pZCIsInBlbmRpbmdfcGF5bG9hZCIsImNhbmNlbF9zY19kZWJvdW5jZWRfZW1pdCIsInN0IiwiYnVzX2VtaXRfY2hhbmdlIiwiZXh0cmEiLCJidXNfZW1pdF9jaGFuZ2VfZGVib3VuY2VkIiwicGF5bG9hZCIsInByZXZpZXdfbW9kZSIsInJlbmRlcl9wcmV2aWV3IiwiYXBwbGllZCIsImJlZm9yZSIsInNhbml0aXplZCIsInNlbFN0YXJ0Iiwic2VsZWN0aW9uU3RhcnQiLCJzZWxFbmQiLCJzZWxlY3Rpb25FbmQiLCJzZXRTZWxlY3Rpb25SYW5nZSIsIm5leHQiLCJkZXNpcmVkQXJyIiwiQm9vbGVhbiIsImRlc2lyZWRTZXQiLCJpc0NvcmUiLCJiZWZvcmVDbGFzc2VzIiwiY3VzdG9tQmVmb3JlIiwiaGFzIiwibWlzc2luZyIsImFmdGVyQ2xhc3NlcyIsImNoYW5nZWQiLCJzb21lIiwicGhhc2UiLCJhdXRvQWN0aXZlIiwidG9nZ2xlQXR0cmlidXRlIiwiaTE4biIsImF1dG9fZnJvbV9sYWJlbCIsInNlbGZMb2NrZWQiLCJuZXh0VmFsIiwiaXNfZ2VuX2tleSIsInZpc3VhbEtleXMiLCJpc19sZW5fZ3JvdXBfY3RybCIsIldQQkNfQkZCX0tleWJvYXJkX0NvbnRyb2xsZXIiLCJfb25fa2V5Iiwib25fa2V5IiwiaXNfdHlwaW5nIiwiX2lzX3R5cGluZ19hbnl3aGVyZSIsImFsdEtleSIsImN0cmxLZXkiLCJtZXRhS2V5Iiwic2hpZnRLZXkiLCJkaXIiLCJtb3ZlX2l0ZW0iLCJhY3RpdmVFbGVtZW50IiwidGFnTmFtZSIsImlzQ29udGVudEVkaXRhYmxlIiwiV1BCQ19CRkJfUmVzaXplX0NvbnRyb2xsZXIiLCJpbml0X3Jlc2l6ZV9oYW5kbGVyIiwiaGFuZGxlX3Jlc2l6ZSIsImJ1dHRvbiIsInJlc2l6ZXIiLCJjdXJyZW50VGFyZ2V0IiwibGVmdF9jb2wiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwicmlnaHRfY29sIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwibGVmdF9pbmRleCIsInJpZ2h0X2luZGV4Iiwic3RhcnRfeCIsImxlZnRfc3RhcnRfcHgiLCJyaWdodF9zdGFydF9weCIsInBhaXJfcHgiLCJjb21wdXRlZCIsInBhaXJfYXZhaWwiLCJwY3RUb1B4IiwicGN0IiwiZ2VuZXJpY01pblBjdCIsImdlbmVyaWNNaW5QeCIsImxlZnRNaW5QeCIsInJpZ2h0TWluUHgiLCJwcmV2X3VzZXJfc2VsZWN0IiwidXNlclNlbGVjdCIsImN1cnNvciIsIm9uX21vdXNlX21vdmUiLCJkZWx0YV9weCIsIm5ld0xlZnRQeCIsIm5ld1JpZ2h0UHgiLCJuZXdMZWZ0UGN0IiwibmV3QmFzZXMiLCJvbl9tb3VzZV91cCIsIm5vcm1hbGl6ZWQiLCJXUEJDX0JGQl9QYWdlc19TZWN0aW9ucyIsImFkZF9wYWdlIiwicmVidWlsZF9zZWN0aW9uIiwic2VjdGlvbl9kYXRhIiwiaW5pdF9zZWN0aW9uX3NvcnRhYmxlIiwiX3JldGFnX3VpZHNfaW5fc3VidHJlZSIsIm5vZGVzIiwicHJlZml4IiwiX3VpZF9jb3VudGVyIiwiX21ha2VfdW5pcXVlIiwidGFrZW4iLCJzdGVtIiwiX2RlZHVwZV9zdWJ0cmVlX3N0cmljdCIsInRha2VuRGF0YUlkIiwidGFrZW5EYXRhTmFtZSIsInRha2VuSHRtbElkIiwidGFrZW5Eb21JZCIsImRpZCIsImRuYW0iLCJoaWQiLCJpc0ZpZWxkIiwiY29tYmluZWRUYWtlbiIsImNhbmRpZGF0ZSIsImh0bWxGb3IiLCJfbWFrZV9hZGRfY29sdW1uc19jb250cm9sIiwicGFnZV9lbCIsInNlY3Rpb25fY29udGFpbmVyIiwiaW5zZXJ0X3BvcyIsImNvbnRlbnQiLCJjbG9uZSIsImNsb25lTm9kZSIsImluc2VydCIsInBhZ2VfY291bnRlciIsImNvbnRyb2xzX2h0bWwiLCJyZW5kZXJfd3BfdGVtcGxhdGUiLCJwYWdlX251bWJlciIsInNlY3Rpb25fY291bnRfb25fYWRkX3BhZ2UiLCJjb250cm9sc19ob3N0X3RvcCIsImN0cmxfdG9wIiwiY29udHJvbHNfaG9zdF9ib3R0b20iLCJhZnRlciIsImN0cmxfYm90dG9tIiwic2VjdGlvbl9jb3VudGVyIiwiaW5pdF9zb3J0YWJsZSIsImNvbHNfZGF0YSIsImNvbF9zdHlsZXMiLCJqc29uIiwiYXJyIiwicGFyc2VfY29sX3N0eWxlcyIsImNvbF9kYXRhIiwiY29sdW1uc19vbmx5IiwiaXRlbXMiLCJidWlsZF9maWVsZCIsInRyaWdnZXJfZmllbGRfZHJvcF9jYWxsYmFjayIsImlzX2NvbHVtbiIsImlzX3RvcF9sZXZlbCIsIldQQkNfQkZCX1N0cnVjdHVyZV9JTyIsImdldF9zdHJ1Y3R1cmUiLCJzZXJpYWxpemUiLCJsb2FkX3NhdmVkX3N0cnVjdHVyZSIsImRlc2VyaWFsaXplIiwiX25vcm1hbGl6ZV9maWVsZF9vcHRpb25fdmFsdWVzIiwiaGFzX3ZhbHVlX2RpZmZlcnMiLCJ2YWx1ZV9kaWZmZXJzIiwib3B0aW9uX3JlY29yZCIsIl9ub3JtYWxpemVfaWRzIiwiX25vcm1hbGl6ZV9uYW1lcyIsInBhZ2VzIiwicGFnZV9pbmRleCIsInBhZ2UiLCJjaGlsZCIsInNlcmlhbGl6ZV9zZWN0aW9uIiwiZl9kYXRhIiwiY29sX3N0eWxlc19yYXciLCJjb2xDb3VudCIsInBhcnNlZCIsInN0cnVjdHVyZSIsImRlZmVySWZUeXBpbmciLCJfaXNfdHlwaW5nX2luX2luc3BlY3RvciIsIl9kZWZlcl90aW1lciIsInBhZ2VfZGF0YSIsIndhbnQiLCJXUEJDX0JGQl9NaW5fV2lkdGhfR3VhcmQiLCJfb25fZmllbGRfYWRkIiwiX29uX2ZpZWxkX3JlbW92ZSIsIl9vbl9zdHJ1Y3R1cmVfbG9hZGVkIiwiX29uX3N0cnVjdHVyZV9jaGFuZ2UiLCJfb25fd2luZG93X3Jlc2l6ZSIsIl9wZW5kaW5nX3Jvd3MiLCJfcGVuZGluZ19hbGwiLCJfcmFmX2lkIiwicGFzc2l2ZSIsIl9zY2hlZHVsZV9yZWZyZXNoX2FsbCIsInNyY19lbCIsIl9zY2hlZHVsZV9yZWZyZXNoX3JvdyIsIl9raWNrX3JhZiIsInJlZnJlc2hfYWxsIiwicmVmcmVzaF9yb3ciLCJhcHBseV9jb2xfbWluIiwicHgiLCJtaW5XaWR0aCIsImFicyIsImNvbF9lbCIsIm1heF9weCIsImNvbFJlY3QiLCJlbmRzV2l0aCIsInBhcnNlX2xlbl9weCIsImNzIiwiZm9udFNpemUiLCJXUEJDX0JGQl9Ub2dnbGVfTm9ybWFsaXplciIsInVwZ3JhZGVfY2hlY2tib3hlc19pbiIsInJvb3RfZWwiLCJpbnB1dHMiLCJpbnB1dF9pZCIsImdlbmVyYXRlX3VuaXF1ZV9pZCIsImxhYmVsX3RleHQiLCJyZXNvbHZlX2xhYmVsX3RleHQiLCJpY29uX2xhYmVsIiwidGV4dF9sYWJlbCIsImNyZWF0ZVRleHROb2RlIiwicmVwbGFjZWQiLCJ0cnlfcmVwbGFjZV9rbm93bl9yb3ciLCJhc3NvYyIsImNzc19lc2NhcGUiLCJuZWFyX2xhYmVsIiwiaWwiLCJ0MiIsImFyaWEiLCJjdHJsX3dyYXAiLCJmaXJzdENoaWxkIiwiaWNvbl9sYmwiLCJ0ZXh0X2xibCIsImFwcGx5X3Bvc3RfcmVuZGVyIiwiVCIsImNiIiwiX193cGJjX2FyaWFfaG9va2VkIiwicmVncyIsIl9fd3BiY19laCIsImdyb3VwcyIsIm5vZGVUeXBlIiwiY29uY2F0IiwiZyIsIl9fd3BiY19sZW5fd2lyZWQiLCJudW1iZXIiLCJyYW5nZSIsInVuaXQiLCJzeW5jX3JhbmdlX2Zyb21fbnVtYmVyIiwiZGlzcGF0Y2hfaW5wdXQiLCJkaXNwYXRjaF9jaGFuZ2UiLCJwZW5kaW5nX3ZhbCIsInBlbmRpbmdfY2hhbmdlIiwibGFzdF9mbHVzaF90cyIsIm1pbl9pbnRlcnZhbF9tcyIsImxlblRocm90dGxlIiwiZmx1c2hfcmFuZ2VfdG9fbnVtYmVyIiwic2NoZWR1bGVfcmFuZ2VfdG9fbnVtYmVyIiwiZW1pdF9jaGFuZ2UiLCJvbl9udW1iZXJfaW5wdXQiLCJvbl9udW1iZXJfY2hhbmdlIiwib25fcmFuZ2VfaW5wdXQiLCJvbl9yYW5nZV9jaGFuZ2UiLCJkZXN0cm95X29uIiwiX3Jvb3QiLCJwYXRjaEluc3BlY3RvckVuaGFuY2VycyIsImFwcGx5UGF0Y2giLCJJbnNwZWN0b3IiLCJfX3dwYmNfZW5oYW5jZXJzX3BhdGNoZWQiLCJvcmlnIiwiaW5zRWwiLCJvbmNlIiwid3BiY19iZmJfX2Rpc3BhdGNoX3Nob3dfcGFuZWwiLCJldmVudF9kZXRhaWwiLCJXUEJDX0JGQl9Nb2RlX1JpZ2h0YmFyX1N5bmMiLCJ0b3BfdGFic19uYXYiLCJhZHZhbmNlZF90YWJfd3JhcCIsImFkdmFuY2VkX3BhbmVsIiwibXV0YXRpb25fb2JzZXJ2ZXIiLCJsYXN0X21vZGUiLCJzeW5jX3JpZ2h0YmFyX21vZGUiLCJoYW5kbGVfY2xpY2siLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsImF0dHJpYnV0ZUZpbHRlciIsImdldF9hY3RpdmVfdG9wX3RhYl9pZCIsImFjdGl2ZV90YWJfaWQiLCJhY3RpdmVfbGluayIsImJ1aWxkZXJfcGFuZWwiLCJpc19lbGVtZW50X3Zpc2libGUiLCJ2aXNpYmlsaXR5IiwiaXNfYWR2YW5jZWRfbW9kZV9hY3RpdmUiLCJzaG93X2FkdmFuY2VkX3Rvb2xzX3RhYiIsImhpZGVfYWR2YW5jZWRfdG9vbHNfdGFiIiwiaXNfYWR2YW5jZWRfdG9vbHNfcGFuZWxfYWN0aXZlIiwib3Blbl9hZHZhbmNlZF90b29sc19wYW5lbCIsIm9wZW5fZGVmYXVsdF92aXN1YWxfcGFuZWwiLCJpc19hZHZhbmNlZF9tb2RlIiwiZXZlbnQiLCJ0aGlzX29iaiIsInJlYWR5U3RhdGUiLCJfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fIiwiY29uZmlybSIsImlzX2ZpZWxkIiwiTW9kYWxfQ29uZmlybV9EZWxldGUiLCJvcGVuIiwiZHVwbGljYXRlX2l0ZW0iLCJXUEJDX0JGQl9JbnNwZWN0b3JfQWN0aW9ucyIsInJ1biIsIndhcm4iLCJFcnJvciIsIndwYmNfYmZiX2luc3BlY3Rvcl9mYWN0b3J5X3Nsb3RzIiwid3BiY19iZmJfaW5zcGVjdG9yX2ZhY3RvcnlfdmFsdWVfZnJvbSIsImF0dHJzIiwia2V5cyIsImRrIiwiYnVpbGRfdG9nZ2xlX3JvdyIsImlucHV0X2VsIiwiZ2V0X2luaXRpYWxfdmFsdWUiLCJwcm9wc19zY2hlbWEiLCJjb2VyY2VfYnlfdHlwZSIsImlzTmFOIiwibm9ybWFsaXplX3NlbGVjdF9vcHRpb25zIiwicGFyc2VfbGVuIiwiZmFsbGJhY2tfdW5pdCIsImNsYW1wX251bSIsImluaXRfY29sb3Jpc19waWNrZXJzIiwiQ29sb3JpcyIsImFscGhhIiwiZm9ybWF0IiwidGhlbWVNb2RlIiwiYnVpbGRfcmFuZ2VfbnVtYmVyX3JvdyIsImxhYmVsX2VsIiwic3RlcCIsIm51bSIsImJ1aWxkX2xlbl9jb21wb3VuZF9yb3ciLCJjb250cm9sIiwiZGVmX3N0ciIsImZhbGxiYWNrX3UiLCJ1bml0cyIsInNsaWRlcl9tYXAiLCJzbGlkZXIiLCJpbmxpbmUiLCJ1Iiwib3B0IiwidGFiaW5kZXgiLCJ3aXJlX2xlbl9ncm91cCIsImZpbmRfZ3JvdXAiLCJ3cml0ZXIiLCJib3VuZHNfYnlfdW5pdCIsImJ1aWxkX2NvbnRyb2wiLCJwcm9wX21ldGEiLCJjbGFzc2VzIiwic2xvdF9yb3ciLCJob3N0X2F0dHJzIiwic2xvdF9ob3N0Iiwic2xvdF9mbiIsIm9wdF9lbCIsInJuX2lkIiwicm5fdmFsIiwiYnVpbGRfZ3JvdXAiLCJpc19vcGVuIiwiZmllbGRzIiwiYXNBcnJheSIsIngiLCJ2YWx1ZXMiLCJjb250cm9scyIsImJ1aWxkX2hlYWRlciIsImluc3BlY3Rvcl91aSIsInRpdGxlX2ZhbGxiYWNrIiwic2NoZW1hX2Zvcl90eXBlIiwidmFyaWFudCIsImhlYWRlcl92YXJpYW50IiwiaGVhZGVyQWN0aW9ucyIsImhlYWRlcl9hY3Rpb25zIiwiZGVzY3JpcHRpb24iLCJhY3Rpb25CdG4iLCJhY3QiLCJtaW5pbWFsIiwiaWNvbk1hcCIsImhlYWRlciIsImFjdGlvbnMiLCJoMyIsInVpQyIsInVpRyIsImcxIiwiZzIiLCJnMyIsImZhY3RvcnlfcmVuZGVyIiwicGFuZWxfZWwiLCJ0aXRsZV90ZXh0IiwiV1BCQ19CRkJfSW5zcGVjdG9yX0ZhY3RvcnkiLCJzbG90X2xheW91dF9jaGlwcyIsImhvc3QiLCJMIiwibGF5b3V0X2NoaXBzIiwidmFsdWVfZnJvbV9jb21wdXRlX3NlY3Rpb25fY29sdW1ucyIsImNvbXB1dGVfc2VjdGlvbl9jb2x1bW5zIiwiX2NyZWF0ZV9mYWxsYmFja19wYW5lbCIsInNlbGVjdGVkX2VsIiwiX3JlbmRlcl90aW1lciIsIl9vbl9kZWxlZ2F0ZWRfaW5wdXQiLCJfYXBwbHlfY29udHJvbF9mcm9tX2V2ZW50IiwiX29uX2RlbGVnYXRlZF9jaGFuZ2UiLCJfb25fZGVsZWdhdGVkX2NsaWNrIiwiX3Bvc3RfcmVuZGVyX3VpIiwidl9pbnQiLCJjbGFtcGVkIiwic2V0X3NlY3Rpb25fY29sdW1ucyIsIl9uZWVkc19yZXJlbmRlciIsIl9zY2hlZHVsZV9yZW5kZXJfcHJlc2VydmluZ19mb2N1cyIsImRlbGF5IiwiYWN0aXZlS2V5IiwicHJldl9zY3JvbGwiLCJzY3JvbGxUb3AiLCJfZW5mb3JjZV9kZWZhdWx0X2dyb3VwX29wZW4iLCJfc2V0X3BhbmVsX3NlY3Rpb25fY29scyIsIkZhY3RvcnkiLCJlbnRyeSIsImhhc1Nsb3RIb3N0IiwiaGFzQ2hpcHMiLCJlbnN1cmVIb3N0IiwiaCIsImxhYiIsImN0bCIsIl9nZXRfdHBsIiwiZ2VuZXJpY190cGwiLCJtZXJnZWQiLCJtc2ciLCJkaXYiLCJzZWN0aW9uRWwiLCJjb21wdXRlIl0sInNvdXJjZXMiOlsiYmZiLWNvcmUuanMiLCJiZmItZmllbGRzLmpzIiwiYmZiLXVpLmpzIiwiYmZiLXN5bmMtY29kZS10b29scy10YWIuanMiLCJiZmItaW5zcGVjdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyA9PSBGaWxlICAvaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvX291dC9jb3JlL2JmYi1jb3JlLmpzID09IHwgMjAyNS0wOS0xMCAxNTo0N1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuKGZ1bmN0aW9uICggdyApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8vIFNpbmdsZSBnbG9iYWwgbmFtZXNwYWNlIChpZGVtcG90ZW50ICYgbG9hZC1vcmRlciBzYWZlKS5cclxuXHRjb25zdCBDb3JlID0gKCB3LldQQkNfQkZCX0NvcmUgPSB3LldQQkNfQkZCX0NvcmUgfHwge30gKTtcclxuXHRjb25zdCBVSSAgID0gKCBDb3JlLlVJID0gQ29yZS5VSSB8fCB7fSApO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb3JlIHNhbml0aXplL2VzY2FwZS9ub3JtYWxpemUgaGVscGVycy5cclxuXHQgKiBBbGwgbWV0aG9kcyB1c2Ugc25ha2VfY2FzZTsgY2FtZWxDYXNlIGFsaWFzZXMgYXJlIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cclxuXHQgKi9cclxuXHRDb3JlLldQQkNfQkZCX1Nhbml0aXplID0gY2xhc3Mge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXNjYXBlIHRleHQgZm9yIHNhZmUgdXNlIGluIENTUyBzZWxlY3RvcnMuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gcyAtIHJhdyBzZWxlY3RvciBmcmFnbWVudFxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGVzY19jc3Mocykge1xyXG5cdFx0XHRyZXR1cm4gKHcuQ1NTICYmIHcuQ1NTLmVzY2FwZSkgPyB3LkNTUy5lc2NhcGUoIFN0cmluZyggcyApICkgOiBTdHJpbmcoIHMgKS5yZXBsYWNlKCAvKFteXFx3LV0pL2csICdcXFxcJDEnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFc2NhcGUgYSB2YWx1ZSBmb3IgYXR0cmlidXRlIHNlbGVjdG9ycywgZS5nLiBbZGF0YS1pZD1cIjx2YWx1ZT5cIl0uXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGVzY19hdHRyX3ZhbHVlX2Zvcl9zZWxlY3Rvcih2KSB7XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIHYgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvXFxcXC9nLCAnXFxcXFxcXFwnIClcclxuXHRcdFx0XHQucmVwbGFjZSggL1wiL2csICdcXFxcXCInIClcclxuXHRcdFx0XHQucmVwbGFjZSggL1xcbi9nLCAnXFxcXEEgJyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9cXF0vZywgJ1xcXFxdJyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2FuaXRpemUgaW50byBhIGJyb2FkbHkgY29tcGF0aWJsZSBIVE1MIGlkOiBsZXR0ZXJzLCBkaWdpdHMsIC0gXyA6IC4gOyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHNhbml0aXplX2h0bWxfaWQodikge1xyXG5cdFx0XHRsZXQgcyA9ICh2ID09IG51bGwgPyAnJyA6IFN0cmluZyggdiApKS50cmltKCk7XHJcblx0XHRcdHMgICAgID0gc1xyXG5cdFx0XHRcdC5yZXBsYWNlKCAvXFxzKy9nLCAnLScgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvW15BLVphLXowLTlcXC1fXFw6Ll0vZywgJy0nIClcclxuXHRcdFx0XHQucmVwbGFjZSggLy0rL2csICctJyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9eWy1fLjpdK3xbLV8uOl0rJC9nLCAnJyApO1xyXG5cdFx0XHRpZiAoICFzICkgcmV0dXJuICdmaWVsZCc7XHJcblx0XHRcdGlmICggIS9eW0EtWmEtel0vLnRlc3QoIHMgKSApIHMgPSAnZi0nICsgcztcclxuXHRcdFx0cmV0dXJuIHM7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTYW5pdGl6ZSBpbnRvIGEgc2FmZSBIVE1MIG5hbWUgdG9rZW46IGxldHRlcnMsIGRpZ2l0cywgXyAtXHJcblx0XHQgKiBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXI7IG5vIGRvdHMvYnJhY2tldHMvc3BhY2VzLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBzYW5pdGl6ZV9odG1sX25hbWUodikge1xyXG5cclxuXHRcdFx0bGV0IHMgPSAodiA9PSBudWxsID8gJycgOiBTdHJpbmcoIHYgKSkudHJpbSgpO1xyXG5cclxuXHRcdFx0cyA9IHMucmVwbGFjZSggL1xccysvZywgJ18nICkucmVwbGFjZSggL1teQS1aYS16MC05Xy1dL2csICdfJyApLnJlcGxhY2UoIC9fKy9nLCAnXycgKTtcclxuXHJcblx0XHRcdGlmICggISBzICkge1xyXG5cdFx0XHRcdHMgPSAnZmllbGQnO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggISAvXltBLVphLXpdLy50ZXN0KCBzICkgKSB7XHJcblx0XHRcdFx0cyA9ICdmXycgKyBzO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBzO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXNjYXBlIGZvciBIVE1MIHRleHQvYXR0cmlidXRlcyAobm90IFVSTHMpLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBlc2NhcGVfaHRtbCh2KSB7XHJcblx0XHRcdGlmICggdiA9PSBudWxsICkge1xyXG5cdFx0XHRcdHJldHVybiAnJztcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gU3RyaW5nKCB2IClcclxuXHRcdFx0XHQucmVwbGFjZSggLyYvZywgJyZhbXA7JyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9cIi9nLCAnJnF1b3Q7JyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC8nL2csICcmIzAzOTsnIClcclxuXHRcdFx0XHQucmVwbGFjZSggLzwvZywgJyZsdDsnIClcclxuXHRcdFx0XHQucmVwbGFjZSggLz4vZywgJyZndDsnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFc2NhcGUgbWluaW1hbCBzZXQgZm9yIGF0dHJpYnV0ZS1zYWZldHkgd2l0aG91dCBzbHVnZ2luZy5cclxuXHRcdCAqIEtlZXBzIG9yaWdpbmFsIGh1bWFuIHRleHQ7IGVzY2FwZXMgJiwgPCwgPiwgXCIgYW5kICcgb25seS5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBzXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgZXNjYXBlX3ZhbHVlX2Zvcl9hdHRyKHMpIHtcclxuXHRcdFx0cmV0dXJuIFN0cmluZyggcyA9PSBudWxsID8gJycgOiBzIClcclxuXHRcdFx0XHQucmVwbGFjZSggLyYvZywgJyZhbXA7JyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC88L2csICcmbHQ7JyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC8+L2csICcmZ3Q7JyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9cIi9nLCAnJnF1b3Q7JyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC8nL2csICcmIzM5OycgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNhbml0aXplIGEgc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzcyBsaXN0LlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBzYW5pdGl6ZV9jc3NfY2xhc3NsaXN0KHYpIHtcclxuXHRcdFx0aWYgKCB2ID09IG51bGwgKSByZXR1cm4gJyc7XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIHYgKS5yZXBsYWNlKCAvW15cXHdcXC0gXSsvZywgJyAnICkucmVwbGFjZSggL1xccysvZywgJyAnICkudHJpbSgpO1xyXG5cdFx0fVxyXG4vLyA9PSBORVcgPT1cclxuXHRcdC8qKlxyXG5cdFx0ICogVHVybiBhbiBhcmJpdHJhcnkgdmFsdWUgaW50byBhIGNvbnNlcnZhdGl2ZSBcInRva2VuXCIgKHVuZGVyc2NvcmVzLCBoeXBoZW5zIGFsbG93ZWQpLlxyXG5cdFx0ICogVXNlZnVsIGZvciBzaG9ydGNvZGUgdG9rZW5zLCBpZHMgaW4gcGxhaW4gdGV4dCwgZXRjLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyB0b190b2tlbih2KSB7XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIHYgPz8gJycgKVxyXG5cdFx0XHRcdC50cmltKClcclxuXHRcdFx0XHQucmVwbGFjZSggL1xccysvZywgJ18nIClcclxuXHRcdFx0XHQucmVwbGFjZSggL1teQS1aYS16MC05X1xcLV0vZywgJycgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnZlcnQgdG8ga2ViYWItY2FzZSAobGV0dGVycywgZGlnaXRzLCBoeXBoZW5zKS5cclxuXHRcdCAqIEBwYXJhbSB7YW55fSB2XHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgdG9fa2ViYWIodikge1xyXG5cdFx0XHRyZXR1cm4gU3RyaW5nKCB2ID8/ICcnIClcclxuXHRcdFx0XHQudHJpbSgpXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9bX1xcc10rL2csICctJyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9bXkEtWmEtejAtOS1dL2csICcnIClcclxuXHRcdFx0XHQucmVwbGFjZSggLy0rL2csICctJyApXHJcblx0XHRcdFx0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUcnV0aHkgbm9ybWFsaXphdGlvbiBmb3IgZm9ybS1saWtlIGlucHV0czogdHJ1ZSwgJ3RydWUnLCAxLCAnMScsICd5ZXMnLCAnb24nLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgaXNfdHJ1dGh5KHYpIHtcclxuXHRcdFx0aWYgKCB0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nICkgcmV0dXJuIHY7XHJcblx0XHRcdGNvbnN0IHMgPSBTdHJpbmcoIHYgPz8gJycgKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0cmV0dXJuIHMgPT09ICd0cnVlJyB8fCBzID09PSAnMScgfHwgcyA9PT0gJ3llcycgfHwgcyA9PT0gJ29uJztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvZXJjZSB0byBib29sZWFuIHdpdGggYW4gb3B0aW9uYWwgZGVmYXVsdCBmb3IgZW1wdHkgdmFsdWVzLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlZj1mYWxzZV1cclxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgY29lcmNlX2Jvb2xlYW4odiwgZGVmID0gZmFsc2UpIHtcclxuXHRcdFx0aWYgKCB2ID09IG51bGwgfHwgdiA9PT0gJycgKSByZXR1cm4gZGVmO1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5pc190cnV0aHkoIHYgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFBhcnNlIGEgXCJwZXJjZW50LWxpa2VcIiB2YWx1ZSAoJzMzJ3wnMzMlJ3wzMykgd2l0aCBmYWxsYmFjay5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxudWxsfHVuZGVmaW5lZH0gdlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGZhbGxiYWNrX3ZhbHVlXHJcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgcGFyc2VfcGVyY2VudCh2LCBmYWxsYmFja192YWx1ZSkge1xyXG5cdFx0XHRpZiAoIHYgPT0gbnVsbCApIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsbGJhY2tfdmFsdWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgcyA9IFN0cmluZyggdiApLnRyaW0oKTtcclxuXHRcdFx0Y29uc3QgbiA9IHBhcnNlRmxvYXQoIHMucmVwbGFjZSggLyUvZywgJycgKSApO1xyXG5cdFx0XHRyZXR1cm4gTnVtYmVyLmlzRmluaXRlKCBuICkgPyBuIDogZmFsbGJhY2tfdmFsdWU7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDbGFtcCBhIG51bWJlciB0byB0aGUgW21pbiwgbWF4XSByYW5nZS5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gbWluXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gbWF4XHJcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgY2xhbXAobiwgbWluLCBtYXgpIHtcclxuXHRcdFx0cmV0dXJuIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIG4gKSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXNjYXBlIGEgdmFsdWUgZm9yIGluY2x1c2lvbiBpbnNpZGUgYSBxdW90ZWQgSFRNTCBhdHRyaWJ1dGUgKGRvdWJsZSBxdW90ZXMpLlxyXG5cdFx0ICogUmVwbGFjZXMgbmV3bGluZXMgd2l0aCBzcGFjZXMgYW5kIGRvdWJsZSBxdW90ZXMgd2l0aCBzaW5nbGUgcXVvdGVzLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBlc2NhcGVfZm9yX2F0dHJfcXVvdGVkKHYpIHtcclxuXHRcdFx0aWYgKCB2ID09IG51bGwgKSByZXR1cm4gJyc7XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIHYgKS5yZXBsYWNlKCAvXFxyP1xcbi9nLCAnICcgKS5yZXBsYWNlKCAvXCIvZywgJ1xcJycgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVzY2FwZSBmb3Igc2hvcnRjb2RlLWxpa2UgdG9rZW5zIHdoZXJlIGRvdWJsZSBxdW90ZXMgYW5kIG5ld2xpbmVzIHNob3VsZCBiZSBuZXV0cmFsaXplZC5cclxuXHRcdCAqIEBwYXJhbSB7YW55fSB2XHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgZXNjYXBlX2Zvcl9zaG9ydGNvZGUodikge1xyXG5cdFx0XHRyZXR1cm4gU3RyaW5nKCB2ID8/ICcnICkucmVwbGFjZSggL1wiL2csICdcXFxcXCInICkucmVwbGFjZSggL1xccj9cXG4vZywgJyAnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBKU09OLnBhcnNlIHdpdGggZmFsbGJhY2sgKG5vIHRocm93KS5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBzXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gW2ZhbGxiYWNrPW51bGxdXHJcblx0XHQgKiBAcmV0dXJucyB7YW55fVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgc2FmZV9qc29uX3BhcnNlKHMsIGZhbGxiYWNrID0gbnVsbCkge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHJldHVybiBKU09OLnBhcnNlKCBzICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxsYmFjaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3RyaW5naWZ5IGRhdGEtKiBhdHRyaWJ1dGUgdmFsdWUgc2FmZWx5IChvYmplY3RzIC0+IEpTT04sIG90aGVycyAtPiBTdHJpbmcpLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBzdHJpbmdpZnlfZGF0YV92YWx1ZSh2KSB7XHJcblx0XHRcdGlmICggdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgKSB7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSggdiApO1xyXG5cdFx0XHRcdH0gY2F0Y2gge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dQQkM6IHN0cmluZ2lmeV9kYXRhX3ZhbHVlJyApO1xyXG5cdFx0XHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gU3RyaW5nKCB2ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Ly8gU3RyaWN0IHZhbHVlIGd1YXJkcyBmb3IgQ1NTIGxlbmd0aHMgYW5kIGhleCBjb2xvcnMgKGRlZmVuc2UtaW4tZGVwdGgpLlxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0LyoqXHJcblx0XHQgKiBTYW5pdGl6ZSBhIENTUyBsZW5ndGguIEFsbG93czogcHgsICUsIHJlbSwgZW0gKGxvd2VyL3VwcGVyKS5cclxuXHRcdCAqIFJldHVybnMgZmFsbGJhY2sgaWYgaW52YWxpZC5cclxuXHRcdCAqIEBwYXJhbSB7YW55fSB2XHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZhbGxiYWNrPScxMDAlJ11cclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBzYW5pdGl6ZV9jc3NfbGVuKHYsIGZhbGxiYWNrID0gJzEwMCUnKSB7XHJcblx0XHRcdGNvbnN0IHMgPSBTdHJpbmcoIHYgPz8gJycgKS50cmltKCk7XHJcblx0XHRcdGNvbnN0IG0gPSBzLm1hdGNoKCAvXigtP1xcZCsoPzpcXC5cXGQrKT8pKHB4fCV8cmVtfGVtKSQvaSApO1xyXG5cdFx0XHRyZXR1cm4gbSA/IG1bMF0gOiBTdHJpbmcoIGZhbGxiYWNrICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTYW5pdGl6ZSBhIGhleCBjb2xvci4gQWxsb3dzICNyZ2Igb3IgI3JyZ2diYiAoY2FzZS1pbnNlbnNpdGl2ZSkuXHJcblx0XHQgKiBSZXR1cm5zIGZhbGxiYWNrIGlmIGludmFsaWQuXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gdlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IFtmYWxsYmFjaz0nI2UwZTBlMCddXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgc2FuaXRpemVfaGV4X2NvbG9yKHYsIGZhbGxiYWNrID0gJyNlMGUwZTAnKSB7XHJcblx0XHRcdGNvbnN0IHMgPSBTdHJpbmcoIHYgPz8gJycgKS50cmltKCk7XHJcblx0XHRcdHJldHVybiAvXiMoPzpbMC05YS1mXXszfXxbMC05YS1mXXs2fSkkL2kudGVzdCggcyApID8gcyA6IFN0cmluZyggZmFsbGJhY2sgKTtcclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXUEJDIElEIC8gTmFtZSBzZXJ2aWNlLiBHZW5lcmF0ZXMsIHNhbml0aXplcywgYW5kIGVuc3VyZXMgdW5pcXVlbmVzcyBmb3IgZmllbGQgaWRzL25hbWVzL2h0bWxfaWRzIHdpdGhpbiB0aGVcclxuXHQgKiBjYW52YXMuXHJcblx0ICovXHJcblx0Q29yZS5XUEJDX0JGQl9JZFNlcnZpY2UgPSBjbGFzcyAge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29uc3RydWN0b3IuIFNldCByb290IGNvbnRhaW5lciBvZiB0aGUgZm9ybSBwYWdlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYWdlc19jb250YWluZXIgLSBSb290IGNvbnRhaW5lciBvZiB0aGUgZm9ybSBwYWdlcy5cclxuXHRcdCAqL1xyXG5cdFx0Y29uc3RydWN0b3IoIHBhZ2VzX2NvbnRhaW5lciApIHtcclxuXHRcdFx0dGhpcy5wYWdlc19jb250YWluZXIgPSBwYWdlc19jb250YWluZXI7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbnN1cmUgYSB1bmlxdWUgKippbnRlcm5hbCoqIGZpZWxkIGlkIChzdG9yZWQgaW4gZGF0YS1pZCkgd2l0aGluIHRoZSBjYW52YXMuXHJcblx0XHQgKiBTdGFydHMgZnJvbSBhIGRlc2lyZWQgaWQgKGFscmVhZHkgc2FuaXRpemVkIG9yIG5vdCkgYW5kIGFwcGVuZHMgc3VmZml4ZXMgaWYgbmVlZGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlSWQgLSBEZXNpcmVkIGlkLlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gVW5pcXVlIGlkLlxyXG5cdFx0ICovXHJcblx0XHRlbnN1cmVfdW5pcXVlX2ZpZWxkX2lkKGJhc2VJZCwgY3VycmVudEVsID0gbnVsbCkge1xyXG5cdFx0XHRjb25zdCBiYXNlICAgID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5zYW5pdGl6ZV9odG1sX2lkKCBiYXNlSWQgKTtcclxuXHRcdFx0bGV0IGlkICAgICAgICA9IGJhc2UgfHwgJ2ZpZWxkJztcclxuXHRcdFx0Y29uc3QgZXNjICAgICA9ICh2KSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmVzY19hdHRyX3ZhbHVlX2Zvcl9zZWxlY3RvciggdiApO1xyXG5cdFx0XHRjb25zdCBlc2NVaWQgID0gKHYpID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKCB2ICk7XHJcblx0XHRcdGNvbnN0IG5vdFNlbGYgPSBjdXJyZW50RWw/LmRhdGFzZXQ/LnVpZCA/IGA6bm90KFtkYXRhLXVpZD1cIiR7ZXNjVWlkKCBjdXJyZW50RWwuZGF0YXNldC51aWQgKX1cIl0pYCA6ICcnO1xyXG5cdFx0XHR3aGlsZSAoIHRoaXMucGFnZXNfY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKFxyXG5cdFx0XHRcdGAud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3IC53cGJjX2JmYl9fZmllbGQke25vdFNlbGZ9W2RhdGEtaWQ9XCIke2VzYyhpZCl9XCJdLCAud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3IC53cGJjX2JmYl9fc2VjdGlvbiR7bm90U2VsZn1bZGF0YS1pZD1cIiR7ZXNjKGlkKX1cIl1gXHJcblx0XHRcdCkgKSB7XHJcblx0XHRcdFx0Ly8gRXhjbHVkZXMgc2VsZiBieSBkYXRhLXVpZCAuXHJcblx0XHRcdFx0Y29uc3QgZm91bmQgPSB0aGlzLnBhZ2VzX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCBgLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX2ZpZWxkW2RhdGEtaWQ9XCIke2VzYyggaWQgKX1cIl0sIC53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19zZWN0aW9uW2RhdGEtaWQ9XCIke2VzYyggaWQgKX1cIl1gICk7XHJcblx0XHRcdFx0aWYgKCBmb3VuZCAmJiBjdXJyZW50RWwgJiYgZm91bmQgPT09IGN1cnJlbnRFbCApIHtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZCA9IGAke2Jhc2UgfHwgJ2ZpZWxkJ30tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCAzNiApLnNsaWNlKCAyLCA1ICl9YDtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gaWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbnN1cmUgYSB1bmlxdWUgSFRNTCBuYW1lIGFjcm9zcyB0aGUgZm9ybS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gYmFzZSAtIERlc2lyZWQgYmFzZSBuYW1lICh1bi9zYW5pdGl6ZWQpLlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBjdXJyZW50RWwgLSBJZiBwcm92aWRlZCwgaWdub3JlIGNvbmZsaWN0cyB3aXRoIHRoaXMgZWxlbWVudC5cclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9IFVuaXF1ZSBuYW1lLlxyXG5cdFx0ICovXHJcblx0XHRlbnN1cmVfdW5pcXVlX2ZpZWxkX25hbWUoYmFzZSwgY3VycmVudEVsID0gbnVsbCkge1xyXG5cdFx0XHRsZXQgbmFtZSAgICAgID0gYmFzZSB8fCAnZmllbGQnO1xyXG5cdFx0XHRjb25zdCBlc2MgICAgID0gKHYpID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKCB2ICk7XHJcblx0XHRcdGNvbnN0IGVzY1VpZCAgPSAodikgPT4gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5lc2NfYXR0cl92YWx1ZV9mb3Jfc2VsZWN0b3IoIHYgKTtcclxuXHRcdFx0Ly8gRXhjbHVkZSB0aGUgY3VycmVudCBmaWVsZCAqYW5kIGFueSBET00gbWlycm9ycyBvZiBpdCogKHNhbWUgZGF0YS11aWQpXHJcblx0XHRcdGNvbnN0IHVpZCAgICAgPSBjdXJyZW50RWw/LmRhdGFzZXQ/LnVpZDtcclxuXHRcdFx0Y29uc3Qgbm90U2VsZiA9IHVpZCA/IGA6bm90KFtkYXRhLXVpZD1cIiR7ZXNjVWlkKCB1aWQgKX1cIl0pYCA6ICcnO1xyXG5cdFx0XHR3aGlsZSAoIHRydWUgKSB7XHJcblx0XHRcdFx0Y29uc3Qgc2VsZWN0b3IgPSBgLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX2ZpZWxkJHtub3RTZWxmfVtkYXRhLW5hbWU9XCIke2VzYyggbmFtZSApfVwiXWA7XHJcblx0XHRcdFx0Y29uc3QgY2xhc2hlcyAgPSB0aGlzLnBhZ2VzX2NvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKSB8fCBbXTtcclxuXHRcdFx0XHRpZiAoIGNsYXNoZXMubGVuZ3RoID09PSAwICkgYnJlYWs7ICAgICAgICAgICAvLyBub2JvZHkgZWxzZSB1c2VzIHRoaXMgbmFtZVxyXG5cdFx0XHRcdGNvbnN0IG0gPSBuYW1lLm1hdGNoKCAvLShcXGQrKSQvICk7XHJcblx0XHRcdFx0bmFtZSAgICA9IG0gPyBuYW1lLnJlcGxhY2UoIC8tXFxkKyQvLCAnLScgKyAoTnVtYmVyKCBtWzFdICkgKyAxKSApIDogYCR7YmFzZX0tMmA7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG5hbWU7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgZmllbGQncyBJTlRFUk5BTCBpZCAoZGF0YS1pZCkgb24gYW4gZWxlbWVudC4gRW5zdXJlcyB1bmlxdWVuZXNzIGFuZCBvcHRpb25hbGx5IGFza3MgY2FsbGVyIHRvIHJlZnJlc2hcclxuXHRcdCAqIHByZXZpZXcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZmllbGRfZWwgLSBGaWVsZCBlbGVtZW50IGluIHRoZSBjYW52YXMuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbmV3SWRSYXcgLSBEZXNpcmVkIGlkICh1bi9zYW5pdGl6ZWQpLlxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbcmVuZGVyUHJldmlldz1mYWxzZV0gLSBDYWxsZXIgY2FuIGRlY2lkZSB0byByZS1yZW5kZXIgcHJldmlldy5cclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9IEFwcGxpZWQgdW5pcXVlIGlkLlxyXG5cdFx0ICovXHJcblx0XHRzZXRfZmllbGRfaWQoIGZpZWxkX2VsLCBuZXdJZFJhdywgcmVuZGVyUHJldmlldyA9IGZhbHNlICkge1xyXG5cdFx0XHRjb25zdCBkZXNpcmVkID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5zYW5pdGl6ZV9odG1sX2lkKCBuZXdJZFJhdyApO1xyXG5cdFx0XHRjb25zdCB1bmlxdWUgID0gdGhpcy5lbnN1cmVfdW5pcXVlX2ZpZWxkX2lkKCBkZXNpcmVkLCBmaWVsZF9lbCApO1xyXG5cdFx0XHRmaWVsZF9lbC5zZXRBdHRyaWJ1dGUoICdkYXRhLWlkJywgdW5pcXVlICk7XHJcblx0XHRcdGlmICggcmVuZGVyUHJldmlldyApIHtcclxuXHRcdFx0XHQvLyBDYWxsZXIgZGVjaWRlcyBpZiAvIHdoZW4gdG8gcmVuZGVyLlxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB1bmlxdWU7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgZmllbGQncyBSRVFVSVJFRCBIVE1MIG5hbWUgKGRhdGEtbmFtZSkuIEVuc3VyZXMgc2FuaXRpemVkICsgdW5pcXVlIHBlciBmb3JtLlxyXG5cdFx0ICogRmFsbHMgYmFjayB0byBzYW5pdGl6ZWQgaW50ZXJuYWwgaWQgaWYgdXNlciBwcm92aWRlcyBlbXB0eSB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBmaWVsZF9lbCAtIEZpZWxkIGVsZW1lbnQgaW4gdGhlIGNhbnZhcy5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBuZXdOYW1lUmF3IC0gRGVzaXJlZCBuYW1lICh1bi9zYW5pdGl6ZWQpLlxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbcmVuZGVyUHJldmlldz1mYWxzZV0gLSBDYWxsZXIgY2FuIGRlY2lkZSB0byByZS1yZW5kZXIgcHJldmlldy5cclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9IEFwcGxpZWQgdW5pcXVlIG5hbWUuXHJcblx0XHQgKi9cclxuXHRcdHNldF9maWVsZF9uYW1lKCBmaWVsZF9lbCwgbmV3TmFtZVJhdywgcmVuZGVyUHJldmlldyA9IGZhbHNlICkge1xyXG5cdFx0XHRjb25zdCByYXcgID0gKG5ld05hbWVSYXcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKCBuZXdOYW1lUmF3ICkpLnRyaW0oKTtcclxuXHRcdFx0Y29uc3QgYmFzZSA9IHJhd1xyXG5cdFx0XHRcdD8gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5zYW5pdGl6ZV9odG1sX25hbWUoIHJhdyApXHJcblx0XHRcdFx0OiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfbmFtZSggZmllbGRfZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1pZCcgKSB8fCAnZmllbGQnICk7XHJcblxyXG5cdFx0XHRjb25zdCB1bmlxdWUgPSB0aGlzLmVuc3VyZV91bmlxdWVfZmllbGRfbmFtZSggYmFzZSwgZmllbGRfZWwgKTtcclxuXHRcdFx0ZmllbGRfZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1uYW1lJywgdW5pcXVlICk7XHJcblx0XHRcdGlmICggcmVuZGVyUHJldmlldyApIHtcclxuXHRcdFx0XHQvLyBDYWxsZXIgZGVjaWRlcyBpZiAvIHdoZW4gdG8gcmVuZGVyLlxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB1bmlxdWU7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgZmllbGQncyBPUFRJT05BTCBwdWJsaWMgSFRNTCBpZCAoZGF0YS1odG1sX2lkKS4gRW1wdHkgdmFsdWUgcmVtb3ZlcyB0aGUgYXR0cmlidXRlLlxyXG5cdFx0ICogRW5zdXJlcyBzYW5pdGl6YXRpb24gKyB1bmlxdWVuZXNzIGFtb25nIG90aGVyIGRlY2xhcmVkIEhUTUwgaWRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGZpZWxkX2VsIC0gRmllbGQgZWxlbWVudCBpbiB0aGUgY2FudmFzLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IG5ld0h0bWxJZFJhdyAtIERlc2lyZWQgaHRtbF9pZCAob3B0aW9uYWwpLlxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbcmVuZGVyUHJldmlldz1mYWxzZV0gLSBDYWxsZXIgY2FuIGRlY2lkZSB0byByZS1yZW5kZXIgcHJldmlldy5cclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBhcHBsaWVkIGh0bWxfaWQgb3IgZW1wdHkgc3RyaW5nIGlmIHJlbW92ZWQuXHJcblx0XHQgKi9cclxuXHRcdHNldF9maWVsZF9odG1sX2lkKCBmaWVsZF9lbCwgbmV3SHRtbElkUmF3LCByZW5kZXJQcmV2aWV3ID0gZmFsc2UgKSB7XHJcblx0XHRcdGNvbnN0IHJhdyA9IChuZXdIdG1sSWRSYXcgPT0gbnVsbCA/ICcnIDogU3RyaW5nKCBuZXdIdG1sSWRSYXcgKSkudHJpbSgpO1xyXG5cclxuXHRcdFx0aWYgKCByYXcgPT09ICcnICkge1xyXG5cdFx0XHRcdGZpZWxkX2VsLnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtaHRtbF9pZCcgKTtcclxuXHRcdFx0XHRpZiAoIHJlbmRlclByZXZpZXcgKSB7XHJcblx0XHRcdFx0XHQvLyBDYWxsZXIgZGVjaWRlcyBpZiAvIHdoZW4gdG8gcmVuZGVyLlxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gJyc7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGRlc2lyZWQgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfaWQoIHJhdyApO1xyXG5cdFx0XHRsZXQgaHRtbElkICAgID0gZGVzaXJlZDtcclxuXHRcdFx0Y29uc3QgZXNjICAgICA9ICh2KSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmVzY19hdHRyX3ZhbHVlX2Zvcl9zZWxlY3RvciggdiApO1xyXG5cdFx0XHRjb25zdCBlc2NVaWQgID0gKHYpID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKCB2ICk7XHJcblxyXG5cdFx0XHR3aGlsZSAoIHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVpZCAgICAgPSBmaWVsZF9lbD8uZGF0YXNldD8udWlkO1xyXG5cdFx0XHRcdGNvbnN0IG5vdFNlbGYgPSB1aWQgPyBgOm5vdChbZGF0YS11aWQ9XCIke2VzY1VpZCggdWlkICl9XCJdKWAgOiAnJztcclxuXHJcblx0XHRcdFx0Y29uc3QgY2xhc2hJbkNhbnZhcyA9IHRoaXMucGFnZXNfY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKFxyXG5cdFx0XHRcdFx0YC53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19maWVsZCR7bm90U2VsZn1bZGF0YS1odG1sX2lkPVwiJHtlc2MoIGh0bWxJZCApfVwiXSxgICtcclxuXHRcdFx0XHRcdGAud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3IC53cGJjX2JmYl9fc2VjdGlvbiR7bm90U2VsZn1bZGF0YS1odG1sX2lkPVwiJHtlc2MoIGh0bWxJZCApfVwiXWBcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGNvbnN0IGRvbUNsYXNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGh0bWxJZCApO1xyXG5cclxuXHRcdFx0XHQvLyBBbGxvdyB3aGVuIHRoZSBvbmx5IFwiY2xhc2hcIiBpcyBpbnNpZGUgdGhpcyBzYW1lIGZpZWxkIChlLmcuLCB0aGUgaW5wdXQgeW91IGp1c3QgcmVuZGVyZWQpXHJcblx0XHRcdFx0Y29uc3QgZG9tQ2xhc2hJc1NlbGYgPSBkb21DbGFzaCA9PT0gZmllbGRfZWwgfHwgKGRvbUNsYXNoICYmIGZpZWxkX2VsLmNvbnRhaW5zKCBkb21DbGFzaCApKTtcclxuXHJcblx0XHRcdFx0aWYgKCAhY2xhc2hJbkNhbnZhcyAmJiAoIWRvbUNsYXNoIHx8IGRvbUNsYXNoSXNTZWxmKSApIHtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgbSA9IGh0bWxJZC5tYXRjaCggLy0oXFxkKykkLyApO1xyXG5cdFx0XHRcdGh0bWxJZCAgPSBtID8gaHRtbElkLnJlcGxhY2UoIC8tXFxkKyQvLCAnLScgKyAoTnVtYmVyKCBtWzFdICkgKyAxKSApIDogYCR7ZGVzaXJlZH0tMmA7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZpZWxkX2VsLnNldEF0dHJpYnV0ZSggJ2RhdGEtaHRtbF9pZCcsIGh0bWxJZCApO1xyXG5cdFx0XHRpZiAoIHJlbmRlclByZXZpZXcgKSB7XHJcblx0XHRcdFx0Ly8gQ2FsbGVyIGRlY2lkZXMgaWYgLyB3aGVuIHRvIHJlbmRlci5cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gaHRtbElkO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdQQkMgTGF5b3V0IHNlcnZpY2UuIEVuY2Fwc3VsYXRlcyBjb2x1bW4gd2lkdGggbWF0aCB3aXRoIGdhcCBoYW5kbGluZywgcHJlc2V0cywgYW5kIHV0aWxpdGllcy5cclxuXHQgKi9cclxuXHRDb3JlLldQQkNfQkZCX0xheW91dFNlcnZpY2UgPSBjbGFzcyAge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29uc3RydWN0b3IuIFNldCBvcHRpb25zIHdpdGggZ2FwIGJldHdlZW4gY29sdW1ucyAoJSkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHt7IGNvbF9nYXBfcGVyY2VudD86IG51bWJlciB9fSBbb3B0c10gLSBPcHRpb25zIHdpdGggZ2FwIGJldHdlZW4gY29sdW1ucyAoJSkuXHJcblx0XHQgKi9cclxuXHRcdGNvbnN0cnVjdG9yKCBvcHRzID0ge30gKSB7XHJcblx0XHRcdHRoaXMuY29sX2dhcF9wZXJjZW50ID0gTnVtYmVyLmlzRmluaXRlKCArb3B0cy5jb2xfZ2FwX3BlcmNlbnQgKSA/ICtvcHRzLmNvbF9nYXBfcGVyY2VudCA6IDM7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb21wdXRlIG5vcm1hbGl6ZWQgZmxleC1iYXNpcyB2YWx1ZXMgZm9yIGEgcm93LCByZXNwZWN0aW5nIGNvbHVtbiBnYXBzLlxyXG5cdFx0ICogUmV0dXJucyBiYXNlcyB0aGF0IHN1bSB0byBhdmFpbGFibGUgPSAxMDAgLSAobi0xKSpnYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm93X2VsIC0gUm93IGVsZW1lbnQgY29udGFpbmluZyAud3BiY19iZmJfX2NvbHVtbiBjaGlsZHJlbi5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBbZ2FwX3BlcmNlbnQ9dGhpcy5jb2xfZ2FwX3BlcmNlbnRdIC0gR2FwIHBlcmNlbnQgYmV0d2VlbiBjb2x1bW5zLlxyXG5cdFx0ICogQHJldHVybnMge3thdmFpbGFibGU6bnVtYmVyLGJhc2VzOm51bWJlcltdfX0gQXZhaWxhYmxlIHNwYWNlIGFuZCBiYXNpcyB2YWx1ZXMuXHJcblx0XHQgKi9cclxuXHRcdGNvbXB1dGVfZWZmZWN0aXZlX2Jhc2VzX2Zyb21fcm93KCByb3dfZWwsIGdhcF9wZXJjZW50ID0gdGhpcy5jb2xfZ2FwX3BlcmNlbnQgKSB7XHJcblx0XHRcdGNvbnN0IGNvbHMgPSBBcnJheS5mcm9tKCByb3dfZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKSB8fCBbXSApO1xyXG5cdFx0XHRjb25zdCBuICAgID0gY29scy5sZW5ndGggfHwgMTtcclxuXHJcblx0XHRcdGNvbnN0IHJhdyA9IGNvbHMubWFwKCAoIGNvbCApID0+IHtcclxuXHRcdFx0XHRjb25zdCB3ID0gY29sLnN0eWxlLmZsZXhCYXNpcyB8fCAnJztcclxuXHRcdFx0XHRjb25zdCBwID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5wYXJzZV9wZXJjZW50KCB3LCBOYU4gKTtcclxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyLmlzRmluaXRlKCBwICkgPyBwIDogKDEwMCAvIG4pO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRjb25zdCBzdW1fcmF3ICAgID0gcmF3LnJlZHVjZSggKCBhLCBiICkgPT4gYSArIGIsIDAgKSB8fCAxMDA7XHJcblx0XHRcdGNvbnN0IGdwICAgICAgICAgPSBOdW1iZXIuaXNGaW5pdGUoICtnYXBfcGVyY2VudCApID8gK2dhcF9wZXJjZW50IDogMztcclxuXHRcdFx0Y29uc3QgdG90YWxfZ2FwcyA9IE1hdGgubWF4KCAwLCBuIC0gMSApICogZ3A7XHJcblx0XHRcdGNvbnN0IGF2YWlsYWJsZSAgPSBNYXRoLm1heCggMCwgMTAwIC0gdG90YWxfZ2FwcyApO1xyXG5cdFx0XHRjb25zdCBzY2FsZSAgICAgID0gYXZhaWxhYmxlIC8gc3VtX3JhdztcclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YXZhaWxhYmxlLFxyXG5cdFx0XHRcdGJhc2VzOiByYXcubWFwKCAoIHAgKSA9PiBNYXRoLm1heCggMCwgcCAqIHNjYWxlICkgKVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXBwbHkgY29tcHV0ZWQgYmFzZXMgdG8gdGhlIHJvdydzIGNvbHVtbnMgKHNldHMgZmxleC1iYXNpcyAlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3dfZWwgLSBSb3cgZWxlbWVudC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyW119IGJhc2VzIC0gQXJyYXkgb2YgYmFzaXMgdmFsdWVzIChwZXJjZW50IG9mIGZ1bGwgMTAwKS5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRhcHBseV9iYXNlc190b19yb3coIHJvd19lbCwgYmFzZXMgKSB7XHJcblx0XHRcdGNvbnN0IGNvbHMgPSBBcnJheS5mcm9tKCByb3dfZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKSB8fCBbXSApO1xyXG5cdFx0XHRjb2xzLmZvckVhY2goICggY29sLCBpICkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHAgICAgICAgICAgICAgPSBiYXNlc1tpXSA/PyAwO1xyXG5cdFx0XHRcdGNvbC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtwfSVgO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEaXN0cmlidXRlIGNvbHVtbnMgZXZlbmx5LCByZXNwZWN0aW5nIGdhcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3dfZWwgLSBSb3cgZWxlbWVudC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBbZ2FwX3BlcmNlbnQ9dGhpcy5jb2xfZ2FwX3BlcmNlbnRdIC0gR2FwIHBlcmNlbnQuXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c2V0X2VxdWFsX2Jhc2VzKCByb3dfZWwsIGdhcF9wZXJjZW50ID0gdGhpcy5jb2xfZ2FwX3BlcmNlbnQgKSB7XHJcblx0XHRcdGNvbnN0IGNvbHMgICAgICAgPSBBcnJheS5mcm9tKCByb3dfZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKSB8fCBbXSApO1xyXG5cdFx0XHRjb25zdCBuICAgICAgICAgID0gY29scy5sZW5ndGggfHwgMTtcclxuXHRcdFx0Y29uc3QgZ3AgICAgICAgICA9IE51bWJlci5pc0Zpbml0ZSggK2dhcF9wZXJjZW50ICkgPyArZ2FwX3BlcmNlbnQgOiAzO1xyXG5cdFx0XHRjb25zdCB0b3RhbF9nYXBzID0gTWF0aC5tYXgoIDAsIG4gLSAxICkgKiBncDtcclxuXHRcdFx0Y29uc3QgYXZhaWxhYmxlICA9IE1hdGgubWF4KCAwLCAxMDAgLSB0b3RhbF9nYXBzICk7XHJcblx0XHRcdGNvbnN0IGVhY2ggICAgICAgPSBhdmFpbGFibGUgLyBuO1xyXG5cdFx0XHR0aGlzLmFwcGx5X2Jhc2VzX3RvX3Jvdyggcm93X2VsLCBBcnJheSggbiApLmZpbGwoIGVhY2ggKSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXBwbHkgYSBwcmVzZXQgb2YgcmVsYXRpdmUgd2VpZ2h0cyB0byBhIHJvdy9zZWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNlY3Rpb25PclJvdyAtIC53cGJjX2JmYl9fc2VjdGlvbiBvciBpdHMgY2hpbGQgLndwYmNfYmZiX19yb3cuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcltdfSB3ZWlnaHRzIC0gUmVsYXRpdmUgd2VpZ2h0cyAoZS5nLiwgWzEsMywxXSkuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gW2dhcF9wZXJjZW50PXRoaXMuY29sX2dhcF9wZXJjZW50XSAtIEdhcCBwZXJjZW50LlxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdGFwcGx5X2xheW91dF9wcmVzZXQoIHNlY3Rpb25PclJvdywgd2VpZ2h0cywgZ2FwX3BlcmNlbnQgPSB0aGlzLmNvbF9nYXBfcGVyY2VudCApIHtcclxuXHRcdFx0Y29uc3Qgcm93ID0gc2VjdGlvbk9yUm93Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX3JvdycgKVxyXG5cdFx0XHRcdD8gc2VjdGlvbk9yUm93XHJcblx0XHRcdFx0OiBzZWN0aW9uT3JSb3c/LnF1ZXJ5U2VsZWN0b3IoICc6c2NvcGUgPiAud3BiY19iZmJfX3JvdycgKTtcclxuXHJcblx0XHRcdGlmICggISByb3cgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjb2xzID0gQXJyYXkuZnJvbSggcm93LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKSB8fCBbXSApO1xyXG5cdFx0XHRjb25zdCBuICAgID0gY29scy5sZW5ndGggfHwgMTtcclxuXHJcblx0XHRcdGlmICggISBBcnJheS5pc0FycmF5KCB3ZWlnaHRzICkgfHwgd2VpZ2h0cy5sZW5ndGggIT09IG4gKSB7XHJcblx0XHRcdFx0dGhpcy5zZXRfZXF1YWxfYmFzZXMoIHJvdywgZ2FwX3BlcmNlbnQgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHN1bSAgICAgICA9IHdlaWdodHMucmVkdWNlKCAoIGEsIGIgKSA9PiBhICsgTWF0aC5tYXgoIDAsIE51bWJlciggYiApIHx8IDAgKSwgMCApIHx8IDE7XHJcblx0XHRcdGNvbnN0IGdwICAgICAgICA9IE51bWJlci5pc0Zpbml0ZSggK2dhcF9wZXJjZW50ICkgPyArZ2FwX3BlcmNlbnQgOiAzO1xyXG5cdFx0XHRjb25zdCBhdmFpbGFibGUgPSBNYXRoLm1heCggMCwgMTAwIC0gTWF0aC5tYXgoIDAsIG4gLSAxICkgKiBncCApO1xyXG5cdFx0XHRjb25zdCBiYXNlcyAgICAgPSB3ZWlnaHRzLm1hcCggKCB3ICkgPT4gTWF0aC5tYXgoIDAsIChOdW1iZXIoIHcgKSB8fCAwKSAvIHN1bSAqIGF2YWlsYWJsZSApICk7XHJcblxyXG5cdFx0XHR0aGlzLmFwcGx5X2Jhc2VzX3RvX3Jvdyggcm93LCBiYXNlcyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQnVpbGQgcHJlc2V0IHdlaWdodCBsaXN0cyBmb3IgYSBnaXZlbiBjb2x1bW4gY291bnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IG4gLSBDb2x1bW4gY291bnQuXHJcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyW11bXX0gTGlzdCBvZiB3ZWlnaHQgYXJyYXlzLlxyXG5cdFx0ICovXHJcblx0XHRidWlsZF9wcmVzZXRzX2Zvcl9jb2x1bW5zKCBuICkge1xyXG5cdFx0XHRzd2l0Y2ggKCBuICkge1xyXG5cdFx0XHRcdGNhc2UgMTpcclxuXHRcdFx0XHRcdHJldHVybiBbIFsgMSBdIF07XHJcblx0XHRcdFx0Y2FzZSAyOlxyXG5cdFx0XHRcdFx0cmV0dXJuIFsgWyAxLCAyIF0sIFsgMiwgMSBdLCBbIDEsIDMgXSwgWyAzLCAxIF0gXTtcclxuXHRcdFx0XHRjYXNlIDM6XHJcblx0XHRcdFx0XHRyZXR1cm4gWyBbIDEsIDMsIDEgXSwgWyAxLCAyLCAxIF0sIFsgMiwgMSwgMSBdLCBbIDEsIDEsIDIgXSBdO1xyXG5cdFx0XHRcdGNhc2UgNDpcclxuXHRcdFx0XHRcdHJldHVybiBbIFsgMSwgMiwgMiwgMSBdLCBbIDIsIDEsIDEsIDEgXSwgWyAxLCAxLCAxLCAyIF0gXTtcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0cmV0dXJuIFsgQXJyYXkoIG4gKS5maWxsKCAxICkgXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRm9ybWF0IGEgaHVtYW4tcmVhZGFibGUgbGFiZWwgbGlrZSBcIjUwJS8yNSUvMjUlXCIgZnJvbSB3ZWlnaHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyW119IHdlaWdodHMgLSBXZWlnaHQgbGlzdC5cclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9IExhYmVsIHN0cmluZy5cclxuXHRcdCAqL1xyXG5cdFx0Zm9ybWF0X3ByZXNldF9sYWJlbCggd2VpZ2h0cyApIHtcclxuXHRcdFx0Y29uc3Qgc3VtID0gd2VpZ2h0cy5yZWR1Y2UoICggYSwgYiApID0+IGEgKyAoTnVtYmVyKCBiICkgfHwgMCksIDAgKSB8fCAxO1xyXG5cdFx0XHRyZXR1cm4gd2VpZ2h0cy5tYXAoICggdyApID0+IE1hdGgucm91bmQoICgoTnVtYmVyKCB3ICkgfHwgMCkgLyBzdW0pICogMTAwICkgKS5qb2luKCAnJS8nICkgKyAnJSc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBQYXJzZSBjb21tYS9zcGFjZSBzZXBhcmF0ZWQgd2VpZ2h0cyBpbnRvIG51bWJlcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gVXNlciBpbnB1dCBsaWtlIFwiMjAsNjAsMjBcIi5cclxuXHRcdCAqIEByZXR1cm5zIHtudW1iZXJbXX0gUGFyc2VkIHdlaWdodHMuXHJcblx0XHQgKi9cclxuXHRcdHBhcnNlX3dlaWdodHMoIGlucHV0ICkge1xyXG5cdFx0XHRpZiAoICEgaW5wdXQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIGlucHV0IClcclxuXHRcdFx0XHQucmVwbGFjZSggL1teXFxkLC5cXHNdL2csICcnIClcclxuXHRcdFx0XHQuc3BsaXQoIC9bXFxzLF0rLyApXHJcblx0XHRcdFx0Lm1hcCggKCBzICkgPT4gcGFyc2VGbG9hdCggcyApIClcclxuXHRcdFx0XHQuZmlsdGVyKCAoIG4gKSA9PiBOdW1iZXIuaXNGaW5pdGUoIG4gKSAmJiBuID49IDAgKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBXUEJDIFVzYWdlIExpbWl0IHNlcnZpY2UuXHJcblx0ICogQ291bnRzIGZpZWxkIHVzYWdlIGJ5IGtleSwgY29tcGFyZXMgdG8gcGFsZXR0ZSBsaW1pdHMsIGFuZCB1cGRhdGVzIHBhbGV0dGUgVUkuXHJcblx0ICovXHJcblx0Q29yZS5XUEJDX0JGQl9Vc2FnZUxpbWl0U2VydmljZSA9IGNsYXNzICB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb25zdHJ1Y3Rvci4gU2V0IHBhZ2VzX2NvbnRhaW5lciBhbmQgcGFsZXR0ZV91bC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYWdlc19jb250YWluZXIgLSBDYW52YXMgcm9vdCB0aGF0IGhvbGRzIHBsYWNlZCBmaWVsZHMuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50W118bnVsbH0gcGFsZXR0ZV91bHM/OiAgIFBhbGV0dGVzIFVMIHdpdGggLndwYmNfYmZiX19maWVsZCBpdGVtcyAobWF5IGJlIG51bGwpLlxyXG5cdFx0ICovXHJcblx0XHRjb25zdHJ1Y3RvcihwYWdlc19jb250YWluZXIsIHBhbGV0dGVfdWxzKSB7XHJcblx0XHRcdHRoaXMucGFnZXNfY29udGFpbmVyID0gcGFnZXNfY29udGFpbmVyO1xyXG5cdFx0XHQvLyBOb3JtYWxpemUgdG8gYW4gYXJyYXk7IHdl4oCZbGwgc3RpbGwgYmUgcm9idXN0IGlmIG5vbmUgcHJvdmlkZWQuXHJcblx0XHRcdHRoaXMucGFsZXR0ZV91bHMgICAgID0gQXJyYXkuaXNBcnJheSggcGFsZXR0ZV91bHMgKSA/IHBhbGV0dGVfdWxzIDogKHBhbGV0dGVfdWxzID8gWyBwYWxldHRlX3VscyBdIDogW10pO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFBhcnNlIHVzYWdlIGxpbWl0IGZyb20gcmF3IGRhdGFzZXQgdmFsdWUuIE1pc3NpbmcvaW52YWxpZCAtPiBJbmZpbml0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8bnVsbHx1bmRlZmluZWR9IHJhdyAtIFJhdyBhdHRyaWJ1dGUgdmFsdWUuXHJcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfSBMaW1pdCBudW1iZXIgb3IgSW5maW5pdHkuXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBwYXJzZV91c2FnZV9saW1pdCggcmF3ICkge1xyXG5cdFx0XHRpZiAoIHJhdyA9PSBudWxsICkge1xyXG5cdFx0XHRcdHJldHVybiBJbmZpbml0eTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBuID0gcGFyc2VJbnQoIHJhdywgMTAgKTtcclxuXHRcdFx0cmV0dXJuIE51bWJlci5pc0Zpbml0ZSggbiApID8gbiA6IEluZmluaXR5O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ291bnQgaG93IG1hbnkgaW5zdGFuY2VzIGV4aXN0IHBlciB1c2FnZV9rZXkgaW4gdGhlIGNhbnZhcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gTWFwIG9mIHVzYWdlX2tleSAtPiBjb3VudC5cclxuXHRcdCAqL1xyXG5cdFx0Y291bnRfdXNhZ2VfYnlfa2V5KCkge1xyXG5cdFx0XHRjb25zdCB1c2VkID0ge307XHJcblx0XHRcdGNvbnN0IGFsbCAgPSB0aGlzLnBhZ2VzX2NvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19maWVsZDpub3QoLmlzLWludmFsaWQpJyApIHx8IFtdO1xyXG5cdFx0XHRhbGwuZm9yRWFjaCggKCBlbCApID0+IHtcclxuXHRcdFx0XHRjb25zdCBrZXkgPSBlbC5kYXRhc2V0LnVzYWdlX2tleSB8fCBlbC5kYXRhc2V0LnR5cGUgfHwgZWwuZGF0YXNldC5pZDtcclxuXHRcdFx0XHRpZiAoICEga2V5ICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR1c2VkW2tleV0gPSAodXNlZFtrZXldIHx8IDApICsgMTtcclxuXHRcdFx0fSApO1xyXG5cdFx0XHRyZXR1cm4gdXNlZDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybiBwYWxldHRlIGxpbWl0IGZvciBhIGdpdmVuIHVzYWdlIGtleSAoaWQgb2YgdGhlIHBhbGV0dGUgaXRlbSkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFVzYWdlIGtleS5cclxuXHRcdCAqIEByZXR1cm5zIHtudW1iZXJ9IExpbWl0IHZhbHVlIG9yIEluZmluaXR5LlxyXG5cdFx0ICovXHJcblx0XHRnZXRfbGltaXRfZm9yX2tleShrZXkpIHtcclxuXHRcdFx0aWYgKCAhIGtleSApIHtcclxuXHRcdFx0XHRyZXR1cm4gSW5maW5pdHk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gUXVlcnkgYWNyb3NzIGFsbCBwYWxldHRlcyBwcmVzZW50IG5vdyAoc3RvcmVkICsgYW55IG5ld2x5IGFkZGVkIGluIERPTSkuXHJcblx0XHRcdGNvbnN0IHJvb3RzICAgICAgICAgICAgPSB0aGlzLnBhbGV0dGVfdWxzPy5sZW5ndGggPyB0aGlzLnBhbGV0dGVfdWxzIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fcGFuZWxfZmllbGRfdHlwZXNfX3VsJyApO1xyXG5cdFx0XHRjb25zdCBhbGxQYWxldHRlRmllbGRzID0gQXJyYXkuZnJvbSggcm9vdHMgKS5mbGF0TWFwKCByID0+IEFycmF5LmZyb20oIHIucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fZmllbGQnICkgKSApO1xyXG5cdFx0XHRsZXQgbGltaXQgICAgICAgICAgICAgID0gSW5maW5pdHk7XHJcblxyXG5cdFx0XHRhbGxQYWxldHRlRmllbGRzLmZvckVhY2goIChlbCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHVzYWdlX2tleSA9IGVsLmRhdGFzZXQudXNhZ2Vfa2V5IHx8IGVsLmRhdGFzZXQuaWQ7XHJcblx0XHRcdFx0aWYgKCBlbC5kYXRhc2V0LmlkID09PSBrZXkgfHwgdXNhZ2Vfa2V5ID09PSBrZXkgKSB7XHJcblx0XHRcdFx0XHRjb25zdCBuID0gQ29yZS5XUEJDX0JGQl9Vc2FnZUxpbWl0U2VydmljZS5wYXJzZV91c2FnZV9saW1pdCggZWwuZGF0YXNldC51c2FnZW51bWJlciApO1xyXG5cdFx0XHRcdFx0Ly8gQ2hvb3NlIHRoZSBzbWFsbGVzdCBmaW5pdGUgbGltaXQgKHNhZmVzdCBpZiBwYWxldHRlcyBkaXNhZ3JlZSkuXHJcblx0XHRcdFx0XHRpZiAoIG4gPCBsaW1pdCApIHtcclxuXHRcdFx0XHRcdFx0bGltaXQgPSBuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGxpbWl0O1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERpc2FibGUvZW5hYmxlIHBhbGV0dGUgaXRlbXMgYmFzZWQgb24gY3VycmVudCB1c2FnZSBjb3VudHMgYW5kIGxpbWl0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0dXBkYXRlX3BhbGV0dGVfdWkoKSB7XHJcblx0XHRcdC8vIEFsd2F5cyBjb21wdXRlIHVzYWdlIGZyb20gdGhlIGNhbnZhczpcclxuXHRcdFx0Y29uc3QgdXNhZ2UgPSB0aGlzLmNvdW50X3VzYWdlX2J5X2tleSgpO1xyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIGFsbCBwYWxldHRlcyBjdXJyZW50bHkgaW4gRE9NIChub3QganVzdCB0aGUgaW5pdGlhbGx5IGNhcHR1cmVkIG9uZXMpXHJcblx0XHRcdGNvbnN0IHBhbGV0dGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fcGFuZWxfZmllbGRfdHlwZXNfX3VsJyApO1xyXG5cclxuXHRcdFx0cGFsZXR0ZXMuZm9yRWFjaCggKHBhbCkgPT4ge1xyXG5cdFx0XHRcdHBhbC5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19maWVsZCcgKS5mb3JFYWNoKCAocGFuZWxfZmllbGQpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHBhbGV0dGVJZCAgID0gcGFuZWxfZmllbGQuZGF0YXNldC5pZDtcclxuXHRcdFx0XHRcdGNvbnN0IHVzYWdlS2V5ICAgID0gcGFuZWxfZmllbGQuZGF0YXNldC51c2FnZV9rZXkgfHwgcGFsZXR0ZUlkO1xyXG5cdFx0XHRcdFx0Y29uc3QgcmF3X2xpbWl0ICAgPSBwYW5lbF9maWVsZC5kYXRhc2V0LnVzYWdlbnVtYmVyO1xyXG5cdFx0XHRcdFx0Y29uc3QgcGVyRWxMaW1pdCAgPSBDb3JlLldQQkNfQkZCX1VzYWdlTGltaXRTZXJ2aWNlLnBhcnNlX3VzYWdlX2xpbWl0KCByYXdfbGltaXQgKTtcclxuXHRcdFx0XHRcdC8vIEVmZmVjdGl2ZSBsaW1pdCBhY3Jvc3MgYWxsIHBhbGV0dGVzIGlzIHRoZSBnbG9iYWwgbGltaXQgZm9yIHRoaXMga2V5LlxyXG5cdFx0XHRcdFx0Y29uc3QgZ2xvYmFsTGltaXQgPSB0aGlzLmdldF9saW1pdF9mb3Jfa2V5KCB1c2FnZUtleSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgbGltaXQgICAgICAgPSBOdW1iZXIuaXNGaW5pdGUoIGdsb2JhbExpbWl0ICkgPyBnbG9iYWxMaW1pdCA6IHBlckVsTGltaXQ7IC8vIHByZWZlciBnbG9iYWwgbWluXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudCA9IHVzYWdlW3VzYWdlS2V5XSB8fCAwO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGlzYWJsZSA9IE51bWJlci5pc0Zpbml0ZSggbGltaXQgKSAmJiBjdXJyZW50ID49IGxpbWl0O1xyXG5cclxuXHRcdFx0XHRcdHBhbmVsX2ZpZWxkLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBkaXNhYmxlID8gJ25vbmUnIDogJyc7XHJcblx0XHRcdFx0XHRwYW5lbF9maWVsZC5zdHlsZS5vcGFjaXR5ICAgICAgID0gZGlzYWJsZSA/ICcwLjQnIDogJyc7XHJcblx0XHRcdFx0XHRwYW5lbF9maWVsZC5zZXRBdHRyaWJ1dGUoICdhcmlhLWRpc2FibGVkJywgZGlzYWJsZSA/ICd0cnVlJyA6ICdmYWxzZScgKTtcclxuXHRcdFx0XHRcdGlmICggZGlzYWJsZSApIHtcclxuXHRcdFx0XHRcdFx0cGFuZWxfZmllbGQuc2V0QXR0cmlidXRlKCAndGFiaW5kZXgnLCAnLTEnICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRwYW5lbF9maWVsZC5yZW1vdmVBdHRyaWJ1dGUoICd0YWJpbmRleCcgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm4gaG93IG1hbnkgdmFsaWQgaW5zdGFuY2VzIHdpdGggdGhpcyB1c2FnZSBrZXkgZXhpc3QgaW4gdGhlIGNhbnZhcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVXNhZ2Uga2V5IG9mIGEgcGFsZXR0ZSBpdGVtLlxyXG5cdFx0ICogQHJldHVybnMge251bWJlcn0gQ291bnQgb2YgZXhpc3Rpbmcgbm9uLWludmFsaWQgaW5zdGFuY2VzLlxyXG5cdFx0ICovXHJcblx0XHRjb3VudF9mb3Jfa2V5KCBrZXkgKSB7XHJcblx0XHRcdGlmICggISBrZXkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIDA7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuICggdGhpcy5wYWdlc19jb250YWluZXI/LnF1ZXJ5U2VsZWN0b3JBbGwoXHJcbiAgICAgICAgICAgICAgICBgLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX2ZpZWxkW2RhdGEtdXNhZ2Vfa2V5PVwiJHtDb3JlLldQQkNfQkZCX1Nhbml0aXplLmVzY19hdHRyX3ZhbHVlX2Zvcl9zZWxlY3Rvcigga2V5ICl9XCJdOm5vdCguaXMtaW52YWxpZCksIFxyXG4gICAgICAgICAgICAgICAgIC53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19maWVsZFtkYXRhLXR5cGU9XCIke0NvcmUuV1BCQ19CRkJfU2FuaXRpemUuZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKCBrZXkgKX1cIl06bm90KC5pcy1pbnZhbGlkKWBcclxuXHRcdFx0KSB8fCBbXSApLmxlbmd0aDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsaWFzIGZvciBsaW1pdCBsb29rdXAgKHJlYWRhYmlsaXR5KS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVXNhZ2Uga2V5IG9mIGEgcGFsZXR0ZSBpdGVtLlxyXG5cdFx0ICogQHJldHVybnMge251bWJlcn0gTGltaXQgdmFsdWUgb3IgSW5maW5pdHkuXHJcblx0XHQgKi9cclxuXHRcdGxpbWl0X2Zvcl9rZXkoIGtleSApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0X2xpbWl0X2Zvcl9rZXkoIGtleSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVtYWluaW5nIHNsb3RzIGZvciB0aGlzIGtleSAoSW5maW5pdHkgaWYgdW5saW1pdGVkKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVXNhZ2Uga2V5IG9mIGEgcGFsZXR0ZSBpdGVtLlxyXG5cdFx0ICogQHJldHVybnMge251bWJlcn0gUmVtYWluaW5nIGNvdW50ICg+PSAwKSBvciBJbmZpbml0eS5cclxuXHRcdCAqL1xyXG5cdFx0cmVtYWluaW5nX2Zvcl9rZXkoIGtleSApIHtcclxuXHRcdFx0Y29uc3QgbGltaXQgPSB0aGlzLmxpbWl0X2Zvcl9rZXkoIGtleSApO1xyXG5cdFx0XHRpZiAoIGxpbWl0ID09PSBJbmZpbml0eSApIHtcclxuXHRcdFx0XHRyZXR1cm4gSW5maW5pdHk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgdXNlZCA9IHRoaXMuY291bnRfZm9yX2tleSgga2V5ICk7XHJcblx0XHRcdHJldHVybiBNYXRoLm1heCggMCwgbGltaXQgLSB1c2VkICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUcnVlIGlmIHlvdSBjYW4gYWRkIGBkZWx0YWAgbW9yZSBpdGVtcyBmb3IgdGhpcyBrZXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFVzYWdlIGtleSBvZiBhIHBhbGV0dGUgaXRlbS5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsdGE9MV0gLSBIb3cgbWFueSBpdGVtcyB5b3UgaW50ZW5kIHRvIGFkZC5cclxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGFkZGluZyBpcyBhbGxvd2VkLlxyXG5cdFx0ICovXHJcblx0XHRjYW5fYWRkKCBrZXksIGRlbHRhID0gMSApIHtcclxuXHRcdFx0Y29uc3QgcmVtID0gdGhpcy5yZW1haW5pbmdfZm9yX2tleSgga2V5ICk7XHJcblx0XHRcdHJldHVybiAoIHJlbSA9PT0gSW5maW5pdHkgKSA/IHRydWUgOiAoIHJlbSA+PSBkZWx0YSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVUktZmFjaW5nIGdhdGU6IGFsZXJ0IHdoZW4gZXhjZWVkZWQuIFJldHVybnMgYm9vbGVhbiBhbGxvd2VkL2Jsb2NrZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFVzYWdlIGtleSBvZiBhIHBhbGV0dGUgaXRlbS5cclxuXHRcdCAqIEBwYXJhbSB7e2xhYmVsPzogc3RyaW5nLCBkZWx0YT86IG51bWJlcn19IFtvcHRzPXt9XSAtIE9wdGlvbmFsIFVJIGluZm8uXHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbGxvd2VkLCBmYWxzZSBpZiBibG9ja2VkLlxyXG5cdFx0ICovXHJcblx0XHRnYXRlX29yX2FsZXJ0KCBrZXksIHsgbGFiZWwgPSBrZXksIGRlbHRhID0gMSB9ID0ge30gKSB7XHJcblx0XHRcdGlmICggdGhpcy5jYW5fYWRkKCBrZXksIGRlbHRhICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgbGltaXQgPSB0aGlzLmxpbWl0X2Zvcl9rZXkoIGtleSApO1xyXG5cdFx0XHRhbGVydCggYE9ubHkgJHtsaW1pdH0gaW5zdGFuY2Uke2xpbWl0ID4gMSA/ICdzJyA6ICcnfSBvZiBcIiR7bGFiZWx9XCIgYWxsb3dlZC5gICk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJhY2t3YXJkLWNvbXBhdGlibGUgYWxpYXMgdXNlZCBlbHNld2hlcmUgaW4gdGhlIGNvZGViYXNlLiAgLSBDaGVjayB3aGV0aGVyIGFub3RoZXIgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW5cclxuXHRcdCAqIHVzYWdlIGtleSBjYW4gYmUgYWRkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFVzYWdlIGtleSBvZiBhIHBhbGV0dGUgaXRlbS5cclxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGFkZGluZyBvbmUgbW9yZSBpcyBhbGxvd2VkLlxyXG5cdFx0ICovXHJcblx0XHRpc191c2FnZV9vaygga2V5ICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jYW5fYWRkKCBrZXksIDEgKTtcclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RhbnQgZXZlbnQgbmFtZXMgZm9yIHRoZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdENvcmUuV1BCQ19CRkJfRXZlbnRzID0gT2JqZWN0LmZyZWV6ZSh7XHJcblx0XHRTRUxFQ1QgICAgICAgICAgICA6ICd3cGJjOmJmYjpzZWxlY3QnLFxyXG5cdFx0Q0xFQVJfU0VMRUNUSU9OICAgOiAnd3BiYzpiZmI6Y2xlYXItc2VsZWN0aW9uJyxcclxuXHRcdEZJRUxEX0FERCAgICAgICAgIDogJ3dwYmM6YmZiOmZpZWxkOmFkZCcsXHJcblx0XHRGSUVMRF9SRU1PVkUgICAgICA6ICd3cGJjOmJmYjpmaWVsZDpyZW1vdmUnLFxyXG5cdFx0U1RSVUNUVVJFX0NIQU5HRSAgOiAnd3BiYzpiZmI6c3RydWN0dXJlOmNoYW5nZScsXHJcblx0XHRTVFJVQ1RVUkVfTE9BREVEICA6ICd3cGJjOmJmYjpzdHJ1Y3R1cmU6bG9hZGVkJ1xyXG5cdH0pO1xyXG5cclxuXHQvKipcclxuXHQgKiBMaWdodHdlaWdodCBldmVudCBidXMgdGhhdCBlbWl0cyB0byBib3RoIHRoZSBwYWdlcyBjb250YWluZXIgYW5kIGRvY3VtZW50LlxyXG5cdCAqL1xyXG5cdENvcmUuV1BCQ19CRkJfRXZlbnRCdXMgPSAgY2xhc3Mge1xyXG5cdFx0LyoqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzY29wZV9lbCAtIEVsZW1lbnQgdG8gZGlzcGF0Y2ggYnViYmxlZCBldmVudHMgZnJvbS5cclxuXHRcdCAqL1xyXG5cdFx0Y29uc3RydWN0b3IoIHNjb3BlX2VsICkge1xyXG5cdFx0XHR0aGlzLnNjb3BlX2VsID0gc2NvcGVfZWw7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbWl0IGEgRE9NIEN1c3RvbUV2ZW50IHdpdGggcGF5bG9hZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEV2ZW50IHR5cGUgKHVzZSBDb3JlLldQQkNfQkZCX0V2ZW50cy4gd2hlbiBwb3NzaWJsZSkuXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gW2RldGFpbD17fV0gLSBBcmJpdHJhcnkgc2VyaWFsaXphYmxlIHBheWxvYWQuXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0ZW1pdCggdHlwZSwgZGV0YWlsID0ge30gKSB7XHJcblx0XHRcdGlmICggISB0aGlzLnNjb3BlX2VsICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnNjb3BlX2VsLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggdHlwZSwgeyBkZXRhaWw6IHsgLi4uZGV0YWlsIH0sIGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb24gZG9jdW1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBFdmVudCB0eXBlLlxyXG5cdFx0ICogQHBhcmFtIHsoZXY6Q3VzdG9tRXZlbnQpPT52b2lkfSBoYW5kbGVyIC0gSGFuZGxlciBmdW5jdGlvbi5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRvbiggdHlwZSwgaGFuZGxlciApIHtcclxuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlciApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVW5zdWJzY3JpYmUgZnJvbSBhbiBldmVudCBvbiBkb2N1bWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEV2ZW50IHR5cGUuXHJcblx0XHQgKiBAcGFyYW0geyhldjpDdXN0b21FdmVudCk9PnZvaWR9IGhhbmRsZXIgLSBIYW5kbGVyIGZ1bmN0aW9uLlxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdG9mZiggdHlwZSwgaGFuZGxlciApIHtcclxuXHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlciApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNvcnRhYmxlSlMgbWFuYWdlcjogc2luZ2xlIHBvaW50IGZvciBjb25zaXN0ZW50IERuRCBjb25maWcuXHJcblx0ICovXHJcblx0Q29yZS5XUEJDX0JGQl9Tb3J0YWJsZU1hbmFnZXIgPSBjbGFzcyAge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBhY3RpdmUgYnVpbGRlciBpbnN0YW5jZS5cclxuXHRcdCAqIEBwYXJhbSB7eyBncm91cE5hbWU/OiBzdHJpbmcsIGFuaW1hdGlvbj86IG51bWJlciwgZ2hvc3RDbGFzcz86IHN0cmluZywgY2hvc2VuQ2xhc3M/OiBzdHJpbmcsIGRyYWdDbGFzcz86XHJcblx0XHQgKiAgICAgc3RyaW5nIH19IFtvcHRzPXt9XSAtIFZpc3VhbC9iZWhhdmlvciBvcHRpb25zLlxyXG5cdFx0ICovXHJcblx0XHRjb25zdHJ1Y3RvciggYnVpbGRlciwgb3B0cyA9IHt9ICkge1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIgPSBidWlsZGVyO1xyXG5cdFx0XHRjb25zdCBnaWQgPSB0aGlzLmJ1aWxkZXI/Lmluc3RhbmNlX2lkIHx8IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDggKTtcclxuXHRcdFx0dGhpcy5vcHRzID0ge1xyXG5cdFx0XHRcdC8vIGdyb3VwTmFtZSAgOiAnZm9ybScsXHJcblx0XHRcdFx0Z3JvdXBOYW1lOiBgZm9ybS0ke2dpZH1gLFxyXG5cdFx0XHRcdGFuaW1hdGlvbiAgOiAxNTAsXHJcblx0XHRcdFx0Z2hvc3RDbGFzcyA6ICd3cGJjX2JmYl9fZHJhZy1naG9zdCcsXHJcblx0XHRcdFx0Y2hvc2VuQ2xhc3M6ICd3cGJjX2JmYl9faGlnaGxpZ2h0JyxcclxuXHRcdFx0XHRkcmFnQ2xhc3MgIDogJ3dwYmNfYmZiX19kcmFnLWFjdGl2ZScsXHJcblx0XHRcdFx0Li4ub3B0c1xyXG5cdFx0XHR9O1xyXG5cdFx0XHQvKiogQHR5cGUge1NldDxIVE1MRWxlbWVudD59ICovXHJcblx0XHRcdHRoaXMuX2NvbnRhaW5lcnMgPSBuZXcgU2V0KCk7XHJcblxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogR3VhcmQgYWdhaW5zdCBsb3N0IG1vdXNldXAgLyBwb2ludGVydXAgZXZlbnRzLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdFx0ICovXHJcblx0XHRcdHRoaXMuX2RyYWdfZmFpbF9zYWZlX2JvdW5kID0gZmFsc2U7XHJcblxyXG5cdFx0XHR0aGlzLl9iaW5kX2RyYWdfZmFpbF9zYWZlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDbGVhbnVwIGRyYWcgVUkgc3RhdGUuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBpcyBhIGRlZmVuc2l2ZSBjbGVhbnVwIGZvciBjYXNlcyB3aGVuIENocm9tZSBvciBhIGJyb3dzZXIgZXh0ZW5zaW9uXHJcblx0XHQgKiBsb3NlcyB0aGUgZmluYWwgbW91c2V1cCAvIHBvaW50ZXJ1cCBldmVudCBkdXJpbmcgZmFsbGJhY2sgZHJhZ2dpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdF9jbGVhbnVwX2RyYWdfdWkoKSB7XHJcblx0XHRcdHRoaXMuX2RyYWdTdGF0ZSA9IG51bGw7XHJcblx0XHRcdHRoaXMuX3RvZ2dsZV9kbmRfcm9vdF9mbGFncyggZmFsc2UgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyPy5fcmVtb3ZlX2RyYWdnaW5nX2NsYXNzPy4oKTtcclxuXHJcblx0XHRcdC8vIFJlbW92ZSBvbmx5IGZhbGxiYWNrIG1pcnJvcnMuIERvIG5vdCB0b3VjaCByZWFsIGRyYWdnZWQgZWxlbWVudHMuXHJcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICcuc29ydGFibGUtZmFsbGJhY2tbZGF0YS1kcmFnLXJvbGVdLCAud3BiY19iZmJfX3NpbXBsZV9saXN0X2ZhbGxiYWNrJyApXHJcblx0XHRcdFx0XHQuZm9yRWFjaCggKGVsKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdFx0XHRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCaW5kIGdsb2JhbCBmYWlsLXNhZmUgbGlzdGVuZXJzIGZvciBkcmFnIGNsZWFudXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdF9iaW5kX2RyYWdfZmFpbF9zYWZlKCkge1xyXG5cdFx0XHRpZiAoIHRoaXMuX2RyYWdfZmFpbF9zYWZlX2JvdW5kICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fZHJhZ19mYWlsX3NhZmVfYm91bmQgPSB0cnVlO1xyXG5cclxuXHRcdFx0Y29uc3QgZmluaXNoX2RyYWcgPSAoKSA9PiB7XHJcblx0XHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5fY2xlYW51cF9kcmFnX3VpKCk7XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0WyAnbW91c2V1cCcsICdwb2ludGVydXAnLCAndG91Y2hlbmQnLCAnZHJhZ2VuZCcgXS5mb3JFYWNoKCAoZXZ0X25hbWUpID0+IHtcclxuXHRcdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBldnRfbmFtZSwgZmluaXNoX2RyYWcsIHRydWUgKTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdibHVyJywgZmluaXNoX2RyYWcsIHRydWUgKTtcclxuXHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXHJcblx0XHRcdFx0J3Zpc2liaWxpdHljaGFuZ2UnLFxyXG5cdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdGlmICggZG9jdW1lbnQuaGlkZGVuICkge1xyXG5cdFx0XHRcdFx0XHRmaW5pc2hfZHJhZygpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0dHJ1ZVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGFnIHRoZSBkcmFnIG1pcnJvciAoZWxlbWVudCB1bmRlciBjdXJzb3IpIHdpdGggcm9sZTogJ3BhbGV0dGUnIHwgJ2NhbnZhcycuXHJcblx0XHQgKiBXb3JrcyB3aXRoIFNvcnRhYmxlJ3MgZmFsbGJhY2sgbWlycm9yICguc29ydGFibGUtZmFsbGJhY2sgLyAuc29ydGFibGUtZHJhZykgYW5kIHdpdGggeW91ciBkcmFnQ2xhc3NcclxuXHRcdCAqICgud3BiY19iZmJfX2RyYWctYWN0aXZlKS5cclxuXHRcdCAqL1xyXG5cdFx0X3RhZ19kcmFnX21pcnJvciggZXZ0ICkge1xyXG5cdFx0XHRjb25zdCBmcm9tUGFsZXR0ZSA9IHRoaXMuYnVpbGRlcj8ucGFsZXR0ZV91bHM/LmluY2x1ZGVzPy4oIGV2dC5mcm9tICk7XHJcblx0XHRcdGNvbnN0IHJvbGUgICAgICAgID0gZnJvbVBhbGV0dGUgPyAncGFsZXR0ZScgOiAnY2FudmFzJztcclxuXHRcdFx0Ly8gV2FpdCBhIHRpY2sgc28gdGhlIG1pcnJvciBleGlzdHMuICAtIFRoZSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCkgbWV0aG9kIHRlbGxzIHRoZSBicm93c2VyIHlvdSB3aXNoIHRvIHBlcmZvcm0gYW4gYW5pbWF0aW9uLlxyXG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcclxuXHRcdFx0XHRjb25zdCBtaXJyb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnLnNvcnRhYmxlLWZhbGxiYWNrLCAuc29ydGFibGUtZHJhZywgLicgKyB0aGlzLm9wdHMuZHJhZ0NsYXNzICk7XHJcblx0XHRcdFx0aWYgKCBtaXJyb3IgKSB7XHJcblx0XHRcdFx0XHRtaXJyb3Iuc2V0QXR0cmlidXRlKCAnZGF0YS1kcmFnLXJvbGUnLCByb2xlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0X3RvZ2dsZV9kbmRfcm9vdF9mbGFncyggYWN0aXZlLCBmcm9tX3BhbGV0dGUgPSBmYWxzZSApIHtcclxuXHJcblx0XHRcdC8vIHNldCB0byByb290IGVsZW1lbnQgb2YgYW4gSFRNTCBkb2N1bWVudCwgd2hpY2ggaXMgdGhlIDxodG1sPi5cclxuXHRcdFx0Y29uc3Qgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuXHRcdFx0aWYgKCBhY3RpdmUgKSB7XHJcblx0XHRcdFx0cm9vdC5jbGFzc0xpc3QuYWRkKCAnd3BiY19iZmJfX2RuZC1hY3RpdmUnICk7XHJcblx0XHRcdFx0aWYgKCBmcm9tX3BhbGV0dGUgKSB7XHJcblx0XHRcdFx0XHRyb290LmNsYXNzTGlzdC5hZGQoICd3cGJjX2JmYl9fZHJhZy1mcm9tLXBhbGV0dGUnICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJvb3QuY2xhc3NMaXN0LnJlbW92ZSggJ3dwYmNfYmZiX19kbmQtYWN0aXZlJywgJ3dwYmNfYmZiX19kcmFnLWZyb20tcGFsZXR0ZScgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuc3VyZSBhIHNpbXBsZSB2ZXJ0aWNhbCBzb3J0YWJsZSBsaXN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgY29uZmlndXJhdGlvbiBpcyBpbnRlbmRlZCBmb3IgaW5zcGVjdG9yL3NpZGViYXIgbGlzdHMgc3VjaCBhczpcclxuXHRcdCAqIC0gZHJvcGRvd24gY2hvaWNlc1xyXG5cdFx0ICogLSByYWRpbyBvcHRpb25zXHJcblx0XHQgKiAtIGNoZWNrYm94IG9wdGlvbnNcclxuXHRcdCAqXHJcblx0XHQgKiBJdCBpcyBpbnRlbnRpb25hbGx5IG11Y2ggc2ltcGxlciB0aGFuIHRoZSBjYW52YXMgRG5EIGNvbmZpZyBhbmQgZG9lcyBub3RcclxuXHRcdCAqIHVzZSB0aGUgY29sdW1uIGVkZ2UtZmVuY2UgLyBzdGlja3ktdGFyZ2V0IGxvZ2ljLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIFNvcnRhYmxlIGxpc3QgY29udGFpbmVyLlxyXG5cdFx0ICogQHBhcmFtIHt7IGhhbmRsZV9zZWxlY3Rvcj86IHN0cmluZywgZHJhZ2dhYmxlX3NlbGVjdG9yPzogc3RyaW5nLCBvblVwZGF0ZT86IEZ1bmN0aW9uIH19IFtoYW5kbGVycz17fV0gLVxyXG5cdFx0ICogICAgIE9wdGlvbmFsIGhhbmRsZXJzL3NlbGVjdG9ycy5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRlbnN1cmVfc2ltcGxlX2xpc3QoIGNvbnRhaW5lciwgaGFuZGxlcnMgPSB7fSApIHtcclxuXHRcdFx0aWYgKCAhIGNvbnRhaW5lciB8fCB0eXBlb2YgU29ydGFibGUgPT09ICd1bmRlZmluZWQnICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIFNvcnRhYmxlLmdldD8uKCBjb250YWluZXIgKSApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNvbW1vbiA9IHtcclxuXHRcdFx0XHRhbmltYXRpb24gICAgICAgIDogdGhpcy5vcHRzLmFuaW1hdGlvbixcclxuXHRcdFx0XHRnaG9zdENsYXNzICAgICAgIDogdGhpcy5vcHRzLmdob3N0Q2xhc3MsXHJcblx0XHRcdFx0Y2hvc2VuQ2xhc3MgICAgICA6IHRoaXMub3B0cy5jaG9zZW5DbGFzcyxcclxuXHRcdFx0XHRkcmFnQ2xhc3MgICAgICAgIDogdGhpcy5vcHRzLmRyYWdDbGFzcyxcclxuXHRcdFx0XHRmb3JjZUZhbGxiYWNrICAgIDogdHJ1ZSxcclxuXHRcdFx0XHQvLyBGb3IgYSBzaW5nbGUgc2Nyb2xsYWJsZSBzaWRlYmFyIGxpc3QgdGhpcyBpcyB1c3VhbGx5IG1vcmUgc3RhYmxlLlxyXG5cdFx0XHRcdGZhbGxiYWNrT25Cb2R5ICAgOiBmYWxzZSxcclxuXHRcdFx0XHRmYWxsYmFja1RvbGVyYW5jZTogOCxcclxuXHRcdFx0XHRyZW1vdmVDbG9uZU9uSGlkZTogdHJ1ZSxcclxuXHRcdFx0XHRvblN0YXJ0ICAgICAgICAgIDogKCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZGVyPy5fYWRkX2RyYWdnaW5nX2NsYXNzPy4oKTtcclxuXHRcdFx0XHRcdHRoaXMuX3RvZ2dsZV9kbmRfcm9vdF9mbGFncyggdHJ1ZSwgZmFsc2UgKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG9uRW5kICAgICAgICAgICAgOiAoKSA9PiB7XHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuYnVpbGRlcj8uX3JlbW92ZV9kcmFnZ2luZ19jbGFzcz8uKCk7XHJcblx0XHRcdFx0XHR9LCA1MCApO1xyXG5cdFx0XHRcdFx0dGhpcy5fdG9nZ2xlX2RuZF9yb290X2ZsYWdzKCBmYWxzZSApO1xyXG5cdFx0XHRcdFx0dGhpcy5fZHJhZ1N0YXRlID0gbnVsbDtcclxuXHRcdFx0XHRcdHRoaXMuX2NsZWFudXBfZHJhZ191aSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdFNvcnRhYmxlLmNyZWF0ZShcclxuXHRcdFx0XHRjb250YWluZXIsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0Li4uY29tbW9uLFxyXG5cdFx0XHRcdFx0Z3JvdXAgICAgICAgICAgICAgICAgICA6IHsgbmFtZTogdGhpcy5vcHRzLmdyb3VwTmFtZSwgcHVsbDogZmFsc2UsIHB1dDogZmFsc2UgfSxcclxuXHRcdFx0XHRcdHNvcnQgICAgICAgICAgICAgICAgICAgOiB0cnVlLFxyXG5cdFx0XHRcdFx0ZGlyZWN0aW9uICAgICAgICAgICAgICA6ICd2ZXJ0aWNhbCcsXHJcblx0XHRcdFx0XHRoYW5kbGUgICAgICAgICAgICAgICAgIDogaGFuZGxlcnMuaGFuZGxlX3NlbGVjdG9yIHx8ICcud3BiY19iZmJfX2RyYWctaGFuZGxlJyxcclxuXHRcdFx0XHRcdGRyYWdnYWJsZSAgICAgICAgICAgICAgOiBoYW5kbGVycy5kcmFnZ2FibGVfc2VsZWN0b3IgfHwgJy53cGJjX2JmYl9fc29ydGFibGUtcm93JyxcclxuXHRcdFx0XHRcdGZhbGxiYWNrQ2xhc3MgICAgICAgICAgOiAnd3BiY19iZmJfX3NpbXBsZV9saXN0X2ZhbGxiYWNrJyxcclxuXHRcdFx0XHRcdGZpbHRlciAgICAgICAgICAgICAgICAgOiBbXHJcblx0XHRcdFx0XHRcdCdpbnB1dCcsXHJcblx0XHRcdFx0XHRcdCd0ZXh0YXJlYScsXHJcblx0XHRcdFx0XHRcdCdzZWxlY3QnLFxyXG5cdFx0XHRcdFx0XHQnYnV0dG9uJyxcclxuXHRcdFx0XHRcdFx0J2EnLFxyXG5cdFx0XHRcdFx0XHQnLndwYmNfYmZiX19uby1kcmFnLXpvbmUnLFxyXG5cdFx0XHRcdFx0XHQnLndwYmNfYmZiX19uby1kcmFnLXpvbmUgKidcclxuXHRcdFx0XHRcdF0uam9pbiggJywnICksXHJcblx0XHRcdFx0XHRwcmV2ZW50T25GaWx0ZXIgICAgICAgIDogZmFsc2UsXHJcblx0XHRcdFx0XHRpbnZlcnRTd2FwICAgICAgICAgICAgIDogZmFsc2UsXHJcblx0XHRcdFx0XHRzd2FwVGhyZXNob2xkICAgICAgICAgIDogMC4zMCxcclxuXHRcdFx0XHRcdGludmVydGVkU3dhcFRocmVzaG9sZCAgOiAwLjYwLFxyXG5cdFx0XHRcdFx0ZW1wdHlJbnNlcnRUaHJlc2hvbGQgICA6IDgsXHJcblx0XHRcdFx0XHRkcmFnb3ZlckJ1YmJsZSAgICAgICAgIDogZmFsc2UsXHJcblx0XHRcdFx0XHRzY3JvbGwgICAgICAgICAgICAgICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdHNjcm9sbFNlbnNpdGl2aXR5ICAgICAgOiA2MCxcclxuXHRcdFx0XHRcdHNjcm9sbFNwZWVkICAgICAgICAgICAgOiAxNCxcclxuXHRcdFx0XHRcdG9uVXBkYXRlICAgICAgICAgICAgICAgOiBoYW5kbGVycy5vblVwZGF0ZSB8fCBmdW5jdGlvbiAoKSB7fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdHRoaXMuX2NvbnRhaW5lcnMuYWRkKCBjb250YWluZXIgKTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbnN1cmUgU29ydGFibGUgaXMgYXR0YWNoZWQgdG8gYSBjb250YWluZXIgd2l0aCByb2xlICdwYWxldHRlJyBvciAnY2FudmFzJy5cclxuXHRcdCAqXHJcblx0XHQgKiAgLS0gSGFuZGxlIHNlbGVjdG9yczogaGFuZGxlOiAgJy5zZWN0aW9uLWRyYWctaGFuZGxlLCAud3BiY19iZmJfX2RyYWctaGFuZGxlLCAud3BiY19iZmJfX2RyYWctYW55d2hlcmUsXHJcblx0XHQgKiBbZGF0YS1kcmFnZ2FibGU9XCJ0cnVlXCJdJ1xyXG5cdFx0ICogIC0tIERyYWdnYWJsZSBnYXRlOiBkcmFnZ2FibGU6ICcud3BiY19iZmJfX2ZpZWxkOm5vdChbZGF0YS1kcmFnZ2FibGU9XCJmYWxzZVwiXSksIC53cGJjX2JmYl9fc2VjdGlvbidcclxuXHRcdCAqICAtLSBGaWx0ZXIgKG92ZXJsYXktc2FmZSk6ICAgICBpZ25vcmUgZXZlcnl0aGluZyBpbiBvdmVybGF5IGV4Y2VwdCB0aGUgaGFuZGxlIC1cclxuXHRcdCAqICcud3BiY19iZmJfX292ZXJsYXktY29udHJvbHNcclxuXHRcdCAqICo6bm90KC53cGJjX2JmYl9fZHJhZy1oYW5kbGUpOm5vdCguc2VjdGlvbi1kcmFnLWhhbmRsZSk6bm90KC53cGJjX2ljbl9kcmFnX2luZGljYXRvciknXHJcblx0XHQgKiAgLS0gTm8tZHJhZyB3cmFwcGVyOiAgICAgICAgICAgdXNlIC53cGJjX2JmYl9fbm8tZHJhZy16b25lIGluc2lkZSByZW5kZXJlcnMgZm9yIGlucHV0cy93aWRnZXRzLlxyXG5cdFx0ICogIC0tIEZvY3VzIGd1YXJkIChvcHRpb25hbCk6ICAgIGZsaXAgW2RhdGEtZHJhZ2dhYmxlXSBvbiBmb2N1c2luL2ZvY3Vzb3V0IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBkcmFncyB3aGlsZVxyXG5cdFx0ICogdHlwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIFRoZSBlbGVtZW50IHRvIGVuaGFuY2Ugd2l0aCBTb3J0YWJsZS5cclxuXHRcdCAqIEBwYXJhbSB7J3BhbGV0dGUnfCdjYW52YXMnfSByb2xlIC0gQmVoYXZpb3IgcHJvZmlsZSB0byBhcHBseS5cclxuXHRcdCAqIEBwYXJhbSB7eyBvbkFkZD86IEZ1bmN0aW9uIH19IFtoYW5kbGVycz17fV0gLSBPcHRpb25hbCBoYW5kbGVycy5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRlbnN1cmUoIGNvbnRhaW5lciwgcm9sZSwgaGFuZGxlcnMgPSB7fSApIHtcclxuXHRcdFx0aWYgKCAhIGNvbnRhaW5lciB8fCB0eXBlb2YgU29ydGFibGUgPT09ICd1bmRlZmluZWQnICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIFNvcnRhYmxlLmdldD8uKCBjb250YWluZXIgKSApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHNvcnRhYmxlX2tpbmQgPSBoYW5kbGVycy5zb3J0YWJsZV9raW5kIHx8ICcnO1xyXG5cclxuXHRcdFx0aWYgKCBzb3J0YWJsZV9raW5kID09PSAnc2ltcGxlX2xpc3QnICkge1xyXG5cdFx0XHRcdHRoaXMuZW5zdXJlX3NpbXBsZV9saXN0KCBjb250YWluZXIsIGhhbmRsZXJzICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjb21tb24gPSB7XHJcblx0XHRcdFx0YW5pbWF0aW9uICA6IHRoaXMub3B0cy5hbmltYXRpb24sXHJcblx0XHRcdFx0Z2hvc3RDbGFzcyA6IHRoaXMub3B0cy5naG9zdENsYXNzLFxyXG5cdFx0XHRcdGNob3NlbkNsYXNzOiB0aGlzLm9wdHMuY2hvc2VuQ2xhc3MsXHJcblx0XHRcdFx0ZHJhZ0NsYXNzICA6IHRoaXMub3B0cy5kcmFnQ2xhc3MsXHJcblx0XHRcdFx0Ly8gPT0gRWxlbWVudCB1bmRlciB0aGUgY3Vyc29yICA9PSBFbnN1cmUgd2UgZHJhZyBhIHJlYWwgRE9NIG1pcnJvciB5b3UgY2FuIHN0eWxlIHZpYSBDU1MgKGNyb3NzLWJyb3dzZXIpLlxyXG5cdFx0XHRcdGZvcmNlRmFsbGJhY2sgICAgOiB0cnVlLFxyXG5cdFx0XHRcdGZhbGxiYWNrT25Cb2R5ICAgOiB0cnVlLFxyXG5cdFx0XHRcdGZhbGxiYWNrVG9sZXJhbmNlOiA4LFxyXG5cdFx0XHRcdHJlbW92ZUNsb25lT25IaWRlOiB0cnVlLFxyXG5cdFx0XHRcdC8vIEFkZCBib2R5L2h0bWwgZmxhZ3Mgc28geW91IGNhbiBzdHlsZSBkaWZmZXJlbnRseSB3aGVuIGRyYWdnaW5nIGZyb20gcGFsZXR0ZS5cclxuXHRcdFx0XHRvblN0YXJ0OiAoZXZ0KSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmJ1aWxkZXI/Ll9hZGRfZHJhZ2dpbmdfY2xhc3M/LigpO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGZyb21QYWxldHRlID0gdGhpcy5idWlsZGVyPy5wYWxldHRlX3Vscz8uaW5jbHVkZXM/LiggZXZ0LmZyb20gKTtcclxuXHRcdFx0XHRcdHRoaXMuX3RvZ2dsZV9kbmRfcm9vdF9mbGFncyggdHJ1ZSwgZnJvbVBhbGV0dGUgKTsgIC8vIHNldCB0byByb290IEhUTUwgZG9jdW1lbnQ6IGh0bWwud3BiY19iZmJfX2RuZC1hY3RpdmUud3BiY19iZmJfX2RyYWctZnJvbS1wYWxldHRlIC5cclxuXHJcblx0XHRcdFx0XHR0aGlzLl90YWdfZHJhZ19taXJyb3IoIGV2dCApOyAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgJ2RhdGEtZHJhZy1yb2xlJyBhdHRyaWJ1dGUgdG8gIGVsZW1lbnQgdW5kZXIgY3Vyc29yLlxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25FbmQgIDogKCkgPT4ge1xyXG5cdFx0XHRcdFx0c2V0VGltZW91dCggKCkgPT4geyB0aGlzLmJ1aWxkZXIuX3JlbW92ZV9kcmFnZ2luZ19jbGFzcygpOyB9LCA1MCApO1xyXG5cdFx0XHRcdFx0dGhpcy5fdG9nZ2xlX2RuZF9yb290X2ZsYWdzKCBmYWxzZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGlmICggcm9sZSA9PT0gJ3BhbGV0dGUnICkge1xyXG5cdFx0XHRcdFNvcnRhYmxlLmNyZWF0ZSggY29udGFpbmVyLCB7XHJcblx0XHRcdFx0XHQuLi5jb21tb24sXHJcblx0XHRcdFx0XHRncm91cCAgIDogeyBuYW1lOiB0aGlzLm9wdHMuZ3JvdXBOYW1lLCBwdWxsOiAnY2xvbmUnLCBwdXQ6IGZhbHNlIH0sXHJcblx0XHRcdFx0XHRzb3J0ICAgIDogZmFsc2VcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0dGhpcy5fY29udGFpbmVycy5hZGQoIGNvbnRhaW5lciApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gcm9sZSA9PT0gJ2NhbnZhcycuXHJcblx0XHRcdFNvcnRhYmxlLmNyZWF0ZSggY29udGFpbmVyLCB7XHJcblx0XHRcdFx0Li4uY29tbW9uLFxyXG5cdFx0XHRcdGdyb3VwICAgIDoge1xyXG5cdFx0XHRcdFx0bmFtZTogdGhpcy5vcHRzLmdyb3VwTmFtZSxcclxuXHRcdFx0XHRcdHB1bGw6IHRydWUsXHJcblx0XHRcdFx0XHRwdXQgOiAodG8sIGZyb20sIGRyYWdnZWRFbCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZHJhZ2dlZEVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19maWVsZCcgKSB8fFxyXG5cdFx0XHRcdFx0XHRcdCAgIGRyYWdnZWRFbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8vIC0tLS0tLS0tLS0gRG5EIEhhbmRsZXJzIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIC8vIEdyYWIgYW55d2hlcmUgb24gZmllbGRzIHRoYXQgb3B0LWluIHdpdGggdGhlIGNsYXNzIG9yIGF0dHJpYnV0ZS4gIC0gU2VjdGlvbnMgc3RpbGwgcmVxdWlyZSB0aGVpciBkZWRpY2F0ZWQgaGFuZGxlLlxyXG5cdFx0XHRcdGhhbmRsZSAgIDogJy5zZWN0aW9uLWRyYWctaGFuZGxlLCAud3BiY19iZmJfX2RyYWctaGFuZGxlLCAud3BiY19iZmJfX2RyYWctYW55d2hlcmUsIFtkYXRhLWRyYWdnYWJsZT1cInRydWVcIl0nLFxyXG5cdFx0XHRcdGRyYWdnYWJsZTogJy53cGJjX2JmYl9fZmllbGQ6bm90KFtkYXRhLWRyYWdnYWJsZT1cImZhbHNlXCJdKSwgLndwYmNfYmZiX19zZWN0aW9uJywgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItZmllbGQgb3B0LW91dCB3aXRoIFtkYXRhLWRyYWdnYWJsZT1cImZhbHNlXCJdIChlLmcuLCB3aGlsZSBlZGl0aW5nKS5cclxuXHRcdFx0XHQvLyAtLS0tLS0tLS0tIEZpbHRlcnMgLSBObyBEbkQgLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAvLyBEZWNsYXJhdGl2ZSDigJxuby1kcmFnIHpvbmVz4oCdOiBhbnl0aGluZyBpbnNpZGUgdGhlc2Ugd3JhcHBlcnMgd29u4oCZdCBzdGFydCBhIGRyYWcuXHJcblx0XHRcdFx0ZmlsdGVyOiBbXHJcblx0XHRcdFx0XHQnLndwYmNfYmZiX19uby1kcmFnLXpvbmUnLFxyXG5cdFx0XHRcdFx0Jy53cGJjX2JmYl9fbm8tZHJhZy16b25lIConLFxyXG5cdFx0XHRcdFx0Jy53cGJjX2JmYl9fY29sdW1uLXJlc2l6ZXInLCAgLy8gSWdub3JlIHRoZSByZXNpemVyIHJhaWxzIGR1cmluZyBEbkQgKHByZXZlbnRzIGVkZ2Ug4oCcc25hcOKAnSkuXHJcblx0XHRcdFx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgb3ZlcmxheSB0b29sYmFyLCBibG9jayBldmVyeXRoaW5nIEVYQ0VQVCB0aGUgZHJhZyBoYW5kbGUgKGFuZCBpdHMgaWNvbikuXHJcblx0XHRcdFx0XHQnLndwYmNfYmZiX19vdmVybGF5LWNvbnRyb2xzICo6bm90KC53cGJjX2JmYl9fZHJhZy1oYW5kbGUpOm5vdCguc2VjdGlvbi1kcmFnLWhhbmRsZSk6bm90KC53cGJjX2ljbl9kcmFnX2luZGljYXRvciknXHJcblx0XHRcdFx0XS5qb2luKCAnLCcgKSxcclxuXHRcdFx0XHRwcmV2ZW50T25GaWx0ZXIgIDogZmFsc2UsXHJcblx0XHRcdFx0XHQvLyAtLS0tLS0tLS0tIGFudGktaml0dGVyIHR1bmluZyAtLS0tLS0tLS0tXHJcblx0XHRcdFx0ZGlyZWN0aW9uICAgICAgICAgICAgOiAndmVydGljYWwnLCAgICAgICAgICAgLy8gY29sdW1ucyBhcmUgdmVydGljYWwgbGlzdHMuXHJcblx0XHRcdFx0aW52ZXJ0U3dhcCAgICAgICAgICAgOiB0cnVlLCAgICAgICAgICAgICAgICAgLy8gdXNlIHN3YXAgb24gaW52ZXJ0ZWQgb3ZlcmxhcC5cclxuXHRcdFx0XHRzd2FwVGhyZXNob2xkICAgICAgICA6IDAuNjUsICAgICAgICAgICAgICAgICAvLyBiZSBsZXNzIGVhZ2VyIHRvIHN3YXAuXHJcblx0XHRcdFx0aW52ZXJ0ZWRTd2FwVGhyZXNob2xkOiAwLjg1LCAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBkZWVwZXIgb3ZlcmxhcCB3aGVuIGludmVydGVkLlxyXG5cdFx0XHRcdGVtcHR5SW5zZXJ0VGhyZXNob2xkIDogMjQsICAgICAgICAgICAgICAgICAgIC8vIGRvbuKAmXQganVtcCBpbnRvIGVtcHR5IGNvbnRhaW5lcnMgdG9vIGVhcmx5LlxyXG5cdFx0XHRcdGRyYWdvdmVyQnViYmxlICAgICAgIDogZmFsc2UsICAgICAgICAgICAgICAgIC8vIGtlZXAgZHJhZ292ZXIgbG9jYWwuXHJcblx0XHRcdFx0c2Nyb2xsICAgICAgICAgICAgICAgOiB0cnVlLFxyXG5cdFx0XHRcdHNjcm9sbFNlbnNpdGl2aXR5ICAgIDogNDAsXHJcblx0XHRcdFx0c2Nyb2xsU3BlZWQgICAgICAgICAgOiAxMCxcclxuXHRcdFx0XHQvKipcclxuXHRcdFx0XHQgKiBFbnRlci9sZWF2ZSBoeXN0ZXJlc2lzIGZvciBjcm9zcy1jb2x1bW4gbW92ZXMuICAgIE9ubHkgYWxsb3cgZHJvcHBpbmcgaW50byBgdG9gIHdoZW4gdGhlIHBvaW50ZXIgaXNcclxuXHRcdFx0XHQgKiB3ZWxsIGluc2lkZSBpdC5cclxuXHRcdFx0XHQgKi9cclxuXHRcdFx0XHRvbk1vdmU6IChldnQsIG9yaWdpbmFsRXZlbnQpID0+IHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IHRvLCBmcm9tIH0gPSBldnQ7XHJcblx0XHRcdFx0XHRpZiAoICEgdG8gfHwgISBmcm9tICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbl9wcmV2aWV3X2NhbnZhcyA9ICEhIHRvLmNsb3Nlc3QoICcud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3JyApO1xyXG5cdFx0XHRcdFx0aWYgKCAhIGluX3ByZXZpZXdfY2FudmFzICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBPbmx5IGdhdGUgY29sdW1ucyAobm90IHBhZ2UgY29udGFpbmVycyksIGFuZCBvbmx5IGZvciBjcm9zcy1jb2x1bW4gbW92ZXMgaW4gdGhlIHNhbWUgcm93XHJcblx0XHRcdFx0XHRjb25zdCBpc0NvbHVtbiA9IHRvLmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fY29sdW1uJyApO1xyXG5cdFx0XHRcdFx0aWYgKCAhaXNDb2x1bW4gKSByZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBmcm9tUm93ID0gZnJvbS5jbG9zZXN0KCAnLndwYmNfYmZiX19yb3cnICk7XHJcblx0XHRcdFx0XHRjb25zdCB0b1JvdyAgID0gdG8uY2xvc2VzdCggJy53cGJjX2JmYl9fcm93JyApO1xyXG5cdFx0XHRcdFx0aWYgKCBmcm9tUm93ICYmIHRvUm93ICYmIGZyb21Sb3cgIT09IHRvUm93ICkgcmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcmVjdCA9IHRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZXZ0WCA9IChvcmlnaW5hbEV2ZW50LnRvdWNoZXM/LlswXT8uY2xpZW50WCkgPz8gb3JpZ2luYWxFdmVudC5jbGllbnRYO1xyXG5cdFx0XHRcdFx0Y29uc3QgZXZ0WSA9IChvcmlnaW5hbEV2ZW50LnRvdWNoZXM/LlswXT8uY2xpZW50WSkgPz8gb3JpZ2luYWxFdmVudC5jbGllbnRZO1xyXG5cclxuXHRcdFx0XHRcdC8vIC0tLSBFZGdlIGZlbmNlIChsaWtlIHlvdSBoYWQpLCBidXQgY2xhbXBlZCBmb3IgdGlueSBjb2x1bW5zXHJcblx0XHRcdFx0XHRjb25zdCBwYWRkaW5nWCA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuY2xhbXAoIHJlY3Qud2lkdGggKiAwLjIwLCAxMiwgMzYgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHBhZGRpbmdZID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5jbGFtcCggcmVjdC5oZWlnaHQgKiAwLjEwLCA2LCAxNiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIExvb3NlciBZIGlmIHRoZSBjb2x1bW4gaXMgdmlzdWFsbHkgdGlueS9lbXB0eVxyXG5cdFx0XHRcdFx0Y29uc3QgaXNWaXN1YWxseUVtcHR5ID0gdG8uY2hpbGRFbGVtZW50Q291bnQgPT09IDAgfHwgcmVjdC5oZWlnaHQgPCA2NDtcclxuXHRcdFx0XHRcdGNvbnN0IGlubmVyVG9wICAgICAgICA9IHJlY3QudG9wICsgKGlzVmlzdWFsbHlFbXB0eSA/IDQgOiBwYWRkaW5nWSk7XHJcblx0XHRcdFx0XHRjb25zdCBpbm5lckJvdHRvbSAgICAgPSByZWN0LmJvdHRvbSAtIChpc1Zpc3VhbGx5RW1wdHkgPyA0IDogcGFkZGluZ1kpO1xyXG5cdFx0XHRcdFx0Y29uc3QgaW5uZXJMZWZ0ICAgICAgID0gcmVjdC5sZWZ0ICsgcGFkZGluZ1g7XHJcblx0XHRcdFx0XHRjb25zdCBpbm5lclJpZ2h0ICAgICAgPSByZWN0LnJpZ2h0IC0gcGFkZGluZ1g7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgaW5zaWRlWCA9IGV2dFggPiBpbm5lckxlZnQgJiYgZXZ0WCA8IGlubmVyUmlnaHQ7XHJcblx0XHRcdFx0XHRjb25zdCBpbnNpZGVZID0gZXZ0WSA+IGlubmVyVG9wICYmIGV2dFkgPCBpbm5lckJvdHRvbTtcclxuXHRcdFx0XHRcdGlmICggIShpbnNpZGVYICYmIGluc2lkZVkpICkgcmV0dXJuIGZhbHNlOyAgIC8vIHN0YXkgaW4gY3VycmVudCBjb2x1bW4gdW50aWwgd2VsbCBpbnNpZGUgbmV3IG9uZVxyXG5cclxuXHRcdFx0XHRcdC8vIC0tLSBTdGlja3kgdGFyZ2V0IGNvbW1pdCBkaXN0YW5jZTogb25seSBzd2l0Y2ggaWYgd2XigJlyZSBjbGVhcmx5IGluc2lkZSB0aGUgbmV3IGNvbHVtblxyXG5cdFx0XHRcdFx0Y29uc3QgZHMgPSB0aGlzLl9kcmFnU3RhdGU7XHJcblx0XHRcdFx0XHRpZiAoIGRzICkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIGRzLnN0aWNreVRvICYmIGRzLnN0aWNreVRvICE9PSB0byApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXF1aXJlIGEgZGVlcGVyIHBlbmV0cmF0aW9uIHRvIHN3aXRjaCBjb2x1bW5zXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgY29tbWl0WCA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuY2xhbXAoIHJlY3Qud2lkdGggKiAwLjI1LCAxOCwgNDAgKTsgICAvLyAyNSUgb3IgMTjigJM0MHB4XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgY29tbWl0WSA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuY2xhbXAoIHJlY3QuaGVpZ2h0ICogMC4xNSwgMTAsIDI4ICk7ICAvLyAxNSUgb3IgMTDigJMyOHB4XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRlZXBJbnNpZGUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgIChldnRYID4gcmVjdC5sZWZ0ICsgY29tbWl0WCAmJiBldnRYIDwgcmVjdC5yaWdodCAtIGNvbW1pdFgpICYmXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgKGV2dFkgPiByZWN0LnRvcCArIGNvbW1pdFkgJiYgZXZ0WSA8IHJlY3QuYm90dG9tIC0gY29tbWl0WSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggIWRlZXBJbnNpZGUgKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0Ly8gV2UgYWNjZXB0IHRoZSBuZXcgdGFyZ2V0IG5vdy5cclxuXHRcdFx0XHRcdFx0ZHMuc3RpY2t5VG8gICAgID0gdG87XHJcblx0XHRcdFx0XHRcdGRzLmxhc3RTd2l0Y2hUcyA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25TdGFydDogKGV2dCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZGVyPy5fYWRkX2RyYWdnaW5nX2NsYXNzPy4oKTtcclxuXHRcdFx0XHRcdC8vIE1hdGNoIHRoZSBmbGFncyB3ZSBzZXQgaW4gY29tbW9uIHNvIENTUyBzdGF5cyBjb25zaXN0ZW50IG9uIGNhbnZhcyBkcmFncyB0b28uXHJcblx0XHRcdFx0XHRjb25zdCBmcm9tUGFsZXR0ZSA9IHRoaXMuYnVpbGRlcj8ucGFsZXR0ZV91bHM/LmluY2x1ZGVzPy4oIGV2dC5mcm9tICk7XHJcblx0XHRcdFx0XHR0aGlzLl90b2dnbGVfZG5kX3Jvb3RfZmxhZ3MoIHRydWUsIGZyb21QYWxldHRlICk7ICAgICAgICAgIC8vIHNldCB0byByb290IEhUTUwgZG9jdW1lbnQ6IGh0bWwud3BiY19iZmJfX2RuZC1hY3RpdmUud3BiY19iZmJfX2RyYWctZnJvbS1wYWxldHRlIC5cclxuXHRcdFx0XHRcdHRoaXMuX3RhZ19kcmFnX21pcnJvciggZXZ0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWcgdGhlIG1pcnJvciB1bmRlciBjdXJzb3IuXHJcblx0XHRcdFx0XHR0aGlzLl9kcmFnU3RhdGUgPSB7IHN0aWNreVRvOiBudWxsLCBsYXN0U3dpdGNoVHM6IDAgfTsgICAgLy8gcGVyLWRyYWcgc3RhdGUuXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvbkVuZCAgOiAoKSA9PiB7XHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCAoKSA9PiB7IHRoaXMuYnVpbGRlci5fcmVtb3ZlX2RyYWdnaW5nX2NsYXNzKCk7IH0sIDUwICk7XHJcblx0XHRcdFx0XHR0aGlzLl90b2dnbGVfZG5kX3Jvb3RfZmxhZ3MoIGZhbHNlICk7ICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdG8gcm9vdCBIVE1MIGRvY3VtZW50IHdpdGhvdXQgdGhlc2UgY2xhc3NlczogaHRtbC53cGJjX2JmYl9fZG5kLWFjdGl2ZS53cGJjX2JmYl9fZHJhZy1mcm9tLXBhbGV0dGUgLlxyXG5cdFx0XHRcdFx0dGhpcy5fZHJhZ1N0YXRlID0gbnVsbDtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0XHQvLyBvbkFkZDogaGFuZGxlcnMub25BZGQgfHwgdGhpcy5idWlsZGVyLmhhbmRsZV9vbl9hZGQuYmluZCggdGhpcy5idWlsZGVyIClcclxuXHRcdFx0XHRvbkFkZDogKGV2dCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCB0aGlzLl9vbl9hZGRfc2VjdGlvbiggZXZ0ICkgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIEZhbGxiYWNrOiBvcmlnaW5hbCBoYW5kbGVyIGZvciBub3JtYWwgZmllbGRzLlxyXG5cdFx0XHRcdFx0KGhhbmRsZXJzLm9uQWRkIHx8IHRoaXMuYnVpbGRlci5oYW5kbGVfb25fYWRkLmJpbmQoIHRoaXMuYnVpbGRlciApKSggZXZ0ICk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvblVwZGF0ZTogKCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZGVyLmJ1cz8uZW1pdD8uKCBDb3JlLldQQkNfQkZCX0V2ZW50cy5TVFJVQ1RVUkVfQ0hBTkdFLCB7IHJlYXNvbjogJ3NvcnQtdXBkYXRlJyB9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR0aGlzLl9jb250YWluZXJzLmFkZCggY29udGFpbmVyICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIYW5kbGUgYWRkaW5nL21vdmluZyBzZWN0aW9ucyB2aWEgU29ydGFibGUgb25BZGQuXHJcblx0XHQgKiBSZXR1cm5zIHRydWUgaWYgaGFuZGxlZCAoaS5lLiwgaXQgd2FzIGEgc2VjdGlvbiksIGZhbHNlIHRvIGxldCB0aGUgZGVmYXVsdCBmaWVsZCBoYW5kbGVyIHJ1bi5cclxuXHRcdCAqXHJcblx0XHQgKiAtIFBhbGV0dGUgLT4gY2FudmFzOiByZW1vdmUgdGhlIHBsYWNlaG9sZGVyIGNsb25lIGFuZCBidWlsZCBhIGZyZXNoIHNlY3Rpb24gdmlhIGFkZF9zZWN0aW9uKClcclxuXHRcdCAqIC0gQ2FudmFzIC0+IGNhbnZhczoga2VlcCB0aGUgbW92ZWQgRE9NIChhbmQgaXRzIGNoaWxkcmVuKSwganVzdCByZS13aXJlIG92ZXJsYXlzL3NvcnRhYmxlcy9tZXRhZGF0YVxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7U29ydGFibGUuU29ydGFibGVFdmVudH0gZXZ0XHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0X29uX2FkZF9zZWN0aW9uKGV2dCkge1xyXG5cclxuXHRcdFx0Y29uc3QgaXRlbSA9IGV2dC5pdGVtO1xyXG5cdFx0XHRpZiAoICEgaXRlbSApIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIElkZW50aWZ5IHNlY3Rpb25zIGJvdGggZnJvbSBwYWxldHRlIGl0ZW1zIChsaSBjbG9uZXMpIGFuZCByZWFsIGNhbnZhcyBub2Rlcy5cclxuXHRcdFx0Y29uc3QgZGF0YSAgICAgID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuZ2V0X2FsbF9kYXRhX2F0dHJpYnV0ZXMoIGl0ZW0gKTtcclxuXHRcdFx0Y29uc3QgaXNTZWN0aW9uID0gaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKSB8fCAoZGF0YT8udHlwZSB8fCBpdGVtLmRhdGFzZXQ/LnR5cGUpID09PSAnc2VjdGlvbic7XHJcblxyXG5cdFx0XHRpZiAoICEgaXNTZWN0aW9uICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZnJvbVBhbGV0dGUgPSB0aGlzLmJ1aWxkZXI/LnBhbGV0dGVfdWxzPy5pbmNsdWRlcz8uKCBldnQuZnJvbSApID09PSB0cnVlO1xyXG5cclxuXHRcdFx0aWYgKCAhIGZyb21QYWxldHRlICkge1xyXG5cdFx0XHRcdC8vIENhbnZhcyAtPiBjYW52YXMgbW92ZTogRE8gTk9UIHJlYnVpbGQvcmVtb3ZlOyBwcmVzZXJ2ZSBjaGlsZHJlbi5cclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuYWRkX292ZXJsYXlfdG9vbGJhcj8uKCBpdGVtICk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgb3ZlcmxheSBleGlzdHNcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIucGFnZXNfc2VjdGlvbnM/LmluaXRfYWxsX25lc3RlZF9zb3J0YWJsZXM/LiggaXRlbSApOyAvLyBlbnN1cmUgaW5uZXIgc29ydGFibGVzXHJcblxyXG5cdFx0XHRcdC8vIEVuc3VyZSBtZXRhZGF0YSBwcmVzZW50L3VwZGF0ZWRcclxuXHRcdFx0XHRpdGVtLmRhdGFzZXQudHlwZSAgICA9ICdzZWN0aW9uJztcclxuXHRcdFx0XHRjb25zdCBjb2xzICAgICAgICAgICA9IGl0ZW0ucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fcm93ID4gLndwYmNfYmZiX19jb2x1bW4nICkubGVuZ3RoIHx8IDE7XHJcblx0XHRcdFx0aXRlbS5kYXRhc2V0LmNvbHVtbnMgPSBTdHJpbmcoIGNvbHMgKTtcclxuXHJcblx0XHRcdFx0Ly8gU2VsZWN0ICYgbm90aWZ5IHN1YnNjcmliZXJzIChsYXlvdXQvbWluIGd1YXJkcywgZXRjLilcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuc2VsZWN0X2ZpZWxkPy4oIGl0ZW0gKTtcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuYnVzPy5lbWl0Py4oIENvcmUuV1BCQ19CRkJfRXZlbnRzLlNUUlVDVFVSRV9DSEFOR0UsIHsgZWw6IGl0ZW0sIHJlYXNvbjogJ3NlY3Rpb24tbW92ZScgfSApO1xyXG5cdFx0XHRcdHRoaXMuYnVpbGRlci51c2FnZT8udXBkYXRlX3BhbGV0dGVfdWk/LigpO1xyXG5cdFx0XHRcdHJldHVybiB0cnVlOyAvLyBoYW5kbGVkLlxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBQYWxldHRlIC0+IGNhbnZhczogYnVpbGQgYSBicmFuZC1uZXcgc2VjdGlvbiB1c2luZyB0aGUgc2FtZSBwYXRoIGFzIHRoZSBkcm9wZG93bi9tZW51XHJcblx0XHRcdGNvbnN0IHRvICAgPSBldnQudG8/LmNsb3Nlc3Q/LiggJy53cGJjX2JmYl9fY29sdW1uLCAud3BiY19iZmJfX2Zvcm1fcHJldmlld19zZWN0aW9uX2NvbnRhaW5lcicgKSB8fCBldnQudG87XHJcblx0XHRcdGNvbnN0IGNvbHMgPSBwYXJzZUludCggZGF0YT8uY29sdW1ucyB8fCBpdGVtLmRhdGFzZXQuY29sdW1ucyB8fCAxLCAxMCApIHx8IDE7XHJcblxyXG5cdFx0XHQvLyBSZW1vdmUgdGhlIHBhbGV0dGUgY2xvbmUgcGxhY2Vob2xkZXIuXHJcblx0XHRcdGl0ZW0ucGFyZW50Tm9kZSAmJiBpdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGl0ZW0gKTtcclxuXHJcblx0XHRcdC8vIENyZWF0ZSB0aGUgcmVhbCBzZWN0aW9uLlxyXG5cdFx0XHR0aGlzLmJ1aWxkZXIucGFnZXNfc2VjdGlvbnMuYWRkX3NlY3Rpb24oIHRvLCBjb2xzICk7XHJcblxyXG5cdFx0XHQvLyBJbnNlcnQgYXQgdGhlIHByZWNpc2UgZHJvcCBpbmRleC5cclxuXHRcdFx0Y29uc3Qgc2VjdGlvbiA9IHRvLmxhc3RFbGVtZW50Q2hpbGQ7IC8vIGFkZF9zZWN0aW9uIGFwcGVuZHMgdG8gZW5kLlxyXG5cdFx0XHRpZiAoIGV2dC5uZXdJbmRleCAhPSBudWxsICYmIGV2dC5uZXdJbmRleCA8IHRvLmNoaWxkcmVuLmxlbmd0aCAtIDEgKSB7XHJcblx0XHRcdFx0Y29uc3QgcmVmID0gdG8uY2hpbGRyZW5bZXZ0Lm5ld0luZGV4XSB8fCBudWxsO1xyXG5cdFx0XHRcdHRvLmluc2VydEJlZm9yZSggc2VjdGlvbiwgcmVmICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEZpbmFsaXplOiBvdmVybGF5LCBzZWxlY3Rpb24sIGV2ZW50cywgdXNhZ2UgcmVmcmVzaC5cclxuXHRcdFx0dGhpcy5idWlsZGVyLmFkZF9vdmVybGF5X3Rvb2xiYXI/Liggc2VjdGlvbiApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuc2VsZWN0X2ZpZWxkPy4oIHNlY3Rpb24gKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLmJ1cz8uZW1pdD8uKCBDb3JlLldQQkNfQkZCX0V2ZW50cy5GSUVMRF9BREQsIHtcclxuXHRcdFx0XHRlbCA6IHNlY3Rpb24sXHJcblx0XHRcdFx0aWQgOiBzZWN0aW9uLmRhdGFzZXQuaWQsXHJcblx0XHRcdFx0dWlkOiBzZWN0aW9uLmRhdGFzZXQudWlkXHJcblx0XHRcdH0gKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLnVzYWdlPy51cGRhdGVfcGFsZXR0ZV91aT8uKCk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlc3Ryb3kgYWxsIFNvcnRhYmxlIGluc3RhbmNlcyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0ZGVzdHJveUFsbCgpIHtcclxuXHRcdFx0dGhpcy5fY29udGFpbmVycy5mb3JFYWNoKCAoIGVsICkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGluc3QgPSBTb3J0YWJsZS5nZXQ/LiggZWwgKTtcclxuXHRcdFx0XHRpZiAoIGluc3QgKSB7XHJcblx0XHRcdFx0XHRpbnN0LmRlc3Ryb3koKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0dGhpcy5fY29udGFpbmVycy5jbGVhcigpO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNtYWxsIERPTSBjb250cmFjdCBhbmQgcmVuZGVyZXIgaGVscGVyXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7UmVhZG9ubHk8e1xyXG5cdCAqICAgICAgICAgICAgICAgICAgU0VMRUNUT1JTOiB7cGFnZVBhbmVsOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIHZhbGlkRmllbGQ6IHN0cmluZywgc2VjdGlvbjogc3RyaW5nLCBjb2x1bW46XHJcblx0ICogICAgIHN0cmluZywgcm93OiBzdHJpbmcsIG92ZXJsYXk6IHN0cmluZ30sIENMQVNTRVM6IHtzZWxlY3RlZDogc3RyaW5nfSwgQVRUUjoge2lkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgaHRtbElkOlxyXG5cdCAqICAgICBzdHJpbmcsIHVzYWdlS2V5OiBzdHJpbmcsIHVpZDogc3RyaW5nfX1cclxuXHQgKiAgICAgICAgPn1cclxuXHQgKi9cclxuXHRDb3JlLldQQkNfQkZCX0RPTSA9IE9iamVjdC5mcmVlemUoIHtcclxuXHRcdFNFTEVDVE9SUzoge1xyXG5cdFx0XHRwYWdlUGFuZWwgOiAnLndwYmNfYmZiX19wYW5lbC0tcHJldmlldycsXHJcblx0XHRcdGZpZWxkICAgICA6ICcud3BiY19iZmJfX2ZpZWxkJyxcclxuXHRcdFx0dmFsaWRGaWVsZDogJy53cGJjX2JmYl9fZmllbGQ6bm90KC5pcy1pbnZhbGlkKScsXHJcblx0XHRcdHNlY3Rpb24gICA6ICcud3BiY19iZmJfX3NlY3Rpb24nLFxyXG5cdFx0XHRjb2x1bW4gICAgOiAnLndwYmNfYmZiX19jb2x1bW4nLFxyXG5cdFx0XHRyb3cgICAgICAgOiAnLndwYmNfYmZiX19yb3cnLFxyXG5cdFx0XHRvdmVybGF5ICAgOiAnLndwYmNfYmZiX19vdmVybGF5LWNvbnRyb2xzJ1xyXG5cdFx0fSxcclxuXHRcdENMQVNTRVMgIDoge1xyXG5cdFx0XHRzZWxlY3RlZDogJ2lzLXNlbGVjdGVkJ1xyXG5cdFx0fSxcclxuXHRcdEFUVFIgICAgIDoge1xyXG5cdFx0XHRpZCAgICAgIDogJ2RhdGEtaWQnLFxyXG5cdFx0XHRuYW1lICAgIDogJ2RhdGEtbmFtZScsXHJcblx0XHRcdGh0bWxJZCAgOiAnZGF0YS1odG1sX2lkJyxcclxuXHRcdFx0dXNhZ2VLZXk6ICdkYXRhLXVzYWdlX2tleScsXHJcblx0XHRcdHVpZCAgICAgOiAnZGF0YS11aWQnXHJcblx0XHR9XHJcblx0fSApO1xyXG5cclxuXHRDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlciA9IGNsYXNzIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENyZWF0ZSBhbiBIVE1MIGVsZW1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHRhZyAtIEhUTUwgdGFnIG5hbWUuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXNzX25hbWU9JyddIC0gT3B0aW9uYWwgQ1NTIGNsYXNzIG5hbWUuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW2lubmVyX2h0bWw9JyddIC0gT3B0aW9uYWwgaW5uZXJIVE1MLlxyXG5cdFx0ICogQHJldHVybnMge0hUTUxFbGVtZW50fSBDcmVhdGVkIGVsZW1lbnQuXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBjcmVhdGVfZWxlbWVudCggdGFnLCBjbGFzc19uYW1lID0gJycsIGlubmVyX2h0bWwgPSAnJyApIHtcclxuXHRcdFx0Y29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0YWcgKTtcclxuXHRcdFx0aWYgKCBjbGFzc19uYW1lICkge1xyXG5cdFx0XHRcdGVsLmNsYXNzTmFtZSA9IGNsYXNzX25hbWU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBpbm5lcl9odG1sICkge1xyXG5cdFx0XHRcdGVsLmlubmVySFRNTCA9IGlubmVyX2h0bWw7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGVsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IG11bHRpcGxlIGBkYXRhLSpgIGF0dHJpYnV0ZXMgb24gYSBnaXZlbiBlbGVtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gVGFyZ2V0IGVsZW1lbnQuXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YV9vYmogLSBLZXktdmFsdWUgcGFpcnMgZm9yIGRhdGEgYXR0cmlidXRlcy5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgc2V0X2RhdGFfYXR0cmlidXRlcyggZWwsIGRhdGFfb2JqICkge1xyXG5cdFx0XHRPYmplY3QuZW50cmllcyggZGF0YV9vYmogKS5mb3JFYWNoKCAoIFsga2V5LCB2YWwgXSApID0+IHtcclxuXHRcdFx0XHQvLyBQcmV2aW91c2x5OiAyMDI1LTA5LTAxIDE3OjA5OlxyXG5cdFx0XHRcdC8vIGNvbnN0IHZhbHVlID0gKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSA/IEpTT04uc3RyaW5naWZ5KCB2YWwgKSA6IHZhbDtcclxuXHRcdFx0XHQvL05ldzpcclxuXHRcdFx0XHRsZXQgdmFsdWU7XHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KCB2YWwgKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2gge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtJyArIGtleSwgdmFsdWUgKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2V0IGFsbCBgZGF0YS0qYCBhdHRyaWJ1dGVzIGZyb20gYW4gZWxlbWVudCBhbmQgcGFyc2UgSlNPTiB3aGVyZSBwb3NzaWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIEVsZW1lbnQgdG8gZXh0cmFjdCBkYXRhIGZyb20uXHJcblx0XHQgKiBAcmV0dXJucyB7T2JqZWN0fSBQYXJzZWQga2V5LXZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMuXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZXRfYWxsX2RhdGFfYXR0cmlidXRlcyggZWwgKSB7XHJcblx0XHRcdGNvbnN0IGRhdGEgPSB7fTtcclxuXHJcblx0XHRcdGlmICggISBlbCB8fCAhIGVsLmF0dHJpYnV0ZXMgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGRhdGE7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdEFycmF5LmZyb20oIGVsLmF0dHJpYnV0ZXMgKS5mb3JFYWNoKFxyXG5cdFx0XHRcdCggYXR0ciApID0+IHtcclxuXHRcdFx0XHRcdGlmICggYXR0ci5uYW1lLnN0YXJ0c1dpdGgoICdkYXRhLScgKSApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qga2V5ID0gYXR0ci5uYW1lLnJlcGxhY2UoIC9eZGF0YS0vLCAnJyApO1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdGRhdGFba2V5XSA9IEpTT04ucGFyc2UoIGF0dHIudmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YVtrZXldID0gYXR0ci52YWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdC8vIE9ubHkgZGVmYXVsdCB0aGUgbGFiZWwgaWYgaXQncyB0cnVseSBhYnNlbnQgKHVuZGVmaW5lZC9udWxsKSwgbm90IHdoZW4gaXQncyBhbiBlbXB0eSBzdHJpbmcuXHJcblx0XHRcdGNvbnN0IGhhc0V4cGxpY2l0TGFiZWwgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGRhdGEsICdsYWJlbCcgKTtcclxuXHRcdFx0aWYgKCAhIGhhc0V4cGxpY2l0TGFiZWwgJiYgZGF0YS5pZCApIHtcclxuXHRcdFx0XHRkYXRhLmxhYmVsID0gZGF0YS5pZC5jaGFyQXQoIDAgKS50b1VwcGVyQ2FzZSgpICsgZGF0YS5pZC5zbGljZSggMSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlciBhIHNpbXBsZSBsYWJlbCArIHR5cGUgcHJldmlldyAodXNlZCBmb3IgdW5rbm93biBvciBmYWxsYmFjayBmaWVsZHMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZF9kYXRhIC0gRmllbGQgZGF0YSBvYmplY3QuXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfSBIVE1MIGNvbnRlbnQuXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyByZW5kZXJfZmllbGRfaW5uZXJfaHRtbCggZmllbGRfZGF0YSApIHtcclxuXHRcdFx0Ly8gTWFrZSB0aGUgZmFsbGJhY2sgcHJldmlldyByZXNwZWN0IGFuIGVtcHR5IGxhYmVsLlxyXG5cdFx0XHRjb25zdCBoYXNMYWJlbCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggZmllbGRfZGF0YSwgJ2xhYmVsJyApO1xyXG5cdFx0XHRjb25zdCBsYWJlbCAgICA9IGhhc0xhYmVsID8gU3RyaW5nKCBmaWVsZF9kYXRhLmxhYmVsICkgOiBTdHJpbmcoIGZpZWxkX2RhdGEuaWQgfHwgJyhubyBsYWJlbCknICk7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlICAgICAgICA9IFN0cmluZyggZmllbGRfZGF0YS50eXBlIHx8ICd1bmtub3duJyApO1xyXG5cdFx0XHRjb25zdCBpc19yZXF1aXJlZCA9IGZpZWxkX2RhdGEucmVxdWlyZWQgPT09IHRydWUgfHwgZmllbGRfZGF0YS5yZXF1aXJlZCA9PT0gJ3RydWUnIHx8IGZpZWxkX2RhdGEucmVxdWlyZWQgPT09IDEgfHwgZmllbGRfZGF0YS5yZXF1aXJlZCA9PT0gJzEnO1xyXG5cclxuXHRcdFx0Y29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XHJcblxyXG5cdFx0XHRjb25zdCBzcGFuTGFiZWwgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnc3BhbicgKTtcclxuXHRcdFx0c3BhbkxhYmVsLmNsYXNzTmFtZSAgID0gJ3dwYmNfYmZiX19maWVsZC1sYWJlbCc7XHJcblx0XHRcdHNwYW5MYWJlbC50ZXh0Q29udGVudCA9IGxhYmVsICsgKGlzX3JlcXVpcmVkID8gJyAqJyA6ICcnKTtcclxuXHRcdFx0d3JhcHBlci5hcHBlbmRDaGlsZCggc3BhbkxhYmVsICk7XHJcblxyXG5cdFx0XHRjb25zdCBzcGFuVHlwZSAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdzcGFuJyApO1xyXG5cdFx0XHRzcGFuVHlwZS5jbGFzc05hbWUgICA9ICd3cGJjX2JmYl9fZmllbGQtdHlwZSc7XHJcblx0XHRcdHNwYW5UeXBlLnRleHRDb250ZW50ID0gdHlwZTtcclxuXHRcdFx0d3JhcHBlci5hcHBlbmRDaGlsZCggc3BhblR5cGUgKTtcclxuXHJcblx0XHRcdHJldHVybiB3cmFwcGVyLmlubmVySFRNTDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlYm91bmNlIGEgZnVuY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBGdW5jdGlvbiB0byBkZWJvdW5jZS5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IC0gRGVsYXkgaW4gbXMuXHJcblx0XHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IERlYm91bmNlZCBmdW5jdGlvbi5cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGRlYm91bmNlKCBmbiwgd2FpdCA9IDEyMCApIHtcclxuXHRcdFx0bGV0IHQgPSBudWxsO1xyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZGVib3VuY2VkKCAuLi5hcmdzICkge1xyXG5cdFx0XHRcdGlmICggdCApIHtcclxuXHRcdFx0XHRcdGNsZWFyVGltZW91dCggdCApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0ID0gc2V0VGltZW91dCggKCkgPT4gZm4uYXBwbHkoIHRoaXMsIGFyZ3MgKSwgd2FpdCApO1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxuXHQvLyBSZW5kZXJlciByZWdpc3RyeS4gQWxsb3dzIGxhdGUgcmVnaXN0cmF0aW9uIGFuZCBhdm9pZHMgdGlnaHQgY291cGxpbmcgdG8gYSBnbG9iYWwgbWFwLlxyXG5cdENvcmUuV1BCQ19CRkJfRmllbGRfUmVuZGVyZXJfUmVnaXN0cnkgPSAoZnVuY3Rpb24gKCkge1xyXG5cdFx0Y29uc3QgbWFwID0gbmV3IE1hcCgpO1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0cmVnaXN0ZXIoIHR5cGUsIENsYXNzUmVmICkge1xyXG5cdFx0XHRcdG1hcC5zZXQoIFN0cmluZyggdHlwZSApLCBDbGFzc1JlZiApO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRnZXQoIHR5cGUgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1hcC5nZXQoIFN0cmluZyggdHlwZSApICk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fSkoKTtcclxuXHJcbn0oIHdpbmRvdyApKTtcclxuIiwiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09IEZpbGUgIC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9fb3V0L2NvcmUvYmZiLWZpZWxkcy5qcyA9PSB8IDIwMjUtMDktMTAgMTU6NDdcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbihmdW5jdGlvbiAoIHcgKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHQvLyBTaW5nbGUgZ2xvYmFsIG5hbWVzcGFjZSAoaWRlbXBvdGVudCAmIGxvYWQtb3JkZXIgc2FmZSkuXHJcblx0Y29uc3QgQ29yZSA9ICggdy5XUEJDX0JGQl9Db3JlID0gdy5XUEJDX0JGQl9Db3JlIHx8IHt9ICk7XHJcblx0Y29uc3QgVUkgICA9ICggQ29yZS5VSSA9IENvcmUuVUkgfHwge30gKTtcclxuXHJcblx0LyoqXHJcblx0ICogQmFzZSBjbGFzcyBmb3IgZmllbGQgcmVuZGVyZXJzIChzdGF0aWMtb25seSBjb250cmFjdCkuXHJcblx0ICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdCAqIENvbnRyYWN0IGV4cG9zZWQgdG8gdGhlIGJ1aWxkZXIgKHN0YXRpYyBtZXRob2RzIG9uIHRoZSBDTEFTUyBpdHNlbGYpOlxyXG5cdCAqICAgLSByZW5kZXIoZWwsIGRhdGEsIGN0eCkgICAgICAgICAgICAgIC8vIFJFUVVJUkVEXHJcblx0ICogICAtIG9uX2ZpZWxkX2Ryb3AoZGF0YSwgZWwsIG1ldGEpICAgICAgLy8gT1BUSU9OQUwgKGRlZmF1bHQgcHJvdmlkZWQpXHJcblx0ICpcclxuXHQgKiBIZWxwZXJzIGZvciBzdWJjbGFzc2VzOlxyXG5cdCAqICAgLSBnZXRfZGVmYXVsdHMoKSAgICAgLT4gcGVyLWZpZWxkIGRlZmF1bHRzIChNVVNUIG92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHNldCB0eXBlL2xhYmVsKVxyXG5cdCAqICAgLSBub3JtYWxpemVfZGF0YShkKSAgLT4gc2hhbGxvdyBtZXJnZSB3aXRoIGRlZmF1bHRzXHJcblx0ICogICAtIGdldF90ZW1wbGF0ZShpZCkgICAtPiBwZXItaWQgY2FjaGVkIHdwLnRlbXBsYXRlIGNvbXBpbGVyXHJcblx0ICpcclxuXHQgKiBTdWJjbGFzcyB1c2FnZTpcclxuXHQgKiAgIGNsYXNzIFdQQkNfQkZCX0ZpZWxkX1RleHQgZXh0ZW5kcyBDb3JlLldQQkNfQkZCX0ZpZWxkX0Jhc2UgeyBzdGF0aWMgZ2V0X2RlZmF1bHRzKCl7IC4uLiB9IH1cclxuXHQgKiAgIFdQQkNfQkZCX0ZpZWxkX1RleHQudGVtcGxhdGVfaWQgPSAnd3BiYy1iZmItZmllbGQtdGV4dCc7XHJcblx0ICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdCAqL1xyXG5cdENvcmUuV1BCQ19CRkJfRmllbGRfQmFzZSA9IGNsYXNzIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmF1bHQgZmllbGQgZGF0YSAoZ2VuZXJpYyBiYXNlbGluZSkuXHJcblx0XHQgKiBTdWJjbGFzc2VzIE1VU1Qgb3ZlcnJpZGUgdG8gcHJvdmlkZSB7IHR5cGUsIGxhYmVsIH0gYXBwcm9wcmlhdGUgZm9yIHRoZSBmaWVsZC5cclxuXHRcdCAqIEByZXR1cm5zIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZXRfZGVmYXVsdHMoKSB7XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0dHlwZSAgICAgICAgOiAnZmllbGQnLFxyXG5cdFx0XHRcdGxhYmVsICAgICAgIDogJ0ZpZWxkJyxcclxuXHRcdFx0XHRuYW1lICAgICAgICA6ICdmaWVsZCcsXHJcblx0XHRcdFx0aHRtbF9pZCAgICAgOiAnJyxcclxuXHRcdFx0XHRwbGFjZWhvbGRlciA6ICcnLFxyXG5cdFx0XHRcdHJlcXVpcmVkICAgIDogZmFsc2UsXHJcblx0XHRcdFx0bWlubGVuZ3RoICAgOiAnJyxcclxuXHRcdFx0XHRtYXhsZW5ndGggICA6ICcnLFxyXG5cdFx0XHRcdHBhdHRlcm4gICAgIDogJycsXHJcblx0XHRcdFx0Y3NzY2xhc3MgICAgOiAnJyxcclxuXHRcdFx0XHRoZWxwICAgICAgICA6ICcnXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTaGFsbG93LW1lcmdlIGluY29taW5nIGRhdGEgd2l0aCBkZWZhdWx0cy5cclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXHJcblx0XHQgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgbm9ybWFsaXplX2RhdGEoIGRhdGEgKSB7XHJcblx0XHRcdHZhciBkICAgICAgICA9IGRhdGEgfHwge307XHJcblx0XHRcdHZhciBkZWZhdWx0cyA9IHRoaXMuZ2V0X2RlZmF1bHRzKCk7XHJcblx0XHRcdHZhciBvdXQgICAgICA9IHt9O1xyXG5cdFx0XHR2YXIgaztcclxuXHJcblx0XHRcdGZvciAoIGsgaW4gZGVmYXVsdHMgKSB7XHJcblx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGRlZmF1bHRzLCBrICkgKSB7XHJcblx0XHRcdFx0XHRvdXRba10gPSBkZWZhdWx0c1trXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Zm9yICggayBpbiBkICkge1xyXG5cdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBkLCBrICkgKSB7XHJcblx0XHRcdFx0XHRvdXRba10gPSBkW2tdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gb3V0O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29tcGlsZSBhbmQgY2FjaGUgYSB3cC50ZW1wbGF0ZSBieSBpZCAocGVyLWlkIGNhY2hlKS5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZW1wbGF0ZV9pZFxyXG5cdFx0ICogQHJldHVybnMge0Z1bmN0aW9ufG51bGx9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZXRfdGVtcGxhdGUodGVtcGxhdGVfaWQpIHtcclxuXHJcblx0XHRcdC8vIEFjY2VwdCBlaXRoZXIgXCJ3cGJjLWJmYi1maWVsZC10ZXh0XCIgb3IgXCJ0bXBsLXdwYmMtYmZiLWZpZWxkLXRleHRcIi5cclxuXHRcdFx0aWYgKCAhIHRlbXBsYXRlX2lkIHx8ICEgd2luZG93LndwIHx8ICEgd3AudGVtcGxhdGUgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgZG9tSWQgPSB0ZW1wbGF0ZV9pZC5zdGFydHNXaXRoKCAndG1wbC0nICkgPyB0ZW1wbGF0ZV9pZCA6ICgndG1wbC0nICsgdGVtcGxhdGVfaWQpO1xyXG5cdFx0XHRpZiAoICEgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGRvbUlkICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggISBDb3JlLl9fYmZiX3RwbF9jYWNoZV9tYXAgKSB7XHJcblx0XHRcdFx0Q29yZS5fX2JmYl90cGxfY2FjaGVfbWFwID0ge307XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5vcm1hbGl6ZSBpZCBmb3IgdGhlIGNvbXBpbGVyICYgY2FjaGUuIC8vIHdwLnRlbXBsYXRlIGV4cGVjdHMgaWQgV0lUSE9VVCB0aGUgXCJ0bXBsLVwiIHByZWZpeCAhXHJcblx0XHRcdGNvbnN0IGtleSA9IHRlbXBsYXRlX2lkLnJlcGxhY2UoIC9edG1wbC0vLCAnJyApO1xyXG5cdFx0XHRpZiAoIENvcmUuX19iZmJfdHBsX2NhY2hlX21hcFtrZXldICkge1xyXG5cdFx0XHRcdHJldHVybiBDb3JlLl9fYmZiX3RwbF9jYWNoZV9tYXBba2V5XTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29tcGlsZXIgPSB3cC50ZW1wbGF0ZSgga2V5ICk7ICAgICAvLyA8LS0gbm9ybWFsaXplZCBpZCBoZXJlXHJcblx0XHRcdGlmICggY29tcGlsZXIgKSB7XHJcblx0XHRcdFx0Q29yZS5fX2JmYl90cGxfY2FjaGVfbWFwW2tleV0gPSBjb21waWxlcjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNvbXBpbGVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUkVRVUlSRUQ6IHJlbmRlciBwcmV2aWV3IGludG8gaG9zdCBlbGVtZW50IChmdWxsIHJlZHJhdzsgaWRlbXBvdGVudCkuXHJcblx0XHQgKiBTdWJjbGFzc2VzIHNob3VsZCBzZXQgc3RhdGljIGB0ZW1wbGF0ZV9pZGAgdG8gYSB2YWxpZCB3cC50ZW1wbGF0ZSBpZC5cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBkYXRhXHJcblx0XHQgKiBAcGFyYW0ge3ttb2RlPzpzdHJpbmcsYnVpbGRlcj86YW55LHRwbD86RnVuY3Rpb24sc2FuaXQ/OmFueX19IGN0eFxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyByZW5kZXIoIGVsLCBkYXRhLCBjdHggKSB7XHJcblx0XHRcdGlmICggISBlbCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBjb21waWxlID0gdGhpcy5nZXRfdGVtcGxhdGUoIHRoaXMudGVtcGxhdGVfaWQgKTtcclxuXHRcdFx0dmFyIGQgICAgICAgPSB0aGlzLm5vcm1hbGl6ZV9kYXRhKCBkYXRhICk7XHJcblxyXG5cdFx0XHR2YXIgcyA9IChjdHggJiYgY3R4LnNhbml0KSA/IGN0eC5zYW5pdCA6IENvcmUuV1BCQ19CRkJfU2FuaXRpemU7XHJcblxyXG5cdFx0XHQvLyBTYW5pdGl6ZSBjcml0aWNhbCBhdHRyaWJ1dGVzIGJlZm9yZSB0ZW1wbGF0aW5nLlxyXG5cdFx0XHRpZiAoIHMgKSB7XHJcblx0XHRcdFx0ZC5odG1sX2lkID0gZC5odG1sX2lkID8gcy5zYW5pdGl6ZV9odG1sX2lkKCBTdHJpbmcoIGQuaHRtbF9pZCApICkgOiAnJztcclxuXHRcdFx0XHRkLm5hbWUgICAgPSBzLnNhbml0aXplX2h0bWxfbmFtZSggU3RyaW5nKCBkLm5hbWUgfHwgZC5pZCB8fCAnZmllbGQnICkgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRkLmh0bWxfaWQgPSBkLmh0bWxfaWQgPyBTdHJpbmcoIGQuaHRtbF9pZCApIDogJyc7XHJcblx0XHRcdFx0ZC5uYW1lICAgID0gU3RyaW5nKCBkLm5hbWUgfHwgZC5pZCB8fCAnZmllbGQnICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEZhbGwgYmFjayB0byBnZW5lcmljIHByZXZpZXcgaWYgdGVtcGxhdGUgbm90IGF2YWlsYWJsZS5cclxuXHRcdFx0aWYgKCBjb21waWxlICkge1xyXG5cdFx0XHRcdGVsLmlubmVySFRNTCA9IGNvbXBpbGUoIGQgKTtcclxuXHJcblx0XHRcdFx0Ly8gQWZ0ZXIgcmVuZGVyLCBzZXQgYXR0cmlidXRlIHZhbHVlcyB2aWEgRE9NIHNvIHF1b3Rlcy9uZXdsaW5lcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuXHJcblx0XHRcdFx0Y29uc3QgaW5wdXQgPSBlbC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnICk7XHJcblx0XHRcdFx0aWYgKCBpbnB1dCApIHtcclxuXHRcdFx0XHRcdGlmICggZC5wbGFjZWhvbGRlciAhPSBudWxsICkgaW5wdXQuc2V0QXR0cmlidXRlKCAncGxhY2Vob2xkZXInLCBTdHJpbmcoIGQucGxhY2Vob2xkZXIgKSApO1xyXG5cdFx0XHRcdFx0aWYgKCBkLnRpdGxlICE9IG51bGwgKSBpbnB1dC5zZXRBdHRyaWJ1dGUoICd0aXRsZScsIFN0cmluZyggZC50aXRsZSApICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRlbC5pbm5lckhUTUwgPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5yZW5kZXJfZmllbGRfaW5uZXJfaHRtbCggZCApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbC5kYXRhc2V0LnR5cGUgPSBkLnR5cGUgfHwgJ2ZpZWxkJztcclxuXHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1sYWJlbCcsIChkLmxhYmVsICE9IG51bGwgPyBTdHJpbmcoIGQubGFiZWwgKSA6ICcnKSApOyAvLyBhbGxvdyBcIlwiLlxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9QVElPTkFMIGhvb2sgZXhlY3V0ZWQgYWZ0ZXIgZmllbGQgaXMgZHJvcHBlZC9sb2FkZWQvcHJldmlldy5cclxuXHRcdCAqIERlZmF1bHQgZXh0ZW5kZWQ6XHJcblx0XHQgKiAtIE9uIGZpcnN0IGRyb3A6IHN0YW1wIGRlZmF1bHQgbGFiZWwgKGV4aXN0aW5nIGJlaGF2aW9yKSBhbmQgbWFyayBmaWVsZCBhcyBcImZyZXNoXCIgZm9yIGF1dG8tbmFtZS5cclxuXHRcdCAqIC0gT24gbG9hZDogbWFyayBhcyBsb2FkZWQgc28gbGF0ZXIgbGFiZWwgZWRpdHMgZG8gbm90IHJlbmFtZSB0aGUgc2F2ZWQgbmFtZS5cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG9uX2ZpZWxkX2Ryb3AoZGF0YSwgZWwsIG1ldGEpIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHQgPSAobWV0YSAmJiBtZXRhLmNvbnRleHQpID8gU3RyaW5nKCBtZXRhLmNvbnRleHQgKSA6ICcnO1xyXG5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0Ly8gTkVXOiBTZWVkIGRlZmF1bHQgXCJoZWxwXCIgKGFuZCBrZWVwIGl0IGluIFN0cnVjdHVyZSkgZm9yIGFsbCBmaWVsZCBwYWNrcyB0aGF0IGRlZmluZSBpdC5cclxuXHRcdFx0Ly8gVGhpcyBmaXhlcyB0aGUgbWlzbWF0Y2ggd2hlcmU6XHJcblx0XHRcdC8vICAgLSBVSSBzaG93cyBkZWZhdWx0IGhlbHAgdmlhIG5vcm1hbGl6ZV9kYXRhKCkgLyB0ZW1wbGF0ZXNcclxuXHRcdFx0Ly8gICAtIGJ1dCBnZXRfc3RydWN0dXJlKCkgLyBleHBvcnRlcnMgc2VlIGBoZWxwYCBhcyB1bmRlZmluZWQvZW1wdHkuXHJcblx0XHRcdC8vXHJcblx0XHRcdC8vIEJlaGF2aW9yOlxyXG5cdFx0XHQvLyAgIC0gUnVucyBPTkxZIG9uIGluaXRpYWwgZHJvcCAoY29udGV4dCA9PT0gJ2Ryb3AnKS5cclxuXHRcdFx0Ly8gICAtIElmIGdldF9kZWZhdWx0cygpIGV4cG9zZXMgYSBub24tZW1wdHkgXCJoZWxwXCIsIGFuZCBkYXRhLmhlbHAgaXNcclxuXHRcdFx0Ly8gICAgIG1pc3NpbmcgLyBudWxsIC8gZW1wdHkgc3RyaW5nIC0+IHdlIHBlcnNpc3QgdGhlIGRlZmF1bHQgaW50byBgZGF0YWBcclxuXHRcdFx0Ly8gICAgIGFuZCBub3RpZnkgU3RydWN0dXJlIHNvIGV4cG9ydHMgc2VlIGl0LlxyXG5cdFx0XHQvLyAgIC0gT24gXCJsb2FkXCIgd2UgZG8gbm90aGluZywgc28gZXhpc3RpbmcgZm9ybXMgd2hlcmUgdXNlciAqY2xlYXJlZCpcclxuXHRcdFx0Ly8gICAgIGhlbHAgd2lsbCBub3QgYmUgb3ZlcnJpZGRlbi5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0aWYgKCBjb250ZXh0ID09PSAnZHJvcCcgJiYgZGF0YSApIHtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0Y29uc3QgZGVmcyA9ICh0eXBlb2YgdGhpcy5nZXRfZGVmYXVsdHMgPT09ICdmdW5jdGlvbicpID8gdGhpcy5nZXRfZGVmYXVsdHMoKSA6IG51bGw7XHJcblx0XHRcdFx0XHRpZiAoIGRlZnMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBkZWZzLCAnaGVscCcgKSApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudCAgICA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggZGF0YSwgJ2hlbHAnICkgPyBkYXRhLmhlbHAgOiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGhhc1ZhbHVlICAgPSAoY3VycmVudCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnQgIT09IG51bGwgJiYgU3RyaW5nKCBjdXJyZW50ICkgIT09ICcnKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbCA9IGRlZnMuaGVscDtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggISBoYXNWYWx1ZSAmJiBkZWZhdWx0VmFsICE9IG51bGwgJiYgU3RyaW5nKCBkZWZhdWx0VmFsICkgIT09ICcnICkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIDEpIHBlcnNpc3QgaW50byBkYXRhIG9iamVjdCAodXNlZCBieSBTdHJ1Y3R1cmUpLlxyXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVscCA9IGRlZmF1bHRWYWw7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIDIpIG1pcnJvciBpbnRvIGRhdGFzZXQgKGZvciBhbnkgRE9NLWJhc2VkIGNvbnN1bWVycykuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBlbCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVsLmRhdGFzZXQuaGVscCA9IFN0cmluZyggZGVmYXVsdFZhbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIDMpIG5vdGlmeSBTdHJ1Y3R1cmUgLyBsaXN0ZW5lcnMgKGlmIGF2YWlsYWJsZSkuXHJcblx0XHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRDb3JlLlN0cnVjdHVyZT8udXBkYXRlX2ZpZWxkX3Byb3A/LiggZWwsICdoZWxwJywgZGVmYXVsdFZhbCApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5kaXNwYXRjaEV2ZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHsgYnViYmxlczogdHJ1ZSwgZGV0YWlsIDogeyBrZXk6ICdoZWxwJywgdmFsdWU6IGRlZmF1bHRWYWwgfSB9IClcclxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBfaW5uZXIgKSB7fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHt9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0XHRcdGlmICggY29udGV4dCA9PT0gJ2Ryb3AnICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGRhdGEsICdsYWJlbCcgKSApIHtcclxuXHRcdFx0XHRjb25zdCBkZWZzID0gdGhpcy5nZXRfZGVmYXVsdHMoKTtcclxuXHRcdFx0XHRkYXRhLmxhYmVsID0gZGVmcy5sYWJlbCB8fCAnRmllbGQnO1xyXG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtbGFiZWwnLCBkYXRhLmxhYmVsICk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gTWFyayBwcm92ZW5hbmNlIGZsYWdzLlxyXG5cdFx0XHRpZiAoIGNvbnRleHQgPT09ICdkcm9wJyApIHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0LmZyZXNoICAgICAgPSAnMSc7ICAgLy8gY2FuIGF1dG8tbmFtZSBvbiBmaXJzdCBsYWJlbCBlZGl0LlxyXG5cdFx0XHRcdGVsLmRhdGFzZXQuYXV0b25hbWUgICA9ICcxJztcclxuXHRcdFx0XHRlbC5kYXRhc2V0Lndhc19sb2FkZWQgPSAnMCc7XHJcblx0XHRcdFx0Ly8gU2VlZCBhIHByb3Zpc2lvbmFsIHVuaXF1ZSBuYW1lIGltbWVkaWF0ZWx5LlxyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRjb25zdCBiID0gbWV0YT8uYnVpbGRlcjtcclxuXHRcdFx0XHRcdGlmICggYj8uaWQgJiYgKCFlbC5oYXNBdHRyaWJ1dGUoICdkYXRhLW5hbWUnICkgfHwgIWVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtbmFtZScgKSkgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IFMgICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiYXNlID0gUy5zYW5pdGl6ZV9odG1sX25hbWUoIGVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtaWQnICkgfHwgZGF0YT8uaWQgfHwgZGF0YT8udHlwZSB8fCAnZmllbGQnICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHVuaXEgPSBiLmlkLmVuc3VyZV91bmlxdWVfZmllbGRfbmFtZSggYmFzZSwgZWwgKTtcclxuXHRcdFx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1uYW1lJywgdW5pcSApO1xyXG5cdFx0XHRcdFx0XHRlbC5kYXRhc2V0Lm5hbWVfdXNlcl90b3VjaGVkID0gJzAnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvbnRleHQgPT09ICdsb2FkJyApIHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0LmZyZXNoICAgICAgPSAnMCc7XHJcblx0XHRcdFx0ZWwuZGF0YXNldC5hdXRvbmFtZSAgID0gJzAnO1xyXG5cdFx0XHRcdGVsLmRhdGFzZXQud2FzX2xvYWRlZCA9ICcxJzsgICAvLyBuZXZlciByZW5hbWUgbmFtZXMgZm9yIGxvYWRlZCBmaWVsZHMuXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyAtLS0gQXV0byBSZW5hbWUgXCJGcmVzaFwiIGZpZWxkLCAgb24gZW50ZXJpbmcgdGhlIG5ldyBMYWJlbCAtLS1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENyZWF0ZSBhIGNvbnNlcnZhdGl2ZSBmaWVsZCBcIm5hbWVcIiBmcm9tIGEgaHVtYW4gbGFiZWwuXHJcblx0XHQgKiBVc2VzIHRoZSBzYW1lIGNvbnN0cmFpbnRzIGFzIHNhbml0aXplX2h0bWxfbmFtZSAobGV0dGVycy9kaWdpdHMvXy0gYW5kIGxlYWRpbmcgbGV0dGVyKS5cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG5hbWVfZnJvbV9sYWJlbChsYWJlbCkge1xyXG5cdFx0XHRjb25zdCBzID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5zYW5pdGl6ZV9odG1sX25hbWUoIFN0cmluZyggbGFiZWwgPz8gJycgKSApO1xyXG5cdFx0XHRyZXR1cm4gcy50b0xvd2VyQ2FzZSgpIHx8ICdmaWVsZCc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBdXRvLWZpbGwgZGF0YS1uYW1lIGZyb20gbGFiZWwgT05MWSBmb3IgZnJlc2hseSBkcm9wcGVkIGZpZWxkcyB0aGF0IHdlcmUgbm90IGVkaXRlZCB5ZXQuXHJcblx0XHQgKiAtIE5ldmVyIHJ1bnMgZm9yIHNlY3Rpb25zLlxyXG5cdFx0ICogLSBOZXZlciBydW5zIGZvciBsb2FkZWQvZXhpc3RpbmcgZmllbGRzLlxyXG5cdFx0ICogLSBTdG9wcyBhcyBzb29uIGFzIHVzZXIgZWRpdHMgdGhlIE5hbWUgbWFudWFsbHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlclxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgIC0gLndwYmNfYmZiX19maWVsZCBlbGVtZW50XHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxWYWxcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG1heWJlX2F1dG9uYW1lX2Zyb21fbGFiZWwoYnVpbGRlciwgZWwsIGxhYmVsVmFsKSB7XHJcblx0XHRcdGlmICggIWJ1aWxkZXIgfHwgIWVsICkgcmV0dXJuO1xyXG5cdFx0XHRpZiAoIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgYWxsb3dBdXRvID0gZWwuZGF0YXNldC5hdXRvbmFtZSA9PT0gJzEnO1xyXG5cclxuXHRcdFx0Y29uc3QgdXNlclRvdWNoZWQgPSBlbC5kYXRhc2V0Lm5hbWVfdXNlcl90b3VjaGVkID09PSAnMSc7XHJcblx0XHRcdGNvbnN0IGlzTG9hZGVkICAgID0gZWwuZGF0YXNldC53YXNfbG9hZGVkID09PSAnMSc7XHJcblxyXG5cdFx0XHRpZiAoICFhbGxvd0F1dG8gfHwgdXNlclRvdWNoZWQgfHwgaXNMb2FkZWQgKSByZXR1cm47XHJcblxyXG5cdFx0XHQvLyBPbmx5IG92ZXJyaWRlIHBsYWNlaG9sZGVyLXkgbmFtZXNcclxuXHRcdFx0Y29uc3QgUyA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemU7XHJcblxyXG5cdFx0XHRjb25zdCBiYXNlICAgPSB0aGlzLm5hbWVfZnJvbV9sYWJlbCggbGFiZWxWYWwgKTtcclxuXHRcdFx0Y29uc3QgdW5pcXVlID0gYnVpbGRlci5pZC5lbnN1cmVfdW5pcXVlX2ZpZWxkX25hbWUoIGJhc2UsIGVsICk7XHJcblx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtbmFtZScsIHVuaXF1ZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgaW5zICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICk7XHJcblx0XHRcdGNvbnN0IG5hbWVDdHJsID0gaW5zPy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtaW5zcGVjdG9yLWtleT1cIm5hbWVcIl0nICk7XHJcblx0XHRcdGlmICggbmFtZUN0cmwgJiYgJ3ZhbHVlJyBpbiBuYW1lQ3RybCAmJiBuYW1lQ3RybC52YWx1ZSAhPT0gdW5pcXVlICkgbmFtZUN0cmwudmFsdWUgPSB1bmlxdWU7XHJcblx0XHR9XHJcblxyXG5cclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBTZWxlY3RfQmFzZSAoc2hhcmVkIGJhc2UgZm9yIHNlbGVjdC1saWtlIHBhY2tzKVxyXG5cdCAqXHJcblx0ICogQHR5cGUge0NvcmUuV1BCQ19CRkJfU2VsZWN0X0Jhc2V9XHJcblx0ICovXHJcblx0Q29yZS5XUEJDX0JGQl9TZWxlY3RfQmFzZSA9IGNsYXNzIGV4dGVuZHMgQ29yZS5XUEJDX0JGQl9GaWVsZF9CYXNlIHtcclxuXHJcblx0XHRzdGF0aWMgdGVtcGxhdGVfaWQgICAgICAgICAgICA9IG51bGw7ICAgICAgICAgICAgICAgICAvLyBtYWluIHByZXZpZXcgdGVtcGxhdGUgaWRcclxuXHRcdHN0YXRpYyBvcHRpb25fcm93X3RlbXBsYXRlX2lkID0gJ3dwYmMtYmZiLWluc3BlY3Rvci1zZWxlY3Qtb3B0aW9uLXJvdyc7IC8vIHJvdyB0cGwgaWRcclxuXHRcdHN0YXRpYyBraW5kICAgICAgICAgICAgICAgICAgID0gJ3NlbGVjdCc7XHJcblx0XHRzdGF0aWMgX19yb290X3dpcmVkICAgICAgICAgICA9IGZhbHNlO1xyXG5cdFx0c3RhdGljIF9fcm9vdF9ub2RlICAgICAgICAgICAgPSBudWxsO1xyXG5cclxuXHRcdC8vIFNpbmdsZSBzb3VyY2Ugb2Ygc2VsZWN0b3JzIHVzZWQgYnkgdGhlIGluc3BlY3RvciBVSS5cclxuXHRcdHN0YXRpYyB1aSA9IHtcclxuXHRcdFx0bGlzdCAgIDogJy53cGJjX2JmYl9fb3B0aW9uc19saXN0JyxcclxuXHRcdFx0aG9sZGVyIDogJy53cGJjX2JmYl9fb3B0aW9uc19zdGF0ZVtkYXRhLWluc3BlY3Rvci1rZXk9XCJvcHRpb25zXCJdJyxcclxuXHRcdFx0cm93ICAgIDogJy53cGJjX2JmYl9fb3B0aW9uc19yb3cnLFxyXG5cdFx0XHRsYWJlbCAgOiAnLndwYmNfYmZiX19vcHQtbGFiZWwnLFxyXG5cdFx0XHR2YWx1ZSAgOiAnLndwYmNfYmZiX19vcHQtdmFsdWUnLFxyXG5cdFx0XHR0b2dnbGUgOiAnLndwYmNfYmZiX19vcHQtc2VsZWN0ZWQtY2hrJyxcclxuXHRcdFx0YWRkX2J0bjogJy5qcy1hZGQtb3B0aW9uJyxcclxuXHJcblx0XHRcdGRyYWdfaGFuZGxlICAgICAgOiAnLndwYmNfYmZiX19kcmFnLWhhbmRsZScsXHJcblx0XHRcdG11bHRpcGxlX2NoayAgICAgOiAnLmpzLW9wdC1tdWx0aXBsZVtkYXRhLWluc3BlY3Rvci1rZXk9XCJtdWx0aXBsZVwiXScsXHJcblx0XHRcdGRlZmF1bHRfdGV4dCAgICAgOiAnLmpzLWRlZmF1bHQtdmFsdWVbZGF0YS1pbnNwZWN0b3Ita2V5PVwiZGVmYXVsdF92YWx1ZVwiXScsXHJcblx0XHRcdHBsYWNlaG9sZGVyX2lucHV0OiAnLmpzLXBsYWNlaG9sZGVyW2RhdGEtaW5zcGVjdG9yLWtleT1cInBsYWNlaG9sZGVyXCJdJyxcclxuXHRcdFx0cGxhY2Vob2xkZXJfbm90ZSA6ICcuanMtcGxhY2Vob2xkZXItbm90ZScsXHJcblx0XHRcdHNpemVfaW5wdXQgICAgICAgOiAnLmluc3BlY3Rvcl9faW5wdXRbZGF0YS1pbnNwZWN0b3Ita2V5PVwic2l6ZVwiXScsXHJcblxyXG5cdFx0XHQvLyBEcm9wZG93biBtZW51IGludGVncmF0aW9uLlxyXG5cdFx0XHRtZW51X3Jvb3QgIDogJy53cGJjX3VpX2VsX19kcm9wZG93bicsXHJcblx0XHRcdG1lbnVfdG9nZ2xlOiAnW2RhdGEtdG9nZ2xlPVwid3BiY19kcm9wZG93blwiXScsXHJcblx0XHRcdG1lbnVfYWN0aW9uOiAnLnVsX2Ryb3Bkb3duX21lbnVfbGlfYWN0aW9uW2RhdGEtYWN0aW9uXScsXHJcblx0XHRcdC8vIFZhbHVlLWRpZmZlcnMgdG9nZ2xlLlxyXG5cdFx0XHR2YWx1ZV9kaWZmZXJzX2NoazogJy5qcy12YWx1ZS1kaWZmZXJzW2RhdGEtaW5zcGVjdG9yLWtleT1cInZhbHVlX2RpZmZlcnNcIl0nLFxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkIG9wdGlvbiB2YWx1ZSBmcm9tIGxhYmVsLlxyXG5cdFx0ICogLSBJZiBgZGlmZmVycyA9PT0gdHJ1ZWAgLT4gZ2VuZXJhdGUgdG9rZW4gKHNsdWctbGlrZSBtYWNoaW5lIHZhbHVlKS5cclxuXHRcdCAqIC0gSWYgYGRpZmZlcnMgPT09IGZhbHNlYCAtPiBrZWVwIGh1bWFuIHRleHQ7IGVzY2FwZSBvbmx5IGRhbmdlcm91cyBjaGFycy5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBkaWZmZXJzXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgYnVpbGRfdmFsdWVfZnJvbV9sYWJlbChsYWJlbCwgZGlmZmVycykge1xyXG5cdFx0XHRjb25zdCBTID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZTtcclxuXHRcdFx0aWYgKCBkaWZmZXJzICkge1xyXG5cdFx0XHRcdHJldHVybiAoUyAmJiB0eXBlb2YgUy50b190b2tlbiA9PT0gJ2Z1bmN0aW9uJylcclxuXHRcdFx0XHRcdD8gUy50b190b2tlbiggU3RyaW5nKCBsYWJlbCB8fCAnJyApIClcclxuXHRcdFx0XHRcdDogU3RyaW5nKCBsYWJlbCB8fCAnJyApLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIC9cXHMrL2csICdfJyApLnJlcGxhY2UoIC9bXlxcdy1dL2csICcnICk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gc2luZ2xlLWlucHV0IG1vZGU6IGtlZXAgaHVtYW4gdGV4dDsgdGVtcGxhdGUgd2lsbCBlc2NhcGUgc2FmZWx5LlxyXG5cdFx0XHRyZXR1cm4gU3RyaW5nKCBsYWJlbCA9PSBudWxsID8gJycgOiBsYWJlbCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSXMgdGhlIOKAnHZhbHVlIGRpZmZlcnMgZnJvbSBsYWJlbOKAnSB0b2dnbGUgZW5hYmxlZD9cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhbmVsXHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGlzX3ZhbHVlX2RpZmZlcnNfZW5hYmxlZChwYW5lbCkge1xyXG5cdFx0XHRjb25zdCBjaGsgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS52YWx1ZV9kaWZmZXJzX2NoayApO1xyXG5cdFx0XHRyZXR1cm4gISEoY2hrICYmIGNoay5jaGVja2VkKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuc3VyZSB2aXNpYmlsaXR5L2VuYWJsZWQgc3RhdGUgb2YgVmFsdWUgaW5wdXRzIGJhc2VkIG9uIHRoZSB0b2dnbGUuXHJcblx0XHQgKiBXaGVuIGRpc2FibGVkIC0+IGhpZGUgVmFsdWUgaW5wdXRzIGFuZCBrZWVwIHRoZW0gbWlycm9yZWQgZnJvbSBMYWJlbC5cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhbmVsXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkocGFuZWwpIHtcclxuXHRcdFx0Y29uc3QgZGlmZmVycyA9IHRoaXMuaXNfdmFsdWVfZGlmZmVyc19lbmFibGVkKCBwYW5lbCApO1xyXG5cdFx0XHRjb25zdCByb3dzICAgID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMudWkucm93ICkgfHwgW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRcdGNvbnN0IHIgICAgICA9IHJvd3NbaV07XHJcblx0XHRcdFx0Y29uc3QgbGJsX2luID0gci5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLmxhYmVsICk7XHJcblx0XHRcdFx0Y29uc3QgdmFsX2luID0gci5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLnZhbHVlICk7XHJcblx0XHRcdFx0aWYgKCAhdmFsX2luICkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdGlmICggZGlmZmVycyApIHtcclxuXHRcdFx0XHRcdC8vIFJlLWVuYWJsZSAmIHNob3cgdmFsdWUgaW5wdXRcclxuXHRcdFx0XHRcdHZhbF9pbi5yZW1vdmVBdHRyaWJ1dGUoICdkaXNhYmxlZCcgKTtcclxuXHRcdFx0XHRcdHZhbF9pbi5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcblxyXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIGNhY2hlZCBjdXN0b20gdmFsdWUgYW5kIHRoZSByb3cgd2Fzbid0IGVkaXRlZCB3aGlsZSBPRkYsIHJlc3RvcmUgaXRcclxuXHRcdFx0XHRcdGNvbnN0IGhhc0NhY2hlICAgPSAhIXZhbF9pbi5kYXRhc2V0LmNhY2hlZF92YWx1ZTtcclxuXHRcdFx0XHRcdGNvbnN0IHVzZXJFZGl0ZWQgPSByLmRhdGFzZXQudmFsdWVfdXNlcl90b3VjaGVkID09PSAnMSc7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBoYXNDYWNoZSAmJiAhdXNlckVkaXRlZCApIHtcclxuXHRcdFx0XHRcdFx0dmFsX2luLnZhbHVlID0gdmFsX2luLmRhdGFzZXQuY2FjaGVkX3ZhbHVlO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggIWhhc0NhY2hlICkge1xyXG5cdFx0XHRcdFx0XHQvLyBObyBjYWNoZTogaWYgdmFsdWUgaXMganVzdCBhIG1pcnJvcmVkIGxhYmVsLCBvZmZlciBhIHRva2VuaXplZCBkZWZhdWx0XHJcblx0XHRcdFx0XHRcdGNvbnN0IGxibCAgICAgID0gbGJsX2luID8gbGJsX2luLnZhbHVlIDogJyc7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG1pcnJvcmVkID0gdGhpcy5idWlsZF92YWx1ZV9mcm9tX2xhYmVsKCBsYmwsIC8qZGlmZmVycz0qL2ZhbHNlICk7XHJcblx0XHRcdFx0XHRcdGlmICggdmFsX2luLnZhbHVlID09PSBtaXJyb3JlZCApIHtcclxuXHRcdFx0XHRcdFx0XHR2YWxfaW4udmFsdWUgPSB0aGlzLmJ1aWxkX3ZhbHVlX2Zyb21fbGFiZWwoIGxibCwgLypkaWZmZXJzPSovdHJ1ZSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIE9OIC0+IE9GRjogY2FjaGUgb25jZSwgdGhlbiBtaXJyb3JcclxuXHRcdFx0XHRcdGlmICggIXZhbF9pbi5kYXRhc2V0LmNhY2hlZF92YWx1ZSApIHtcclxuXHRcdFx0XHRcdFx0dmFsX2luLmRhdGFzZXQuY2FjaGVkX3ZhbHVlID0gdmFsX2luLnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y29uc3QgbGJsICAgID0gbGJsX2luID8gbGJsX2luLnZhbHVlIDogJyc7XHJcblx0XHRcdFx0XHR2YWxfaW4udmFsdWUgPSB0aGlzLmJ1aWxkX3ZhbHVlX2Zyb21fbGFiZWwoIGxibCwgLypkaWZmZXJzPSovZmFsc2UgKTtcclxuXHJcblx0XHRcdFx0XHR2YWxfaW4uc2V0QXR0cmlidXRlKCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnICk7XHJcblx0XHRcdFx0XHR2YWxfaW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0XHRcdC8vIE5PVEU6IGRvIE5PVCBtYXJrIGFzIHVzZXJfdG91Y2hlZCBoZXJlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJuIHdoZXRoZXIgdGhpcyByb3figJlzIHZhbHVlIGhhcyBiZWVuIGVkaXRlZCBieSB1c2VyLlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm93XHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGlzX3Jvd192YWx1ZV91c2VyX3RvdWNoZWQocm93KSB7XHJcblx0XHRcdHJldHVybiByb3c/LmRhdGFzZXQ/LnZhbHVlX3VzZXJfdG91Y2hlZCA9PT0gJzEnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTWFyayB0aGlzIHJvd+KAmXMgdmFsdWUgYXMgZWRpdGVkIGJ5IHVzZXIuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3dcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG1hcmtfcm93X3ZhbHVlX3VzZXJfdG91Y2hlZChyb3cpIHtcclxuXHRcdFx0aWYgKCByb3cgKSByb3cuZGF0YXNldC52YWx1ZV91c2VyX3RvdWNoZWQgPSAnMSc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbml0aWFsaXplIOKAnGZyZXNobmVzc+KAnSBmbGFncyBvbiBhIHJvdyAodmFsdWUgdW50b3VjaGVkKS5cclxuXHRcdCAqIENhbGwgb24gY3JlYXRpb24vYXBwZW5kIG9mIHJvd3MuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3dcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGluaXRfcm93X2ZyZXNoX2ZsYWdzKHJvdykge1xyXG5cdFx0XHRpZiAoIHJvdyApIHtcclxuXHRcdFx0XHRpZiAoICFyb3cuZGF0YXNldC52YWx1ZV91c2VyX3RvdWNoZWQgKSB7XHJcblx0XHRcdFx0XHRyb3cuZGF0YXNldC52YWx1ZV91c2VyX3RvdWNoZWQgPSAnMCc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLSBkZWZhdWx0cyAocGFja3MgY2FuIG92ZXJyaWRlKSAtLS0tXHJcblx0XHRzdGF0aWMgZ2V0X2RlZmF1bHRzKCkge1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHR5cGUgICAgICAgICA6IHRoaXMua2luZCxcclxuXHRcdFx0XHRsYWJlbCAgICAgICAgOiAnU2VsZWN0JyxcclxuXHRcdFx0XHRuYW1lICAgICAgICAgOiAnJyxcclxuXHRcdFx0XHRodG1sX2lkICAgICAgOiAnJyxcclxuXHRcdFx0XHRwbGFjZWhvbGRlciAgOiAnLS0tIFNlbGVjdCAtLS0nLFxyXG5cdFx0XHRcdHJlcXVpcmVkICAgICA6IGZhbHNlLFxyXG5cdFx0XHRcdG11bHRpcGxlICAgICA6IGZhbHNlLFxyXG5cdFx0XHRcdHNpemUgICAgICAgICA6IG51bGwsXHJcblx0XHRcdFx0Y3NzY2xhc3MgICAgIDogJycsXHJcblx0XHRcdFx0aGVscCAgICAgICAgIDogJycsXHJcblx0XHRcdFx0ZGVmYXVsdF92YWx1ZTogJycsXHJcblx0XHRcdFx0b3B0aW9ucyAgICAgIDogW1xyXG5cdFx0XHRcdFx0eyBsYWJlbDogJ09wdGlvbiAxJywgdmFsdWU6ICdPcHRpb24gMScsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRcdFx0eyBsYWJlbDogJ09wdGlvbiAyJywgdmFsdWU6ICdPcHRpb24gMicsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRcdFx0eyBsYWJlbDogJ09wdGlvbiAzJywgdmFsdWU6ICdPcHRpb24gMycsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRcdFx0eyBsYWJlbDogJ09wdGlvbiA0JywgdmFsdWU6ICdPcHRpb24gNCcsIHNlbGVjdGVkOiBmYWxzZSB9XHJcblx0XHRcdFx0XSxcclxuXHRcdFx0XHRtaW5fd2lkdGggICAgOiAnMjQwcHgnXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLSBwcmV2aWV3IHJlbmRlciAoaWRlbXBvdGVudCkgLS0tLVxyXG5cdFx0c3RhdGljIHJlbmRlcihlbCwgZGF0YSwgY3R4KSB7XHJcblx0XHRcdGlmICggIWVsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgZCA9IHRoaXMubm9ybWFsaXplX2RhdGEoIGRhdGEgKTtcclxuXHJcblx0XHRcdGlmICggZC5taW5fd2lkdGggIT0gbnVsbCApIHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0Lm1pbl93aWR0aCA9IFN0cmluZyggZC5taW5fd2lkdGggKTtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0ZWwuc3R5bGUuc2V0UHJvcGVydHkoICctLXdwYmMtY29sLW1pbicsIFN0cmluZyggZC5taW5fd2lkdGggKSApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGQuaHRtbF9pZCAhPSBudWxsICkgZWwuZGF0YXNldC5odG1sX2lkID0gU3RyaW5nKCBkLmh0bWxfaWQgfHwgJycgKTtcclxuXHRcdFx0aWYgKCBkLmNzc2NsYXNzICE9IG51bGwgKSBlbC5kYXRhc2V0LmNzc2NsYXNzID0gU3RyaW5nKCBkLmNzc2NsYXNzIHx8ICcnICk7XHJcblx0XHRcdGlmICggZC5wbGFjZWhvbGRlciAhPSBudWxsICkgZWwuZGF0YXNldC5wbGFjZWhvbGRlciA9IFN0cmluZyggZC5wbGFjZWhvbGRlciB8fCAnJyApO1xyXG5cclxuXHRcdFx0Y29uc3QgdHBsID0gdGhpcy5nZXRfdGVtcGxhdGUoIHRoaXMudGVtcGxhdGVfaWQgKTtcclxuXHRcdFx0aWYgKCB0eXBlb2YgdHBsICE9PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2Vycm9yXCIgcm9sZT1cImFsZXJ0XCI+VGVtcGxhdGUgbm90IGZvdW5kOiAnICsgdGhpcy50ZW1wbGF0ZV9pZCArICcuPC9kaXY+JztcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0ZWwuaW5uZXJIVE1MID0gdHBsKCBkICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdHdpbmRvdy5fd3BiYz8uZGV2Py5lcnJvcj8uKCAnU2VsZWN0X0Jhc2UucmVuZGVyJywgZSApO1xyXG5cdFx0XHRcdGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2Vycm9yXCIgcm9sZT1cImFsZXJ0XCI+RXJyb3IgcmVuZGVyaW5nIGZpZWxkIHByZXZpZXcuPC9kaXY+JztcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGVsLmRhdGFzZXQudHlwZSA9IGQudHlwZSB8fCB0aGlzLmtpbmQ7XHJcblx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtbGFiZWwnLCAoZC5sYWJlbCAhPSBudWxsID8gU3RyaW5nKCBkLmxhYmVsICkgOiAnJykgKTtcclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Q29yZS5VST8uV1BCQ19CRkJfT3ZlcmxheT8uZW5zdXJlPy4oIGN0eD8uYnVpbGRlciwgZWwgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggIWVsLmRhdGFzZXQub3B0aW9ucyAmJiBBcnJheS5pc0FycmF5KCBkLm9wdGlvbnMgKSAmJiBkLm9wdGlvbnMubGVuZ3RoICkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRlbC5kYXRhc2V0Lm9wdGlvbnMgPSBKU09OLnN0cmluZ2lmeSggZC5vcHRpb25zICk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLSBkcm9wIHNlZWRpbmcgKG9wdGlvbnMgKyBwbGFjZWhvbGRlcikgLS0tLVxyXG5cdFx0c3RhdGljIG9uX2ZpZWxkX2Ryb3AoZGF0YSwgZWwsIG1ldGEpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRzdXBlci5vbl9maWVsZF9kcm9wPy4oIGRhdGEsIGVsLCBtZXRhICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBpc19kcm9wID0gKG1ldGEgJiYgbWV0YS5jb250ZXh0ID09PSAnZHJvcCcpO1xyXG5cclxuXHRcdFx0aWYgKCBpc19kcm9wICkge1xyXG5cdFx0XHRcdGlmICggIUFycmF5LmlzQXJyYXkoIGRhdGEub3B0aW9ucyApIHx8ICFkYXRhLm9wdGlvbnMubGVuZ3RoICkge1xyXG5cdFx0XHRcdFx0Y29uc3Qgb3B0cyAgID0gKHRoaXMuZ2V0X2RlZmF1bHRzKCkub3B0aW9ucyB8fCBbXSkubWFwKCAobykgPT4gKHtcclxuXHRcdFx0XHRcdFx0bGFiZWwgICA6IG8ubGFiZWwsXHJcblx0XHRcdFx0XHRcdHZhbHVlICAgOiBvLnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRzZWxlY3RlZDogISFvLnNlbGVjdGVkXHJcblx0XHRcdFx0XHR9KSApO1xyXG5cdFx0XHRcdFx0ZGF0YS5vcHRpb25zID0gb3B0cztcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdGVsLmRhdGFzZXQub3B0aW9ucyA9IEpTT04uc3RyaW5naWZ5KCBvcHRzICk7XHJcblx0XHRcdFx0XHRcdGVsLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHsgYnViYmxlczogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRkZXRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0a2V5ICA6ICdvcHRpb25zJyxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBvcHRzXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9ICkgKTtcclxuXHRcdFx0XHRcdFx0Q29yZS5TdHJ1Y3R1cmU/LnVwZGF0ZV9maWVsZF9wcm9wPy4oIGVsLCAnb3B0aW9ucycsIG9wdHMgKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgcGggPSAoZGF0YS5wbGFjZWhvbGRlciA/PyAnJykudG9TdHJpbmcoKS50cmltKCk7XHJcblx0XHRcdFx0aWYgKCAhcGggKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkZmx0ICAgICAgID0gdGhpcy5nZXRfZGVmYXVsdHMoKS5wbGFjZWhvbGRlciB8fCAnLS0tIFNlbGVjdCAtLS0nO1xyXG5cdFx0XHRcdFx0ZGF0YS5wbGFjZWhvbGRlciA9IGRmbHQ7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRlbC5kYXRhc2V0LnBsYWNlaG9sZGVyID0gU3RyaW5nKCBkZmx0ICk7XHJcblx0XHRcdFx0XHRcdGVsLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHsgYnViYmxlczogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRkZXRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0a2V5ICA6ICdwbGFjZWhvbGRlcicsXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZGZsdFxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSApICk7XHJcblx0XHRcdFx0XHRcdENvcmUuU3RydWN0dXJlPy51cGRhdGVfZmllbGRfcHJvcD8uKCBlbCwgJ3BsYWNlaG9sZGVyJywgZGZsdCApO1xyXG5cdFx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblx0XHQvLyBJbnNwZWN0b3IgaGVscGVycyAoc25ha2VfY2FzZSlcclxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdFx0c3RhdGljIGdldF9wYW5lbF9yb290KGVsKSB7XHJcblx0XHRcdHJldHVybiBlbD8uY2xvc2VzdD8uKCAnLndwYmNfYmZiX19pbnNwZWN0b3JfX2JvZHknICkgfHwgZWw/LmNsb3Nlc3Q/LiggJy53cGJjX2JmYl9faW5zcGVjdG9yJyApIHx8IG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGdldF9saXN0KHBhbmVsKSB7XHJcblx0XHRcdHJldHVybiBwYW5lbCA/IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoIHRoaXMudWkubGlzdCApIDogbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRzdGF0aWMgZ2V0X2hvbGRlcihwYW5lbCkge1xyXG5cdFx0XHRyZXR1cm4gcGFuZWwgPyBwYW5lbC5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLmhvbGRlciApIDogbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRzdGF0aWMgbWFrZV91aWQoKSB7XHJcblx0XHRcdHJldHVybiAnd3BiY19pbnNfYXV0b19vcHRfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDEwICk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGFwcGVuZF9yb3cocGFuZWwsIGRhdGEpIHtcclxuXHRcdFx0Y29uc3QgbGlzdCA9IHRoaXMuZ2V0X2xpc3QoIHBhbmVsICk7XHJcblx0XHRcdGlmICggIWxpc3QgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBpZHggID0gbGlzdC5jaGlsZHJlbi5sZW5ndGg7XHJcblx0XHRcdGNvbnN0IHJvd2QgPSBPYmplY3QuYXNzaWduKCB7IGxhYmVsOiAnJywgdmFsdWU6ICcnLCBzZWxlY3RlZDogZmFsc2UsIGluZGV4OiBpZHggfSwgKGRhdGEgfHwge30pICk7XHJcblx0XHRcdGlmICggIXJvd2QudWlkICkgcm93ZC51aWQgPSB0aGlzLm1ha2VfdWlkKCk7XHJcblxyXG5cdFx0XHRjb25zdCB0cGxfaWQgPSB0aGlzLm9wdGlvbl9yb3dfdGVtcGxhdGVfaWQ7XHJcblx0XHRcdGNvbnN0IHRwbCAgICA9ICh3aW5kb3cud3AgJiYgd3AudGVtcGxhdGUpID8gd3AudGVtcGxhdGUoIHRwbF9pZCApIDogbnVsbDtcclxuXHRcdFx0Y29uc3QgaHRtbCAgID0gdHBsID8gdHBsKCByb3dkICkgOiBudWxsO1xyXG5cclxuXHRcdFx0Ly8gSW4gYXBwZW5kX3JvdygpIC0+IGZhbGxiYWNrIEhUTUwuXHJcblx0XHRcdGNvbnN0IHdyYXAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0d3JhcC5pbm5lckhUTUwgPSBodG1sIHx8IChcclxuXHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmNfYmZiX19vcHRpb25zX3Jvd1wiIGRhdGEtaW5kZXg9XCInICsgKHJvd2QuaW5kZXggfHwgMCkgKyAnXCI+JyArXHJcblx0XHRcdFx0XHQnPHNwYW4gY2xhc3M9XCJ3cGJjX2JmYl9fZHJhZy1oYW5kbGVcIj48c3BhbiBjbGFzcz1cIndwYmNfaWNuX2RyYWdfaW5kaWNhdG9yXCI+PC9zcGFuPjwvc3Bhbj4nICtcclxuXHRcdFx0XHRcdCc8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cIndwYmNfYmZiX19vcHQtbGFiZWxcIiBwbGFjZWhvbGRlcj1cIkxhYmVsXCIgdmFsdWU9XCInICsgKHJvd2QubGFiZWwgfHwgJycpICsgJ1wiPicgK1xyXG5cdFx0XHRcdFx0JzxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwid3BiY19iZmJfX29wdC12YWx1ZVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiB2YWx1ZT1cIicgKyAocm93ZC52YWx1ZSB8fCAnJykgKyAnXCI+JyArXHJcblx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmNfYmZiX19vcHQtc2VsZWN0ZWRcIj4nICtcclxuXHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJpbnNwZWN0b3JfX2NvbnRyb2wgd3BiY191aV9fdG9nZ2xlXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cIndwYmNfYmZiX19vcHQtc2VsZWN0ZWQtY2hrIGluc3BlY3Rvcl9faW5wdXRcIiBpZD1cIicgKyByb3dkLnVpZCArICdcIiByb2xlPVwic3dpdGNoXCIgJyArIChyb3dkLnNlbGVjdGVkID8gJ2NoZWNrZWQgYXJpYS1jaGVja2VkPVwidHJ1ZVwiJyA6ICdhcmlhLWNoZWNrZWQ9XCJmYWxzZVwiJykgKyAnPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8bGFiZWwgY2xhc3M9XCJ3cGJjX3VpX190b2dnbGVfaWNvbl9yYWRpb1wiIGZvcj1cIicgKyByb3dkLnVpZCArICdcIj48L2xhYmVsPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8bGFiZWwgY2xhc3M9XCJ3cGJjX3VpX190b2dnbGVfbGFiZWxcIiBmb3I9XCInICsgcm93ZC51aWQgKyAnXCI+RGVmYXVsdDwvbGFiZWw+JyArXHJcblx0XHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHRcdC8vIDMtZG90IGRyb3Bkb3duICh1c2VzIGV4aXN0aW5nIHBsdWdpbiBkcm9wZG93biBKUykuXHJcblx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmNfdWlfZWwgd3BiY191aV9lbF9jb250YWluZXIgd3BiY191aV9lbF9fZHJvcGRvd25cIj4nICtcclxuXHRcdFx0XHRcdFx0JzxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBkYXRhLXRvZ2dsZT1cIndwYmNfZHJvcGRvd25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBjbGFzcz1cInVsX2Ryb3Bkb3duX21lbnVfdG9nZ2xlXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fbW9yZV92ZXJ0XCI+PC9pPicgK1xyXG5cdFx0XHRcdFx0XHQnPC9hPicgK1xyXG5cdFx0XHRcdFx0XHQnPHVsIGNsYXNzPVwidWxfZHJvcGRvd25fbWVudVwiIHJvbGU9XCJtZW51XCIgc3R5bGU9XCJyaWdodDowcHg7IGxlZnQ6YXV0bztcIj4nICtcclxuXHRcdFx0XHRcdFx0XHQnPGxpPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0JzxhIGNsYXNzPVwidWxfZHJvcGRvd25fbWVudV9saV9hY3Rpb25cIiBkYXRhLWFjdGlvbj1cImFkZF9hZnRlclwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIj4nICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0J0FkZCBOZXcnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fYWRkX2NpcmNsZVwiPjwvaT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8L2E+JyArXHJcblx0XHRcdFx0XHRcdFx0JzwvbGk+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxsaT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8YSBjbGFzcz1cInVsX2Ryb3Bkb3duX21lbnVfbGlfYWN0aW9uXCIgZGF0YS1hY3Rpb249XCJkdXBsaWNhdGVcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdEdXBsaWNhdGUnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fY29udGVudF9jb3B5XCI+PC9pPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0JzwvYT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9saT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPGxpIGNsYXNzPVwiZGl2aWRlclwiPjwvbGk+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxsaT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8YSBjbGFzcz1cInVsX2Ryb3Bkb3duX21lbnVfbGlfYWN0aW9uXCIgZGF0YS1hY3Rpb249XCJyZW1vdmVcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdSZW1vdmUnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fZGVsZXRlX291dGxpbmVcIj48L2k+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC9hPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8L2xpPicgK1xyXG5cdFx0XHRcdFx0XHQnPC91bD4nICtcclxuXHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHQnPC9kaXY+J1xyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZSA9IHdyYXAuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcblx0XHRcdCBpZiAoISBub2RlKSB7XHJcblx0XHRcdFx0IHJldHVybjtcclxuXHRcdFx0IH1cclxuXHRcdFx0Ly8gcHJlLWhpZGUgVmFsdWUgaW5wdXQgaWYgdG9nZ2xlIGlzIE9GRiAqKmJlZm9yZSoqIGFwcGVuZGluZy5cclxuXHRcdFx0Y29uc3QgZGlmZmVycyA9IHRoaXMuaXNfdmFsdWVfZGlmZmVyc19lbmFibGVkKCBwYW5lbCApO1xyXG5cdFx0XHRjb25zdCB2YWxJbiAgID0gbm9kZS5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLnZhbHVlICk7XHJcblx0XHRcdGNvbnN0IGxibEluICAgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoIHRoaXMudWkubGFiZWwgKTtcclxuXHJcblx0XHRcdGlmICggIWRpZmZlcnMgJiYgdmFsSW4gKSB7XHJcblx0XHRcdFx0aWYgKCAhdmFsSW4uZGF0YXNldC5jYWNoZWRfdmFsdWUgKSB7XHJcblx0XHRcdFx0XHR2YWxJbi5kYXRhc2V0LmNhY2hlZF92YWx1ZSA9IHZhbEluLnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIGxibEluICkgdmFsSW4udmFsdWUgPSB0aGlzLmJ1aWxkX3ZhbHVlX2Zyb21fbGFiZWwoIGxibEluLnZhbHVlLCBmYWxzZSApO1xyXG5cdFx0XHRcdHZhbEluLnNldEF0dHJpYnV0ZSggJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyApO1xyXG5cdFx0XHRcdHZhbEluLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHR0aGlzLmluaXRfcm93X2ZyZXNoX2ZsYWdzKCBub2RlICk7XHJcblx0XHRcdGxpc3QuYXBwZW5kQ2hpbGQoIG5vZGUgKTtcclxuXHJcblx0XHRcdC8vIEtlZXAgeW91ciBleGlzdGluZyBwb3N0LWFwcGVuZCBzeW5jIGFzIGEgc2FmZXR5IG5ldFxyXG5cdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGNsb3NlX2Ryb3Bkb3duKGFuY2hvcl9lbCkge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHZhciByb290ID0gYW5jaG9yX2VsPy5jbG9zZXN0Py4oIHRoaXMudWkubWVudV9yb290ICk7XHJcblx0XHRcdFx0aWYgKCByb290ICkge1xyXG5cdFx0XHRcdFx0Ly8gSWYgeW91ciBkcm9wZG93biB0b2dnbGVyIHRvZ2dsZXMgYSBjbGFzcyBsaWtlICdvcGVuJywgY2xvc2UgaXQuXHJcblx0XHRcdFx0XHRyb290LmNsYXNzTGlzdC5yZW1vdmUoICdvcGVuJyApO1xyXG5cdFx0XHRcdFx0Ly8gT3IgaWYgaXQgcmVsaWVzIG9uIGFyaWEtZXhwYW5kZWQgb24gdGhlIHRvZ2dsZS5cclxuXHRcdFx0XHRcdHZhciB0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLm1lbnVfdG9nZ2xlICk7XHJcblx0XHRcdFx0XHRpZiAoIHQgKSB7XHJcblx0XHRcdFx0XHRcdHQuc2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcsICdmYWxzZScgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkgeyB9XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGluc2VydF9hZnRlcihuZXdfbm9kZSwgcmVmX25vZGUpIHtcclxuXHRcdFx0aWYgKCByZWZfbm9kZT8ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRpZiAoIHJlZl9ub2RlLm5leHRTaWJsaW5nICkge1xyXG5cdFx0XHRcdFx0cmVmX25vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIG5ld19ub2RlLCByZWZfbm9kZS5uZXh0U2libGluZyApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZWZfbm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKCBuZXdfbm9kZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRpYyBjb21taXRfb3B0aW9ucyhwYW5lbCkge1xyXG5cdFx0XHRjb25zdCBsaXN0ICAgPSB0aGlzLmdldF9saXN0KCBwYW5lbCApO1xyXG5cdFx0XHRjb25zdCBob2xkZXIgPSB0aGlzLmdldF9ob2xkZXIoIHBhbmVsICk7XHJcblx0XHRcdGlmICggIWxpc3QgfHwgIWhvbGRlciApIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGRpZmZlcnMgPSB0aGlzLmlzX3ZhbHVlX2RpZmZlcnNfZW5hYmxlZCggcGFuZWwgKTtcclxuXHJcblx0XHRcdGNvbnN0IHJvd3MgICAgPSBsaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMudWkucm93ICk7XHJcblx0XHRcdGNvbnN0IG9wdGlvbnMgPSBbXTtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRjb25zdCByICAgICAgPSByb3dzW2ldO1xyXG5cdFx0XHRcdGNvbnN0IGxibF9pbiA9IHIucXVlcnlTZWxlY3RvciggdGhpcy51aS5sYWJlbCApO1xyXG5cdFx0XHRcdGNvbnN0IHZhbF9pbiA9IHIucXVlcnlTZWxlY3RvciggdGhpcy51aS52YWx1ZSApO1xyXG5cdFx0XHRcdGNvbnN0IGNoayAgICA9IHIucXVlcnlTZWxlY3RvciggdGhpcy51aS50b2dnbGUgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbGJsID0gKGxibF9pbiAmJiBsYmxfaW4udmFsdWUpIHx8ICcnO1xyXG5cdFx0XHRcdGxldCB2YWwgICA9ICh2YWxfaW4gJiYgdmFsX2luLnZhbHVlKSB8fCAnJztcclxuXHJcblx0XHRcdFx0Ly8gSWYgc2luZ2xlLWlucHV0IG1vZGUgLT4gaGFyZCBtaXJyb3IgdG8gbGFiZWwuXHJcblx0XHRcdFx0aWYgKCAhIGRpZmZlcnMgKSB7XHJcblx0XHRcdFx0XHQvLyBzaW5nbGUtaW5wdXQgbW9kZTogbWlycm9yIExhYmVsLCBtaW5pbWFsIGVzY2FwaW5nIChubyBzbHVnKS5cclxuXHRcdFx0XHRcdHZhbCA9IHRoaXMuYnVpbGRfdmFsdWVfZnJvbV9sYWJlbCggbGJsLCAvKmRpZmZlcnM9Ki9mYWxzZSApO1xyXG5cdFx0XHRcdFx0aWYgKCB2YWxfaW4gKSB7XHJcblx0XHRcdFx0XHRcdHZhbF9pbi52YWx1ZSA9IHZhbDsgICAvLyBrZWVwIGhpZGRlbiBpbnB1dCBpbiBzeW5jIGZvciBhbnkgcHJldmlld3MvZGVidWcuXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBzZWwgPSAhIShjaGsgJiYgY2hrLmNoZWNrZWQpO1xyXG5cdFx0XHRcdG9wdGlvbnMucHVzaCggeyBsYWJlbDogbGJsLCB2YWx1ZTogdmFsLCBzZWxlY3RlZDogc2VsIH0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRob2xkZXIudmFsdWUgPSBKU09OLnN0cmluZ2lmeSggb3B0aW9ucyApO1xyXG5cdFx0XHRcdGhvbGRlci5kaXNwYXRjaEV2ZW50KCBuZXcgRXZlbnQoICdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdFx0XHRob2xkZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0gKSApO1xyXG5cdFx0XHRcdHBhbmVsLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHtcclxuXHRcdFx0XHRcdGJ1YmJsZXM6IHRydWUsIGRldGFpbDoge1xyXG5cdFx0XHRcdFx0XHRrZXk6ICdvcHRpb25zJywgdmFsdWU6IG9wdGlvbnNcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICkgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc3luY19kZWZhdWx0X3ZhbHVlX2xvY2soIHBhbmVsICk7XHJcblx0XHRcdHRoaXMuc3luY19wbGFjZWhvbGRlcl9sb2NrKCBwYW5lbCApO1xyXG5cclxuXHRcdFx0Ly8gTWlycm9yIHRvIHRoZSBzZWxlY3RlZCBmaWVsZCBlbGVtZW50IHNvIGNhbnZhcy9leHBvcnQgc2VlcyBjdXJyZW50IG9wdGlvbnMgaW1tZWRpYXRlbHkuXHJcblx0XHRcdGNvbnN0IGZpZWxkID0gcGFuZWwuX19zZWxlY3RiYXNlX2ZpZWxkXHJcblx0XHRcdFx0fHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fZmllbGQuaXMtc2VsZWN0ZWQsIC53cGJjX2JmYl9fZmllbGQtLXNlbGVjdGVkJyApO1xyXG5cdFx0XHRpZiAoIGZpZWxkICkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRmaWVsZC5kYXRhc2V0Lm9wdGlvbnMgPSBKU09OLnN0cmluZ2lmeSggb3B0aW9ucyApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRDb3JlLlN0cnVjdHVyZT8udXBkYXRlX2ZpZWxkX3Byb3A/LiggZmllbGQsICdvcHRpb25zJywgb3B0aW9ucyApO1xyXG5cdFx0XHRcdGZpZWxkLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHtcclxuXHRcdFx0XHRcdGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBrZXk6ICdvcHRpb25zJywgdmFsdWU6IG9wdGlvbnMgfVxyXG5cdFx0XHRcdH0gKSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdHN0YXRpYyBlbnN1cmVfc29ydGFibGUocGFuZWwpIHtcclxuXHJcblx0XHRcdGNvbnN0IGxpc3QgPSB0aGlzLmdldF9saXN0KCBwYW5lbCApO1xyXG5cdFx0XHRpZiAoICEgbGlzdCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmcgPSB3aW5kb3cuU29ydGFibGU/LmdldD8uKCBsaXN0ICk7XHJcblx0XHRcdFx0aWYgKCBleGlzdGluZyApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1aWxkZXIgPSB3aW5kb3cud3BiY19iZmJfYXBpPy5nZXRfYnVpbGRlcj8uKCkgfHwgd2luZG93LndwYmNfYmZiIHx8IG51bGw7XHJcblxyXG5cdFx0XHRcdC8vIFByZWZlciB0aGUgc2hhcmVkIFNvcnRhYmxlIG1hbmFnZXIgc28gdGhlIHNpZGViYXIgbGlzdCB1c2VzXHJcblx0XHRcdFx0Ly8gdGhlIGRlZGljYXRlZCBcInNpbXBsZV9saXN0XCIgY29uZmlnIGluc3RlYWQgb2YgdGhlIGNhbnZhcyBjb25maWcuXHJcblx0XHRcdFx0aWYgKCBidWlsZGVyICYmIGJ1aWxkZXIuc29ydGFibGUgJiYgdHlwZW9mIGJ1aWxkZXIuc29ydGFibGUuZW5zdXJlID09PSAnZnVuY3Rpb24nICkge1xyXG5cclxuXHRcdFx0XHRcdGJ1aWxkZXIuc29ydGFibGUuZW5zdXJlKFxyXG5cdFx0XHRcdFx0XHRsaXN0LFxyXG5cdFx0XHRcdFx0XHQnY2FudmFzJyxcclxuXHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdHNvcnRhYmxlX2tpbmQgICAgIDogJ3NpbXBsZV9saXN0JyxcclxuXHRcdFx0XHRcdFx0XHRoYW5kbGVfc2VsZWN0b3IgICA6IHRoaXMudWkuZHJhZ19oYW5kbGUsXHJcblx0XHRcdFx0XHRcdFx0ZHJhZ2dhYmxlX3NlbGVjdG9yOiB0aGlzLnVpLnJvdyxcclxuXHRcdFx0XHRcdFx0XHRvblVwZGF0ZSAgICAgICAgICA6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY29tbWl0X29wdGlvbnMoIHBhbmVsICk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB3aW5kb3cuU29ydGFibGU/LmNyZWF0ZSApIHtcclxuXHRcdFx0XHRcdC8vIEZhbGxiYWNrIGlmIGJ1aWxkZXIgaXMgbm90IHJlYWR5IGZvciBzb21lIHJlYXNvbi5cclxuXHRcdFx0XHRcdHdpbmRvdy5Tb3J0YWJsZS5jcmVhdGUoXHJcblx0XHRcdFx0XHRcdGxpc3QsXHJcblx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRoYW5kbGUgICAgICAgICAgIDogdGhpcy51aS5kcmFnX2hhbmRsZSxcclxuXHRcdFx0XHRcdFx0XHRkcmFnZ2FibGUgICAgICAgIDogdGhpcy51aS5yb3csXHJcblx0XHRcdFx0XHRcdFx0YW5pbWF0aW9uICAgICAgICA6IDEyMCxcclxuXHRcdFx0XHRcdFx0XHRmb3JjZUZhbGxiYWNrICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRmYWxsYmFja09uQm9keSAgIDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0ZmFsbGJhY2tUb2xlcmFuY2U6IDgsXHJcblx0XHRcdFx0XHRcdFx0cmVtb3ZlQ2xvbmVPbkhpZGU6IHRydWUsXHJcblx0XHRcdFx0XHRcdFx0b25VcGRhdGUgICAgICAgICA6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY29tbWl0X29wdGlvbnMoIHBhbmVsICk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bGlzdC5kYXRhc2V0LnNvcnRhYmxlX2luaXQgPSAnMSc7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHR3aW5kb3cuX3dwYmM/LmRldj8uZXJyb3I/LiggJ1NlbGVjdF9CYXNlLmVuc3VyZV9zb3J0YWJsZScsIGUgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRpYyByZWJ1aWxkX2lmX2VtcHR5KHBhbmVsKSB7XHJcblx0XHRcdGNvbnN0IGxpc3QgICA9IHRoaXMuZ2V0X2xpc3QoIHBhbmVsICk7XHJcblx0XHRcdGNvbnN0IGhvbGRlciA9IHRoaXMuZ2V0X2hvbGRlciggcGFuZWwgKTtcclxuXHRcdFx0aWYgKCAhbGlzdCB8fCAhaG9sZGVyIHx8IGxpc3QuY2hpbGRyZW4ubGVuZ3RoICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0bGV0IGRhdGEgPSBbXTtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRkYXRhID0gSlNPTi5wYXJzZSggaG9sZGVyLnZhbHVlIHx8ICdbXScgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0ZGF0YSA9IFtdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICFBcnJheS5pc0FycmF5KCBkYXRhICkgfHwgIWRhdGEubGVuZ3RoICkge1xyXG5cdFx0XHRcdGRhdGEgPSAodGhpcy5nZXRfZGVmYXVsdHMoKS5vcHRpb25zIHx8IFtdKS5zbGljZSggMCApO1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRob2xkZXIudmFsdWUgPSBKU09OLnN0cmluZ2lmeSggZGF0YSApO1xyXG5cdFx0XHRcdFx0aG9sZGVyLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0gKSApO1xyXG5cdFx0XHRcdFx0aG9sZGVyLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKysgKSB7XHJcblx0XHRcdFx0dGhpcy5hcHBlbmRfcm93KCBwYW5lbCwge1xyXG5cdFx0XHRcdFx0bGFiZWwgICA6IGRhdGFbaV0/LmxhYmVsIHx8ICcnLFxyXG5cdFx0XHRcdFx0dmFsdWUgICA6IGRhdGFbaV0/LnZhbHVlIHx8ICcnLFxyXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6ICEhZGF0YVtpXT8uc2VsZWN0ZWQsXHJcblx0XHRcdFx0XHRpbmRleCAgIDogaSxcclxuXHRcdFx0XHRcdHVpZCAgICAgOiB0aGlzLm1ha2VfdWlkKClcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc3luY19kZWZhdWx0X3ZhbHVlX2xvY2soIHBhbmVsICk7XHJcblx0XHRcdHRoaXMuc3luY19wbGFjZWhvbGRlcl9sb2NrKCBwYW5lbCApO1xyXG5cdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGhhc19yb3dfZGVmYXVsdHMocGFuZWwpIHtcclxuXHRcdFx0Y29uc3QgY2hlY2tzID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMudWkudG9nZ2xlICk7XHJcblx0XHRcdGlmICggIWNoZWNrcz8ubGVuZ3RoICkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKysgKSBpZiAoIGNoZWNrc1tpXS5jaGVja2VkICkgcmV0dXJuIHRydWU7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRzdGF0aWMgaXNfbXVsdGlwbGVfZW5hYmxlZChwYW5lbCkge1xyXG5cdFx0XHRjb25zdCBjaGsgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS5tdWx0aXBsZV9jaGsgKTtcclxuXHRcdFx0cmV0dXJuICEhKGNoayAmJiBjaGsuY2hlY2tlZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGhhc190ZXh0X2RlZmF1bHRfdmFsdWUocGFuZWwpIHtcclxuXHRcdFx0Y29uc3QgZHYgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS5kZWZhdWx0X3RleHQgKTtcclxuXHRcdFx0cmV0dXJuICEhKGR2ICYmIFN0cmluZyggZHYudmFsdWUgfHwgJycgKS50cmltKCkubGVuZ3RoKTtcclxuXHRcdH1cclxuXHJcblx0XHRzdGF0aWMgc3luY19kZWZhdWx0X3ZhbHVlX2xvY2socGFuZWwpIHtcclxuXHRcdFx0Y29uc3QgaW5wdXQgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS5kZWZhdWx0X3RleHQgKTtcclxuXHRcdFx0Y29uc3Qgbm90ZSAgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggJy5qcy1kZWZhdWx0LXZhbHVlLW5vdGUnICk7XHJcblx0XHRcdGlmICggIWlucHV0ICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgbG9jayAgICAgPSB0aGlzLmhhc19yb3dfZGVmYXVsdHMoIHBhbmVsICk7XHJcblx0XHRcdGlucHV0LmRpc2FibGVkID0gISFsb2NrO1xyXG5cdFx0XHRpZiAoIGxvY2sgKSB7XHJcblx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyApO1xyXG5cdFx0XHRcdGlmICggbm90ZSApIG5vdGUuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlucHV0LnJlbW92ZUF0dHJpYnV0ZSggJ2FyaWEtZGlzYWJsZWQnICk7XHJcblx0XHRcdFx0aWYgKCBub3RlICkgbm90ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIHN5bmNfcGxhY2Vob2xkZXJfbG9jayhwYW5lbCkge1xyXG5cdFx0XHRjb25zdCBpbnB1dCA9IHBhbmVsPy5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLnBsYWNlaG9sZGVyX2lucHV0ICk7XHJcblx0XHRcdGNvbnN0IG5vdGUgID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3IoIHRoaXMudWkucGxhY2Vob2xkZXJfbm90ZSApO1xyXG5cclxuXHRcdFx0Ly8gTkVXOiBjb21wdXRlIG11bHRpcGxlIGFuZCB0b2dnbGUgcm93IHZpc2liaWxpdHlcclxuXHRcdFx0Y29uc3QgaXNNdWx0aXBsZSAgICAgPSB0aGlzLmlzX211bHRpcGxlX2VuYWJsZWQoIHBhbmVsICk7XHJcblx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyUm93ID0gaW5wdXQ/LmNsb3Nlc3QoICcuaW5zcGVjdG9yX19yb3cnICkgfHwgbnVsbDtcclxuXHRcdFx0Y29uc3Qgc2l6ZUlucHV0ICAgICAgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS5zaXplX2lucHV0ICkgfHwgbnVsbDtcclxuXHRcdFx0Y29uc3Qgc2l6ZVJvdyAgICAgICAgPSBzaXplSW5wdXQ/LmNsb3Nlc3QoICcuaW5zcGVjdG9yX19yb3cnICkgfHwgbnVsbDtcclxuXHJcblx0XHRcdC8vIFNob3cgcGxhY2Vob2xkZXIgb25seSBmb3Igc2luZ2xlLXNlbGVjdDsgc2hvdyBzaXplIG9ubHkgZm9yIG11bHRpcGxlXHJcblx0XHRcdGlmICggcGxhY2Vob2xkZXJSb3cgKSBwbGFjZWhvbGRlclJvdy5zdHlsZS5kaXNwbGF5ID0gaXNNdWx0aXBsZSA/ICdub25lJyA6ICcnO1xyXG5cdFx0XHRpZiAoIHNpemVSb3cgKSBzaXplUm93LnN0eWxlLmRpc3BsYXkgPSBpc011bHRpcGxlID8gJycgOiAnbm9uZSc7XHJcblxyXG5cdFx0XHQvLyBFeGlzdGluZyBiZWhhdmlvciAoa2VlcCBhcy1pcylcclxuXHRcdFx0aWYgKCAhaW5wdXQgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBsb2NrID0gaXNNdWx0aXBsZSB8fCB0aGlzLmhhc19yb3dfZGVmYXVsdHMoIHBhbmVsICkgfHwgdGhpcy5oYXNfdGV4dF9kZWZhdWx0X3ZhbHVlKCBwYW5lbCApO1xyXG5cdFx0XHRpZiAoIG5vdGUgJiYgIW5vdGUuaWQgKSBub3RlLmlkID0gJ3dwYmNfcGxhY2Vob2xkZXJfbm90ZV8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZyggMzYgKS5zbGljZSggMiwgMTAgKTtcclxuXHJcblx0XHRcdGlucHV0LmRpc2FibGVkID0gISFsb2NrO1xyXG5cdFx0XHRpZiAoIGxvY2sgKSB7XHJcblx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyApO1xyXG5cdFx0XHRcdGlmICggbm90ZSApIHtcclxuXHRcdFx0XHRcdG5vdGUuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG5cdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCAnYXJpYS1kZXNjcmliZWRieScsIG5vdGUuaWQgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aW5wdXQucmVtb3ZlQXR0cmlidXRlKCAnYXJpYS1kaXNhYmxlZCcgKTtcclxuXHRcdFx0XHRpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoICdhcmlhLWRlc2NyaWJlZGJ5JyApO1xyXG5cdFx0XHRcdGlmICggbm90ZSApIG5vdGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRpYyBlbmZvcmNlX3NpbmdsZV9kZWZhdWx0KHBhbmVsLCBjbGlja2VkKSB7XHJcblx0XHRcdGlmICggdGhpcy5pc19tdWx0aXBsZV9lbmFibGVkKCBwYW5lbCApICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgY2hlY2tzID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMudWkudG9nZ2xlICk7XHJcblx0XHRcdGlmICggIWNoZWNrcz8ubGVuZ3RoICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0aWYgKCBjbGlja2VkICYmIGNsaWNrZWQuY2hlY2tlZCApIHtcclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKysgKSBpZiAoIGNoZWNrc1tpXSAhPT0gY2xpY2tlZCApIHtcclxuXHRcdFx0XHRcdGNoZWNrc1tpXS5jaGVja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRjaGVja3NbaV0uc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjbGlja2VkLnNldEF0dHJpYnV0ZSggJ2FyaWEtY2hlY2tlZCcsICd0cnVlJyApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IGtlcHQgPSBmYWxzZTtcclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgY2hlY2tzLmxlbmd0aDsgaisrICkgaWYgKCBjaGVja3Nbal0uY2hlY2tlZCApIHtcclxuXHRcdFx0XHRpZiAoICFrZXB0ICkge1xyXG5cdFx0XHRcdFx0a2VwdCA9IHRydWU7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNoZWNrc1tqXS5jaGVja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRjaGVja3Nbal0uc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zeW5jX2RlZmF1bHRfdmFsdWVfbG9jayggcGFuZWwgKTtcclxuXHRcdFx0dGhpcy5zeW5jX3BsYWNlaG9sZGVyX2xvY2soIHBhbmVsICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLSBvbmUtdGltZSBib290c3RyYXAgb2YgYSBwYW5lbCAtLS0tXHJcblx0XHRzdGF0aWMgYm9vdHN0cmFwX3BhbmVsKHBhbmVsKSB7XHJcblx0XHRcdGlmICggIXBhbmVsICkgcmV0dXJuO1xyXG5cdFx0XHRpZiAoICFwYW5lbC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19vcHRpb25zX2VkaXRvcicgKSApIHJldHVybjsgLy8gb25seSBzZWxlY3QtbGlrZSBVSXNcclxuXHRcdFx0aWYgKCBwYW5lbC5kYXRhc2V0LnNlbGVjdGJhc2VfYm9vdHN0cmFwcGVkID09PSAnMScgKSB7XHJcblx0XHRcdFx0dGhpcy5lbnN1cmVfc29ydGFibGUoIHBhbmVsICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnJlYnVpbGRfaWZfZW1wdHkoIHBhbmVsICk7XHJcblx0XHRcdHRoaXMuZW5zdXJlX3NvcnRhYmxlKCBwYW5lbCApO1xyXG5cdFx0XHRwYW5lbC5kYXRhc2V0LnNlbGVjdGJhc2VfYm9vdHN0cmFwcGVkID0gJzEnO1xyXG5cclxuXHRcdFx0dGhpcy5zeW5jX2RlZmF1bHRfdmFsdWVfbG9jayggcGFuZWwgKTtcclxuXHRcdFx0dGhpcy5zeW5jX3BsYWNlaG9sZGVyX2xvY2soIHBhbmVsICk7XHJcblx0XHRcdHRoaXMuc3luY192YWx1ZV9pbnB1dHNfdmlzaWJpbGl0eSggcGFuZWwgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyAtLS0tIGhvb2sgaW50byBpbnNwZWN0b3IgbGlmZWN5Y2xlIChmaXJlcyBPTkNFKSAtLS0tXHJcblx0XHRzdGF0aWMgd2lyZV9vbmNlKCkge1xyXG5cdFx0XHRpZiAoIENvcmUuX19zZWxlY3RiYXNlX3dpcmVkICkgcmV0dXJuO1xyXG5cdFx0XHRDb3JlLl9fc2VsZWN0YmFzZV93aXJlZCA9IHRydWU7XHJcblxyXG5cdFx0XHRjb25zdCBvbl9yZWFkeV9vcl9yZW5kZXIgPSAoZXYpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYW5lbCA9IGV2Py5kZXRhaWw/LnBhbmVsO1xyXG5cdFx0XHRcdGNvbnN0IGZpZWxkID0gZXY/LmRldGFpbD8uZWwgfHwgZXY/LmRldGFpbD8uZmllbGQgfHwgbnVsbDtcclxuXHRcdFx0XHRpZiAoICFwYW5lbCApIHJldHVybjtcclxuXHRcdFx0XHRpZiAoIGZpZWxkICkgcGFuZWwuX19zZWxlY3RiYXNlX2ZpZWxkID0gZmllbGQ7XHJcblx0XHRcdFx0dGhpcy5ib290c3RyYXBfcGFuZWwoIHBhbmVsICk7XHJcblx0XHRcdFx0Ly8gSWYgdGhlIGluc3BlY3RvciByb290IHdhcyByZW1vdW50ZWQsIGVuc3VyZSByb290IGxpc3RlbmVycyBhcmUgKHJlKWJvdW5kLlxyXG5cdFx0XHRcdHRoaXMud2lyZV9yb290X2xpc3RlbmVycygpO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3dwYmNfYmZiX2luc3BlY3Rvcl9yZWFkeScsIG9uX3JlYWR5X29yX3JlbmRlciApO1xyXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnd3BiY19iZmJfaW5zcGVjdG9yX3JlbmRlcicsIG9uX3JlYWR5X29yX3JlbmRlciApO1xyXG5cclxuXHRcdFx0dGhpcy53aXJlX3Jvb3RfbGlzdGVuZXJzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIHdpcmVfcm9vdF9saXN0ZW5lcnMoKSB7XHJcblxyXG5cdFx0XHQvLyBJZiBhbHJlYWR5IHdpcmVkIEFORCB0aGUgc3RvcmVkIHJvb3QgaXMgc3RpbGwgaW4gdGhlIERPTSwgYmFpbCBvdXQuXHJcblx0XHRcdGlmICggdGhpcy5fX3Jvb3Rfd2lyZWQgJiYgdGhpcy5fX3Jvb3Rfbm9kZT8uaXNDb25uZWN0ZWQgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRpZiAoICFyb290ICkge1xyXG5cdFx0XHRcdC8vIFJvb3QgbWlzc2luZyAoZS5nLiwgU1BBIHJlLXJlbmRlcikg4oCUIGNsZWFyIGZsYWdzIHNvIHdlIGNhbiB3aXJlIGxhdGVyLlxyXG5cdFx0XHRcdHRoaXMuX19yb290X3dpcmVkID0gZmFsc2U7XHJcblx0XHRcdFx0dGhpcy5fX3Jvb3Rfbm9kZSAgPSBudWxsO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fX3Jvb3Rfbm9kZSAgICAgICAgICAgICAgICAgICA9IHJvb3Q7XHJcblx0XHRcdHRoaXMuX19yb290X3dpcmVkICAgICAgICAgICAgICAgICAgPSB0cnVlO1xyXG5cdFx0XHRyb290LmRhdGFzZXQuc2VsZWN0YmFzZV9yb290X3dpcmVkID0gJzEnO1xyXG5cclxuXHRcdFx0Y29uc3QgZ2V0X3BhbmVsID0gKHRhcmdldCkgPT5cclxuXHRcdFx0XHR0YXJnZXQ/LmNsb3Nlc3Q/LiggJy53cGJjX2JmYl9faW5zcGVjdG9yX19ib2R5JyApIHx8XHJcblx0XHRcdFx0cm9vdC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19pbnNwZWN0b3JfX2JvZHknICkgfHwgbnVsbDtcclxuXHJcblx0XHRcdC8vIENsaWNrIGhhbmRsZXJzOiBhZGQgLyBkZWxldGUgLyBkdXBsaWNhdGVcclxuXHRcdFx0cm9vdC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHBhbmVsID0gZ2V0X3BhbmVsKCBlLnRhcmdldCApO1xyXG5cdFx0XHRcdGlmICggIXBhbmVsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHR0aGlzLmJvb3RzdHJhcF9wYW5lbCggcGFuZWwgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdWkgPSB0aGlzLnVpO1xyXG5cclxuXHRcdFx0XHQvLyBFeGlzdGluZyBcIkFkZCBvcHRpb25cIiBidXR0b24gKHRvcCB0b29sYmFyKVxyXG5cdFx0XHRcdGNvbnN0IGFkZCA9IGUudGFyZ2V0LmNsb3Nlc3Q/LiggdWkuYWRkX2J0biApO1xyXG5cdFx0XHRcdGlmICggYWRkICkge1xyXG5cdFx0XHRcdFx0dGhpcy5hcHBlbmRfcm93KCBwYW5lbCwgeyBsYWJlbDogJycsIHZhbHVlOiAnJywgc2VsZWN0ZWQ6IGZhbHNlIH0gKTtcclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0X29wdGlvbnMoIHBhbmVsICk7XHJcblx0XHRcdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBEcm9wZG93biBtZW51IGFjdGlvbnMuXHJcblx0XHRcdFx0Y29uc3QgbWVudV9hY3Rpb24gPSBlLnRhcmdldC5jbG9zZXN0Py4oIHVpLm1lbnVfYWN0aW9uICk7XHJcblx0XHRcdFx0aWYgKCBtZW51X2FjdGlvbiApIHtcclxuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYWN0aW9uID0gKG1lbnVfYWN0aW9uLmdldEF0dHJpYnV0ZSggJ2RhdGEtYWN0aW9uJyApIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0Y29uc3Qgcm93ICAgID0gbWVudV9hY3Rpb24uY2xvc2VzdD8uKCB1aS5yb3cgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoICFyb3cgKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuY2xvc2VfZHJvcGRvd24oIG1lbnVfYWN0aW9uICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICdhZGRfYWZ0ZXInID09PSBhY3Rpb24gKSB7XHJcblx0XHRcdFx0XHRcdC8vIEFkZCBlbXB0eSByb3cgYWZ0ZXIgY3VycmVudFxyXG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2X2NvdW50ID0gdGhpcy5nZXRfbGlzdCggcGFuZWwgKT8uY2hpbGRyZW4ubGVuZ3RoIHx8IDA7XHJcblx0XHRcdFx0XHRcdHRoaXMuYXBwZW5kX3JvdyggcGFuZWwsIHsgbGFiZWw6ICcnLCB2YWx1ZTogJycsIHNlbGVjdGVkOiBmYWxzZSB9ICk7XHJcblx0XHRcdFx0XHRcdC8vIE1vdmUgdGhlIG5ld2x5IGFkZGVkIGxhc3Qgcm93IGp1c3QgYWZ0ZXIgY3VycmVudCByb3cgdG8gcHJlc2VydmUgXCJhZGQgYWZ0ZXJcIlxyXG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ID0gdGhpcy5nZXRfbGlzdCggcGFuZWwgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBsaXN0ICYmIGxpc3QubGFzdEVsZW1lbnRDaGlsZCAmJiBsaXN0Lmxhc3RFbGVtZW50Q2hpbGQgIT09IHJvdyApIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmluc2VydF9hZnRlciggbGlzdC5sYXN0RWxlbWVudENoaWxkLCByb3cgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbW1pdF9vcHRpb25zKCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAnZHVwbGljYXRlJyA9PT0gYWN0aW9uICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBsYmwgPSAocm93LnF1ZXJ5U2VsZWN0b3IoIHVpLmxhYmVsICkgfHwge30pLnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB2YWwgPSAocm93LnF1ZXJ5U2VsZWN0b3IoIHVpLnZhbHVlICkgfHwge30pLnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzZWwgPSAhISgocm93LnF1ZXJ5U2VsZWN0b3IoIHVpLnRvZ2dsZSApIHx8IHt9KS5jaGVja2VkKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5hcHBlbmRfcm93KCBwYW5lbCwgeyBsYWJlbDogbGJsLCB2YWx1ZTogdmFsLCBzZWxlY3RlZDogc2VsLCB1aWQ6IHRoaXMubWFrZV91aWQoKSB9ICk7XHJcblx0XHRcdFx0XHRcdC8vIFBsYWNlIHRoZSBuZXcgcm93IHJpZ2h0IGFmdGVyIHRoZSBjdXJyZW50LlxyXG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ID0gdGhpcy5nZXRfbGlzdCggcGFuZWwgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggbGlzdCAmJiBsaXN0Lmxhc3RFbGVtZW50Q2hpbGQgJiYgbGlzdC5sYXN0RWxlbWVudENoaWxkICE9PSByb3cgKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5pbnNlcnRfYWZ0ZXIoIGxpc3QubGFzdEVsZW1lbnRDaGlsZCwgcm93ICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0dGhpcy5lbmZvcmNlX3NpbmdsZV9kZWZhdWx0KCBwYW5lbCwgbnVsbCApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbW1pdF9vcHRpb25zKCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAncmVtb3ZlJyA9PT0gYWN0aW9uICkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIHJvdyAmJiByb3cucGFyZW50Tm9kZSApIHJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByb3cgKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5jb21taXRfb3B0aW9ucyggcGFuZWwgKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5zeW5jX3ZhbHVlX2lucHV0c192aXNpYmlsaXR5KCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuY2xvc2VfZHJvcGRvd24oIG1lbnVfYWN0aW9uICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSwgdHJ1ZSApO1xyXG5cclxuXHJcblx0XHRcdC8vIElucHV0IGRlbGVnYXRpb24uXHJcblx0XHRcdHJvb3QuYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0JywgKGUpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYW5lbCA9IGdldF9wYW5lbCggZS50YXJnZXQgKTtcclxuXHRcdFx0XHRpZiAoICEgcGFuZWwgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IHVpICAgICAgICAgICAgICAgID0gdGhpcy51aTtcclxuXHRcdFx0XHRjb25zdCBpc19sYWJlbF9vcl92YWx1ZSA9IGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fb3B0LWxhYmVsJyApIHx8IGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fb3B0LXZhbHVlJyApO1xyXG5cdFx0XHRcdGNvbnN0IGlzX3RvZ2dsZSAgICAgICAgID0gZS50YXJnZXQuY2xhc3NMaXN0Py5jb250YWlucyggJ3dwYmNfYmZiX19vcHQtc2VsZWN0ZWQtY2hrJyApO1xyXG5cdFx0XHRcdGNvbnN0IGlzX211bHRpcGxlICAgICAgID0gZS50YXJnZXQubWF0Y2hlcz8uKCB1aS5tdWx0aXBsZV9jaGsgKTtcclxuXHRcdFx0XHRjb25zdCBpc19kZWZhdWx0X3RleHQgICA9IGUudGFyZ2V0Lm1hdGNoZXM/LiggdWkuZGVmYXVsdF90ZXh0ICk7XHJcblx0XHRcdFx0Y29uc3QgaXNfdmFsdWVfZGlmZmVycyAgPSBlLnRhcmdldC5tYXRjaGVzPy4oIHVpLnZhbHVlX2RpZmZlcnNfY2hrICk7XHJcblxyXG5cdFx0XHRcdC8vIEhhbmRsZSBcInZhbHVlIGRpZmZlcnNcIiB0b2dnbGUgbGl2ZVxyXG5cdFx0XHRcdGlmICggaXNfdmFsdWVfZGlmZmVycyApIHtcclxuXHRcdFx0XHRcdHRoaXMuc3luY192YWx1ZV9pbnB1dHNfdmlzaWJpbGl0eSggcGFuZWwgKTtcclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0X29wdGlvbnMoIHBhbmVsICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBUcmFjayB3aGVuIHRoZSB1c2VyIGVkaXRzIFZBTFVFIGV4cGxpY2l0bHlcclxuXHRcdFx0XHRpZiAoIGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fb3B0LXZhbHVlJyApICkge1xyXG5cdFx0XHRcdFx0Y29uc3Qgcm93ID0gZS50YXJnZXQuY2xvc2VzdCggdGhpcy51aS5yb3cgKTtcclxuXHRcdFx0XHRcdHRoaXMubWFya19yb3dfdmFsdWVfdXNlcl90b3VjaGVkKCByb3cgKTtcclxuXHRcdFx0XHRcdC8vIEtlZXAgdGhlIGNhY2hlIHVwZGF0ZWQgc28gdG9nZ2xpbmcgT0ZGL09OIGxhdGVyIHJlc3RvcmVzIHRoZSBsYXRlc3QgY3VzdG9tIHZhbHVlXHJcblx0XHRcdFx0XHRlLnRhcmdldC5kYXRhc2V0LmNhY2hlZF92YWx1ZSA9IGUudGFyZ2V0LnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gQXV0by1maWxsIFZBTFVFIGZyb20gTEFCRUwgaWYgdmFsdWUgaXMgZnJlc2ggKGFuZCBkaWZmZXJzIGlzIE9OKTsgaWYgZGlmZmVycyBpcyBPRkYsIHdlIG1pcnJvciBhbnl3YXkgaW4gY29tbWl0XHJcblx0XHRcdFx0aWYgKCBlLnRhcmdldC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX29wdC1sYWJlbCcgKSApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHJvdyAgICAgPSBlLnRhcmdldC5jbG9zZXN0KCB1aS5yb3cgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbF9pbiAgPSByb3c/LnF1ZXJ5U2VsZWN0b3IoIHVpLnZhbHVlICk7XHJcblx0XHRcdFx0XHRjb25zdCBkaWZmZXJzID0gdGhpcy5pc192YWx1ZV9kaWZmZXJzX2VuYWJsZWQoIHBhbmVsICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB2YWxfaW4gKSB7XHJcblx0XHRcdFx0XHRcdGlmICggIWRpZmZlcnMgKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gc2luZ2xlLWlucHV0IG1vZGU6IG1pcnJvciBodW1hbiBsYWJlbCB3aXRoIG1pbmltYWwgZXNjYXBpbmdcclxuXHRcdFx0XHRcdFx0XHR2YWxfaW4udmFsdWUgPSB0aGlzLmJ1aWxkX3ZhbHVlX2Zyb21fbGFiZWwoIGUudGFyZ2V0LnZhbHVlLCBmYWxzZSApO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhdGhpcy5pc19yb3dfdmFsdWVfdXNlcl90b3VjaGVkKCByb3cgKSApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBzZXBhcmF0ZS12YWx1ZSBtb2RlLCBvbmx5IHdoaWxlIGZyZXNoXHJcblx0XHRcdFx0XHRcdFx0dmFsX2luLnZhbHVlID0gdGhpcy5idWlsZF92YWx1ZV9mcm9tX2xhYmVsKCBlLnRhcmdldC52YWx1ZSwgdHJ1ZSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0aWYgKCBpc19sYWJlbF9vcl92YWx1ZSB8fCBpc190b2dnbGUgfHwgaXNfbXVsdGlwbGUgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGlzX3RvZ2dsZSApIGUudGFyZ2V0LnNldEF0dHJpYnV0ZSggJ2FyaWEtY2hlY2tlZCcsIGUudGFyZ2V0LmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnICk7XHJcblx0XHRcdFx0XHRpZiAoIGlzX3RvZ2dsZSB8fCBpc19tdWx0aXBsZSApIHRoaXMuZW5mb3JjZV9zaW5nbGVfZGVmYXVsdCggcGFuZWwsIGlzX3RvZ2dsZSA/IGUudGFyZ2V0IDogbnVsbCApO1xyXG5cdFx0XHRcdFx0dGhpcy5jb21taXRfb3B0aW9ucyggcGFuZWwgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggaXNfZGVmYXVsdF90ZXh0ICkge1xyXG5cdFx0XHRcdFx0dGhpcy5zeW5jX2RlZmF1bHRfdmFsdWVfbG9jayggcGFuZWwgKTtcclxuXHRcdFx0XHRcdHRoaXMuc3luY19wbGFjZWhvbGRlcl9sb2NrKCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0Y29uc3QgaG9sZGVyID0gdGhpcy5nZXRfaG9sZGVyKCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0aWYgKCBob2xkZXIgKSB7XHJcblx0XHRcdFx0XHRcdGhvbGRlci5kaXNwYXRjaEV2ZW50KCBuZXcgRXZlbnQoICdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdFx0XHRcdFx0aG9sZGVyLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIHRydWUgKTtcclxuXHJcblxyXG5cdFx0XHQvLyBDaGFuZ2UgZGVsZWdhdGlvblxyXG5cdFx0XHRyb290LmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCAoZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHBhbmVsID0gZ2V0X3BhbmVsKCBlLnRhcmdldCApO1xyXG5cdFx0XHRcdGlmICggIXBhbmVsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHRjb25zdCB1aSAgICAgICAgPSB0aGlzLnVpO1xyXG5cdFx0XHRcdGNvbnN0IGlzX3RvZ2dsZSA9IGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fb3B0LXNlbGVjdGVkLWNoaycgKTtcclxuXHRcdFx0XHRjb25zdCBpc19tdWx0aSAgPSBlLnRhcmdldC5tYXRjaGVzPy4oIHVpLm11bHRpcGxlX2NoayApO1xyXG5cdFx0XHRcdGlmICggIWlzX3RvZ2dsZSAmJiAhaXNfbXVsdGkgKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdGlmICggaXNfdG9nZ2xlICkgZS50YXJnZXQuc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgZS50YXJnZXQuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZScgKTtcclxuXHRcdFx0XHR0aGlzLmVuZm9yY2Vfc2luZ2xlX2RlZmF1bHQoIHBhbmVsLCBpc190b2dnbGUgPyBlLnRhcmdldCA6IG51bGwgKTtcclxuXHRcdFx0XHR0aGlzLmNvbW1pdF9vcHRpb25zKCBwYW5lbCApO1xyXG5cdFx0XHR9LCB0cnVlICk7XHJcblxyXG5cdFx0XHQvLyBMYXp5IGJvb3RzdHJhcFxyXG5cdFx0XHRyb290LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgKGUpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYW5lbCA9IGdldF9wYW5lbCggZS50YXJnZXQgKTtcclxuXHRcdFx0XHRpZiAoIHBhbmVsICYmIGUudGFyZ2V0Py5jbG9zZXN0Py4oIHRoaXMudWkubGlzdCApICkgdGhpcy5ib290c3RyYXBfcGFuZWwoIHBhbmVsICk7XHJcblx0XHRcdH0sIHRydWUgKTtcclxuXHJcblx0XHRcdHJvb3QuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlZG93bicsIChlKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgcGFuZWwgPSBnZXRfcGFuZWwoIGUudGFyZ2V0ICk7XHJcblx0XHRcdFx0aWYgKCBwYW5lbCAmJiBlLnRhcmdldD8uY2xvc2VzdD8uKCB0aGlzLnVpLmRyYWdfaGFuZGxlICkgKSB0aGlzLmJvb3RzdHJhcF9wYW5lbCggcGFuZWwgKTtcclxuXHRcdFx0fSwgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxuXHR0cnkgeyBDb3JlLldQQkNfQkZCX1NlbGVjdF9CYXNlLndpcmVfb25jZSgpOyB9IGNhdGNoIChfKSB7fVxyXG5cdC8vIFRyeSBpbW1lZGlhdGVseSAoaWYgcm9vdCBpcyBhbHJlYWR5IGluIERPTSksIHRoZW4gYWdhaW4gb24gRE9NQ29udGVudExvYWRlZC5cclxuXHRDb3JlLldQQkNfQkZCX1NlbGVjdF9CYXNlLndpcmVfcm9vdF9saXN0ZW5lcnMoKTtcclxuXHJcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsgQ29yZS5XUEJDX0JGQl9TZWxlY3RfQmFzZS53aXJlX3Jvb3RfbGlzdGVuZXJzKCk7ICB9KTtcclxuXHJcbn0oIHdpbmRvdyApKTsiLCIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gPT0gRmlsZSAgL2luY2x1ZGVzL3BhZ2UtZm9ybS1idWlsZGVyL19vdXQvY29yZS9iZmItdWkuanMgPT0gfCAyMDI1LTA5LTEwIDE1OjQ3XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4oZnVuY3Rpb24gKHcsIGQpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8vIFNpbmdsZSBnbG9iYWwgbmFtZXNwYWNlIChpZGVtcG90ZW50ICYgbG9hZC1vcmRlciBzYWZlKS5cclxuXHRjb25zdCBDb3JlID0gKHcuV1BCQ19CRkJfQ29yZSA9IHcuV1BCQ19CRkJfQ29yZSB8fCB7fSk7XHJcblx0Y29uc3QgVUkgICA9IChDb3JlLlVJID0gQ29yZS5VSSB8fCB7fSk7XHJcblxyXG5cdC8vIC0tLSBIaWdobGlnaHQgRWxlbWVudCwgIGxpa2UgR2VuZXJhdG9yIGJybiAgLSAgVGlueSBVSSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFVJLl9wdWxzZV90aW1lcnMgPSBVSS5fcHVsc2VfdGltZXJzIHx8IG5ldyBNYXAoKTsgLy8gZWwgLT4gdGltZXJfaWRcclxuXHRVSS5fcHVsc2VfbWV0YSAgID0gVUkuX3B1bHNlX21ldGEgICB8fCBuZXcgTWFwKCk7IC8vIGVsIC0+IHsgdG9rZW4sIGxhc3RfdHMsIGRlYm91bmNlX2lkLCBjb2xvcl9zZXQgfVxyXG5cdC8vIFB1bHNlIHR1bmluZyAobWlsbGlzZWNvbmRzKS5cclxuXHRVSS5QVUxTRV9USFJPVFRMRV9NUyAgPSBOdW1iZXIuaXNGaW5pdGUoIFVJLlBVTFNFX1RIUk9UVExFX01TICkgPyBVSS5QVUxTRV9USFJPVFRMRV9NUyA6IDUwMDtcclxuXHRVSS5QVUxTRV9ERUJPVU5DRV9NUyAgPSBOdW1iZXIuaXNGaW5pdGUoIFVJLlBVTFNFX0RFQk9VTkNFX01TICkgPyBVSS5QVUxTRV9ERUJPVU5DRV9NUyA6IDc1MDtcclxuXHJcblx0Ly8gRGVib3VuY2UgU1RSVUNUVVJFX0NIQU5HRSBmb3IgY29udGludW91cyBpbnNwZWN0b3IgY29udHJvbHMgKHNsaWRlcnMgLyBzY3J1YmJpbmcpLlxyXG5cdC8vIFR1bmU6IDE4MC4uMzUwIGlzIHVzdWFsbHkgYSBzd2VldCBzcG90LlxyXG5cdFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgPSBOdW1iZXIuaXNGaW5pdGUoIFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgKSA/IFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgOiAxODA7XHJcblx0Ly8gQ2hhbmdlIHRoaXMgdG8gdHVuZSBzcGVlZDogNTAuLjEyMCBtcyBpcyBhIGdvb2QgcmFuZ2UuIENhbiBiZSBjb25maWd1cmVkIGluIDxkaXYgZGF0YS1sZW4tZ3JvdXAgZGF0YS1sZW4tdGhyb3R0bGU9XCIxODBcIj4uLi48L2Rpdj4uXHJcblx0VUkuVkFMVUVfU0xJREVSX1RIUk9UVExFX01TID0gTnVtYmVyLmlzRmluaXRlKCBVSS5WQUxVRV9TTElERVJfVEhST1RUTEVfTVMgKSA/IFVJLlZBTFVFX1NMSURFUl9USFJPVFRMRV9NUyA6IDEyMDtcclxuXHJcblx0LyoqXHJcblx0ICogQ2FuY2VsIGFueSBydW5uaW5nIHB1bHNlIHNlcXVlbmNlIGZvciBhbiBlbGVtZW50LlxyXG5cdCAqIFVzZXMgdG9rZW4gaW52YWxpZGF0aW9uIHNvIGFscmVhZHktc2NoZWR1bGVkIGNhbGxiYWNrcyBiZWNvbWUgbm8tb3BzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuXHQgKi9cclxuXHRVSS5jYW5jZWxfcHVsc2UgPSBmdW5jdGlvbiAoZWwpIHtcclxuXHRcdGlmICggIWVsICkgeyByZXR1cm47IH1cclxuXHRcdHRyeSB7XHJcblx0XHRcdGNsZWFyVGltZW91dCggVUkuX3B1bHNlX3RpbWVycy5nZXQoIGVsICkgKTtcclxuXHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHRcdFVJLl9wdWxzZV90aW1lcnMuZGVsZXRlKCBlbCApO1xyXG5cclxuXHRcdHZhciBtZXRhID0gVUkuX3B1bHNlX21ldGEuZ2V0KCBlbCApIHx8IHt9O1xyXG5cdFx0bWV0YS50b2tlbiA9IChOdW1iZXIuaXNGaW5pdGUoIG1ldGEudG9rZW4gKSA/IG1ldGEudG9rZW4gOiAwKSArIDE7XHJcblx0XHRtZXRhLmNvbG9yX3NldCA9IGZhbHNlO1xyXG5cdFx0dHJ5IHsgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3dwYmNfYmZiX19zY3JvbGwtcHVsc2UnLCAnd3BiY19iZmJfX2hpZ2hsaWdodC1wdWxzZScgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0dHJ5IHsgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoICctLXdwYmMtYmZiLXB1bHNlLWNvbG9yJyApOyB9IGNhdGNoICggXyApIHt9XHJcblx0XHRVSS5fcHVsc2VfbWV0YS5zZXQoIGVsLCBtZXRhICk7XHJcblx0XHR0cnkgeyBjbGVhclRpbWVvdXQoIG1ldGEuZGVib3VuY2VfaWQgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0bWV0YS5kZWJvdW5jZV9pZCA9IDA7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogRm9yY2UtcmVzdGFydCBhIENTUyBhbmltYXRpb24gb24gYSBjbGFzcy5cclxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjbHNcclxuXHQgKi9cclxuXHRVSS5fcmVzdGFydF9jc3NfYW5pbWF0aW9uID0gZnVuY3Rpb24gKGVsLCBjbHMpIHtcclxuXHRcdGlmICggISBlbCApIHsgcmV0dXJuOyB9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRlbC5jbGFzc0xpc3QucmVtb3ZlKCBjbHMgKTtcclxuXHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHRcdC8vIEZvcmNlIHJlZmxvdyBzbyB0aGUgbmV4dCBhZGQoKSByZXRyaWdnZXJzIHRoZSBrZXlmcmFtZXMuXHJcblx0XHR2b2lkIGVsLm9mZnNldFdpZHRoO1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZWwuY2xhc3NMaXN0LmFkZCggY2xzICk7XHJcblx0XHR9IGNhdGNoICggXyApIHt9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0XHRTaW5nbGUgcHVsc2UgKGJhY2stY29tcGF0KS5cclxuXHRcdEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXHJcblx0XHRAcGFyYW0ge251bWJlcn0gZHVyX21zXHJcblx0ICovXHJcblx0VUkucHVsc2Vfb25jZSA9IGZ1bmN0aW9uIChlbCwgZHVyX21zKSB7XHJcblx0XHRpZiAoICEgZWwgKSB7IHJldHVybjsgfVxyXG5cdFx0dmFyIGNscyA9ICd3cGJjX2JmYl9fc2Nyb2xsLXB1bHNlJztcclxuXHRcdHZhciBtcyAgPSBOdW1iZXIuaXNGaW5pdGUoIGR1cl9tcyApID8gZHVyX21zIDogNzAwO1xyXG5cclxuXHRcdFVJLmNhbmNlbF9wdWxzZSggZWwgKTtcclxuXHJcblx0XHR2YXIgbWV0YSAgPSBVSS5fcHVsc2VfbWV0YS5nZXQoIGVsICkgfHwge307XHJcblx0XHR2YXIgdG9rZW4gPSAoTnVtYmVyLmlzRmluaXRlKCBtZXRhLnRva2VuICkgPyBtZXRhLnRva2VuIDogMCkgKyAxO1xyXG5cdFx0bWV0YS50b2tlbiA9IHRva2VuO1xyXG5cdFx0VUkuX3B1bHNlX21ldGEuc2V0KCBlbCwgbWV0YSApO1xyXG5cclxuXHRcdFVJLl9yZXN0YXJ0X2Nzc19hbmltYXRpb24oIGVsLCBjbHMgKTtcclxuXHRcdHZhciB0ID0gc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHQvLyBpZ25vcmUgaWYgYSBuZXdlciBwdWxzZSBzdGFydGVkLlxyXG5cdFx0XHR2YXIgbSA9IFVJLl9wdWxzZV9tZXRhLmdldCggZWwgKSB8fCB7fTtcclxuXHRcdFx0aWYgKCBtLnRva2VuICE9PSB0b2tlbiApIHsgcmV0dXJuOyB9XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0ZWwuY2xhc3NMaXN0LnJlbW92ZSggY2xzICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHRcdFx0VUkuX3B1bHNlX3RpbWVycy5kZWxldGUoIGVsICk7XHJcblx0XHR9LCBtcyApO1xyXG5cdFx0VUkuX3B1bHNlX3RpbWVycy5zZXQoIGVsLCB0ICk7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0XHRNdWx0aS1ibGluayBzZXF1ZW5jZSB3aXRoIG9wdGlvbmFsIHBlci1jYWxsIGNvbG9yIG92ZXJyaWRlLlxyXG5cdFx0QHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuXHRcdEBwYXJhbSB7bnVtYmVyfSBbdGltZXM9M11cclxuXHRcdEBwYXJhbSB7bnVtYmVyfSBbb25fbXM9MjgwXVxyXG5cdFx0QHBhcmFtIHtudW1iZXJ9IFtvZmZfbXM9MTgwXVxyXG5cdFx0QHBhcmFtIHtzdHJpbmd9IFtoZXhfY29sb3JdIE9wdGlvbmFsIENTUyBjb2xvciAoZS5nLiAnI2ZmNGQ0Zicgb3IgJ3JnYiguLi4pJykuXHJcblx0ICovXHJcblx0VUkucHVsc2Vfc2VxdWVuY2UgPSBmdW5jdGlvbiAoZWwsIHRpbWVzLCBvbl9tcywgb2ZmX21zLCBoZXhfY29sb3IpIHtcclxuXHRcdGlmICggIWVsIHx8ICFkLmJvZHkuY29udGFpbnMoIGVsICkgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHZhciBjbHMgICA9ICd3cGJjX2JmYl9faGlnaGxpZ2h0LXB1bHNlJztcclxuXHRcdHZhciBjb3VudCA9IE51bWJlci5pc0Zpbml0ZSggdGltZXMgKSA/IHRpbWVzIDogMjtcclxuXHRcdHZhciBvbiAgICA9IE51bWJlci5pc0Zpbml0ZSggb25fbXMgKSA/IG9uX21zIDogMjgwO1xyXG5cdFx0dmFyIG9mZiAgID0gTnVtYmVyLmlzRmluaXRlKCBvZmZfbXMgKSA/IG9mZl9tcyA6IDE4MDtcclxuXHJcblx0XHQvLyBUaHJvdHRsZTogYXZvaWQgcmVmbG93IHNwYW0gaWYgY2FsbGVkIHJlcGVhdGVkbHkgd2hpbGUgdHlwaW5nL2RyYWdnaW5nLlxyXG5cdFx0dmFyIG1ldGEgPSBVSS5fcHVsc2VfbWV0YS5nZXQoIGVsICkgfHwge307XHJcblx0XHR2YXIgbm93ICA9IERhdGUubm93KCk7XHJcblx0XHR2YXIgdGhyb3R0bGVfbXMgPSBOdW1iZXIuaXNGaW5pdGUoIFVJLlBVTFNFX1RIUk9UVExFX01TICkgPyBVSS5QVUxTRV9USFJPVFRMRV9NUyA6IDEyMDtcclxuXHRcdGlmICggTnVtYmVyLmlzRmluaXRlKCBtZXRhLmxhc3RfdHMgKSAmJiAobm93IC0gbWV0YS5sYXN0X3RzKSA8IHRocm90dGxlX21zICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRtZXRhLmxhc3RfdHMgPSBub3c7XHJcblxyXG5cdFx0Ly8gY2FuY2VsIGFueSBydW5uaW5nIHB1bHNlIGFuZCByZXNldCBjbGFzcyAodG9rZW4gaW52YWxpZGF0aW9uKS5cclxuXHRcdFVJLmNhbmNlbF9wdWxzZSggZWwgKTtcclxuXHJcblx0XHQvLyBuZXcgdG9rZW4gZm9yIHRoaXMgcnVuXHJcblx0XHR2YXIgdG9rZW4gPSAoTnVtYmVyLmlzRmluaXRlKCBtZXRhLnRva2VuICkgPyBtZXRhLnRva2VuIDogMCkgKyAxO1xyXG5cdFx0bWV0YS50b2tlbiA9IHRva2VuO1xyXG5cclxuXHRcdHZhciBoYXZlX2NvbG9yID0gISFoZXhfY29sb3IgJiYgdHlwZW9mIGhleF9jb2xvciA9PT0gJ3N0cmluZyc7XHJcblx0XHRpZiAoIGhhdmVfY29sb3IgKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0ZWwuc3R5bGUuc2V0UHJvcGVydHkoICctLXdwYmMtYmZiLXB1bHNlLWNvbG9yJywgaGV4X2NvbG9yICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHRcdFx0bWV0YS5jb2xvcl9zZXQgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0VUkuX3B1bHNlX21ldGEuc2V0KCBlbCwgbWV0YSApO1xyXG5cclxuXHRcdHZhciBpID0gMDtcclxuXHRcdChmdW5jdGlvbiB0aWNrKCkge1xyXG5cdFx0XHR2YXIgbSA9IFVJLl9wdWxzZV9tZXRhLmdldCggZWwgKSB8fCB7fTtcclxuXHRcdFx0aWYgKCBtLnRva2VuICE9PSB0b2tlbiApIHtcclxuXHRcdFx0XHQvLyBjYW5jZWxlZC9yZXBsYWNlZFxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGkgPj0gY291bnQgKSB7XHJcblx0XHRcdFx0VUkuX3B1bHNlX3RpbWVycy5kZWxldGUoIGVsICk7XHJcblx0XHRcdFx0aWYgKCBoYXZlX2NvbG9yICkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0ZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoICctLXdwYmMtYmZiLXB1bHNlLWNvbG9yJyApO1xyXG5cdFx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0VUkuX3Jlc3RhcnRfY3NzX2FuaW1hdGlvbiggZWwsIGNscyApO1xyXG5cdFx0XHRVSS5fcHVsc2VfdGltZXJzLnNldCggZWwsIHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsgICAgIC8vIE9OIC0+IE9GRlxyXG5cdFx0XHRcdHZhciBtMiA9IFVJLl9wdWxzZV9tZXRhLmdldCggZWwgKSB8fCB7fTtcclxuXHRcdFx0XHRpZiAoIG0yLnRva2VuICE9PSB0b2tlbiApIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5yZW1vdmUoIGNscyApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRVSS5fcHVsc2VfdGltZXJzLnNldCggZWwsIHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsgLy8gT0ZGIGdhcCAtPiBuZXh0XHJcblx0XHRcdFx0XHR2YXIgbTMgPSBVSS5fcHVsc2VfbWV0YS5nZXQoIGVsICkgfHwge307XHJcblx0XHRcdFx0XHRpZiAoIG0zLnRva2VuICE9PSB0b2tlbiApIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0XHRpKys7XHJcblx0XHRcdFx0XHR0aWNrKCk7XHJcblx0XHRcdFx0fSwgb2ZmICkgKTtcclxuXHRcdFx0fSwgb24gKSApO1xyXG5cdFx0fSkoKTtcclxuXHR9O1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRGVib3VuY2VkIHF1ZXJ5ICsgcHVsc2UuXHJcblx0ICogVXNlZnVsIGZvciBgaW5wdXRgIGV2ZW50cyAoc2xpZGVycyAvIHR5cGluZykgdG8gYXZvaWQgZm9yY2VkIHJlZmxvdyBzcGFtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IHJvb3Rfb3Jfc2VsZWN0b3JcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2FpdF9tc1xyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYV1cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2JdXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtjXVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JdXHJcblx0ICovXHJcblx0VUkucHVsc2VfcXVlcnlfZGVib3VuY2VkID0gZnVuY3Rpb24gKHJvb3Rfb3Jfc2VsZWN0b3IsIHNlbGVjdG9yLCB3YWl0X21zLCBhLCBiLCBjLCBjb2xvcikge1xyXG5cdFx0dmFyIHJvb3QgPSAodHlwZW9mIHJvb3Rfb3Jfc2VsZWN0b3IgPT09ICdzdHJpbmcnKSA/IGQgOiAocm9vdF9vcl9zZWxlY3RvciB8fCBkKTtcclxuXHRcdHZhciBzZWwgID0gKHR5cGVvZiByb290X29yX3NlbGVjdG9yID09PSAnc3RyaW5nJykgPyByb290X29yX3NlbGVjdG9yIDogc2VsZWN0b3I7XHJcblx0XHRpZiAoICFzZWwgKSB7IHJldHVybjsgfVxyXG5cdFx0dmFyIGVsID0gcm9vdC5xdWVyeVNlbGVjdG9yKCBzZWwgKTtcclxuXHRcdGlmICggIWVsICkgeyByZXR1cm47IH1cclxuXHJcblx0XHR2YXIgZGVmX21zID0gTnVtYmVyLmlzRmluaXRlKCBVSS5QVUxTRV9ERUJPVU5DRV9NUyApID8gVUkuUFVMU0VfREVCT1VOQ0VfTVMgOiAxMjA7XHJcblx0XHR2YXIgbXMgICAgID0gTnVtYmVyLmlzRmluaXRlKCB3YWl0X21zICkgPyB3YWl0X21zIDogZGVmX21zO1xyXG5cdFx0dmFyIG1ldGEgPSBVSS5fcHVsc2VfbWV0YS5nZXQoIGVsICkgfHwge307XHJcblx0XHR0cnkgeyBjbGVhclRpbWVvdXQoIG1ldGEuZGVib3VuY2VfaWQgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0bWV0YS5kZWJvdW5jZV9pZCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0VUkucHVsc2Vfc2VxdWVuY2UoIGVsLCBhLCBiLCBjLCBjb2xvciApO1xyXG5cdFx0fSwgbXMgKTtcclxuXHRcdFVJLl9wdWxzZV9tZXRhLnNldCggZWwsIG1ldGEgKTtcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHRcdFF1ZXJ5ICsgcHVsc2U6XHJcblx0XHQoQkMpIElmIG9ubHkgM3JkIGFyZyBpcyBhIG51bWJlciBhbmQgbm8gNHRoLzV0aCAtPiBzaW5nbGUgbG9uZyBwdWxzZS5cclxuXHRcdE90aGVyd2lzZSAtPiBzdHJvbmcgc2VxdWVuY2UgKGRlZmF1bHRzIDPDlzI4MC8xODApLlxyXG5cdFx0T3B0aW9uYWwgNnRoIGFyZzogY29sb3IuXHJcblx0XHRAcGFyYW0ge0hUTUxFbGVtZW50fHN0cmluZ30gcm9vdF9vcl9zZWxlY3RvclxyXG5cdFx0QHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl1cclxuXHRcdEBwYXJhbSB7bnVtYmVyfSBbYV1cclxuXHRcdEBwYXJhbSB7bnVtYmVyfSBbYl1cclxuXHJcblx0XHRAcGFyYW0ge251bWJlcn0gW2NdXHJcblxyXG5cdFx0QHBhcmFtIHtzdHJpbmd9IFtjb2xvcl1cclxuXHQgKi9cclxuXHRVSS5wdWxzZV9xdWVyeSA9IGZ1bmN0aW9uIChyb290X29yX3NlbGVjdG9yLCBzZWxlY3RvciwgYSwgYiwgYywgY29sb3IpIHtcclxuXHRcdHZhciByb290ID0gKHR5cGVvZiByb290X29yX3NlbGVjdG9yID09PSAnc3RyaW5nJykgPyBkIDogKHJvb3Rfb3Jfc2VsZWN0b3IgfHwgZCk7XHJcblx0XHR2YXIgc2VsICA9ICh0eXBlb2Ygcm9vdF9vcl9zZWxlY3RvciA9PT0gJ3N0cmluZycpID8gcm9vdF9vcl9zZWxlY3RvciA6IHNlbGVjdG9yO1xyXG5cdFx0aWYgKCAhc2VsICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGVsID0gcm9vdC5xdWVyeVNlbGVjdG9yKCBzZWwgKTtcclxuXHRcdGlmICggIWVsICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG4vLyBCYWNrLWNvbXBhdDogVUkucHVsc2VRdWVyeShyb290LCBzZWwsIGR1cl9tcylcclxuXHRcdGlmICggTnVtYmVyLmlzRmluaXRlKCBhICkgJiYgYiA9PT0gdW5kZWZpbmVkICYmIGMgPT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0cmV0dXJuIFVJLnB1bHNlX29uY2UoIGVsLCBhICk7XHJcblx0XHR9XHJcbi8vIE5ldzogc2VxdWVuY2U7IHBhcmFtcyBvcHRpb25hbDsgc3VwcG9ydHMgb3B0aW9uYWwgY29sb3IuXHJcblx0XHRVSS5wdWxzZV9zZXF1ZW5jZSggZWwsIGEsIGIsIGMsIGNvbG9yICk7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0Q29udmVuaWVuY2UgaGVscGVyIChzbmFrZV9jYXNlKSB0byBjYWxsIGEgc3Ryb25nIHB1bHNlIHdpdGggb3B0aW9ucy5cclxuXHJcblx0QHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuXHJcblx0QHBhcmFtIHtPYmplY3R9IFtvcHRzXVxyXG5cclxuXHRAcGFyYW0ge251bWJlcn0gW29wdHMudGltZXM9M11cclxuXHJcblx0QHBhcmFtIHtudW1iZXJ9IFtvcHRzLm9uX21zPTI4MF1cclxuXHJcblx0QHBhcmFtIHtudW1iZXJ9IFtvcHRzLm9mZl9tcz0xODBdXHJcblxyXG5cdEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb2xvcl1cclxuXHQgKi9cclxuXHRVSS5wdWxzZV9zZXF1ZW5jZV9zdHJvbmcgPSBmdW5jdGlvbiAoZWwsIG9wdHMpIHtcclxuXHRcdG9wdHMgPSBvcHRzIHx8IHt9O1xyXG5cdFx0VUkucHVsc2Vfc2VxdWVuY2UoXHJcblx0XHRcdGVsLFxyXG5cdFx0XHROdW1iZXIuaXNGaW5pdGUoIG9wdHMudGltZXMgKSA/IG9wdHMudGltZXMgOiAzLFxyXG5cdFx0XHROdW1iZXIuaXNGaW5pdGUoIG9wdHMub25fbXMgKSA/IG9wdHMub25fbXMgOiAyODAsXHJcblx0XHRcdE51bWJlci5pc0Zpbml0ZSggb3B0cy5vZmZfbXMgKSA/IG9wdHMub2ZmX21zIDogMTgwLFxyXG5cdFx0XHRvcHRzLmNvbG9yXHJcblx0XHQpO1xyXG5cdH07XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBCYXNlIGNsYXNzIGZvciBCRkIgbW9kdWxlcy5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9Nb2R1bGUgPSBjbGFzcyB7XHJcblx0XHQvKiogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlciAqL1xyXG5cdFx0Y29uc3RydWN0b3IoYnVpbGRlcikge1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIgPSBidWlsZGVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBJbml0aWFsaXplIHRoZSBtb2R1bGUuICovXHJcblx0XHRpbml0KCkge1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBDbGVhbnVwIHRoZSBtb2R1bGUuICovXHJcblx0XHRkZXN0cm95KCkge1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENlbnRyYWwgb3ZlcmxheS9jb250cm9scyBtYW5hZ2VyIGZvciBmaWVsZHMvc2VjdGlvbnMuXHJcblx0ICogUHVyZSBVSSBjb21wb3NpdGlvbjsgYWxsIGFjdGlvbnMgcm91dGUgYmFjayBpbnRvIHRoZSBidWlsZGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdFVJLldQQkNfQkZCX092ZXJsYXkgPSBjbGFzcyB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbnN1cmUgYW4gb3ZlcmxheSBleGlzdHMgYW5kIGlzIHdpcmVkIHVwIG9uIHRoZSBlbGVtZW50LlxyXG5cdFx0ICogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlclxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgLSBmaWVsZCBvciBzZWN0aW9uIGVsZW1lbnRcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGVuc3VyZShidWlsZGVyLCBlbCkge1xyXG5cclxuXHRcdFx0aWYgKCAhZWwgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IGlzU2VjdGlvbiA9IGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApO1xyXG5cclxuXHRcdFx0Ly8gbGV0IG92ZXJsYXkgPSBlbC5xdWVyeVNlbGVjdG9yKCBDb3JlLldQQkNfQkZCX0RPTS5TRUxFQ1RPUlMub3ZlcmxheSApO1xyXG5cdFx0XHRsZXQgb3ZlcmxheSA9IGVsLnF1ZXJ5U2VsZWN0b3IoIGA6c2NvcGUgPiAke0NvcmUuV1BCQ19CRkJfRE9NLlNFTEVDVE9SUy5vdmVybGF5fWAgKTtcclxuXHRcdFx0aWYgKCAhb3ZlcmxheSApIHtcclxuXHRcdFx0XHRvdmVybGF5ID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuY3JlYXRlX2VsZW1lbnQoICdkaXYnLCAnd3BiY19iZmJfX292ZXJsYXktY29udHJvbHMnICk7XHJcblx0XHRcdFx0ZWwucHJlcGVuZCggb3ZlcmxheSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBEcmFnIGhhbmRsZS5cclxuXHRcdFx0aWYgKCAhb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19kcmFnLWhhbmRsZScgKSApIHtcclxuXHRcdFx0XHRjb25zdCBkcmFnQ2xhc3MgPSBpc1NlY3Rpb24gPyAnd3BiY19iZmJfX2RyYWctaGFuZGxlIHNlY3Rpb24tZHJhZy1oYW5kbGUnIDogJ3dwYmNfYmZiX19kcmFnLWhhbmRsZSc7XHJcblx0XHRcdFx0b3ZlcmxheS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRcdENvcmUuV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyLmNyZWF0ZV9lbGVtZW50KCAnc3BhbicsIGRyYWdDbGFzcywgJzxzcGFuIGNsYXNzPVwid3BiY19pY25fZHJhZ19pbmRpY2F0b3JcIj48L3NwYW4+JyApXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU0VUVElOR1MgYnV0dG9uIChzaG93biBmb3IgYm90aCBmaWVsZHMgJiBzZWN0aW9ucykuXHJcblx0XHRcdGlmICggIW92ZXJsYXkucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fc2V0dGluZ3MtYnRuJyApICkge1xyXG5cdFx0XHRcdGNvbnN0IHNldHRpbmdzX2J0biAgID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuY3JlYXRlX2VsZW1lbnQoICdidXR0b24nLCAnd3BiY19iZmJfX3NldHRpbmdzLWJ0bicsICc8aSBjbGFzcz1cIm1lbnVfaWNvbiBpY29uLTF4IHdwYmNfaWNuX3NldHRpbmdzXCI+PC9pPicgKTtcclxuXHRcdFx0XHRzZXR0aW5nc19idG4udHlwZSAgICA9ICdidXR0b24nO1xyXG5cdFx0XHRcdHNldHRpbmdzX2J0bi50aXRsZSAgID0gJ09wZW4gc2V0dGluZ3MnO1xyXG5cdFx0XHRcdHNldHRpbmdzX2J0bi5vbmNsaWNrID0gKGUpID0+IHtcclxuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdC8vIFNlbGVjdCBUSElTIGVsZW1lbnQgYW5kIHNjcm9sbCBpdCBpbnRvIHZpZXcuXHJcblx0XHRcdFx0XHRidWlsZGVyLnNlbGVjdF9maWVsZCggZWwsIHsgc2Nyb2xsSW50b1ZpZXc6IHRydWUgfSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIEF1dG8tb3BlbiBJbnNwZWN0b3IgZnJvbSB0aGUgb3ZlcmxheSDigJxTZXR0aW5nc+KAnSBidXR0b24uXHJcblx0XHRcdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZShcclxuXHRcdFx0XHRcdFx0J3dwYmNfYmZiOnNob3dfcGFuZWwnLFxyXG5cdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0cGFuZWxfaWQ6ICd3cGJjX2JmYl9faW5zcGVjdG9yJyxcclxuXHRcdFx0XHRcdFx0XHR0YWJfaWQgIDogJ3dwYmNfdGFiX2luc3BlY3RvcidcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHQvLyBUcnkgdG8gYnJpbmcgdGhlIGluc3BlY3RvciBpbnRvIHZpZXcgLyBmb2N1cyBmaXJzdCBpbnB1dC5cclxuXHRcdFx0XHRcdGNvbnN0IGlucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRcdGlmICggaW5zICkge1xyXG5cdFx0XHRcdFx0XHRpbnMuc2Nyb2xsSW50b1ZpZXcoIHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnIH0gKTtcclxuXHRcdFx0XHRcdFx0Ly8gRm9jdXMgZmlyc3QgaW50ZXJhY3RpdmUgY29udHJvbCAoYmVzdC1lZmZvcnQpLlxyXG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZm9jdXNhYmxlID0gaW5zLnF1ZXJ5U2VsZWN0b3IoICdpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uLFtjb250ZW50ZWRpdGFibGVdLFt0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKScgKTtcclxuXHRcdFx0XHRcdFx0XHRmb2N1c2FibGU/LmZvY3VzPy4oKTtcclxuXHRcdFx0XHRcdFx0fSwgMjYwICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0b3ZlcmxheS5hcHBlbmRDaGlsZCggc2V0dGluZ3NfYnRuICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG92ZXJsYXkuc2V0QXR0cmlidXRlKCAncm9sZScsICd0b29sYmFyJyApO1xyXG5cdFx0XHRvdmVybGF5LnNldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWwnLCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKSA/ICdTZWN0aW9uIHRvb2xzJyA6ICdGaWVsZCB0b29scycgKTtcclxuXHJcblx0XHRcdHJldHVybiBvdmVybGF5O1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdQQkMgTGF5b3V0IENoaXBzIGhlbHBlciAtIHZpc3VhbCBsYXlvdXQgcGlja2VyIChjaGlwcyksIGUuZy4sIFwiNTAlLzUwJVwiLCB0byBhIHNlY3Rpb24gb3ZlcmxheS5cclxuXHQgKlxyXG5cdCAqIFJlbmRlcnMgRXF1YWwvUHJlc2V0cy9DdXN0b20gY2hpcHMgaW50byBhIGhvc3QgY29udGFpbmVyIGFuZCB3aXJlcyB0aGVtIHRvIGFwcGx5IHRoZSBsYXlvdXQuXHJcblx0ICovXHJcblx0VUkuV1BCQ19CRkJfTGF5b3V0X0NoaXBzID0gY2xhc3Mge1xyXG5cclxuXHRcdC8qKiBSZWFkIHBlci1jb2x1bW4gbWluIChweCkgZnJvbSBDU1MgdmFyIHNldCBieSB0aGUgZ3VhcmQuICovXHJcblx0XHRzdGF0aWMgX2dldF9jb2xfbWluX3B4KGNvbCkge1xyXG5cdFx0XHRjb25zdCB2ID0gZ2V0Q29tcHV0ZWRTdHlsZSggY29sICkuZ2V0UHJvcGVydHlWYWx1ZSggJy0td3BiYy1jb2wtbWluJyApIHx8ICcwJztcclxuXHRcdFx0Y29uc3QgbiA9IHBhcnNlRmxvYXQoIHYgKTtcclxuXHRcdFx0cmV0dXJuIE51bWJlci5pc0Zpbml0ZSggbiApID8gTWF0aC5tYXgoIDAsIG4gKSA6IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUdXJuIHJhdyB3ZWlnaHRzIChlLmcuIFsxLDFdLCBbMiwxLDFdKSBpbnRvIGVmZmVjdGl2ZSBcImF2YWlsYWJsZS0lXCIgYmFzZXMgdGhhdFxyXG5cdFx0ICogKGEpIHN1bSB0byB0aGUgcm93J3MgYXZhaWxhYmxlICUsIGFuZCAoYikgbWVldCBldmVyeSBjb2x1bW4ncyBtaW4gcHguXHJcblx0XHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJhc2VzIChudW1iZXJzKSBvciBudWxsIGlmIGltcG9zc2libGUgdG8gc2F0aXNmeSBtaW5zLlxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgX2ZpdF93ZWlnaHRzX3Jlc3BlY3RpbmdfbWluKGJ1aWxkZXIsIHJvdywgd2VpZ2h0cykge1xyXG5cdFx0XHRjb25zdCBjb2xzID0gQXJyYXkuZnJvbSggcm93LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKSApO1xyXG5cdFx0XHRjb25zdCBuICAgID0gY29scy5sZW5ndGg7XHJcblx0XHRcdGlmICggIW4gKSByZXR1cm4gbnVsbDtcclxuXHRcdFx0aWYgKCAhQXJyYXkuaXNBcnJheSggd2VpZ2h0cyApIHx8IHdlaWdodHMubGVuZ3RoICE9PSBuICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHQvLyBhdmFpbGFibGUgJSBhZnRlciBnYXBzIChmcm9tIExheW91dFNlcnZpY2UpXHJcblx0XHRcdGNvbnN0IGdwICAgICAgID0gYnVpbGRlci5jb2xfZ2FwX3BlcmNlbnQ7XHJcblx0XHRcdGNvbnN0IGVmZiAgICAgID0gYnVpbGRlci5sYXlvdXQuY29tcHV0ZV9lZmZlY3RpdmVfYmFzZXNfZnJvbV9yb3coIHJvdywgZ3AgKTtcclxuXHRcdFx0Y29uc3QgYXZhaWxQY3QgPSBlZmYuYXZhaWxhYmxlOyAgICAgICAgICAgICAgIC8vIGUuZy4gOTQgaWYgMiBjb2xzIGFuZCAzJSBnYXBcclxuXHRcdFx0Y29uc3Qgcm93UHggICAgPSByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcblx0XHRcdGNvbnN0IGF2YWlsUHggID0gcm93UHggKiAoYXZhaWxQY3QgLyAxMDApO1xyXG5cclxuXHRcdFx0Ly8gY29sbGVjdCBtaW5pbWEgaW4gJSBvZiBcImF2YWlsYWJsZVwiXHJcblx0XHRcdGNvbnN0IG1pblBjdCA9IGNvbHMubWFwKCAoYykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IG1pblB4ID0gVUkuV1BCQ19CRkJfTGF5b3V0X0NoaXBzLl9nZXRfY29sX21pbl9weCggYyApO1xyXG5cdFx0XHRcdGlmICggYXZhaWxQeCA8PSAwICkgcmV0dXJuIDA7XHJcblx0XHRcdFx0cmV0dXJuIChtaW5QeCAvIGF2YWlsUHgpICogYXZhaWxQY3Q7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdC8vIElmIG1pbnMgYWxvbmUgZG9uJ3QgZml0LCBiYWlsLlxyXG5cdFx0XHRjb25zdCBzdW1NaW4gPSBtaW5QY3QucmVkdWNlKCAoYSwgYikgPT4gYSArIGIsIDAgKTtcclxuXHRcdFx0aWYgKCBzdW1NaW4gPiBhdmFpbFBjdCAtIDFlLTYgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7IC8vIGltcG9zc2libGUgdG8gcmVzcGVjdCBtaW5zOyBkb24ndCBhcHBseSBwcmVzZXRcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVGFyZ2V0IHBlcmNlbnRhZ2VzIGZyb20gd2VpZ2h0cywgbm9ybWFsaXplZCB0byBhdmFpbFBjdC5cclxuXHRcdFx0Y29uc3Qgd1N1bSAgICAgID0gd2VpZ2h0cy5yZWR1Y2UoIChhLCB3KSA9PiBhICsgKE51bWJlciggdyApIHx8IDApLCAwICkgfHwgbjtcclxuXHRcdFx0Y29uc3QgdGFyZ2V0UGN0ID0gd2VpZ2h0cy5tYXAoICh3KSA9PiAoKE51bWJlciggdyApIHx8IDApIC8gd1N1bSkgKiBhdmFpbFBjdCApO1xyXG5cclxuXHRcdFx0Ly8gTG9jayBjb2x1bW5zIHRoYXQgd291bGQgYmUgYmVsb3cgbWluLCB0aGVuIGRpc3RyaWJ1dGUgdGhlIHJlbWFpbmRlclxyXG5cdFx0XHQvLyBhY3Jvc3MgdGhlIHJlbWFpbmluZyBjb2x1bW5zIHByb3BvcnRpb25hbGx5IHRvIHRoZWlyIHRhcmdldFBjdC5cclxuXHRcdFx0Y29uc3QgbG9ja2VkICA9IG5ldyBBcnJheSggbiApLmZpbGwoIGZhbHNlICk7XHJcblx0XHRcdGxldCBsb2NrZWRTdW0gPSAwO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBuOyBpKysgKSB7XHJcblx0XHRcdFx0aWYgKCB0YXJnZXRQY3RbaV0gPCBtaW5QY3RbaV0gKSB7XHJcblx0XHRcdFx0XHRsb2NrZWRbaV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0bG9ja2VkU3VtICs9IG1pblBjdFtpXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCByZW1haW5pbmcgICAgID0gYXZhaWxQY3QgLSBsb2NrZWRTdW07XHJcblx0XHRcdGNvbnN0IGZyZWVJZHggICAgID0gW107XHJcblx0XHRcdGxldCBmcmVlVGFyZ2V0U3VtID0gMDtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbjsgaSsrICkge1xyXG5cdFx0XHRcdGlmICggIWxvY2tlZFtpXSApIHtcclxuXHRcdFx0XHRcdGZyZWVJZHgucHVzaCggaSApO1xyXG5cdFx0XHRcdFx0ZnJlZVRhcmdldFN1bSArPSB0YXJnZXRQY3RbaV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoIG4gKS5maWxsKCAwICk7XHJcblx0XHRcdC8vIFNlZWQgbG9ja2VkIHdpdGggdGhlaXIgbWluaW1hLlxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBuOyBpKysgKSB7XHJcblx0XHRcdFx0aWYgKCBsb2NrZWRbaV0gKSByZXN1bHRbaV0gPSBtaW5QY3RbaV07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZnJlZUlkeC5sZW5ndGggPT09IDAgKSB7XHJcblx0XHRcdFx0Ly8gZXZlcnl0aGluZyBsb2NrZWQgZXhhY3RseSBhdCBtaW47IGFueSBsZWZ0b3ZlciAoc2hvdWxkbid0IGhhcHBlbilcclxuXHRcdFx0XHQvLyB3b3VsZCBiZSBpZ25vcmVkIHRvIGtlZXAgc2ltcGxpY2l0eSBhbmQgc3RhYmlsaXR5LlxyXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVtYWluaW5nIDw9IDAgKSB7XHJcblx0XHRcdFx0Ly8gbm90aGluZyBsZWZ0IHRvIGRpc3RyaWJ1dGU7IGtlZXAgZXhhY3RseSBtaW5zIG9uIGxvY2tlZCxcclxuXHRcdFx0XHQvLyBub3RoaW5nIGZvciBmcmVlIChkZWdlbmVyYXRlIGJ1dCBjb25zaXN0ZW50KVxyXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZnJlZVRhcmdldFN1bSA8PSAwICkge1xyXG5cdFx0XHRcdC8vIGRpc3RyaWJ1dGUgZXF1YWxseSBhbW9uZyBmcmVlIGNvbHVtbnNcclxuXHRcdFx0XHRjb25zdCBlYWNoID0gcmVtYWluaW5nIC8gZnJlZUlkeC5sZW5ndGg7XHJcblx0XHRcdFx0ZnJlZUlkeC5mb3JFYWNoKCAoaSkgPT4gKHJlc3VsdFtpXSA9IGVhY2gpICk7XHJcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRGlzdHJpYnV0ZSByZW1haW5pbmcgcHJvcG9ydGlvbmFsbHkgdG8gZnJlZSBjb2x1bW5zJyB0YXJnZXRQY3RcclxuXHRcdFx0ZnJlZUlkeC5mb3JFYWNoKCAoaSkgPT4ge1xyXG5cdFx0XHRcdHJlc3VsdFtpXSA9IHJlbWFpbmluZyAqICh0YXJnZXRQY3RbaV0gLyBmcmVlVGFyZ2V0U3VtKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBBcHBseSBhIHByZXNldCBidXQgZ3VhcmQgaXQgYnkgbWluaW1hOyByZXR1cm5zIHRydWUgaWYgYXBwbGllZCwgZmFsc2UgaWYgc2tpcHBlZC4gKi9cclxuXHRcdHN0YXRpYyBfYXBwbHlfcHJlc2V0X3dpdGhfbWluX2d1YXJkKGJ1aWxkZXIsIHNlY3Rpb25fZWwsIHdlaWdodHMpIHtcclxuXHRcdFx0Y29uc3Qgcm93ID0gc2VjdGlvbl9lbC5xdWVyeVNlbGVjdG9yKCAnOnNjb3BlID4gLndwYmNfYmZiX19yb3cnICk7XHJcblx0XHRcdGlmICggIXJvdyApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdGNvbnN0IGZpdHRlZCA9IFVJLldQQkNfQkZCX0xheW91dF9DaGlwcy5fZml0X3dlaWdodHNfcmVzcGVjdGluZ19taW4oIGJ1aWxkZXIsIHJvdywgd2VpZ2h0cyApO1xyXG5cdFx0XHRpZiAoICFmaXR0ZWQgKSB7XHJcblx0XHRcdFx0YnVpbGRlcj8uX2Fubm91bmNlPy4oICdOb3QgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGxheW91dCBiZWNhdXNlIG9mIGZpZWxkc+KAmSBtaW5pbXVtIHdpZHRocy4nICk7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBgZml0dGVkYCBhbHJlYWR5IHN1bXMgdG8gdGhlIHJvd+KAmXMgYXZhaWxhYmxlICUsIHNvIHdlIGNhbiBhcHBseSBiYXNlcyBkaXJlY3RseS5cclxuXHRcdFx0YnVpbGRlci5sYXlvdXQuYXBwbHlfYmFzZXNfdG9fcm93KCByb3csIGZpdHRlZCApO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCdWlsZCBhbmQgYXBwZW5kIGxheW91dCBjaGlwcyBmb3IgYSBzZWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7V1BCQ19Gb3JtX0J1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgZm9ybSBidWlsZGVyIGluc3RhbmNlLlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2VjdGlvbl9lbCAtIFRoZSAud3BiY19iZmJfX3NlY3Rpb24gZWxlbWVudC5cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGhvc3RfZWwgLSBDb250YWluZXIgd2hlcmUgY2hpcHMgc2hvdWxkIGJlIHJlbmRlcmVkLlxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyByZW5kZXJfZm9yX3NlY3Rpb24oYnVpbGRlciwgc2VjdGlvbl9lbCwgaG9zdF9lbCkge1xyXG5cclxuXHRcdFx0aWYgKCAhYnVpbGRlciB8fCAhc2VjdGlvbl9lbCB8fCAhaG9zdF9lbCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJvdyA9IHNlY3Rpb25fZWwucXVlcnlTZWxlY3RvciggJzpzY29wZSA+IC53cGJjX2JmYl9fcm93JyApO1xyXG5cdFx0XHRpZiAoICFyb3cgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjb2xzID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKS5sZW5ndGggfHwgMTtcclxuXHJcblx0XHRcdC8vIENsZWFyIGhvc3QuXHJcblx0XHRcdGhvc3RfZWwuaW5uZXJIVE1MID0gJyc7XHJcblxyXG5cdFx0XHQvLyBFcXVhbCBjaGlwLlxyXG5cdFx0XHRob3N0X2VsLmFwcGVuZENoaWxkKFxyXG5cdFx0XHRcdFVJLldQQkNfQkZCX0xheW91dF9DaGlwcy5fbWFrZV9jaGlwKCBidWlsZGVyLCBzZWN0aW9uX2VsLCBBcnJheSggY29scyApLmZpbGwoIDEgKSwgJ0VxdWFsJyApXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHQvLyBQcmVzZXRzIGJhc2VkIG9uIGNvbHVtbiBjb3VudC5cclxuXHRcdFx0Y29uc3QgcHJlc2V0cyA9IGJ1aWxkZXIubGF5b3V0LmJ1aWxkX3ByZXNldHNfZm9yX2NvbHVtbnMoIGNvbHMgKTtcclxuXHRcdFx0cHJlc2V0cy5mb3JFYWNoKCAod2VpZ2h0cykgPT4ge1xyXG5cdFx0XHRcdGhvc3RfZWwuYXBwZW5kQ2hpbGQoXHJcblx0XHRcdFx0XHRVSS5XUEJDX0JGQl9MYXlvdXRfQ2hpcHMuX21ha2VfY2hpcCggYnVpbGRlciwgc2VjdGlvbl9lbCwgd2VpZ2h0cywgbnVsbCApXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Ly8gQ3VzdG9tIGNoaXAuXHJcblx0XHRcdGNvbnN0IGN1c3RvbUJ0biAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdidXR0b24nICk7XHJcblx0XHRcdGN1c3RvbUJ0bi50eXBlICAgICAgICA9ICdidXR0b24nO1xyXG5cdFx0XHRjdXN0b21CdG4uY2xhc3NOYW1lICAgPSAnd3BiY19iZmJfX2xheW91dF9jaGlwJztcclxuXHRcdFx0Y3VzdG9tQnRuLnRleHRDb250ZW50ID0gJ0N1c3RvbeKApic7XHJcblx0XHRcdGN1c3RvbUJ0bi50aXRsZSAgICAgICA9IGBFbnRlciAke2NvbHN9IHBlcmNlbnRhZ2VzYDtcclxuXHRcdFx0Y3VzdG9tQnRuLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsICgpID0+IHtcclxuXHRcdFx0XHRjb25zdCBleGFtcGxlID0gKGNvbHMgPT09IDIpID8gJzUwLDUwJyA6IChjb2xzID09PSAzID8gJzIwLDYwLDIwJyA6ICcyNSwyNSwyNSwyNScpO1xyXG5cdFx0XHRcdGNvbnN0IHRleHQgICAgPSBwcm9tcHQoIGBFbnRlciAke2NvbHN9IHBlcmNlbnRhZ2VzIChjb21tYSBvciBzcGFjZSBzZXBhcmF0ZWQpOmAsIGV4YW1wbGUgKTtcclxuXHRcdFx0XHRpZiAoIHRleHQgPT0gbnVsbCApIHJldHVybjtcclxuXHRcdFx0XHRjb25zdCB3ZWlnaHRzID0gYnVpbGRlci5sYXlvdXQucGFyc2Vfd2VpZ2h0cyggdGV4dCApO1xyXG5cdFx0XHRcdGlmICggd2VpZ2h0cy5sZW5ndGggIT09IGNvbHMgKSB7XHJcblx0XHRcdFx0XHRhbGVydCggYFBsZWFzZSBlbnRlciBleGFjdGx5ICR7Y29sc30gbnVtYmVycy5gICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIE9MRDpcclxuXHRcdFx0XHQvLyBidWlsZGVyLmxheW91dC5hcHBseV9sYXlvdXRfcHJlc2V0KCBzZWN0aW9uX2VsLCB3ZWlnaHRzLCBidWlsZGVyLmNvbF9nYXBfcGVyY2VudCApO1xyXG5cdFx0XHRcdC8vIEd1YXJkZWQgYXBwbHk6LlxyXG5cdFx0XHRcdGlmICggIVVJLldQQkNfQkZCX0xheW91dF9DaGlwcy5fYXBwbHlfcHJlc2V0X3dpdGhfbWluX2d1YXJkKCBidWlsZGVyLCBzZWN0aW9uX2VsLCB3ZWlnaHRzICkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGhvc3RfZWwucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fbGF5b3V0X2NoaXAnICkuZm9yRWFjaCggYyA9PiBjLmNsYXNzTGlzdC5yZW1vdmUoICdpcy1hY3RpdmUnICkgKTtcclxuXHRcdFx0XHRjdXN0b21CdG4uY2xhc3NMaXN0LmFkZCggJ2lzLWFjdGl2ZScgKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0XHRob3N0X2VsLmFwcGVuZENoaWxkKCBjdXN0b21CdG4gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENyZWF0ZSBhIHNpbmdsZSBsYXlvdXQgY2hpcCBidXR0b24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBwYXJhbSB7V1BCQ19Gb3JtX0J1aWxkZXJ9IGJ1aWxkZXJcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNlY3Rpb25fZWxcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyW119IHdlaWdodHNcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhYmVsXHJcblx0XHQgKiBAcmV0dXJucyB7SFRNTEJ1dHRvbkVsZW1lbnR9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBfbWFrZV9jaGlwKGJ1aWxkZXIsIHNlY3Rpb25fZWwsIHdlaWdodHMsIGxhYmVsID0gbnVsbCkge1xyXG5cclxuXHRcdFx0Y29uc3QgYnRuICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdidXR0b24nICk7XHJcblx0XHRcdGJ0bi50eXBlICAgICAgPSAnYnV0dG9uJztcclxuXHRcdFx0YnRuLmNsYXNzTmFtZSA9ICd3cGJjX2JmYl9fbGF5b3V0X2NoaXAnO1xyXG5cclxuXHRcdFx0Y29uc3QgdGl0bGUgPSBsYWJlbCB8fCBidWlsZGVyLmxheW91dC5mb3JtYXRfcHJlc2V0X2xhYmVsKCB3ZWlnaHRzICk7XHJcblx0XHRcdGJ0bi50aXRsZSAgID0gdGl0bGU7XHJcblxyXG5cdFx0XHQvLyBWaXN1YWwgbWluaWF0dXJlLlxyXG5cdFx0XHRjb25zdCB2aXMgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0dmlzLmNsYXNzTmFtZSA9ICd3cGJjX2JmYl9fbGF5b3V0X2NoaXAtdmlzJztcclxuXHRcdFx0Y29uc3Qgc3VtICAgICA9IHdlaWdodHMucmVkdWNlKCAoYSwgYikgPT4gYSArIChOdW1iZXIoIGIgKSB8fCAwKSwgMCApIHx8IDE7XHJcblx0XHRcdHdlaWdodHMuZm9yRWFjaCggKHcpID0+IHtcclxuXHRcdFx0XHRjb25zdCBiYXIgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdzcGFuJyApO1xyXG5cdFx0XHRcdGJhci5zdHlsZS5mbGV4ID0gYDAgMCBjYWxjKCAkeygoTnVtYmVyKCB3ICkgfHwgMCkgLyBzdW0gKiAxMDApLnRvRml4ZWQoIDMgKX0lIC0gMS41cHggKWA7XHJcblx0XHRcdFx0dmlzLmFwcGVuZENoaWxkKCBiYXIgKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0XHRidG4uYXBwZW5kQ2hpbGQoIHZpcyApO1xyXG5cclxuXHRcdFx0Y29uc3QgdHh0ICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3NwYW4nICk7XHJcblx0XHRcdHR4dC5jbGFzc05hbWUgICA9ICd3cGJjX2JmYl9fbGF5b3V0X2NoaXAtbGFiZWwnO1xyXG5cdFx0XHR0eHQudGV4dENvbnRlbnQgPSBsYWJlbCB8fCBidWlsZGVyLmxheW91dC5mb3JtYXRfcHJlc2V0X2xhYmVsKCB3ZWlnaHRzICk7XHJcblx0XHRcdGJ0bi5hcHBlbmRDaGlsZCggdHh0ICk7XHJcblxyXG5cdFx0XHRidG4uYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHRcdC8vIE9MRDpcclxuXHRcdFx0XHQvLyBidWlsZGVyLmxheW91dC5hcHBseV9sYXlvdXRfcHJlc2V0KCBzZWN0aW9uX2VsLCB3ZWlnaHRzLCBidWlsZGVyLmNvbF9nYXBfcGVyY2VudCApO1xyXG5cclxuXHRcdFx0XHQvLyBORVc6XHJcblx0XHRcdFx0aWYgKCAhVUkuV1BCQ19CRkJfTGF5b3V0X0NoaXBzLl9hcHBseV9wcmVzZXRfd2l0aF9taW5fZ3VhcmQoIGJ1aWxkZXIsIHNlY3Rpb25fZWwsIHdlaWdodHMgKSApIHtcclxuXHRcdFx0XHRcdHJldHVybjsgLy8gZG8gbm90IHRvZ2dsZSBhY3RpdmUgaWYgd2UgZGlkbid0IGNoYW5nZSBsYXlvdXRcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJ0bi5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19sYXlvdXRfY2hpcCcgKS5mb3JFYWNoKCBjID0+IGMuY2xhc3NMaXN0LnJlbW92ZSggJ2lzLWFjdGl2ZScgKSApO1xyXG5cdFx0XHRcdGJ0bi5jbGFzc0xpc3QuYWRkKCAnaXMtYWN0aXZlJyApO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnRuO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlbGVjdGlvbiBjb250cm9sbGVyIGZvciBmaWVsZHMgYW5kIGFubm91bmNlbWVudHMuXHJcblx0ICovXHJcblx0VUkuV1BCQ19CRkJfU2VsZWN0aW9uX0NvbnRyb2xsZXIgPSBjbGFzcyBleHRlbmRzIFVJLldQQkNfQkZCX01vZHVsZSB7XHJcblxyXG5cdFx0aW5pdCgpIHtcclxuXHJcblx0XHRcdHRoaXMuX3NlbGVjdGVkX3VpZCAgICAgICAgICAgICAgPSBudWxsO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuc2VsZWN0X2ZpZWxkICAgICAgID0gdGhpcy5zZWxlY3RfZmllbGQuYmluZCggdGhpcyApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuZ2V0X3NlbGVjdGVkX2ZpZWxkID0gdGhpcy5nZXRfc2VsZWN0ZWRfZmllbGQuYmluZCggdGhpcyApO1xyXG5cdFx0XHR0aGlzLl9vbl9jbGVhciAgICAgICAgICAgICAgICAgID0gdGhpcy5vbl9jbGVhci5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0XHQvLyBDZW50cmFsaXplZCBkZWxldGUgY29tbWFuZCB1c2VkIGJ5IGtleWJvYXJkICsgaW5zcGVjdG9yICsgb3ZlcmxheS5cclxuXHRcdFx0dGhpcy5idWlsZGVyLmRlbGV0ZV9pdGVtID0gKGVsKSA9PiB7XHJcblx0XHRcdFx0aWYgKCAhZWwgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgYiAgICAgICAgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdFx0Y29uc3QgbmVpZ2hib3IgPSBiLl9maW5kX25laWdoYm9yX3NlbGVjdGFibGU/LiggZWwgKSB8fCBudWxsO1xyXG5cdFx0XHRcdGVsLnJlbW92ZSgpO1xyXG5cdFx0XHRcdC8vIFVzZSBsb2NhbCBDb3JlIGNvbnN0YW50cyAobm90IGEgZ2xvYmFsKSB0byBhdm9pZCBSZWZlcmVuY2VFcnJvcnMuXHJcblx0XHRcdFx0Yi5idXM/LmVtaXQ/LiggQ29yZS5XUEJDX0JGQl9FdmVudHMuRklFTERfUkVNT1ZFLCB7IGVsLCBpZDogZWw/LmRhdGFzZXQ/LmlkLCB1aWQ6IGVsPy5kYXRhc2V0Py51aWQgfSApO1xyXG5cdFx0XHRcdGIudXNhZ2U/LnVwZGF0ZV9wYWxldHRlX3VpPy4oKTtcclxuXHRcdFx0XHQvLyBOb3RpZnkgZ2VuZXJpYyBzdHJ1Y3R1cmUgbGlzdGVuZXJzLCB0b286XHJcblx0XHRcdFx0Yi5idXM/LmVtaXQ/LiggQ29yZS5XUEJDX0JGQl9FdmVudHMuU1RSVUNUVVJFX0NIQU5HRSwgeyByZWFzb246ICdkZWxldGUnLCBlbCB9ICk7XHJcblx0XHRcdFx0Ly8gRGVmZXIgc2VsZWN0aW9uIGEgdGljayBzbyB0aGUgRE9NIGlzIGZ1bGx5IHNldHRsZWQgYmVmb3JlIEluc3BlY3RvciBoeWRyYXRlcy5cclxuXHRcdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcclxuXHRcdFx0XHRcdC8vIFRoaXMgY2FsbHMgaW5zcGVjdG9yLmJpbmRfdG9fZmllbGQoKSBhbmQgb3BlbnMgdGhlIEluc3BlY3RvciBwYW5lbC5cclxuXHRcdFx0XHRcdGIuc2VsZWN0X2ZpZWxkPy4oIG5laWdoYm9yIHx8IG51bGwsIHsgc2Nyb2xsSW50b1ZpZXc6ICEhbmVpZ2hib3IgfSApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRyZXR1cm4gbmVpZ2hib3I7XHJcblx0XHRcdH07XHJcblx0XHRcdHRoaXMuYnVpbGRlci5idXMub24oIENvcmUuV1BCQ19CRkJfRXZlbnRzLkNMRUFSX1NFTEVDVElPTiwgdGhpcy5fb25fY2xlYXIgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLmJ1cy5vbiggQ29yZS5XUEJDX0JGQl9FdmVudHMuU1RSVUNUVVJFX0xPQURFRCwgdGhpcy5fb25fY2xlYXIgKTtcclxuXHRcdFx0Ly8gZGVsZWdhdGVkIGNsaWNrIHNlbGVjdGlvbiAoY2FwdHVyZSBlbnN1cmVzIHdlIHdpbiBiZWZvcmUgYnViYmxpbmcgdG8gY29udGFpbmVycykuXHJcblx0XHRcdHRoaXMuX29uX2NhbnZhc19jbGljayA9IHRoaXMuX2hhbmRsZV9jYW52YXNfY2xpY2suYmluZCggdGhpcyApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIucGFnZXNfY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMuX29uX2NhbnZhc19jbGljaywgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGRlc3Ryb3koKSB7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5idXMub2ZmKCBDb3JlLldQQkNfQkZCX0V2ZW50cy5DTEVBUl9TRUxFQ1RJT04sIHRoaXMuX29uX2NsZWFyICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX29uX2NhbnZhc19jbGljayApIHtcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIucGFnZXNfY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMuX29uX2NhbnZhc19jbGljaywgdHJ1ZSApO1xyXG5cdFx0XHRcdHRoaXMuX29uX2NhbnZhc19jbGljayA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlbGVnYXRlZCBjYW52YXMgY2xpY2sgLT4gc2VsZWN0IGNsb3Nlc3QgZmllbGQvc2VjdGlvbiAoaW5uZXIgYmVhdHMgb3V0ZXIpLlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBwYXJhbSB7TW91c2VFdmVudH0gZVxyXG5cdFx0ICovXHJcblx0XHRfaGFuZGxlX2NhbnZhc19jbGljayhlKSB7XHJcblx0XHRcdGNvbnN0IHJvb3QgPSB0aGlzLmJ1aWxkZXIucGFnZXNfY29udGFpbmVyO1xyXG5cdFx0XHRpZiAoICFyb290ICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Ly8gSWdub3JlIGNsaWNrcyBvbiBjb250cm9scy9oYW5kbGVzL3Jlc2l6ZXJzLCBldGMuXHJcblx0XHRcdGNvbnN0IElHTk9SRSA9IFtcclxuXHRcdFx0XHQnLndwYmNfYmZiX19vdmVybGF5LWNvbnRyb2xzJyxcclxuXHRcdFx0XHQnLndwYmNfYmZiX19sYXlvdXRfcGlja2VyJyxcclxuXHRcdFx0XHQnLndwYmNfYmZiX19kcmFnLWhhbmRsZScsXHJcblx0XHRcdFx0Jy53cGJjX2JmYl9fZmllbGQtcmVtb3ZlLWJ0bicsXHJcblx0XHRcdFx0Jy53cGJjX2JmYl9fZmllbGQtbW92ZS11cCcsXHJcblx0XHRcdFx0Jy53cGJjX2JmYl9fZmllbGQtbW92ZS1kb3duJyxcclxuXHRcdFx0XHQnLndwYmNfYmZiX19jb2x1bW4tcmVzaXplcidcclxuXHRcdFx0XS5qb2luKCAnLCcgKTtcclxuXHJcblx0XHRcdGlmICggZS50YXJnZXQuY2xvc2VzdCggSUdOT1JFICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuOyAvLyBsZXQgdGhvc2UgY29udHJvbHMgZG8gdGhlaXIgb3duIHRoaW5nLlxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGaW5kIHRoZSBjbG9zZXN0IHNlbGVjdGFibGUgKGZpZWxkIE9SIHNlY3Rpb24pIGZyb20gdGhlIGNsaWNrIHRhcmdldC5cclxuXHRcdFx0bGV0IGhpdCA9IGUudGFyZ2V0LmNsb3Nlc3Q/LihcclxuXHRcdFx0XHRgJHtDb3JlLldQQkNfQkZCX0RPTS5TRUxFQ1RPUlMudmFsaWRGaWVsZH0sICR7Q29yZS5XUEJDX0JGQl9ET00uU0VMRUNUT1JTLnNlY3Rpb259LCAud3BiY19iZmJfX2NvbHVtbmBcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdGlmICggIWhpdCB8fCAhcm9vdC5jb250YWlucyggaGl0ICkgKSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RfZmllbGQoIG51bGwgKTsgICAgICAgICAgIC8vIENsZWFyIHNlbGVjdGlvbiBvbiBibGFuayBjbGljay5cclxuXHRcdFx0XHRyZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgc3BhY2UgaXMgaGFuZGxlZCBlbHNld2hlcmUuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5FVzogaWYgdXNlciBjbGlja2VkIGEgQ09MVU1OIC0+IHJlbWVtYmVyIHRhYiBrZXkgb24gaXRzIFNFQ1RJT04sIGJ1dCBzdGlsbCBzZWxlY3QgdGhlIHNlY3Rpb24uXHJcblx0XHRcdGxldCBwcmVzZWxlY3RfdGFiX2tleSA9IG51bGw7XHJcblx0XHRcdGlmICggaGl0LmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19jb2x1bW4nICkgKSB7XHJcblx0XHRcdFx0Y29uc3Qgcm93ICA9IGhpdC5jbG9zZXN0KCAnLndwYmNfYmZiX19yb3cnICk7XHJcblx0XHRcdFx0Y29uc3QgY29scyA9IHJvdyA/IEFycmF5LmZyb20oIHJvdy5xdWVyeVNlbGVjdG9yQWxsKCAnOnNjb3BlID4gLndwYmNfYmZiX19jb2x1bW4nICkgKSA6IFtdO1xyXG5cdFx0XHRcdGNvbnN0IGlkeCAgPSBNYXRoLm1heCggMCwgY29scy5pbmRleE9mKCBoaXQgKSApO1xyXG5cdFx0XHRcdGNvbnN0IHNlYyAgPSBoaXQuY2xvc2VzdCggJy53cGJjX2JmYl9fc2VjdGlvbicgKTtcclxuXHRcdFx0XHRpZiAoIHNlYyApIHtcclxuXHRcdFx0XHRcdHByZXNlbGVjdF90YWJfa2V5ID0gU3RyaW5nKCBpZHggKyAxICk7ICAgICAgICAgICAgICAvLyB0YWJzIGFyZSAxLWJhc2VkIGluIHVpLWNvbHVtbi1zdHlsZXMuanNcclxuXHRcdFx0XHRcdC8vIEhpbnQgZm9yIHRoZSByZW5kZXJlciAoaXQgcmVhZHMgdGhpcyBCRUZPUkUgcmVuZGVyaW5nIGFuZCByZXN0b3JlcyB0aGUgdGFiKS5cclxuXHRcdFx0XHRcdHNlYy5kYXRhc2V0LmNvbF9zdHlsZXNfYWN0aXZlX3RhYiA9IHByZXNlbGVjdF90YWJfa2V5O1xyXG5cdFx0XHRcdFx0Ly8gcHJvbW90ZSBzZWxlY3Rpb24gdG8gdGhlIHNlY3Rpb24gKHNhbWUgVVggYXMgYmVmb3JlKS5cclxuXHRcdFx0XHRcdGhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNlYztcclxuXHRcdFx0XHRcdC8vIE5FVzogdmlzdWFsbHkgbWFyayB3aGljaCBjb2x1bW4gaXMgYmVpbmcgZWRpdGVkXHJcblx0XHRcdFx0XHRpZiAoIFVJICYmIFVJLldQQkNfQkZCX0NvbHVtbl9TdHlsZXMgJiYgVUkuV1BCQ19CRkJfQ29sdW1uX1N0eWxlcy5zZXRfc2VsZWN0ZWRfY29sX2ZsYWcgKSB7XHJcblx0XHRcdFx0XHRcdFVJLldQQkNfQkZCX0NvbHVtbl9TdHlsZXMuc2V0X3NlbGVjdGVkX2NvbF9mbGFnKCBzZWMsIHByZXNlbGVjdF90YWJfa2V5ICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBTZWxlY3QgYW5kIHN0b3AgYnViYmxpbmcgc28gb3V0ZXIgY29udGFpbmVycyBkb27igJl0IHJlc2VsZWN0IGEgcGFyZW50LlxyXG5cdFx0XHR0aGlzLnNlbGVjdF9maWVsZCggaGl0ICk7XHJcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG5cdFx0XHQvLyBBbHNvIHNldCB0aGUgdGFiIGFmdGVyIHRoZSBpbnNwZWN0b3IgcmVuZGVycyAod29ya3MgZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBvcGVuKS5cclxuXHRcdFx0aWYgKCBwcmVzZWxlY3RfdGFiX2tleSApIHtcclxuXHRcdFx0XHQod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZXRUaW1lb3V0KSggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgaW5zICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdGFicyA9IGlucyAmJiBpbnMucXVlcnlTZWxlY3RvciggJ1tkYXRhLWJmYi1zbG90PVwiY29sdW1uX3N0eWxlc1wiXSBbZGF0YS13cGJjLXRhYnNdJyApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIHRhYnMgJiYgd2luZG93LndwYmNfdWlfdGFicyAmJiB0eXBlb2Ygd2luZG93LndwYmNfdWlfdGFicy5zZXRfYWN0aXZlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy53cGJjX3VpX3RhYnMuc2V0X2FjdGl2ZSggdGFicywgcHJlc2VsZWN0X3RhYl9rZXkgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sIDAgKTtcclxuXHJcblx0XHRcdFx0Ly8gUG9saXRlbHkgYXNrIHRoZSBJbnNwZWN0b3IgdG8gZm9jdXMvb3BlbiB0aGUgXCJDb2x1bW4gU3R5bGVzXCIgZ3JvdXAgYW5kIHRhYi5cclxuXHRcdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZShcclxuXHRcdFx0XHRcdCd3cGJjX2JmYjppbnNwZWN0b3JfZm9jdXMnLFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRncm91cCAgOiAnY29sdW1uX3N0eWxlcycsXHJcblx0XHRcdFx0XHRcdHRhYl9rZXk6IHByZXNlbGVjdF90YWJfa2V5XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNlbGVjdCBhIGZpZWxkIGVsZW1lbnQgb3IgY2xlYXIgc2VsZWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8bnVsbH0gZmllbGRfZWxcclxuXHRcdCAqIEBwYXJhbSB7e3Njcm9sbEludG9WaWV3PzogYm9vbGVhbn19IFtvcHRzID0ge31dXHJcblx0XHQgKi9cclxuXHRcdHNlbGVjdF9maWVsZChmaWVsZF9lbCwgeyBzY3JvbGxJbnRvVmlldyA9IGZhbHNlIH0gPSB7fSkge1xyXG5cdFx0XHRjb25zdCByb290ICAgPSB0aGlzLmJ1aWxkZXIucGFnZXNfY29udGFpbmVyO1xyXG5cdFx0XHRjb25zdCBwcmV2RWwgPSB0aGlzLmdldF9zZWxlY3RlZF9maWVsZD8uKCkgfHwgbnVsbDsgICAvLyB0aGUgb25lIHdl4oCZcmUgbGVhdmluZy5cclxuXHJcblx0XHRcdC8vIElnbm9yZSBlbGVtZW50cyBub3QgaW4gdGhlIGNhbnZhcy5cclxuXHRcdFx0aWYgKCBmaWVsZF9lbCAmJiAhcm9vdC5jb250YWlucyggZmllbGRfZWwgKSApIHtcclxuXHRcdFx0XHRmaWVsZF9lbCA9IG51bGw7IC8vIHRyZWF0IGFzIFwibm8gc2VsZWN0aW9uXCIuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5FVzogaWYgd2UgYXJlIGxlYXZpbmcgYSBzZWN0aW9uLCBjbGVhciBpdHMgY29sdW1uIGhpZ2hsaWdodFxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0cHJldkVsICYmIHByZXZFbCAhPT0gZmllbGRfZWwgJiZcclxuXHRcdFx0XHRwcmV2RWwuY2xhc3NMaXN0Py5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApICYmXHJcblx0XHRcdFx0VUk/LldQQkNfQkZCX0NvbHVtbl9TdHlsZXM/LmNsZWFyX3NlbGVjdGVkX2NvbF9mbGFnXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdFVJLldQQkNfQkZCX0NvbHVtbl9TdHlsZXMuY2xlYXJfc2VsZWN0ZWRfY29sX2ZsYWcoIHByZXZFbCApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJZiB3ZSdyZSBsZWF2aW5nIGEgZmllbGQsIHBlcm1hbmVudGx5IHN0b3AgYXV0by1uYW1lIGZvciBpdC5cclxuXHRcdFx0aWYgKCBwcmV2RWwgJiYgcHJldkVsICE9PSBmaWVsZF9lbCAmJiBwcmV2RWwuY2xhc3NMaXN0Py5jb250YWlucyggJ3dwYmNfYmZiX19maWVsZCcgKSApIHtcclxuXHRcdFx0XHRwcmV2RWwuZGF0YXNldC5hdXRvbmFtZSA9ICcwJztcclxuXHRcdFx0XHRwcmV2RWwuZGF0YXNldC5mcmVzaCAgICA9ICcwJztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cm9vdC5xdWVyeVNlbGVjdG9yQWxsKCAnLmlzLXNlbGVjdGVkJyApLmZvckVhY2goIChuKSA9PiB7XHJcblx0XHRcdFx0bi5jbGFzc0xpc3QucmVtb3ZlKCAnaXMtc2VsZWN0ZWQnICk7XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0aWYgKCAhZmllbGRfZWwgKSB7XHJcblx0XHRcdFx0Y29uc3QgcHJldiAgICAgICAgID0gdGhpcy5fc2VsZWN0ZWRfdWlkIHx8IG51bGw7XHJcblx0XHRcdFx0dGhpcy5fc2VsZWN0ZWRfdWlkID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuaW5zcGVjdG9yPy5jbGVhcj8uKCk7XHJcblx0XHRcdFx0cm9vdC5jbGFzc0xpc3QucmVtb3ZlKCAnaGFzLXNlbGVjdGlvbicgKTtcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuYnVzLmVtaXQoIENvcmUuV1BCQ19CRkJfRXZlbnRzLkNMRUFSX1NFTEVDVElPTiwgeyBwcmV2X3VpZDogcHJldiwgc291cmNlOiAnYnVpbGRlcicgfSApO1xyXG5cclxuXHRcdFx0XHQvLyBBdXRvLW9wZW4gXCJBZGQgRmllbGRzXCIgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkLlxyXG5cdFx0XHRcdHdwYmNfYmZiX19kaXNwYXRjaF9ldmVudF9zYWZlKFxyXG5cdFx0XHRcdFx0J3dwYmNfYmZiOnNob3dfcGFuZWwnLFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRwYW5lbF9pZDogJ3dwYmNfYmZiX19wYWxldHRlX2FkZF9uZXcnLFxyXG5cdFx0XHRcdFx0XHR0YWJfaWQgIDogJ3dwYmNfdGFiX2xpYnJhcnknXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZpZWxkX2VsLmNsYXNzTGlzdC5hZGQoICdpcy1zZWxlY3RlZCcgKTtcclxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRfdWlkID0gZmllbGRfZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS11aWQnICkgfHwgbnVsbDtcclxuXHJcblx0XHRcdC8vIEZhbGxiYWNrOiBlbnN1cmUgc2VjdGlvbnMgYW5ub3VuY2UgdGhlbXNlbHZlcyBhcyB0eXBlPVwic2VjdGlvblwiLlxyXG5cdFx0XHRpZiAoIGZpZWxkX2VsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApICYmICFmaWVsZF9lbC5kYXRhc2V0LnR5cGUgKSB7XHJcblx0XHRcdFx0ZmllbGRfZWwuZGF0YXNldC50eXBlID0gJ3NlY3Rpb24nO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHNjcm9sbEludG9WaWV3ICkge1xyXG5cdFx0XHRcdGZpZWxkX2VsLnNjcm9sbEludG9WaWV3KCB7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuaW5zcGVjdG9yPy5iaW5kX3RvX2ZpZWxkPy4oIGZpZWxkX2VsICk7XHJcblxyXG5cdFx0XHQvLyBGYWxsYmFjazogZW5zdXJlIGluc3BlY3RvciBlbmhhbmNlcnMgKGluY2wuIFZhbHVlU2xpZGVyKSBydW4gZXZlcnkgYmluZC5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InIClcclxuXHRcdFx0XHRcdHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRpZiAoIGlucyApIHtcclxuXHRcdFx0XHRcdFVJLkluc3BlY3RvckVuaGFuY2Vycz8uc2Nhbj8uKCBpbnMgKTsgICAgICAgICAgICAgIC8vIHJ1bnMgYWxsIGVuaGFuY2Vyc1xyXG5cdFx0XHRcdFx0VUkuV1BCQ19CRkJfVmFsdWVTbGlkZXI/LmluaXRfb24/LiggaW5zICk7ICAgICAgICAgLy8gZXh0cmEgYmVsdC1hbmQtc3VzcGVuZGVyc1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5FVzogd2hlbiBzZWxlY3RpbmcgYSBzZWN0aW9uLCByZWZsZWN0IGl0cyBhY3RpdmUgdGFiIGFzIHRoZSBoaWdobGlnaHRlZCBjb2x1bW4uXHJcblx0XHRcdGlmICggZmllbGRfZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgJiZcclxuXHRcdFx0XHRVST8uV1BCQ19CRkJfQ29sdW1uX1N0eWxlcz8uc2V0X3NlbGVjdGVkX2NvbF9mbGFnICkge1xyXG5cdFx0XHRcdHZhciBrID0gKGZpZWxkX2VsLmRhdGFzZXQgJiYgZmllbGRfZWwuZGF0YXNldC5jb2xfc3R5bGVzX2FjdGl2ZV90YWIpXHJcblx0XHRcdFx0XHQ/IGZpZWxkX2VsLmRhdGFzZXQuY29sX3N0eWxlc19hY3RpdmVfdGFiIDogJzEnO1xyXG5cdFx0XHRcdFVJLldQQkNfQkZCX0NvbHVtbl9TdHlsZXMuc2V0X3NlbGVjdGVkX2NvbF9mbGFnKCBmaWVsZF9lbCwgayApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBLZWVwIHNlY3Rpb25zICYgZmllbGRzIGluIHRoZSBzYW1lIGZsb3c6XHJcblx0XHRcdC8vIDEpIEdlbmVyaWMgaHlkcmF0b3IgZm9yIHNpbXBsZSBkYXRhc2V0LWJhY2tlZCBjb250cm9scy5cclxuXHRcdFx0aWYgKCBmaWVsZF9lbCApIHtcclxuXHRcdFx0XHRVSS5XUEJDX0JGQl9JbnNwZWN0b3JfQnJpZGdlLl9nZW5lcmljX2h5ZHJhdGVfY29udHJvbHM/LiggdGhpcy5idWlsZGVyLCBmaWVsZF9lbCApO1xyXG5cdFx0XHRcdFVJLldQQkNfQkZCX0luc3BlY3Rvcl9CcmlkZ2UuX2h5ZHJhdGVfc3BlY2lhbF9jb250cm9scz8uKCB0aGlzLmJ1aWxkZXIsIGZpZWxkX2VsICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEF1dG8tb3BlbiBJbnNwZWN0b3Igd2hlbiBhIHVzZXIgc2VsZWN0cyBhIGZpZWxkL3NlY3Rpb24gLlxyXG5cdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZShcclxuXHRcdFx0XHQnd3BiY19iZmI6c2hvd19wYW5lbCcsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0cGFuZWxfaWQ6ICd3cGJjX2JmYl9faW5zcGVjdG9yJyxcclxuXHRcdFx0XHRcdHRhYl9pZCAgOiAnd3BiY190YWJfaW5zcGVjdG9yJ1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdHJvb3QuY2xhc3NMaXN0LmFkZCggJ2hhcy1zZWxlY3Rpb24nICk7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5idXMuZW1pdCggQ29yZS5XUEJDX0JGQl9FdmVudHMuU0VMRUNULCB7IHVpZDogdGhpcy5fc2VsZWN0ZWRfdWlkLCBlbDogZmllbGRfZWwgfSApO1xyXG5cdFx0XHRjb25zdCBsYWJlbCA9IGZpZWxkX2VsPy5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19maWVsZC1sYWJlbCcgKT8udGV4dENvbnRlbnQgfHwgKGZpZWxkX2VsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApID8gJ3NlY3Rpb24nIDogJycpIHx8IGZpZWxkX2VsPy5kYXRhc2V0Py5pZCB8fCAnaXRlbSc7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5fYW5ub3VuY2UoICdTZWxlY3RlZCAnICsgbGFiZWwgKyAnLicgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9ICovXHJcblx0XHRnZXRfc2VsZWN0ZWRfZmllbGQoKSB7XHJcblx0XHRcdGlmICggIXRoaXMuX3NlbGVjdGVkX3VpZCApIHtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBlc2NfYXR0ciA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKCB0aGlzLl9zZWxlY3RlZF91aWQgKTtcclxuXHRcdFx0cmV0dXJuIHRoaXMuYnVpbGRlci5wYWdlc19jb250YWluZXIucXVlcnlTZWxlY3RvciggYC53cGJjX2JmYl9fZmllbGRbZGF0YS11aWQ9XCIke2VzY19hdHRyfVwiXSwgLndwYmNfYmZiX19zZWN0aW9uW2RhdGEtdWlkPVwiJHtlc2NfYXR0cn1cIl1gICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2ICovXHJcblx0XHRvbl9jbGVhcihldikge1xyXG5cdFx0XHRjb25zdCBzcmMgPSBldj8uZGV0YWlsPy5zb3VyY2UgPz8gZXY/LnNvdXJjZTtcclxuXHRcdFx0aWYgKCBzcmMgIT09ICdidWlsZGVyJyApIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdF9maWVsZCggbnVsbCApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJyaWRnZXMgdGhlIGJ1aWxkZXIgd2l0aCB0aGUgSW5zcGVjdG9yIGFuZCBzYW5pdGl6ZXMgaWQvbmFtZSBlZGl0cy5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9JbnNwZWN0b3JfQnJpZGdlID0gY2xhc3MgZXh0ZW5kcyBVSS5XUEJDX0JGQl9Nb2R1bGUge1xyXG5cclxuXHRcdGluaXQoKSB7XHJcblx0XHRcdHRoaXMuX2F0dGFjaF9pbnNwZWN0b3IoKTtcclxuXHRcdFx0dGhpcy5fYmluZF9pZF9zYW5pdGl6ZXIoKTtcclxuXHRcdFx0dGhpcy5fb3Blbl9pbnNwZWN0b3JfYWZ0ZXJfZmllbGRfYWRkZWQoKTtcclxuXHRcdFx0dGhpcy5fYmluZF9mb2N1c19zaG9ydGN1dHMoKTtcclxuXHRcdH1cclxuXHJcblx0XHRfYXR0YWNoX2luc3BlY3RvcigpIHtcclxuXHRcdFx0Y29uc3QgYiAgICAgID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRjb25zdCBhdHRhY2ggPSAoKSA9PiB7XHJcblx0XHRcdFx0aWYgKCB0eXBlb2Ygd2luZG93LldQQkNfQkZCX0luc3BlY3RvciA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdGIuaW5zcGVjdG9yID0gbmV3IFdQQkNfQkZCX0luc3BlY3RvciggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApLCBiICk7XHJcblx0XHRcdFx0XHR0aGlzLl9iaW5kX2lkX3Nhbml0aXplcigpO1xyXG5cdFx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dwYmNfYmZiX2luc3BlY3Rvcl9yZWFkeScsIGF0dGFjaCApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHRcdFx0Ly8gRW5zdXJlIHdlIGJpbmQgYWZ0ZXIgbGF0ZSByZWFkeSBhcyB3ZWxsLlxyXG5cdFx0XHRpZiAoIHR5cGVvZiB3aW5kb3cuV1BCQ19CRkJfSW5zcGVjdG9yID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdGF0dGFjaCgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGIuaW5zcGVjdG9yID0ge1xyXG5cdFx0XHRcdFx0YmluZF90b19maWVsZCgpIHtcclxuXHRcdFx0XHRcdH0sIGNsZWFyKCkge1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3dwYmNfYmZiX2luc3BlY3Rvcl9yZWFkeScsIGF0dGFjaCApO1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoIGF0dGFjaCwgMCApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBMaXN0ZW4gZm9yIFwiZm9jdXNcIiBoaW50cyBmcm9tIHRoZSBjYW52YXMgYW5kIG9wZW4gdGhlIHJpZ2h0IGdyb3VwL3RhYi5cclxuXHRcdCAqIC0gU3VwcG9ydHM6IGdyb3VwID09PSAnY29sdW1uX3N0eWxlcydcclxuXHRcdCAqIC0gQWxzbyBzY3JvbGxzIHRoZSBncm91cCBpbnRvIHZpZXcuXHJcblx0XHQgKi9cclxuXHRcdF9iaW5kX2ZvY3VzX3Nob3J0Y3V0cygpIHtcclxuXHRcdFx0LyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGUgKi9cclxuXHRcdFx0Y29uc3Qgb25fZm9jdXMgPSAoZSkgPT4ge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRjb25zdCBncnBfa2V5ID0gZSAmJiBlLmRldGFpbCAmJiBlLmRldGFpbC5ncm91cDtcclxuXHRcdFx0XHRcdGNvbnN0IHRhYl9rZXkgPSBlICYmIGUuZGV0YWlsICYmIGUuZGV0YWlsLnRhYl9rZXk7XHJcblx0XHRcdFx0XHRpZiAoICFncnBfa2V5ICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgaW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRcdGlmICggIWlucyApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggZ3JwX2tleSA9PT0gJ2NvbHVtbl9zdHlsZXMnICkge1xyXG5cdFx0XHRcdFx0XHQvLyBGaW5kIHRoZSBDb2x1bW4gU3R5bGVzIHNsb3QvZ3JvdXAuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHNsb3QgPSBpbnMucXVlcnlTZWxlY3RvciggJ1tkYXRhLWJmYi1zbG90PVwiY29sdW1uX3N0eWxlc1wiXScgKSB8fCBpbnMucXVlcnlTZWxlY3RvciggJ1tkYXRhLWluc3BlY3Rvci1ncm91cC1rZXk9XCJjb2x1bW5fc3R5bGVzXCJdJyApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIHNsb3QgKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gT3BlbiBjb2xsYXBzaWJsZSBjb250YWluZXIgaWYgcHJlc2VudC5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBncm91cF93cmFwID0gc2xvdC5jbG9zZXN0KCAnLmluc3BlY3Rvcl9fZ3JvdXAnICkgfHwgc2xvdC5jbG9zZXN0KCAnW2RhdGEtaW5zcGVjdG9yLWdyb3VwXScgKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwX3dyYXAgJiYgIWdyb3VwX3dyYXAuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaXMtb3BlbicgKSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGdyb3VwX3dyYXAuY2xhc3NMaXN0LmFkZCggJ2lzLW9wZW4nICk7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBNaXJyb3IgQVJJQSBzdGF0ZSBpZiB5b3VyIGhlYWRlciB1c2VzIGFyaWEtZXhwYW5kZWQuXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBoZWFkZXJfYnRuID0gZ3JvdXBfd3JhcC5xdWVyeVNlbGVjdG9yKCAnW2FyaWEtZXhwYW5kZWRdJyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBoZWFkZXJfYnRuICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRoZWFkZXJfYnRuLnNldEF0dHJpYnV0ZSggJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScgKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsOiBzZXQgdGhlIHJlcXVlc3RlZCB0YWIga2V5IGlmIHRhYnMgZXhpc3QgaW4gdGhpcyBncm91cC5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHRhYl9rZXkgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB0YWJzID0gc2xvdC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy10YWJzXScgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICggdGFicyAmJiB3aW5kb3cud3BiY191aV90YWJzICYmIHR5cGVvZiB3aW5kb3cud3BiY191aV90YWJzLnNldF9hY3RpdmUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy53cGJjX3VpX3RhYnMuc2V0X2FjdGl2ZSggdGFicywgU3RyaW5nKCB0YWJfa2V5ICkgKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIEJyaW5nIGludG8gdmlldyBmb3IgY29udmVuaWVuY2UuXHJcblx0XHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIFVuY29tbWVudCAoT25seSAgaWYgbmVlZGVkKSB0aGlzIHRvIEFVVE8gU0NST0xMIHRvICBzcGVjaWZpYyBDT0xVTU4gaW4gdGhlIHNlY3Rpb246LlxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2xvdC5zY3JvbGxJbnRvVmlldyggeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSApO1xyXG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHt9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGNhdGNoICggX2UgKSB7fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0dGhpcy5fb25faW5zcGVjdG9yX2ZvY3VzID0gb25fZm9jdXM7XHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICd3cGJjX2JmYjppbnNwZWN0b3JfZm9jdXMnLCBvbl9mb2N1cywgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGRlc3Ryb3koKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0aWYgKCB0aGlzLl9vbl9pbnNwZWN0b3JfZm9jdXMgKSB7XHJcblx0XHRcdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnd3BiY19iZmI6aW5zcGVjdG9yX2ZvY3VzJywgdGhpcy5fb25faW5zcGVjdG9yX2ZvY3VzLCB0cnVlICk7XHJcblx0XHRcdFx0XHR0aGlzLl9vbl9pbnNwZWN0b3JfZm9jdXMgPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSHlkcmF0ZSBpbnNwZWN0b3IgaW5wdXRzIGZvciBcInNwZWNpYWxcIiBrZXlzIHRoYXQgd2UgaGFuZGxlIGV4cGxpY2l0bHkuXHJcblx0XHQgKiBXb3JrcyBmb3IgYm90aCBmaWVsZHMgYW5kIHNlY3Rpb25zLlxyXG5cdFx0ICogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlclxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2VsXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBfaHlkcmF0ZV9zcGVjaWFsX2NvbnRyb2xzKGJ1aWxkZXIsIHNlbCkge1xyXG5cdFx0XHRjb25zdCBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICk7XHJcblx0XHRcdGlmICggIWlucyB8fCAhc2VsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2V0VmFsID0gKGtleSwgdmFsKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY3RybCA9IGlucy5xdWVyeVNlbGVjdG9yKCBgW2RhdGEtaW5zcGVjdG9yLWtleT1cIiR7a2V5fVwiXWAgKTtcclxuXHRcdFx0XHRpZiAoIGN0cmwgJiYgJ3ZhbHVlJyBpbiBjdHJsICkgY3RybC52YWx1ZSA9IFN0cmluZyggdmFsID8/ICcnICk7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvLyBJbnRlcm5hbCBpZCAvIG5hbWUgLyBwdWJsaWMgaHRtbF9pZC5cclxuXHRcdFx0c2V0VmFsKCAnaWQnLCBzZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1pZCcgKSB8fCAnJyApO1xyXG5cdFx0XHRzZXRWYWwoICduYW1lJywgc2VsLmdldEF0dHJpYnV0ZSggJ2RhdGEtbmFtZScgKSB8fCAnJyApO1xyXG5cdFx0XHRzZXRWYWwoICdodG1sX2lkJywgc2VsLmdldEF0dHJpYnV0ZSggJ2RhdGEtaHRtbF9pZCcgKSB8fCAnJyApO1xyXG5cclxuXHRcdFx0Ly8gU2VjdGlvbi1vbmx5IGV4dHJhcyBhcmUgaGFybWxlc3MgdG8gc2V0IGZvciBmaWVsZHMgKGNvbnRyb2xzIG1heSBub3QgZXhpc3QpLlxyXG5cdFx0XHRzZXRWYWwoICdjc3NjbGFzcycsIHNlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLWNzc2NsYXNzJyApIHx8ICcnICk7XHJcblx0XHRcdHNldFZhbCggJ2xhYmVsJywgc2VsLmdldEF0dHJpYnV0ZSggJ2RhdGEtbGFiZWwnICkgfHwgJycgKTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIeWRyYXRlIGluc3BlY3RvciBpbnB1dHMgdGhhdCBkZWNsYXJlIGEgZ2VuZXJpYyBkYXRhc2V0IG1hcHBpbmcgdmlhXHJcblx0XHQgKiBbZGF0YS1pbnNwZWN0b3Ita2V5XSBidXQgZG8gTk9UIGRlY2xhcmUgYSBjdXN0b20gdmFsdWVfZnJvbSBhZGFwdGVyLlxyXG5cdFx0ICogVGhpcyBtYWtlcyBzZWN0aW9ucyBmb2xsb3cgdGhlIHNhbWUgZGF0YSBmbG93IGFzIGZpZWxkcyB3aXRoIGFsbW9zdCBubyBnbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7V1BCQ19Gb3JtX0J1aWxkZXJ9IGJ1aWxkZXJcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNlbCAtIGN1cnJlbnRseSBzZWxlY3RlZCBmaWVsZC9zZWN0aW9uXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBfZ2VuZXJpY19oeWRyYXRlX2NvbnRyb2xzKGJ1aWxkZXIsIHNlbCkge1xyXG5cdFx0XHRjb25zdCBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICk7XHJcblx0XHRcdGlmICggIWlucyB8fCAhc2VsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgU0tJUCA9IC9eKGlkfG5hbWV8aHRtbF9pZHxjc3NjbGFzc3xsYWJlbCkkLzsgLy8gaGFuZGxlZCBieSBfaHlkcmF0ZV9zcGVjaWFsX2NvbnRyb2xzXHJcblxyXG5cdFx0XHQvLyBORVc6IHJlYWQgc2NoZW1hIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudOKAmXMgdHlwZS5cclxuXHRcdFx0Y29uc3Qgc2NoZW1hcyAgICAgPSB3aW5kb3cuV1BCQ19CRkJfU2NoZW1hcyB8fCB7fTtcclxuXHRcdFx0Y29uc3QgdHlwZUtleSAgICAgPSAoc2VsLmRhdGFzZXQgJiYgc2VsLmRhdGFzZXQudHlwZSkgfHwgJyc7XHJcblx0XHRcdGNvbnN0IHNjaGVtYUVudHJ5ID0gc2NoZW1hc1t0eXBlS2V5XSB8fCBudWxsO1xyXG5cdFx0XHRjb25zdCBwcm9wc1NjaGVtYSA9IChzY2hlbWFFbnRyeSAmJiBzY2hlbWFFbnRyeS5zY2hlbWEgJiYgc2NoZW1hRW50cnkuc2NoZW1hLnByb3BzKSA/IHNjaGVtYUVudHJ5LnNjaGVtYS5wcm9wcyA6IHt9O1xyXG5cdFx0XHRjb25zdCBoYXNPd24gICAgICA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLmJpbmQoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgKTtcclxuXHRcdFx0Y29uc3QgZ2V0RGVmYXVsdCAgPSAoa2V5KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbWV0YSA9IHByb3BzU2NoZW1hW2tleV07XHJcblx0XHRcdFx0cmV0dXJuIChtZXRhICYmIGhhc093biggbWV0YSwgJ2RlZmF1bHQnICkpID8gbWV0YS5kZWZhdWx0IDogdW5kZWZpbmVkO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aW5zLnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1pbnNwZWN0b3Ita2V5XScgKS5mb3JFYWNoKCAoY3RybCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGtleSA9IFN0cmluZyggY3RybC5kYXRhc2V0Py5pbnNwZWN0b3JLZXkgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdGlmICggIWtleSB8fCBTS0lQLnRlc3QoIGtleSApICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHQvLyBFbGVtZW50LWxldmVsIGxvY2suXHJcblx0XHRcdFx0Y29uc3QgZGwgPSAoY3RybC5kYXRhc2V0Py5sb2NrZWQgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdGlmICggZGwgPT09ICcxJyB8fCBkbCA9PT0gJ3RydWUnIHx8IGRsID09PSAneWVzJyApIHJldHVybjtcclxuXHJcblx0XHRcdFx0Ly8gUmVzcGVjdCBleHBsaWNpdCBhZGFwdGVycy5cclxuXHRcdFx0XHRpZiAoIGN0cmwuZGF0YXNldD8udmFsdWVfZnJvbSB8fCBjdHJsLmRhdGFzZXQ/LnZhbHVlRnJvbSApIHJldHVybjtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmF3ICAgICAgPSBzZWwuZGF0YXNldCA/IHNlbC5kYXRhc2V0W2tleV0gOiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0Y29uc3QgaGFzUmF3ICAgPSBzZWwuZGF0YXNldCA/IGhhc093biggc2VsLmRhdGFzZXQsIGtleSApIDogZmFsc2U7XHJcblx0XHRcdFx0Y29uc3QgZGVmVmFsdWUgPSBnZXREZWZhdWx0KCBrZXkgKTtcclxuXHJcblx0XHRcdFx0Ly8gQmVzdC1lZmZvcnQgY29udHJvbCB0eXBpbmcgd2l0aCBzY2hlbWEgZGVmYXVsdCBmYWxsYmFjayB3aGVuIHZhbHVlIGlzIGFic2VudC5cclxuXHJcblx0XHRcdFx0aWYgKCBjdHJsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAoY3RybC50eXBlID09PSAnY2hlY2tib3gnIHx8IGN0cmwudHlwZSA9PT0gJ3JhZGlvJykgKSB7XG5cdFx0XHRcdFx0Ly8gSWYgZGF0YXNldCBpcyBtaXNzaW5nIHRoZSBrZXkgZW50aXJlbHkgLT4gdXNlIHNjaGVtYSBkZWZhdWx0IChib29sZWFuKS5cblx0XHRcdFx0XHRpZiAoICFoYXNSYXcgKSB7XG5cdFx0XHRcdFx0XHRjdHJsLmNoZWNrZWQgPSAhIWRlZlZhbHVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBBbiBleHBsaWNpdCBlbXB0eSB2YWx1ZSBpcyB0aGUgbGVnYWN5IHBlcnNpc3RlZCByZXByZXNlbnRhdGlvbiBvZiBmYWxzZS5cblx0XHRcdFx0XHRcdGN0cmwuY2hlY2tlZCA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuY29lcmNlX2Jvb2xlYW4oIHJhdywgZmFsc2UgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoICd2YWx1ZScgaW4gY3RybCApIHtcclxuXHRcdFx0XHRcdGlmICggaGFzUmF3ICkge1xyXG5cdFx0XHRcdFx0XHRjdHJsLnZhbHVlID0gKHJhdyAhPSBudWxsKSA/IFN0cmluZyggcmF3ICkgOiAnJztcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGN0cmwudmFsdWUgPSAoZGVmVmFsdWUgPT0gbnVsbCkgPyAnJyA6IFN0cmluZyggZGVmVmFsdWUgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRfYmluZF9pZF9zYW5pdGl6ZXIoKSB7XHJcblx0XHRcdGNvbnN0IGIgICA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Y29uc3QgaW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRpZiAoICEgaW5zICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGlucy5fX3dwYmNfYmZiX2lkX3Nhbml0aXplcl9ib3VuZCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0aW5zLl9fd3BiY19iZmJfaWRfc2FuaXRpemVyX2JvdW5kID0gdHJ1ZTtcclxuXHJcblx0XHRcdGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ID0gZS50YXJnZXQ7XHJcblx0XHRcdFx0aWYgKCAhdCB8fCAhKCd2YWx1ZScgaW4gdCkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGtleSAgICAgICA9ICh0LmRhdGFzZXQ/Lmluc3BlY3RvcktleSB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRjb25zdCBzZWwgICAgICAgPSBiLmdldF9zZWxlY3RlZF9maWVsZD8uKCk7XHJcblx0XHRcdFx0Y29uc3QgaXNTZWN0aW9uID0gc2VsPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICk7XHJcblx0XHRcdFx0aWYgKCAhc2VsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHQvLyBVbmlmaWVkIGVtaXR0ZXIgdGhhdCBhbHdheXMgaW5jbHVkZXMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLlxyXG5cdFx0XHRcdGNvbnN0IEVWICAgICAgICAgICAgICA9IENvcmUuV1BCQ19CRkJfRXZlbnRzO1xyXG5cdFx0XHRcdC8vIFNUUlVDVFVSRV9DSEFOR0UgY2FuIGJlIFwiZXhwZW5zaXZlXCIgYmVjYXVzZSBvdGhlciBsaXN0ZW5lcnMgbWF5IHRyaWdnZXIgZnVsbCBjYW52YXMgcmVmcmVzaC5cclxuXHRcdFx0XHQvLyBEZWJvdW5jZSBvbmx5IGNvbnRpbnVvdXMgY29udHJvbHMgKGUuZy4gdmFsdWUgc2xpZGVyIHNjcnViYmluZykgb24gdGhlIElOUFVUIHBoYXNlLlxyXG5cdFx0XHRcdGNvbnN0IGVuc3VyZV9zY19kZWJvdW5jZV9zdGF0ZSA9ICgpID0+IHtcclxuXHRcdFx0XHRcdGlmICggYi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gYi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Yi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlID0geyB0aW1lcl9pZDogMCwgcGVuZGluZ19wYXlsb2FkOiBudWxsIH07XHJcblx0XHRcdFx0XHRyZXR1cm4gYi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNhbmNlbF9zY19kZWJvdW5jZWRfZW1pdCA9ICgpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHN0ID0gYi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlO1xyXG5cdFx0XHRcdFx0aWYgKCAhc3QgKSByZXR1cm47XHJcblx0XHRcdFx0XHR0cnkgeyBjbGVhclRpbWVvdXQoIHN0LnRpbWVyX2lkICk7IH0gY2F0Y2ggKCBfICkge31cclxuXHRcdFx0XHRcdHN0LnRpbWVyX2lkICAgICAgICA9IDA7XHJcblx0XHRcdFx0XHRzdC5wZW5kaW5nX3BheWxvYWQgPSBudWxsO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1c19lbWl0X2NoYW5nZSA9IChyZWFzb24sIGV4dHJhID0ge30pID0+IHtcclxuXHRcdFx0XHRcdC8vIElmIHdl4oCZcmUgY29tbWl0dGluZyBzb21ldGhpbmcgKGNoYW5nZS9ibHVyL2V0YyksIGRyb3AgYW55IHBlbmRpbmcgXCJpbnB1dFwiIGVtaXQuXHJcblx0XHRcdFx0XHRjYW5jZWxfc2NfZGVib3VuY2VkX2VtaXQoKTtcclxuXHRcdFx0XHRcdGIuYnVzPy5lbWl0Py4oIEVWLlNUUlVDVFVSRV9DSEFOR0UsIHsgcmVhc29uLCBlbDogc2VsLCAuLi5leHRyYSB9ICk7XHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVzX2VtaXRfY2hhbmdlX2RlYm91bmNlZCA9IChyZWFzb24sIGV4dHJhID0ge30sIHdhaXRfbXMpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHN0ID0gZW5zdXJlX3NjX2RlYm91bmNlX3N0YXRlKCk7XHJcblx0XHRcdFx0XHRjb25zdCBtcyA9IE51bWJlci5pc0Zpbml0ZSggd2FpdF9tcyApXHJcblx0XHRcdFx0XHRcdD8gd2FpdF9tc1xyXG5cdFx0XHRcdFx0XHQ6IChOdW1iZXIuaXNGaW5pdGUoIFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgKSA/IFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgOiAyNDApO1xyXG5cclxuXHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIENVUlJFTlQgc2VsZWN0ZWQgZWxlbWVudCBpbnRvIHRoZSBwYXlsb2FkIG5vdyAoc3RhYmxlIHJlZikuXHJcblx0XHRcdFx0XHRzdC5wZW5kaW5nX3BheWxvYWQgPSB7IHJlYXNvbiwgZWw6IHNlbCwgLi4uZXh0cmEsIGRlYm91bmNlZDogdHJ1ZSB9O1xyXG5cclxuXHRcdFx0XHRcdHRyeSB7IGNsZWFyVGltZW91dCggc3QudGltZXJfaWQgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0XHRcdFx0c3QudGltZXJfaWQgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdHN0LnRpbWVyX2lkID0gMDtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcGF5bG9hZCA9IHN0LnBlbmRpbmdfcGF5bG9hZDtcclxuXHRcdFx0XHRcdFx0c3QucGVuZGluZ19wYXlsb2FkID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0aWYgKCBwYXlsb2FkICkge1xyXG5cdFx0XHRcdFx0XHRcdGIuYnVzPy5lbWl0Py4oIEVWLlNUUlVDVFVSRV9DSEFOR0UsIHBheWxvYWQgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSwgbXMgKTtcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHQvLyAtLS0tIEZJRUxEL1NFQ1RJT046IGludGVybmFsIGlkIC0tLS1cclxuXHRcdFx0XHRpZiAoIGtleSA9PT0gJ2lkJyApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHVuaXF1ZSA9IGIuaWQuc2V0X2ZpZWxkX2lkKCBzZWwsIHQudmFsdWUgKTtcclxuXHRcdFx0XHRcdGlmICggYi5wcmV2aWV3X21vZGUgJiYgIWlzU2VjdGlvbiApIHtcclxuXHRcdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIHQudmFsdWUgIT09IHVuaXF1ZSApIHtcclxuXHRcdFx0XHRcdFx0dC52YWx1ZSA9IHVuaXF1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJ1c19lbWl0X2NoYW5nZSggJ2lkLWNoYW5nZScgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIC0tLS0gRklFTEQvU0VDVElPTjogcHVibGljIEhUTUwgaWQgLS0tLVxyXG5cdFx0XHRcdGlmICgga2V5ID09PSAnaHRtbF9pZCcgKSB7XHJcblx0XHRcdFx0XHRjb25zdCBhcHBsaWVkID0gYi5pZC5zZXRfZmllbGRfaHRtbF9pZCggc2VsLCB0LnZhbHVlICk7XHJcblx0XHRcdFx0XHQvLyBGb3Igc2VjdGlvbnMsIGFsc28gc2V0IHRoZSByZWFsIERPTSBpZCBzbyBhbmNob3JzL0NTUyBjYW4gdGFyZ2V0IGl0LlxyXG5cdFx0XHRcdFx0aWYgKCBpc1NlY3Rpb24gKSB7XHJcblx0XHRcdFx0XHRcdHNlbC5pZCA9IGFwcGxpZWQgfHwgJyc7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBiLnByZXZpZXdfbW9kZSApIHtcclxuXHRcdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIHQudmFsdWUgIT09IGFwcGxpZWQgKSB7XHJcblx0XHRcdFx0XHRcdHQudmFsdWUgPSBhcHBsaWVkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnVzX2VtaXRfY2hhbmdlKCAnaHRtbC1pZC1jaGFuZ2UnICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyAtLS0tIEZJRUxEUyBPTkxZOiBuYW1lIC0tLS1cclxuXHRcdFx0XHRpZiAoIGtleSA9PT0gJ25hbWUnICYmICFpc1NlY3Rpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gTGl2ZSB0eXBpbmc6IHNhbml0aXplIG9ubHkgKE5PIHVuaXF1ZW5lc3MgeWV0KSB0byBhdm9pZCBcIi0yXCIgc3BhbVxyXG5cdFx0XHRcdFx0aWYgKCBlLnR5cGUgPT09ICdpbnB1dCcgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGJlZm9yZSAgICA9IHQudmFsdWU7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHNhbml0aXplZCA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9uYW1lKCBiZWZvcmUgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBiZWZvcmUgIT09IHNhbml0aXplZCApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBvcHRpb25hbDogcHJlc2VydmUgY2FyZXQgdG8gYXZvaWQganVtcFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNlbFN0YXJ0ID0gdC5zZWxlY3Rpb25TdGFydCwgc2VsRW5kID0gdC5zZWxlY3Rpb25FbmQ7XHJcblx0XHRcdFx0XHRcdFx0dC52YWx1ZSAgICAgICAgPSBzYW5pdGl6ZWQ7XHJcblx0XHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRcdHQuc2V0U2VsZWN0aW9uUmFuZ2UoIHNlbFN0YXJ0LCBzZWxFbmQgKTtcclxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuOyAvLyB1bmlxdWVuZXNzIG9uIGNoYW5nZS9ibHVyXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ29tbWl0IChjaGFuZ2UvYmx1cilcclxuXHRcdFx0XHRcdGNvbnN0IHJhdyA9IFN0cmluZyggdC52YWx1ZSA/PyAnJyApLnRyaW0oKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoICFyYXcgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFJFU0VFRDoga2VlcCBuYW1lIG5vbi1lbXB0eSBhbmQgcHJvdmlzaW9uYWwgKGF1dG9uYW1lIHN0YXlzIE9OKVxyXG5cdFx0XHRcdFx0XHRjb25zdCBTICAgID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYmFzZSA9IFMuc2FuaXRpemVfaHRtbF9uYW1lKCBzZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1pZCcgKSB8fCBzZWwuZGF0YXNldC5pZCB8fCBzZWwuZGF0YXNldC50eXBlIHx8ICdmaWVsZCcgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdW5pcSA9IGIuaWQuZW5zdXJlX3VuaXF1ZV9maWVsZF9uYW1lKCBiYXNlLCBzZWwgKTtcclxuXHJcblx0XHRcdFx0XHRcdHNlbC5zZXRBdHRyaWJ1dGUoICdkYXRhLW5hbWUnLCB1bmlxICk7XHJcblx0XHRcdFx0XHRcdHNlbC5kYXRhc2V0LmF1dG9uYW1lICAgICAgICAgID0gJzEnO1xyXG5cdFx0XHRcdFx0XHRzZWwuZGF0YXNldC5uYW1lX3VzZXJfdG91Y2hlZCA9ICcwJztcclxuXHJcblx0XHRcdFx0XHRcdC8vIEtlZXAgRE9NIGluIHN5bmMgaWYgd2XigJlyZSBub3QgcmUtcmVuZGVyaW5nXHJcblx0XHRcdFx0XHRcdGlmICggIWIucHJldmlld19tb2RlICkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGN0cmwgPSBzZWwucXVlcnlTZWxlY3RvciggJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcgKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGN0cmwgKSBjdHJsLnNldEF0dHJpYnV0ZSggJ25hbWUnLCB1bmlxICk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggdC52YWx1ZSAhPT0gdW5pcSApIHQudmFsdWUgPSB1bmlxO1xyXG5cdFx0XHRcdFx0XHRidXNfZW1pdF9jaGFuZ2UoICduYW1lLXJlc2VlZCcgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIE5vbi1lbXB0eSBjb21taXQ6IHVzZXIgdGFrZXMgY29udHJvbDsgZGlzYWJsZSBhdXRvbmFtZSBnb2luZyBmb3J3YXJkXHJcblx0XHRcdFx0XHRzZWwuZGF0YXNldC5uYW1lX3VzZXJfdG91Y2hlZCA9ICcxJztcclxuXHRcdFx0XHRcdHNlbC5kYXRhc2V0LmF1dG9uYW1lICAgICAgICAgID0gJzAnO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNhbml0aXplZCA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9uYW1lKCByYXcgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHVuaXF1ZSAgICA9IGIuaWQuc2V0X2ZpZWxkX25hbWUoIHNlbCwgc2FuaXRpemVkICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhYi5wcmV2aWV3X21vZGUgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGN0cmwgPSBzZWwucXVlcnlTZWxlY3RvciggJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBjdHJsICkgY3RybC5zZXRBdHRyaWJ1dGUoICduYW1lJywgdW5pcXVlICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRiLnJlbmRlcl9wcmV2aWV3KCBzZWwgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIHQudmFsdWUgIT09IHVuaXF1ZSApIHQudmFsdWUgPSB1bmlxdWU7XHJcblx0XHRcdFx0XHRidXNfZW1pdF9jaGFuZ2UoICduYW1lLWNoYW5nZScgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIC0tLS0gU0VDVElPTlMgJiBGSUVMRFM6IGNzc2NsYXNzIChsaXZlIGFwcGx5OyBubyByZS1yZW5kZXIpIC0tLS1cclxuXHRcdFx0XHRpZiAoIGtleSA9PT0gJ2Nzc2NsYXNzJyApIHtcclxuXHRcdFx0XHRcdGNvbnN0IG5leHQgICAgICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2Nzc19jbGFzc2xpc3QoIHQudmFsdWUgfHwgJycgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGRlc2lyZWRBcnIgPSBuZXh0LnNwbGl0KCAvXFxzKy8gKS5maWx0ZXIoIEJvb2xlYW4gKTtcclxuXHRcdFx0XHRcdGNvbnN0IGRlc2lyZWRTZXQgPSBuZXcgU2V0KCBkZXNpcmVkQXJyICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ29yZSBjbGFzc2VzIGFyZSBuZXZlciB0b3VjaGVkLlxyXG5cdFx0XHRcdFx0Y29uc3QgaXNDb3JlID0gKGNscykgPT4gY2xzID09PSAnaXMtc2VsZWN0ZWQnIHx8IGNscy5zdGFydHNXaXRoKCAnd3BiY18nICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gU25hcHNob3QgYmVmb3JlIG11dGF0aW5nIChET01Ub2tlbkxpc3QgaXMgbGl2ZSkuXHJcblx0XHRcdFx0XHRjb25zdCBiZWZvcmVDbGFzc2VzID0gQXJyYXkuZnJvbSggc2VsLmNsYXNzTGlzdCApO1xyXG5cdFx0XHRcdFx0Y29uc3QgY3VzdG9tQmVmb3JlICA9IGJlZm9yZUNsYXNzZXMuZmlsdGVyKCAoYykgPT4gIWlzQ29yZSggYyApICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIHN0cmF5IG5vbi1jb3JlIGNsYXNzZXMgbm90IGluIGRlc2lyZWQuXHJcblx0XHRcdFx0XHRjdXN0b21CZWZvcmUuZm9yRWFjaCggKGMpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKCAhZGVzaXJlZFNldC5oYXMoIGMgKSApIHNlbC5jbGFzc0xpc3QucmVtb3ZlKCBjICk7XHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWRkIG1pc3NpbmcgZGVzaXJlZCBjbGFzc2VzIGluIG9uZSBnby5cclxuXHRcdFx0XHRcdGNvbnN0IG1pc3NpbmcgPSBkZXNpcmVkQXJyLmZpbHRlciggKGMpID0+ICFjdXN0b21CZWZvcmUuaW5jbHVkZXMoIGMgKSApO1xyXG5cdFx0XHRcdFx0aWYgKCBtaXNzaW5nLmxlbmd0aCApIHNlbC5jbGFzc0xpc3QuYWRkKCAuLi5taXNzaW5nICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gS2VlcCBkYXRhc2V0IGluIHN5bmMgKGF2b2lkIHVzZWxlc3MgYXR0cmlidXRlIHdyaXRlcykuXHJcblx0XHRcdFx0XHRpZiAoIHNlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLWNzc2NsYXNzJyApICE9PSBuZXh0ICkge1xyXG5cdFx0XHRcdFx0XHRzZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1jc3NjbGFzcycsIG5leHQgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBFbWl0IG9ubHkgaWYgc29tZXRoaW5nIGFjdHVhbGx5IGNoYW5nZWQuXHJcblx0XHRcdFx0XHRjb25zdCBhZnRlckNsYXNzZXMgPSBBcnJheS5mcm9tKCBzZWwuY2xhc3NMaXN0ICk7XHJcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VkICAgICAgPSBhZnRlckNsYXNzZXMubGVuZ3RoICE9PSBiZWZvcmVDbGFzc2VzLmxlbmd0aCB8fCBiZWZvcmVDbGFzc2VzLnNvbWUoIChjLCBpKSA9PiBjICE9PSBhZnRlckNsYXNzZXNbaV0gKTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBkZXRhaWwgPSB7IGtleTogJ2Nzc2NsYXNzJywgcGhhc2U6IGUudHlwZSB9O1xyXG5cdFx0XHRcdFx0aWYgKCBpc1NlY3Rpb24gKSB7XHJcblx0XHRcdFx0XHRcdGJ1c19lbWl0X2NoYW5nZSggJ2Nzc2NsYXNzLWNoYW5nZScsIGRldGFpbCApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0YnVzX2VtaXRfY2hhbmdlKCAncHJvcC1jaGFuZ2UnLCBkZXRhaWwgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0XHQvLyAtLS0tIFNFQ1RJT05TOiBsYWJlbCAtLS0tXHJcblx0XHRcdFx0aWYgKCBpc1NlY3Rpb24gJiYga2V5ID09PSAnbGFiZWwnICkge1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gU3RyaW5nKCB0LnZhbHVlID8/ICcnICk7XHJcblx0XHRcdFx0XHRzZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1sYWJlbCcsIHZhbCApO1xyXG5cdFx0XHRcdFx0YnVzX2VtaXRfY2hhbmdlKCAnbGFiZWwtY2hhbmdlJyApO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gLS0tLSBGSUVMRFM6IGxhYmVsIChhdXRvLW5hbWUgd2hpbGUgdHlwaW5nOyBmcmVlemUgb24gY29tbWl0KSAtLS0tXHJcblx0XHRcdFx0aWYgKCAhaXNTZWN0aW9uICYmIGtleSA9PT0gJ2xhYmVsJyApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbCAgICAgICAgID0gU3RyaW5nKCB0LnZhbHVlID8/ICcnICk7XHJcblx0XHRcdFx0XHRzZWwuZGF0YXNldC5sYWJlbCA9IHZhbDtcclxuXHJcblx0XHRcdFx0XHQvLyB3aGlsZSB0eXBpbmcsIGFsbG93IGF1dG8tbmFtZSAoaWYgZmxhZ3MgcGVybWl0KVxyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0Q29yZS5XUEJDX0JGQl9GaWVsZF9CYXNlLm1heWJlX2F1dG9uYW1lX2Zyb21fbGFiZWwoIGIsIHNlbCwgdmFsICk7XHJcblx0XHRcdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBpZiB1c2VyIGNvbW1pdHRlZCB0aGUgbGFiZWwgKGJsdXIvY2hhbmdlKSwgZnJlZXplIGZ1dHVyZSBhdXRvLW5hbWVcclxuXHRcdFx0XHRcdGlmICggZS50eXBlICE9PSAnaW5wdXQnICkge1xyXG5cdFx0XHRcdFx0XHRzZWwuZGF0YXNldC5hdXRvbmFtZSA9ICcwJzsgICAvLyBzdG9wIGZ1dHVyZSBsYWJlbC0+bmFtZSBzeW5jXHJcblx0XHRcdFx0XHRcdHNlbC5kYXRhc2V0LmZyZXNoICAgID0gJzAnOyAgIC8vIGFsc28ga2lsbCB0aGUgXCJmcmVzaFwiIGVzY2FwZSBoYXRjaFxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIE9wdGlvbmFsIFVJIG5pY2V0eTogZGlzYWJsZSBOYW1lIHdoZW4gYXV0byBpcyBPTiwgZW5hYmxlIHdoZW4gT0ZGXHJcblx0XHRcdFx0XHRjb25zdCBpbnMgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRcdGNvbnN0IG5hbWVDdHJsID0gaW5zPy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtaW5zcGVjdG9yLWtleT1cIm5hbWVcIl0nICk7XHJcblx0XHRcdFx0XHRpZiAoIG5hbWVDdHJsICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBhdXRvQWN0aXZlID1cclxuXHRcdFx0XHRcdFx0XHRcdCAgKHNlbC5kYXRhc2V0LmF1dG9uYW1lID8/ICcxJykgIT09ICcwJyAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0ICBzZWwuZGF0YXNldC5uYW1lX3VzZXJfdG91Y2hlZCAhPT0gJzEnICYmXHJcblx0XHRcdFx0XHRcdFx0XHQgIHNlbC5kYXRhc2V0Lndhc19sb2FkZWQgIT09ICcxJztcclxuXHRcdFx0XHRcdFx0bmFtZUN0cmwudG9nZ2xlQXR0cmlidXRlKCAnZGlzYWJsZWQnLCBhdXRvQWN0aXZlICk7XHJcblx0XHRcdFx0XHRcdGlmICggYXV0b0FjdGl2ZSAmJiAhbmFtZUN0cmwucGxhY2Vob2xkZXIgKSB7XHJcblx0XHRcdFx0XHRcdFx0bmFtZUN0cmwucGxhY2Vob2xkZXIgPSBiPy5pMThuPy5hdXRvX2Zyb21fbGFiZWwgPz8gJ2F1dG8g4oCUIGZyb20gbGFiZWwnO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmICggIWF1dG9BY3RpdmUgJiYgbmFtZUN0cmwucGxhY2Vob2xkZXIgPT09IChiPy5pMThuPy5hdXRvX2Zyb21fbGFiZWwgPz8gJ2F1dG8g4oCUIGZyb20gbGFiZWwnKSApIHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lQ3RybC5wbGFjZWhvbGRlciA9ICcnO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHJlLXJlbmRlciB0aGUgcHJldmlldyBzbyBsYWJlbCBjaGFuZ2VzIGFyZSB2aXNpYmxlIGltbWVkaWF0ZWx5LlxyXG5cdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHRidXNfZW1pdF9jaGFuZ2UoICdsYWJlbC1jaGFuZ2UnICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0Ly8gLS0tLSBERUZBVUxUIChHRU5FUklDKTogZGF0YXNldCB3cml0ZXIgZm9yIGJvdGggZmllbGRzICYgc2VjdGlvbnMgLS0tLVxyXG5cdFx0XHRcdC8vIEFueSBpbnNwZWN0b3IgY29udHJvbCB3aXRoIFtkYXRhLWluc3BlY3Rvci1rZXldIHRoYXQgZG9lc24ndCBoYXZlIGEgY3VzdG9tXHJcblx0XHRcdFx0Ly8gYWRhcHRlci92YWx1ZV9mcm9tIHdpbGwgc2ltcGx5IHJlYWQvd3JpdGUgc2VsLmRhdGFzZXRba2V5XS5cclxuXHRcdFx0XHRpZiAoIGtleSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzZWxmTG9ja2VkID0gL14oMXx0cnVlfHllcykkL2kudGVzdCggKHQuZGF0YXNldD8ubG9ja2VkIHx8ICcnKS50cmltKCkgKTtcclxuXHRcdFx0XHRcdGlmICggc2VsZkxvY2tlZCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFNraXAga2V5cyB3ZSBoYW5kbGVkIGFib3ZlIHRvIGF2b2lkIGRvdWJsZSB3b3JrLlxyXG5cdFx0XHRcdFx0aWYgKCBrZXkgPT09ICdpZCcgfHwga2V5ID09PSAnbmFtZScgfHwga2V5ID09PSAnaHRtbF9pZCcgfHwga2V5ID09PSAnY3NzY2xhc3MnIHx8IGtleSA9PT0gJ2xhYmVsJyApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bGV0IG5leHRWYWwgPSAnJztcblx0XHRcdFx0XHRpZiAoIHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmICh0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgdC50eXBlID09PSAncmFkaW8nKSApIHtcblx0XHRcdFx0XHRcdC8vIFBlcnNpc3QgYm90aCBib29sZWFuIHN0YXRlcyBleHBsaWNpdGx5IHNvIHNjaGVtYSBkZWZhdWx0cyBjYW5ub3QgcmVwbGFjZSBmYWxzZS5cblx0XHRcdFx0XHRcdG5leHRWYWwgPSB0LmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoICd2YWx1ZScgaW4gdCApIHtcclxuXHRcdFx0XHRcdFx0bmV4dFZhbCA9IFN0cmluZyggdC52YWx1ZSA/PyAnJyApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8gUGVyc2lzdCB0byBkYXRhc2V0LlxyXG5cdFx0XHRcdFx0aWYgKCBzZWw/LmRhdGFzZXQgKSBzZWwuZGF0YXNldFtrZXldID0gbmV4dFZhbDtcclxuXHJcblx0XHRcdFx0XHQvLyBHZW5lcmF0b3IgY29udHJvbHMgYXJlIFwiVUkgaW5wdXRzXCIg4oCUIGF2b2lkIFNUUlVDVFVSRV9DSEFOR0Ugc3BhbSB3aGlsZSBkcmFnZ2luZy90eXBpbmcuXHJcblx0XHRcdFx0XHRjb25zdCBpc19nZW5fa2V5ID0gKGtleS5pbmRleE9mKCAnZ2VuXycgKSA9PT0gMCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmUtcmVuZGVyIG9uIHZpc3VhbCBrZXlzIHNvIHByZXZpZXcgc3RheXMgaW4gc3luYyAoY2FsZW5kYXIgbGFiZWwvaGVscCwgZXRjLikuXHJcblx0XHRcdFx0XHRjb25zdCB2aXN1YWxLZXlzID0gbmV3IFNldCggWyAnaGVscCcsICdwbGFjZWhvbGRlcicsICdtaW5fd2lkdGgnLCAnY3NzY2xhc3MnIF0gKTtcclxuXHRcdFx0XHRcdGlmICggIWlzU2VjdGlvbiAmJiAodmlzdWFsS2V5cy5oYXMoIGtleSApIHx8IGtleS5zdGFydHNXaXRoKCAndWlfJyApKSApIHtcclxuXHRcdFx0XHRcdFx0Ly8gTGlnaHQgaGV1cmlzdGljOiBvbmx5IHJlLXJlbmRlciBvbiBjb21taXQgZm9yIGhlYXZ5IGlucHV0czsgbGl2ZSBmb3Igc2hvcnQgb25lcyBpcyBmaW5lLlxyXG5cdFx0XHRcdFx0XHRpZiAoIGUudHlwZSA9PT0gJ2NoYW5nZScgfHwga2V5ID09PSAnaGVscCcgfHwga2V5ID09PSAncGxhY2Vob2xkZXInICkge1xyXG5cdFx0XHRcdFx0XHRcdGIucmVuZGVyX3ByZXZpZXcoIHNlbCApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhKGlzX2dlbl9rZXkgJiYgZS50eXBlID09PSAnaW5wdXQnKSApIHtcclxuXHRcdFx0XHRcdFx0Ly8gRGVib3VuY2UgY29udGludW91cyB2YWx1ZSBzbGlkZXIgaW5wdXQgZXZlbnRzIHRvIGF2b2lkIGZ1bGwtY2FudmFzIHJlZnJlc2ggc3BhbS5cclxuXHRcdFx0XHRcdFx0Ly8gV2UgZGV0ZWN0IHRoZSBzbGlkZXIgZ3JvdXAgdmlhIFtkYXRhLWxlbi1ncm91cF0gd3JhcHBlci5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaXNfbGVuX2dyb3VwX2N0cmwgPSAhISh0ICYmIHQuY2xvc2VzdCAmJiB0LmNsb3Nlc3QoICdbZGF0YS1sZW4tZ3JvdXBdJyApKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaXNfbGVuX2dyb3VwX2N0cmwgJiYgZS50eXBlID09PSAnaW5wdXQnICkge1xyXG5cdFx0XHRcdFx0XHRcdGJ1c19lbWl0X2NoYW5nZV9kZWJvdW5jZWQoICdwcm9wLWNoYW5nZScsIHsga2V5LCBwaGFzZTogZS50eXBlIH0gKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRidXNfZW1pdF9jaGFuZ2UoICdwcm9wLWNoYW5nZScsIHsga2V5LCBwaGFzZTogZS50eXBlIH0gKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGlucy5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgaGFuZGxlciwgdHJ1ZSApO1xyXG5cdFx0XHQvLyByZWZsZWN0IGluc3RhbnRseSB3aGlsZSB0eXBpbmcgYXMgd2VsbC5cclxuXHRcdFx0aW5zLmFkZEV2ZW50TGlzdGVuZXIoICdpbnB1dCcsIGhhbmRsZXIsIHRydWUgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9wZW4gSW5zcGVjdG9yIGFmdGVyIGEgZmllbGQgaXMgYWRkZWQuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRfb3Blbl9pbnNwZWN0b3JfYWZ0ZXJfZmllbGRfYWRkZWQoKSB7XHJcblx0XHRcdGNvbnN0IEVWID0gQ29yZS5XUEJDX0JGQl9FdmVudHM7XHJcblx0XHRcdHRoaXMuYnVpbGRlcj8uYnVzPy5vbj8uKCBFVi5GSUVMRF9BREQsIChlKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZWwgPSBlPy5kZXRhaWw/LmVsIHx8IG51bGw7XHJcblx0XHRcdFx0aWYgKCBlbCAmJiB0aGlzLmJ1aWxkZXI/LnNlbGVjdF9maWVsZCApIHtcclxuXHRcdFx0XHRcdHRoaXMuYnVpbGRlci5zZWxlY3RfZmllbGQoIGVsLCB7IHNjcm9sbEludG9WaWV3OiB0cnVlIH0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gU2hvdyBJbnNwZWN0b3IgUGFsZXR0ZS5cclxuXHRcdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZShcclxuXHRcdFx0XHRcdCd3cGJjX2JmYjpzaG93X3BhbmVsJyxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0cGFuZWxfaWQ6ICd3cGJjX2JmYl9faW5zcGVjdG9yJyxcclxuXHRcdFx0XHRcdFx0dGFiX2lkICA6ICd3cGJjX3RhYl9pbnNwZWN0b3InXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEtleWJvYXJkIHNob3J0Y3V0cyBmb3Igc2VsZWN0aW9uLCBkZWxldGlvbiwgYW5kIG1vdmVtZW50LlxyXG5cdCAqL1xyXG5cdFVJLldQQkNfQkZCX0tleWJvYXJkX0NvbnRyb2xsZXIgPSBjbGFzcyBleHRlbmRzIFVJLldQQkNfQkZCX01vZHVsZSB7XHJcblx0XHRpbml0KCkge1xyXG5cdFx0XHR0aGlzLl9vbl9rZXkgPSB0aGlzLm9uX2tleS5iaW5kKCB0aGlzICk7XHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgdGhpcy5fb25fa2V5LCB0cnVlICk7XHJcblx0XHR9XHJcblxyXG5cdFx0ZGVzdHJveSgpIHtcclxuXHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2tleWRvd24nLCB0aGlzLl9vbl9rZXksIHRydWUgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBlICovXHJcblx0XHRvbl9rZXkoZSkge1xyXG5cdFx0XHRjb25zdCBiICAgICAgICAgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdGNvbnN0IGlzX3R5cGluZyA9IHRoaXMuX2lzX3R5cGluZ19hbnl3aGVyZSgpO1xyXG5cdFx0XHRpZiAoIGUua2V5ID09PSAnRXNjYXBlJyApIHtcclxuXHRcdFx0XHRpZiAoIGlzX3R5cGluZyApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5idWlsZGVyLmJ1cy5lbWl0KCBDb3JlLldQQkNfQkZCX0V2ZW50cy5DTEVBUl9TRUxFQ1RJT04sIHsgc291cmNlOiAnZXNjJyB9ICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IHNlbGVjdGVkID0gYi5nZXRfc2VsZWN0ZWRfZmllbGQ/LigpO1xyXG5cdFx0XHRpZiAoICFzZWxlY3RlZCB8fCBpc190eXBpbmcgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggZS5rZXkgPT09ICdEZWxldGUnIHx8IGUua2V5ID09PSAnQmFja3NwYWNlJyApIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0Yi5kZWxldGVfaXRlbT8uKCBzZWxlY3RlZCApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSAmJiAoZS5rZXkgPT09ICdBcnJvd1VwJyB8fCBlLmtleSA9PT0gJ0Fycm93RG93bicpICYmICFlLnNoaWZ0S2V5ICkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRjb25zdCBkaXIgPSAoZS5rZXkgPT09ICdBcnJvd1VwJykgPyAndXAnIDogJ2Rvd24nO1xyXG5cdFx0XHRcdGIubW92ZV9pdGVtPy4oIHNlbGVjdGVkLCBkaXIgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBlLmtleSA9PT0gJ0VudGVyJyApIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0Yi5zZWxlY3RfZmllbGQoIHNlbGVjdGVkLCB7IHNjcm9sbEludG9WaWV3OiB0cnVlIH0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cclxuXHRcdF9pc190eXBpbmdfYW55d2hlcmUoKSB7XHJcblx0XHRcdGNvbnN0IGEgICA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblx0XHRcdGNvbnN0IHRhZyA9IGE/LnRhZ05hbWU7XHJcblx0XHRcdGlmICggdGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnIHx8IChhPy5pc0NvbnRlbnRFZGl0YWJsZSA9PT0gdHJ1ZSkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgaW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRyZXR1cm4gISEoaW5zICYmIGEgJiYgaW5zLmNvbnRhaW5zKCBhICkpO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbHVtbiByZXNpemUgbG9naWMgZm9yIHNlY3Rpb24gcm93cy5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9SZXNpemVfQ29udHJvbGxlciA9IGNsYXNzIGV4dGVuZHMgVUkuV1BCQ19CRkJfTW9kdWxlIHtcclxuXHRcdGluaXQoKSB7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5pbml0X3Jlc2l6ZV9oYW5kbGVyID0gdGhpcy5oYW5kbGVfcmVzaXplLmJpbmQoIHRoaXMgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIHJlYWQgdGhlIENTUyB2YXIgKGtlcHQgbG9jYWwgc28gaXQgZG9lc27igJl0IGRlcGVuZCBvbiB0aGUgTWluLVdpZHRoIG1vZHVsZSlcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gY29sXHJcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfG51bWJlcn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdF9nZXRfY29sX21pbl9weChjb2wpIHtcclxuXHRcdFx0Y29uc3QgdiA9IGdldENvbXB1dGVkU3R5bGUoIGNvbCApLmdldFByb3BlcnR5VmFsdWUoICctLXdwYmMtY29sLW1pbicgKSB8fCAnMCc7XHJcblx0XHRcdGNvbnN0IG4gPSBwYXJzZUZsb2F0KCB2ICk7XHJcblx0XHRcdHJldHVybiBOdW1iZXIuaXNGaW5pdGUoIG4gKSA/IE1hdGgubWF4KCAwLCBuICkgOiAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgKi9cclxuXHRcdGhhbmRsZV9yZXNpemUoZSkge1xyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGlmICggZS5idXR0b24gIT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCByZXNpemVyICAgPSBlLmN1cnJlbnRUYXJnZXQ7XHJcblx0XHRcdGNvbnN0IHJvd19lbCAgICA9IHJlc2l6ZXIucGFyZW50RWxlbWVudDtcclxuXHRcdFx0Y29uc3QgY29scyAgICAgID0gQXJyYXkuZnJvbSggcm93X2VsLnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKSApO1xyXG5cdFx0XHRjb25zdCBsZWZ0X2NvbCAgPSByZXNpemVyPy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xyXG5cdFx0XHRjb25zdCByaWdodF9jb2wgPSByZXNpemVyPy5uZXh0RWxlbWVudFNpYmxpbmc7XHJcblx0XHRcdGlmICggIWxlZnRfY29sIHx8ICFyaWdodF9jb2wgfHwgIWxlZnRfY29sLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19jb2x1bW4nICkgfHwgIXJpZ2h0X2NvbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fY29sdW1uJyApICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgbGVmdF9pbmRleCAgPSBjb2xzLmluZGV4T2YoIGxlZnRfY29sICk7XHJcblx0XHRcdGNvbnN0IHJpZ2h0X2luZGV4ID0gY29scy5pbmRleE9mKCByaWdodF9jb2wgKTtcclxuXHRcdFx0aWYgKCBsZWZ0X2luZGV4ID09PSAtMSB8fCByaWdodF9pbmRleCAhPT0gbGVmdF9pbmRleCArIDEgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBzdGFydF94ICAgICAgICA9IGUuY2xpZW50WDtcclxuXHRcdFx0Y29uc3QgbGVmdF9zdGFydF9weCAgPSBsZWZ0X2NvbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcclxuXHRcdFx0Y29uc3QgcmlnaHRfc3RhcnRfcHggPSByaWdodF9jb2wuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcblx0XHRcdGNvbnN0IHBhaXJfcHggICAgICAgID0gTWF0aC5tYXgoIDAsIGxlZnRfc3RhcnRfcHggKyByaWdodF9zdGFydF9weCApO1xyXG5cclxuXHRcdFx0Y29uc3QgZ3AgICAgICAgICA9IGIuY29sX2dhcF9wZXJjZW50O1xyXG5cdFx0XHRjb25zdCBjb21wdXRlZCAgID0gYi5sYXlvdXQuY29tcHV0ZV9lZmZlY3RpdmVfYmFzZXNfZnJvbV9yb3coIHJvd19lbCwgZ3AgKTtcclxuXHRcdFx0Y29uc3QgYXZhaWxhYmxlICA9IGNvbXB1dGVkLmF2YWlsYWJsZTsgICAgICAgICAgICAgICAgIC8vICUgb2YgdGhlIOKAnGZ1bGwgMTAw4oCdIGFmdGVyIGdhcHNcclxuXHRcdFx0Y29uc3QgYmFzZXMgICAgICA9IGNvbXB1dGVkLmJhc2VzLnNsaWNlKCAwICk7ICAgICAgICAgICAgLy8gY3VycmVudCBlZmZlY3RpdmUgJVxyXG5cdFx0XHRjb25zdCBwYWlyX2F2YWlsID0gYmFzZXNbbGVmdF9pbmRleF0gKyBiYXNlc1tyaWdodF9pbmRleF07XHJcblxyXG5cdFx0XHQvLyBCYWlsIGlmIHdlIGNhbuKAmXQgY29tcHV0ZSBzYW5lIGRlbHRhcy5cclxuXHRcdFx0aWYgKCFwYWlyX3B4IHx8ICFOdW1iZXIuaXNGaW5pdGUocGFpcl9hdmFpbCkgfHwgcGFpcl9hdmFpbCA8PSAwKSByZXR1cm47XHJcblxyXG5cdFx0XHQvLyAtLS0gTUlOIENMQU1QUyAocGl4ZWxzKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHRcdGNvbnN0IHBjdFRvUHggICAgICAgPSAocGN0KSA9PiAocGFpcl9weCAqIChwY3QgLyBwYWlyX2F2YWlsKSk7IC8vIHBhaXItbG9jYWwgcGVyY2VudCAtPiBweFxyXG5cdFx0XHRjb25zdCBnZW5lcmljTWluUGN0ID0gTWF0aC5taW4oIDAuMSwgYXZhaWxhYmxlICk7ICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgMC4xJSBmbG9vciAoaW4g4oCcYXZhaWxhYmxlICXigJ0gc3BhY2UpXHJcblx0XHRcdGNvbnN0IGdlbmVyaWNNaW5QeCAgPSBwY3RUb1B4KCBnZW5lcmljTWluUGN0ICk7XHJcblxyXG5cdFx0XHRjb25zdCBsZWZ0TWluUHggID0gTWF0aC5tYXgoIHRoaXMuX2dldF9jb2xfbWluX3B4KCBsZWZ0X2NvbCApLCBnZW5lcmljTWluUHggKTtcclxuXHRcdFx0Y29uc3QgcmlnaHRNaW5QeCA9IE1hdGgubWF4KCB0aGlzLl9nZXRfY29sX21pbl9weCggcmlnaHRfY29sICksIGdlbmVyaWNNaW5QeCApO1xyXG5cclxuXHRcdFx0Ly8gZnJlZXplIHRleHQgc2VsZWN0aW9uICsgY3Vyc29yXHJcblx0XHRcdGNvbnN0IHByZXZfdXNlcl9zZWxlY3QgICAgICAgICA9IGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdDtcclxuXHRcdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xyXG5cdFx0XHRyb3dfZWwuc3R5bGUuY3Vyc29yICAgICAgICAgICAgPSAnY29sLXJlc2l6ZSc7XHJcblxyXG5cdFx0XHRjb25zdCBvbl9tb3VzZV9tb3ZlID0gKGV2KSA9PiB7XHJcblx0XHRcdFx0aWYgKCAhcGFpcl9weCApIHJldHVybjtcclxuXHJcblx0XHRcdFx0Ly8gd29yayBpbiBwaXhlbHMsIGNsYW1wIGJ5IGVhY2ggc2lkZeKAmXMgbWluXHJcblx0XHRcdFx0Y29uc3QgZGVsdGFfcHggICA9IGV2LmNsaWVudFggLSBzdGFydF94O1xyXG5cdFx0XHRcdGxldCBuZXdMZWZ0UHggICAgPSBsZWZ0X3N0YXJ0X3B4ICsgZGVsdGFfcHg7XHJcblx0XHRcdFx0bmV3TGVmdFB4ICAgICAgICA9IE1hdGgubWF4KCBsZWZ0TWluUHgsIE1hdGgubWluKCBwYWlyX3B4IC0gcmlnaHRNaW5QeCwgbmV3TGVmdFB4ICkgKTtcclxuXHRcdFx0XHRjb25zdCBuZXdSaWdodFB4ID0gcGFpcl9weCAtIG5ld0xlZnRQeDtcclxuXHJcblx0XHRcdFx0Ly8gdHJhbnNsYXRlIGJhY2sgdG8gcGFpci1sb2NhbCBwZXJjZW50YWdlc1xyXG5cdFx0XHRcdGNvbnN0IG5ld0xlZnRQY3QgICAgICA9IChuZXdMZWZ0UHggLyBwYWlyX3B4KSAqIHBhaXJfYXZhaWw7XHJcblx0XHRcdFx0Y29uc3QgbmV3QmFzZXMgICAgICAgID0gYmFzZXMuc2xpY2UoIDAgKTtcclxuXHRcdFx0XHRuZXdCYXNlc1tsZWZ0X2luZGV4XSAgPSBuZXdMZWZ0UGN0O1xyXG5cdFx0XHRcdG5ld0Jhc2VzW3JpZ2h0X2luZGV4XSA9IHBhaXJfYXZhaWwgLSBuZXdMZWZ0UGN0O1xyXG5cclxuXHRcdFx0XHRiLmxheW91dC5hcHBseV9iYXNlc190b19yb3coIHJvd19lbCwgbmV3QmFzZXMgKTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGNvbnN0IG9uX21vdXNlX3VwID0gKCkgPT4ge1xyXG5cdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbl9tb3VzZV9tb3ZlICk7XHJcblx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNldXAnLCBvbl9tb3VzZV91cCApO1xyXG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2V1cCcsIG9uX21vdXNlX3VwICk7XHJcblx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlbGVhdmUnLCBvbl9tb3VzZV91cCApO1xyXG5cdFx0XHRcdGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9IHByZXZfdXNlcl9zZWxlY3QgfHwgJyc7XHJcblx0XHRcdFx0cm93X2VsLnN0eWxlLmN1cnNvciAgICAgICAgICAgID0gJyc7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbGl6ZSB0byB0aGUgcm934oCZcyBhdmFpbGFibGUgJSBhZ2FpblxyXG5cdFx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBiLmxheW91dC5jb21wdXRlX2VmZmVjdGl2ZV9iYXNlc19mcm9tX3Jvdyggcm93X2VsLCBncCApO1xyXG5cdFx0XHRcdGIubGF5b3V0LmFwcGx5X2Jhc2VzX3RvX3Jvdyggcm93X2VsLCBub3JtYWxpemVkLmJhc2VzICk7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2Vtb3ZlJywgb25fbW91c2VfbW92ZSApO1xyXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnbW91c2V1cCcsIG9uX21vdXNlX3VwICk7XHJcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnbW91c2V1cCcsIG9uX21vdXNlX3VwICk7XHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWxlYXZlJywgb25fbW91c2VfdXAgKTtcclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogUGFnZSBhbmQgc2VjdGlvbiBjcmVhdGlvbiwgcmVidWlsZGluZywgYW5kIG5lc3RlZCBTb3J0YWJsZSBzZXR1cC5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9QYWdlc19TZWN0aW9ucyA9IGNsYXNzIGV4dGVuZHMgVUkuV1BCQ19CRkJfTW9kdWxlIHtcclxuXHJcblx0XHRpbml0KCkge1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuYWRkX3BhZ2UgICAgICAgICAgICAgICAgICA9IChvcHRzKSA9PiB0aGlzLmFkZF9wYWdlKCBvcHRzICk7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5hZGRfc2VjdGlvbiAgICAgICAgICAgICAgID0gKGNvbnRhaW5lciwgY29scykgPT4gdGhpcy5hZGRfc2VjdGlvbiggY29udGFpbmVyLCBjb2xzICk7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5yZWJ1aWxkX3NlY3Rpb24gICAgICAgICAgID0gKHNlY3Rpb25fZGF0YSwgY29udGFpbmVyKSA9PiB0aGlzLnJlYnVpbGRfc2VjdGlvbiggc2VjdGlvbl9kYXRhLCBjb250YWluZXIgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLmluaXRfYWxsX25lc3RlZF9zb3J0YWJsZXMgPSAoZWwpID0+IHRoaXMuaW5pdF9hbGxfbmVzdGVkX3NvcnRhYmxlcyggZWwgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLmluaXRfc2VjdGlvbl9zb3J0YWJsZSAgICAgPSAoZWwpID0+IHRoaXMuaW5pdF9zZWN0aW9uX3NvcnRhYmxlKCBlbCApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIucGFnZXNfc2VjdGlvbnMgICAgICAgICAgICA9IHRoaXM7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBHaXZlIGV2ZXJ5IGZpZWxkL3NlY3Rpb24gaW4gYSBjbG9uZWQgc3VidHJlZSBhIGZyZXNoIGRhdGEtdWlkIHNvXHJcblx0XHQgKiB1bmlxdWVuZXNzIGNoZWNrcyBkb24ndCBleGNsdWRlIHRoZWlyIG9yaWdpbmFscy5cclxuXHRcdCAqL1xyXG5cdFx0X3JldGFnX3VpZHNfaW5fc3VidHJlZShyb290KSB7XHJcblx0XHRcdGNvbnN0IGIgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdGlmICggIXJvb3QgKSByZXR1cm47XHJcblx0XHRcdGNvbnN0IG5vZGVzID0gW107XHJcblx0XHRcdGlmICggcm9vdC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgfHwgcm9vdC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX2ZpZWxkJyApICkge1xyXG5cdFx0XHRcdG5vZGVzLnB1c2goIHJvb3QgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRub2Rlcy5wdXNoKCAuLi5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX3NlY3Rpb24sIC53cGJjX2JmYl9fZmllbGQnICkgKTtcclxuXHRcdFx0bm9kZXMuZm9yRWFjaCggKGVsKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgcHJlZml4ICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKSA/ICdzJyA6ICdmJztcclxuXHRcdFx0XHRlbC5kYXRhc2V0LnVpZCA9IGAke3ByZWZpeH0tJHsrK2IuX3VpZF9jb3VudGVyfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZyggMzYgKS5zbGljZSggMiwgNyApfWA7XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1bXAgXCJmb29cIiwgXCJmb28tMlwiLCBcImZvby0zXCIsIC4uLlxyXG5cdFx0ICovXHJcblx0XHRfbWFrZV91bmlxdWUoYmFzZSwgdGFrZW4pIHtcclxuXHRcdFx0Y29uc3QgcyA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemU7XHJcblx0XHRcdGxldCB2ICAgPSBTdHJpbmcoIGJhc2UgfHwgJycgKTtcclxuXHRcdFx0aWYgKCAhdiApIHYgPSAnZmllbGQnO1xyXG5cdFx0XHRjb25zdCBtICA9IHYubWF0Y2goIC8tKFxcZCspJC8gKTtcclxuXHRcdFx0bGV0IG4gICAgPSBtID8gKHBhcnNlSW50KCBtWzFdLCAxMCApIHx8IDEpIDogMTtcclxuXHRcdFx0bGV0IHN0ZW0gPSBtID8gdi5yZXBsYWNlKCAvLVxcZCskLywgJycgKSA6IHY7XHJcblx0XHRcdHdoaWxlICggdGFrZW4uaGFzKCB2ICkgKSB7XHJcblx0XHRcdFx0biA9IE1hdGgubWF4KCAyLCBuICsgMSApO1xyXG5cdFx0XHRcdHYgPSBgJHtzdGVtfS0ke259YDtcclxuXHRcdFx0fVxyXG5cdFx0XHR0YWtlbi5hZGQoIHYgKTtcclxuXHRcdFx0cmV0dXJuIHY7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTdHJpY3QsIG9uZS1wYXNzIGRlLWR1cGxpY2F0aW9uIGZvciBhIG5ld2x5LWluc2VydGVkIHN1YnRyZWUuXHJcblx0XHQgKiAtIEVuc3VyZXMgdW5pcXVlIGRhdGEtaWQgKGludGVybmFsKSwgZGF0YS1uYW1lIChmaWVsZHMpLCBkYXRhLWh0bWxfaWQgKHB1YmxpYylcclxuXHRcdCAqIC0gQWxzbyB1cGRhdGVzIERPTTogPHNlY3Rpb24gaWQ+LCA8aW5wdXQgaWQ+LCA8bGFiZWwgZm9yPiwgYW5kIGlucHV0W25hbWVdLlxyXG5cdFx0ICovXHJcblx0XHRfZGVkdXBlX3N1YnRyZWVfc3RyaWN0KHJvb3QpIHtcclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Y29uc3QgcyA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemU7XHJcblx0XHRcdGlmICggIXJvb3QgfHwgIWI/LnBhZ2VzX2NvbnRhaW5lciApIHJldHVybjtcclxuXHJcblx0XHRcdC8vIDEpIEJ1aWxkIFwidGFrZW5cIiBzZXRzIGZyb20gb3V0c2lkZSB0aGUgc3VidHJlZS5cclxuXHRcdFx0Y29uc3QgdGFrZW5EYXRhSWQgICA9IG5ldyBTZXQoKTtcclxuXHRcdFx0Y29uc3QgdGFrZW5EYXRhTmFtZSA9IG5ldyBTZXQoKTtcclxuXHRcdFx0Y29uc3QgdGFrZW5IdG1sSWQgICA9IG5ldyBTZXQoKTtcclxuXHRcdFx0Y29uc3QgdGFrZW5Eb21JZCAgICA9IG5ldyBTZXQoKTtcclxuXHJcblx0XHRcdC8vIEFsbCBmaWVsZHMvc2VjdGlvbnMgb3V0c2lkZSByb290XHJcblx0XHRcdGIucGFnZXNfY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX2ZpZWxkLCAud3BiY19iZmJfX3NlY3Rpb24nICkuZm9yRWFjaCggZWwgPT4ge1xyXG5cdFx0XHRcdGlmICggcm9vdC5jb250YWlucyggZWwgKSApIHJldHVybjtcclxuXHRcdFx0XHRjb25zdCBkaWQgID0gZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1pZCcgKTtcclxuXHRcdFx0XHRjb25zdCBkbmFtID0gZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1uYW1lJyApO1xyXG5cdFx0XHRcdGNvbnN0IGhpZCAgPSBlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLWh0bWxfaWQnICk7XHJcblx0XHRcdFx0aWYgKCBkaWQgKSB0YWtlbkRhdGFJZC5hZGQoIGRpZCApO1xyXG5cdFx0XHRcdGlmICggZG5hbSApIHRha2VuRGF0YU5hbWUuYWRkKCBkbmFtICk7XHJcblx0XHRcdFx0aWYgKCBoaWQgKSB0YWtlbkh0bWxJZC5hZGQoIGhpZCApO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBBbGwgRE9NIGlkcyBvdXRzaWRlIHJvb3QgKGxhYmVscywgaW5wdXRzLCBhbnl0aGluZylcclxuXHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1tpZF0nICkuZm9yRWFjaCggZWwgPT4ge1xyXG5cdFx0XHRcdGlmICggcm9vdC5jb250YWlucyggZWwgKSApIHJldHVybjtcclxuXHRcdFx0XHRpZiAoIGVsLmlkICkgdGFrZW5Eb21JZC5hZGQoIGVsLmlkICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGNvbnN0IG5vZGVzID0gW107XHJcblx0XHRcdGlmICggcm9vdC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgfHwgcm9vdC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX2ZpZWxkJyApICkge1xyXG5cdFx0XHRcdG5vZGVzLnB1c2goIHJvb3QgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRub2Rlcy5wdXNoKCAuLi5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX3NlY3Rpb24sIC53cGJjX2JmYl9fZmllbGQnICkgKTtcclxuXHJcblx0XHRcdC8vIDIpIFdhbGsgdGhlIHN1YnRyZWUgYW5kIGZpeCBjb2xsaXNpb25zIGRldGVybWluaXN0aWNhbGx5LlxyXG5cdFx0XHRub2Rlcy5mb3JFYWNoKCBlbCA9PiB7XHJcblx0XHRcdFx0Y29uc3QgaXNGaWVsZCAgID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX2ZpZWxkJyApO1xyXG5cdFx0XHRcdGNvbnN0IGlzU2VjdGlvbiA9IGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApO1xyXG5cclxuXHRcdFx0XHQvLyBJTlRFUk5BTCBkYXRhLWlkXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0Y29uc3QgcmF3ICA9IGVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtaWQnICkgfHwgJyc7XHJcblx0XHRcdFx0XHRjb25zdCBiYXNlID0gcy5zYW5pdGl6ZV9odG1sX2lkKCByYXcgKSB8fCAoaXNTZWN0aW9uID8gJ3NlY3Rpb24nIDogJ2ZpZWxkJyk7XHJcblx0XHRcdFx0XHRjb25zdCB1bmlxID0gdGhpcy5fbWFrZV91bmlxdWUoIGJhc2UsIHRha2VuRGF0YUlkICk7XHJcblx0XHRcdFx0XHRpZiAoIHVuaXEgIT09IHJhdyApIGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtaWQnLCB1bmlxICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBIVE1MIG5hbWUgKGZpZWxkcyBvbmx5KVxyXG5cdFx0XHRcdGlmICggaXNGaWVsZCApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHJhdyA9IGVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtbmFtZScgKSB8fCAnJztcclxuXHRcdFx0XHRcdGlmICggcmF3ICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiYXNlID0gcy5zYW5pdGl6ZV9odG1sX25hbWUoIHJhdyApO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB1bmlxID0gdGhpcy5fbWFrZV91bmlxdWUoIGJhc2UsIHRha2VuRGF0YU5hbWUgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCB1bmlxICE9PSByYXcgKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1uYW1lJywgdW5pcSApO1xyXG5cdFx0XHRcdFx0XHRcdC8vIFVwZGF0ZSBpbm5lciBjb250cm9sIGltbWVkaWF0ZWx5XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaW5wdXQgPSBlbC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnICk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBpbnB1dCApIGlucHV0LnNldEF0dHJpYnV0ZSggJ25hbWUnLCB1bmlxICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFB1YmxpYyBIVE1MIGlkIChmaWVsZHMgKyBzZWN0aW9ucylcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRjb25zdCByYXcgPSBlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLWh0bWxfaWQnICkgfHwgJyc7XHJcblx0XHRcdFx0XHRpZiAoIHJhdyApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYmFzZSAgICAgICAgICA9IHMuc2FuaXRpemVfaHRtbF9pZCggcmF3ICk7XHJcblx0XHRcdFx0XHRcdC8vIFJlc2VydmUgYWdhaW5zdCBCT1RIIGtub3duIGRhdGEtaHRtbF9pZCBhbmQgcmVhbCBET00gaWRzLlxyXG5cdFx0XHRcdFx0XHRjb25zdCBjb21iaW5lZFRha2VuID0gbmV3IFNldCggWyAuLi50YWtlbkh0bWxJZCwgLi4udGFrZW5Eb21JZCBdICk7XHJcblx0XHRcdFx0XHRcdGxldCBjYW5kaWRhdGUgICAgICAgPSB0aGlzLl9tYWtlX3VuaXF1ZSggYmFzZSwgY29tYmluZWRUYWtlbiApO1xyXG5cdFx0XHRcdFx0XHQvLyBSZWNvcmQgaW50byB0aGUgcmVhbCBzZXRzIHNvIGZ1dHVyZSBjaGVja3Mgc2VlIHRoZSByZXNlcnZhdGlvbi5cclxuXHRcdFx0XHRcdFx0dGFrZW5IdG1sSWQuYWRkKCBjYW5kaWRhdGUgKTtcclxuXHRcdFx0XHRcdFx0dGFrZW5Eb21JZC5hZGQoIGNhbmRpZGF0ZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBjYW5kaWRhdGUgIT09IHJhdyApIGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtaHRtbF9pZCcsIGNhbmRpZGF0ZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gUmVmbGVjdCB0byBET00gaW1tZWRpYXRlbHlcclxuXHRcdFx0XHRcdFx0aWYgKCBpc1NlY3Rpb24gKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWwuaWQgPSBjYW5kaWRhdGUgfHwgJyc7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaW5wdXQgPSBlbC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnICk7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbGFiZWwgPSBlbC5xdWVyeVNlbGVjdG9yKCAnbGFiZWwud3BiY19iZmJfX2ZpZWxkLWxhYmVsJyApO1xyXG5cdFx0XHRcdFx0XHRcdGlmICggaW5wdXQgKSBpbnB1dC5pZCA9IGNhbmRpZGF0ZSB8fCAnJztcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGxhYmVsICkgbGFiZWwuaHRtbEZvciA9IGNhbmRpZGF0ZSB8fCAnJztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggaXNTZWN0aW9uICkge1xyXG5cdFx0XHRcdFx0XHQvLyBFbnN1cmUgbm8gc3RhbGUgRE9NIGlkIGlmIGRhdGEtaHRtbF9pZCB3YXMgY2xlYXJlZFxyXG5cdFx0XHRcdFx0XHRlbC5yZW1vdmVBdHRyaWJ1dGUoICdpZCcgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRfbWFrZV9hZGRfY29sdW1uc19jb250cm9sKHBhZ2VfZWwsIHNlY3Rpb25fY29udGFpbmVyLCBpbnNlcnRfcG9zID0gJ2JvdHRvbScpIHtcclxuXHJcblx0XHRcdC8vIEFjY2VwdCBpbnNlcnRfcG9zICgndG9wJ3wnYm90dG9tJyksIGRlZmF1bHQgJ2JvdHRvbScuXHJcblxyXG5cdFx0XHRjb25zdCB0cGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19hZGRfY29sdW1uc190ZW1wbGF0ZScgKTtcclxuXHRcdFx0aWYgKCAhdHBsICkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDbG9uZSAqY29udGVudHMqIChub3QgdGhlIGlkKSwgdW5oaWRlLCBhbmQgYWRkIGEgcGFnZS1zY29wZWQgY2xhc3MuXHJcblx0XHRcdGNvbnN0IHNyYyA9ICh0cGwuY29udGVudCAmJiB0cGwuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCkgPyB0cGwuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCA6IHRwbC5maXJzdEVsZW1lbnRDaGlsZDtcclxuXHRcdFx0aWYgKCAhc3JjICkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjbG9uZSA9IHNyYy5jbG9uZU5vZGUoIHRydWUgKTtcclxuXHRcdFx0Y2xvbmUucmVtb3ZlQXR0cmlidXRlKCAnaGlkZGVuJyApO1xyXG5cdFx0XHRpZiAoIGNsb25lLmlkICkge1xyXG5cdFx0XHRcdGNsb25lLnJlbW92ZUF0dHJpYnV0ZSggJ2lkJyApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNsb25lLnF1ZXJ5U2VsZWN0b3JBbGwoICdbaWRdJyApLmZvckVhY2goIG4gPT4gbi5yZW1vdmVBdHRyaWJ1dGUoICdpZCcgKSApO1xyXG5cclxuXHRcdFx0Ly8gTWFyayB3aGVyZSB0aGlzIGNvbnRyb2wgaW5zZXJ0cyBzZWN0aW9ucy5cclxuXHRcdFx0Y2xvbmUuZGF0YXNldC5pbnNlcnQgPSBpbnNlcnRfcG9zOyAvLyAndG9wJyB8ICdib3R0b20nXHJcblxyXG5cdFx0XHQvLyAvLyBPcHRpb25hbCBVSSBoaW50IGZvciB1c2VycyAoa2VlcHMgZXhpc3RpbmcgbWFya3VwIGludGFjdCkuXHJcblx0XHRcdC8vIGNvbnN0IGhpbnQgPSBjbG9uZS5xdWVyeVNlbGVjdG9yKCAnLm5hdi10YWItdGV4dCAuc2VsZWN0ZWRfdmFsdWUnICk7XHJcblx0XHRcdC8vIGlmICggaGludCApIHtcclxuXHRcdFx0Ly8gXHRoaW50LnRleHRDb250ZW50ID0gKGluc2VydF9wb3MgPT09ICd0b3AnKSA/ICcgKGFkZCBhdCB0b3ApJyA6ICcgKGFkZCBhdCBib3R0b20pJztcclxuXHRcdFx0Ly8gfVxyXG5cclxuXHRcdFx0Ly8gQ2xpY2sgb24gb3B0aW9ucyAtIGFkZCBzZWN0aW9uIHdpdGggTiBjb2x1bW5zLlxyXG5cdFx0XHRjbG9uZS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGEgPSBlLnRhcmdldC5jbG9zZXN0KCAnLnVsX2Ryb3Bkb3duX21lbnVfbGlfYWN0aW9uX2FkZF9zZWN0aW9ucycgKTtcclxuXHRcdFx0XHRpZiAoICFhICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdC8vIFJlYWQgTiBlaXRoZXIgZnJvbSBkYXRhLWNvbHMgb3IgZmFsbGJhY2sgdG8gcGFyc2luZyB0ZXh0IGxpa2UgXCIzIENvbHVtbnNcIi5cclxuXHRcdFx0XHRsZXQgY29scyA9IHBhcnNlSW50KCBhLmRhdGFzZXQuY29scyB8fCAoYS50ZXh0Q29udGVudC5tYXRjaCggL1xcYihcXGQrKVxccypDb2x1bW4vaSApPy5bMV0gPz8gJzEnKSwgMTAgKTtcclxuXHRcdFx0XHRjb2xzICAgICA9IE1hdGgubWF4KCAxLCBNYXRoLm1pbiggNCwgY29scyApICk7XHJcblxyXG5cdFx0XHRcdC8vIE5FVzogaG9ub3IgdGhlIGNvbnRyb2wncyBpbnNlcnRpb24gcG9zaXRpb25cclxuXHRcdFx0XHR0aGlzLmFkZF9zZWN0aW9uKCBzZWN0aW9uX2NvbnRhaW5lciwgY29scywgaW5zZXJ0X3BvcyApO1xyXG5cclxuXHRcdFx0XHQvLyBSZWZsZWN0IGxhc3QgY2hvaWNlICh1bmNoYW5nZWQpXHJcblx0XHRcdFx0Y29uc3QgdmFsID0gY2xvbmUucXVlcnlTZWxlY3RvciggJy5zZWxlY3RlZF92YWx1ZScgKTtcclxuXHRcdFx0XHRpZiAoIHZhbCApIHtcclxuXHRcdFx0XHRcdHZhbC50ZXh0Q29udGVudCA9IGAgKCR7Y29sc30pYDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHJldHVybiBjbG9uZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwYXJhbSB7e3Njcm9sbD86IGJvb2xlYW59fSBbb3B0cyA9IHt9XVxyXG5cdFx0ICogQHJldHVybnMge0hUTUxFbGVtZW50fVxyXG5cdFx0ICovXHJcblx0XHRhZGRfcGFnZSh7IHNjcm9sbCA9IHRydWUgfSA9IHt9KSB7XHJcblx0XHRcdGNvbnN0IGIgICAgICAgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdGNvbnN0IHBhZ2VfZWwgPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5jcmVhdGVfZWxlbWVudCggJ2RpdicsICd3cGJjX2JmYl9fcGFuZWwgd3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3ICB3cGJjX2JmYl9mb3JtIHdwYmNfY29udGFpbmVyIHdwYmNfZm9ybSB3cGJjX2NvbnRhaW5lcl9ib29raW5nX2Zvcm0nICk7XHJcblx0XHRcdHBhZ2VfZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1wYWdlJywgKytiLnBhZ2VfY291bnRlciApO1xyXG5cclxuXHRcdFx0Ly8gXCJQYWdlIDEgfCBYXCIgLSBSZW5kZXIgcGFnZSBUaXRsZSB3aXRoIFJlbW92ZSBYIGJ1dHRvbi5cclxuXHRcdFx0Y29uc3QgY29udHJvbHNfaHRtbCA9IFVJLnJlbmRlcl93cF90ZW1wbGF0ZSggJ3dwYmMtYmZiLXRwbC1wYWdlLXJlbW92ZScsIHsgcGFnZV9udW1iZXI6IGIucGFnZV9jb3VudGVyIH0gKTtcclxuXHRcdFx0cGFnZV9lbC5pbm5lckhUTUwgICA9IGNvbnRyb2xzX2h0bWwgKyAnPGRpdiBjbGFzcz1cIndwYmNfYmZiX19mb3JtX3ByZXZpZXdfc2VjdGlvbl9jb250YWluZXIgd3BiY193aXphcmRfX2JvcmRlcl9jb250YWluZXJcIj48L2Rpdj4nO1xyXG5cclxuXHRcdFx0Yi5wYWdlc19jb250YWluZXIuYXBwZW5kQ2hpbGQoIHBhZ2VfZWwgKTtcclxuXHRcdFx0aWYgKCBzY3JvbGwgKSB7XHJcblx0XHRcdFx0cGFnZV9lbC5zY3JvbGxJbnRvVmlldyggeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgc2VjdGlvbl9jb250YWluZXIgICAgICAgICA9IHBhZ2VfZWwucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fZm9ybV9wcmV2aWV3X3NlY3Rpb25fY29udGFpbmVyJyApO1xyXG5cdFx0XHRjb25zdCBzZWN0aW9uX2NvdW50X29uX2FkZF9wYWdlID0gMjtcclxuXHRcdFx0dGhpcy5pbml0X3NlY3Rpb25fc29ydGFibGUoIHNlY3Rpb25fY29udGFpbmVyICk7XHJcblx0XHRcdHRoaXMuYWRkX3NlY3Rpb24oIHNlY3Rpb25fY29udGFpbmVyLCBzZWN0aW9uX2NvdW50X29uX2FkZF9wYWdlICk7XHJcblxyXG5cdFx0XHQvLyBEcm9wZG93biBjb250cm9sIGNsb25lZCBmcm9tIHRoZSBoaWRkZW4gdGVtcGxhdGUuXHJcblx0XHRcdGNvbnN0IGNvbnRyb2xzX2hvc3RfdG9wID0gcGFnZV9lbC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19jb250cm9scycgKTtcclxuXHRcdFx0Y29uc3QgY3RybF90b3AgICAgICAgICAgPSB0aGlzLl9tYWtlX2FkZF9jb2x1bW5zX2NvbnRyb2woIHBhZ2VfZWwsIHNlY3Rpb25fY29udGFpbmVyLCAndG9wJyApO1xyXG5cdFx0XHRpZiAoIGN0cmxfdG9wICkge1xyXG5cdFx0XHRcdGNvbnRyb2xzX2hvc3RfdG9wLmFwcGVuZENoaWxkKCBjdHJsX3RvcCApO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIEJvdHRvbSBjb250cm9sIGJhciBhZnRlciB0aGUgc2VjdGlvbiBjb250YWluZXIuXHJcblx0XHRcdGNvbnN0IGNvbnRyb2xzX2hvc3RfYm90dG9tID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuY3JlYXRlX2VsZW1lbnQoICdkaXYnLCAnd3BiY19iZmJfX2NvbnRyb2xzIHdwYmNfYmZiX19jb250cm9scy0tYm90dG9tJyApO1xyXG5cdFx0XHRzZWN0aW9uX2NvbnRhaW5lci5hZnRlciggY29udHJvbHNfaG9zdF9ib3R0b20gKTtcclxuXHRcdFx0Y29uc3QgY3RybF9ib3R0b20gPSB0aGlzLl9tYWtlX2FkZF9jb2x1bW5zX2NvbnRyb2woIHBhZ2VfZWwsIHNlY3Rpb25fY29udGFpbmVyLCAnYm90dG9tJyApO1xyXG5cdFx0XHRpZiAoIGN0cmxfYm90dG9tICkge1xyXG5cdFx0XHRcdGNvbnRyb2xzX2hvc3RfYm90dG9tLmFwcGVuZENoaWxkKCBjdHJsX2JvdHRvbSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcGFnZV9lbDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lclxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9ICAgICAgY29sc1xyXG5cdFx0ICogQHBhcmFtIHsndG9wJ3wnYm90dG9tJ30gW2luc2VydF9wb3M9J2JvdHRvbSddICAvLyBORVdcclxuXHRcdCAqL1xyXG5cdFx0YWRkX3NlY3Rpb24oY29udGFpbmVyLCBjb2xzLCBpbnNlcnRfcG9zID0gJ2JvdHRvbScpIHtcclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Y29scyAgICA9IE1hdGgubWF4KCAxLCBwYXJzZUludCggY29scywgMTAgKSB8fCAxICk7XHJcblxyXG5cdFx0XHRjb25zdCBzZWN0aW9uID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuY3JlYXRlX2VsZW1lbnQoICdkaXYnLCAnd3BiY19iZmJfX3NlY3Rpb24nICk7XHJcblx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS1pZCcsIGBzZWN0aW9uLSR7KytiLnNlY3Rpb25fY291bnRlcn0tJHtEYXRlLm5vdygpfWAgKTtcclxuXHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLXVpZCcsIGBzLSR7KytiLl91aWRfY291bnRlcn0tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDcgKX1gICk7XHJcblx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS10eXBlJywgJ3NlY3Rpb24nICk7XHJcblx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS1sYWJlbCcsICdTZWN0aW9uJyApO1xyXG5cdFx0XHRzZWN0aW9uLnNldEF0dHJpYnV0ZSggJ2RhdGEtY29sdW1ucycsIFN0cmluZyggY29scyApICk7XHJcblx0XHRcdC8vIERvIG5vdCBwZXJzaXN0IG9yIHNlZWQgcGVyLWNvbHVtbiBzdHlsZXMgYnkgZGVmYXVsdCAob3B0LWluIHZpYSBpbnNwZWN0b3IpLlxyXG5cclxuXHRcdFx0Y29uc3Qgcm93ID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuY3JlYXRlX2VsZW1lbnQoICdkaXYnLCAnd3BiY19iZmJfX3JvdyB3cGJjX19yb3cnICk7XHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbHM7IGkrKyApIHtcclxuXHRcdFx0XHRjb25zdCBjb2wgICAgICAgICAgID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuY3JlYXRlX2VsZW1lbnQoICdkaXYnLCAnd3BiY19iZmJfX2NvbHVtbiB3cGJjX19maWVsZCcgKTtcclxuXHRcdFx0XHRjb2wuc3R5bGUuZmxleEJhc2lzID0gKDEwMCAvIGNvbHMpICsgJyUnO1xyXG5cdFx0XHRcdC8vIE5vIGRlZmF1bHQgQ1NTIHZhcnMgaGVyZTsgcmVhbCBjb2x1bW5zIHJlbWFpbiB1bmFmZmVjdGVkIHVudGlsIHVzZXIgYWN0aXZhdGVzIHN0eWxlcy5cclxuXHRcdFx0XHRiLmluaXRfc29ydGFibGU/LiggY29sICk7XHJcblx0XHRcdFx0cm93LmFwcGVuZENoaWxkKCBjb2wgKTtcclxuXHRcdFx0XHRpZiAoIGkgPCBjb2xzIC0gMSApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHJlc2l6ZXIgPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5jcmVhdGVfZWxlbWVudCggJ2RpdicsICd3cGJjX2JmYl9fY29sdW1uLXJlc2l6ZXInICk7XHJcblx0XHRcdFx0XHRyZXNpemVyLmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWRvd24nLCBiLmluaXRfcmVzaXplX2hhbmRsZXIgKTtcclxuXHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZCggcmVzaXplciApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRzZWN0aW9uLmFwcGVuZENoaWxkKCByb3cgKTtcclxuXHRcdFx0Yi5sYXlvdXQuc2V0X2VxdWFsX2Jhc2VzKCByb3csIGIuY29sX2dhcF9wZXJjZW50ICk7XHJcblx0XHRcdGIuYWRkX292ZXJsYXlfdG9vbGJhciggc2VjdGlvbiApO1xyXG5cdFx0XHRzZWN0aW9uLnNldEF0dHJpYnV0ZSggJ3RhYmluZGV4JywgJzAnICk7XHJcblx0XHRcdHRoaXMuaW5pdF9hbGxfbmVzdGVkX3NvcnRhYmxlcyggc2VjdGlvbiApO1xyXG5cclxuXHRcdFx0Ly8gSW5zZXJ0aW9uIHBvbGljeTogdG9wIHwgYm90dG9tLlxyXG5cdFx0XHRpZiAoIGluc2VydF9wb3MgPT09ICd0b3AnICYmIGNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCApIHtcclxuXHRcdFx0XHRjb250YWluZXIuaW5zZXJ0QmVmb3JlKCBzZWN0aW9uLCBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQoIHNlY3Rpb24gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHNlY3Rpb25fZGF0YVxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXHJcblx0XHQgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFRoZSByZWJ1aWx0IHNlY3Rpb24gZWxlbWVudC5cclxuXHRcdCAqL1xyXG5cdFx0cmVidWlsZF9zZWN0aW9uKHNlY3Rpb25fZGF0YSwgY29udGFpbmVyKSB7XHJcblx0XHRcdGNvbnN0IGIgICAgICAgICA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Y29uc3QgY29sc19kYXRhID0gQXJyYXkuaXNBcnJheSggc2VjdGlvbl9kYXRhPy5jb2x1bW5zICkgPyBzZWN0aW9uX2RhdGEuY29sdW1ucyA6IFtdO1xyXG5cdFx0XHR0aGlzLmFkZF9zZWN0aW9uKCBjb250YWluZXIsIGNvbHNfZGF0YS5sZW5ndGggfHwgMSApO1xyXG5cdFx0XHRjb25zdCBzZWN0aW9uID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQ7XHJcblx0XHRcdGlmICggIXNlY3Rpb24uZGF0YXNldC51aWQgKSB7XHJcblx0XHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLXVpZCcsIGBzLSR7KytiLl91aWRfY291bnRlcn0tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDcgKX1gICk7XHJcblx0XHRcdH1cclxuXHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWlkJywgc2VjdGlvbl9kYXRhPy5pZCB8fCBgc2VjdGlvbi0keysrYi5zZWN0aW9uX2NvdW50ZXJ9LSR7RGF0ZS5ub3coKX1gICk7XHJcblx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS10eXBlJywgJ3NlY3Rpb24nICk7XHJcblx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS1sYWJlbCcsIHNlY3Rpb25fZGF0YT8ubGFiZWwgfHwgJ1NlY3Rpb24nICk7XHJcblx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS1jb2x1bW5zJywgU3RyaW5nKCAoc2VjdGlvbl9kYXRhPy5jb2x1bW5zIHx8IFtdKS5sZW5ndGggfHwgMSApICk7XHJcblx0XHRcdC8vIFBlcnNpc3RlZCBhdHRyaWJ1dGVzXHJcblx0XHRcdGlmICggc2VjdGlvbl9kYXRhPy5odG1sX2lkICkge1xyXG5cdFx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS1odG1sX2lkJywgU3RyaW5nKCBzZWN0aW9uX2RhdGEuaHRtbF9pZCApICk7XHJcblx0XHRcdFx0Ly8gZ2l2ZSB0aGUgY29udGFpbmVyIGEgcmVhbCBpZCBzbyBhbmNob3JzL0NTUyBjYW4gdGFyZ2V0IGl0XHJcblx0XHRcdFx0c2VjdGlvbi5pZCA9IFN0cmluZyggc2VjdGlvbl9kYXRhLmh0bWxfaWQgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTkVXOiByZXN0b3JlIHBlcnNpc3RlZCBwZXItY29sdW1uIHN0eWxlcyAocmF3IEpTT04gc3RyaW5nKS5cclxuXHRcdFx0aWYgKCBzZWN0aW9uX2RhdGE/LmNvbF9zdHlsZXMgIT0gbnVsbCApIHtcclxuXHRcdFx0XHRjb25zdCBqc29uID0gU3RyaW5nKCBzZWN0aW9uX2RhdGEuY29sX3N0eWxlcyApO1xyXG5cdFx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS1jb2xfc3R5bGVzJywganNvbiApO1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRzZWN0aW9uLmRhdGFzZXQuY29sX3N0eWxlcyA9IGpzb247XHJcblx0XHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHQvLyAoTm8gcmVuZGVyX3ByZXZpZXcoKSBjYWxsIGhlcmUgb24gcHVycG9zZTogc2VjdGlvbnPigJkgYnVpbGRlciBET00gdXNlcyAud3BiY19iZmJfX3Jvdy8ud3BiY19iZmJfX2NvbHVtbi4pXHJcblxyXG5cclxuXHRcdFx0aWYgKCBzZWN0aW9uX2RhdGE/LmNzc2NsYXNzICkge1xyXG5cdFx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS1jc3NjbGFzcycsIFN0cmluZyggc2VjdGlvbl9kYXRhLmNzc2NsYXNzICkgKTtcclxuXHRcdFx0XHQvLyBrZWVwIGNvcmUgY2xhc3NlcywgdGhlbiBhZGQgY3VzdG9tIGNsYXNzKGVzKVxyXG5cdFx0XHRcdFN0cmluZyggc2VjdGlvbl9kYXRhLmNzc2NsYXNzICkuc3BsaXQoIC9cXHMrLyApLmZpbHRlciggQm9vbGVhbiApLmZvckVhY2goIGNscyA9PiBzZWN0aW9uLmNsYXNzTGlzdC5hZGQoIGNscyApICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJvdyA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fcm93JyApO1xyXG5cdFx0XHQvLyBEZWxlZ2F0ZSBwYXJzaW5nICsgYWN0aXZhdGlvbiArIGFwcGxpY2F0aW9uIHRvIHRoZSBDb2x1bW4gU3R5bGVzIHNlcnZpY2UuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Y29uc3QganNvbiA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlKCAnZGF0YS1jb2xfc3R5bGVzJyApXHJcblx0XHRcdFx0XHR8fCAoc2VjdGlvbi5kYXRhc2V0ID8gKHNlY3Rpb24uZGF0YXNldC5jb2xfc3R5bGVzIHx8ICcnKSA6ICcnKTtcclxuXHRcdFx0XHRjb25zdCBhcnIgID0gVUkuV1BCQ19CRkJfQ29sdW1uX1N0eWxlcy5wYXJzZV9jb2xfc3R5bGVzKCBqc29uICk7XHJcblx0XHRcdFx0VUkuV1BCQ19CRkJfQ29sdW1uX1N0eWxlcy5hcHBseSggc2VjdGlvbiwgYXJyICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfZSApIHtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29sc19kYXRhLmZvckVhY2goIChjb2xfZGF0YSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCBjb2x1bW5zX29ubHkgID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKTtcclxuXHRcdFx0XHRjb25zdCBjb2wgICAgICAgICAgID0gY29sdW1uc19vbmx5W2luZGV4XTtcclxuXHRcdFx0XHRjb2wuc3R5bGUuZmxleEJhc2lzID0gY29sX2RhdGEud2lkdGggfHwgJzEwMCUnO1xyXG5cdFx0XHRcdChjb2xfZGF0YS5pdGVtcyB8fCBbXSkuZm9yRWFjaCggKGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdGlmICggIWl0ZW0gfHwgIWl0ZW0udHlwZSApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBpdGVtLnR5cGUgPT09ICdmaWVsZCcgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGVsID0gYi5idWlsZF9maWVsZCggaXRlbS5kYXRhICk7XHJcblx0XHRcdFx0XHRcdGlmICggZWwgKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29sLmFwcGVuZENoaWxkKCBlbCApO1xyXG5cdFx0XHRcdFx0XHRcdGIudHJpZ2dlcl9maWVsZF9kcm9wX2NhbGxiYWNrKCBlbCwgJ2xvYWQnICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBpdGVtLnR5cGUgPT09ICdzZWN0aW9uJyApIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWJ1aWxkX3NlY3Rpb24oIGl0ZW0uZGF0YSwgY29sICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdGNvbnN0IGNvbXB1dGVkID0gYi5sYXlvdXQuY29tcHV0ZV9lZmZlY3RpdmVfYmFzZXNfZnJvbV9yb3coIHJvdywgYi5jb2xfZ2FwX3BlcmNlbnQgKTtcclxuXHRcdFx0Yi5sYXlvdXQuYXBwbHlfYmFzZXNfdG9fcm93KCByb3csIGNvbXB1dGVkLmJhc2VzICk7XHJcblx0XHRcdHRoaXMuaW5pdF9hbGxfbmVzdGVkX3NvcnRhYmxlcyggc2VjdGlvbiApO1xyXG5cclxuXHRcdFx0Ly8gTkVXOiByZXRhZyBVSURzIGZpcnN0IChzbyB1bmlxdWVuZXNzIGNoZWNrcyBkb24ndCBleGNsdWRlIG9yaWdpbmFscyksIHRoZW4gZGVkdXBlIGFsbCBrZXlzLlxyXG5cdFx0XHR0aGlzLl9yZXRhZ191aWRzX2luX3N1YnRyZWUoIHNlY3Rpb24gKTtcclxuXHRcdFx0dGhpcy5fZGVkdXBlX3N1YnRyZWVfc3RyaWN0KCBzZWN0aW9uICk7XHJcblx0XHRcdHJldHVybiBzZWN0aW9uO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgKi9cclxuXHRcdGluaXRfYWxsX25lc3RlZF9zb3J0YWJsZXMoY29udGFpbmVyKSB7XHJcblx0XHRcdGNvbnN0IGIgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdGlmICggY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19mb3JtX3ByZXZpZXdfc2VjdGlvbl9jb250YWluZXInICkgKSB7XHJcblx0XHRcdFx0dGhpcy5pbml0X3NlY3Rpb25fc29ydGFibGUoIGNvbnRhaW5lciApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19zZWN0aW9uJyApLmZvckVhY2goIChzZWN0aW9uKSA9PiB7XHJcblx0XHRcdFx0c2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19jb2x1bW4nICkuZm9yRWFjaCggKGNvbCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5pbml0X3NlY3Rpb25fc29ydGFibGUoIGNvbCApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgKi9cclxuXHRcdGluaXRfc2VjdGlvbl9zb3J0YWJsZShjb250YWluZXIpIHtcclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0aWYgKCAhY29udGFpbmVyICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBpc19jb2x1bW4gICAgPSBjb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX2NvbHVtbicgKTtcclxuXHRcdFx0Y29uc3QgaXNfdG9wX2xldmVsID0gY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19mb3JtX3ByZXZpZXdfc2VjdGlvbl9jb250YWluZXInICk7XHJcblx0XHRcdGlmICggIWlzX2NvbHVtbiAmJiAhaXNfdG9wX2xldmVsICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRiLmluaXRfc29ydGFibGU/LiggY29udGFpbmVyICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIG9mIHBhZ2VzL3NlY3Rpb25zL2ZpZWxkcy5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9TdHJ1Y3R1cmVfSU8gPSBjbGFzcyBleHRlbmRzIFVJLldQQkNfQkZCX01vZHVsZSB7XG5cdFx0aW5pdCgpIHtcblx0XHRcdHRoaXMuYnVpbGRlci5nZXRfc3RydWN0dXJlICAgICAgICA9ICgpID0+IHRoaXMuc2VyaWFsaXplKCk7XG5cdFx0XHR0aGlzLmJ1aWxkZXIubG9hZF9zYXZlZF9zdHJ1Y3R1cmUgPSAocywgb3B0cykgPT4gdGhpcy5kZXNlcmlhbGl6ZSggcywgb3B0cyApO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIE5vcm1hbGl6ZSBvcHRpb24gdmFsdWVzIHdoZW4gYSBmaWVsZCBleHBsaWNpdGx5IGRpc2FibGVzIHNlcGFyYXRlIHZhbHVlcy5cblx0XHQgKlxuXHRcdCAqIE9sZGVyIEJ1aWxkZXIgdmVyc2lvbnMgcGVyc2lzdGVkIGFuIHVuY2hlY2tlZCB2YWx1ZV9kaWZmZXJzIHRvZ2dsZSBhcyBhblxuXHRcdCAqIGVtcHR5IHN0cmluZy4gVHJlYXQgdGhhdCBleHBsaWNpdCBsZWdhY3kgdmFsdWUgYXMgZmFsc2UsIHdoaWxlIHJldGFpbmluZ1xuXHRcdCAqIHRoZSBzY2hlbWEgZGVmYXVsdCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBnZW51aW5lbHkgYWJzZW50LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGZpZWxkX2RhdGEgU2VyaWFsaXplZCBmaWVsZCBkYXRhLlxuXHRcdCAqIEByZXR1cm5zIHtPYmplY3R9IE5vcm1hbGl6ZWQgc2VyaWFsaXplZCBmaWVsZCBkYXRhLlxuXHRcdCAqL1xuXHRcdF9ub3JtYWxpemVfZmllbGRfb3B0aW9uX3ZhbHVlcyhmaWVsZF9kYXRhKSB7XG5cdFx0XHRjb25zdCBoYXNfdmFsdWVfZGlmZmVycyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggZmllbGRfZGF0YSwgJ3ZhbHVlX2RpZmZlcnMnICk7XG5cdFx0XHRpZiAoICFoYXNfdmFsdWVfZGlmZmVycyApIHtcblx0XHRcdFx0cmV0dXJuIGZpZWxkX2RhdGE7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHZhbHVlX2RpZmZlcnMgICA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuY29lcmNlX2Jvb2xlYW4oIGZpZWxkX2RhdGEudmFsdWVfZGlmZmVycywgZmFsc2UgKTtcblx0XHRcdGZpZWxkX2RhdGEudmFsdWVfZGlmZmVycyA9IHZhbHVlX2RpZmZlcnM7XG5cblx0XHRcdGlmICggIXZhbHVlX2RpZmZlcnMgJiYgQXJyYXkuaXNBcnJheSggZmllbGRfZGF0YS5vcHRpb25zICkgKSB7XG5cdFx0XHRcdGZpZWxkX2RhdGEub3B0aW9ucyA9IGZpZWxkX2RhdGEub3B0aW9ucy5tYXAoICggb3B0aW9uX3JlY29yZCApID0+IHtcblx0XHRcdFx0XHRpZiAoICFvcHRpb25fcmVjb3JkIHx8IHR5cGVvZiBvcHRpb25fcmVjb3JkICE9PSAnb2JqZWN0JyApIHtcblx0XHRcdFx0XHRcdHJldHVybiBvcHRpb25fcmVjb3JkO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHRvcHRpb25fcmVjb3JkLFxuXHRcdFx0XHRcdFx0eyB2YWx1ZTogU3RyaW5nKCBvcHRpb25fcmVjb3JkLmxhYmVsID09IG51bGwgPyAnJyA6IG9wdGlvbl9yZWNvcmQubGFiZWwgKSB9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmllbGRfZGF0YTtcblx0XHR9XG5cblx0XHQvKiogQHJldHVybnMge0FycmF5fSAqL1xuXHRcdHNlcmlhbGl6ZSgpIHtcblx0XHRcdGNvbnN0IGIgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdHRoaXMuX25vcm1hbGl6ZV9pZHMoKTtcclxuXHRcdFx0dGhpcy5fbm9ybWFsaXplX25hbWVzKCk7XHJcblx0XHRcdGNvbnN0IHBhZ2VzID0gW107XHJcblx0XHRcdGIucGFnZXNfY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3JyApLmZvckVhY2goIChwYWdlX2VsLCBwYWdlX2luZGV4KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY29udGFpbmVyID0gcGFnZV9lbC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19mb3JtX3ByZXZpZXdfc2VjdGlvbl9jb250YWluZXInICk7XHJcblx0XHRcdFx0Y29uc3QgY29udGVudCAgID0gW107XHJcblx0XHRcdFx0aWYgKCAhY29udGFpbmVyICkge1xyXG5cdFx0XHRcdFx0cGFnZXMucHVzaCggeyBwYWdlOiBwYWdlX2luZGV4ICsgMSwgY29udGVudCB9ICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCAnOnNjb3BlID4gKicgKS5mb3JFYWNoKCAoY2hpbGQpID0+IHtcclxuXHRcdFx0XHRcdGlmICggY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnRlbnQucHVzaCggeyB0eXBlOiAnc2VjdGlvbicsIGRhdGE6IHRoaXMuc2VyaWFsaXplX3NlY3Rpb24oIGNoaWxkICkgfSApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGNoaWxkLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19maWVsZCcgKSApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoICdpcy1pbnZhbGlkJyApICkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRjb25zdCBmX2RhdGEgPSB0aGlzLl9ub3JtYWxpemVfZmllbGRfb3B0aW9uX3ZhbHVlcyhcblx0XHRcdFx0XHRcdFx0Q29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuZ2V0X2FsbF9kYXRhX2F0dHJpYnV0ZXMoIGNoaWxkIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHQvLyBEcm9wIGVwaGVtZXJhbC9lZGl0b3Itb25seSBmbGFnc1xyXG5cdFx0XHRcdFx0XHRbICd1aWQnLCAnZnJlc2gnLCAnYXV0b25hbWUnLCAnd2FzX2xvYWRlZCcsICduYW1lX3VzZXJfdG91Y2hlZCcgXVxyXG5cdFx0XHRcdFx0XHRcdC5mb3JFYWNoKCBrID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICggayBpbiBmX2RhdGEgKSBkZWxldGUgZl9kYXRhW2tdO1xyXG5cdFx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRcdFx0Y29udGVudC5wdXNoKCB7IHR5cGU6ICdmaWVsZCcsIGRhdGE6IGZfZGF0YSB9ICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdHBhZ2VzLnB1c2goIHsgcGFnZTogcGFnZV9pbmRleCArIDEsIGNvbnRlbnQgfSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdHJldHVybiBwYWdlcztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNlY3Rpb25fZWxcclxuXHRcdCAqIEByZXR1cm5zIHt7aWQ6c3RyaW5nLGxhYmVsOnN0cmluZyxodG1sX2lkOnN0cmluZyxjc3NjbGFzczpzdHJpbmcsY29sX3N0eWxlczpzdHJpbmcsY29sdW1uczpBcnJheX19XHJcblx0XHQgKi9cclxuXHRcdHNlcmlhbGl6ZV9zZWN0aW9uKHNlY3Rpb25fZWwpIHtcclxuXHRcdFx0Y29uc3Qgcm93ID0gc2VjdGlvbl9lbC5xdWVyeVNlbGVjdG9yKCAnOnNjb3BlID4gLndwYmNfYmZiX19yb3cnICk7XHJcblxyXG5cdFx0XHQvLyBORVc6IHJlYWQgcGVyLWNvbHVtbiBzdHlsZXMgZnJvbSBkYXRhc2V0L2F0dHJpYnV0ZXMgKHVuZGVyc2NvcmUgJiBoeXBoZW4pXHJcblx0XHRcdHZhciBjb2xfc3R5bGVzX3JhdyA9XHJcblx0XHRcdFx0XHRzZWN0aW9uX2VsLmdldEF0dHJpYnV0ZSggJ2RhdGEtY29sX3N0eWxlcycgKSB8fFxyXG5cdFx0XHRcdFx0KHNlY3Rpb25fZWwuZGF0YXNldCA/IChzZWN0aW9uX2VsLmRhdGFzZXQuY29sX3N0eWxlcykgOiAnJykgfHxcclxuXHRcdFx0XHRcdCcnO1xyXG5cclxuXHRcdFx0Y29uc3QgYmFzZSA9IHtcclxuXHRcdFx0XHRpZCAgICAgICAgOiBzZWN0aW9uX2VsLmRhdGFzZXQuaWQsXHJcblx0XHRcdFx0bGFiZWwgICAgIDogc2VjdGlvbl9lbC5kYXRhc2V0LmxhYmVsIHx8ICcnLFxyXG5cdFx0XHRcdGh0bWxfaWQgICA6IHNlY3Rpb25fZWwuZGF0YXNldC5odG1sX2lkIHx8ICcnLFxyXG5cdFx0XHRcdGNzc2NsYXNzICA6IHNlY3Rpb25fZWwuZGF0YXNldC5jc3NjbGFzcyB8fCAnJyxcclxuXHRcdFx0XHRjb2xfc3R5bGVzOiBTdHJpbmcoIGNvbF9zdHlsZXNfcmF3ICkgICAgICAgIC8vIDwtLSBORVc6IGtlZXAgYXMgcmF3IEpTT04gc3RyaW5nXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoICFyb3cgKSB7XHJcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oIHt9LCBiYXNlLCB7IGNvbHVtbnM6IFtdIH0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29sdW1ucyA9IFtdO1xyXG5cdFx0XHRyb3cucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApLmZvckVhY2goIGZ1bmN0aW9uIChjb2wpIHtcclxuXHRcdFx0XHRjb25zdCB3aWR0aCA9IGNvbC5zdHlsZS5mbGV4QmFzaXMgfHwgJzEwMCUnO1xyXG5cdFx0XHRcdGNvbnN0IGl0ZW1zID0gW107XHJcblx0XHRcdFx0QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggY29sLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcclxuXHRcdFx0XHRcdGlmICggY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgKSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1zLnB1c2goIHsgdHlwZTogJ3NlY3Rpb24nLCBkYXRhOiB0aGlzLnNlcmlhbGl6ZV9zZWN0aW9uKCBjaGlsZCApIH0gKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fZmllbGQnICkgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaXMtaW52YWxpZCcgKSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0Y29uc3QgZl9kYXRhID0gdGhpcy5fbm9ybWFsaXplX2ZpZWxkX29wdGlvbl92YWx1ZXMoXG5cdFx0XHRcdFx0XHRcdENvcmUuV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyLmdldF9hbGxfZGF0YV9hdHRyaWJ1dGVzKCBjaGlsZCApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0WyAndWlkJywgJ2ZyZXNoJywgJ2F1dG9uYW1lJywgJ3dhc19sb2FkZWQnLCAnbmFtZV91c2VyX3RvdWNoZWQnIF0uZm9yRWFjaCggZnVuY3Rpb24gKGspIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGsgaW4gZl9kYXRhICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIGZfZGF0YVtrXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRcdFx0aXRlbXMucHVzaCggeyB0eXBlOiAnZmllbGQnLCBkYXRhOiBmX2RhdGEgfSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0uYmluZCggdGhpcyApICk7XHJcblx0XHRcdFx0Y29sdW1ucy5wdXNoKCB7IHdpZHRoOiB3aWR0aCwgaXRlbXM6IGl0ZW1zIH0gKTtcclxuXHRcdFx0fS5iaW5kKCB0aGlzICkgKTtcclxuXHJcblx0XHRcdC8vIENsYW1wIHBlcnNpc3RlZCBjb2xfc3R5bGVzIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNvbHVtbnMgb24gU2F2ZS5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCBjb2xDb3VudCA9IGNvbHVtbnMubGVuZ3RoO1xyXG5cdFx0XHRcdGNvbnN0IHJhdyAgICAgID0gU3RyaW5nKCBjb2xfc3R5bGVzX3JhdyB8fCAnJyApLnRyaW0oKTtcclxuXHJcblx0XHRcdFx0aWYgKCByYXcgKSB7XHJcblx0XHRcdFx0XHRsZXQgYXJyID0gW107XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKCByYXcgKTtcclxuXHRcdFx0XHRcdFx0YXJyICAgICAgICAgID0gQXJyYXkuaXNBcnJheSggcGFyc2VkICkgPyBwYXJzZWQgOiAocGFyc2VkICYmIEFycmF5LmlzQXJyYXkoIHBhcnNlZC5jb2x1bW5zICkgPyBwYXJzZWQuY29sdW1ucyA6IFtdKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHtcclxuXHRcdFx0XHRcdFx0YXJyID0gW107XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjb2xDb3VudCA8PSAwICkge1xyXG5cdFx0XHRcdFx0XHRiYXNlLmNvbF9zdHlsZXMgPSAnW10nO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0aWYgKCBhcnIubGVuZ3RoID4gY29sQ291bnQgKSBhcnIubGVuZ3RoID0gY29sQ291bnQ7XHJcblx0XHRcdFx0XHRcdHdoaWxlICggYXJyLmxlbmd0aCA8IGNvbENvdW50ICkgYXJyLnB1c2goIHt9ICk7XHJcblx0XHRcdFx0XHRcdGJhc2UuY29sX3N0eWxlcyA9IEpTT04uc3RyaW5naWZ5KCBhcnIgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0YmFzZS5jb2xfc3R5bGVzID0gJyc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggX2UgKSB7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKCB7fSwgYmFzZSwgeyBjb2x1bW5zOiBjb2x1bW5zIH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IHN0cnVjdHVyZVxyXG5cdFx0ICogQHBhcmFtIHt7ZGVmZXJJZlR5cGluZz86IGJvb2xlYW59fSBbb3B0cyA9IHt9XVxyXG5cdFx0ICovXHJcblx0XHRkZXNlcmlhbGl6ZShzdHJ1Y3R1cmUsIHsgZGVmZXJJZlR5cGluZyA9IHRydWUgfSA9IHt9KSB7XHJcblx0XHRcdGNvbnN0IGIgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdGlmICggZGVmZXJJZlR5cGluZyAmJiB0aGlzLl9pc190eXBpbmdfaW5faW5zcGVjdG9yKCkgKSB7XHJcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aGlzLl9kZWZlcl90aW1lciApO1xyXG5cdFx0XHRcdHRoaXMuX2RlZmVyX3RpbWVyID0gc2V0VGltZW91dCggKCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5kZXNlcmlhbGl6ZSggc3RydWN0dXJlLCB7IGRlZmVySWZUeXBpbmc6IGZhbHNlIH0gKTtcclxuXHRcdFx0XHR9LCAxNTAgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0Yi5wYWdlc19jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRcdGIucGFnZV9jb3VudGVyICAgICAgICAgICAgICA9IDA7XHJcblx0XHRcdChzdHJ1Y3R1cmUgfHwgW10pLmZvckVhY2goIChwYWdlX2RhdGEpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYWdlX2VsICAgICAgICAgICAgICAgPSBiLnBhZ2VzX3NlY3Rpb25zLmFkZF9wYWdlKCB7IHNjcm9sbDogZmFsc2UgfSApO1xyXG5cdFx0XHRcdGNvbnN0IHNlY3Rpb25fY29udGFpbmVyICAgICA9IHBhZ2VfZWwucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fZm9ybV9wcmV2aWV3X3NlY3Rpb25fY29udGFpbmVyJyApO1xyXG5cdFx0XHRcdHNlY3Rpb25fY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG5cdFx0XHRcdGIuaW5pdF9zZWN0aW9uX3NvcnRhYmxlPy4oIHNlY3Rpb25fY29udGFpbmVyICk7XHJcblx0XHRcdFx0KHBhZ2VfZGF0YS5jb250ZW50IHx8IFtdKS5mb3JFYWNoKCAoaXRlbSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCBpdGVtLnR5cGUgPT09ICdzZWN0aW9uJyApIHtcclxuXHRcdFx0XHRcdFx0Ly8gTm93IHJldHVybnMgdGhlIGVsZW1lbnQ7IGF0dHJpYnV0ZXMgKGluY2wuIGNvbF9zdHlsZXMpIGFyZSBhcHBsaWVkIGluc2lkZSByZWJ1aWxkLlxyXG5cdFx0XHRcdFx0XHRiLnBhZ2VzX3NlY3Rpb25zLnJlYnVpbGRfc2VjdGlvbiggaXRlbS5kYXRhLCBzZWN0aW9uX2NvbnRhaW5lciApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGl0ZW0udHlwZSA9PT0gJ2ZpZWxkJyApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZWwgPSBiLmJ1aWxkX2ZpZWxkKCBpdGVtLmRhdGEgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBlbCApIHtcclxuXHRcdFx0XHRcdFx0XHRzZWN0aW9uX2NvbnRhaW5lci5hcHBlbmRDaGlsZCggZWwgKTtcclxuXHRcdFx0XHRcdFx0XHRiLnRyaWdnZXJfZmllbGRfZHJvcF9jYWxsYmFjayggZWwsICdsb2FkJyApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdGIudXNhZ2U/LnVwZGF0ZV9wYWxldHRlX3VpPy4oKTtcclxuXHRcdFx0Yi5idXMuZW1pdCggQ29yZS5XUEJDX0JGQl9FdmVudHMuU1RSVUNUVVJFX0xPQURFRCwgeyBzdHJ1Y3R1cmUgfSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9ub3JtYWxpemVfaWRzKCkge1xyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRiLnBhZ2VzX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX2ZpZWxkOm5vdCguaXMtaW52YWxpZCknICkuZm9yRWFjaCggKGVsKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IENvcmUuV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyLmdldF9hbGxfZGF0YV9hdHRyaWJ1dGVzKCBlbCApO1xyXG5cdFx0XHRcdGNvbnN0IHdhbnQgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfaWQoIGRhdGEuaWQgfHwgJycgKSB8fCAnZmllbGQnO1xyXG5cdFx0XHRcdGNvbnN0IHVuaXEgPSBiLmlkLmVuc3VyZV91bmlxdWVfZmllbGRfaWQoIHdhbnQsIGVsICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmlkICE9PSB1bmlxICkge1xyXG5cdFx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1pZCcsIHVuaXEgKTtcclxuXHRcdFx0XHRcdGlmICggYi5wcmV2aWV3X21vZGUgKSB7XHJcblx0XHRcdFx0XHRcdGIucmVuZGVyX3ByZXZpZXcoIGVsICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0X25vcm1hbGl6ZV9uYW1lcygpIHtcclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Yi5wYWdlc19jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19maWVsZDpub3QoLmlzLWludmFsaWQpJyApLmZvckVhY2goIChlbCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5nZXRfYWxsX2RhdGFfYXR0cmlidXRlcyggZWwgKTtcclxuXHRcdFx0XHRjb25zdCBiYXNlID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5zYW5pdGl6ZV9odG1sX25hbWUoIChkYXRhLm5hbWUgIT0gbnVsbCkgPyBkYXRhLm5hbWUgOiBkYXRhLmlkICkgfHwgJ2ZpZWxkJztcclxuXHRcdFx0XHRjb25zdCB1bmlxID0gYi5pZC5lbnN1cmVfdW5pcXVlX2ZpZWxkX25hbWUoIGJhc2UsIGVsICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuaXEgKSB7XHJcblx0XHRcdFx0XHRlbC5zZXRBdHRyaWJ1dGUoICdkYXRhLW5hbWUnLCB1bmlxICk7XHJcblx0XHRcdFx0XHRpZiAoIGIucHJldmlld19tb2RlICkge1xyXG5cdFx0XHRcdFx0XHRiLnJlbmRlcl9wcmV2aWV3KCBlbCApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cclxuXHRcdF9pc190eXBpbmdfaW5faW5zcGVjdG9yKCkge1xyXG5cdFx0XHRjb25zdCBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICk7XHJcblx0XHRcdHJldHVybiAhIShpbnMgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBpbnMuY29udGFpbnMoIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgKSk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogTWluaW1hbCwgc3RhbmRhbG9uZSBndWFyZCB0aGF0IGVuZm9yY2VzIHBlci1jb2x1bW4gbWluIHdpZHRocyBiYXNlZCBvbiBmaWVsZHMnIGRhdGEtbWluX3dpZHRoLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1VJLldQQkNfQkZCX01pbl9XaWR0aF9HdWFyZH1cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9NaW5fV2lkdGhfR3VhcmQgPSBjbGFzcyBleHRlbmRzIFVJLldQQkNfQkZCX01vZHVsZSB7XHJcblxyXG5cdFx0Y29uc3RydWN0b3IoYnVpbGRlcikge1xyXG5cdFx0XHRzdXBlciggYnVpbGRlciApO1xyXG5cdFx0XHR0aGlzLl9vbl9maWVsZF9hZGQgICAgICAgID0gdGhpcy5fb25fZmllbGRfYWRkLmJpbmQoIHRoaXMgKTtcclxuXHRcdFx0dGhpcy5fb25fZmllbGRfcmVtb3ZlICAgICA9IHRoaXMuX29uX2ZpZWxkX3JlbW92ZS5iaW5kKCB0aGlzICk7XHJcblx0XHRcdHRoaXMuX29uX3N0cnVjdHVyZV9sb2FkZWQgPSB0aGlzLl9vbl9zdHJ1Y3R1cmVfbG9hZGVkLmJpbmQoIHRoaXMgKTtcclxuXHRcdFx0dGhpcy5fb25fc3RydWN0dXJlX2NoYW5nZSA9IHRoaXMuX29uX3N0cnVjdHVyZV9jaGFuZ2UuYmluZCggdGhpcyApO1xyXG5cdFx0XHR0aGlzLl9vbl93aW5kb3dfcmVzaXplICAgID0gdGhpcy5fb25fd2luZG93X3Jlc2l6ZS5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0XHR0aGlzLl9wZW5kaW5nX3Jvd3MgPSBuZXcgU2V0KCk7XHJcblx0XHRcdHRoaXMuX3BlbmRpbmdfYWxsICA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl9yYWZfaWQgICAgICAgPSAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdGluaXQoKSB7XHJcblx0XHRcdGNvbnN0IEVWID0gQ29yZS5XUEJDX0JGQl9FdmVudHM7XHJcblx0XHRcdHRoaXMuYnVpbGRlcj8uYnVzPy5vbj8uKCBFVi5GSUVMRF9BREQsIHRoaXMuX29uX2ZpZWxkX2FkZCApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXI/LmJ1cz8ub24/LiggRVYuRklFTERfUkVNT1ZFLCB0aGlzLl9vbl9maWVsZF9yZW1vdmUgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyPy5idXM/Lm9uPy4oIEVWLlNUUlVDVFVSRV9MT0FERUQsIHRoaXMuX29uX3N0cnVjdHVyZV9sb2FkZWQgKTtcclxuXHRcdFx0Ly8gUmVmcmVzaCBzZWxlY3RpdmVseSBvbiBzdHJ1Y3R1cmUgY2hhbmdlIChOT1Qgb24gZXZlcnkgcHJvcCBpbnB1dCkuXHJcblx0XHRcdHRoaXMuYnVpbGRlcj8uYnVzPy5vbj8uKCBFVi5TVFJVQ1RVUkVfQ0hBTkdFLCB0aGlzLl9vbl9zdHJ1Y3R1cmVfY2hhbmdlICk7XHJcblxyXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMuX29uX3dpbmRvd19yZXNpemUsIHsgcGFzc2l2ZTogdHJ1ZSB9ICk7XHJcblx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfYWxsKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0ZGVzdHJveSgpIHtcclxuXHRcdFx0Y29uc3QgRVYgPSBDb3JlLldQQkNfQkZCX0V2ZW50cztcclxuXHRcdFx0dGhpcy5idWlsZGVyPy5idXM/Lm9mZj8uKCBFVi5GSUVMRF9BREQsIHRoaXMuX29uX2ZpZWxkX2FkZCApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXI/LmJ1cz8ub2ZmPy4oIEVWLkZJRUxEX1JFTU9WRSwgdGhpcy5fb25fZmllbGRfcmVtb3ZlICk7XHJcblx0XHRcdHRoaXMuYnVpbGRlcj8uYnVzPy5vZmY/LiggRVYuU1RSVUNUVVJFX0xPQURFRCwgdGhpcy5fb25fc3RydWN0dXJlX2xvYWRlZCApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXI/LmJ1cz8ub2ZmPy4oIEVWLlNUUlVDVFVSRV9DSEFOR0UsIHRoaXMuX29uX3N0cnVjdHVyZV9jaGFuZ2UgKTtcclxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB0aGlzLl9vbl93aW5kb3dfcmVzaXplICk7XHJcblx0XHR9XHJcblxyXG5cdFx0X29uX2ZpZWxkX2FkZChlKSB7XHJcblx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfYWxsKCk7XHJcblx0XHRcdC8vIGlmIHlvdSByZWFsbHkgd2FudCB0byBiZSBtaW5pbWFsIHdvcmsgaGVyZSwga2VlcCB5b3VyIHJvdy1vbmx5IHZlcnNpb24uXHJcblx0XHR9XHJcblxyXG5cdFx0X29uX2ZpZWxkX3JlbW92ZShlKSB7XHJcblx0XHRcdGNvbnN0IHNyY19lbCA9IGU/LmRldGFpbD8uZWwgfHwgbnVsbDtcclxuXHRcdFx0Y29uc3Qgcm93ICAgID0gKHNyY19lbCAmJiBzcmNfZWwuY2xvc2VzdCkgPyBzcmNfZWwuY2xvc2VzdCggJy53cGJjX2JmYl9fcm93JyApIDogbnVsbDtcclxuXHRcdFx0aWYgKCByb3cgKSB7XHJcblx0XHRcdFx0dGhpcy5fc2NoZWR1bGVfcmVmcmVzaF9yb3coIHJvdyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfYWxsKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRfb25fc3RydWN0dXJlX2xvYWRlZCgpIHtcclxuXHRcdFx0dGhpcy5fc2NoZWR1bGVfcmVmcmVzaF9hbGwoKTtcclxuXHRcdH1cclxuXHJcblx0XHRfb25fc3RydWN0dXJlX2NoYW5nZShlKSB7XHJcblx0XHRcdGNvbnN0IHJlYXNvbiA9IGU/LmRldGFpbD8ucmVhc29uIHx8ICcnO1xyXG5cdFx0XHRjb25zdCBrZXkgICAgPSBlPy5kZXRhaWw/LmtleSB8fCAnJztcclxuXHJcblx0XHRcdC8vIElnbm9yZSBub2lzeSBwcm9wIGNoYW5nZXMgdGhhdCBkb24ndCBhZmZlY3QgbWluIHdpZHRocy5cclxuXHRcdFx0aWYgKCByZWFzb24gPT09ICdwcm9wLWNoYW5nZScgJiYga2V5ICE9PSAnbWluX3dpZHRoJyApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGVsICA9IGU/LmRldGFpbD8uZWwgfHwgbnVsbDtcclxuXHRcdFx0Y29uc3Qgcm93ID0gZWw/LmNsb3Nlc3Q/LiggJy53cGJjX2JmYl9fcm93JyApIHx8IG51bGw7XHJcblx0XHRcdGlmICggcm93ICkge1xyXG5cdFx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfcm93KCByb3cgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLl9zY2hlZHVsZV9yZWZyZXNoX2FsbCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0X29uX3dpbmRvd19yZXNpemUoKSB7XHJcblx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfYWxsKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0X3NjaGVkdWxlX3JlZnJlc2hfcm93KHJvd19lbCkge1xyXG5cdFx0XHRpZiAoICFyb3dfZWwgKSByZXR1cm47XHJcblx0XHRcdHRoaXMuX3BlbmRpbmdfcm93cy5hZGQoIHJvd19lbCApO1xyXG5cdFx0XHR0aGlzLl9raWNrX3JhZigpO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9zY2hlZHVsZV9yZWZyZXNoX2FsbCgpIHtcclxuXHRcdFx0dGhpcy5fcGVuZGluZ19hbGwgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLl9wZW5kaW5nX3Jvd3MuY2xlYXIoKTtcclxuXHRcdFx0dGhpcy5fa2lja19yYWYoKTtcclxuXHRcdH1cclxuXHJcblx0XHRfa2lja19yYWYoKSB7XHJcblx0XHRcdGlmICggdGhpcy5fcmFmX2lkICkgcmV0dXJuO1xyXG5cdFx0XHR0aGlzLl9yYWZfaWQgPSAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZXRUaW1lb3V0KSggKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuX3JhZl9pZCA9IDA7XHJcblx0XHRcdFx0aWYgKCB0aGlzLl9wZW5kaW5nX2FsbCApIHtcclxuXHRcdFx0XHRcdHRoaXMuX3BlbmRpbmdfYWxsID0gZmFsc2U7XHJcblx0XHRcdFx0XHR0aGlzLnJlZnJlc2hfYWxsKCk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKCB0aGlzLl9wZW5kaW5nX3Jvd3MgKTtcclxuXHRcdFx0XHR0aGlzLl9wZW5kaW5nX3Jvd3MuY2xlYXIoKTtcclxuXHRcdFx0XHRyb3dzLmZvckVhY2goIChyKSA9PiB0aGlzLnJlZnJlc2hfcm93KCByICkgKTtcclxuXHRcdFx0fSwgMCApO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRyZWZyZXNoX2FsbCgpIHtcclxuXHRcdFx0dGhpcy5idWlsZGVyPy5wYWdlc19jb250YWluZXJcclxuXHRcdFx0XHQ/LnF1ZXJ5U2VsZWN0b3JBbGw/LiggJy53cGJjX2JmYl9fcm93JyApXHJcblx0XHRcdFx0Py5mb3JFYWNoPy4oIChyb3cpID0+IHRoaXMucmVmcmVzaF9yb3coIHJvdyApICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVmcmVzaF9yb3cocm93X2VsKSB7XHJcblx0XHRcdGlmICggIXJvd19lbCApIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGNvbHMgPSByb3dfZWwucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApO1xyXG5cclxuXHRcdFx0Ly8gMSkgUmVjYWxjdWxhdGUgZWFjaCBjb2x1bW7igJlzIHJlcXVpcmVkIG1pbiBweCBhbmQgd3JpdGUgaXQgdG8gdGhlIENTUyB2YXIuXHJcblx0XHRcdGNvbHMuZm9yRWFjaCggKGNvbCkgPT4gdGhpcy5hcHBseV9jb2xfbWluKCBjb2wgKSApO1xyXG5cclxuXHRcdFx0Ly8gMikgRW5mb3JjZSBpdCBhdCB0aGUgQ1NTIGxldmVsIHJpZ2h0IGF3YXkgc28gbGF5b3V0IGNhbuKAmXQgcmVuZGVyIG5hcnJvd2VyLlxyXG5cdFx0XHRjb2xzLmZvckVhY2goIChjb2wpID0+IHtcclxuXHRcdFx0XHRjb25zdCBweCAgICAgICAgICAgPSBwYXJzZUZsb2F0KCBnZXRDb21wdXRlZFN0eWxlKCBjb2wgKS5nZXRQcm9wZXJ0eVZhbHVlKCAnLS13cGJjLWNvbC1taW4nICkgfHwgJzAnICkgfHwgMDtcclxuXHRcdFx0XHRjb2wuc3R5bGUubWluV2lkdGggPSBweCA+IDAgPyBNYXRoLnJvdW5kKCBweCApICsgJ3B4JyA6ICcnO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyAzKSBOb3JtYWxpemUgY3VycmVudCBiYXNlcyBzbyB0aGUgcm93IHJlc3BlY3RzIGFsbCBtaW5zIHdpdGhvdXQgb3ZlcmZsb3cuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Y29uc3QgYiAgID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRcdGNvbnN0IGdwICA9IGIuY29sX2dhcF9wZXJjZW50O1xyXG5cdFx0XHRcdGNvbnN0IGVmZiA9IGIubGF5b3V0LmNvbXB1dGVfZWZmZWN0aXZlX2Jhc2VzX2Zyb21fcm93KCByb3dfZWwsIGdwICk7ICAvLyB7IGJhc2VzLCBhdmFpbGFibGUgfVxyXG5cdFx0XHRcdC8vIFJlLWZpdCAqY3VycmVudCogYmFzZXMgYWdhaW5zdCBtaW5zIChzYW1lIGFsZ29yaXRobSBsYXlvdXQgY2hpcHMgdXNlKS5cclxuXHRcdFx0XHRjb25zdCBmaXR0ZWQgPSBVSS5XUEJDX0JGQl9MYXlvdXRfQ2hpcHMuX2ZpdF93ZWlnaHRzX3Jlc3BlY3RpbmdfbWluKCBiLCByb3dfZWwsIGVmZi5iYXNlcyApO1xyXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggZml0dGVkICkgKSB7XHJcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VkID0gZml0dGVkLnNvbWUoICh2LCBpKSA9PiBNYXRoLmFicyggdiAtIGVmZi5iYXNlc1tpXSApID4gMC4wMSApO1xyXG5cdFx0XHRcdFx0aWYgKCBjaGFuZ2VkICkge1xyXG5cdFx0XHRcdFx0XHRiLmxheW91dC5hcHBseV9iYXNlc190b19yb3coIHJvd19lbCwgZml0dGVkICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHR3Ll93cGJjPy5kZXY/LmVycm9yPy4oICdXUEJDX0JGQl9NaW5fV2lkdGhfR3VhcmQgLSByZWZyZXNoX3JvdycsIGUgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGFwcGx5X2NvbF9taW4oY29sX2VsKSB7XHJcblx0XHRcdGlmICggIWNvbF9lbCApIHJldHVybjtcclxuXHRcdFx0bGV0IG1heF9weCAgICA9IDA7XHJcblx0XHRcdGNvbnN0IGNvbFJlY3QgPSBjb2xfZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHRcdGNvbF9lbC5xdWVyeVNlbGVjdG9yQWxsKCAnOnNjb3BlID4gLndwYmNfYmZiX19maWVsZCcgKS5mb3JFYWNoKCAoZmllbGQpID0+IHtcclxuXHRcdFx0XHRjb25zdCByYXcgPSBmaWVsZC5nZXRBdHRyaWJ1dGUoICdkYXRhLW1pbl93aWR0aCcgKTtcclxuXHRcdFx0XHRsZXQgcHggICAgPSAwO1xyXG5cdFx0XHRcdGlmICggcmF3ICkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcyA9IFN0cmluZyggcmF3ICkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRpZiAoIHMuZW5kc1dpdGgoICclJyApICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBuID0gcGFyc2VGbG9hdCggcyApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIE51bWJlci5pc0Zpbml0ZSggbiApICYmIGNvbFJlY3Qud2lkdGggPiAwICkge1xyXG5cdFx0XHRcdFx0XHRcdHB4ID0gKG4gLyAxMDApICogY29sUmVjdC53aWR0aDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRweCA9IDA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHB4ID0gdGhpcy5wYXJzZV9sZW5fcHgoIHMgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgY3MgPSBnZXRDb21wdXRlZFN0eWxlKCBmaWVsZCApO1xyXG5cdFx0XHRcdFx0cHggICAgICAgPSBwYXJzZUZsb2F0KCBjcy5taW5XaWR0aCB8fCAnMCcgKSB8fCAwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIHB4ID4gbWF4X3B4ICkgbWF4X3B4ID0gcHg7XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0Y29sX2VsLnN0eWxlLnNldFByb3BlcnR5KCAnLS13cGJjLWNvbC1taW4nLCBtYXhfcHggPiAwID8gTWF0aC5yb3VuZCggbWF4X3B4ICkgKyAncHgnIDogJzBweCcgKTtcclxuXHRcdH1cclxuXHJcblx0XHRwYXJzZV9sZW5fcHgodmFsdWUpIHtcclxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsICkgcmV0dXJuIDA7XHJcblx0XHRcdGNvbnN0IHMgPSBTdHJpbmcoIHZhbHVlICkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdGlmICggcyA9PT0gJycgKSByZXR1cm4gMDtcclxuXHRcdFx0aWYgKCBzLmVuZHNXaXRoKCAncHgnICkgKSB7XHJcblx0XHRcdFx0Y29uc3QgbiA9IHBhcnNlRmxvYXQoIHMgKTtcclxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyLmlzRmluaXRlKCBuICkgPyBuIDogMDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIHMuZW5kc1dpdGgoICdyZW0nICkgfHwgcy5lbmRzV2l0aCggJ2VtJyApICkge1xyXG5cdFx0XHRcdGNvbnN0IG4gICAgPSBwYXJzZUZsb2F0KCBzICk7XHJcblx0XHRcdFx0Y29uc3QgYmFzZSA9IHBhcnNlRmxvYXQoIGdldENvbXB1dGVkU3R5bGUoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApLmZvbnRTaXplICkgfHwgMTY7XHJcblx0XHRcdFx0cmV0dXJuIE51bWJlci5pc0Zpbml0ZSggbiApID8gbiAqIGJhc2UgOiAwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IG4gPSBwYXJzZUZsb2F0KCBzICk7XHJcblx0XHRcdHJldHVybiBOdW1iZXIuaXNGaW5pdGUoIG4gKSA/IG4gOiAwO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdQQkNfQkZCX1RvZ2dsZV9Ob3JtYWxpemVyXHJcblx0ICpcclxuXHQgKiBDb252ZXJ0cyBwbGFpbiBjaGVja2JveGVzIGludG8gdG9nZ2xlIFVJOlxyXG5cdCAqIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3JfX2NvbnRyb2wgd3BiY191aV9fdG9nZ2xlXCI+XHJcblx0ICogICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ7dW5pcXVlfVwiIGRhdGEtaW5zcGVjdG9yLWtleT1cIi4uLlwiIGNsYXNzPVwiaW5zcGVjdG9yX19pbnB1dFwiIHJvbGU9XCJzd2l0Y2hcIlxyXG5cdCAqIGFyaWEtY2hlY2tlZD1cInRydWV8ZmFsc2VcIj5cclxuXHQgKiAgIDxsYWJlbCBjbGFzcz1cIndwYmNfdWlfX3RvZ2dsZV9pY29uXCIgIGZvcj1cInt1bmlxdWV9XCI+PC9sYWJlbD5cclxuXHQgKiAgIDxsYWJlbCBjbGFzcz1cIndwYmNfdWlfX3RvZ2dsZV9sYWJlbFwiIGZvcj1cInt1bmlxdWV9XCI+TGFiZWw8L2xhYmVsPlxyXG5cdCAqIDwvZGl2PlxyXG5cdCAqXHJcblx0ICogLSBTa2lwcyBpbnB1dHMgYWxyZWFkeSBpbnNpZGUgYC53cGJjX3VpX190b2dnbGVgLlxyXG5cdCAqIC0gUmV1c2VzIGFuIGV4aXN0aW5nIDxsYWJlbCBmb3I9XCIuLi5cIj4gdGV4dCBpZiBwcmVzZW50OyBvdGhlcndpc2UgZmFsbHMgYmFjayB0byBuZWFyYnkgbGFiZWxzIG9yIGF0dHJpYnV0ZXMuXHJcblx0ICogLSBBdXRvLWdlbmVyYXRlcyBhIHVuaXF1ZSBpZCB3aGVuIGFic2VudC5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9Ub2dnbGVfTm9ybWFsaXplciA9IGNsYXNzIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVwZ3JhZGUgYWxsIHJhdyBjaGVja2JveGVzIGluIGEgY29udGFpbmVyIHRvIHRvZ2dsZXMuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb290X2VsXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyB1cGdyYWRlX2NoZWNrYm94ZXNfaW4ocm9vdF9lbCkge1xyXG5cclxuXHRcdFx0aWYgKCAhcm9vdF9lbCB8fCAhcm9vdF9lbC5xdWVyeVNlbGVjdG9yQWxsICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGlucHV0cyA9IHJvb3RfZWwucXVlcnlTZWxlY3RvckFsbCggJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScgKTtcclxuXHRcdFx0aWYgKCAhaW5wdXRzLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGlucHV0cywgZnVuY3Rpb24gKGlucHV0KSB7XHJcblxyXG5cdFx0XHRcdC8vIDEpIFNraXAgaWYgYWxyZWFkeSBpbnNpZGUgdG9nZ2xlIHdyYXBwZXIuXHJcblx0XHRcdFx0aWYgKCBpbnB1dC5jbG9zZXN0KCAnLndwYmNfdWlfX3RvZ2dsZScgKSApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gU2tpcCByb3dzIC8gd2hlcmUgaW5wdXQgY2hlY2tib3ggZXhwbGljaXRseSBtYXJrZWQgd2l0aCAgYXR0cmlidXRlICdkYXRhLXdwYmMtdWktbm8tdG9nZ2xlJy5cclxuXHRcdFx0XHRpZiAoIGlucHV0Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtd3BiYy11aS1uby10b2dnbGUnICkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyAyKSBFbnN1cmUgdW5pcXVlIGlkOyBwcmVmZXIgZXhpc3RpbmcuXHJcblx0XHRcdFx0dmFyIGlucHV0X2lkID0gaW5wdXQuZ2V0QXR0cmlidXRlKCAnaWQnICk7XHJcblx0XHRcdFx0aWYgKCAhaW5wdXRfaWQgKSB7XHJcblx0XHRcdFx0XHR2YXIga2V5ICA9IChpbnB1dC5kYXRhc2V0ICYmIGlucHV0LmRhdGFzZXQuaW5zcGVjdG9yS2V5KSA/IFN0cmluZyggaW5wdXQuZGF0YXNldC5pbnNwZWN0b3JLZXkgKSA6ICdvcHQnO1xyXG5cdFx0XHRcdFx0aW5wdXRfaWQgPSBVSS5XUEJDX0JGQl9Ub2dnbGVfTm9ybWFsaXplci5nZW5lcmF0ZV91bmlxdWVfaWQoICd3cGJjX2luc19hdXRvXycgKyBrZXkgKyAnXycgKTtcclxuXHRcdFx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggJ2lkJywgaW5wdXRfaWQgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIDMpIEZpbmQgYmVzdCBsYWJlbCB0ZXh0LlxyXG5cdFx0XHRcdHZhciBsYWJlbF90ZXh0ID0gVUkuV1BCQ19CRkJfVG9nZ2xlX05vcm1hbGl6ZXIucmVzb2x2ZV9sYWJlbF90ZXh0KCByb290X2VsLCBpbnB1dCwgaW5wdXRfaWQgKTtcclxuXHJcblx0XHRcdFx0Ly8gNCkgQnVpbGQgdGhlIHRvZ2dsZSB3cmFwcGVyLlxyXG5cdFx0XHRcdHZhciB3cmFwcGVyICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0XHR3cmFwcGVyLmNsYXNzTmFtZSA9ICdpbnNwZWN0b3JfX2NvbnRyb2wgd3BiY191aV9fdG9nZ2xlJztcclxuXHJcblx0XHRcdFx0Ly8gS2VlcCBvcmlnaW5hbCBpbnB1dDsganVzdCBtb3ZlIGl0IGludG8gd3JhcHBlci5cclxuXHRcdFx0XHRpbnB1dC5jbGFzc0xpc3QuYWRkKCAnaW5zcGVjdG9yX19pbnB1dCcgKTtcclxuXHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoICdyb2xlJywgJ3N3aXRjaCcgKTtcclxuXHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoICdhcmlhLWNoZWNrZWQnLCBpbnB1dC5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xyXG5cclxuXHRcdFx0XHR2YXIgaWNvbl9sYWJlbCAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHRpY29uX2xhYmVsLmNsYXNzTmFtZSA9ICd3cGJjX3VpX190b2dnbGVfaWNvbic7XHJcblx0XHRcdFx0aWNvbl9sYWJlbC5zZXRBdHRyaWJ1dGUoICdmb3InLCBpbnB1dF9pZCApO1xyXG5cclxuXHRcdFx0XHR2YXIgdGV4dF9sYWJlbCAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHR0ZXh0X2xhYmVsLmNsYXNzTmFtZSA9ICd3cGJjX3VpX190b2dnbGVfbGFiZWwnO1xyXG5cdFx0XHRcdHRleHRfbGFiZWwuc2V0QXR0cmlidXRlKCAnZm9yJywgaW5wdXRfaWQgKTtcclxuXHRcdFx0XHR0ZXh0X2xhYmVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggbGFiZWxfdGV4dCApICk7XHJcblxyXG5cdFx0XHRcdC8vIDUpIEluc2VydCB3cmFwcGVyIGludG8gRE9NIG5lYXIgdGhlIGlucHV0LlxyXG5cdFx0XHRcdC8vICAgIFByZWZlcnJlZDogcmVwbGFjZSB0aGUgb3JpZ2luYWwgbGFiZWxlZCByb3cgaWYgaXQgbWF0Y2hlcyB0eXBpY2FsIGluc3BlY3RvciBsYXlvdXQuXHJcblx0XHRcdFx0dmFyIHJlcGxhY2VkID0gVUkuV1BCQ19CRkJfVG9nZ2xlX05vcm1hbGl6ZXIudHJ5X3JlcGxhY2Vfa25vd25fcm93KCBpbnB1dCwgd3JhcHBlciwgbGFiZWxfdGV4dCApO1xyXG5cclxuXHRcdFx0XHRpZiAoICFyZXBsYWNlZCApIHtcclxuXHRcdFx0XHRcdGlmICggIWlucHV0LnBhcmVudE5vZGUgKSByZXR1cm47IC8vIE5FVyBndWFyZFxyXG5cdFx0XHRcdFx0Ly8gRmFsbGJhY2s6IGp1c3Qgd3JhcCB0aGUgaW5wdXQgaW4gcGxhY2UgYW5kIGFwcGVuZCBsYWJlbHMuXHJcblx0XHRcdFx0XHRpbnB1dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggd3JhcHBlciwgaW5wdXQgKTtcclxuXHRcdFx0XHRcdHdyYXBwZXIuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XHJcblx0XHRcdFx0XHR3cmFwcGVyLmFwcGVuZENoaWxkKCBpY29uX2xhYmVsICk7XHJcblx0XHRcdFx0XHR3cmFwcGVyLmFwcGVuZENoaWxkKCB0ZXh0X2xhYmVsICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyA2KSBBUklBIHN5bmMgb24gY2hhbmdlLlxyXG5cdFx0XHRcdGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoICdhcmlhLWNoZWNrZWQnLCBpbnB1dC5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2VuZXJhdGUgYSB1bmlxdWUgaWQgd2l0aCBhIGdpdmVuIHByZWZpeC5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZW5lcmF0ZV91bmlxdWVfaWQocHJlZml4KSB7XHJcblx0XHRcdHZhciBiYXNlID0gU3RyaW5nKCBwcmVmaXggfHwgJ3dwYmNfaW5zX2F1dG9fJyApO1xyXG5cdFx0XHR2YXIgdWlkICA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDggKTtcclxuXHRcdFx0dmFyIGlkICAgPSBiYXNlICsgdWlkO1xyXG5cdFx0XHQvLyBNaW5pbWFsIGNvbGxpc2lvbiBndWFyZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudCBzY29wZS5cclxuXHRcdFx0d2hpbGUgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHtcclxuXHRcdFx0XHR1aWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCAzNiApLnNsaWNlKCAyLCA4ICk7XHJcblx0XHRcdFx0aWQgID0gYmFzZSArIHVpZDtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gaWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXNvbHZlIHRoZSBiZXN0IGh1bWFuIGxhYmVsIGZvciBhbiBpbnB1dC5cclxuXHRcdCAqIFByaW9yaXR5OlxyXG5cdFx0ICogIDEpIDxsYWJlbCBmb3I9XCJ7aWR9XCI+dGV4dDwvbGFiZWw+XHJcblx0XHQgKiAgMikgbmVhcmVzdCBzaWJsaW5nL3BhcmVudCAuaW5zcGVjdG9yX19sYWJlbCB0ZXh0XHJcblx0XHQgKiAgMykgaW5wdXQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykgfHwgZGF0YS1sYWJlbCB8fCBkYXRhLWluc3BlY3Rvci1rZXkgfHwgbmFtZSB8fCAnT3B0aW9uJ1xyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdF9lbFxyXG5cdFx0ICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSBpbnB1dFxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGlucHV0X2lkXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgcmVzb2x2ZV9sYWJlbF90ZXh0KHJvb3RfZWwsIGlucHV0LCBpbnB1dF9pZCkge1xyXG5cdFx0XHQvLyBmb3I9IGFzc29jaWF0aW9uXHJcblx0XHRcdGlmICggaW5wdXRfaWQgKSB7XHJcblx0XHRcdFx0dmFyIGFzc29jID0gcm9vdF9lbC5xdWVyeVNlbGVjdG9yKCAnbGFiZWxbZm9yPVwiJyArIFVJLldQQkNfQkZCX1RvZ2dsZV9Ob3JtYWxpemVyLmNzc19lc2NhcGUoIGlucHV0X2lkICkgKyAnXCJdJyApO1xyXG5cdFx0XHRcdGlmICggYXNzb2MgJiYgYXNzb2MudGV4dENvbnRlbnQgKSB7XHJcblx0XHRcdFx0XHR2YXIgdHh0ID0gYXNzb2MudGV4dENvbnRlbnQudHJpbSgpO1xyXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBvbGQgbGFiZWwgZnJvbSBET007IGl0cyB0ZXh0IHdpbGwgYmUgdXNlZCBieSB0b2dnbGUuXHJcblx0XHRcdFx0XHRhc3NvYy5wYXJlbnROb2RlICYmIGFzc29jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGFzc29jICk7XHJcblx0XHRcdFx0XHRpZiAoIHR4dCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHR4dDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIG5lYXJieSBpbnNwZWN0b3IgbGFiZWxcclxuXHRcdFx0dmFyIG5lYXJfbGFiZWwgPSBpbnB1dC5jbG9zZXN0KCAnLmluc3BlY3Rvcl9fcm93JyApO1xyXG5cdFx0XHRpZiAoIG5lYXJfbGFiZWwgKSB7XHJcblx0XHRcdFx0dmFyIGlsID0gbmVhcl9sYWJlbC5xdWVyeVNlbGVjdG9yKCAnLmluc3BlY3Rvcl9fbGFiZWwnICk7XHJcblx0XHRcdFx0aWYgKCBpbCAmJiBpbC50ZXh0Q29udGVudCApIHtcclxuXHRcdFx0XHRcdHZhciB0MiA9IGlsLnRleHRDb250ZW50LnRyaW0oKTtcclxuXHRcdFx0XHRcdC8vIElmIHRoaXMgcm93IGhhZCB0aGUgc3RhbmRhcmQgbGFiZWwrY29udHJvbCwgZHJvcCB0aGUgb2xkIHRleHQgbGFiZWwgdG8gYXZvaWQgZHVwbGljYXRlcy5cclxuXHRcdFx0XHRcdGlsLnBhcmVudE5vZGUgJiYgaWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggaWwgKTtcclxuXHRcdFx0XHRcdGlmICggdDIgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0MjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGZhbGxiYWNrc1xyXG5cdFx0XHR2YXIgYXJpYSA9IGlucHV0LmdldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWwnICk7XHJcblx0XHRcdGlmICggYXJpYSApIHtcclxuXHRcdFx0XHRyZXR1cm4gYXJpYTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGlucHV0LmRhdGFzZXQgJiYgaW5wdXQuZGF0YXNldC5sYWJlbCApIHtcclxuXHRcdFx0XHRyZXR1cm4gU3RyaW5nKCBpbnB1dC5kYXRhc2V0LmxhYmVsICk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBpbnB1dC5kYXRhc2V0ICYmIGlucHV0LmRhdGFzZXQuaW5zcGVjdG9yS2V5ICkge1xyXG5cdFx0XHRcdHJldHVybiBTdHJpbmcoIGlucHV0LmRhdGFzZXQuaW5zcGVjdG9yS2V5ICk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBpbnB1dC5uYW1lICkge1xyXG5cdFx0XHRcdHJldHVybiBTdHJpbmcoIGlucHV0Lm5hbWUgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gJ09wdGlvbic7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUcnkgdG8gcmVwbGFjZSBhIGtub3duIGluc3BlY3RvciByb3cgcGF0dGVybiB3aXRoIGEgdG9nZ2xlIHdyYXBwZXIuXHJcblx0XHQgKiBQYXR0ZXJuczpcclxuXHRcdCAqICA8ZGl2Lmluc3BlY3Rvcl9fcm93PlxyXG5cdFx0ICogICAgPGxhYmVsLmluc3BlY3Rvcl9fbGFiZWw+VGV4dDwvbGFiZWw+XHJcblx0XHQgKiAgICA8ZGl2Lmluc3BlY3Rvcl9fY29udHJvbD4gW2lucHV0W3R5cGU9Y2hlY2tib3hdXSA8L2Rpdj5cclxuXHRcdCAqICA8L2Rpdj5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnR9IGlucHV0XHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB3cmFwcGVyXHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmVwbGFjZWRcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHRyeV9yZXBsYWNlX2tub3duX3JvdyhpbnB1dCwgd3JhcHBlciwgbGFiZWxfdGV4dCkge1xyXG5cdFx0XHR2YXIgcm93ICAgICAgID0gaW5wdXQuY2xvc2VzdCggJy5pbnNwZWN0b3JfX3JvdycgKTtcclxuXHRcdFx0dmFyIGN0cmxfd3JhcCA9IGlucHV0LnBhcmVudEVsZW1lbnQ7XHJcblxyXG5cdFx0XHRpZiAoIHJvdyAmJiBjdHJsX3dyYXAgJiYgY3RybF93cmFwLmNsYXNzTGlzdC5jb250YWlucyggJ2luc3BlY3Rvcl9fY29udHJvbCcgKSApIHtcclxuXHRcdFx0XHQvLyBDbGVhciBjb250cm9sIHdyYXAgYW5kIHJlaW5zZXJ0IHRvZ2dsZSBzdHJ1Y3R1cmUuXHJcblx0XHRcdFx0d2hpbGUgKCBjdHJsX3dyYXAuZmlyc3RDaGlsZCApIHtcclxuXHRcdFx0XHRcdGN0cmxfd3JhcC5yZW1vdmVDaGlsZCggY3RybF93cmFwLmZpcnN0Q2hpbGQgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cm93LmNsYXNzTGlzdC5hZGQoICdpbnNwZWN0b3JfX3Jvdy0tdG9nZ2xlJyApO1xyXG5cclxuXHRcdFx0XHRjdHJsX3dyYXAuY2xhc3NMaXN0LmFkZCggJ3dwYmNfdWlfX3RvZ2dsZScgKTtcclxuXHRcdFx0XHRjdHJsX3dyYXAuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XHJcblxyXG5cdFx0XHRcdHZhciBpbnB1dF9pZCAgICAgICA9IGlucHV0LmdldEF0dHJpYnV0ZSggJ2lkJyApO1xyXG5cdFx0XHRcdHZhciBpY29uX2xibCAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHRpY29uX2xibC5jbGFzc05hbWUgPSAnd3BiY191aV9fdG9nZ2xlX2ljb24nO1xyXG5cdFx0XHRcdGljb25fbGJsLnNldEF0dHJpYnV0ZSggJ2ZvcicsIGlucHV0X2lkICk7XHJcblxyXG5cdFx0XHRcdHZhciB0ZXh0X2xibCAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHR0ZXh0X2xibC5jbGFzc05hbWUgPSAnd3BiY191aV9fdG9nZ2xlX2xhYmVsJztcclxuXHRcdFx0XHR0ZXh0X2xibC5zZXRBdHRyaWJ1dGUoICdmb3InLCBpbnB1dF9pZCApO1xyXG5cdFx0XHRcdGlmICggbGFiZWxfdGV4dCApIHtcclxuXHRcdFx0XHRcdHRleHRfbGJsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggbGFiZWxfdGV4dCApICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIElmIHRoZSByb3cgcHJldmlvdXNseSBoYWQgYSAuaW5zcGVjdG9yX19sYWJlbCAod2UgcmVtb3ZlZCBpdCBpbiByZXNvbHZlX2xhYmVsX3RleHQpLFxyXG5cdFx0XHRcdC8vIHdlIGludGVudGlvbmFsbHkgZG8gTk9UIHJlY3JlYXRlIGl0OyB0aGUgdG9nZ2xlIHRleHQgbGFiZWwgYmVjb21lcyB0aGUgdmlzaWJsZSBvbmUuXHJcblx0XHRcdFx0Ly8gVGhlIHRleHQgY29udGVudCBpcyBhbHJlYWR5IHJlc29sdmVkIGluIHJlc29sdmVfbGFiZWxfdGV4dCgpIGFuZCBzZXQgYmVsb3cgYnkgY2FsbGVyLlxyXG5cclxuXHRcdFx0XHRjdHJsX3dyYXAuYXBwZW5kQ2hpbGQoIGljb25fbGJsICk7XHJcblx0XHRcdFx0Y3RybF93cmFwLmFwcGVuZENoaWxkKCB0ZXh0X2xibCApO1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBOb3QgYSBrbm93biBwYXR0ZXJuOyBjYWxsZXIgd2lsbCB3cmFwIGluIHBsYWNlLlxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDU1MuZXNjYXBlIHBvbHlmaWxsIGZvciBzZWxlY3RvcnMuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc1xyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGNzc19lc2NhcGUocykge1xyXG5cdFx0XHRzID0gU3RyaW5nKCBzICk7XHJcblx0XHRcdGlmICggd2luZG93LkNTUyAmJiB0eXBlb2Ygd2luZG93LkNTUy5lc2NhcGUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHdpbmRvdy5DU1MuZXNjYXBlKCBzICk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHMucmVwbGFjZSggLyhbXlxcdy1dKS9nLCAnXFxcXCQxJyApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGx5IGFsbCBVSSBub3JtYWxpemVycy9lbmhhbmNlcnMgdG8gYSBjb250YWluZXIgKHBvc3QtcmVuZGVyKS5cclxuXHQgKiBLZWVwIHRoaXMgZmlsZSBzbWFsbCBhbmQgYWRkIG1vcmUgbm9ybWFsaXplcnMgbGF0ZXIgaW4gb25lIHBsYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdFxyXG5cdCAqL1xyXG5cdFVJLmFwcGx5X3Bvc3RfcmVuZGVyID0gZnVuY3Rpb24gKHJvb3QpIHtcclxuXHRcdGlmICggIXJvb3QgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRyeSB7XHJcblx0XHRcdFVJLldQQkNfQkZCX1ZhbHVlU2xpZGVyPy5pbml0X29uPy4oIHJvb3QgKTtcclxuXHRcdH0gY2F0Y2ggKCBlICkgeyAvKiBub29wICovXHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHR2YXIgVCA9IFVJLldQQkNfQkZCX1RvZ2dsZV9Ob3JtYWxpemVyO1xyXG5cdFx0XHRpZiAoIFQgJiYgdHlwZW9mIFQudXBncmFkZV9jaGVja2JveGVzX2luID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFQudXBncmFkZV9jaGVja2JveGVzX2luKCByb290ICk7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHR3Ll93cGJjPy5kZXY/LmVycm9yPy4oICdhcHBseV9wb3N0X3JlbmRlci50b2dnbGUnLCBlICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQWNjZXNzaWJpbGl0eToga2VlcCBhcmlhLWNoZWNrZWQgaW4gc3luYyBmb3IgYWxsIHRvZ2dsZXMgaW5zaWRlIHJvb3QuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRyb290LnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY191aV9fdG9nZ2xlIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScgKS5mb3JFYWNoKCBmdW5jdGlvbiAoY2IpIHtcclxuXHRcdFx0XHRpZiAoIGNiLl9fd3BiY19hcmlhX2hvb2tlZCApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y2IuX193cGJjX2FyaWFfaG9va2VkID0gdHJ1ZTtcclxuXHRcdFx0XHRjYi5zZXRBdHRyaWJ1dGUoICdhcmlhLWNoZWNrZWQnLCBjYi5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdC8vIERlbGVnYXRlIOKAmGNoYW5nZeKAmSBqdXN0IG9uY2UgcGVyIHJlbmRlciDigJMgbmF0aXZlIGRlbGVnYXRpb24gc3RpbGwgd29ya3MgZmluZSBmb3IgeW91ciBsb2dpYy5cclxuXHRcdFx0XHRjYi5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgKCkgPT4ge1xyXG5cdFx0XHRcdFx0Y2Iuc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgY2IuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZScgKTtcclxuXHRcdFx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0dy5fd3BiYz8uZGV2Py5lcnJvcj8uKCAnYXBwbHlfcG9zdF9yZW5kZXIuYXJpYScsIGUgKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRVSS5JbnNwZWN0b3JFbmhhbmNlcnMgPSBVSS5JbnNwZWN0b3JFbmhhbmNlcnMgfHwgKGZ1bmN0aW9uICgpIHtcclxuXHRcdHZhciByZWdzID0gW107XHJcblxyXG5cdFx0ZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgc2VsZWN0b3IsIGluaXQsIGRlc3Ryb3kpIHtcclxuXHRcdFx0cmVncy5wdXNoKCB7IG5hbWUsIHNlbGVjdG9yLCBpbml0LCBkZXN0cm95IH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBzY2FuKHJvb3QpIHtcclxuXHRcdFx0aWYgKCAhcm9vdCApIHJldHVybjtcclxuXHRcdFx0cmVncy5mb3JFYWNoKCBmdW5jdGlvbiAocikge1xyXG5cdFx0XHRcdHJvb3QucXVlcnlTZWxlY3RvckFsbCggci5zZWxlY3RvciApLmZvckVhY2goIGZ1bmN0aW9uIChub2RlKSB7XHJcblx0XHRcdFx0XHRub2RlLl9fd3BiY19laCA9IG5vZGUuX193cGJjX2VoIHx8IHt9O1xyXG5cdFx0XHRcdFx0aWYgKCBub2RlLl9fd3BiY19laFtyLm5hbWVdICkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0ci5pbml0ICYmIHIuaW5pdCggbm9kZSwgcm9vdCApO1xyXG5cdFx0XHRcdFx0XHRub2RlLl9fd3BiY19laFtyLm5hbWVdID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBkZXN0cm95KHJvb3QpIHtcclxuXHRcdFx0aWYgKCAhcm9vdCApIHJldHVybjtcclxuXHRcdFx0cmVncy5mb3JFYWNoKCBmdW5jdGlvbiAocikge1xyXG5cdFx0XHRcdHJvb3QucXVlcnlTZWxlY3RvckFsbCggci5zZWxlY3RvciApLmZvckVhY2goIGZ1bmN0aW9uIChub2RlKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRyLmRlc3Ryb3kgJiYgci5kZXN0cm95KCBub2RlLCByb290ICk7XHJcblx0XHRcdFx0XHR9IGNhdGNoICggX2UgKSB7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIG5vZGUuX193cGJjX2VoICkgZGVsZXRlIG5vZGUuX193cGJjX2VoW3IubmFtZV07XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHsgcmVnaXN0ZXIsIHNjYW4sIGRlc3Ryb3kgfTtcclxuXHR9KSgpO1xyXG5cclxuXHRVSS5XUEJDX0JGQl9WYWx1ZVNsaWRlciA9IHtcclxuXHRcdGluaXRfb24ocm9vdCkge1xyXG5cdFx0XHR2YXIgZ3JvdXBzID0gKHJvb3Qubm9kZVR5cGUgPT09IDEgPyBbIHJvb3QgXSA6IFtdKS5jb25jYXQoIFtdLnNsaWNlLmNhbGwoIHJvb3QucXVlcnlTZWxlY3RvckFsbD8uKCAnW2RhdGEtbGVuLWdyb3VwXScgKSB8fCBbXSApICk7XHJcblx0XHRcdGdyb3Vwcy5mb3JFYWNoKCBmdW5jdGlvbiAoZykge1xyXG5cdFx0XHRcdGlmICggIWcubWF0Y2hlcyB8fCAhZy5tYXRjaGVzKCAnW2RhdGEtbGVuLWdyb3VwXScgKSApIHJldHVybjtcclxuXHRcdFx0XHRpZiAoIGcuX193cGJjX2xlbl93aXJlZCApIHJldHVybjtcclxuXHJcblx0XHRcdFx0dmFyIG51bWJlciA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi12YWx1ZV0nICk7XHJcblx0XHRcdFx0dmFyIHJhbmdlICA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi1yYW5nZV0nICk7XHJcblx0XHRcdFx0dmFyIHVuaXQgICA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi11bml0XScgKTtcclxuXHJcblx0XHRcdFx0aWYgKCAhbnVtYmVyIHx8ICFyYW5nZSApIHJldHVybjtcclxuXHJcblx0XHRcdFx0Ly8gTWlycm9yIGNvbnN0cmFpbnRzIGlmIG1pc3Npbmcgb24gdGhlIHJhbmdlLlxyXG5cdFx0XHRcdFsgJ21pbicsICdtYXgnLCAnc3RlcCcgXS5mb3JFYWNoKCBmdW5jdGlvbiAoYSkge1xyXG5cdFx0XHRcdFx0aWYgKCAhcmFuZ2UuaGFzQXR0cmlidXRlKCBhICkgJiYgbnVtYmVyLmhhc0F0dHJpYnV0ZSggYSApICkge1xyXG5cdFx0XHRcdFx0XHRyYW5nZS5zZXRBdHRyaWJ1dGUoIGEsIG51bWJlci5nZXRBdHRyaWJ1dGUoIGEgKSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblxyXG5cdFx0XHRcdGZ1bmN0aW9uIHN5bmNfcmFuZ2VfZnJvbV9udW1iZXIoKSB7XHJcblx0XHRcdFx0XHRpZiAoIHJhbmdlLnZhbHVlICE9PSBudW1iZXIudmFsdWUgKSB7XHJcblx0XHRcdFx0XHRcdHJhbmdlLnZhbHVlID0gbnVtYmVyLnZhbHVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZnVuY3Rpb24gZGlzcGF0Y2hfaW5wdXQoZWwpIHtcclxuXHRcdFx0XHRcdHRyeSB7IGVsLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0gKSApOyB9IGNhdGNoICggX2UgKSB7fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmdW5jdGlvbiBkaXNwYXRjaF9jaGFuZ2UoZWwpIHtcclxuXHRcdFx0XHRcdHRyeSB7IGVsLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTsgfSBjYXRjaCAoIF9lICkge31cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFRocm90dGxlIHJhbmdlLT5udW1iZXIgc3luY2luZyAodGltZS1iYXNlZCkuXHJcblx0XHRcdFx0dmFyIHRpbWVyX2lkICAgICAgID0gMDtcclxuXHRcdFx0XHR2YXIgcGVuZGluZ192YWwgICAgPSBudWxsO1xyXG5cdFx0XHRcdHZhciBwZW5kaW5nX2NoYW5nZSA9IGZhbHNlO1xyXG5cdFx0XHRcdHZhciBsYXN0X2ZsdXNoX3RzICA9IDA7XHJcblxyXG5cdFx0XHRcdC8vIENoYW5nZSB0aGlzIHRvIHR1bmUgc3BlZWQ6IDUwLi4xMjAgbXMgaXMgYSBnb29kIHJhbmdlLlxyXG5cdFx0XHRcdHZhciBtaW5faW50ZXJ2YWxfbXMgPSBwYXJzZUludCggZy5kYXRhc2V0LmxlblRocm90dGxlIHx8IFVJLlZBTFVFX1NMSURFUl9USFJPVFRMRV9NUywgMTAgKTtcclxuXHRcdFx0XHRtaW5faW50ZXJ2YWxfbXMgPSBOdW1iZXIuaXNGaW5pdGUoIG1pbl9pbnRlcnZhbF9tcyApID8gTWF0aC5tYXgoIDAsIG1pbl9pbnRlcnZhbF9tcyApIDogMTIwO1xyXG5cclxuXHRcdFx0XHRmdW5jdGlvbiBmbHVzaF9yYW5nZV90b19udW1iZXIoKSB7XHJcblx0XHRcdFx0XHR0aW1lcl9pZCA9IDA7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nX3ZhbCA9PSBudWxsICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dmFyIG5leHQgICAgPSBTdHJpbmcoIHBlbmRpbmdfdmFsICk7XHJcblx0XHRcdFx0XHRwZW5kaW5nX3ZhbCA9IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBudW1iZXIudmFsdWUgIT09IG5leHQgKSB7XHJcblx0XHRcdFx0XHRcdG51bWJlci52YWx1ZSA9IG5leHQ7XHJcblx0XHRcdFx0XHRcdC8vIElNUE9SVEFOVDogb25seSAnaW5wdXQnIHdoaWxlIGRyYWdnaW5nLlxyXG5cdFx0XHRcdFx0XHRkaXNwYXRjaF9pbnB1dCggbnVtYmVyICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nX2NoYW5nZSApIHtcclxuXHRcdFx0XHRcdFx0cGVuZGluZ19jaGFuZ2UgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0ZGlzcGF0Y2hfY2hhbmdlKCBudW1iZXIgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRsYXN0X2ZsdXNoX3RzID0gRGF0ZS5ub3coKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZ1bmN0aW9uIHNjaGVkdWxlX3JhbmdlX3RvX251bWJlcih2YWwsIGVtaXRfY2hhbmdlKSB7XHJcblx0XHRcdFx0XHRwZW5kaW5nX3ZhbCA9IHZhbDtcclxuXHRcdFx0XHRcdGlmICggZW1pdF9jaGFuZ2UgKSB7XHJcblx0XHRcdFx0XHRcdHBlbmRpbmdfY2hhbmdlID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBJZiBjb21taXQgcmVxdWVzdGVkLCBmbHVzaCBpbW1lZGlhdGVseS5cclxuXHRcdFx0XHRcdGlmICggcGVuZGluZ19jaGFuZ2UgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggdGltZXJfaWQgKSB7XHJcblx0XHRcdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lcl9pZCApO1xyXG5cdFx0XHRcdFx0XHRcdHRpbWVyX2lkID0gMDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRmbHVzaF9yYW5nZV90b19udW1iZXIoKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhciBub3cgICA9IERhdGUubm93KCk7XHJcblx0XHRcdFx0XHR2YXIgZGVsdGEgPSBub3cgLSBsYXN0X2ZsdXNoX3RzO1xyXG5cclxuXHRcdFx0XHRcdC8vIElmIGVub3VnaCB0aW1lIHBhc3NlZCwgZmx1c2ggaW1tZWRpYXRlbHk7IGVsc2Ugc2NoZWR1bGUuXHJcblx0XHRcdFx0XHRpZiAoIGRlbHRhID49IG1pbl9pbnRlcnZhbF9tcyApIHtcclxuXHRcdFx0XHRcdFx0Zmx1c2hfcmFuZ2VfdG9fbnVtYmVyKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIHRpbWVyX2lkICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGltZXJfaWQgPSBzZXRUaW1lb3V0KCBmbHVzaF9yYW5nZV90b19udW1iZXIsIE1hdGgubWF4KCAwLCBtaW5faW50ZXJ2YWxfbXMgLSBkZWx0YSApICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmdW5jdGlvbiBvbl9udW1iZXJfaW5wdXQoKSB7XHJcblx0XHRcdFx0XHRzeW5jX3JhbmdlX2Zyb21fbnVtYmVyKCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmdW5jdGlvbiBvbl9udW1iZXJfY2hhbmdlKCkge1xyXG5cdFx0XHRcdFx0c3luY19yYW5nZV9mcm9tX251bWJlcigpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZnVuY3Rpb24gb25fcmFuZ2VfaW5wdXQoKSB7XHJcblx0XHRcdFx0XHRzY2hlZHVsZV9yYW5nZV90b19udW1iZXIoIHJhbmdlLnZhbHVlLCBmYWxzZSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZnVuY3Rpb24gb25fcmFuZ2VfY2hhbmdlKCkge1xyXG5cdFx0XHRcdFx0c2NoZWR1bGVfcmFuZ2VfdG9fbnVtYmVyKCByYW5nZS52YWx1ZSwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bnVtYmVyLmFkZEV2ZW50TGlzdGVuZXIoICdpbnB1dCcsICBvbl9udW1iZXJfaW5wdXQgKTtcclxuXHRcdFx0XHRudW1iZXIuYWRkRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIG9uX251bWJlcl9jaGFuZ2UgKTtcclxuXHRcdFx0XHRyYW5nZS5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXQnLCAgb25fcmFuZ2VfaW5wdXQgKTtcclxuXHRcdFx0XHRyYW5nZS5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgb25fcmFuZ2VfY2hhbmdlICk7XHJcblxyXG5cdFx0XHRcdGlmICggdW5pdCApIHtcclxuXHRcdFx0XHRcdHVuaXQuYWRkRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0Ly8gV2UganVzdCBudWRnZSB0aGUgbnVtYmVyIHNvIHVwc3RyZWFtIGhhbmRsZXJzIHJlLXJ1bi5cclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRudW1iZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gSW5pdGlhbCBzeW5jXHJcblx0XHRcdFx0c3luY19yYW5nZV9mcm9tX251bWJlcigpO1xyXG5cclxuXHRcdFx0XHRnLl9fd3BiY19sZW5fd2lyZWQgPSB7XHJcblx0XHRcdFx0XHRkZXN0cm95KCkge1xyXG5cdFx0XHRcdFx0XHRudW1iZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2lucHV0JywgIG9uX251bWJlcl9pbnB1dCApO1xyXG5cdFx0XHRcdFx0XHRudW1iZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIG9uX251bWJlcl9jaGFuZ2UgKTtcclxuXHRcdFx0XHRcdFx0cmFuZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2lucHV0JywgIG9uX3JhbmdlX2lucHV0ICk7XHJcblx0XHRcdFx0XHRcdHJhbmdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBvbl9yYW5nZV9jaGFuZ2UgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9LFxyXG5cdFx0ZGVzdHJveV9vbihyb290KSB7XHJcblx0XHRcdHZhciBncm91cHMgPSAocm9vdCAmJiByb290Lm5vZGVUeXBlID09PSAxID8gWyByb290IF0gOiBbXSkuY29uY2F0KFxyXG5cdFx0XHRcdFtdLnNsaWNlLmNhbGwoIHJvb3QucXVlcnlTZWxlY3RvckFsbD8uKCAnW2RhdGEtbGVuLWdyb3VwXScgKSB8fCBbXSApXHJcblx0XHRcdCk7XHJcblx0XHRcdGdyb3Vwcy5mb3JFYWNoKCBmdW5jdGlvbiAoZykge1xyXG5cdFx0XHRcdGlmICggIWcubWF0Y2hlcyB8fCAhZy5tYXRjaGVzKCAnW2RhdGEtbGVuLWdyb3VwXScgKSApIHJldHVybjtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0Zy5fX3dwYmNfbGVuX3dpcmVkICYmIGcuX193cGJjX2xlbl93aXJlZC5kZXN0cm95ICYmIGcuX193cGJjX2xlbl93aXJlZC5kZXN0cm95KCk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRkZWxldGUgZy5fX3dwYmNfbGVuX3dpcmVkO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Ly8gUmVnaXN0ZXIgd2l0aCB0aGUgZ2xvYmFsIGVuaGFuY2VycyBodWIuXHJcblx0VUkuSW5zcGVjdG9yRW5oYW5jZXJzICYmIFVJLkluc3BlY3RvckVuaGFuY2Vycy5yZWdpc3RlcihcclxuXHRcdCd2YWx1ZS1zbGlkZXInLFxyXG5cdFx0J1tkYXRhLWxlbi1ncm91cF0nLFxyXG5cdFx0ZnVuY3Rpb24gKGVsLCBfcm9vdCkge1xyXG5cdFx0XHRVSS5XUEJDX0JGQl9WYWx1ZVNsaWRlci5pbml0X29uKCBlbCApO1xyXG5cdFx0fSxcclxuXHRcdGZ1bmN0aW9uIChlbCwgX3Jvb3QpIHtcclxuXHRcdFx0VUkuV1BCQ19CRkJfVmFsdWVTbGlkZXIuZGVzdHJveV9vbiggZWwgKTtcclxuXHRcdH1cclxuXHQpO1xyXG5cclxuXHQvLyBTaW5nbGUsIGxvYWQtb3JkZXItc2FmZSBwYXRjaCBzbyBlbmhhbmNlcnMgYXV0by1ydW4gb24gZXZlcnkgYmluZC5cclxuXHQoZnVuY3Rpb24gcGF0Y2hJbnNwZWN0b3JFbmhhbmNlcnMoKSB7XHJcblx0XHRmdW5jdGlvbiBhcHBseVBhdGNoKCkge1xyXG5cdFx0XHR2YXIgSW5zcGVjdG9yID0gdy5XUEJDX0JGQl9JbnNwZWN0b3I7XHJcblx0XHRcdGlmICggIUluc3BlY3RvciB8fCBJbnNwZWN0b3IuX193cGJjX2VuaGFuY2Vyc19wYXRjaGVkICkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRJbnNwZWN0b3IuX193cGJjX2VuaGFuY2Vyc19wYXRjaGVkID0gdHJ1ZTtcclxuXHRcdFx0dmFyIG9yaWcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEluc3BlY3Rvci5wcm90b3R5cGUuYmluZF90b19maWVsZDtcclxuXHRcdFx0SW5zcGVjdG9yLnByb3RvdHlwZS5iaW5kX3RvX2ZpZWxkICA9IGZ1bmN0aW9uIChlbCkge1xyXG5cdFx0XHRcdG9yaWcuY2FsbCggdGhpcywgZWwgKTtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0dmFyIGlucyA9IHRoaXMucGFuZWxcclxuXHRcdFx0XHRcdFx0fHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApXHJcblx0XHRcdFx0XHRcdHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRcdFVJLkluc3BlY3RvckVuaGFuY2VycyAmJiBVSS5JbnNwZWN0b3JFbmhhbmNlcnMuc2NhbiggaW5zICk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHRcdFx0Ly8gSW5pdGlhbCBzY2FuIGlmIHRoZSBET00gaXMgYWxyZWFkeSBwcmVzZW50LlxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHZhciBpbnNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKVxyXG5cdFx0XHRcdFx0fHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRcdFVJLkluc3BlY3RvckVuaGFuY2VycyAmJiBVSS5JbnNwZWN0b3JFbmhhbmNlcnMuc2NhbiggaW5zRWwgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRyeSBub3c7IGlmIEluc3BlY3RvciBpc27igJl0IGRlZmluZWQgeWV0LCBwYXRjaCB3aGVuIGl0IGJlY29tZXMgcmVhZHkuXHJcblx0XHRpZiAoICFhcHBseVBhdGNoKCkgKSB7XHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXHJcblx0XHRcdFx0J3dwYmNfYmZiX2luc3BlY3Rvcl9yZWFkeScsXHJcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0YXBwbHlQYXRjaCgpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0eyBvbmNlOiB0cnVlIH1cclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9KSgpO1xyXG5cclxufSggd2luZG93LCBkb2N1bWVudCApKTtcclxuIiwiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09IEZpbGUgIC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9fX2pzL2NvcmUvYmZiLXN5bmMtY29kZS10b29scy10YWIuanMgICB8IDIwMjYtMDQtMDYgfCAxNjozOFxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuKGZ1bmN0aW9uICggdywgZCApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BhdGNoIHJlcXVlc3QgdG8gc2hvdyBhIHJpZ2h0IHNpZGViYXIgcGFuZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGFuZWxfaWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFiX2lkXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHt2b2lkfVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYmZiX19kaXNwYXRjaF9zaG93X3BhbmVsKCBwYW5lbF9pZCwgdGFiX2lkICkge1xyXG5cclxuXHRcdHZhciBldmVudF9kZXRhaWw7XHJcblxyXG5cdFx0aWYgKCAhIHBhbmVsX2lkIHx8ICEgdGFiX2lkICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0ZXZlbnRfZGV0YWlsID0ge1xyXG5cdFx0XHRwYW5lbF9pZDogcGFuZWxfaWQsXHJcblx0XHRcdHRhYl9pZCAgOiB0YWJfaWRcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCB0eXBlb2Ygdy53cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0dy53cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSggJ3dwYmNfYmZiOnNob3dfcGFuZWwnLCBldmVudF9kZXRhaWwgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGQuZGlzcGF0Y2hFdmVudChcclxuXHRcdFx0bmV3IEN1c3RvbUV2ZW50KFxyXG5cdFx0XHRcdCd3cGJjX2JmYjpzaG93X3BhbmVsJyxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRkZXRhaWw6IGV2ZW50X2RldGFpbFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN5bmMgcmlnaHQgc2lkZWJhciB3aXRoIHRvcCBtb2RlIHRhYnMuXHJcblx0ICpcclxuXHQgKiBVc2VzIHRvcCB0YWJzIG5hdiBhdHRyaWJ1dGUgYGRhdGEtYWN0aXZlLXRhYmAgYXMgdGhlIHNvdXJjZSBvZiB0cnV0aC5cclxuXHQgKiBUaGlzIGF2b2lkcyBmYWxzZSBkZXRlY3Rpb24gb24gaW5pdGlhbCBwYWdlIGxvYWQsIGJlY2F1c2UgdG9wIHBhbmVscyBhcmVcclxuXHQgKiBoaWRkZW4gYnkgaW5saW5lIHN0eWxlIGBkaXNwbGF5Om5vbmVgLCBub3QgYnkgdGhlIGBoaWRkZW5gIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRjbGFzcyBXUEJDX0JGQl9Nb2RlX1JpZ2h0YmFyX1N5bmMge1xyXG5cclxuXHRcdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0XHR0aGlzLnRvcF90YWJzX25hdiAgICAgID0gbnVsbDtcclxuXHRcdFx0dGhpcy5hZHZhbmNlZF90YWJfd3JhcCA9IG51bGw7XHJcblx0XHRcdHRoaXMuYWR2YW5jZWRfcGFuZWwgICAgPSBudWxsO1xyXG5cdFx0XHR0aGlzLm11dGF0aW9uX29ic2VydmVyID0gbnVsbDtcclxuXHRcdFx0dGhpcy5sYXN0X21vZGUgICAgICAgICA9ICcnO1xyXG5cdFx0XHR0aGlzLnN5bmNfcmlnaHRiYXJfbW9kZSA9IHRoaXMuc3luY19yaWdodGJhcl9tb2RlLmJpbmQoIHRoaXMgKTtcclxuXHRcdFx0dGhpcy5oYW5kbGVfY2xpY2sgICAgICA9IHRoaXMuaGFuZGxlX2NsaWNrLmJpbmQoIHRoaXMgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluaXQgY29udHJvbGxlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRpbml0KCkge1xyXG5cdFx0XHR0aGlzLnRvcF90YWJzX25hdiAgICAgID0gZC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX190b3BfaG9yaXNvbnRhbF9uYXYnICk7XHJcblx0XHRcdHRoaXMuYWR2YW5jZWRfdGFiX3dyYXAgPSBkLnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX3JpZ2h0YmFyX3RhYl93cmFwLS1hZHZhbmNlZF90b29scycgKTtcclxuXHRcdFx0dGhpcy5hZHZhbmNlZF9wYW5lbCAgICA9IGQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yX2FkdmFuY2VkX3Rvb2xzJyApO1xyXG5cclxuXHRcdFx0aWYgKCAhIHRoaXMuYWR2YW5jZWRfdGFiX3dyYXAgfHwgISB0aGlzLmFkdmFuY2VkX3BhbmVsICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gT2JzZXJ2ZSBhY3RpdmUgdGFiIGNoYW5nZXMgaW4gdGhlIHRvcCB0YWJzIG5hdi5cclxuXHRcdFx0aWYgKCB0aGlzLnRvcF90YWJzX25hdiApIHtcclxuXHRcdFx0XHR0aGlzLm11dGF0aW9uX29ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoIHRoaXMuc3luY19yaWdodGJhcl9tb2RlICk7XHJcblx0XHRcdFx0dGhpcy5tdXRhdGlvbl9vYnNlcnZlci5vYnNlcnZlKFxyXG5cdFx0XHRcdFx0dGhpcy50b3BfdGFic19uYXYsXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdGF0dHJpYnV0ZXMgICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0YXR0cmlidXRlRmlsdGVyOiBbICdkYXRhLWFjdGl2ZS10YWInIF1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGYWxsYmFjayBmb3IgY2xpY2stZHJpdmVuIHN3aXRjaGluZy5cclxuXHRcdFx0ZC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzLmhhbmRsZV9jbGljaywgdHJ1ZSApO1xyXG5cclxuXHRcdFx0Ly8gSW5pdGlhbCBzeW5jLlxyXG5cdFx0XHR0aGlzLnN5bmNfcmlnaHRiYXJfbW9kZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2V0IGFjdGl2ZSB0b3AgdGFiIGlkLlxyXG5cdFx0ICpcclxuXHRcdCAqIFByaW9yaXR5OlxyXG5cdFx0ICogMS4gZGF0YS1hY3RpdmUtdGFiIGZyb20gdG9wIHRhYnMgbmF2XHJcblx0XHQgKiAyLiBhY3RpdmUgQ1NTIGNsYXNzIGluIG5hdlxyXG5cdFx0ICogMy4gdmlzaWJsZSB0b3AgcGFuZWwgZmFsbGJhY2tcclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdGdldF9hY3RpdmVfdG9wX3RhYl9pZCgpIHtcclxuXHRcdFx0dmFyIGFjdGl2ZV90YWJfaWQgPSAnJztcclxuXHRcdFx0dmFyIGFjdGl2ZV9saW5rICAgPSBudWxsO1xyXG5cdFx0XHR2YXIgYWR2YW5jZWRfcGFuZWwgPSBudWxsO1xyXG5cdFx0XHR2YXIgYnVpbGRlcl9wYW5lbCAgPSBudWxsO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnRvcF90YWJzX25hdiApIHtcclxuXHRcdFx0XHRhY3RpdmVfdGFiX2lkID0gU3RyaW5nKCB0aGlzLnRvcF90YWJzX25hdi5nZXRBdHRyaWJ1dGUoICdkYXRhLWFjdGl2ZS10YWInICkgfHwgJycgKS50cmltKCk7XHJcblx0XHRcdFx0aWYgKCAnJyAhPT0gYWN0aXZlX3RhYl9pZCApIHtcclxuXHRcdFx0XHRcdHJldHVybiBhY3RpdmVfdGFiX2lkO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YWN0aXZlX2xpbmsgPSB0aGlzLnRvcF90YWJzX25hdi5xdWVyeVNlbGVjdG9yKCAnLndwYmNfdWlfZWxfX2hvcmlzX25hdl9pdGVtLmFjdGl2ZSBbZGF0YS13cGJjLWJmYi10YWJdJyApO1xyXG5cdFx0XHRcdGlmICggYWN0aXZlX2xpbmsgKSB7XHJcblx0XHRcdFx0XHRhY3RpdmVfdGFiX2lkID0gU3RyaW5nKCBhY3RpdmVfbGluay5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLXRhYicgKSB8fCAnJyApLnRyaW0oKTtcclxuXHRcdFx0XHRcdGlmICggJycgIT09IGFjdGl2ZV90YWJfaWQgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhY3RpdmVfdGFiX2lkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRmluYWwgZmFsbGJhY2s6IGRldGVjdCB2aXNpYmxlIHBhbmVsLlxyXG5cdFx0XHRhZHZhbmNlZF9wYW5lbCA9IGQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fdG9wX3RhYl9zZWN0aW9uX19hZHZhbmNlZF90YWInICk7XHJcblx0XHRcdGJ1aWxkZXJfcGFuZWwgID0gZC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX190b3BfdGFiX3NlY3Rpb25fX2J1aWxkZXJfdGFiJyApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmlzX2VsZW1lbnRfdmlzaWJsZSggYWR2YW5jZWRfcGFuZWwgKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gJ2FkdmFuY2VkX3RhYic7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCB0aGlzLmlzX2VsZW1lbnRfdmlzaWJsZSggYnVpbGRlcl9wYW5lbCApICkge1xyXG5cdFx0XHRcdHJldHVybiAnYnVpbGRlcl90YWInO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDaGVjayBlbGVtZW50IHZpc2liaWxpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBlbFxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdGlzX2VsZW1lbnRfdmlzaWJsZSggZWwgKSB7XHJcblx0XHRcdHZhciBzdHlsZTtcclxuXHJcblx0XHRcdGlmICggISBlbCApIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN0eWxlID0gdy5nZXRDb21wdXRlZFN0eWxlKCBlbCApO1xyXG5cclxuXHRcdFx0aWYgKCAhIHN0eWxlICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCAnbm9uZScgPT09IHN0eWxlLmRpc3BsYXkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICdoaWRkZW4nID09PSBzdHlsZS52aXNpYmlsaXR5ICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDaGVjayBpZiBBZHZhbmNlZCBNb2RlIGlzIGFjdGl2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRpc19hZHZhbmNlZF9tb2RlX2FjdGl2ZSgpIHtcclxuXHRcdFx0cmV0dXJuICggJ2FkdmFuY2VkX3RhYicgPT09IHRoaXMuZ2V0X2FjdGl2ZV90b3BfdGFiX2lkKCkgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNob3cgQ29kZSBUb29scyB0YWIgYnV0dG9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdHNob3dfYWR2YW5jZWRfdG9vbHNfdGFiKCkge1xyXG5cdFx0XHR0aGlzLmFkdmFuY2VkX3RhYl93cmFwLnJlbW92ZUF0dHJpYnV0ZSggJ2hpZGRlbicgKTtcclxuXHRcdFx0dGhpcy5hZHZhbmNlZF90YWJfd3JhcC5zZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhpZGUgQ29kZSBUb29scyB0YWIgYnV0dG9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdGhpZGVfYWR2YW5jZWRfdG9vbHNfdGFiKCkge1xyXG5cdFx0XHR0aGlzLmFkdmFuY2VkX3RhYl93cmFwLnNldEF0dHJpYnV0ZSggJ2hpZGRlbicsICd0cnVlJyApO1xyXG5cdFx0XHR0aGlzLmFkdmFuY2VkX3RhYl93cmFwLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDaGVjayBpZiBDb2RlIFRvb2xzIHBhbmVsIGlzIGN1cnJlbnRseSBhY3RpdmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0aXNfYWR2YW5jZWRfdG9vbHNfcGFuZWxfYWN0aXZlKCkge1xyXG5cdFx0XHRyZXR1cm4gISEgKCB0aGlzLmFkdmFuY2VkX3BhbmVsICYmICEgdGhpcy5hZHZhbmNlZF9wYW5lbC5oYXNBdHRyaWJ1dGUoICdoaWRkZW4nICkgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9wZW4gQ29kZSBUb29scyBwYW5lbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRvcGVuX2FkdmFuY2VkX3Rvb2xzX3BhbmVsKCkge1xyXG5cdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfc2hvd19wYW5lbCggJ3dwYmNfYmZiX19pbnNwZWN0b3JfYWR2YW5jZWRfdG9vbHMnLCAnd3BiY190YWJfYWR2YW5jZWRfdG9vbHMnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPcGVuIGRlZmF1bHQgYnVpbGRlciByaWdodGJhciBwYW5lbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRvcGVuX2RlZmF1bHRfdmlzdWFsX3BhbmVsKCkge1xyXG5cdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfc2hvd19wYW5lbCggJ3dwYmNfYmZiX19wYWxldHRlX2FkZF9uZXcnLCAnd3BiY190YWJfbGlicmFyeScgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFN5bmMgcmlnaHRiYXIgbW9kZSB3aXRoIHRvcCB0YWJzIG1vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3luY19yaWdodGJhcl9tb2RlKCkge1xyXG5cdFx0XHR2YXIgaXNfYWR2YW5jZWRfbW9kZSA9IHRoaXMuaXNfYWR2YW5jZWRfbW9kZV9hY3RpdmUoKTtcclxuXHJcblx0XHRcdGlmICggaXNfYWR2YW5jZWRfbW9kZSApIHtcclxuXHRcdFx0XHR0aGlzLnNob3dfYWR2YW5jZWRfdG9vbHNfdGFiKCk7XHJcblxyXG5cdFx0XHRcdGlmICggJ2FkdmFuY2VkJyAhPT0gdGhpcy5sYXN0X21vZGUgKSB7XHJcblx0XHRcdFx0XHR0aGlzLm9wZW5fYWR2YW5jZWRfdG9vbHNfcGFuZWwoKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRoaXMubGFzdF9tb2RlID0gJ2FkdmFuY2VkJztcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5pc19hZHZhbmNlZF90b29sc19wYW5lbF9hY3RpdmUoKSApIHtcclxuXHRcdFx0XHR0aGlzLm9wZW5fZGVmYXVsdF92aXN1YWxfcGFuZWwoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5oaWRlX2FkdmFuY2VkX3Rvb2xzX3RhYigpO1xyXG5cdFx0XHR0aGlzLmxhc3RfbW9kZSA9ICdidWlsZGVyJztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZhbGxiYWNrIGNsaWNrIGhhbmRsZXIgZm9yIHRvcCB0YWJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0aGFuZGxlX2NsaWNrKCBldmVudCApIHtcclxuXHRcdFx0dmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCAnW2RhdGEtd3BiYy1iZmItdGFiXScgKTtcclxuXHRcdFx0dmFyIHRoaXNfb2JqID0gdGhpcztcclxuXHJcblx0XHRcdGlmICggISB0YXJnZXQgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzZXRUaW1lb3V0KFxyXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdHRoaXNfb2JqLnN5bmNfcmlnaHRiYXJfbW9kZSgpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0MFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKCBkLnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyApIHtcclxuXHRcdGQuYWRkRXZlbnRMaXN0ZW5lcihcclxuXHRcdFx0J0RPTUNvbnRlbnRMb2FkZWQnLFxyXG5cdFx0XHRmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0KCBuZXcgV1BCQ19CRkJfTW9kZV9SaWdodGJhcl9TeW5jKCkgKS5pbml0KCk7XHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblx0fSBlbHNlIHtcclxuXHRcdCggbmV3IFdQQkNfQkZCX01vZGVfUmlnaHRiYXJfU3luYygpICkuaW5pdCgpO1xyXG5cdH1cclxuXHJcbn0pKCB3aW5kb3csIGRvY3VtZW50ICk7IiwiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09IEZpbGUgIC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9fb3V0L2NvcmUvYmZiLWluc3BlY3Rvci5qcyA9PSBUaW1lIHBvaW50OiAyMDI1LTA5LTA2IDE0OjA4XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4oZnVuY3Rpb24gKHcpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8vIDEpIEFjdGlvbnMgcmVnaXN0cnkuXHJcblxyXG5cdC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgKGN0eDogSW5zcGVjdG9yQWN0aW9uQ29udGV4dCkgPT4gdm9pZD59ICovXHJcblx0Y29uc3QgX19JTlNQRUNUT1JfQUNUSU9OU19NQVBfXyA9IE9iamVjdC5jcmVhdGUoIG51bGwgKTtcclxuXHJcblx0Ly8gQnVpbHQtaW5zLlxyXG5cdF9fSU5TUEVDVE9SX0FDVElPTlNfTUFQX19bJ2Rlc2VsZWN0J10gPSAoeyBidWlsZGVyIH0pID0+IHtcclxuXHRcdGJ1aWxkZXI/LnNlbGVjdF9maWVsZD8uKCBudWxsICk7XHJcblx0fTtcclxuXHJcblx0X19JTlNQRUNUT1JfQUNUSU9OU19NQVBfX1snc2Nyb2xsdG8nXSA9ICh7IGJ1aWxkZXIsIGVsIH0pID0+IHtcclxuXHRcdGlmICggIWVsIHx8ICFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKCBlbCApICkgcmV0dXJuO1xyXG5cdFx0YnVpbGRlcj8uc2VsZWN0X2ZpZWxkPy4oIGVsLCB7IHNjcm9sbEludG9WaWV3OiB0cnVlIH0gKTtcclxuXHRcdGVsLmNsYXNzTGlzdC5hZGQoICd3cGJjX2JmYl9fc2Nyb2xsLXB1bHNlJyApO1xyXG5cdFx0c2V0VGltZW91dCggKCkgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3dwYmNfYmZiX19zY3JvbGwtcHVsc2UnICksIDcwMCApO1xyXG5cdH07XHJcblxyXG5cdF9fSU5TUEVDVE9SX0FDVElPTlNfTUFQX19bJ21vdmUtdXAnXSA9ICh7IGJ1aWxkZXIsIGVsIH0pID0+IHtcclxuXHRcdGlmICggIWVsICkgcmV0dXJuO1xyXG5cdFx0YnVpbGRlcj8ubW92ZV9pdGVtPy4oIGVsLCAndXAnICk7XHJcblx0XHQvLyBTY3JvbGwgYWZ0ZXIgdGhlIERPTSBoYXMgc2V0dGxlZC5cclxuXHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fWydzY3JvbGx0byddKHsgYnVpbGRlciwgZWwgfSkpO1xyXG5cdH07XHJcblxyXG5cdF9fSU5TUEVDVE9SX0FDVElPTlNfTUFQX19bJ21vdmUtZG93biddID0gKHsgYnVpbGRlciwgZWwgfSkgPT4ge1xyXG5cdFx0aWYgKCAhZWwgKSByZXR1cm47XHJcblx0XHRidWlsZGVyPy5tb3ZlX2l0ZW0/LiggZWwsICdkb3duJyApO1xyXG5cdFx0Ly8gU2Nyb2xsIGFmdGVyIHRoZSBET00gaGFzIHNldHRsZWQuXHJcblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gX19JTlNQRUNUT1JfQUNUSU9OU19NQVBfX1snc2Nyb2xsdG8nXSh7IGJ1aWxkZXIsIGVsIH0pKTtcclxuXHR9O1xyXG5cclxuXHRfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fWydkZWxldGUnXSA9ICh7IGJ1aWxkZXIsIGVsLCBjb25maXJtID0gdy5jb25maXJtIH0pID0+IHtcclxuXHRcdGlmICggIWVsICkgcmV0dXJuO1xyXG5cdFx0Y29uc3QgaXNfZmllbGQgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fZmllbGQnICk7XHJcblx0XHRjb25zdCBsYWJlbCAgICA9IGlzX2ZpZWxkXHJcblx0XHRcdD8gKGVsLnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2ZpZWxkLWxhYmVsJyApPy50ZXh0Q29udGVudCB8fCBlbC5kYXRhc2V0Py5pZCB8fCAnZmllbGQnKVxyXG5cdFx0XHQ6IChlbC5kYXRhc2V0Py5pZCB8fCAnc2VjdGlvbicpO1xyXG5cclxuXHRcdFVJLk1vZGFsX0NvbmZpcm1fRGVsZXRlLm9wZW4oIGxhYmVsLCAoKSA9PiB7XHJcblx0XHRcdC8vIENlbnRyYWwgY29tbWFuZCB3aWxsIHJlbW92ZSwgZW1pdCBldmVudHMsIGFuZCByZXNlbGVjdCBuZWlnaGJvciAod2hpY2ggcmUtYmluZHMgSW5zcGVjdG9yKS5cclxuXHRcdFx0YnVpbGRlcj8uZGVsZXRlX2l0ZW0/LiggZWwgKTtcclxuXHRcdH0gKTtcclxuXHJcblx0fTtcclxuXHJcblx0X19JTlNQRUNUT1JfQUNUSU9OU19NQVBfX1snZHVwbGljYXRlJ10gPSAoeyBidWlsZGVyLCBlbCB9KSA9PiB7XHJcblx0XHRpZiAoICFlbCApIHJldHVybjtcclxuXHRcdGNvbnN0IGNsb25lID0gYnVpbGRlcj8uZHVwbGljYXRlX2l0ZW0/LiggZWwgKTtcclxuXHRcdGlmICggY2xvbmUgKSBidWlsZGVyPy5zZWxlY3RfZmllbGQ/LiggY2xvbmUsIHsgc2Nyb2xsSW50b1ZpZXc6IHRydWUgfSApO1xyXG5cdH07XHJcblxyXG5cdC8vIFB1YmxpYyBBUEkuXHJcblx0dy5XUEJDX0JGQl9JbnNwZWN0b3JfQWN0aW9ucyA9IHtcclxuXHRcdHJ1bihuYW1lLCBjdHgpIHtcclxuXHRcdFx0Y29uc3QgZm4gPSBfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fW25hbWVdO1xyXG5cdFx0XHRpZiAoIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyApIGZuKCBjdHggKTtcclxuXHRcdFx0ZWxzZSBjb25zb2xlLndhcm4oICdXUEJDLiBJbnNwZWN0b3IgYWN0aW9uIG5vdCBmb3VuZDonLCBuYW1lICk7XHJcblx0XHR9LFxyXG5cdFx0cmVnaXN0ZXIobmFtZSwgaGFuZGxlcikge1xyXG5cdFx0XHRpZiAoICFuYW1lIHx8IHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ3JlZ2lzdGVyKG5hbWUsIGhhbmRsZXIpOiBpbnZhbGlkIGFyZ3VtZW50cycgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fW25hbWVdID0gaGFuZGxlcjtcclxuXHRcdH0sXHJcblx0XHRoYXMobmFtZSkge1xyXG5cdFx0XHRyZXR1cm4gdHlwZW9mIF9fSU5TUEVDVE9SX0FDVElPTlNfTUFQX19bbmFtZV0gPT09ICdmdW5jdGlvbic7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Ly8gMikgSW5zcGVjdG9yIEZhY3RvcnkuXHJcblxyXG5cdHZhciBVSSA9ICh3LldQQkNfQkZCX0NvcmUuVUkgPSB3LldQQkNfQkZCX0NvcmUuVUkgfHwge30pO1xyXG5cclxuXHQvLyBHbG9iYWwgSHlicmlkKysgcmVnaXN0cmllcyAoa2VlcCBwdWJsaWMpLlxyXG5cdHcud3BiY19iZmJfaW5zcGVjdG9yX2ZhY3Rvcnlfc2xvdHMgICAgICA9IHcud3BiY19iZmJfaW5zcGVjdG9yX2ZhY3Rvcnlfc2xvdHMgfHwge307XHJcblx0dy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV92YWx1ZV9mcm9tID0gdy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV92YWx1ZV9mcm9tIHx8IHt9O1xyXG5cclxuXHQvLyBEZWZpbmUgRmFjdG9yeSBvbmx5IGlmIG1pc3NpbmcgKG5vIGVhcmx5IHJldHVybiBmb3IgdGhlIHdob2xlIGJ1bmRsZSkuXHJcblx0Ly8gYWx3YXlzIGRlZmluZS9yZXBsYWNlIEZhY3RvcnlcclxuXHR7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVdGlsaXR5OiBjcmVhdGUgZWxlbWVudCB3aXRoIGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0PX0gYXR0cnNcclxuXHRcdCAqIEBwYXJhbSB7KE5vZGV8c3RyaW5nfEFycmF5PE5vZGV8c3RyaW5nPik9fSBjaGlsZHJlblxyXG5cdFx0ICogQHJldHVybnMge0hUTUxFbGVtZW50fVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiBlbCh0YWcsIGF0dHJzLCBjaGlsZHJlbikge1xyXG5cdFx0XHR2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIHRhZyApO1xyXG5cdFx0XHRpZiAoIGF0dHJzICkge1xyXG5cdFx0XHRcdE9iamVjdC5rZXlzKCBhdHRycyApLmZvckVhY2goIGZ1bmN0aW9uIChrKSB7XHJcblx0XHRcdFx0XHR2YXIgdiA9IGF0dHJzW2tdO1xyXG5cdFx0XHRcdFx0aWYgKCB2ID09IG51bGwgKSByZXR1cm47XHJcblx0XHRcdFx0XHRpZiAoIGsgPT09ICdjbGFzcycgKSB7XHJcblx0XHRcdFx0XHRcdG5vZGUuY2xhc3NOYW1lID0gdjtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBrID09PSAnZGF0YXNldCcgKSB7XHJcblx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKCB2ICkuZm9yRWFjaCggZnVuY3Rpb24gKGRrKSB7XHJcblx0XHRcdFx0XHRcdFx0bm9kZS5kYXRhc2V0W2RrXSA9IFN0cmluZyggdltka10gKTtcclxuXHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGsgPT09ICdjaGVja2VkJyAmJiB0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nICkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIHYgKSBub2RlLnNldEF0dHJpYnV0ZSggJ2NoZWNrZWQnLCAnY2hlY2tlZCcgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBrID09PSAnZGlzYWJsZWQnICYmIHR5cGVvZiB2ID09PSAnYm9vbGVhbicgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggdiApIG5vZGUuc2V0QXR0cmlidXRlKCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIG5vcm1hbGl6ZSBib29sZWFuIGF0dHJpYnV0ZXMgdG8gc3RyaW5ncy5cclxuXHRcdFx0XHRcdGlmICggdHlwZW9mIHYgPT09ICdib29sZWFuJyApIHtcclxuXHRcdFx0XHRcdFx0bm9kZS5zZXRBdHRyaWJ1dGUoIGssIHYgPyAndHJ1ZScgOiAnZmFsc2UnICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKCBrLCBTdHJpbmcoIHYgKSApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGNoaWxkcmVuICkge1xyXG5cdFx0XHRcdChBcnJheS5pc0FycmF5KCBjaGlsZHJlbiApID8gY2hpbGRyZW4gOiBbIGNoaWxkcmVuIF0pLmZvckVhY2goIGZ1bmN0aW9uIChjKSB7XHJcblx0XHRcdFx0XHRpZiAoIGMgPT0gbnVsbCApIHJldHVybjtcclxuXHRcdFx0XHRcdG5vZGUuYXBwZW5kQ2hpbGQoICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIGMgKSA6IGMgKTtcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG5vZGU7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCdWlsZCBhIHRvZ2dsZSBjb250cm9sIHJvdyAoY2hlY2tib3ggcmVuZGVyZWQgYXMgdG9nZ2xlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBTdHJ1Y3R1cmU6XHJcblx0XHQgKiA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yX19yb3cgaW5zcGVjdG9yX19yb3ctLXRvZ2dsZVwiPlxyXG5cdFx0ICogICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yX19jb250cm9sIHdwYmNfdWlfX3RvZ2dsZVwiPlxyXG5cdFx0ICogICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIklEXCIgZGF0YS1pbnNwZWN0b3Ita2V5PVwiS0VZXCIgY2xhc3M9XCJpbnNwZWN0b3JfX2lucHV0XCIgY2hlY2tlZD5cclxuXHRcdCAqICAgICA8bGFiZWwgY2xhc3M9XCJ3cGJjX3VpX190b2dnbGVfaWNvblwiICBmb3I9XCJJRFwiPjwvbGFiZWw+XHJcblx0XHQgKiAgICAgPGxhYmVsIGNsYXNzPVwid3BiY191aV9fdG9nZ2xlX2xhYmVsXCIgZm9yPVwiSURcIj5MYWJlbCB0ZXh0PC9sYWJlbD5cclxuXHRcdCAqICAgPC9kaXY+XHJcblx0XHQgKiA8L2Rpdj5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRfaWRcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tlZFxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsX3RleHRcclxuXHRcdCAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gYnVpbGRfdG9nZ2xlX3JvdyggaW5wdXRfaWQsIGtleSwgY2hlY2tlZCwgbGFiZWxfdGV4dCApIHtcclxuXHJcblx0XHRcdHZhciByb3dfZWwgICAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fcm93IGluc3BlY3Rvcl9fcm93LS10b2dnbGUnIH0gKTtcclxuXHRcdFx0dmFyIGN0cmxfd3JhcCA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnaW5zcGVjdG9yX19jb250cm9sIHdwYmNfdWlfX3RvZ2dsZScgfSApO1xyXG5cclxuXHRcdFx0dmFyIGlucHV0X2VsID0gZWwoICdpbnB1dCcsIHtcclxuXHRcdFx0XHRpZCAgICAgICAgICAgICAgICAgIDogaW5wdXRfaWQsXHJcblx0XHRcdFx0dHlwZSAgICAgICAgICAgICAgICA6ICdjaGVja2JveCcsXHJcblx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSxcclxuXHRcdFx0XHQnY2xhc3MnICAgICAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnLFxyXG5cdFx0XHRcdGNoZWNrZWQgICAgICAgICAgICAgOiAhIWNoZWNrZWQsXHJcblx0XHRcdFx0cm9sZSAgICAgICAgICAgICAgICA6ICdzd2l0Y2gnLFxyXG5cdFx0XHRcdCdhcmlhLWNoZWNrZWQnICAgICAgOiAhIWNoZWNrZWRcclxuXHRcdFx0fSApO1xyXG5cdFx0XHR2YXIgaWNvbl9sYmwgPSBlbCggJ2xhYmVsJywgeyAnY2xhc3MnOiAnd3BiY191aV9fdG9nZ2xlX2ljb24nLCAnZm9yJzogaW5wdXRfaWQgfSApO1xyXG5cdFx0XHR2YXIgdGV4dF9sYmwgPSBlbCggJ2xhYmVsJywgeyAnY2xhc3MnOiAnd3BiY191aV9fdG9nZ2xlX2xhYmVsJywgJ2Zvcic6IGlucHV0X2lkIH0sIGxhYmVsX3RleHQgfHwgJycgKTtcclxuXHJcblx0XHRcdGN0cmxfd3JhcC5hcHBlbmRDaGlsZCggaW5wdXRfZWwgKTtcclxuXHRcdFx0Y3RybF93cmFwLmFwcGVuZENoaWxkKCBpY29uX2xibCApO1xyXG5cdFx0XHRjdHJsX3dyYXAuYXBwZW5kQ2hpbGQoIHRleHRfbGJsICk7XHJcblxyXG5cdFx0XHRyb3dfZWwuYXBwZW5kQ2hpbGQoIGN0cmxfd3JhcCApO1xyXG5cdFx0XHRyZXR1cm4gcm93X2VsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdCAqIFV0aWxpdHk6IGNob29zZSBpbml0aWFsIHZhbHVlIGZyb20gZGF0YSBvciBzY2hlbWEgZGVmYXVsdC5cclxuXHQgKi9cclxuXHRcdGZ1bmN0aW9uIGdldF9pbml0aWFsX3ZhbHVlKGtleSwgZGF0YSwgcHJvcHNfc2NoZW1hKSB7XHJcblx0XHRcdGlmICggZGF0YSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGRhdGEsIGtleSApICkgcmV0dXJuIGRhdGFba2V5XTtcclxuXHRcdFx0dmFyIG1ldGEgPSBwcm9wc19zY2hlbWEgJiYgcHJvcHNfc2NoZW1hW2tleV07XHJcblx0XHRcdHJldHVybiAobWV0YSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIG1ldGEsICdkZWZhdWx0JyApKSA/IG1ldGEuZGVmYXVsdCA6ICcnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdCAqIFV0aWxpdHk6IGNvZXJjZSB2YWx1ZSBieSBzY2hlbWEgdHlwZS5cclxuXHQgKi9cclxuXHJcblxyXG5cdFx0ZnVuY3Rpb24gY29lcmNlX2J5X3R5cGUodmFsdWUsIHR5cGUpIHtcclxuXHRcdFx0c3dpdGNoICggdHlwZSApIHtcclxuXHRcdFx0XHRjYXNlICdudW1iZXInOlxyXG5cdFx0XHRcdGNhc2UgJ2ludCc6XHJcblx0XHRcdFx0Y2FzZSAnZmxvYXQnOlxyXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dmFyIG4gPSBOdW1iZXIoIHZhbHVlICk7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXNOYU4oIG4gKSA/ICcnIDogbjtcclxuXHRcdFx0XHRjYXNlICdib29sZWFuJzpcclxuXHRcdFx0XHRcdHJldHVybiAhIXZhbHVlO1xyXG5cdFx0XHRcdGNhc2UgJ2FycmF5JzpcclxuXHRcdFx0XHRcdHJldHVybiBBcnJheS5pc0FycmF5KCB2YWx1ZSApID8gdmFsdWUgOiBbXTtcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0cmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICcnIDogU3RyaW5nKCB2YWx1ZSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0ICogTm9ybWFsaXplIDxzZWxlY3Q+IG9wdGlvbnMgKGFycmF5IG9mIHt2YWx1ZSxsYWJlbH0gb3IgbWFwIHt2YWx1ZTpsYWJlbH0pLlxyXG5cdCAqL1xyXG5cdFx0ZnVuY3Rpb24gbm9ybWFsaXplX3NlbGVjdF9vcHRpb25zKG9wdGlvbnMpIHtcclxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvcHRpb25zICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG9wdGlvbnMubWFwKCBmdW5jdGlvbiAobykge1xyXG5cdFx0XHRcdFx0aWYgKCB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgbyAmJiAndmFsdWUnIGluIG8gKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB7IHZhbHVlOiBTdHJpbmcoIG8udmFsdWUgKSwgbGFiZWw6IFN0cmluZyggby5sYWJlbCB8fCBvLnZhbHVlICkgfTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiB7IHZhbHVlOiBTdHJpbmcoIG8gKSwgbGFiZWw6IFN0cmluZyggbyApIH07XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKCBvcHRpb25zICkubWFwKCBmdW5jdGlvbiAoaykge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHsgdmFsdWU6IFN0cmluZyggayApLCBsYWJlbDogU3RyaW5nKCBvcHRpb25zW2tdICkgfTtcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBQYXJzZSBhIENTUyBsZW5ndGggbGlrZSBcIjEyMHB4XCIgb3IgXCI4MCVcIiBpbnRvIHsgdmFsdWU6bnVtYmVyLCB1bml0OnN0cmluZyB9LiAqL1xyXG5cdFx0ZnVuY3Rpb24gcGFyc2VfbGVuKHZhbHVlLCBmYWxsYmFja191bml0KSB7XHJcblx0XHRcdHZhbHVlID0gKHZhbHVlID09IG51bGwpID8gJycgOiBTdHJpbmcoIHZhbHVlICkudHJpbSgpO1xyXG5cdFx0XHR2YXIgbSA9IHZhbHVlLm1hdGNoKCAvXigtP1xcZCsoPzpcXC5cXGQrKT8pKHB4fCV8cmVtfGVtKSQvaSApO1xyXG5cdFx0XHRpZiAoIG0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIHsgdmFsdWU6IHBhcnNlRmxvYXQoIG1bMV0gKSwgdW5pdDogbVsyXS50b0xvd2VyQ2FzZSgpIH07XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gcGxhaW4gbnVtYmVyIC0+IGFzc3VtZSBmYWxsYmFjayB1bml0XHJcblx0XHRcdGlmICggdmFsdWUgIT09ICcnICYmICFpc05hTiggTnVtYmVyKCB2YWx1ZSApICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHsgdmFsdWU6IE51bWJlciggdmFsdWUgKSwgdW5pdDogKGZhbGxiYWNrX3VuaXQgfHwgJ3B4JykgfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4geyB2YWx1ZTogMCwgdW5pdDogKGZhbGxiYWNrX3VuaXQgfHwgJ3B4JykgfTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiogQ2xhbXAgaGVscGVyLiAqL1xyXG5cdFx0ZnVuY3Rpb24gY2xhbXBfbnVtKHYsIG1pbiwgbWF4KSB7XHJcblx0XHRcdGlmICggdHlwZW9mIHYgIT09ICdudW1iZXInIHx8IGlzTmFOKCB2ICkgKSByZXR1cm4gKG1pbiAhPSBudWxsID8gbWluIDogMCk7XHJcblx0XHRcdGlmICggbWluICE9IG51bGwgJiYgdiA8IG1pbiApIHYgPSBtaW47XHJcblx0XHRcdGlmICggbWF4ICE9IG51bGwgJiYgdiA+IG1heCApIHYgPSBtYXg7XHJcblx0XHRcdHJldHVybiB2O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEluaXRpYWxpemUgQ29sb3JpcyBwaWNrZXJzIGluIGEgZ2l2ZW4gcm9vdC5cclxuXHRcdC8vIFJlbGllcyBvbiBDb2xvcmlzIGJlaW5nIGVucXVldWVkIChzZWUgYmZiLWJvb3RzdHJhcC5waHApLlxyXG5cdFx0ZnVuY3Rpb24gaW5pdF9jb2xvcmlzX3BpY2tlcnMocm9vdCkge1xyXG5cdFx0XHRpZiAoICFyb290IHx8ICF3LkNvbG9yaXMgKSByZXR1cm47XHJcblx0XHRcdC8vIE1hcmsgaW5wdXRzIHdlIHdhbnQgQ29sb3JpcyB0byBoYW5kbGUuXHJcblx0XHRcdHZhciBpbnB1dHMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoICdpbnB1dFtkYXRhLWluc3BlY3Rvci10eXBlPVwiY29sb3JcIl0nICk7XHJcblx0XHRcdGlmICggIWlucHV0cy5sZW5ndGggKSByZXR1cm47XHJcblxyXG5cdFx0XHQvLyBBZGQgYSBzdGFibGUgY2xhc3MgZm9yIENvbG9yaXMgdGFyZ2V0aW5nOyBhdm9pZCBkb3VibGUtaW5pdGlhbGl6aW5nLlxyXG5cdFx0XHRpbnB1dHMuZm9yRWFjaCggZnVuY3Rpb24gKGlucHV0KSB7XHJcblx0XHRcdFx0aWYgKCBpbnB1dC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9jb2xvcmlzJyApICkgcmV0dXJuO1xyXG5cdFx0XHRcdGlucHV0LmNsYXNzTGlzdC5hZGQoICd3cGJjX2JmYl9jb2xvcmlzJyApO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBDcmVhdGUvcmVmcmVzaCBhIENvbG9yaXMgaW5zdGFuY2UgYm91bmQgdG8gdGhlc2UgaW5wdXRzLlxyXG5cdFx0XHQvLyBLZWVwIEhFWCBvdXRwdXQgdG8gbWF0Y2ggc2NoZW1hIGRlZmF1bHRzIChlLmcuLCBcIiNlMGUwZTBcIikuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dy5Db2xvcmlzKCB7XHJcblx0XHRcdFx0XHRlbCAgICAgICA6ICcud3BiY19iZmJfY29sb3JpcycsXHJcblx0XHRcdFx0XHRhbHBoYSAgICA6IGZhbHNlLFxyXG5cdFx0XHRcdFx0Zm9ybWF0ICAgOiAnaGV4JyxcclxuXHRcdFx0XHRcdHRoZW1lTW9kZTogJ2F1dG8nXHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdC8vIENvbG9yaXMgYWxyZWFkeSBkaXNwYXRjaGVzICdpbnB1dCcgZXZlbnRzIG9uIHZhbHVlIGNoYW5nZXMuXHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdC8vIE5vbi1mYXRhbDogaWYgQ29sb3JpcyB0aHJvd3MgKHJhcmUpLCB0aGUgdGV4dCBpbnB1dCBzdGlsbCB3b3Jrcy5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdXUEJDIEluc3BlY3RvcjogQ29sb3JpcyBpbml0IGZhaWxlZDonLCBlICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkOiBzbGlkZXIgKyBudW1iZXIgaW4gb25lIHJvdyAod3JpdGVzIHRvIGEgc2luZ2xlIGRhdGEga2V5KS5cclxuXHRcdCAqIENvbnRyb2wgbWV0YTogeyB0eXBlOidyYW5nZV9udW1iZXInLCBrZXksIGxhYmVsLCBtaW4sIG1heCwgc3RlcCB9XHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIGJ1aWxkX3JhbmdlX251bWJlcl9yb3coaW5wdXRfaWQsIGtleSwgbGFiZWxfdGV4dCwgdmFsdWUsIG1ldGEpIHtcclxuXHRcdFx0dmFyIHJvd19lbCAgID0gZWwoJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fcm93JyB9KTtcclxuXHRcdFx0dmFyIGxhYmVsX2VsID0gZWwoJ2xhYmVsJywgeyAnZm9yJzogaW5wdXRfaWQsICdjbGFzcyc6ICdpbnNwZWN0b3JfX2xhYmVsJyB9LCBsYWJlbF90ZXh0IHx8IGtleSB8fCAnJyk7XHJcblx0XHRcdHZhciBjdHJsICAgICA9IGVsKCdkaXYnLCB7ICdjbGFzcyc6ICdpbnNwZWN0b3JfX2NvbnRyb2wnIH0pO1xyXG5cclxuXHRcdFx0dmFyIG1pbiAgPSAobWV0YSAmJiBtZXRhLm1pbiAhPSBudWxsKSAgPyBtZXRhLm1pbiAgOiAwO1xyXG5cdFx0XHR2YXIgbWF4ICA9IChtZXRhICYmIG1ldGEubWF4ICE9IG51bGwpICA/IG1ldGEubWF4ICA6IDEwMDtcclxuXHRcdFx0dmFyIHN0ZXAgPSAobWV0YSAmJiBtZXRhLnN0ZXAgIT0gbnVsbCkgPyBtZXRhLnN0ZXAgOiAxO1xyXG5cclxuXHRcdFx0dmFyIGdyb3VwID0gZWwoJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfbGVuX2dyb3VwIHdwYmNfaW5saW5lX2lucHV0cycsICdkYXRhLWxlbi1ncm91cCc6IGtleSB9KTtcclxuXHJcblx0XHRcdHZhciByYW5nZSA9IGVsKCdpbnB1dCcsIHtcclxuXHRcdFx0XHR0eXBlIDogJ3JhbmdlJyxcclxuXHRcdFx0XHQnY2xhc3MnOiAnaW5zcGVjdG9yX19pbnB1dCcsXHJcblx0XHRcdFx0J2RhdGEtbGVuLXJhbmdlJzogJycsXHJcblx0XHRcdFx0bWluICA6IFN0cmluZyhtaW4pLFxyXG5cdFx0XHRcdG1heCAgOiBTdHJpbmcobWF4KSxcclxuXHRcdFx0XHRzdGVwIDogU3RyaW5nKHN0ZXApLFxyXG5cdFx0XHRcdHZhbHVlOiBTdHJpbmcodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgPyBtaW4gOiB2YWx1ZSlcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR2YXIgbnVtID0gZWwoJ2lucHV0Jywge1xyXG5cdFx0XHRcdGlkICAgOiBpbnB1dF9pZCxcclxuXHRcdFx0XHR0eXBlIDogJ251bWJlcicsXHJcblx0XHRcdFx0J2NsYXNzJzogJ2luc3BlY3Rvcl9faW5wdXQgaW5zcGVjdG9yX193XzMwJyxcclxuXHRcdFx0XHQnZGF0YS1sZW4tdmFsdWUnOiAnJyxcclxuXHRcdFx0XHQnZGF0YS1pbnNwZWN0b3Ita2V5Jzoga2V5LFxyXG5cdFx0XHRcdG1pbiAgOiBTdHJpbmcobWluKSxcclxuXHRcdFx0XHRtYXggIDogU3RyaW5nKG1heCksXHJcblx0XHRcdFx0c3RlcCA6IFN0cmluZyhzdGVwKSxcclxuXHRcdFx0XHR2YWx1ZTogKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSA/IFN0cmluZyhtaW4pIDogU3RyaW5nKHZhbHVlKVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGdyb3VwLmFwcGVuZENoaWxkKHJhbmdlKTtcclxuXHRcdFx0Z3JvdXAuYXBwZW5kQ2hpbGQobnVtKTtcclxuXHRcdFx0Y3RybC5hcHBlbmRDaGlsZChncm91cCk7XHJcblx0XHRcdHJvd19lbC5hcHBlbmRDaGlsZChsYWJlbF9lbCk7XHJcblx0XHRcdHJvd19lbC5hcHBlbmRDaGlsZChjdHJsKTtcclxuXHRcdFx0cmV0dXJuIHJvd19lbDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkOiAobnVtYmVyICsgdW5pdCkgKyBzbGlkZXIsIHdyaXRpbmcgYSAqc2luZ2xlKiBjb21iaW5lZCBzdHJpbmcgdG8gYGtleWAuXHJcblx0XHQgKiBDb250cm9sIG1ldGE6XHJcblx0XHQgKiB7XHJcblx0XHQgKiAgIHR5cGU6J2xlbicsIGtleSwgbGFiZWwsIHVuaXRzOlsncHgnLCclJywncmVtJywnZW0nXSxcclxuXHRcdCAqICAgc2xpZGVyOiB7IHB4OnttaW46MCxtYXg6NTEyLHN0ZXA6MX0sICclJzp7bWluOjAsbWF4OjEwMCxzdGVwOjF9LCByZW06e21pbjowLG1heDoxMCxzdGVwOjAuMX0sIGVtOnsuLi59IH0sXHJcblx0XHQgKiAgIGZhbGxiYWNrX3VuaXQ6J3B4J1xyXG5cdFx0ICogfVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiBidWlsZF9sZW5fY29tcG91bmRfcm93KGNvbnRyb2wsIHByb3BzX3NjaGVtYSwgZGF0YSwgdWlkKSB7XHJcblx0XHRcdHZhciBrZXkgICAgICAgID0gY29udHJvbC5rZXk7XHJcblx0XHRcdHZhciBsYWJlbF90ZXh0ID0gY29udHJvbC5sYWJlbCB8fCBrZXkgfHwgJyc7XHJcblx0XHRcdHZhciBkZWZfc3RyICAgID0gZ2V0X2luaXRpYWxfdmFsdWUoIGtleSwgZGF0YSwgcHJvcHNfc2NoZW1hICk7XHJcblx0XHRcdHZhciBmYWxsYmFja191ID0gY29udHJvbC5mYWxsYmFja191bml0IHx8ICdweCc7XHJcblx0XHRcdHZhciBwYXJzZWQgICAgID0gcGFyc2VfbGVuKCBkZWZfc3RyLCBmYWxsYmFja191ICk7XHJcblxyXG5cdFx0XHR2YXIgcm93ICAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fcm93JyB9ICk7XHJcblx0XHRcdHZhciBsYWJlbCA9IGVsKCAnbGFiZWwnLCB7ICdjbGFzcyc6ICdpbnNwZWN0b3JfX2xhYmVsJyB9LCBsYWJlbF90ZXh0ICk7XHJcblx0XHRcdHZhciBjdHJsICA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnaW5zcGVjdG9yX19jb250cm9sJyB9ICk7XHJcblxyXG5cdFx0XHR2YXIgdW5pdHMgICAgICA9IEFycmF5LmlzQXJyYXkoIGNvbnRyb2wudW5pdHMgKSAmJiBjb250cm9sLnVuaXRzLmxlbmd0aCA/IGNvbnRyb2wudW5pdHMgOiBbICdweCcsICclJywgJ3JlbScsICdlbScgXTtcclxuXHRcdFx0dmFyIHNsaWRlcl9tYXAgPSBjb250cm9sLnNsaWRlciB8fCB7XHJcblx0XHRcdFx0J3B4JyA6IHsgbWluOiAwLCBtYXg6IDUxMiwgc3RlcDogMSB9LFxyXG5cdFx0XHRcdCclJyAgOiB7IG1pbjogMCwgbWF4OiAxMDAsIHN0ZXA6IDEgfSxcclxuXHRcdFx0XHQncmVtJzogeyBtaW46IDAsIG1heDogMTAsIHN0ZXA6IDAuMSB9LFxyXG5cdFx0XHRcdCdlbScgOiB7IG1pbjogMCwgbWF4OiAxMCwgc3RlcDogMC4xIH1cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdC8vIEhvc3Qgd2l0aCBhIGhpZGRlbiBpbnB1dCB0aGF0IGNhcnJpZXMgZGF0YS1pbnNwZWN0b3Ita2V5IHRvIHJldXNlIHRoZSBzdGFuZGFyZCBoYW5kbGVyLlxyXG5cdFx0XHR2YXIgZ3JvdXAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfbGVuX2dyb3VwJywgJ2RhdGEtbGVuLWdyb3VwJzoga2V5IH0gKTtcclxuXHJcblx0XHRcdHZhciBpbmxpbmUgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfaW5saW5lX2lucHV0cycgfSApO1xyXG5cclxuXHRcdFx0dmFyIG51bSA9IGVsKCAnaW5wdXQnLCB7XHJcblx0XHRcdFx0dHlwZSAgICAgICAgICAgIDogJ251bWJlcicsXHJcblx0XHRcdFx0J2NsYXNzJyAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnLFxyXG5cdFx0XHRcdCdkYXRhLWxlbi12YWx1ZSc6ICcnLFxyXG5cdFx0XHRcdG1pbiAgICAgICAgICAgICA6ICcwJyxcclxuXHRcdFx0XHRzdGVwICAgICAgICAgICAgOiAnYW55JyxcclxuXHRcdFx0XHR2YWx1ZSAgICAgICAgICAgOiBTdHJpbmcoIHBhcnNlZC52YWx1ZSApXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHZhciBzZWwgPSBlbCggJ3NlbGVjdCcsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9faW5wdXQnLCAnZGF0YS1sZW4tdW5pdCc6ICcnIH0gKTtcclxuXHRcdFx0dW5pdHMuZm9yRWFjaCggZnVuY3Rpb24gKHUpIHtcclxuXHRcdFx0XHR2YXIgb3B0ID0gZWwoICdvcHRpb24nLCB7IHZhbHVlOiB1IH0sIHUgKTtcclxuXHRcdFx0XHRpZiAoIHUgPT09IHBhcnNlZC51bml0ICkgb3B0LnNldEF0dHJpYnV0ZSggJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyApO1xyXG5cdFx0XHRcdHNlbC5hcHBlbmRDaGlsZCggb3B0ICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGlubGluZS5hcHBlbmRDaGlsZCggbnVtICk7XHJcblx0XHRcdGlubGluZS5hcHBlbmRDaGlsZCggc2VsICk7XHJcblxyXG5cdFx0XHQvLyBTbGlkZXIgKHVuaXQtYXdhcmUpXHJcblx0XHRcdHZhciBjdXJyZW50ID0gc2xpZGVyX21hcFtwYXJzZWQudW5pdF0gfHwgc2xpZGVyX21hcFt1bml0c1swXV07XHJcblx0XHRcdHZhciByYW5nZSAgID0gZWwoICdpbnB1dCcsIHtcclxuXHRcdFx0XHR0eXBlICAgICAgICAgICAgOiAncmFuZ2UnLFxyXG5cdFx0XHRcdCdjbGFzcycgICAgICAgICA6ICdpbnNwZWN0b3JfX2lucHV0JyxcclxuXHRcdFx0XHQnZGF0YS1sZW4tcmFuZ2UnOiAnJyxcclxuXHRcdFx0XHRtaW4gICAgICAgICAgICAgOiBTdHJpbmcoIGN1cnJlbnQubWluICksXHJcblx0XHRcdFx0bWF4ICAgICAgICAgICAgIDogU3RyaW5nKCBjdXJyZW50Lm1heCApLFxyXG5cdFx0XHRcdHN0ZXAgICAgICAgICAgICA6IFN0cmluZyggY3VycmVudC5zdGVwICksXHJcblx0XHRcdFx0dmFsdWUgICAgICAgICAgIDogU3RyaW5nKCBjbGFtcF9udW0oIHBhcnNlZC52YWx1ZSwgY3VycmVudC5taW4sIGN1cnJlbnQubWF4ICkgKVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBIaWRkZW4gd3JpdGVyIGlucHV0IHRoYXQgdGhlIGRlZmF1bHQgSW5zcGVjdG9yIGhhbmRsZXIgd2lsbCBjYXRjaC5cclxuXHRcdFx0dmFyIGhpZGRlbiA9IGVsKCAnaW5wdXQnLCB7XHJcblx0XHRcdFx0dHlwZSAgICAgICAgICAgICAgICA6ICd0ZXh0JyxcclxuXHRcdFx0XHQnY2xhc3MnICAgICAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnLFxyXG5cdFx0XHRcdHN0eWxlICAgICAgICAgICAgICAgOiAnZGlzcGxheTpub25lJyxcclxuXHRcdFx0XHQnYXJpYS1oaWRkZW4nICAgICAgIDogJ3RydWUnLFxyXG5cdFx0XHRcdHRhYmluZGV4ICAgICAgICAgICAgOiAnLTEnLFxyXG5cdFx0XHRcdGlkICAgICAgICAgICAgICAgICAgOiAnd3BiY19pbnNfJyArIGtleSArICdfJyArIHVpZCArICdfbGVuX2hpZGRlbicsXHJcblx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSxcclxuXHRcdFx0XHR2YWx1ZSAgICAgICAgICAgICAgIDogKFN0cmluZyggcGFyc2VkLnZhbHVlICkgKyBwYXJzZWQudW5pdClcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Z3JvdXAuYXBwZW5kQ2hpbGQoIGlubGluZSApO1xyXG5cdFx0XHRncm91cC5hcHBlbmRDaGlsZCggcmFuZ2UgKTtcclxuXHRcdFx0Z3JvdXAuYXBwZW5kQ2hpbGQoIGhpZGRlbiApO1xyXG5cclxuXHRcdFx0Y3RybC5hcHBlbmRDaGlsZCggZ3JvdXAgKTtcclxuXHRcdFx0cm93LmFwcGVuZENoaWxkKCBsYWJlbCApO1xyXG5cdFx0XHRyb3cuYXBwZW5kQ2hpbGQoIGN0cmwgKTtcclxuXHRcdFx0cmV0dXJuIHJvdztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdpcmUgc3luY2luZyBmb3IgYW55IC53cGJjX2xlbl9ncm91cCBpbnNpZGUgYSBnaXZlbiByb290IChwYW5lbCkuXHJcblx0XHQgKiAtIHJhbmdlIOKHhCBudW1iZXIgc3luY1xyXG5cdFx0ICogLSB1bml0IHN3aXRjaGVzIHVwZGF0ZSBzbGlkZXIgYm91bmRzXHJcblx0XHQgKiAtIGhpZGRlbiB3cml0ZXIgKGlmIHByZXNlbnQpIGdldHMgdXBkYXRlZCBhbmQgZW1pdHMgJ2lucHV0J1xyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3aXJlX2xlbl9ncm91cChyb290KSB7XHJcblx0XHRcdGlmICggIXJvb3QgKSByZXR1cm47XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBmaW5kX2dyb3VwKGVsKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsICYmIGVsLmNsb3Nlc3QgJiYgZWwuY2xvc2VzdCggJy53cGJjX2xlbl9ncm91cCcgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cm9vdC5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXQnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdHZhciB0ID0gZS50YXJnZXQ7XHJcblx0XHRcdFx0Ly8gU2xpZGVyIG1vdmVkIC0+IHVwZGF0ZSBudW1iZXIgKGFuZCB3cml0ZXIvaGlkZGVuKVxyXG5cdFx0XHRcdGlmICggdCAmJiB0Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtbGVuLXJhbmdlJyApICkge1xyXG5cdFx0XHRcdFx0dmFyIGcgPSBmaW5kX2dyb3VwKCB0ICk7XHJcblx0XHRcdFx0XHRpZiAoICFnICkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0dmFyIG51bSA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi12YWx1ZV0nICk7XHJcblx0XHRcdFx0XHRpZiAoIG51bSApIHtcclxuXHRcdFx0XHRcdFx0bnVtLnZhbHVlID0gdC52YWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHZhciB3cml0ZXIgPSBnLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1pbnNwZWN0b3Ita2V5XScgKTtcclxuXHRcdFx0XHRcdGlmICggd3JpdGVyICYmIHdyaXRlci50eXBlID09PSAndGV4dCcgKSB7XHJcblx0XHRcdFx0XHRcdHZhciB1bml0ICAgICA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi11bml0XScgKTtcclxuXHRcdFx0XHRcdFx0dW5pdCAgICAgICAgID0gdW5pdCA/IHVuaXQudmFsdWUgOiAncHgnO1xyXG5cdFx0XHRcdFx0XHR3cml0ZXIudmFsdWUgPSBTdHJpbmcoIHQudmFsdWUgKSArIFN0cmluZyggdW5pdCApO1xyXG5cdFx0XHRcdFx0XHQvLyB0cmlnZ2VyIHN0YW5kYXJkIGluc3BlY3RvciBoYW5kbGVyOlxyXG5cdFx0XHRcdFx0XHR3cml0ZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBQbGFpbiByYW5nZV9udW1iZXIgY2FzZSAobnVtYmVyIGhhcyBkYXRhLWluc3BlY3Rvci1rZXkpIC0+IGZpcmUgaW5wdXQgb24gbnVtYmVyXHJcblx0XHRcdFx0XHRcdGlmICggbnVtICYmIG51bS5oYXNBdHRyaWJ1dGUoICdkYXRhLWluc3BlY3Rvci1rZXknICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0bnVtLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0gKSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBOdW1iZXIgdHlwZWQgLT4gdXBkYXRlIHNsaWRlciBhbmQgd3JpdGVyL2hpZGRlblxyXG5cdFx0XHRcdGlmICggdCAmJiB0Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtbGVuLXZhbHVlJyApICkge1xyXG5cdFx0XHRcdFx0dmFyIGcgPSBmaW5kX2dyb3VwKCB0ICk7XHJcblx0XHRcdFx0XHRpZiAoICFnICkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0dmFyIHIgPSBnLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1sZW4tcmFuZ2VdJyApO1xyXG5cdFx0XHRcdFx0aWYgKCByICkge1xyXG5cdFx0XHRcdFx0XHQvLyBjbGFtcCB3aXRoaW4gc2xpZGVyIGJvdW5kcyBpZiBwcmVzZW50XHJcblx0XHRcdFx0XHRcdHZhciBtaW4gPSBOdW1iZXIoIHIubWluICk7XHJcblx0XHRcdFx0XHRcdHZhciBtYXggPSBOdW1iZXIoIHIubWF4ICk7XHJcblx0XHRcdFx0XHRcdHZhciB2ICAgPSBOdW1iZXIoIHQudmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCAhaXNOYU4oIHYgKSApIHtcclxuXHRcdFx0XHRcdFx0XHR2ICAgICAgID0gY2xhbXBfbnVtKCB2LCBpc05hTiggbWluICkgPyB1bmRlZmluZWQgOiBtaW4sIGlzTmFOKCBtYXggKSA/IHVuZGVmaW5lZCA6IG1heCApO1xyXG5cdFx0XHRcdFx0XHRcdHIudmFsdWUgPSBTdHJpbmcoIHYgKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIFN0cmluZyggdiApICE9PSB0LnZhbHVlICkgdC52YWx1ZSA9IFN0cmluZyggdiApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR2YXIgd3JpdGVyID0gZy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtaW5zcGVjdG9yLWtleV0nICk7XHJcblx0XHRcdFx0XHRpZiAoIHdyaXRlciAmJiB3cml0ZXIudHlwZSA9PT0gJ3RleHQnICkge1xyXG5cdFx0XHRcdFx0XHR2YXIgdW5pdCAgICAgPSBnLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1sZW4tdW5pdF0nICk7XHJcblx0XHRcdFx0XHRcdHVuaXQgICAgICAgICA9IHVuaXQgPyB1bml0LnZhbHVlIDogJ3B4JztcclxuXHRcdFx0XHRcdFx0d3JpdGVyLnZhbHVlID0gU3RyaW5nKCB0LnZhbHVlIHx8IDAgKSArIFN0cmluZyggdW5pdCApO1xyXG5cdFx0XHRcdFx0XHR3cml0ZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBlbHNlOiBudW1iZXIgaXRzZWxmIGxpa2VseSBjYXJyaWVzIGRhdGEtaW5zcGVjdG9yLWtleSAocmFuZ2VfbnVtYmVyKTsgZGVmYXVsdCBoYW5kbGVyIHdpbGwgcnVuLlxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSwgdHJ1ZSApO1xyXG5cclxuXHRcdFx0cm9vdC5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHR2YXIgdCA9IGUudGFyZ2V0O1xyXG5cdFx0XHRcdC8vIFVuaXQgY2hhbmdlZCAtPiB1cGRhdGUgc2xpZGVyIGxpbWl0cyBhbmQgd3JpdGVyL2hpZGRlblxyXG5cdFx0XHRcdGlmICggdCAmJiB0Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtbGVuLXVuaXQnICkgKSB7XHJcblx0XHRcdFx0XHR2YXIgZyA9IGZpbmRfZ3JvdXAoIHQgKTtcclxuXHRcdFx0XHRcdGlmICggIWcgKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0Ly8gRmluZCB0aGUgY29udHJvbCBtZXRhIHZpYSBhIGRhdGEgYXR0cmlidXRlIG9uIGdyb3VwIGlmIHByb3ZpZGVkXHJcblx0XHRcdFx0XHQvLyAoRmFjdG9yeSBwYXRoIHNldHMgbm90aGluZyBoZXJlOyB3ZSByZS1kZXJpdmUgZnJvbSBjdXJyZW50IHNsaWRlciBib3VuZHMuKVxyXG5cdFx0XHRcdFx0dmFyIHIgICAgICA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi1yYW5nZV0nICk7XHJcblx0XHRcdFx0XHR2YXIgbnVtICAgID0gZy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtbGVuLXZhbHVlXScgKTtcclxuXHRcdFx0XHRcdHZhciB3cml0ZXIgPSBnLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1pbnNwZWN0b3Ita2V5XScgKTtcclxuXHRcdFx0XHRcdHZhciB1bml0ICAgPSB0LnZhbHVlIHx8ICdweCc7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWRqdXN0IHNsaWRlciBib3VuZHMgaGV1cmlzdGljYWxseSAobWF0Y2ggRmFjdG9yeSBkZWZhdWx0cylcclxuXHRcdFx0XHRcdHZhciBib3VuZHNfYnlfdW5pdCA9IHtcclxuXHRcdFx0XHRcdFx0J3B4JyA6IHsgbWluOiAwLCBtYXg6IDUxMiwgc3RlcDogMSB9LFxyXG5cdFx0XHRcdFx0XHQnJScgIDogeyBtaW46IDAsIG1heDogMTAwLCBzdGVwOiAxIH0sXHJcblx0XHRcdFx0XHRcdCdyZW0nOiB7IG1pbjogMCwgbWF4OiAxMCwgc3RlcDogMC4xIH0sXHJcblx0XHRcdFx0XHRcdCdlbScgOiB7IG1pbjogMCwgbWF4OiAxMCwgc3RlcDogMC4xIH1cclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRpZiAoIHIgKSB7XHJcblx0XHRcdFx0XHRcdHZhciBiICA9IGJvdW5kc19ieV91bml0W3VuaXRdIHx8IGJvdW5kc19ieV91bml0WydweCddO1xyXG5cdFx0XHRcdFx0XHRyLm1pbiAgPSBTdHJpbmcoIGIubWluICk7XHJcblx0XHRcdFx0XHRcdHIubWF4ICA9IFN0cmluZyggYi5tYXggKTtcclxuXHRcdFx0XHRcdFx0ci5zdGVwID0gU3RyaW5nKCBiLnN0ZXAgKTtcclxuXHRcdFx0XHRcdFx0Ly8gY2xhbXAgdG8gbmV3IGJvdW5kc1xyXG5cdFx0XHRcdFx0XHR2YXIgdiAgPSBOdW1iZXIoIG51bSAmJiBudW0udmFsdWUgPyBudW0udmFsdWUgOiByLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGlmICggIWlzTmFOKCB2ICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0diAgICAgICA9IGNsYW1wX251bSggdiwgYi5taW4sIGIubWF4ICk7XHJcblx0XHRcdFx0XHRcdFx0ci52YWx1ZSA9IFN0cmluZyggdiApO1xyXG5cdFx0XHRcdFx0XHRcdGlmICggbnVtICkgbnVtLnZhbHVlID0gU3RyaW5nKCB2ICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICggd3JpdGVyICYmIHdyaXRlci50eXBlID09PSAndGV4dCcgKSB7XHJcblx0XHRcdFx0XHRcdHZhciB2ICAgICAgICA9IG51bSAmJiBudW0udmFsdWUgPyBudW0udmFsdWUgOiAociA/IHIudmFsdWUgOiAnMCcpO1xyXG5cdFx0XHRcdFx0XHR3cml0ZXIudmFsdWUgPSBTdHJpbmcoIHYgKSArIFN0cmluZyggdW5pdCApO1xyXG5cdFx0XHRcdFx0XHR3cml0ZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LCB0cnVlICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdFx0Ly8gPT0gIEMgTyBOIFQgUiBPIEwgID09XHJcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG5cdFx0LyoqXHJcblx0ICogU2NoZW1hID4gSW5zcGVjdG9yID4gQ29udHJvbCBFbGVtZW50LCBlLmcuIElucHV0ISAgQnVpbGQgYSBzaW5nbGUgY29udHJvbCByb3c6XHJcblx0ICogPGRpdiBjbGFzcz1cImluc3BlY3Rvcl9fcm93XCI+XHJcblx0ICogICA8bGFiZWwgY2xhc3M9XCJpbnNwZWN0b3JfX2xhYmVsXCIgZm9yPVwiLi4uXCI+TGFiZWw8L2xhYmVsPlxyXG5cdCAqICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvcl9fY29udHJvbFwiPjxpbnB1dHx0ZXh0YXJlYXxzZWxlY3QgY2xhc3M9XCJpbnNwZWN0b3JfX2lucHV0XCIgLi4uPjwvZGl2PlxyXG5cdCAqIDwvZGl2PlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGNvbnRyb2wgICAgICAgICAgIC0gc2NoZW1hIGNvbnRyb2wgbWV0YSAoe3R5cGUsa2V5LGxhYmVsLC4uLn0pXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHByb3BzX3NjaGVtYSAgICAgIC0gc2NoZW1hLnByb3BzXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgICAgICAgICAgICAgIC0gY3VycmVudCBlbGVtZW50IGRhdGEtKiBtYXBcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdWlkICAgICAgICAgICAgICAgLSB1bmlxdWUgc3VmZml4IGZvciBpbnB1dCBpZHNcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY3R4ICAgICAgICAgICAgICAgLSB7IGVsLCBidWlsZGVyLCB0eXBlLCBkYXRhIH1cclxuXHQgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XHJcblx0ICovXHJcblx0XHRmdW5jdGlvbiBidWlsZF9jb250cm9sKGNvbnRyb2wsIHByb3BzX3NjaGVtYSwgZGF0YSwgdWlkLCBjdHgpIHtcclxuXHRcdFx0dmFyIHR5cGUgPSBjb250cm9sLnR5cGU7XHJcblx0XHRcdHZhciBrZXkgID0gY29udHJvbC5rZXk7XHJcblxyXG5cdFx0XHR2YXIgbGFiZWxfdGV4dCA9IGNvbnRyb2wubGFiZWwgfHwga2V5IHx8ICcnO1xyXG5cdFx0XHR2YXIgcHJvcF9tZXRhICA9IChrZXkgPyAocHJvcHNfc2NoZW1hW2tleV0gfHwgeyB0eXBlOiAnc3RyaW5nJyB9KSA6IHsgdHlwZTogJ3N0cmluZycgfSk7XHJcblx0XHRcdHZhciB2YWx1ZSAgICAgID0gY29lcmNlX2J5X3R5cGUoIGdldF9pbml0aWFsX3ZhbHVlKCBrZXksIGRhdGEsIHByb3BzX3NjaGVtYSApLCBwcm9wX21ldGEudHlwZSApO1xyXG5cdFx0Ly8gQWxsb3cgdmFsdWVfZnJvbSBvdmVycmlkZSAoY29tcHV0ZWQgYXQgcmVuZGVyLXRpbWUpLlxyXG5cdFx0aWYgKCBjb250cm9sICYmIGNvbnRyb2wudmFsdWVfZnJvbSAmJiB3LndwYmNfYmZiX2luc3BlY3Rvcl9mYWN0b3J5X3ZhbHVlX2Zyb21bY29udHJvbC52YWx1ZV9mcm9tXSApIHtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0dmFyIGNvbXB1dGVkID0gdy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV92YWx1ZV9mcm9tW2NvbnRyb2wudmFsdWVfZnJvbV0oIGN0eCB8fCB7fSApO1xyXG5cdFx0XHRcdFx0dmFsdWUgICAgICAgID0gY29lcmNlX2J5X3R5cGUoIGNvbXB1dGVkLCBwcm9wX21ldGEudHlwZSApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAndmFsdWVfZnJvbSBmYWlsZWQgZm9yJywgY29udHJvbC52YWx1ZV9mcm9tLCBlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgaW5wdXRfaWQgPSAnd3BiY19pbnNfJyArIGtleSArICdfJyArIHVpZDtcclxuXHJcblx0XHRcdHZhciByb3dfZWwgICAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fcm93JyB9ICk7XHJcblx0XHRcdHZhciBsYWJlbF9lbCAgPSBlbCggJ2xhYmVsJywgeyAnZm9yJzogaW5wdXRfaWQsICdjbGFzcyc6ICdpbnNwZWN0b3JfX2xhYmVsJyB9LCBsYWJlbF90ZXh0ICk7XHJcblx0XHRcdHZhciBjdHJsX3dyYXAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fY29udHJvbCcgfSApO1xyXG5cclxuXHRcdFx0dmFyIGZpZWxkX2VsO1xyXG5cclxuXHRcdC8vIC0tLSBzbG90IGhvc3QgKG5hbWVkIFVJIGluamVjdGlvbikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdGlmICggdHlwZSA9PT0gJ3Nsb3QnICYmIGNvbnRyb2wuc2xvdCApIHtcclxuXHRcdFx0Ly8gYWRkIGEgbWFya2VyIGNsYXNzIGZvciB0aGUgbGF5b3V0IGNoaXBzIHJvd1xyXG5cdFx0XHR2YXIgY2xhc3NlcyA9ICdpbnNwZWN0b3JfX3JvdyBpbnNwZWN0b3JfX3Jvdy0tc2xvdCc7XHJcblx0XHRcdGlmICggY29udHJvbC5zbG90ID09PSAnbGF5b3V0X2NoaXBzJyApIGNsYXNzZXMgKz0gJyBpbnNwZWN0b3JfX3Jvdy0tbGF5b3V0LWNoaXBzJztcclxuXHJcblx0XHRcdHZhciBzbG90X3JvdyA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiBjbGFzc2VzIH0gKTtcclxuXHJcblx0XHRcdGlmICggbGFiZWxfdGV4dCApIHNsb3Rfcm93LmFwcGVuZENoaWxkKCBlbCggJ2xhYmVsJywgeyAnY2xhc3MnOiAnaW5zcGVjdG9yX19sYWJlbCcgfSwgbGFiZWxfdGV4dCApICk7XHJcblxyXG5cdFx0XHQvLyBhZGQgYSBkYXRhIGF0dHJpYnV0ZSBvbiB0aGUgaG9zdCBzbyBib3RoIENTUyBhbmQgdGhlIHNhZmV0eS1uZXQgY2FuIHRhcmdldCBpdFxyXG5cdFx0XHR2YXIgaG9zdF9hdHRycyA9IHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fY29udHJvbCcgfTtcclxuXHRcdFx0aWYgKCBjb250cm9sLnNsb3QgPT09ICdsYXlvdXRfY2hpcHMnICkgaG9zdF9hdHRyc1snZGF0YS1iZmItc2xvdCddID0gJ2xheW91dF9jaGlwcyc7XHJcblxyXG5cdFx0XHR2YXIgc2xvdF9ob3N0ID0gZWwoICdkaXYnLCBob3N0X2F0dHJzICk7XHJcblx0XHRcdHNsb3Rfcm93LmFwcGVuZENoaWxkKCBzbG90X2hvc3QgKTtcclxuXHJcblx0XHRcdHZhciBzbG90X2ZuID0gdy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV9zbG90c1tjb250cm9sLnNsb3RdO1xyXG5cdFx0XHRpZiAoIHR5cGVvZiBzbG90X2ZuID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdHNsb3RfZm4oIHNsb3RfaG9zdCwgY3R4IHx8IHt9ICk7XHJcblx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnc2xvdCBcIicgKyBjb250cm9sLnNsb3QgKyAnXCIgZmFpbGVkOicsIGUgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LCAwICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2xvdF9ob3N0LmFwcGVuZENoaWxkKCBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfYmZiX19zbG90X19taXNzaW5nJyB9LCAnW3Nsb3Q6ICcgKyBjb250cm9sLnNsb3QgKyAnXScgKSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBzbG90X3JvdztcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0XHRpZiAoIHR5cGUgPT09ICd0ZXh0YXJlYScgKSB7XHJcblx0XHRcdFx0ZmllbGRfZWwgPSBlbCggJ3RleHRhcmVhJywge1xyXG5cdFx0XHRcdFx0aWQgICAgICAgICAgICAgICAgICA6IGlucHV0X2lkLFxyXG5cdFx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSxcclxuXHRcdFx0XHRcdHJvd3MgICAgICAgICAgICAgICAgOiBjb250cm9sLnJvd3MgfHwgMyxcclxuXHRcdFx0XHRcdCdjbGFzcycgICAgICAgICAgICAgOiAnaW5zcGVjdG9yX19pbnB1dCdcclxuXHRcdFx0XHR9LCAodmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKCB2YWx1ZSApKSApO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAnc2VsZWN0JyApIHtcclxuXHRcdFx0XHRmaWVsZF9lbCA9IGVsKCAnc2VsZWN0Jywge1xyXG5cdFx0XHRcdFx0aWQgICAgICAgICAgICAgICAgICA6IGlucHV0X2lkLFxyXG5cdFx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSxcclxuXHRcdFx0XHRcdCdjbGFzcycgICAgICAgICAgICAgOiAnaW5zcGVjdG9yX19pbnB1dCdcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0bm9ybWFsaXplX3NlbGVjdF9vcHRpb25zKCBjb250cm9sLm9wdGlvbnMgfHwgW10gKS5mb3JFYWNoKCBmdW5jdGlvbiAob3B0KSB7XHJcblx0XHRcdFx0XHR2YXIgb3B0X2VsID0gZWwoICdvcHRpb24nLCB7IHZhbHVlOiBvcHQudmFsdWUgfSwgb3B0LmxhYmVsICk7XHJcblx0XHRcdFx0XHRpZiAoIFN0cmluZyggdmFsdWUgKSA9PT0gb3B0LnZhbHVlICkgb3B0X2VsLnNldEF0dHJpYnV0ZSggJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyApO1xyXG5cdFx0XHRcdFx0ZmllbGRfZWwuYXBwZW5kQ2hpbGQoIG9wdF9lbCApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2NoZWNrYm94JyApIHtcclxuXHRcdFx0XHQvLyBmaWVsZF9lbCA9IGVsKCAnaW5wdXQnLCB7IGlkOiBpbnB1dF9pZCwgdHlwZTogJ2NoZWNrYm94JywgJ2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSwgY2hlY2tlZDogISF2YWx1ZSwgJ2NsYXNzJzogJ2luc3BlY3Rvcl9faW5wdXQnIH0gKTsgLy8uXHJcblxyXG5cdFx0XHRcdC8vIFJlbmRlciBhcyB0b2dnbGUgVUkgaW5zdGVhZCBvZiBsYWJlbC1sZWZ0ICsgY2hlY2tib3guICBOb3RlOiB3ZSByZXR1cm4gdGhlIGZ1bGwgdG9nZ2xlIHJvdyBoZXJlIGFuZCBza2lwIHRoZSBkZWZhdWx0IHJvdy9sYWJlbCBmbG93IGJlbG93LlxyXG5cdFx0XHRcdHJldHVybiBidWlsZF90b2dnbGVfcm93KCBpbnB1dF9pZCwga2V5LCAhIXZhbHVlLCBsYWJlbF90ZXh0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAncmFuZ2VfbnVtYmVyJyApIHtcclxuXHRcdFx0XHQvLyAtLS0gbmV3OiBzbGlkZXIgKyBudW1iZXIgKHNpbmdsZSBrZXkpLlxyXG5cdFx0XHRcdHZhciBybl9pZCAgPSAnd3BiY19pbnNfJyArIGtleSArICdfJyArIHVpZDtcclxuXHRcdFx0XHR2YXIgcm5fdmFsID0gdmFsdWU7IC8vIGZyb20gZ2V0X2luaXRpYWxfdmFsdWUvcHJvcF9tZXRhIGFscmVhZHkuXHJcblx0XHRcdFx0cmV0dXJuIGJ1aWxkX3JhbmdlX251bWJlcl9yb3coIHJuX2lkLCBrZXksIGxhYmVsX3RleHQsIHJuX3ZhbCwgY29udHJvbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2xlbicgKSB7XHJcblx0XHRcdFx0Ly8gLS0tIG5ldzogbGVuZ3RoIGNvbXBvdW5kICh2YWx1ZSt1bml0K3NsaWRlciAtPiB3cml0ZXMgYSBzaW5nbGUgc3RyaW5nIGtleSkuXHJcblx0XHRcdFx0cmV0dXJuIGJ1aWxkX2xlbl9jb21wb3VuZF9yb3coIGNvbnRyb2wsIHByb3BzX3NjaGVtYSwgZGF0YSwgdWlkICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAnY29sb3InICkge1xyXG5cdFx0XHRcdC8vIENvbG9yIHBpY2tlciAoQ29sb3JpcykuIFN0b3JlIGFzIHN0cmluZyAoZS5nLiwgXCIjZTBlMGUwXCIpLlxyXG5cdFx0XHRcdGZpZWxkX2VsID0gZWwoICdpbnB1dCcsIHtcclxuXHRcdFx0XHRcdGlkICAgICAgICAgICAgICAgICAgIDogaW5wdXRfaWQsXHJcblx0XHRcdFx0XHR0eXBlICAgICAgICAgICAgICAgICA6ICd0ZXh0JyxcclxuXHRcdFx0XHRcdCdkYXRhLWluc3BlY3Rvci1rZXknIDoga2V5LFxyXG5cdFx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLXR5cGUnOiAnY29sb3InLFxyXG5cdFx0XHRcdFx0J2RhdGEtY29sb3JpcycgICAgICAgOiAnJyxcclxuXHRcdFx0XHRcdCdjbGFzcycgICAgICAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnLFxyXG5cdFx0XHRcdFx0J2RhdGEtZGVmYXVsdC1jb2xvcicgOiAoIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnID8gU3RyaW5nKHZhbHVlKSA6IChjb250cm9sLnBsYWNlaG9sZGVyIHx8ICcnKSApXHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdGlmICggdmFsdWUgIT09ICcnICkge1xyXG5cdFx0XHRcdFx0ZmllbGRfZWwudmFsdWUgPSBTdHJpbmcoIHZhbHVlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIHRleHQvbnVtYmVyIGRlZmF1bHQuXHJcblx0XHRcdFx0dmFyIGF0dHJzID0ge1xyXG5cdFx0XHRcdFx0aWQgICAgICAgICAgICAgICAgICA6IGlucHV0X2lkLFxyXG5cdFx0XHRcdFx0dHlwZSAgICAgICAgICAgICAgICA6ICh0eXBlID09PSAnbnVtYmVyJykgPyAnbnVtYmVyJyA6ICd0ZXh0JyxcclxuXHRcdFx0XHRcdCdkYXRhLWluc3BlY3Rvci1rZXknOiBrZXksXHJcblx0XHRcdFx0XHQnY2xhc3MnICAgICAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0Ly8gbnVtYmVyIGNvbnN0cmFpbnRzIChzY2hlbWEgb3IgY29udHJvbClcclxuXHRcdFx0XHRpZiAoIHR5cGUgPT09ICdudW1iZXInICkge1xyXG5cdFx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHByb3BfbWV0YSwgJ21pbicgKSApIGF0dHJzLm1pbiA9IHByb3BfbWV0YS5taW47XHJcblx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggcHJvcF9tZXRhLCAnbWF4JyApICkgYXR0cnMubWF4ID0gcHJvcF9tZXRhLm1heDtcclxuXHRcdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBwcm9wX21ldGEsICdzdGVwJyApICkgYXR0cnMuc3RlcCA9IHByb3BfbWV0YS5zdGVwO1xyXG5cdFx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGNvbnRyb2wsICdtaW4nICkgKSBhdHRycy5taW4gPSBjb250cm9sLm1pbjtcclxuXHRcdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBjb250cm9sLCAnbWF4JyApICkgYXR0cnMubWF4ID0gY29udHJvbC5tYXg7XHJcblx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggY29udHJvbCwgJ3N0ZXAnICkgKSBhdHRycy5zdGVwID0gY29udHJvbC5zdGVwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmaWVsZF9lbCA9IGVsKCAnaW5wdXQnLCBhdHRycyApO1xyXG5cdFx0XHRcdGlmICggdmFsdWUgIT09ICcnICkgZmllbGRfZWwudmFsdWUgPSBTdHJpbmcoIHZhbHVlICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGN0cmxfd3JhcC5hcHBlbmRDaGlsZCggZmllbGRfZWwgKTtcclxuXHRcdFx0cm93X2VsLmFwcGVuZENoaWxkKCBsYWJlbF9lbCApO1xyXG5cdFx0XHRyb3dfZWwuYXBwZW5kQ2hpbGQoIGN0cmxfd3JhcCApO1xyXG5cdFx0XHRyZXR1cm4gcm93X2VsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2NoZW1hID4gSW5zcGVjdG9yID4gR3JvdXBzISBCdWlsZCBhbiBpbnNwZWN0b3IgZ3JvdXAgKGNvbGxhcHNpYmxlKS5cclxuXHRcdCAqIFN0cnVjdHVyZTpcclxuXHRcdCAqIDxzZWN0aW9uIGNsYXNzPVwid3BiY19iZmJfX2luc3BlY3Rvcl9fZ3JvdXAgd3BiY191aV9fY29sbGFwc2libGVfZ3JvdXAgaXMtb3BlblwiIGRhdGEtZ3JvdXA9XCIuLi5cIj5cclxuXHRcdCAqICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cF9faGVhZGVyXCIgcm9sZT1cImJ1dHRvblwiIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cIndwYmNfY29sbGFwc2libGVfcGFuZWxfWFwiPlxyXG5cdFx0ICogICAgIDxoMz5Hcm91cCBUaXRsZTwvaDM+XHJcblx0XHQgKiAgICAgPGkgY2xhc3M9XCJ3cGJjX3VpX2VsX192ZXJ0X21lbnVfcm9vdF9zZWN0aW9uX2ljb24gbWVudV9pY29uIGljb24tMXggd3BiYy1iaS1jaGV2cm9uLXJpZ2h0XCI+PC9pPlxyXG5cdFx0ICogICA8L2J1dHRvbj5cclxuXHRcdCAqICAgPGRpdiBjbGFzcz1cImdyb3VwX19maWVsZHNcIiBpZD1cIndwYmNfY29sbGFwc2libGVfcGFuZWxfWFwiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIj4g4oCmcm93c+KApiA8L2Rpdj5cclxuXHRcdCAqIDwvc2VjdGlvbj5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZ3JvdXBcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc19zY2hlbWFcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdWlkXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gY3R4XHJcblx0XHQgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIGJ1aWxkX2dyb3VwKGdyb3VwLCBwcm9wc19zY2hlbWEsIGRhdGEsIHVpZCwgY3R4KSB7XHJcblx0XHRcdHZhciBpc19vcGVuICA9ICEhZ3JvdXAub3BlbjtcclxuXHRcdFx0dmFyIHBhbmVsX2lkID0gJ3dwYmNfY29sbGFwc2libGVfcGFuZWxfJyArIHVpZCArICdfJyArIChncm91cC5rZXkgfHwgJ2cnKTtcclxuXHJcblx0XHRcdHZhciBzZWN0aW9uID0gZWwoICdzZWN0aW9uJywge1xyXG5cdFx0XHRcdCdjbGFzcycgICAgIDogJ3dwYmNfYmZiX19pbnNwZWN0b3JfX2dyb3VwIHdwYmNfdWlfX2NvbGxhcHNpYmxlX2dyb3VwJyArIChpc19vcGVuID8gJyBpcy1vcGVuJyA6ICcnKSxcclxuXHRcdFx0XHQnZGF0YS1ncm91cCc6IGdyb3VwLmtleSB8fCAnJ1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR2YXIgaGVhZGVyX2J0biA9IGVsKCAnYnV0dG9uJywge1xyXG5cdFx0XHRcdHR5cGUgICAgICAgICAgIDogJ2J1dHRvbicsXHJcblx0XHRcdFx0J2NsYXNzJyAgICAgICAgOiAnZ3JvdXBfX2hlYWRlcicsXHJcblx0XHRcdFx0cm9sZSAgICAgICAgICAgOiAnYnV0dG9uJyxcclxuXHRcdFx0XHQnYXJpYS1leHBhbmRlZCc6IGlzX29wZW4gPyAndHJ1ZScgOiAnZmFsc2UnLFxyXG5cdFx0XHRcdCdhcmlhLWNvbnRyb2xzJzogcGFuZWxfaWRcclxuXHRcdFx0fSwgW1xyXG5cdFx0XHRcdGVsKCAnaDMnLCBudWxsLCBncm91cC50aXRsZSB8fCBncm91cC5sYWJlbCB8fCBncm91cC5rZXkgfHwgJycgKSxcclxuXHRcdFx0XHRlbCggJ2knLCB7ICdjbGFzcyc6ICd3cGJjX3VpX2VsX192ZXJ0X21lbnVfcm9vdF9zZWN0aW9uX2ljb24gbWVudV9pY29uIGljb24tMXggd3BiYy1iaS1jaGV2cm9uLXJpZ2h0JyB9IClcclxuXHRcdFx0XSApO1xyXG5cclxuXHRcdFx0dmFyIGZpZWxkcyA9IGVsKCAnZGl2Jywge1xyXG5cdFx0XHRcdCdjbGFzcycgICAgICA6ICdncm91cF9fZmllbGRzJyxcclxuXHRcdFx0XHRpZCAgICAgICAgICAgOiBwYW5lbF9pZCxcclxuXHRcdFx0XHQnYXJpYS1oaWRkZW4nOiBpc19vcGVuID8gJ2ZhbHNlJyA6ICd0cnVlJ1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBhc0FycmF5KHgpIHtcclxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHggKSApIHJldHVybiB4O1xyXG5cdFx0XHRcdGlmICggeCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgKSByZXR1cm4gT2JqZWN0LnZhbHVlcyggeCApO1xyXG5cdFx0XHRcdHJldHVybiB4ICE9IG51bGwgPyBbIHggXSA6IFtdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRhc0FycmF5KCBncm91cC5jb250cm9scyApLmZvckVhY2goIGZ1bmN0aW9uIChjb250cm9sKSB7XHJcblx0XHRcdFx0ZmllbGRzLmFwcGVuZENoaWxkKCBidWlsZF9jb250cm9sKCBjb250cm9sLCBwcm9wc19zY2hlbWEsIGRhdGEsIHVpZCwgY3R4ICkgKTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0c2VjdGlvbi5hcHBlbmRDaGlsZCggaGVhZGVyX2J0biApO1xyXG5cdFx0XHRzZWN0aW9uLmFwcGVuZENoaWxkKCBmaWVsZHMgKTtcclxuXHRcdFx0cmV0dXJuIHNlY3Rpb247XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTY2hlbWEgPiBJbnNwZWN0b3IgPiBIZWFkZXIhIEJ1aWxkIGluc3BlY3RvciBoZWFkZXIgd2l0aCBhY3Rpb24gYnV0dG9ucyB3aXJlZCB0byBleGlzdGluZyBkYXRhLWFjdGlvbiBoYW5kbGVycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGhlYWRlcl9hY3Rpb25zXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gICAgICAgIHRpdGxlX3RleHRcclxuXHRcdCAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gYnVpbGRfaGVhZGVyKGluc3BlY3Rvcl91aSwgdGl0bGVfZmFsbGJhY2ssIHNjaGVtYV9mb3JfdHlwZSkge1xyXG5cclxuXHRcdFx0aW5zcGVjdG9yX3VpICAgICAgPSBpbnNwZWN0b3JfdWkgfHwge307XHJcblx0XHRcdHNjaGVtYV9mb3JfdHlwZSAgID0gc2NoZW1hX2Zvcl90eXBlIHx8IHt9O1xyXG5cdFx0XHR2YXIgdmFyaWFudCAgICAgICA9IGluc3BlY3Rvcl91aS5oZWFkZXJfdmFyaWFudCB8fCAnbWluaW1hbCc7XHJcblx0XHRcdHZhciBoZWFkZXJBY3Rpb25zID0gaW5zcGVjdG9yX3VpLmhlYWRlcl9hY3Rpb25zXHJcblx0XHRcdFx0fHwgc2NoZW1hX2Zvcl90eXBlLmhlYWRlcl9hY3Rpb25zXHJcblx0XHRcdFx0fHwgWyAnZGVzZWxlY3QnLCAnc2Nyb2xsdG8nLCAnbW92ZS11cCcsICdtb3ZlLWRvd24nLCAnZHVwbGljYXRlJywgJ2RlbGV0ZScgXTtcclxuXHJcblx0XHRcdHZhciB0aXRsZSAgICAgICA9IGluc3BlY3Rvcl91aS50aXRsZSB8fCB0aXRsZV9mYWxsYmFjayB8fCAnJztcclxuXHRcdFx0dmFyIGRlc2NyaXB0aW9uID0gaW5zcGVjdG9yX3VpLmRlc2NyaXB0aW9uIHx8ICcnO1xyXG5cclxuXHRcdFx0Ly8gaGVscGVyIHRvIGNyZWF0ZSBhIGJ1dHRvbiBmb3IgZWl0aGVyIGhlYWRlciBzdHlsZVxyXG5cdFx0XHRmdW5jdGlvbiBhY3Rpb25CdG4oYWN0LCBtaW5pbWFsKSB7XHJcblx0XHRcdFx0aWYgKCBtaW5pbWFsICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVsKCAnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2J1dHRvbi1saW5rJywgJ2RhdGEtYWN0aW9uJzogYWN0IH0sICcnICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIHRvb2xiYXIgdmFyaWFudCAocmljaClcclxuXHRcdFx0XHR2YXIgaWNvbk1hcCA9IHtcclxuXHRcdFx0XHRcdCdkZXNlbGVjdCcgOiAnd3BiY19pY25fcmVtb3ZlX2RvbmUnLFxyXG5cdFx0XHRcdFx0J3Njcm9sbHRvJyA6ICd3cGJjX2ljbl9hZHNfY2xpY2sgZmlsdGVyX2NlbnRlcl9mb2N1cycsXHJcblx0XHRcdFx0XHQnbW92ZS11cCcgIDogJ3dwYmNfaWNuX2Fycm93X3Vwd2FyZCcsXHJcblx0XHRcdFx0XHQnbW92ZS1kb3duJzogJ3dwYmNfaWNuX2Fycm93X2Rvd253YXJkJyxcclxuXHRcdFx0XHRcdCdkdXBsaWNhdGUnOiAnd3BiY19pY25fY29udGVudF9jb3B5JyxcclxuXHRcdFx0XHRcdCdkZWxldGUnICAgOiAnd3BiY19pY25fZGVsZXRlX291dGxpbmUnXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHR2YXIgY2xhc3NlcyA9ICdidXR0b24gYnV0dG9uLXNlY29uZGFyeSB3cGJjX3VpX2NvbnRyb2wgd3BiY191aV9idXR0b24nO1xyXG5cdFx0XHRcdGlmICggYWN0ID09PSAnZGVsZXRlJyApIGNsYXNzZXMgKz0gJyB3cGJjX3VpX2J1dHRvbl9kYW5nZXIgYnV0dG9uLWxpbmstZGVsZXRlJztcclxuXHJcblx0XHRcdFx0dmFyIGJ0biA9IGVsKCAnYnV0dG9uJywge1xyXG5cdFx0XHRcdFx0dHlwZSAgICAgICAgIDogJ2J1dHRvbicsXHJcblx0XHRcdFx0XHQnY2xhc3MnICAgICAgOiBjbGFzc2VzLFxyXG5cdFx0XHRcdFx0J2RhdGEtYWN0aW9uJzogYWN0LFxyXG5cdFx0XHRcdFx0J2FyaWEtbGFiZWwnIDogYWN0LnJlcGxhY2UoIC8tL2csICcgJyApXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGFjdCA9PT0gJ2RlbGV0ZScgKSB7XHJcblx0XHRcdFx0XHRidG4uYXBwZW5kQ2hpbGQoIGVsKCAnc3BhbicsIHsgJ2NsYXNzJzogJ2luLWJ1dHRvbi10ZXh0JyB9LCAnRGVsZXRlJyApICk7XHJcblx0XHRcdFx0XHRidG4uYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCAnICcgKSApOyAvLyBtaW5vciBzcGFjaW5nIGJlZm9yZSBpY29uXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJ0bi5hcHBlbmRDaGlsZCggZWwoICdpJywgeyAnY2xhc3MnOiAnbWVudV9pY29uIGljb24tMXggJyArIChpY29uTWFwW2FjdF0gfHwgJycpIH0gKSApO1xyXG5cdFx0XHRcdHJldHVybiBidG47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vID09PSBtaW5pbWFsIGhlYWRlciAoZXhpc3RpbmcgbG9vazsgZGVmYXVsdCkgPT09XHJcblx0XHRcdGlmICggdmFyaWFudCAhPT0gJ3Rvb2xiYXInICkge1xyXG5cdFx0XHRcdHZhciBoZWFkZXIgPSBlbCggJ2hlYWRlcicsIHsgJ2NsYXNzJzogJ3dwYmNfYmZiX19pbnNwZWN0b3JfX2hlYWRlcicgfSApO1xyXG5cdFx0XHRcdGhlYWRlci5hcHBlbmRDaGlsZCggZWwoICdoMycsIG51bGwsIHRpdGxlIHx8ICcnICkgKTtcclxuXHJcblx0XHRcdFx0dmFyIGFjdGlvbnMgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfYmZiX19pbnNwZWN0b3JfX2hlYWRlcl9hY3Rpb25zJyB9ICk7XHJcblx0XHRcdFx0aGVhZGVyQWN0aW9ucy5mb3JFYWNoKCBmdW5jdGlvbiAoYWN0KSB7XHJcblx0XHRcdFx0XHRhY3Rpb25zLmFwcGVuZENoaWxkKCBhY3Rpb25CdG4oIGFjdCwgLyptaW5pbWFsKi90cnVlICkgKTtcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0aGVhZGVyLmFwcGVuZENoaWxkKCBhY3Rpb25zICk7XHJcblx0XHRcdFx0cmV0dXJuIGhlYWRlcjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gPT09IHRvb2xiYXIgaGVhZGVyIChyaWNoIHRpdGxlL2Rlc2MgKyBncm91cGVkIGJ1dHRvbnMpID09PVxyXG5cdFx0XHR2YXIgcm9vdCA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnd3BiY19iZmJfX2luc3BlY3Rvcl9faGVhZCcgfSApO1xyXG5cdFx0XHR2YXIgd3JhcCA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnaGVhZGVyX2NvbnRhaW5lcicgfSApO1xyXG5cdFx0XHR2YXIgbGVmdCA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnaGVhZGVyX3RpdGxlX2NvbnRlbnQnIH0gKTtcclxuXHRcdFx0dmFyIGgzICAgPSBlbCggJ2gzJywgeyAnY2xhc3MnOiAndGl0bGUnIH0sIHRpdGxlIHx8ICcnICk7XHJcblx0XHRcdGxlZnQuYXBwZW5kQ2hpbGQoIGgzICk7XHJcblx0XHRcdGlmICggZGVzY3JpcHRpb24gKSB7XHJcblx0XHRcdFx0bGVmdC5hcHBlbmRDaGlsZCggZWwoICdkaXYnLCB7ICdjbGFzcyc6ICdkZXNjJyB9LCBkZXNjcmlwdGlvbiApICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciByaWdodCA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnYWN0aW9ucyB3cGJjX2FqeF90b29sYmFyIHdwYmNfbm9fYm9yZGVycycgfSApO1xyXG5cdFx0XHR2YXIgdWlDICAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3VpX2NvbnRhaW5lciB1aV9jb250YWluZXJfc21hbGwnIH0gKTtcclxuXHRcdFx0dmFyIHVpRyAgID0gZWwoICdkaXYnLCB7ICdjbGFzcyc6ICd1aV9ncm91cCcgfSApO1xyXG5cclxuXHRcdFx0Ly8gU3BsaXQgaW50byB2aXN1YWwgZ3JvdXBzOiBmaXJzdCAyLCBuZXh0IDIsIHRoZW4gdGhlIHJlc3QuXHJcblx0XHRcdHZhciBnMSA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAndWlfZWxlbWVudCcgfSApO1xyXG5cdFx0XHR2YXIgZzIgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3VpX2VsZW1lbnQnIH0gKTtcclxuXHRcdFx0dmFyIGczID0gZWwoICdkaXYnLCB7ICdjbGFzcyc6ICd1aV9lbGVtZW50JyB9ICk7XHJcblxyXG5cdFx0XHRoZWFkZXJBY3Rpb25zLnNsaWNlKCAwLCAyICkuZm9yRWFjaCggZnVuY3Rpb24gKGFjdCkge1xyXG5cdFx0XHRcdGcxLmFwcGVuZENoaWxkKCBhY3Rpb25CdG4oIGFjdCwgZmFsc2UgKSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdGhlYWRlckFjdGlvbnMuc2xpY2UoIDIsIDQgKS5mb3JFYWNoKCBmdW5jdGlvbiAoYWN0KSB7XHJcblx0XHRcdFx0ZzIuYXBwZW5kQ2hpbGQoIGFjdGlvbkJ0biggYWN0LCBmYWxzZSApICk7XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0aGVhZGVyQWN0aW9ucy5zbGljZSggNCApLmZvckVhY2goIGZ1bmN0aW9uIChhY3QpIHtcclxuXHRcdFx0XHRnMy5hcHBlbmRDaGlsZCggYWN0aW9uQnRuKCBhY3QsIGZhbHNlICkgKTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0dWlHLmFwcGVuZENoaWxkKCBnMSApO1xyXG5cdFx0XHR1aUcuYXBwZW5kQ2hpbGQoIGcyICk7XHJcblx0XHRcdHVpRy5hcHBlbmRDaGlsZCggZzMgKTtcclxuXHRcdFx0dWlDLmFwcGVuZENoaWxkKCB1aUcgKTtcclxuXHRcdFx0cmlnaHQuYXBwZW5kQ2hpbGQoIHVpQyApO1xyXG5cclxuXHRcdFx0d3JhcC5hcHBlbmRDaGlsZCggbGVmdCApO1xyXG5cdFx0XHR3cmFwLmFwcGVuZENoaWxkKCByaWdodCApO1xyXG5cdFx0XHRyb290LmFwcGVuZENoaWxkKCB3cmFwICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gcm9vdDtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0ZnVuY3Rpb24gZmFjdG9yeV9yZW5kZXIocGFuZWxfZWwsIHNjaGVtYV9mb3JfdHlwZSwgZGF0YSwgb3B0cykge1xyXG5cdFx0XHRpZiAoICFwYW5lbF9lbCApIHJldHVybiBwYW5lbF9lbDtcclxuXHJcblx0XHRcdHNjaGVtYV9mb3JfdHlwZSAgPSBzY2hlbWFfZm9yX3R5cGUgfHwge307XHJcblx0XHRcdHZhciBwcm9wc19zY2hlbWEgPSAoc2NoZW1hX2Zvcl90eXBlLnNjaGVtYSAmJiBzY2hlbWFfZm9yX3R5cGUuc2NoZW1hLnByb3BzKSA/IHNjaGVtYV9mb3JfdHlwZS5zY2hlbWEucHJvcHMgOiB7fTtcclxuXHRcdFx0dmFyIGluc3BlY3Rvcl91aSA9IChzY2hlbWFfZm9yX3R5cGUuaW5zcGVjdG9yX3VpIHx8IHt9KTtcclxuXHRcdFx0dmFyIGdyb3VwcyAgICAgICA9IGluc3BlY3Rvcl91aS5ncm91cHMgfHwgW107XHJcblxyXG5cdFx0XHR2YXIgaGVhZGVyX2FjdGlvbnMgPSBpbnNwZWN0b3JfdWkuaGVhZGVyX2FjdGlvbnMgfHwgc2NoZW1hX2Zvcl90eXBlLmhlYWRlcl9hY3Rpb25zIHx8IFtdO1xyXG5cdFx0XHR2YXIgdGl0bGVfdGV4dCAgICAgPSAob3B0cyAmJiBvcHRzLnRpdGxlKSB8fCBpbnNwZWN0b3JfdWkudGl0bGUgfHwgc2NoZW1hX2Zvcl90eXBlLmxhYmVsIHx8IChkYXRhICYmIGRhdGEubGFiZWwpIHx8ICcnO1xyXG5cclxuXHRcdC8vIFByZXBhcmUgcmVuZGVyaW5nIGNvbnRleHQgZm9yIHNsb3RzL3ZhbHVlX2Zyb20sIGV0Yy5cclxuXHRcdFx0dmFyIGN0eCA9IHtcclxuXHRcdFx0XHRlbCAgICAgOiBvcHRzICYmIG9wdHMuZWwgfHwgbnVsbCxcclxuXHRcdFx0XHRidWlsZGVyOiBvcHRzICYmIG9wdHMuYnVpbGRlciB8fCBudWxsLFxyXG5cdFx0XHRcdHR5cGUgICA6IG9wdHMgJiYgb3B0cy50eXBlIHx8IG51bGwsXHJcblx0XHRcdFx0ZGF0YSAgIDogZGF0YSB8fCB7fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Ly8gY2xlYXIgcGFuZWwuXHJcblx0XHRcdHdoaWxlICggcGFuZWxfZWwuZmlyc3RDaGlsZCApIHBhbmVsX2VsLnJlbW92ZUNoaWxkKCBwYW5lbF9lbC5maXJzdENoaWxkICk7XHJcblxyXG5cdFx0XHR2YXIgdWlkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZyggMzYgKS5zbGljZSggMiwgOCApO1xyXG5cclxuXHRcdFx0Ly8gaGVhZGVyLlxyXG5cdFx0XHRwYW5lbF9lbC5hcHBlbmRDaGlsZCggYnVpbGRfaGVhZGVyKCBpbnNwZWN0b3JfdWksIHRpdGxlX3RleHQsIHNjaGVtYV9mb3JfdHlwZSApICk7XHJcblxyXG5cclxuXHRcdFx0Ly8gZ3JvdXBzLlxyXG5cdFx0XHRncm91cHMuZm9yRWFjaCggZnVuY3Rpb24gKGcpIHtcclxuXHRcdFx0XHRwYW5lbF9lbC5hcHBlbmRDaGlsZCggYnVpbGRfZ3JvdXAoIGcsIHByb3BzX3NjaGVtYSwgZGF0YSB8fCB7fSwgdWlkLCBjdHggKSApO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBBUklBIHN5bmMgZm9yIHRvZ2dsZXMgY3JlYXRlZCBoZXJlIChlbnN1cmUgYXJpYS1jaGVja2VkIG1hdGNoZXMgc3RhdGUpLlxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdC8vIENlbnRyYWxpemVkIFVJIG5vcm1hbGl6ZXJzICh0b2dnbGVzICsgQTExeSk6IGhhbmRsZWQgaW4gQ29yZS5cclxuXHRcdFx0XHRVSS5hcHBseV9wb3N0X3JlbmRlciggcGFuZWxfZWwgKTtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0d2lyZV9sZW5fZ3JvdXAoIHBhbmVsX2VsICk7XHJcblx0XHRcdFx0XHQvLyBJbml0aWFsaXplIENvbG9yaXMgb24gY29sb3IgaW5wdXRzIHJlbmRlcmVkIGluIHRoaXMgcGFuZWwuXHJcblx0XHRcdFx0XHRpbml0X2NvbG9yaXNfcGlja2VycyggcGFuZWxfZWwgKTtcclxuXHRcdFx0XHR9IGNhdGNoICggXyApIHsgfVxyXG5cdFx0XHR9IGNhdGNoICggXyApIHsgfVxyXG5cclxuXHRcdFx0cmV0dXJuIHBhbmVsX2VsO1xyXG5cdFx0fVxyXG5cclxuXHRcdFVJLldQQkNfQkZCX0luc3BlY3Rvcl9GYWN0b3J5ID0geyByZW5kZXI6IGZhY3RvcnlfcmVuZGVyIH07ICAgLy8gb3ZlcndyaXRlL3JlZnJlc2hcclxuXHJcblx0XHQvLyAtLS0tIEJ1aWx0LWluIHNsb3QgKyB2YWx1ZV9mcm9tIGZvciBTZWN0aW9ucyAtLS0tXHJcblxyXG5cdFx0ZnVuY3Rpb24gc2xvdF9sYXlvdXRfY2hpcHMoaG9zdCwgY3R4KSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dmFyIEwgPSB3LldQQkNfQkZCX0NvcmUgJiYgIHcuV1BCQ19CRkJfQ29yZS5VSSAmJiB3LldQQkNfQkZCX0NvcmUuVUkuV1BCQ19CRkJfTGF5b3V0X0NoaXBzO1xyXG5cdFx0XHRcdGlmICggTCAmJiB0eXBlb2YgTC5yZW5kZXJfZm9yX3NlY3Rpb24gPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRMLnJlbmRlcl9mb3Jfc2VjdGlvbiggY3R4LmJ1aWxkZXIsIGN0eC5lbCwgaG9zdCApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRob3N0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggJ1tsYXlvdXRfY2hpcHMgbm90IGF2YWlsYWJsZV0nICkgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ3dwYmNfYmZiX3Nsb3RfbGF5b3V0X2NoaXBzIGZhaWxlZDonLCBlICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR3LndwYmNfYmZiX2luc3BlY3Rvcl9mYWN0b3J5X3Nsb3RzLmxheW91dF9jaGlwcyA9IHNsb3RfbGF5b3V0X2NoaXBzO1xyXG5cclxuXHRcdGZ1bmN0aW9uIHZhbHVlX2Zyb21fY29tcHV0ZV9zZWN0aW9uX2NvbHVtbnMoY3R4KSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dmFyIHJvdyA9IGN0eCAmJiBjdHguZWwgJiYgY3R4LmVsLnF1ZXJ5U2VsZWN0b3IgJiYgY3R4LmVsLnF1ZXJ5U2VsZWN0b3IoICc6c2NvcGUgPiAud3BiY19iZmJfX3JvdycgKTtcclxuXHRcdFx0XHRpZiAoICFyb3cgKSByZXR1cm4gMTtcclxuXHRcdFx0XHR2YXIgbiA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsKCAnOnNjb3BlID4gLndwYmNfYmZiX19jb2x1bW4nICkubGVuZ3RoIHx8IDE7XHJcblx0XHRcdFx0aWYgKCBuIDwgMSApIG4gPSAxO1xyXG5cdFx0XHRcdGlmICggbiA+IDQgKSBuID0gNDtcclxuXHRcdFx0XHRyZXR1cm4gbjtcclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0cmV0dXJuIDE7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR3LndwYmNfYmZiX2luc3BlY3Rvcl9mYWN0b3J5X3ZhbHVlX2Zyb20uY29tcHV0ZV9zZWN0aW9uX2NvbHVtbnMgPSB2YWx1ZV9mcm9tX2NvbXB1dGVfc2VjdGlvbl9jb2x1bW5zO1xyXG5cdH1cclxuXHJcblx0Ly8gMykgSW5zcGVjdG9yIGNsYXNzLlxyXG5cclxuXHRjbGFzcyBXUEJDX0JGQl9JbnNwZWN0b3Ige1xyXG5cclxuXHRcdGNvbnN0cnVjdG9yKHBhbmVsX2VsLCBidWlsZGVyKSB7XHJcblx0XHRcdHRoaXMucGFuZWwgICAgICAgICA9IHBhbmVsX2VsIHx8IHRoaXMuX2NyZWF0ZV9mYWxsYmFja19wYW5lbCgpO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIgICAgICAgPSBidWlsZGVyO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkX2VsICAgPSBudWxsO1xyXG5cdFx0XHR0aGlzLl9yZW5kZXJfdGltZXIgPSBudWxsO1xyXG5cclxuXHRcdFx0dGhpcy5fb25fZGVsZWdhdGVkX2lucHV0ICA9IChlKSA9PiB0aGlzLl9hcHBseV9jb250cm9sX2Zyb21fZXZlbnQoIGUgKTtcclxuXHRcdFx0dGhpcy5fb25fZGVsZWdhdGVkX2NoYW5nZSA9IChlKSA9PiB0aGlzLl9hcHBseV9jb250cm9sX2Zyb21fZXZlbnQoIGUgKTtcclxuXHRcdFx0dGhpcy5wYW5lbC5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXQnLCB0aGlzLl9vbl9kZWxlZ2F0ZWRfaW5wdXQsIHRydWUgKTtcclxuXHRcdFx0dGhpcy5wYW5lbC5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgdGhpcy5fb25fZGVsZWdhdGVkX2NoYW5nZSwgdHJ1ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5fb25fZGVsZWdhdGVkX2NsaWNrID0gKGUpID0+IHtcclxuXHRcdFx0XHRjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCAnW2RhdGEtYWN0aW9uXScgKTtcclxuXHRcdFx0XHRpZiAoICFidG4gfHwgIXRoaXMucGFuZWwuY29udGFpbnMoIGJ0biApICkgcmV0dXJuO1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuXHRcdFx0XHRjb25zdCBhY3Rpb24gPSBidG4uZ2V0QXR0cmlidXRlKCAnZGF0YS1hY3Rpb24nICk7XHJcblx0XHRcdFx0Y29uc3QgZWwgICAgID0gdGhpcy5zZWxlY3RlZF9lbDtcclxuXHRcdFx0XHRpZiAoICFlbCApIHJldHVybjtcclxuXHJcblx0XHRcdFx0dy5XUEJDX0JGQl9JbnNwZWN0b3JfQWN0aW9ucz8ucnVuKCBhY3Rpb24sIHtcclxuXHRcdFx0XHRcdGJ1aWxkZXI6IHRoaXMuYnVpbGRlcixcclxuXHRcdFx0XHRcdGVsLFxyXG5cdFx0XHRcdFx0cGFuZWwgIDogdGhpcy5wYW5lbCxcclxuXHRcdFx0XHRcdGV2ZW50ICA6IGVcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGlmICggYWN0aW9uID09PSAnZGVsZXRlJyApIHRoaXMuY2xlYXIoKTtcclxuXHRcdFx0fTtcclxuXHRcdFx0dGhpcy5wYW5lbC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzLl9vbl9kZWxlZ2F0ZWRfY2xpY2sgKTtcclxuXHRcdH1cclxuXHJcblx0XHRfcG9zdF9yZW5kZXJfdWkoKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dmFyIFVJID0gdy5XUEJDX0JGQl9Db3JlICYmIHcuV1BCQ19CRkJfQ29yZS5VSTtcclxuXHRcdFx0XHRpZiAoIFVJICYmIHR5cGVvZiBVSS5hcHBseV9wb3N0X3JlbmRlciA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdFVJLmFwcGx5X3Bvc3RfcmVuZGVyKCB0aGlzLnBhbmVsICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIE5FVzogd2lyZSBzbGlkZXIvbnVtYmVyL3VuaXQgc3luY2luZyBmb3IgbGVuZ3RoICYgcmFuZ2VfbnVtYmVyIGdyb3Vwcy5cclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0d2lyZV9sZW5fZ3JvdXAoIHRoaXMucGFuZWwgKTtcclxuXHRcdFx0XHRcdGluaXRfY29sb3Jpc19waWNrZXJzKCB0aGlzLnBhbmVsICk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRfd3BiYz8uZGV2Py5lcnJvcj8uKCAnaW5zcGVjdG9yLl9wb3N0X3JlbmRlcl91aScsIGUgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRfYXBwbHlfY29udHJvbF9mcm9tX2V2ZW50KGUpIHtcclxuXHRcdFx0aWYgKCAhdGhpcy5wYW5lbC5jb250YWlucyggZS50YXJnZXQgKSApIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IHQgICA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudHxIVE1MVGV4dEFyZWFFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fSAqLyAoZS50YXJnZXQpO1xyXG5cdFx0XHRjb25zdCBrZXkgPSB0Py5kYXRhc2V0Py5pbnNwZWN0b3JLZXk7XHJcblx0XHRcdGlmICggIWtleSApIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGVsID0gdGhpcy5zZWxlY3RlZF9lbDtcclxuXHRcdFx0aWYgKCAhZWwgfHwgIWRvY3VtZW50LmJvZHkuY29udGFpbnMoIGVsICkgKSByZXR1cm47XHJcblxyXG5cdFx0XHRsZXQgdjtcclxuXHRcdFx0aWYgKCB0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiB0LnR5cGUgPT09ICdjaGVja2JveCcgKSB7XHJcblx0XHRcdFx0diA9ICEhdC5jaGVja2VkO1xyXG5cdFx0XHRcdHQuc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgdiA/ICd0cnVlJyA6ICdmYWxzZScgKTsgICAgICAgICAvLyBLZWVwIEFSSUEgc3RhdGUgaW4gc3luYyBmb3IgdG9nZ2xlcyAoc2NoZW1hIGFuZCB0ZW1wbGF0ZSBwYXRocykuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIHQudHlwZSA9PT0gJ251bWJlcicgKSB7XHJcblx0XHRcdFx0diA9ICh0LnZhbHVlID09PSAnJyA/ICcnIDogTnVtYmVyKCB0LnZhbHVlICkpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHYgPSB0LnZhbHVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGtleSA9PT0gJ2lkJyApIHtcclxuXHRcdFx0XHRjb25zdCB1bmlxdWUgPSB0aGlzLmJ1aWxkZXI/LmlkPy5zZXRfZmllbGRfaWQ/LiggZWwsIHYgKTtcclxuXHRcdFx0XHRpZiAoIHVuaXF1ZSAhPSBudWxsICYmIHQudmFsdWUgIT09IHVuaXF1ZSApIHQudmFsdWUgPSB1bmlxdWU7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09ICduYW1lJyApIHtcclxuXHRcdFx0XHRjb25zdCB1bmlxdWUgPSB0aGlzLmJ1aWxkZXI/LmlkPy5zZXRfZmllbGRfbmFtZT8uKCBlbCwgdiApO1xyXG5cdFx0XHRcdGlmICggdW5pcXVlICE9IG51bGwgJiYgdC52YWx1ZSAhPT0gdW5pcXVlICkgdC52YWx1ZSA9IHVuaXF1ZTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ2h0bWxfaWQnICkge1xyXG5cdFx0XHRcdGNvbnN0IGFwcGxpZWQgPSB0aGlzLmJ1aWxkZXI/LmlkPy5zZXRfZmllbGRfaHRtbF9pZD8uKCBlbCwgdiApO1xyXG5cdFx0XHRcdGlmICggYXBwbGllZCAhPSBudWxsICYmIHQudmFsdWUgIT09IGFwcGxpZWQgKSB0LnZhbHVlID0gYXBwbGllZDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ2NvbHVtbnMnICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApICkge1xyXG5cdFx0XHRcdGNvbnN0IHZfaW50ID0gcGFyc2VJbnQoIFN0cmluZyggdiApLCAxMCApO1xyXG5cdFx0XHRcdGlmICggTnVtYmVyLmlzRmluaXRlKCB2X2ludCApICkge1xyXG5cdFx0XHRcdFx0Y29uc3QgY2xhbXBlZCA9IHcuV1BCQ19CRkJfQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5jbGFtcCggdl9pbnQsIDEsIDQgKTtcclxuXHRcdFx0XHRcdHRoaXMuYnVpbGRlcj8uc2V0X3NlY3Rpb25fY29sdW1ucz8uKCBlbCwgY2xhbXBlZCApO1xyXG5cdFx0XHRcdFx0aWYgKCBTdHJpbmcoIGNsYW1wZWQgKSAhPT0gdC52YWx1ZSApIHQudmFsdWUgPSBTdHJpbmcoIGNsYW1wZWQgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmICggdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgdC50eXBlID09PSAnY2hlY2tib3gnICkge1xyXG5cdFx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS0nICsga2V5LCBTdHJpbmcoICEhdiApICk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICggdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgdC50eXBlID09PSAnbnVtYmVyJyApIHtcclxuXHRcdFx0XHRcdGlmICggdC52YWx1ZSA9PT0gJycgfHwgIU51bWJlci5pc0Zpbml0ZSggdiApICkge1xyXG5cdFx0XHRcdFx0XHRlbC5yZW1vdmVBdHRyaWJ1dGUoICdkYXRhLScgKyBrZXkgKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtJyArIGtleSwgU3RyaW5nKCB2ICkgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB2ID09IG51bGwgKSB7XHJcblx0XHRcdFx0XHRlbC5yZW1vdmVBdHRyaWJ1dGUoICdkYXRhLScgKyBrZXkgKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS0nICsga2V5LCAodHlwZW9mIHYgPT09ICdvYmplY3QnKSA/IEpTT04uc3RyaW5naWZ5KCB2ICkgOiBTdHJpbmcoIHYgKSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIHByZXZpZXcvb3ZlcmxheVxyXG5cdFx0XHRpZiAoIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19maWVsZCcgKSApIHtcclxuXHRcdFx0XHRpZiAoIHRoaXMuYnVpbGRlcj8ucHJldmlld19tb2RlICkgdGhpcy5idWlsZGVyLnJlbmRlcl9wcmV2aWV3KCBlbCApO1xyXG5cdFx0XHRcdGVsc2UgdGhpcy5idWlsZGVyLmFkZF9vdmVybGF5X3Rvb2xiYXIoIGVsICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5idWlsZGVyLmFkZF9vdmVybGF5X3Rvb2xiYXIoIGVsICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5fbmVlZHNfcmVyZW5kZXIoIGVsLCBrZXksIGUgKSApIHtcclxuXHRcdFx0XHR0aGlzLl9zY2hlZHVsZV9yZW5kZXJfcHJlc2VydmluZ19mb2N1cyggMCApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0X25lZWRzX3JlcmVuZGVyKGVsLCBrZXksIF9lKSB7XHJcblx0XHRcdGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgJiYga2V5ID09PSAnY29sdW1ucycgKSByZXR1cm4gdHJ1ZTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGJpbmRfdG9fZmllbGQoZmllbGRfZWwpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZF9lbCA9IGZpZWxkX2VsO1xyXG5cdFx0XHR0aGlzLnJlbmRlcigpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNsZWFyKCkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkX2VsID0gbnVsbDtcclxuXHRcdFx0aWYgKCB0aGlzLl9yZW5kZXJfdGltZXIgKSB7XHJcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aGlzLl9yZW5kZXJfdGltZXIgKTtcclxuXHRcdFx0XHR0aGlzLl9yZW5kZXJfdGltZXIgPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIEFsc28gY2xlYXIgdGhlIHNlY3Rpb24tY29scyBoaW50IG9uIGVtcHR5IHN0YXRlLlxyXG5cdFx0XHR0aGlzLnBhbmVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1iZmItc2VjdGlvbi1jb2xzJyk7XHJcblx0XHRcdHRoaXMucGFuZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJ3cGJjX2JmYl9faW5zcGVjdG9yX19lbXB0eVwiPlNlbGVjdCBhIGZpZWxkIHRvIGVkaXQgaXRzIG9wdGlvbnMuPC9kaXY+JztcclxuXHRcdH1cclxuXHJcblx0XHRfc2NoZWR1bGVfcmVuZGVyX3ByZXNlcnZpbmdfZm9jdXMoZGVsYXkgPSAyMDApIHtcclxuXHRcdFx0Y29uc3QgYWN0aXZlICAgID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fEhUTUxUZXh0QXJlYUVsZW1lbnR8SFRNTEVsZW1lbnR8bnVsbH0gKi8gKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xyXG5cdFx0XHRjb25zdCBhY3RpdmVLZXkgPSBhY3RpdmU/LmRhdGFzZXQ/Lmluc3BlY3RvcktleSB8fCBudWxsO1xyXG5cdFx0XHRsZXQgc2VsU3RhcnQgICAgPSBudWxsLCBzZWxFbmQgPSBudWxsO1xyXG5cclxuXHRcdFx0aWYgKCBhY3RpdmUgJiYgJ3NlbGVjdGlvblN0YXJ0JyBpbiBhY3RpdmUgJiYgJ3NlbGVjdGlvbkVuZCcgaW4gYWN0aXZlICkge1xyXG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0XHRzZWxTdGFydCA9IGFjdGl2ZS5zZWxlY3Rpb25TdGFydDtcclxuXHRcdFx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRcdFx0c2VsRW5kICAgPSBhY3RpdmUuc2VsZWN0aW9uRW5kO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX3JlbmRlcl90aW1lciApIGNsZWFyVGltZW91dCggdGhpcy5fcmVuZGVyX3RpbWVyICk7XHJcblx0XHRcdHRoaXMuX3JlbmRlcl90aW1lciA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHNldFRpbWVvdXQoICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLnJlbmRlcigpO1xyXG5cdFx0XHRcdGlmICggYWN0aXZlS2V5ICkge1xyXG5cdFx0XHRcdFx0Y29uc3QgbmV4dCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudHxIVE1MVGV4dEFyZWFFbGVtZW50fEhUTUxFbGVtZW50fG51bGx9ICovIChcclxuXHRcdFx0XHRcdFx0dGhpcy5wYW5lbC5xdWVyeVNlbGVjdG9yKCBgW2RhdGEtaW5zcGVjdG9yLWtleT1cIiR7YWN0aXZlS2V5fVwiXWAgKVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGlmICggbmV4dCApIHtcclxuXHRcdFx0XHRcdFx0bmV4dC5mb2N1cygpO1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICggc2VsU3RhcnQgIT0gbnVsbCAmJiBzZWxFbmQgIT0gbnVsbCAmJiB0eXBlb2YgbmV4dC5zZXRTZWxlY3Rpb25SYW5nZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0XHRcdFx0XHRcdG5leHQuc2V0U2VsZWN0aW9uUmFuZ2UoIHNlbFN0YXJ0LCBzZWxFbmQgKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2goIGUgKXsgX3dwYmM/LmRldj8uZXJyb3IoICdfcmVuZGVyX3RpbWVyJywgZSApOyB9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LCBkZWxheSApKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXIoKSB7XHJcblxyXG5cdFx0XHRjb25zdCBlbCA9IHRoaXMuc2VsZWN0ZWRfZWw7XHJcblx0XHRcdGlmICggIWVsIHx8ICFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKCBlbCApICkgcmV0dXJuIHRoaXMuY2xlYXIoKTtcclxuXHJcblx0XHRcdC8vIFJlc2V0IHNlY3Rpb24tY29scyBoaW50IHVubGVzcyB3ZSBzZXQgaXQgbGF0ZXIgZm9yIGEgc2VjdGlvbi5cclxuXHRcdFx0dGhpcy5wYW5lbC5yZW1vdmVBdHRyaWJ1dGUoICdkYXRhLWJmYi1zZWN0aW9uLWNvbHMnICk7XHJcblxyXG5cdFx0XHRjb25zdCBwcmV2X3Njcm9sbCA9IHRoaXMucGFuZWwuc2Nyb2xsVG9wO1xyXG5cclxuXHRcdFx0Ly8gU2VjdGlvblxyXG5cdFx0XHRpZiAoIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApICkge1xyXG5cdFx0XHRcdGxldCB0cGwgPSBudWxsO1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHR0cGwgPSAody53cCAmJiB3cC50ZW1wbGF0ZSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3RtcGwtd3BiYy1iZmItaW5zcGVjdG9yLXNlY3Rpb24nICkpID8gd3AudGVtcGxhdGUoICd3cGJjLWJmYi1pbnNwZWN0b3Itc2VjdGlvbicgKSA6IG51bGw7XHJcblx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0XHR0cGwgPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCB0cGwgKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBhbmVsLmlubmVySFRNTCA9IHRwbCgge30gKTtcclxuXHRcdFx0XHRcdHRoaXMuX2VuZm9yY2VfZGVmYXVsdF9ncm91cF9vcGVuKCk7XHJcblx0XHRcdFx0XHR0aGlzLl9zZXRfcGFuZWxfc2VjdGlvbl9jb2xzKCBlbCApO1xyXG5cdFx0XHRcdFx0dGhpcy5fcG9zdF9yZW5kZXJfdWkoKTtcclxuXHRcdFx0XHRcdHRoaXMucGFuZWwuc2Nyb2xsVG9wID0gcHJldl9zY3JvbGw7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBGYWN0b3J5ID0gdy5XUEJDX0JGQl9Db3JlLlVJICYmIHcuV1BCQ19CRkJfQ29yZS5VSS5XUEJDX0JGQl9JbnNwZWN0b3JfRmFjdG9yeTtcclxuXHRcdFx0XHRjb25zdCBzY2hlbWFzID0gdy5XUEJDX0JGQl9TY2hlbWFzIHx8IHt9O1xyXG5cdFx0XHRcdGNvbnN0IGVudHJ5ICAgPSBzY2hlbWFzWydzZWN0aW9uJ10gfHwgbnVsbDtcclxuXHRcdFx0XHRpZiAoIGVudHJ5ICYmIEZhY3RvcnkgKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBhbmVsLmlubmVySFRNTCA9ICcnO1xyXG5cdFx0XHRcdFx0RmFjdG9yeS5yZW5kZXIoXHJcblx0XHRcdFx0XHRcdHRoaXMucGFuZWwsXHJcblx0XHRcdFx0XHRcdGVudHJ5LFxyXG5cdFx0XHRcdFx0XHR7fSxcclxuXHRcdFx0XHRcdFx0eyBlbCwgYnVpbGRlcjogdGhpcy5idWlsZGVyLCB0eXBlOiAnc2VjdGlvbicsIHRpdGxlOiBlbnRyeS5sYWJlbCB8fCAnU2VjdGlvbicgfVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHRoaXMuX2VuZm9yY2VfZGVmYXVsdF9ncm91cF9vcGVuKCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gLS0tIFNhZmV0eSBuZXQ6IGlmIGZvciBhbnkgcmVhc29uIHRoZSBzbG90IGRpZG7igJl0IHJlbmRlciBjaGlwcywgaW5qZWN0IHRoZW0gbm93LlxyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgaGFzU2xvdEhvc3QgPVxyXG5cdFx0XHRcdFx0XHRcdFx0ICB0aGlzLnBhbmVsLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1iZmItc2xvdD1cImxheW91dF9jaGlwc1wiXScgKSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0ICB0aGlzLnBhbmVsLnF1ZXJ5U2VsZWN0b3IoICcuaW5zcGVjdG9yX19yb3ctLWxheW91dC1jaGlwcyAud3BiY19iZmJfX2xheW91dF9jaGlwcycgKSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0ICB0aGlzLnBhbmVsLnF1ZXJ5U2VsZWN0b3IoICcjd3BiY19iZmJfX2xheW91dF9jaGlwc19ob3N0JyApO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaGFzQ2hpcHMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0ICAhIXRoaXMucGFuZWwucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fbGF5b3V0X2NoaXAnICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoICFoYXNDaGlwcyApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBDcmVhdGUgYSBob3N0IGlmIG1pc3NpbmcgYW5kIHJlbmRlciBjaGlwcyBpbnRvIGl0LlxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGhvc3QgPSAoZnVuY3Rpb24gZW5zdXJlSG9zdChyb290KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgaCA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cm9vdC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtYmZiLXNsb3Q9XCJsYXlvdXRfY2hpcHNcIl0nICkgfHxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyb290LnF1ZXJ5U2VsZWN0b3IoICcuaW5zcGVjdG9yX19yb3ctLWxheW91dC1jaGlwcyAud3BiY19iZmJfX2xheW91dF9jaGlwcycgKSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJvb3QucXVlcnlTZWxlY3RvciggJyN3cGJjX2JmYl9fbGF5b3V0X2NoaXBzX2hvc3QnICk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGggKSByZXR1cm4gaDtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIGhvc3QgaW5zaWRlIChvciBhZnRlcikgdGhlIOKAnGxheW91dOKAnSBncm91cFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZmllbGRzICAgID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgIHJvb3QucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9faW5zcGVjdG9yX19ncm91cFtkYXRhLWdyb3VwPVwibGF5b3V0XCJdIC5ncm91cF9fZmllbGRzJyApIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICByb290LnF1ZXJ5U2VsZWN0b3IoICcuZ3JvdXBfX2ZpZWxkcycgKSB8fCByb290O1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgcm93ICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJvdy5jbGFzc05hbWUgICA9ICdpbnNwZWN0b3JfX3JvdyBpbnNwZWN0b3JfX3Jvdy0tbGF5b3V0LWNoaXBzJztcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxhYiAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGxhYi5jbGFzc05hbWUgICA9ICdpbnNwZWN0b3JfX2xhYmVsJztcclxuXHRcdFx0XHRcdFx0XHRcdGxhYi50ZXh0Q29udGVudCA9ICdMYXlvdXQnO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY3RsICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGN0bC5jbGFzc05hbWUgICA9ICdpbnNwZWN0b3JfX2NvbnRyb2wnO1xyXG5cdFx0XHRcdFx0XHRcdFx0aCAgICAgICAgICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGguY2xhc3NOYW1lICAgICA9ICd3cGJjX2JmYl9fbGF5b3V0X2NoaXBzJztcclxuXHRcdFx0XHRcdFx0XHRcdGguc2V0QXR0cmlidXRlKCAnZGF0YS1iZmItc2xvdCcsICdsYXlvdXRfY2hpcHMnICk7XHJcblx0XHRcdFx0XHRcdFx0XHRjdGwuYXBwZW5kQ2hpbGQoIGggKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZCggbGFiICk7XHJcblx0XHRcdFx0XHRcdFx0XHRyb3cuYXBwZW5kQ2hpbGQoIGN0bCApO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZmllbGRzLmFwcGVuZENoaWxkKCByb3cgKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBoO1xyXG5cdFx0XHRcdFx0XHRcdH0pKCB0aGlzLnBhbmVsICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IEwgPSAody5XUEJDX0JGQl9Db3JlICYmIHcuV1BCQ19CRkJfQ29yZS5VSSAmJiB3LldQQkNfQkZCX0NvcmUuVUkuV1BCQ19CRkJfTGF5b3V0X0NoaXBzKSA7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBMICYmIHR5cGVvZiBMLnJlbmRlcl9mb3Jfc2VjdGlvbiA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGhvc3QuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRcdFx0XHRcdFx0XHRMLnJlbmRlcl9mb3Jfc2VjdGlvbiggdGhpcy5idWlsZGVyLCBlbCwgaG9zdCApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBjYXRjaCggZSApeyBfd3BiYz8uZGV2Py5lcnJvciggJ1dQQkNfQkZCX0luc3BlY3RvciAtIHJlbmRlcicsIGUgKTsgfVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3NldF9wYW5lbF9zZWN0aW9uX2NvbHMoIGVsICk7XHJcblx0XHRcdFx0XHR0aGlzLnBhbmVsLnNjcm9sbFRvcCA9IHByZXZfc2Nyb2xsO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dGhpcy5wYW5lbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIndwYmNfYmZiX19pbnNwZWN0b3JfX2VtcHR5XCI+U2VsZWN0IGEgZmllbGQgdG8gZWRpdCBpdHMgb3B0aW9ucy48L2Rpdj4nO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRmllbGRcclxuXHRcdFx0aWYgKCAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX2ZpZWxkJyApICkgcmV0dXJuIHRoaXMuY2xlYXIoKTtcclxuXHJcblx0XHRcdGNvbnN0IGRhdGEgPSB3LldQQkNfQkZCX0NvcmUuV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyLmdldF9hbGxfZGF0YV9hdHRyaWJ1dGVzKCBlbCApO1xyXG5cdFx0XHRjb25zdCB0eXBlID0gZGF0YS50eXBlIHx8ICd0ZXh0JztcclxuXHJcblx0XHRcdGZ1bmN0aW9uIF9nZXRfdHBsKGlkKSB7XHJcblx0XHRcdFx0aWYgKCAhdy53cCB8fCAhd3AudGVtcGxhdGUgKSByZXR1cm4gbnVsbDtcclxuXHRcdFx0XHRpZiAoICFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3RtcGwtJyArIGlkICkgKSByZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHdwLnRlbXBsYXRlKCBpZCApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB0cGxfaWQgICAgICA9IGB3cGJjLWJmYi1pbnNwZWN0b3ItJHt0eXBlfWA7XHJcblx0XHRcdGNvbnN0IHRwbCAgICAgICAgID0gX2dldF90cGwoIHRwbF9pZCApO1xyXG5cdFx0XHRjb25zdCBnZW5lcmljX3RwbCA9IF9nZXRfdHBsKCAnd3BiYy1iZmItaW5zcGVjdG9yLWdlbmVyaWMnICk7XHJcblxyXG5cdFx0XHRjb25zdCBzY2hlbWFzICAgICAgICAgPSB3LldQQkNfQkZCX1NjaGVtYXMgfHwge307XHJcblx0XHRcdGNvbnN0IHNjaGVtYV9mb3JfdHlwZSA9IHNjaGVtYXNbdHlwZV0gfHwgbnVsbDtcclxuXHRcdFx0Y29uc3QgRmFjdG9yeSAgICAgICAgID0gdy5XUEJDX0JGQl9Db3JlLlVJICYmIHcuV1BCQ19CRkJfQ29yZS5VSS5XUEJDX0JGQl9JbnNwZWN0b3JfRmFjdG9yeTtcclxuXHJcblx0XHRcdGlmICggdHBsICkge1xyXG5cdFx0XHRcdC8vIE5FVzogbWVyZ2Ugc2NoZW1hIGRlZmF1bHRzIHNvIG1pc3Npbmcga2V5cyAoZXNwLiBib29sZWFucykgaG9ub3IgZGVmYXVsdHMgb24gZmlyc3QgcGFpbnRcclxuXHRcdFx0XHRjb25zdCBoYXNPd24gPSBGdW5jdGlvbi5jYWxsLmJpbmQoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgKTtcclxuXHRcdFx0XHRjb25zdCBwcm9wcyAgPSAoc2NoZW1hX2Zvcl90eXBlICYmIHNjaGVtYV9mb3JfdHlwZS5zY2hlbWEgJiYgc2NoZW1hX2Zvcl90eXBlLnNjaGVtYS5wcm9wcykgPyBzY2hlbWFfZm9yX3R5cGUuc2NoZW1hLnByb3BzIDoge307XHJcblx0XHRcdFx0Y29uc3QgbWVyZ2VkID0geyAuLi5kYXRhIH07XG5cdFx0XHRcdGlmICggcHJvcHMgKSB7XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoIHByb3BzICkuZm9yRWFjaCggKGspID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG1ldGEgPSBwcm9wc1trXSB8fCB7fTtcblx0XHRcdFx0XHRcdGlmICggIWhhc093biggZGF0YSwgayApICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhhc093biggbWV0YSwgJ2RlZmF1bHQnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29lcmNlIGJvb2xlYW5zIHRvIGEgcmVhbCBib29sZWFuOyBsZWF2ZSBvdGhlcnMgYXMtaXNcblx0XHRcdFx0XHRcdFx0XHRtZXJnZWRba10gPSAobWV0YS50eXBlID09PSAnYm9vbGVhbicpID8gISFtZXRhLmRlZmF1bHQgOiBtZXRhLmRlZmF1bHQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1ldGEudHlwZSA9PT0gJ2Jvb2xlYW4nICkge1xuXHRcdFx0XHRcdFx0XHQvLyBFeHBsaWNpdCBlbXB0eSB2YWx1ZXMgYXJlIGxlZ2FjeSB1bmNoZWNrZWQgYm9vbGVhbnMsIG5vdCBtaXNzaW5nIGRlZmF1bHRzLlxuXHRcdFx0XHRcdFx0XHRtZXJnZWRba10gPSB3LldQQkNfQkZCX0NvcmUuV1BCQ19CRkJfU2FuaXRpemUuY29lcmNlX2Jvb2xlYW4oIGRhdGFba10sIGZhbHNlICk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBkYXRhW2tdID09PSAnJyAmJiBoYXNPd24oIG1ldGEsICdkZWZhdWx0JyApICkge1xuXHRcdFx0XHRcdFx0XHRtZXJnZWRba10gPSBtZXRhLmRlZmF1bHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5wYW5lbC5pbm5lckhUTUwgPSB0cGwoIG1lcmdlZCApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9wb3N0X3JlbmRlcl91aSgpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCBzY2hlbWFfZm9yX3R5cGUgJiYgRmFjdG9yeSApIHtcclxuXHRcdFx0XHR0aGlzLnBhbmVsLmlubmVySFRNTCA9ICcnO1xyXG5cdFx0XHRcdEZhY3RvcnkucmVuZGVyKFxyXG5cdFx0XHRcdFx0dGhpcy5wYW5lbCxcclxuXHRcdFx0XHRcdHNjaGVtYV9mb3JfdHlwZSxcclxuXHRcdFx0XHRcdHsgLi4uZGF0YSB9LFxyXG5cdFx0XHRcdFx0eyBlbCwgYnVpbGRlcjogdGhpcy5idWlsZGVyLCB0eXBlLCB0aXRsZTogZGF0YS5sYWJlbCB8fCAnJyB9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBFbnN1cmUgdG9nZ2xlIG5vcm1hbGl6ZXJzIGFuZCBzbGlkZXIvbnVtYmVyL3VuaXQgd2lyaW5nIGFyZSBhdHRhY2hlZC5cclxuXHRcdFx0XHR0aGlzLl9wb3N0X3JlbmRlcl91aSgpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCBnZW5lcmljX3RwbCApIHtcclxuXHRcdFx0XHR0aGlzLnBhbmVsLmlubmVySFRNTCA9IGdlbmVyaWNfdHBsKCB7IC4uLmRhdGEgfSApO1xyXG5cdFx0XHRcdHRoaXMuX3Bvc3RfcmVuZGVyX3VpKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG1zZyAgICAgICAgICAgID0gYFRoZXJlIGFyZSBubyBJbnNwZWN0b3Igd3AudGVtcGxhdGUgXCIke3RwbF9pZH1cIiBvciBTY2hlbWEgZm9yIHRoaXMgXCIke1N0cmluZyggdHlwZSB8fCAnJyApfVwiIGVsZW1lbnQuYDtcclxuXHRcdFx0XHR0aGlzLnBhbmVsLmlubmVySFRNTCA9ICcnO1xyXG5cdFx0XHRcdGNvbnN0IGRpdiAgICAgICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0XHRkaXYuY2xhc3NOYW1lICAgICAgICA9ICd3cGJjX2JmYl9faW5zcGVjdG9yX19lbXB0eSc7XHJcblx0XHRcdFx0ZGl2LnRleHRDb250ZW50ICAgICAgPSBtc2c7IC8vIHNhZmUuXHJcblx0XHRcdFx0dGhpcy5wYW5lbC5hcHBlbmRDaGlsZCggZGl2ICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2VuZm9yY2VfZGVmYXVsdF9ncm91cF9vcGVuKCk7XHJcblx0XHRcdHRoaXMucGFuZWwuc2Nyb2xsVG9wID0gcHJldl9zY3JvbGw7XHJcblx0XHR9XHJcblxyXG5cdFx0X2VuZm9yY2VfZGVmYXVsdF9ncm91cF9vcGVuKCkge1xyXG5cdFx0XHRjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKCB0aGlzLnBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX2luc3BlY3Rvcl9fZ3JvdXAnICkgKTtcclxuXHRcdFx0aWYgKCAhZ3JvdXBzLmxlbmd0aCApIHJldHVybjtcclxuXHJcblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xyXG5cdFx0XHRncm91cHMuZm9yRWFjaCggKGcpID0+IHtcclxuXHRcdFx0XHRpZiAoICFmb3VuZCAmJiBnLmNsYXNzTGlzdC5jb250YWlucyggJ2lzLW9wZW4nICkgKSB7XHJcblx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmICggZy5jbGFzc0xpc3QuY29udGFpbnMoICdpcy1vcGVuJyApICkge1xyXG5cdFx0XHRcdFx0XHRnLmNsYXNzTGlzdC5yZW1vdmUoICdpcy1vcGVuJyApO1xyXG5cdFx0XHRcdFx0XHRnLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ3dwYmM6Y29sbGFwc2libGU6Y2xvc2UnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRnLmNsYXNzTGlzdC5yZW1vdmUoICdpcy1vcGVuJyApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0aWYgKCAhZm91bmQgKSB7XHJcblx0XHRcdFx0Z3JvdXBzWzBdLmNsYXNzTGlzdC5hZGQoICdpcy1vcGVuJyApO1xyXG5cdFx0XHRcdGdyb3Vwc1swXS5kaXNwYXRjaEV2ZW50KCBuZXcgRXZlbnQoICd3cGJjOmNvbGxhcHNpYmxlOm9wZW4nLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBkYXRhLWJmYi1zZWN0aW9uLWNvbHMgb24gdGhlIGluc3BlY3RvciBwYW5lbCBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWN0aW9uLlxyXG5cdFx0ICogVXNlcyB0aGUgcmVnaXN0ZXJlZCBjb21wdXRlIGZuIGlmIGF2YWlsYWJsZTsgZmFsbHMgYmFjayB0byBkaXJlY3QgRE9NLlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2VjdGlvbkVsXHJcblx0XHQgKi9cclxuXHRcdF9zZXRfcGFuZWxfc2VjdGlvbl9jb2xzKHNlY3Rpb25FbCkge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdC8vIFByZWZlciB0aGUgYWxyZWFkeS1yZWdpc3RlcmVkIHZhbHVlX2Zyb20gaGVscGVyIGlmIHByZXNlbnQuXHJcblx0XHRcdFx0dmFyIGNvbXB1dGUgPSB3LndwYmNfYmZiX2luc3BlY3Rvcl9mYWN0b3J5X3ZhbHVlX2Zyb20gJiYgdy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV92YWx1ZV9mcm9tLmNvbXB1dGVfc2VjdGlvbl9jb2x1bW5zO1xyXG5cclxuXHRcdFx0XHR2YXIgY29scyA9IDE7XHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgY29tcHV0ZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdGNvbHMgPSBjb21wdXRlKCB7IGVsOiBzZWN0aW9uRWwgfSApIHx8IDE7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIEZhbGxiYWNrOiBjb21wdXRlIGRpcmVjdGx5IGZyb20gdGhlIERPTS5cclxuXHRcdFx0XHRcdHZhciByb3cgPSBzZWN0aW9uRWwgJiYgc2VjdGlvbkVsLnF1ZXJ5U2VsZWN0b3IoICc6c2NvcGUgPiAud3BiY19iZmJfX3JvdycgKTtcclxuXHRcdFx0XHRcdGNvbHMgICAgPSByb3cgPyAocm93LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKS5sZW5ndGggfHwgMSkgOiAxO1xyXG5cdFx0XHRcdFx0aWYgKCBjb2xzIDwgMSApIGNvbHMgPSAxO1xyXG5cdFx0XHRcdFx0aWYgKCBjb2xzID4gNCApIGNvbHMgPSA0O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLnBhbmVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtYmZiLXNlY3Rpb24tY29scycsIFN0cmluZyggY29scyApICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdF9jcmVhdGVfZmFsbGJhY2tfcGFuZWwoKSB7XHJcblx0XHRcdGNvbnN0IHAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0cC5pZCAgICAgICAgPSAnd3BiY19iZmJfX2luc3BlY3Rvcic7XHJcblx0XHRcdHAuY2xhc3NOYW1lID0gJ3dwYmNfYmZiX19pbnNwZWN0b3InO1xyXG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCBwICk7XHJcblx0XHRcdHJldHVybiAvKiogQHR5cGUge0hUTUxEaXZFbGVtZW50fSAqLyAocCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBFeHBvcnQgY2xhc3MgKyByZWFkeSBzaWduYWwuXHJcblx0dy5XUEJDX0JGQl9JbnNwZWN0b3IgPSBXUEJDX0JGQl9JbnNwZWN0b3I7XHJcblx0ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnd3BiY19iZmJfaW5zcGVjdG9yX3JlYWR5JyApICk7XHJcblxyXG59KSggd2luZG93ICk7XHJcbiJdLCJtYXBwaW5ncyI6ImFBQUE7QUFDQTtBQUNBO0FBQ0EsVUFBQUEsQ0FBQSxFQUNBLGFBRUE7QUFDQSxNQUFBQyxJQUFBLENBQUFELENBQUEsQ0FBQUUsYUFBQSxDQUFBRixDQUFBLENBQUFFLGFBQUEsS0FDQSxNQUFBQyxFQUFBLENBQUFGLElBQUEsQ0FBQUUsRUFBQSxDQUFBRixJQUFBLENBQUFFLEVBQUEsS0FFQTtBQUNBO0FBQ0E7QUFDQSxJQUNBRixJQUFBLENBQUFHLGlCQUFBLE9BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUNBLE9BQUFDLFFBQUFDLENBQUEsRUFDQSxPQUFBTixDQUFBLENBQUFPLEdBQUEsRUFBQVAsQ0FBQSxDQUFBTyxHQUFBLENBQUFDLE1BQUEsQ0FBQVIsQ0FBQSxDQUFBTyxHQUFBLENBQUFDLE1BQUEsQ0FBQUMsTUFBQSxDQUFBSCxDQUFBLEdBQUFHLE1BQUEsQ0FBQUgsQ0FBQSxFQUFBSSxPQUFBLHFCQUNBLENBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUNBLE9BQUFDLDRCQUFBQyxDQUFBLEVBQ0EsT0FBQUgsTUFBQSxDQUFBRyxDQUFBLEVBQ0FGLE9BQUEsZUFDQUEsT0FBQSxhQUNBQSxPQUFBLGVBQ0FBLE9BQUEsY0FDQSxDQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FDQSxPQUFBRyxpQkFBQUQsQ0FB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
|
| 1355 |
|