@wavemaker/app-ng-runtime 11.15.5-rc.261 → 11.15.5-rc.262
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/data/table/bundles/index.umd.js +5 -1
- package/components/data/table/esm2022/table.component.mjs +6 -2
- package/components/data/table/fesm2022/index.mjs +5 -1
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/datatable/datatable.js +6 -0
- package/variables/bundles/index.umd.js +78 -7
- package/variables/esm2022/service/variables.service.mjs +5 -3
- package/variables/esm2022/util/variable/service-variable.utils.mjs +25 -7
- package/variables/esm2022/util/variable/variables.utils.mjs +52 -2
- package/variables/fesm2022/index.mjs +79 -8
- package/variables/fesm2022/index.mjs.map +1 -1
- package/variables/service/variables.service.d.ts +1 -1
- package/variables/util/variable/variables.utils.d.ts +7 -0
|
@@ -470,7 +470,28 @@ const setValueToNode = (target, obj, root, variable, value, noUpdate) => {
|
|
|
470
470
|
value = !isUndefined(value) ? value : obj.value;
|
|
471
471
|
/* sanity check, user can bind parent nodes to non-object values, so child node bindings may fail */
|
|
472
472
|
if (targetObj) {
|
|
473
|
-
|
|
473
|
+
// Multi query params: one slot per binding; rebinds replace that slot (not append).
|
|
474
|
+
// Exception: if the bind expression itself resolved to the complete array
|
|
475
|
+
// (e.g. `bind:['fire', 'water']`), assign it directly instead of treating it
|
|
476
|
+
// as a single slot's value — same as the non-multi assignment below.
|
|
477
|
+
if (obj.collectionFormat === 'multi' && !isArray(value)) {
|
|
478
|
+
let values = targetObj[targetNodeKey];
|
|
479
|
+
if (!isArray(values)) {
|
|
480
|
+
values = targetObj[targetNodeKey] = isUndefined(values) ? [] : [values];
|
|
481
|
+
}
|
|
482
|
+
let slot = obj.multiIndex !== undefined ? obj.multiIndex : obj.__multiSlotIndex;
|
|
483
|
+
if (slot === undefined) {
|
|
484
|
+
slot = obj.__multiSlotIndex = values.length;
|
|
485
|
+
values.push(value);
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
obj.__multiSlotIndex = slot;
|
|
489
|
+
values[slot] = value;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
targetObj[targetNodeKey] = value;
|
|
494
|
+
}
|
|
474
495
|
}
|
|
475
496
|
processVariablePostBindUpdate(targetNodeKey, value, obj.type, variable, noUpdate);
|
|
476
497
|
};
|
|
@@ -579,6 +600,32 @@ const processBindObject = (obj, scope, root, variable) => {
|
|
|
579
600
|
* for some it can be 'dataSet' and hence will be passed as param
|
|
580
601
|
* @param {string} bindTarget, the object field in variable where the computed bindings will be set
|
|
581
602
|
*/
|
|
603
|
+
/**
|
|
604
|
+
* In older saved REST/Swagger service variables, duplicate query parameters may not have a
|
|
605
|
+
* collectionFormat, so they are treated as multi-value parameters for backward compatibility:
|
|
606
|
+
* each duplicate target is tagged collectionFormat 'multi' and given a stable multiIndex.
|
|
607
|
+
* Shared by both processBinding implementations (this file and VariablesService).
|
|
608
|
+
*/
|
|
609
|
+
export const applyMultiIndexForDuplicateBindings = (bindMap) => {
|
|
610
|
+
const targetOccurrences = {};
|
|
611
|
+
bindMap.forEach(function (node) {
|
|
612
|
+
if (node && node.target) {
|
|
613
|
+
targetOccurrences[node.target] = (targetOccurrences[node.target] || 0) + 1;
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
const nextMultiIndex = {};
|
|
617
|
+
bindMap.forEach(function (node) {
|
|
618
|
+
if (node && node.target && targetOccurrences[node.target] > 1) {
|
|
619
|
+
if (!node.collectionFormat) {
|
|
620
|
+
node.collectionFormat = 'multi';
|
|
621
|
+
}
|
|
622
|
+
if (node.multiIndex === undefined) {
|
|
623
|
+
nextMultiIndex[node.target] = nextMultiIndex[node.target] || 0;
|
|
624
|
+
node.multiIndex = nextMultiIndex[node.target]++;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
});
|
|
628
|
+
};
|
|
582
629
|
export const processBinding = (variable, context, bindSource, bindTarget) => {
|
|
583
630
|
bindSource = bindSource || 'dataBinding';
|
|
584
631
|
bindTarget = bindTarget || 'dataBinding';
|
|
@@ -588,6 +635,9 @@ export const processBinding = (variable, context, bindSource, bindTarget) => {
|
|
|
588
635
|
if (!bindMap || !isArray(bindMap)) {
|
|
589
636
|
return;
|
|
590
637
|
}
|
|
638
|
+
if (variable.category === VARIABLE_CONSTANTS.CATEGORY.SERVICE) {
|
|
639
|
+
applyMultiIndexForDuplicateBindings(bindMap);
|
|
640
|
+
}
|
|
591
641
|
bindMap.forEach(function (node) {
|
|
592
642
|
/* for static variable change the binding with target 'dataBinding' to 'dataSet', as the results have to reflect directly in the dataSet */
|
|
593
643
|
if (variable.category === 'wm.Variable' && node.target === 'dataBinding') {
|
|
@@ -806,4 +856,4 @@ export const decodeData = (responseContent) => {
|
|
|
806
856
|
function htmlDecode(input) {
|
|
807
857
|
return he.unescape(input);
|
|
808
858
|
}
|
|
809
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFyaWFibGVzL3NyYy91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsV0FBVyxFQUNYLE1BQU0sRUFDTixRQUFRLEVBQ1IsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEVBQ1gsT0FBTyxFQUNQLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNaLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBWSxrQkFBa0IsRUFBRSxZQUFZLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNoRyxPQUFPLEVBQ0gsUUFBUSxFQUFFLE1BQU0sRUFDaEIsT0FBTyxFQUNQLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFDOUIsT0FBTyxFQUNQLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUM5QixRQUFRLEVBQ1IsV0FBVyxFQUNYLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFDckIsSUFBSSxFQUNKLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFDNUIsS0FBSyxFQUNMLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDaEMsTUFBTSxXQUFXLENBQUM7QUFJbkIsT0FBTyxLQUFLLFNBQVMsTUFBTyxRQUFRLENBQUM7QUFDckMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFHckQsTUFBTSxjQUFjLEdBQUssRUFBRSxPQUFPLEVBQUcsT0FBTyxFQUFFLEtBQUssRUFBRyxNQUFNLEVBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDdEIsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDO0FBQ3ZC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O0lBQ3JCLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICAkcGFyc2VFdmVudCxcbiAgICAkd2F0Y2gsXG4gICAgRGF0YVR5cGUsXG4gICAgREVGQVVMVF9GT1JNQVRTLFxuICAgIGV4dHJhY3RUeXBlLFxuICAgIGZpbmRWYWx1ZU9mLFxuICAgIGdldEJsb2IsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgdHJpZ2dlckZuXG59IGZyb20gJ0B3bS9jb3JlJztcblxuaW1wb3J0IHtDT05TVEFOVFMsIFZBUklBQkxFX0NPTlNUQU5UUywgV1NfQ09OU1RBTlRTfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdmFyaWFibGVzLmNvbnN0YW50cyc7XG5pbXBvcnQge1xuICAgIGRlYm91bmNlLCBmaWx0ZXIsXG4gICAgZm9yRWFjaCxcbiAgICBnZXQsIGluY2x1ZGVzLCBpc0FycmF5LCBpc0RhdGUsXG4gICAgaXNFbXB0eSxcbiAgICBpc0Z1bmN0aW9uLCBpc051bWJlciwgaXNPYmplY3QsXG4gICAgaXNTdHJpbmcsXG4gICAgaXNVbmRlZmluZWQsXG4gICAgam9pbiwga2V5cywgbGFzdCwgbWFwLFxuICAgIG5vb3AsXG4gICAgcGlja0J5LCByZW1vdmUsIHJlcGxhY2UsIHNldCxcbiAgICBzbGljZSxcbiAgICBzcGxpdCwgdG9Mb3dlciwgdG9VcHBlciwgdHJpbVxufSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmRlY2xhcmUgY29uc3QgJDtcbmRlY2xhcmUgY29uc3QgaGU7XG5pbXBvcnQgKiBhcyBtb21lbnRMaWIgIGZyb20gJ21vbWVudCc7XG5jb25zdCBtb21lbnQgPSBtb21lbnRMaWIuZGVmYXVsdCB8fCB3aW5kb3dbJ21vbWVudCddO1xuZGVjbGFyZSBjb25zdCB3aW5kb3c7XG5cbmNvbnN0IGV4cG9ydFR5cGVzTWFwICAgPSB7ICdFWENFTCcgOiAnLnhsc3gnLCAnQ1NWJyA6ICcuY3N2J307XG5cbmV4cG9ydCBsZXQgYXBwTWFuYWdlcjtcbmV4cG9ydCBsZXQgaHR0cFNlcnZpY2U7XG5leHBvcnQgbGV0IG1ldGFkYXRhU2VydmljZTtcbmV4cG9ydCBsZXQgbmF2aWdhdGlvblNlcnZpY2U7XG5leHBvcnQgbGV0IHJvdXRlclNlcnZpY2U7XG5leHBvcnQgbGV0IHRvYXN0ZXJTZXJ2aWNlO1xuZXhwb3J0IGxldCBvYXV0aFNlcnZpY2U7XG5leHBvcnQgbGV0IHNlY3VyaXR5U2VydmljZTtcbmV4cG9ydCBsZXQgZGlhbG9nU2VydmljZTtcblxuY29uc3QgRE9UX0VYUFJfUkVYID0gL15cXFsoXCJ8JylbXFx3XFxXXSooXFwxKVxcXSQvLFxuICAgIGludGVybmFsQm91bmROb2RlTWFwID0gbmV3IE1hcCgpLFxuICAgIHRpbWVycyA9IG5ldyBNYXAoKTtcblxuY29uc3QgX2ludm9rZSA9ICh2YXJpYWJsZSwgb3ApID0+IHtcbiAgICBsZXQgZGVib3VuY2VkRm4sXG4gICAgICAgIGNhbmNlbEZuID0gbm9vcCxcbiAgICAgICAgcmV0VmFsO1xuICAgIGlmICh0aW1lcnMuaGFzKHZhcmlhYmxlKSkge1xuICAgICAgICBjYW5jZWxGbiA9IHRpbWVycy5nZXQodmFyaWFibGUpLmNhbmNlbDtcbiAgICB9XG4gICAgY2FuY2VsRm4oKTtcbiAgICBkZWJvdW5jZWRGbiA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0VmFsID0gdmFyaWFibGVbb3BdKCk7XG4gICAgICAgIC8vIGhhbmRsZSBwcm9taXNlcyB0byBhdm9pZCB1bmNhdWdodCBwcm9taXNlIGVycm9ycyBpbiBjb25zb2xlXG4gICAgICAgIGlmIChyZXRWYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXRWYWwuY2F0Y2gobm9vcCk7XG4gICAgICAgIH1cbiAgICB9LCAxMDApO1xuICAgIHRpbWVycy5zZXQodmFyaWFibGUsIGRlYm91bmNlZEZuKTtcbiAgICBkZWJvdW5jZWRGbigpO1xufTtcblxuY29uc3QgcHJvY2Vzc1ZhcmlhYmxlUG9zdEJpbmRVcGRhdGUgPSAobm9kZU5hbWUsIG5vZGVWYWwsIG5vZGVUeXBlLCB2YXJpYWJsZSwgbm9VcGRhdGUpID0+IHtcbiAgICBzd2l0Y2ggKHZhcmlhYmxlLmNhdGVnb3J5KSB7XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLkxJVkU6XG4gICAgICAgICAgICBpZiAodmFyaWFibGUub3BlcmF0aW9uID09PSAncmVhZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhQmluZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yRWFjaChub2RlVmFsLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbHRlckZpZWxkc1trZXldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZmlsdGVyRmllbGRzW25vZGVOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IG5vZGVWYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgOiBub2RlVHlwZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBpZiBhdXRvLXVwZGF0ZSBzZXQgZm9yIHRoZSB2YXJpYWJsZSB3aXRoIHJlYWQgb3BlcmF0aW9uIG9ubHksIGdldCBpdHMgZGF0YSAqL1xuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFpc1VuZGVmaW5lZChub2RlVmFsKSAmJiBpc0Z1bmN0aW9uKHZhcmlhYmxlLmxpc3RSZWNvcmRzKSAmJiAhbm9VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2xpc3RSZWNvcmRzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhQmluZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuaW5wdXRGaWVsZHMgPSBub2RlVmFsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmlucHV0RmllbGRzW25vZGVOYW1lXSA9IG5vZGVWYWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGlmIGF1dG8tdXBkYXRlIHNldCBmb3IgdGhlIHZhcmlhYmxlIHdpdGggcmVhZCBvcGVyYXRpb24gb25seSwgZ2V0IGl0cyBkYXRhICovXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmF1dG9VcGRhdGUgJiYgIWlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIGlzRnVuY3Rpb24odmFyaWFibGVbdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCddKSAmJiAhbm9VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5DUlVEOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm9wZXJhdGlvblR5cGUgPT09ICdsaXN0JyAmJiB2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFpc1VuZGVmaW5lZChub2RlVmFsKSAmJiBpc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLlNFUlZJQ0U6XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLkxPR0lOOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmF1dG9VcGRhdGUgJiYgIWlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIGlzRnVuY3Rpb24odmFyaWFibGUuaW52b2tlKSAmJiAhbm9VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICBfaW52b2tlKHZhcmlhYmxlLCAnaW52b2tlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVwZW5kZW5jeSA9ICh0eXBlOiBzdHJpbmcsIHJlZjogYW55KSA9PiB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FwcE1hbmFnZXInOlxuICAgICAgICAgICAgYXBwTWFuYWdlciA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdodHRwJzpcbiAgICAgICAgICAgIGh0dHBTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21ldGFkYXRhJzpcbiAgICAgICAgICAgIG1ldGFkYXRhU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduYXZpZ2F0aW9uU2VydmljZSc6XG4gICAgICAgICAgICBuYXZpZ2F0aW9uU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyb3V0ZXInOlxuICAgICAgICAgICAgcm91dGVyU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b2FzdGVyJzpcbiAgICAgICAgICAgIHRvYXN0ZXJTZXJ2aWNlID0gIHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvQXV0aCc6XG4gICAgICAgICAgICBvYXV0aFNlcnZpY2UgPSAgcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NlY3VyaXR5JzpcbiAgICAgICAgICAgIHNlY3VyaXR5U2VydmljZSA9ICByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgICAgICAgIGRpYWxvZ1NlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgaW5pdGlhdGVDYWxsYmFjayA9ICh0eXBlOiBzdHJpbmcsIHZhcmlhYmxlOiBhbnksIGRhdGE6IGFueSwgb3B0aW9ucz86IGFueSwgc2tpcERlZmF1bHROb3RpZmljYXRpb24/OiBib29sZWFuKSA9PiB7XG5cbiAgICAvKmNoZWNraW5nIGlmIGV2ZW50IGlzIGF2YWlsYWJsZSBhbmQgdmFyaWFibGUgaGFzIGV2ZW50IHByb3BlcnR5IGFuZCB2YXJpYWJsZSBldmVudCBwcm9wZXJ0eSBib3VuZCB0byBmdW5jdGlvbiovXG4gICAgY29uc3QgZXZlbnRWYWx1ZXMgPSB2YXJpYWJsZVt0eXBlXSxcbiAgICAgICAgY2FsbEJhY2tTY29wZSA9IHZhcmlhYmxlLl9jb250ZXh0O1xuICAgIGxldCBlcnJvclZhcmlhYmxlO1xuICAgIC8qKlxuICAgICAqIEZvciBlcnJvciBldmVudDpcbiAgICAgKiB0cmlnZ2VyIGFwcCBsZXZlbCBlcnJvciBoYW5kbGVyLlxuICAgICAqIGlmIG5vIGV2ZW50IGlzIGFzc2lnbmVkLCB0cmlnZ2VyIGRlZmF1bHQgYXBwTm90aWZpY2F0aW9uIHZhcmlhYmxlLlxuICAgICAqL1xuICAgaWYgKHR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVC5FUlJPUiAmJiAhc2tpcERlZmF1bHROb3RpZmljYXRpb24pIHtcbiAgICAgICAgaWYgKCFldmVudFZhbHVlcykge1xuICAgICAgICAgICAgLyogaW4gY2FzZSBvZiBlcnJvciwgaWYgbm8gZXZlbnQgYXNzaWduZWQsIGhhbmRsZSB0aHJvdWdoIGRlZmF1bHQgbm90aWZpY2F0aW9uIHZhcmlhYmxlICovXG4gICAgICAgICAgICBlcnJvclZhcmlhYmxlID0gY2FsbEJhY2tTY29wZS5BY3Rpb25zW1ZBUklBQkxFX0NPTlNUQU5UUy5ERUZBVUxUX1ZBUi5OT1RJRklDQVRJT05dO1xuICAgICAgICAgICAgaWYgKGVycm9yVmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZXJyb3JWYXJpYWJsZS5nZXRNZXNzYWdlKCkgfHwgZGF0YTtcbiAgICAgICAgICAgICAgICBkYXRhID0gaXNTdHJpbmcoZGF0YSkgPyBkYXRhIDogJ0FuIGVycm9yIGhhcyBvY2N1cmVkLiBQbGVhc2UgY2hlY2sgdGhlIGFwcCBsb2dzLic7XG4gICAgICAgICAgICAgICAgZXJyb3JWYXJpYWJsZS5pbnZva2UoeyAnbWVzc2FnZScgOiBkYXRhfSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRlbWl0KFwiaW52b2tlLXNlcnZpY2VcIiwgVkFSSUFCTEVfQ09OU1RBTlRTLkRFRkFVTFRfVkFSLk5PVElGSUNBVElPTiwge3Njb3BlOiBjYWxsQmFja1Njb3BlLCBtZXNzYWdlOiByZXNwb25zZX0pO1xuICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE86IFtWaWJodV0sIGNoZWNrIHdoZXRoZXIgdG8gc3VwcG9ydCBsZWdhY3kgZXZlbnQgY2FsbGluZyBtZWNoYW5pc20gKGlkZWFsbHksIGl0IHNob3VsZCBoYXZlIGJlZW4gbWlncmF0ZWQpXG4gICAgY29uc3QgZm4gPSAkcGFyc2VFdmVudCh2YXJpYWJsZVt0eXBlXSk7XG4gICAgaWYgKHR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVC5CRUZPUkVfVVBEQVRFKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLkxpdmVWYXJpYWJsZScgJiYgdmFyaWFibGUub3BlcmF0aW9uID09PSAncmVhZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YUZpbHRlcjogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBpbnB1dERhdGE6IGRhdGEsIG9wdGlvbnM6IG9wdGlvbnN9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YTogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgIH1cbn07XG5cbmNvbnN0IHRyaWdnZXJPblRpbWVvdXQgPSAoc3VjY2VzcykgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0cmlnZ2VyRm4oc3VjY2Vzcyk7IH0sIDUwMCk7XG59O1xuXG5jb25zdCBkb3dubG9hZEZpbGVmcm9tUmVzcG9uc2UgPSAocmVzcG9uc2UsIGhlYWRlcnMsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgLy8gY2hlY2sgZm9yIGEgZmlsZW5hbWVcbiAgICBsZXQgZmlsZW5hbWUgPSAnJyxcbiAgICAgICAgZmlsZW5hbWVSZWdleCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYmxvYixcbiAgICAgICAgVVJMLFxuICAgICAgICBkb3dubG9hZFVybCxcbiAgICAgICAgcG9wdXA7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xuICAgIGlmIChkaXNwb3NpdGlvbiAmJiBkaXNwb3NpdGlvbi5pbmRleE9mKCdhdHRhY2htZW50JykgIT09IC0xKSB7XG4gICAgICAgIGZpbGVuYW1lUmVnZXggPSAvZmlsZW5hbWVbXjs9XFxuXSo9KChbJ1wiXSkuKj9cXDJ8W147XFxuXSopLztcbiAgICAgICAgbWF0Y2hlcyA9IGZpbGVuYW1lUmVnZXguZXhlYyhkaXNwb3NpdGlvbik7XG4gICAgICAgIGlmIChtYXRjaGVzICE9PSBudWxsICYmIG1hdGNoZXNbMV0pIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gbWF0Y2hlc1sxXS5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0eXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgIGJsb2IgPSBuZXcgQmxvYihbcmVzcG9uc2VdLCB7IHR5cGU6IHR5cGUgfSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gSUUgd29ya2Fyb3VuZCBmb3IgXCJIVE1MNzAwNzogT25lIG9yIG1vcmUgYmxvYiBVUkxzIHdlcmUgcmV2b2tlZCBieSBjbG9zaW5nIHRoZSBibG9iIGZvciB3aGljaCB0aGV5IHdlcmUgY3JlYXRlZC4gVGhlc2UgVVJMcyB3aWxsIG5vIGxvbmdlciByZXNvbHZlIGFzIHRoZSBkYXRhIGJhY2tpbmcgdGhlIFVSTCBoYXMgYmVlbiBmcmVlZC5cIlxuICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgdHJpZ2dlck9uVGltZW91dChzdWNjZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJGbihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBVUkwgICAgICAgICA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDtcbiAgICAgICAgZG93bmxvYWRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgICAgICAgLy8gdXNlIEhUTUw1IGFbZG93bmxvYWRdIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGZpbGVuYW1lXG4gICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGV0IHJlYWRlcjtcbiAgICAgICAgICAgIC8vIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYS5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlYWRlci5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpO1xuICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IHRyaWdnZXJPblRpbWVvdXQuYmluZCh1bmRlZmluZWQsIHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGEuaHJlZiA9IGRvd25sb2FkVXJsO1xuICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wdXAgPSB3aW5kb3cub3Blbihkb3dubG9hZFVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFVSTC5yZXZva2VPYmplY3RVUkwoZG93bmxvYWRVcmwpOyB9LCAxMDApOyAvLyBjbGVhbnVwXG4gICAgfVxufTtcblxuY29uc3QgZ2V0U2VydmljZSA9IChzZXJ2aWNlTmFtZSkgPT4ge1xuICAgIGlmICghc2VydmljZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmljZU5hbWU7XG4gICAgLy8gVG9kbzogU2h1YmhhbSwgdW5jb21tZW50IGJlbG93IGNvZGVcbiAgICAvKiAvISogZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHdoZXJlIG5nLWFwcCBpcyBkZWZpbmVkICohL1xuICAgICBsZXQgYXBwRWwgPSBXTS5lbGVtZW50KCdbaWQ9bmctYXBwXScpLCBpbmplY3RvcjtcbiAgICAgaWYgKGFwcEVsKSB7XG4gICAgIHRyeSB7XG4gICAgIGluamVjdG9yID0gYXBwRWwuaW5qZWN0b3IoKTsgLy8gZ2V0IHRoZSBhbmd1bGFyIGluamVjdG9yXG4gICAgIGlmIChpbmplY3Rvcikge1xuICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lKTsgLy8gcmV0dXJuIHRoZSBzZXJ2aWNlXG4gICAgIH1cbiAgICAgfSBjYXRjaCAoZSkge1xuICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICB9XG4gICAgIH0qL1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgdGhlIGZvcm0gZGF0YSBwYXJhbXMgZnJvbSB0aGUgVVJMXG4gKiBAcGFyYW0gcXVlcnlQYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqL1xuY29uc3Qgc2V0UGFyYW1zRnJvbVVSTCA9IChxdWVyeVBhcmFtcywgcGFyYW1zKSA9PiB7XG4gICAgcXVlcnlQYXJhbXMgPSBzcGxpdChxdWVyeVBhcmFtcywgJyYnKTtcbiAgICBmb3JFYWNoKHF1ZXJ5UGFyYW1zLCBmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgcGFyYW0gPSBzcGxpdChwYXJhbSwgJz0nKTtcbiAgICAgICAgcGFyYW1zW3BhcmFtWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChqb2luKHNsaWNlKHBhcmFtLCAxKSwgJz0nKSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIFtUb2RvOiBTaHViaGFtXSwgSW1wbGVtZW50IERvd25sb2FkIHRocm91Z2ggSSBmcmFtZVxuICogU2ltdWxhdGVzIGZpbGUgZG93bmxvYWQgaW4gYW4gYXBwIHRocm91Z2ggY3JlYXRpbmcgYW5kIHN1Ym1pdHRpbmcgYSBoaWRkZW4gZm9ybSBpbiBET00uXG4gKiBUaGUgYWN0aW9uIHdpbGwgYmUgaW5pdGlhdGVkIHRocm91Z2ggYSBTZXJ2aWNlIFZhcmlhYmxlXG4gKlxuICogUXVlcnkgUGFyYW1zXG4gKiBUaGUgcmVxdWVzdCBwYXJhbXMgbGlrZSBxdWVyeSBwYXJhbXMgYXJlIGFkZGVkIGFzIGhpZGRlbiBpbnB1dCBlbGVtZW50c1xuICpcbiAqIEhlYWRlciBQYXJhbXNcbiAqIFRoZSBoZWFkZXIgcGFyYW1zIGZvciBhIHJlcXVlc3QgYXJlIGFsc28gYWRkZWQgYWxvbmcgd2l0aCBoaWRkZW4gaW5wdXQgZWxlbWVudHMuXG4gKiBUaGlzIGlzIGRvbmUgYXMgaGVhZGVycyBjYW4gbm90IGJlIHNldCBmb3IgYSBmb3JtIFBPU1QgY2FsbCBmcm9tIEphdmFTY3JpcHRcbiAqXG4gKiBGaW5hbGx5LCByZXF1ZXN0IHBhcmFtZXRlcnMgYXJlIHNlbnQgYXMgZm9sbG93czpcbiAqIEZvciBhIEdFVCByZXF1ZXN0LCB0aGUgcmVxdWVzdCBkYXRhIGlzIHNlbnQgYWxvbmcgd2l0aCB0aGUgcXVlcnkgcGFyYW1zLlxuICogRm9yIFBPU1QsIGl0IGlzIHNlbnQgYXMgcmVxdWVzdCBib2R5LlxuICpcbiAqIEBwYXJhbSB2YXJpYWJsZTogdGhlIHZhcmlhYmxlIHRoYXQgaXMgY2FsbGVkIGZyb20gdXNlciBhY3Rpb25cbiAqIEBwYXJhbSByZXF1ZXN0UGFyYW1zIG9iamVjdCBjb25zaXN0aW5nIHRoZSBpbmZvIHRvIGNvbnN0cnVjdCB0aGUgWEhSIHJlcXVlc3QgZm9yIHRoZSBzZXJ2aWNlXG4gKi9cbmNvbnN0IGRvd25sb2FkVGhyb3VnaElmcmFtZSA9IChyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBkYXRhQmluZGluZyxlcnJvcikgPT4ge1xuICAgIC8vIFRvZG86IFNIdWJoYW06IFVSTCBjb250YWlucyAnLy8nIGluIGJldHdlZW4gd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYXQgdGhlIFVSTCBmb3JtYXRpb24gb25seVxuICAgIGlmIChyZXF1ZXN0UGFyYW1zLnVybFsxXSA9PT0gJy8nICYmIHJlcXVlc3RQYXJhbXMudXJsWzJdID09PSAnLycpIHtcbiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSByZXF1ZXN0UGFyYW1zLnVybC5zbGljZSgwLCAxKSArIHJlcXVlc3RQYXJhbXMudXJsLnNsaWNlKDIpO1xuICAgIH1cbiAgICBsZXQgaUZyYW1lRWxlbWVudCxcbiAgICAgICAgZm9ybUVsLFxuICAgICAgICBwYXJhbUVsZW1lbnQsXG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gJycsXG4gICAgICAgIGRhdGE7XG4gICAgY29uc3QgSUZSQU1FX05BTUUgICAgID0gJ2ZpbGVEb3dubG9hZElGcmFtZScsXG4gICAgICAgIEZPUk1fTkFNRSAgICAgICA9ICdmaWxlRG93bmxvYWRGb3JtJyxcbiAgICAgICAgQ09OVEVOVF9UWVBFICAgID0gJ0NvbnRlbnQtVHlwZScsXG4gICAgICAgIHVybCAgICAgICAgICAgICA9IHJlcXVlc3RQYXJhbXMudXJsLFxuICAgICAgICBlbmNUeXBlID0gZ2V0KHJlcXVlc3RQYXJhbXMuaGVhZGVycywgQ09OVEVOVF9UWVBFKSxcbiAgICAgICAgcGFyYW1zID0gcGlja0J5KHJlcXVlc3RQYXJhbXMuaGVhZGVycywgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5ICE9PSBDT05URU5UX1RZUEU7XG4gICAgICAgIH0pO1xuICAgIC8qIFRvZG86IHNodWJoYW0gOiBkZWZpbmUgZ2V0U2VydmljZSBtZXRob2RcbiAgICAgV1NfQ09OU1RBTlRTICAgID0gZ2V0U2VydmljZSgnV1NfQ09OU1RBTlRTJyk7Ki9cblxuICAgIC8qIGxvb2sgZm9yIGV4aXN0aW5nIGlmcmFtZS4gSWYgZXhpc3RzLCByZW1vdmUgaXQgZmlyc3QgKi9cbiAgICBpRnJhbWVFbGVtZW50ID0gJCgnIycgKyBJRlJBTUVfTkFNRSk7XG4gICAgaWYgKGlGcmFtZUVsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgIGlGcmFtZUVsZW1lbnQuZmlyc3QoKS5yZW1vdmUoKTtcbiAgICB9XG4gICAgaUZyYW1lRWxlbWVudCA9ICQoJzxpZnJhbWUgaWQ9XCInICsgSUZSQU1FX05BTUUgKyAnXCIgbmFtZT1cIicgKyBJRlJBTUVfTkFNRSArICdcIiBjbGFzcz1cIm5nLWhpZGVcIj48L2lmcmFtZT4nKTtcbiAgICBmb3JtRWwgICAgICAgID0gJCgnPGZvcm0gaWQ9XCInICsgRk9STV9OQU1FICsgJ1wiIG5hbWU9XCInICsgRk9STV9OQU1FICsgJ1wiPjwvZm9ybT4nKTtcblxuICAgIC8qIHByb2Nlc3MgcXVlcnkgcGFyYW1zLCBhcHBlbmQgYSBoaWRkZW4gaW5wdXQgZWxlbWVudCBpbiB0aGUgZm9ybSBhZ2FpbnN0IGVhY2ggcGFyYW0gKi9cbiAgICBxdWVyeVBhcmFtcyArPSB1cmwuaW5kZXhPZignPycpICE9PSAtMSA/IHVybC5zdWJzdHJpbmcodXJsLmluZGV4T2YoJz8nKSArIDEpIDogJyc7XG4gICAgcXVlcnlQYXJhbXMgKz0gZW5jVHlwZSA9PT0gV1NfQ09OU1RBTlRTLkNPTlRFTlRfVFlQRVMuRk9STV9VUkxfRU5DT0RFRCA/ICgocXVlcnlQYXJhbXMgPyAnJicgOiAnJykgKyByZXF1ZXN0UGFyYW1zLmRhdGFQYXJhbXMpIDogJyc7XG5cbiAgICBmb3JtRWwuYXR0cih7XG4gICAgICAgICd0YXJnZXQnICA6IGlGcmFtZUVsZW1lbnQuYXR0cignbmFtZScpLFxuICAgICAgICAnYWN0aW9uJyAgOiB1cmwsXG4gICAgICAgICdtZXRob2QnICA6IHJlcXVlc3RQYXJhbXMubWV0aG9kLFxuICAgICAgICAnZW5jdHlwZSc6ICEoaXNFbXB0eShyZXF1ZXN0UGFyYW1zLmRhdGEpICYmIGlzRW1wdHkocXVlcnlQYXJhbXMpKSA/IGVuY1R5cGUgOiBXU19DT05TVEFOVFMuQ09OVEVOVF9UWVBFUy5NVUxUSVBBUlRfRk9STURBVEFcbiAgICB9KTtcblxuICAgIC8vIEZvciBOb24gYm9keSBtZXRob2RzIG9ubHksIHNldCB0aGUgaW5wdXQgZmllbGRzIGZyb20gcXVlcnkgcGFyYW1ldGVyc1xuICAgIGlmIChpbmNsdWRlcyhXU19DT05TVEFOVFMuTk9OX0JPRFlfSFRUUF9NRVRIT0RTLCB0b1VwcGVyKHJlcXVlc3RQYXJhbXMubWV0aG9kKSkpIHtcbiAgICAgICAgc2V0UGFyYW1zRnJvbVVSTChxdWVyeVBhcmFtcywgcGFyYW1zKTsgLy8gU2V0IHBhcmFtcyBmb3IgVVJMIHF1ZXJ5IHBhcmFtc1xuICAgIH1cbiAgICBpZiAoIWlzRW1wdHkocmVxdWVzdFBhcmFtcy5kYXRhKSkge1xuICAgICAgICBzZXRQYXJhbXNGcm9tVVJMKHJlcXVlc3RQYXJhbXMuZGF0YSwgcGFyYW1zKTsvLyBTZXQgcGFyYW1zIGZvciByZXF1ZXN0IGRhdGFcbiAgICAgICAgZGF0YSA9IHBhcmFtcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhID0gaXNFbXB0eShkYXRhQmluZGluZykgPyBwYXJhbXMgOiBkYXRhQmluZGluZztcbiAgICB9XG4gICAgZm9yRWFjaChkYXRhLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgcGFyYW1FbGVtZW50ID0gJCgnPGlucHV0IHR5cGU9XCJoaWRkZW5cIj4nKTtcbiAgICAgICAgcGFyYW1FbGVtZW50LmF0dHIoe1xuICAgICAgICAgICAgJ25hbWUnICA6IGtleSxcbiAgICAgICAgICAgICd2YWx1ZScgOiB2YWxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvcm1FbC5hcHBlbmQocGFyYW1FbGVtZW50KTtcbiAgICB9KTtcblxuICAgIC8qIGFwcGVuZCBmb3JtIHRvIGlGcmFtZSBhbmQgaUZyYW1lIHRvIHRoZSBkb2N1bWVudCBhbmQgc3VibWl0IHRoZSBmb3JtICovXG4gICAgJCgnYm9keScpLmFwcGVuZChpRnJhbWVFbGVtZW50KTtcblxuICAgIC8vIHRpbWVvdXQgZm9yIElFIDEwLCBpZnJhbWVFbGVtZW50LmNvbnRlbnRzKCkgaXMgZW1wdHkgaW4gSUUgMTAgd2l0aG91dCB0aW1lb3V0XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgaUZyYW1lRWxlbWVudC5vbihcImxvYWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGlGcmFtZUVsZW1lbnQuY29udGVudHMoKS5maW5kKCdib2R5JykudGV4dCgpO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkpIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPXtlcnJvcjpKU09OLnBhcnNlKHRleHQudHJpbSgpKX0gO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICBtZXNzYWdlPVwiXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJpZ2dlckZuKGVycm9yLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlGcmFtZUVsZW1lbnQuY29udGVudHMoKS5maW5kKCdib2R5JykuYXBwZW5kKGZvcm1FbCk7XG4gICAgICAgIGZvcm1FbC5zdWJtaXQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNvbXBsZXRlZCkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAyMDAwKTtcbiAgICB9LCAxMDApO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhbiBYSFIgY2FsbCBhZ2FpbnN0IHRoZSBjb25maWdcbiAqIHRoZSByZXNwb25zZSBpcyBjb252ZXJ0ZWQgaW50byBhIGJsb2IgdXJsLCB3aGljaCBpcyBhc3NpZ25lZCB0byB0aGUgc3JjIGF0dHJpYnV0ZSBvZiBhbiBhbmNob3IgZWxlbWVudCB3aXRoIGRvd25sb2FkPXRydWVcbiAqIGEgY2xpY2sgaXMgc2ltdWxhdGVkIG9uIHRoZSBhbmNob3IgdG8gZG93bmxvYWQgdGhlIGZpbGVcbiAqIEBwYXJhbSBjb25maWdcbiAqIEBwYXJhbSBzdWNjZXNzXG4gKiBAcGFyYW0gZXJyb3JcbiAqL1xuY29uc3QgZG93bmxvYWRUaHJvdWdoQW5jaG9yID0gKGNvbmZpZywgc3VjY2VzcywgZXJyb3IpID0+IHtcbiAgICBjb25zdCB1cmwgICAgID0gY29uZmlnLnVybCxcbiAgICAgICAgbWV0aG9kICA9IGNvbmZpZy5tZXRob2QsXG4gICAgICAgIGRhdGEgICAgPSBjb25maWcuZGF0YVBhcmFtcyB8fCBjb25maWcuZGF0YSxcbiAgICAgICAgaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuXG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSB8fCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJztcblxuICAgIC8vIFRvZG86IFJlcGxhY2UgaHR0cCB3aXRoIGdldFNlcnZpY2VcbiAgICBodHRwU2VydmljZS5zZW5kKHtcbiAgICAgICAgJ3RhcmdldCcgOiAnV2ViU2VydmljZScsXG4gICAgICAgICdhY3Rpb24nIDogJ2ludm9rZVJ1bnRpbWVSZXN0Q2FsbCcsXG4gICAgICAgICdtZXRob2QnIDogbWV0aG9kLFxuICAgICAgICAndXJsJyAgICA6IHVybCxcbiAgICAgICAgJ2hlYWRlcnMnOiBoZWFkZXJzLFxuICAgICAgICAnZGF0YScgICA6IGRhdGEsXG4gICAgICAgICdyZXNwb25zZVR5cGUnOiAnYXJyYXlidWZmZXInXG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkb3dubG9hZEZpbGVmcm9tUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UuaGVhZGVycywgc3VjY2VzcywgZXJyb3IpO1xuICAgICAgICB9LCA5MDApO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdHJpZ2dlckZuKGVycm9yLCBlcnIpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBhcHBlbmRzIGEgdGltZXN0YW1wIG9uIHRoZSBwYXNzZWQgZmlsZW5hbWUgdG8gcHJldmVudCBjYWNoaW5nXG4gKiByZXR1cm5zIHRoZSBtb2RpZmllZCBmaWxlIG5hbWVcbiAqIEBwYXJhbSBmaWxlTmFtZVxuICogQHBhcmFtIGV4cG9ydEZvcm1hdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0TW9kaWZpZWRGaWxlTmFtZSA9IChmaWxlTmFtZSwgZXhwb3J0Rm9ybWF0KSA9PiB7XG4gICAgbGV0IGZpbGVFeHRlbnNpb247XG4gICAgY29uc3QgY3VycmVudFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgIGZpbGVFeHRlbnNpb24gPSBleHBvcnRUeXBlc01hcFtleHBvcnRGb3JtYXRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVFeHRlbnNpb24gPSAnLicgKyBsYXN0KHNwbGl0KGZpbGVOYW1lLCAnLicpKTtcbiAgICAgICAgZmlsZU5hbWUgPSByZXBsYWNlKGZpbGVOYW1lLCBmaWxlRXh0ZW5zaW9uLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlTmFtZSArICdfJyArIGN1cnJlbnRUaW1lc3RhbXAgKyBmaWxlRXh0ZW5zaW9uO1xufTtcblxuY29uc3QgZ2V0Q29va2llQnlOYW1lID0gKG5hbWUpID0+IHtcbiAgICAvLyBUb2RvOiBTaHViaGFtIEltcGxlbWVudCBjb29raWUgbmF0aXZlIGpzXG4gICAgcmV0dXJuICdjb29raWUnO1xufTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvb2tpZVZhbHVlIGlmIHhzcmYgaXMgZW5hYmxlZC5cbiAqIEluIGRldmljZSwgeHNyZiBjb29raWUgaXMgc3RvcmVkIGluIGxvY2FsU3RvcmFnZS5cbiAqIEByZXR1cm5zIHhzcmYgY29va2llIHZhbHVlXG4gKi9cbmNvbnN0IGlzWHNyZkVuYWJsZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgbm9kZSBmb3IgYSBiaW5kIG9iamVjdCwgd2hlcmUgdGhlIHZhbHVlIGhhcyB0byBiZSB1cGRhdGVkXG4gKiBvYmoudGFyZ2V0ID0gXCJhXCJcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSByb290XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRUYXJnZXRPYmogPSAob2JqLCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIC8qXG4gICAgICogaWYgdGhlIHRhcmdldCBrZXkgaXMgaW4gdGhlIGZvcm0gYXMgXCJbJ215LnBhcmFtJ11cIlxuICAgICAqIGtlZXAgdGhlIHRhcmdldCBrZXkgYXMgXCJteS5wYXJhbVwiIGFuZCBkbyBub3Qgc3BsaXQgZnVydGhlclxuICAgICAqIHRoaXMgaXMgZG9uZSwgc28gdGhhdCwgdGhlIGNvbXB1dGVkIHZhbHVlIGFnYWluc3QgdGhpcyBiaW5kaW5nIGlzIGFzc2lnbmVkIGFzXG4gICAgICogICAgICB7XCJteS5wYXJhbVwiOiBcInZhbHVlXCJ9XG4gICAgICogYW5kIG5vdCBhc1xuICAgICAqICAgICAge1xuICAgICAqICAgICAgICAgIFwibXlcIjoge1xuICAgICAqICAgICAgICAgICAgICBcInBhcmFtXCI6IFwidmFsdWVcIlxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgIH1cbiAgICAgKi9cbiAgICBsZXQgdGFyZ2V0ID0gb2JqLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0T2JqO1xuICAgIGNvbnN0IHJvb3ROb2RlID0gdmFyaWFibGVbcm9vdF07XG4gICAgaWYgKERPVF9FWFBSX1JFWC50ZXN0KHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0T2JqID0gcm9vdE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnN1YnN0cigwLCB0YXJnZXQubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgIGlmIChvYmoudGFyZ2V0ID09PSByb290KSB7XG4gICAgICAgICAgICB0YXJnZXRPYmogPSB2YXJpYWJsZTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldE9iaiA9IGZpbmRWYWx1ZU9mKHJvb3ROb2RlLCB0YXJnZXQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0T2JqID0gcm9vdE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE9iajtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUga2V5IGZvciB0aGUgdGFyZ2V0IG9iamVjdFxuICogdGhlIGNvbXB1dGVkIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCBhZ2FpbnN0IHRoaXMga2V5IGluIHRoZSB0YXJnZXRPYmplY3QoY29tcHV0ZWQgYnkgZ2V0VGFyZ2V0T2JqKCkpXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcmVnZXhcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRUYXJnZXROb2RlS2V5ID0gKHRhcmdldCkgPT4ge1xuICAgIC8qXG4gICAgICogaWYgdGhlIHRhcmdldCBrZXkgaXMgaW4gdGhlIGZvcm0gYXMgXCJbJ215LnBhcmFtJ11cIlxuICAgICAqIGtlZXAgdGhlIHRhcmdldCBrZXkgYXMgXCJteS5wYXJhbVwiIGFuZCBkbyBub3Qgc3BsaXQgZnVydGhlclxuICAgICAqIHRoaXMgaXMgZG9uZSwgc28gdGhhdCwgdGhlIGNvbXB1dGVkIHZhbHVlIGFnYWluc3QgdGhpcyBiaW5kaW5nIGlzIGFzc2lnbmVkIGFzXG4gICAgICogICAgICB7XCJteS5wYXJhbVwiOiBcInZhbHVlXCJ9XG4gICAgICogYW5kIG5vdCBhc1xuICAgICAqICAgICAge1xuICAgICAqICAgICAgICAgIFwibXlcIjoge1xuICAgICAqICAgICAgICAgICAgICBcInBhcmFtXCI6IFwidmFsdWVcIlxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgIH1cbiAgICAgKi9cbiAgICBsZXQgdGFyZ2V0Tm9kZUtleTtcbiAgICBpZiAoRE9UX0VYUFJfUkVYLnRlc3QodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXROb2RlS2V5ID0gdGFyZ2V0LnJlcGxhY2UoL14oXFxbW1wiJ10pfChbXCInXVxcXSkkL2csICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXROb2RlS2V5ID0gdGFyZ2V0LnNwbGl0KCcuJykucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXROb2RlS2V5O1xufTtcblxuY29uc3Qgc2V0VmFsdWVUb05vZGUgPSAodGFyZ2V0LCBvYmosIHJvb3QsIHZhcmlhYmxlLCB2YWx1ZSwgbm9VcGRhdGU/KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KSxcbiAgICAgICAgdGFyZ2V0T2JqID0gZ2V0VGFyZ2V0T2JqKG9iaiwgcm9vdCwgdmFyaWFibGUpO1xuICAgIHZhbHVlID0gIWlzVW5kZWZpbmVkKHZhbHVlKSA/IHZhbHVlIDogb2JqLnZhbHVlO1xuICAgIC8qIHNhbml0eSBjaGVjaywgdXNlciBjYW4gYmluZCBwYXJlbnQgbm9kZXMgdG8gbm9uLW9iamVjdCB2YWx1ZXMsIHNvIGNoaWxkIG5vZGUgYmluZGluZ3MgbWF5IGZhaWwgKi9cbiAgICBpZiAodGFyZ2V0T2JqKSB7XG4gICAgICAgIHRhcmdldE9ialt0YXJnZXROb2RlS2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBwcm9jZXNzVmFyaWFibGVQb3N0QmluZFVwZGF0ZSh0YXJnZXROb2RlS2V5LCB2YWx1ZSwgb2JqLnR5cGUsIHZhcmlhYmxlLCBub1VwZGF0ZSk7XG59O1xuXG4vKipcbiAqIFRoZSBtb2RlbCBpbnRlcm5hbEJvdW5kTm9kZU1hcCBzdG9yZXMgdGhlIHJlZmVyZW5jZSB0byBsYXRlc3QgY29tcHV0ZWQgdmFsdWVzIGFnYWluc3QgaW50ZXJuYWwobmVzdGVkKSBib3VuZCBub2Rlc1xuICogVGhpcyBpcyBkb25lIHNvIHRoYXQgdGhlIGludGVybmFsIG5vZGUncyBjb21wdXRlZCB2YWx1ZSBpcyBub3QgbG9zdCwgb25jZSBpdHMgcGFyZW50IG5vZGUncyB2YWx1ZSBpcyBjb21wdXRlZCBhdCBhIGxhdGVyIHBvaW50XG4gKiBFLmcuXG4gKiBWYXJpYWJsZS5lbXBsb3llZVZhciBoYXMgZm9sbG93aW5nIGJpbmRpbmdzXG4gKiBcImRhdGFCaW5kaW5nXCI6IFtcbiAgICAge1xuICAgICAgICAgXCJ0YXJnZXRcIjogXCJkZXBhcnRtZW50LmJ1ZGdldFwiLFxuICAgICAgICAgXCJ2YWx1ZVwiOiBcImJpbmQ6VmFyaWFibGVzLmJ1ZGdldFZhci5kYXRhU2V0XCJcbiAgICAgfSxcbiAgICAge1xuICAgICAgICAgXCJ0YXJnZXRcIjogXCJkZXBhcnRtZW50XCIsXG4gICAgICAgICBcInZhbHVlXCI6IFwiYmluZDpWYXJpYWJsZXMuZGVwYXJ0bWVudFZhci5kYXRhU2V0XCJcbiAgICAgfVxuIF1cbiAqIFdoZW4gZGVwYXJ0bWVudC5idWRnZXQgaXMgY29tcHV0ZWQsIGVtcGxveWVlVmFyLmRhdGFTZXQgPSB7XG4gKiAgXCJkZXBhcnRtZW50XCI6IHtcbiAqICAgICAgXCJidWRnZXRcIjoge1wicTFcIjogMTExMX1cbiAqICB9XG4gKiB9XG4gKlxuICogV2hlbiBkZXBhcnRtZW50IGlzIGNvbXB1dGVkXG4gKiAgXCJkZXBhcnRtZW50XCI6IHtcbiAqICAgICAgXCJuYW1lXCI6IFwiSFJcIixcbiAqICAgICAgXCJsb2NhdGlvblwiOiBcIkh5ZGVyYWJhZFwiXG4gKiAgfVxuICogVGhlIGJ1ZGdldCBmaWVsZCAoY29tcHV0ZWQgZWFybGllcikgaXMgTE9TVC5cbiAqXG4gKiBUbyBhdm9pZCB0aGlzLCB0aGUgbGF0ZXN0IHZhbHVlcyBhZ2FpbnN0IGludGVybmFsIG5vZGVzIChpbiB0aGlzIGNhc2UgZGVwYXJ0bWVudC5idWRnZXQpIGFyZSBzdG9yZWQgaW4gYSBtYXBcbiAqIFRoZXNlIHZhbHVlcyBhcmUgYXNzaWduZWQgYmFjayB0byBpbnRlcm5hbCBmaWVsZHMgaWYgdGhlIHBhcmVudCBpcyBjb21wdXRlZCAoaW4gdGhpcyBjYXNlIGRlcGFydG1lbnQpXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcm9vdFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKi9cbmNvbnN0IHVwZGF0ZUludGVybmFsTm9kZXMgPSAodGFyZ2V0LCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIGNvbnN0IGJvdW5kSW50ZXJuYWxOb2RlcyA9IGtleXMoZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290XSkpLFxuICAgICAgICB0YXJnZXROb2RlS2V5ID0gZ2V0VGFyZ2V0Tm9kZUtleSh0YXJnZXQpO1xuICAgIGxldCBpbnRlcm5hbE5vZGVzO1xuICAgIGZ1bmN0aW9uIGZpbmRJbnRlcm5hbE5vZGVCb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcihib3VuZEludGVybmFsTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAvLyB0aGUgbGF0ZXIgY29uZGl0aW9uIGluIGNoZWNrICh0YXJnZXROb2RlS2V5ID09PSByb290IHx8IHRhcmdldE5vZGVLZXkgPT09ICdkYXRhQmluZGluZycpIGlzIHNwZWNpZmljYWxseSBmb3IgbGl2ZSB2YXJpYWJsZSBvZiBpbnNlcnQvdXBkYXRlIHR5cGVzXG4gICAgICAgICAgICByZXR1cm4gKG5vZGUgIT09IHRhcmdldE5vZGVLZXkgJiYgaW5jbHVkZXMobm9kZSwgdGFyZ2V0Tm9kZUtleSkpIHx8ICgodGFyZ2V0Tm9kZUtleSA9PT0gcm9vdCB8fCB0YXJnZXROb2RlS2V5ID09PSAnZGF0YUJpbmRpbmcnKSAmJiBub2RlICE9PSB0YXJnZXROb2RlS2V5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludGVybmFsTm9kZXMgPSBmaW5kSW50ZXJuYWxOb2RlQm91bmQoKTtcbiAgICBpZiAoKGludGVybmFsTm9kZXMubGVuZ3RoKSkge1xuICAgICAgICBmb3JFYWNoKGludGVybmFsTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBzZXRWYWx1ZVRvTm9kZShub2RlLCB7dGFyZ2V0OiBub2RlfSwgcm9vdCwgdmFyaWFibGUsIGdldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgbm9kZV0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBOZXcgSW1wbGVtZW50YXRpb24gKERhdGFCaW5kaW5nIEZsYXQgU3RydWN0dXJlIHdpdGggeC1wYXRoIHRhcmdldHMpXG4gKiBwcm9jZXNzZXMgYSBkYXRhQmluZGluZyBvYmplY3QsIGlmIGJvdW5kIHRvIGV4cHJlc3Npb24sIHdhdGNoZXMgb3ZlciBpdCwgZWxzZSBhc3NpZ25zIHZhbHVlIHRvIHRoZSBleHByZXNzaW9uXG4gKiBAcGFyYW0gb2JqIGRhdGFCaW5kaW5nIG9iamVjdFxuICogQHBhcmFtIHNjb3BlIHNjb3BlIG9mIHRoZSB2YXJpYWJsZVxuICogQHBhcmFtIHJvb3Qgcm9vdCBub2RlIHN0cmluZyAoZGF0YUJpbmRpbmcgZm9yIGFsbCB2YXJpYWJsZXMsIGRhdGFTZXQgZm9yIHN0YXRpYyB2YXJpYWJsZSlcbiAqIEBwYXJhbSB2YXJpYWJsZSB2YXJpYWJsZSBvYmplY3RcbiAqL1xuY29uc3QgcHJvY2Vzc0JpbmRPYmplY3QgPSAob2JqLCBzY29wZSwgcm9vdCwgdmFyaWFibGUpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBvYmoudGFyZ2V0LFxuICAgICAgICB0YXJnZXRPYmogPSBnZXRUYXJnZXRPYmoob2JqLCByb290LCB2YXJpYWJsZSksXG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSBnZXRUYXJnZXROb2RlS2V5KHRhcmdldCksXG4gICAgICAgIHJ1bk1vZGUgPSB0cnVlO1xuICAgIGNvbnN0IGRlc3Ryb3lGbiA9IHNjb3BlLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyID8gc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIuYmluZChzY29wZSkgOiBub29wO1xuXG4gICAgaWYgKHN0cmluZ1N0YXJ0c1dpdGgob2JqLnZhbHVlLCAnYmluZDonKSkge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IChuZXdWYWwsIG9sZFZhbCkgPT4ge1xuICAgICAgICAgICAgaWYgKChuZXdWYWwgPT09IG9sZFZhbCAmJiBpc1VuZGVmaW5lZChuZXdWYWwpKSB8fCAoaXNVbmRlZmluZWQobmV3VmFsKSAmJiAoIWlzVW5kZWZpbmVkKG9sZFZhbCkgfHwgIWlzVW5kZWZpbmVkKHRhcmdldE9ialt0YXJnZXROb2RlS2V5XSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNraXAgY2xvbmluZyBmb3IgYmxvYiBjb2x1bW5cbiAgICAgICAgICAgIGlmICghaW5jbHVkZXMoWydibG9iJywgJ2ZpbGUnXSwgb2JqLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsID0gZ2V0Q2xvbmVkT2JqZWN0KG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRWYWx1ZVRvTm9kZSh0YXJnZXQsIG9iaiwgcm9vdCwgdmFyaWFibGUsIG5ld1ZhbCk7IC8vIGNsb25pbmcgbmV3VmFsIHRvIGtlZXAgdGhlIHNvdXJjZSBjbGVhblxuXG4gICAgICAgICAgICBpZiAocnVuTW9kZSkge1xuICAgICAgICAgICAgICAgIC8qc2V0IHRoZSBpbnRlcm5hbCBib3VuZCBub2RlIG1hcCB3aXRoIHRoZSBsYXRlc3QgdXBkYXRlZCB2YWx1ZSovXG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbEJvdW5kTm9kZU1hcC5oYXModmFyaWFibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsQm91bmROb2RlTWFwLnNldCh2YXJpYWJsZSwge30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXQoaW50ZXJuYWxCb3VuZE5vZGVNYXAuZ2V0KHZhcmlhYmxlKSwgW3ZhcmlhYmxlLm5hbWUsIHJvb3QsIHRhcmdldF0sIG5ld1ZhbCk7XG4gICAgICAgICAgICAgICAgLyp1cGRhdGUgdGhlIGludGVybmFsIG5vZGVzIGFmdGVyIGludGVybmFsIG5vZGUgbWFwIGlzIHNldCovXG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJuYWxOb2Rlcyh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRlc3Ryb3lGbigkd2F0Y2gob2JqLnZhbHVlLnJlcGxhY2UoJ2JpbmQ6JywgJycpLCBzY29wZSwge30sIGxpc3RlbmVyLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoKSA9PiB2YXJpYWJsZS5pc011dGVkKSk7XG4gICAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQob2JqLnZhbHVlKSkge1xuICAgICAgICBzZXRWYWx1ZVRvTm9kZSh0YXJnZXQsIG9iaiwgcm9vdCwgdmFyaWFibGUsIG9iai52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChydW5Nb2RlICYmIHJvb3QgIT09IHRhcmdldE5vZGVLZXkpIHtcbiAgICAgICAgICAgIGlmICghaW50ZXJuYWxCb3VuZE5vZGVNYXAuaGFzKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgICAgIGludGVybmFsQm91bmROb2RlTWFwLnNldCh2YXJpYWJsZSwge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCB0YXJnZXRdLCBvYmoudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFVCTElDICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vXG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgd2F0Y2hlcnMgZm9yIGJpbmRpbmcgZXhwcmVzc2lvbnMgY29uZmlndXJlZCBpbiB0aGUgdmFyaWFibGVcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICogQHBhcmFtIGNvbnRleHQsIHNjb3BlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHZhcmlhYmxlIGV4aXN0c1xuICogQHBhcmFtIHtzdHJpbmd9IGJpbmRTb3VyY2UsICB0aGUgZmllbGQgaW4gdmFyaWFibGUgd2hlcmUgdGhlIGRhdGFiaW5kaW5ncyBhcmUgY29uZmlndXJlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9zdCB2YXJpYWJsZXMsIGl0IHdpbGwgYmUgJ2RhdGFCaW5kaW5nJywgaGVuY2UgZGVmYXVsdCBmYWxsYmFjayBpcyB0byAnZGF0YUJpbmRpbmcnXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzb21lIGl0IGNhbiBiZSAnZGF0YVNldCcgYW5kIGhlbmNlIHdpbGwgYmUgcGFzc2VkIGFzIHBhcmFtXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluZFRhcmdldCwgdGhlIG9iamVjdCBmaWVsZCBpbiB2YXJpYWJsZSB3aGVyZSB0aGUgY29tcHV0ZWQgYmluZGluZ3Mgd2lsbCBiZSBzZXRcbiAqL1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NCaW5kaW5nID0gKHZhcmlhYmxlOiBhbnksIGNvbnRleHQ6IGFueSwgYmluZFNvdXJjZT86IHN0cmluZywgYmluZFRhcmdldD86IHN0cmluZykgPT4ge1xuICAgIGJpbmRTb3VyY2UgPSBiaW5kU291cmNlIHx8ICdkYXRhQmluZGluZyc7XG4gICAgYmluZFRhcmdldCA9IGJpbmRUYXJnZXQgfHwgJ2RhdGFCaW5kaW5nJztcblxuICAgIGNvbnN0IGJpbmRNYXAgPSB2YXJpYWJsZVtiaW5kU291cmNlXTtcbiAgICB2YXJpYWJsZVtiaW5kU291cmNlXSA9IHt9O1xuICAgIHZhcmlhYmxlWydfYmluZCcgKyBiaW5kU291cmNlXSA9IGJpbmRNYXA7XG4gICAgaWYgKCFiaW5kTWFwIHx8ICFpc0FycmF5KGJpbmRNYXApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYmluZE1hcC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIC8qIGZvciBzdGF0aWMgdmFyaWFibGUgY2hhbmdlIHRoZSBiaW5kaW5nIHdpdGggdGFyZ2V0ICdkYXRhQmluZGluZycgdG8gJ2RhdGFTZXQnLCBhcyB0aGUgcmVzdWx0cyBoYXZlIHRvIHJlZmxlY3QgZGlyZWN0bHkgaW4gdGhlIGRhdGFTZXQgKi9cbiAgICAgICAgaWYgKHZhcmlhYmxlLmNhdGVnb3J5ID09PSAnd20uVmFyaWFibGUnICYmIG5vZGUudGFyZ2V0ID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICBub2RlLnRhcmdldCA9ICdkYXRhU2V0JztcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQmluZE9iamVjdChub2RlLCBjb250ZXh0LCBiaW5kVGFyZ2V0LCB2YXJpYWJsZSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIERvd25sb2FkcyBhIGZpbGUgaW4gdGhlIGJyb3dzZXIuXG4gKiBUd28gbWV0aG9kcyB0byBkbyBzbywgbmFtZWx5OlxuICogMS4gZG93bmxvYWRUaHJvdWdoQW5jaG9yLCBjYWxsZWQgaWZcbiAqICAgICAgLSBpZiBhIGhlYWRlciBpcyB0byBiZSBwYXNzZWRcbiAqICAgICAgT1JcbiAqICAgICAgLSBpZiBzZWN1cml0eSBpcyBPTiBhbmQgWFNSRiB0b2tlbiBpcyB0byBiZSBzZW50IGFzIHdlbGxcbiAqIE5PVEU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgdmVyc2lvbiAxMC4wIGFuZCBiZWxvd1xuICpcbiAqIDIuIGRvd25sb2FkVGhyb3VnaElmcmFtZVxuICogICAgICAtIHRoaXMgbWV0aG9kIHdvcmtzIGFjcm9zcyBicm93c2VycyBhbmQgdXNlcyBhbiBpZnJhbWUgdG8gZG93bmxhZCB0aGUgZmlsZS5cbiAqIEBwYXJhbSByZXF1ZXN0UGFyYW1zIHJlcXVlc3QgcGFyYW1zIG9iamVjdFxuICogQHBhcmFtIGZpbGVOYW1lIHJlcHJlc2VudHMgdGhlIGZpbGUgbmFtZVxuICogQHBhcmFtIGV4cG9ydEZvcm1hdCBkb3dubG9hZGVkIGZpbGUgZm9ybWF0XG4gKiBAcGFyYW0gc3VjY2VzcyBzdWNjZXNzIGNhbGxiYWNrXG4gKiBAcGFyYW0gZXJyb3IgZXJyb3IgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IHNpbXVsYXRlRmlsZURvd25sb2FkID0gKHJlcXVlc3RQYXJhbXMsIGZpbGVOYW1lLCBleHBvcnRGb3JtYXQsIHN1Y2Nlc3MsIGVycm9yLCBkYXRhQmluZGluZykgPT4ge1xuICAgIC8qc3VjY2VzcyBhbmQgZXJyb3IgY2FsbGJhY2tzIGFyZSBleGVjdXRlZCBpbmNhc2Ugb2YgZG93bmxvYWRUaHJvdWdoQW5jaG9yXG4gICAgIER1ZSB0byB0ZWNobmljYWwgbGltaXRhdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgaW5jYXNlIG9mIGlmcmFtZSovXG4gICAgaWYgKCFpc0VtcHR5KHJlcXVlc3RQYXJhbXMuaGVhZGVycykgfHwgaXNYc3JmRW5hYmxlZCgpKSB7XG4gICAgICAgIGRvd25sb2FkVGhyb3VnaEFuY2hvcihyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG93bmxvYWRUaHJvdWdoSWZyYW1lKHJlcXVlc3RQYXJhbXMsIHN1Y2Nlc3MsIGRhdGFCaW5kaW5nLGVycm9yKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIHNldHMgdGhlIHZhbHVlIGFnYWluc3QgcGFzc2VkIGtleSBvbiB0aGUgXCJpbnB1dEZpZWxkc1wiIG9iamVjdCBpbiB0aGUgdmFyaWFibGVcbiAqIEBwYXJhbSB0YXJnZXRPYmo6IHRoZSBvYmplY3QgaW4gd2hpY2ggdGhlIGtleSwgdmFsdWUgaXMgdG8gYmUgc2V0XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEBwYXJhbSBrZXk6IGNhbiBiZTpcbiAqICAtIGEgc3RyaW5nIGUuZy4gXCJ1c2VybmFtZVwiXG4gKiAgLSBhbiBvYmplY3QsIGUuZy4ge1widXNlcm5hbWVcIjogXCJqb2huXCIsIFwic3NuXCI6IFwiMTExMTFcIn1cbiAqIEBwYXJhbSB2YWxcbiAqIC0gaWYga2V5IGlzIHN0cmluZywgdGhlIHZhbHVlIGFnYWluc3QgaXQgKGZvciB0aGF0IGRhdGEgdHlwZSlcbiAqIC0gaWYga2V5IGlzIG9iamVjdCwgbm90IHJlcXVpcmVkXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGNvbnN0IHNldElucHV0ID0gKHRhcmdldE9iajogYW55LCBrZXk6IGFueSwgdmFsOiBhbnksIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgIHRhcmdldE9iaiA9IHRhcmdldE9iaiB8fCB7fTtcbiAgICBsZXQga2V5cyxcbiAgICAgICAgbGFzdEtleSxcbiAgICAgICAgcGFyYW1PYmogPSB7fTtcblxuICAgIC8vIGNvbnRlbnQgdHlwZSBjaGVja1xuICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdmaWxlJzpcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdmFsID0gZ2V0QmxvYih2YWwsIG9wdGlvbnMuY29udGVudFR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICB2YWwgPSBpc051bWJlcih2YWwpID8gdmFsIDogcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBpcyBhbiBvYmplY3QgaXRzZWxmXG4gICAgICAgIHBhcmFtT2JqID0ga2V5O1xuICAgIH0gZWxzZSBpZiAoa2V5LmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciAnLicgaW4ga2V5IGUuZy4gJ2VtcGxveWVlLmRlcGFydG1lbnQnXG4gICAgICAgIGtleXMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgbGFzdEtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIC8vIEZpbmRpbmcgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUga2V5XG4gICAgICAgIHRhcmdldE9iaiA9IGZpbmRWYWx1ZU9mKHRhcmdldE9iaiwga2V5cy5qb2luKCcuJyksIHRydWUpO1xuICAgICAgICBrZXkgPSBsYXN0S2V5O1xuICAgICAgICBwYXJhbU9ialtrZXldID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtT2JqW2tleV0gPSB2YWw7XG4gICAgfVxuXG4gICAgZm9yRWFjaChwYXJhbU9iaiwgZnVuY3Rpb24gKHBhcmFtVmFsLCBwYXJhbUtleSkge1xuICAgICAgICB0YXJnZXRPYmpbcGFyYW1LZXldID0gcGFyYW1WYWw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldE9iajtcbn07XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmIEhUTUw1IEZpbGUgQVBJIGlzIGF2YWlsYWJsZSBlbHNlIGZhbHNlXG4gKiBAcmV0dXJucyB7e3Byb3RvdHlwZTogQmxvYjsgbmV3KGJsb2JQYXJ0cz86IGFueVtdLCBvcHRpb25zPzogQmxvYlByb3BlcnR5QmFnKTogQmxvYn19XG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVVcGxvYWRTdXBwb3J0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkJsb2IpO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhck9yZGVyXG4gKiBAcGFyYW0gb3B0aW9uc09yZGVyXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5leHBvcnQgY29uc3QgZ2V0RXZhbHVhdGVkT3JkZXJCeSA9ICh2YXJPcmRlciwgb3B0aW9uc09yZGVyKSA9PiB7XG4gICAgbGV0IG9wdGlvbkZpZWxkcyxcbiAgICAgICAgdmFyT3JkZXJCeTtcbiAgICAvLyBJZiBvcHRpb25zIG9yZGVyIGJ5IGlzIG5vdCBkZWZpbmVkLCByZXR1cm4gdmFyaWFibGUgb3JkZXJcbiAgICBpZiAoIW9wdGlvbnNPcmRlciB8fCBpc0VtcHR5KG9wdGlvbnNPcmRlcikpIHtcbiAgICAgICAgcmV0dXJuIHZhck9yZGVyO1xuICAgIH1cbiAgICAvLyBJZiB2YXJpYWJsZSBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIG9wdGlvbnMgb3JkZXJcbiAgICBpZiAoIXZhck9yZGVyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zT3JkZXI7XG4gICAgfVxuICAgIC8vIElmIGJvdGggYXJlIHByZXNlbnQsIGNvbWJpbmUgdGhlIG9wdGlvbnMgb3JkZXIgYW5kIHZhcmlhYmxlIG9yZGVyLCB3aXRoIG9wdGlvbnMgb3JkZXIgYXMgcHJlY2VkZW5jZVxuICAgIHZhck9yZGVyID0gc3BsaXQodmFyT3JkZXIsICcsJyk7XG4gICAgb3B0aW9uc09yZGVyID0gc3BsaXQob3B0aW9uc09yZGVyLCAnLCcpO1xuICAgIG9wdGlvbkZpZWxkcyA9IG1hcChvcHRpb25zT3JkZXIsIGZ1bmN0aW9uIChvcmRlcikge1xuICAgICAgICByZXR1cm4gc3BsaXQodHJpbShvcmRlciksICcgJylbMF07XG4gICAgfSk7XG4gICAgLy8gSWYgYSBmaWVsZCBpcyBwcmVzZW50IGluIGJvdGggb3B0aW9ucyBhbmQgdmFyaWFibGUsIHJlbW92ZSB0aGUgdmFyaWFibGUgb3JkZXJieVxuICAgIHJlbW92ZSh2YXJPcmRlciwgZnVuY3Rpb24gKG9yZGVyQnk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gaW5jbHVkZXMob3B0aW9uRmllbGRzLCBzcGxpdCh0cmltKG9yZGVyQnkpLCAnICcpWzBdKTtcbiAgICB9KTtcbiAgICB2YXJPcmRlckJ5ID0gdmFyT3JkZXIubGVuZ3RoID8gJywnICsgam9pbih2YXJPcmRlciwgJywnKSA6ICcnO1xuICAgIHJldHVybiBqb2luKG9wdGlvbnNPcmRlciwgJywnKSArIHZhck9yZGVyQnk7XG59O1xuXG4vKipcbiAqIGZvcm1hdHRpbmcgdGhlIGV4cHJlc3Npb24gYXMgcmVxdWlyZWQgYnkgYmFja2VuZCB3aGljaCB3YXMgZW5jbG9zZWQgYnkgJHs8ZXhwcmVzc2lvbj59LlxuICogQHBhcmFtIGZpZWxkRGVmc1xuICogcmV0dXJucyBmaWVsZERlZnNcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdEV4cG9ydEV4cHJlc3Npb24gPSBmaWVsZERlZnMgPT4ge1xuICAgIGZvckVhY2goZmllbGREZWZzLCBmdW5jdGlvbiAoZmllbGREZWYpIHtcbiAgICAgICAgaWYgKGZpZWxkRGVmLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGZpZWxkRGVmLmV4cHJlc3Npb24gPSAnJHsnICsgZmllbGREZWYuZXhwcmVzc2lvbiArICd9JztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWVsZERlZnM7XG59O1xuXG5leHBvcnQgY29uc3QgZGVib3VuY2VWYXJpYWJsZUNhbGwgPSBfaW52b2tlO1xuXG5jb25zdCBnZXREYXRlVGltZUZvcm1hdEZvclR5cGUgPSAodHlwZSkgPT4ge1xuICAgIHJldHVybiBERUZBVUxUX0ZPUk1BVFNbdG9VcHBlcih0eXBlKV07XG59O1xuXG4vLyBGb3JtYXQgdmFsdWUgZm9yIGRhdGV0aW1lIHR5cGVzXG5jb25zdCBfZm9ybWF0RGF0ZSA9IChkYXRlVmFsdWUsIHR5cGUpID0+IHtcbiAgICBsZXQgZXBvY2g7XG4gICAgaWYgKGlzRGF0ZShkYXRlVmFsdWUpKSB7XG4gICAgICAgIGVwb2NoID0gZGF0ZVZhbHVlLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWlzTmFOKGRhdGVWYWx1ZSkpIHtcbiAgICAgICAgICAgIGRhdGVWYWx1ZSA9IHBhcnNlSW50KGRhdGVWYWx1ZSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVwb2NoID0gZGF0ZVZhbHVlICYmIG1vbWVudChkYXRlVmFsdWUpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGVwb2NoKSAmJiB0eXBlICE9PSBEYXRhVHlwZS5USU1FKSB7XG4gICAgICAgIHJldHVybiBlcG9jaDtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IERhdGFUeXBlLlRJTUVTVEFNUCkge1xuICAgICAgICByZXR1cm4gZXBvY2g7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBEYXRhVHlwZS5USU1FICYmICFlcG9jaCkge1xuICAgICAgICBlcG9jaCA9IG1vbWVudChuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpICsgJyAnICsgZGF0ZVZhbHVlKS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlVmFsdWUgJiYgYXBwTWFuYWdlci5nZXRQaXBlKCdkYXRlJykudHJhbnNmb3JtKGVwb2NoLCBnZXREYXRlVGltZUZvcm1hdEZvclR5cGUodHlwZSkpO1xufTtcblxuLy8gRnVuY3Rpb24gdG8gY29udmVydCB2YWx1ZXMgb2YgZGF0ZSB0aW1lIHR5cGVzIGludG8gZGVmYXVsdCBmb3JtYXRzXG5leHBvcnQgY29uc3QgZm9ybWF0RGF0ZSA9ICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgIGlmIChpbmNsdWRlcyh0eXBlLCAnLicpKSB7XG4gICAgICAgIHR5cGUgPSB0b0xvd2VyKGV4dHJhY3RUeXBlKHR5cGUpKTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBtYXAodmFsdWUsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBfZm9ybWF0RGF0ZSh2YWwsIHR5cGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9mb3JtYXREYXRlKHZhbHVlLCB0eXBlKTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZGVjb2RlcyB0aGUgdmFyaWFibGUgZGF0YSB3aGljaCBpcyBlbmNvZGVkIGZyb20gYmFja2VuZCBiZWZvcmUgc2hvd2luZyBpbiB0aGUgd2lkZ2V0cy5cbiAqIEl0IHRha2VzIHZhcmlhYmxlIHJlc3BvbnNlIGNvbnRlbnQgYXMgaW5wdXQgYW5kIGl0ZXJhdGVzIHJlY3Vyc2l2ZWx5LFxuICogaWYgdGhlIHZhbHVlIGlzIHN0cmluZyB0eXBlIHRoZW4gaXQgd2lsbCBkZWNvZGUgdGhlIGRhdGEuXG4gKiBAcGFyYW0gcmVzcG9uc2VDb250ZW50IChBcnJheSBvZiBvYmplY3RzKVxuICovXG5leHBvcnQgY29uc3QgZGVjb2RlRGF0YSA9IChyZXNwb25zZUNvbnRlbnQpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZW50O1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShyZXNwb25zZUNvbnRlbnQpKSB7XG4gICAgICAgIGZvckVhY2gocmVzcG9uc2VDb250ZW50LCBkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhkYXRhKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBodG1sRGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgICAgIGZvckVhY2goZGF0YSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gaHRtbERlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHJlc3BvbnNlQ29udGVudCkpIHtcbiAgICAgICAgZm9yRWFjaChyZXNwb25zZUNvbnRlbnQsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50W2tleV0gPSBodG1sRGVjb2RlKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcocmVzcG9uc2VDb250ZW50KSkge1xuICAgICAgICByZXNwb25zZUNvbnRlbnQgPSBodG1sRGVjb2RlKHJlc3BvbnNlQ29udGVudCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZUNvbnRlbnQ7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gaHRtbERlY29kZShpbnB1dCkge1xuICAgIHJldHVybiBoZS51bmVzY2FwZShpbnB1dCk7XG59XG4iXX0=
|
|
859
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFyaWFibGVzL3NyYy91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsV0FBVyxFQUNYLE1BQU0sRUFDTixRQUFRLEVBQ1IsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEVBQ1gsT0FBTyxFQUNQLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNaLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBWSxrQkFBa0IsRUFBRSxZQUFZLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNoRyxPQUFPLEVBQ0gsUUFBUSxFQUFFLE1BQU0sRUFDaEIsT0FBTyxFQUNQLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFDOUIsT0FBTyxFQUNQLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUM5QixRQUFRLEVBQ1IsV0FBVyxFQUNYLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFDckIsSUFBSSxFQUNKLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFDNUIsS0FBSyxFQUNMLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDaEMsTUFBTSxXQUFXLENBQUM7QUFJbkIsT0FBTyxLQUFLLFNBQVMsTUFBTyxRQUFRLENBQUM7QUFDckMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFHckQsTUFBTSxjQUFjLEdBQUssRUFBRSxPQUFPLEVBQUcsT0FBTyxFQUFFLEtBQUssRUFBRyxNQUFNLEVBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDdEIsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDO0FBQ3ZC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ICAgIERhdGFUeXBlLFxuICAgIERFRkFVTFRfRk9STUFUUyxcbiAgICBleHRyYWN0VHlwZSxcbiAgICBmaW5kVmFsdWVPZixcbiAgICBnZXRCbG9iLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBzdHJpbmdTdGFydHNXaXRoLFxuICAgIHRyaWdnZXJGblxufSBmcm9tICdAd20vY29yZSc7XG5cbmltcG9ydCB7Q09OU1RBTlRTLCBWQVJJQUJMRV9DT05TVEFOVFMsIFdTX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3ZhcmlhYmxlcy5jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZSwgZmlsdGVyLFxuICAgIGZvckVhY2gsXG4gICAgZ2V0LCBpbmNsdWRlcywgaXNBcnJheSwgaXNEYXRlLFxuICAgIGlzRW1wdHksXG4gICAgaXNGdW5jdGlvbiwgaXNOdW1iZXIsIGlzT2JqZWN0LFxuICAgIGlzU3RyaW5nLFxuICAgIGlzVW5kZWZpbmVkLFxuICAgIGpvaW4sIGtleXMsIGxhc3QsIG1hcCxcbiAgICBub29wLFxuICAgIHBpY2tCeSwgcmVtb3ZlLCByZXBsYWNlLCBzZXQsXG4gICAgc2xpY2UsXG4gICAgc3BsaXQsIHRvTG93ZXIsIHRvVXBwZXIsIHRyaW1cbn0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5kZWNsYXJlIGNvbnN0ICQ7XG5kZWNsYXJlIGNvbnN0IGhlO1xuaW1wb3J0ICogYXMgbW9tZW50TGliICBmcm9tICdtb21lbnQnO1xuY29uc3QgbW9tZW50ID0gbW9tZW50TGliLmRlZmF1bHQgfHwgd2luZG93Wydtb21lbnQnXTtcbmRlY2xhcmUgY29uc3Qgd2luZG93O1xuXG5jb25zdCBleHBvcnRUeXBlc01hcCAgID0geyAnRVhDRUwnIDogJy54bHN4JywgJ0NTVicgOiAnLmNzdid9O1xuXG5leHBvcnQgbGV0IGFwcE1hbmFnZXI7XG5leHBvcnQgbGV0IGh0dHBTZXJ2aWNlO1xuZXhwb3J0IGxldCBtZXRhZGF0YVNlcnZpY2U7XG5leHBvcnQgbGV0IG5hdmlnYXRpb25TZXJ2aWNlO1xuZXhwb3J0IGxldCByb3V0ZXJTZXJ2aWNlO1xuZXhwb3J0IGxldCB0b2FzdGVyU2VydmljZTtcbmV4cG9ydCBsZXQgb2F1dGhTZXJ2aWNlO1xuZXhwb3J0IGxldCBzZWN1cml0eVNlcnZpY2U7XG5leHBvcnQgbGV0IGRpYWxvZ1NlcnZpY2U7XG5cbmNvbnN0IERPVF9FWFBSX1JFWCA9IC9eXFxbKFwifCcpW1xcd1xcV10qKFxcMSlcXF0kLyxcbiAgICBpbnRlcm5hbEJvdW5kTm9kZU1hcCA9IG5ldyBNYXAoKSxcbiAgICB0aW1lcnMgPSBuZXcgTWFwKCk7XG5cbmNvbnN0IF9pbnZva2UgPSAodmFyaWFibGUsIG9wKSA9PiB7XG4gICAgbGV0IGRlYm91bmNlZEZuLFxuICAgICAgICBjYW5jZWxGbiA9IG5vb3AsXG4gICAgICAgIHJldFZhbDtcbiAgICBpZiAodGltZXJzLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgY2FuY2VsRm4gPSB0aW1lcnMuZ2V0KHZhcmlhYmxlKS5jYW5jZWw7XG4gICAgfVxuICAgIGNhbmNlbEZuKCk7XG4gICAgZGVib3VuY2VkRm4gPSBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldFZhbCA9IHZhcmlhYmxlW29wXSgpO1xuICAgICAgICAvLyBoYW5kbGUgcHJvbWlzZXMgdG8gYXZvaWQgdW5jYXVnaHQgcHJvbWlzZSBlcnJvcnMgaW4gY29uc29sZVxuICAgICAgICBpZiAocmV0VmFsIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0VmFsLmNhdGNoKG5vb3ApO1xuICAgICAgICB9XG4gICAgfSwgMTAwKTtcbiAgICB0aW1lcnMuc2V0KHZhcmlhYmxlLCBkZWJvdW5jZWRGbik7XG4gICAgZGVib3VuY2VkRm4oKTtcbn07XG5cbmNvbnN0IHByb2Nlc3NWYXJpYWJsZVBvc3RCaW5kVXBkYXRlID0gKG5vZGVOYW1lLCBub2RlVmFsLCBub2RlVHlwZSwgdmFyaWFibGUsIG5vVXBkYXRlKSA9PiB7XG4gICAgc3dpdGNoICh2YXJpYWJsZS5jYXRlZ29yeSkge1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MSVZFOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm9wZXJhdGlvbiA9PT0gJ3JlYWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvckVhY2gobm9kZVZhbCwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5maWx0ZXJGaWVsZHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbHRlckZpZWxkc1tub2RlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBub2RlVmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnIDogbm9kZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgaXNGdW5jdGlvbih2YXJpYWJsZS5saXN0UmVjb3JkcykgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdsaXN0UmVjb3JkcycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmlucHV0RmllbGRzID0gbm9kZVZhbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5pbnB1dEZpZWxkc1tub2RlTmFtZV0gPSBub2RlVmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBpZiBhdXRvLXVwZGF0ZSBzZXQgZm9yIHRoZSB2YXJpYWJsZSB3aXRoIHJlYWQgb3BlcmF0aW9uIG9ubHksIGdldCBpdHMgZGF0YSAqL1xuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFpc1VuZGVmaW5lZChub2RlVmFsKSAmJiBpc0Z1bmN0aW9uKHZhcmlhYmxlW3ZhcmlhYmxlLm9wZXJhdGlvbiArICdSZWNvcmQnXSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsIHZhcmlhYmxlLm9wZXJhdGlvbiArICdSZWNvcmQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBWQVJJQUJMRV9DT05TVEFOVFMuQ0FURUdPUlkuQ1JVRDpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5vcGVyYXRpb25UeXBlID09PSAnbGlzdCcgJiYgdmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5TRVJWSUNFOlxuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MT0dJTjpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFpc1VuZGVmaW5lZChub2RlVmFsKSAmJiBpc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldERlcGVuZGVuY3kgPSAodHlwZTogc3RyaW5nLCByZWY6IGFueSkgPT4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdhcHBNYW5hZ2VyJzpcbiAgICAgICAgICAgIGFwcE1hbmFnZXIgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaHR0cCc6XG4gICAgICAgICAgICBodHRwU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAgICAgICBtZXRhZGF0YVNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmF2aWdhdGlvblNlcnZpY2UnOlxuICAgICAgICAgICAgbmF2aWdhdGlvblNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncm91dGVyJzpcbiAgICAgICAgICAgIHJvdXRlclNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9hc3Rlcic6XG4gICAgICAgICAgICB0b2FzdGVyU2VydmljZSA9ICByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb0F1dGgnOlxuICAgICAgICAgICAgb2F1dGhTZXJ2aWNlID0gIHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWN1cml0eSc6XG4gICAgICAgICAgICBzZWN1cml0eVNlcnZpY2UgPSAgcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICAgICAgICBkaWFsb2dTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYXRlQ2FsbGJhY2sgPSAodHlwZTogc3RyaW5nLCB2YXJpYWJsZTogYW55LCBkYXRhOiBhbnksIG9wdGlvbnM/OiBhbnksIHNraXBEZWZhdWx0Tm90aWZpY2F0aW9uPzogYm9vbGVhbikgPT4ge1xuXG4gICAgLypjaGVja2luZyBpZiBldmVudCBpcyBhdmFpbGFibGUgYW5kIHZhcmlhYmxlIGhhcyBldmVudCBwcm9wZXJ0eSBhbmQgdmFyaWFibGUgZXZlbnQgcHJvcGVydHkgYm91bmQgdG8gZnVuY3Rpb24qL1xuICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gdmFyaWFibGVbdHlwZV0sXG4gICAgICAgIGNhbGxCYWNrU2NvcGUgPSB2YXJpYWJsZS5fY29udGV4dDtcbiAgICBsZXQgZXJyb3JWYXJpYWJsZTtcbiAgICAvKipcbiAgICAgKiBGb3IgZXJyb3IgZXZlbnQ6XG4gICAgICogdHJpZ2dlciBhcHAgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAgICAgKiBpZiBubyBldmVudCBpcyBhc3NpZ25lZCwgdHJpZ2dlciBkZWZhdWx0IGFwcE5vdGlmaWNhdGlvbiB2YXJpYWJsZS5cbiAgICAgKi9cbiAgIGlmICh0eXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuRVZFTlQuRVJST1IgJiYgIXNraXBEZWZhdWx0Tm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGlmICghZXZlbnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIC8qIGluIGNhc2Ugb2YgZXJyb3IsIGlmIG5vIGV2ZW50IGFzc2lnbmVkLCBoYW5kbGUgdGhyb3VnaCBkZWZhdWx0IG5vdGlmaWNhdGlvbiB2YXJpYWJsZSAqL1xuICAgICAgICAgICAgZXJyb3JWYXJpYWJsZSA9IGNhbGxCYWNrU2NvcGUuQWN0aW9uc1tWQVJJQUJMRV9DT05TVEFOVFMuREVGQVVMVF9WQVIuTk9USUZJQ0FUSU9OXTtcbiAgICAgICAgICAgIGlmIChlcnJvclZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVycm9yVmFyaWFibGUuZ2V0TWVzc2FnZSgpIHx8IGRhdGE7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGlzU3RyaW5nKGRhdGEpID8gZGF0YSA6ICdBbiBlcnJvciBoYXMgb2NjdXJlZC4gUGxlYXNlIGNoZWNrIHRoZSBhcHAgbG9ncy4nO1xuICAgICAgICAgICAgICAgIGVycm9yVmFyaWFibGUuaW52b2tlKHsgJ21lc3NhZ2UnIDogZGF0YX0sIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgLy8gJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gJHJvb3RTY29wZS4kZW1pdChcImludm9rZS1zZXJ2aWNlXCIsIFZBUklBQkxFX0NPTlNUQU5UUy5ERUZBVUxUX1ZBUi5OT1RJRklDQVRJT04sIHtzY29wZTogY2FsbEJhY2tTY29wZSwgbWVzc2FnZTogcmVzcG9uc2V9KTtcbiAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUT0RPOiBbVmliaHVdLCBjaGVjayB3aGV0aGVyIHRvIHN1cHBvcnQgbGVnYWN5IGV2ZW50IGNhbGxpbmcgbWVjaGFuaXNtIChpZGVhbGx5LCBpdCBzaG91bGQgaGF2ZSBiZWVuIG1pZ3JhdGVkKVxuICAgIGNvbnN0IGZuID0gJHBhcnNlRXZlbnQodmFyaWFibGVbdHlwZV0pO1xuICAgIGlmICh0eXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuRVZFTlQuQkVGT1JFX1VQREFURSkge1xuICAgICAgICBpZiAodmFyaWFibGUuY2F0ZWdvcnkgPT09ICd3bS5MaXZlVmFyaWFibGUnICYmIHZhcmlhYmxlLm9wZXJhdGlvbiA9PT0gJ3JlYWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odmFyaWFibGUuX2NvbnRleHQsIHt2YXJpYWJsZTogdmFyaWFibGUsIGRhdGFGaWx0ZXI6IGRhdGEsIG9wdGlvbnM6IG9wdGlvbnN9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgaW5wdXREYXRhOiBkYXRhLCBvcHRpb25zOiBvcHRpb25zfSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZm4odmFyaWFibGUuX2NvbnRleHQsIHt2YXJpYWJsZTogdmFyaWFibGUsIGRhdGE6IGRhdGEsIG9wdGlvbnM6IG9wdGlvbnN9KTtcbiAgICB9XG59O1xuXG5jb25zdCB0cmlnZ2VyT25UaW1lb3V0ID0gKHN1Y2Nlc3MpID0+IHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdHJpZ2dlckZuKHN1Y2Nlc3MpOyB9LCA1MDApO1xufTtcblxuY29uc3QgZG93bmxvYWRGaWxlZnJvbVJlc3BvbnNlID0gKHJlc3BvbnNlLCBoZWFkZXJzLCBzdWNjZXNzLCBlcnJvcikgPT4ge1xuICAgIC8vIGNoZWNrIGZvciBhIGZpbGVuYW1lXG4gICAgbGV0IGZpbGVuYW1lID0gJycsXG4gICAgICAgIGZpbGVuYW1lUmVnZXgsXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGJsb2IsXG4gICAgICAgIFVSTCxcbiAgICAgICAgZG93bmxvYWRVcmwsXG4gICAgICAgIHBvcHVwO1xuICAgIGNvbnN0IGRpc3Bvc2l0aW9uID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKTtcbiAgICBpZiAoZGlzcG9zaXRpb24gJiYgZGlzcG9zaXRpb24uaW5kZXhPZignYXR0YWNobWVudCcpICE9PSAtMSkge1xuICAgICAgICBmaWxlbmFtZVJlZ2V4ID0gL2ZpbGVuYW1lW147PVxcbl0qPSgoWydcIl0pLio/XFwyfFteO1xcbl0qKS87XG4gICAgICAgIG1hdGNoZXMgPSBmaWxlbmFtZVJlZ2V4LmV4ZWMoZGlzcG9zaXRpb24pO1xuICAgICAgICBpZiAobWF0Y2hlcyAhPT0gbnVsbCAmJiBtYXRjaGVzWzFdKSB7XG4gICAgICAgICAgICBmaWxlbmFtZSA9IG1hdGNoZXNbMV0ucmVwbGFjZSgvWydcIl0vZywgJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHlwZSA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAgICBibG9iID0gbmV3IEJsb2IoW3Jlc3BvbnNlXSwgeyB0eXBlOiB0eXBlIH0pO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIElFIHdvcmthcm91bmQgZm9yIFwiSFRNTDcwMDc6IE9uZSBvciBtb3JlIGJsb2IgVVJMcyB3ZXJlIHJldm9rZWQgYnkgY2xvc2luZyB0aGUgYmxvYiBmb3Igd2hpY2ggdGhleSB3ZXJlIGNyZWF0ZWQuIFRoZXNlIFVSTHMgd2lsbCBubyBsb25nZXIgcmVzb2x2ZSBhcyB0aGUgZGF0YSBiYWNraW5nIHRoZSBVUkwgaGFzIGJlZW4gZnJlZWQuXCJcbiAgICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgIHRyaWdnZXJPblRpbWVvdXQoc3VjY2Vzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRm4oZXJyb3IpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgVVJMICAgICAgICAgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XG4gICAgICAgIGRvd25sb2FkVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICAgICAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIC8vIHVzZSBIVE1MNSBhW2Rvd25sb2FkXSBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBmaWxlbmFtZVxuICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGxldCByZWFkZXI7XG4gICAgICAgICAgICAvLyBzYWZhcmkgZG9lc24ndCBzdXBwb3J0IHRoaXMgeWV0XG4gICAgICAgICAgICBpZiAodHlwZW9mIGEuZG93bmxvYWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSByZWFkZXIucmVzdWx0LnJlcGxhY2UoL15kYXRhOlteO10qOy8sICdkYXRhOmF0dGFjaG1lbnQvZmlsZTsnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAgPSB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3B1cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSB0cmlnZ2VyT25UaW1lb3V0LmJpbmQodW5kZWZpbmVkLCBzdWNjZXNzKTtcbiAgICAgICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhLmhyZWYgPSBkb3dubG9hZFVybDtcbiAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgdHJpZ2dlck9uVGltZW91dChzdWNjZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcHVwID0gd2luZG93Lm9wZW4oZG93bmxvYWRVcmwsICdfYmxhbmsnKTtcbiAgICAgICAgICAgIGlmICghcG9wdXApIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvd25sb2FkVXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJpZ2dlck9uVGltZW91dChzdWNjZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBVUkwucmV2b2tlT2JqZWN0VVJMKGRvd25sb2FkVXJsKTsgfSwgMTAwKTsgLy8gY2xlYW51cFxuICAgIH1cbn07XG5cbmNvbnN0IGdldFNlcnZpY2UgPSAoc2VydmljZU5hbWUpID0+IHtcbiAgICBpZiAoIXNlcnZpY2VOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHNlcnZpY2VOYW1lO1xuICAgIC8vIFRvZG86IFNodWJoYW0sIHVuY29tbWVudCBiZWxvdyBjb2RlXG4gICAgLyogLyEqIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB3aGVyZSBuZy1hcHAgaXMgZGVmaW5lZCAqIS9cbiAgICAgbGV0IGFwcEVsID0gV00uZWxlbWVudCgnW2lkPW5nLWFwcF0nKSwgaW5qZWN0b3I7XG4gICAgIGlmIChhcHBFbCkge1xuICAgICB0cnkge1xuICAgICBpbmplY3RvciA9IGFwcEVsLmluamVjdG9yKCk7IC8vIGdldCB0aGUgYW5ndWxhciBpbmplY3RvclxuICAgICBpZiAoaW5qZWN0b3IpIHtcbiAgICAgcmV0dXJuIGluamVjdG9yLmdldChzZXJ2aWNlTmFtZSk7IC8vIHJldHVybiB0aGUgc2VydmljZVxuICAgICB9XG4gICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgfVxuICAgICB9Ki9cbn07XG5cbi8qKlxuICogQ29uc3RydWN0IHRoZSBmb3JtIGRhdGEgcGFyYW1zIGZyb20gdGhlIFVSTFxuICogQHBhcmFtIHF1ZXJ5UGFyYW1zXG4gKiBAcGFyYW0gcGFyYW1zXG4gKi9cbmNvbnN0IHNldFBhcmFtc0Zyb21VUkwgPSAocXVlcnlQYXJhbXMsIHBhcmFtcykgPT4ge1xuICAgIHF1ZXJ5UGFyYW1zID0gc3BsaXQocXVlcnlQYXJhbXMsICcmJyk7XG4gICAgZm9yRWFjaChxdWVyeVBhcmFtcywgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgIHBhcmFtID0gc3BsaXQocGFyYW0sICc9Jyk7XG4gICAgICAgIHBhcmFtc1twYXJhbVswXV0gPSBkZWNvZGVVUklDb21wb25lbnQoam9pbihzbGljZShwYXJhbSwgMSksICc9JykpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBbVG9kbzogU2h1YmhhbV0sIEltcGxlbWVudCBEb3dubG9hZCB0aHJvdWdoIEkgZnJhbWVcbiAqIFNpbXVsYXRlcyBmaWxlIGRvd25sb2FkIGluIGFuIGFwcCB0aHJvdWdoIGNyZWF0aW5nIGFuZCBzdWJtaXR0aW5nIGEgaGlkZGVuIGZvcm0gaW4gRE9NLlxuICogVGhlIGFjdGlvbiB3aWxsIGJlIGluaXRpYXRlZCB0aHJvdWdoIGEgU2VydmljZSBWYXJpYWJsZVxuICpcbiAqIFF1ZXJ5IFBhcmFtc1xuICogVGhlIHJlcXVlc3QgcGFyYW1zIGxpa2UgcXVlcnkgcGFyYW1zIGFyZSBhZGRlZCBhcyBoaWRkZW4gaW5wdXQgZWxlbWVudHNcbiAqXG4gKiBIZWFkZXIgUGFyYW1zXG4gKiBUaGUgaGVhZGVyIHBhcmFtcyBmb3IgYSByZXF1ZXN0IGFyZSBhbHNvIGFkZGVkIGFsb25nIHdpdGggaGlkZGVuIGlucHV0IGVsZW1lbnRzLlxuICogVGhpcyBpcyBkb25lIGFzIGhlYWRlcnMgY2FuIG5vdCBiZSBzZXQgZm9yIGEgZm9ybSBQT1NUIGNhbGwgZnJvbSBKYXZhU2NyaXB0XG4gKlxuICogRmluYWxseSwgcmVxdWVzdCBwYXJhbWV0ZXJzIGFyZSBzZW50IGFzIGZvbGxvd3M6XG4gKiBGb3IgYSBHRVQgcmVxdWVzdCwgdGhlIHJlcXVlc3QgZGF0YSBpcyBzZW50IGFsb25nIHdpdGggdGhlIHF1ZXJ5IHBhcmFtcy5cbiAqIEZvciBQT1NULCBpdCBpcyBzZW50IGFzIHJlcXVlc3QgYm9keS5cbiAqXG4gKiBAcGFyYW0gdmFyaWFibGU6IHRoZSB2YXJpYWJsZSB0aGF0IGlzIGNhbGxlZCBmcm9tIHVzZXIgYWN0aW9uXG4gKiBAcGFyYW0gcmVxdWVzdFBhcmFtcyBvYmplY3QgY29uc2lzdGluZyB0aGUgaW5mbyB0byBjb25zdHJ1Y3QgdGhlIFhIUiByZXF1ZXN0IGZvciB0aGUgc2VydmljZVxuICovXG5jb25zdCBkb3dubG9hZFRocm91Z2hJZnJhbWUgPSAocmVxdWVzdFBhcmFtcywgc3VjY2VzcywgZGF0YUJpbmRpbmcsZXJyb3IpID0+IHtcbiAgICAvLyBUb2RvOiBTSHViaGFtOiBVUkwgY29udGFpbnMgJy8vJyBpbiBiZXR3ZWVuIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGF0IHRoZSBVUkwgZm9ybWF0aW9uIG9ubHlcbiAgICBpZiAocmVxdWVzdFBhcmFtcy51cmxbMV0gPT09ICcvJyAmJiByZXF1ZXN0UGFyYW1zLnVybFsyXSA9PT0gJy8nKSB7XG4gICAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gcmVxdWVzdFBhcmFtcy51cmwuc2xpY2UoMCwgMSkgKyByZXF1ZXN0UGFyYW1zLnVybC5zbGljZSgyKTtcbiAgICB9XG4gICAgbGV0IGlGcmFtZUVsZW1lbnQsXG4gICAgICAgIGZvcm1FbCxcbiAgICAgICAgcGFyYW1FbGVtZW50LFxuICAgICAgICBxdWVyeVBhcmFtcyA9ICcnLFxuICAgICAgICBkYXRhO1xuICAgIGNvbnN0IElGUkFNRV9OQU1FICAgICA9ICdmaWxlRG93bmxvYWRJRnJhbWUnLFxuICAgICAgICBGT1JNX05BTUUgICAgICAgPSAnZmlsZURvd25sb2FkRm9ybScsXG4gICAgICAgIENPTlRFTlRfVFlQRSAgICA9ICdDb250ZW50LVR5cGUnLFxuICAgICAgICB1cmwgICAgICAgICAgICAgPSByZXF1ZXN0UGFyYW1zLnVybCxcbiAgICAgICAgZW5jVHlwZSA9IGdldChyZXF1ZXN0UGFyYW1zLmhlYWRlcnMsIENPTlRFTlRfVFlQRSksXG4gICAgICAgIHBhcmFtcyA9IHBpY2tCeShyZXF1ZXN0UGFyYW1zLmhlYWRlcnMsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleSAhPT0gQ09OVEVOVF9UWVBFO1xuICAgICAgICB9KTtcbiAgICAvKiBUb2RvOiBzaHViaGFtIDogZGVmaW5lIGdldFNlcnZpY2UgbWV0aG9kXG4gICAgIFdTX0NPTlNUQU5UUyAgICA9IGdldFNlcnZpY2UoJ1dTX0NPTlNUQU5UUycpOyovXG5cbiAgICAvKiBsb29rIGZvciBleGlzdGluZyBpZnJhbWUuIElmIGV4aXN0cywgcmVtb3ZlIGl0IGZpcnN0ICovXG4gICAgaUZyYW1lRWxlbWVudCA9ICQoJyMnICsgSUZSQU1FX05BTUUpO1xuICAgIGlmIChpRnJhbWVFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICBpRnJhbWVFbGVtZW50LmZpcnN0KCkucmVtb3ZlKCk7XG4gICAgfVxuICAgIGlGcmFtZUVsZW1lbnQgPSAkKCc8aWZyYW1lIGlkPVwiJyArIElGUkFNRV9OQU1FICsgJ1wiIG5hbWU9XCInICsgSUZSQU1FX05BTUUgKyAnXCIgY2xhc3M9XCJuZy1oaWRlXCI+PC9pZnJhbWU+Jyk7XG4gICAgZm9ybUVsICAgICAgICA9ICQoJzxmb3JtIGlkPVwiJyArIEZPUk1fTkFNRSArICdcIiBuYW1lPVwiJyArIEZPUk1fTkFNRSArICdcIj48L2Zvcm0+Jyk7XG5cbiAgICAvKiBwcm9jZXNzIHF1ZXJ5IHBhcmFtcywgYXBwZW5kIGEgaGlkZGVuIGlucHV0IGVsZW1lbnQgaW4gdGhlIGZvcm0gYWdhaW5zdCBlYWNoIHBhcmFtICovXG4gICAgcXVlcnlQYXJhbXMgKz0gdXJsLmluZGV4T2YoJz8nKSAhPT0gLTEgPyB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKCc/JykgKyAxKSA6ICcnO1xuICAgIHF1ZXJ5UGFyYW1zICs9IGVuY1R5cGUgPT09IFdTX0NPTlNUQU5UUy5DT05URU5UX1RZUEVTLkZPUk1fVVJMX0VOQ09ERUQgPyAoKHF1ZXJ5UGFyYW1zID8gJyYnIDogJycpICsgcmVxdWVzdFBhcmFtcy5kYXRhUGFyYW1zKSA6ICcnO1xuXG4gICAgZm9ybUVsLmF0dHIoe1xuICAgICAgICAndGFyZ2V0JyAgOiBpRnJhbWVFbGVtZW50LmF0dHIoJ25hbWUnKSxcbiAgICAgICAgJ2FjdGlvbicgIDogdXJsLFxuICAgICAgICAnbWV0aG9kJyAgOiByZXF1ZXN0UGFyYW1zLm1ldGhvZCxcbiAgICAgICAgJ2VuY3R5cGUnOiAhKGlzRW1wdHkocmVxdWVzdFBhcmFtcy5kYXRhKSAmJiBpc0VtcHR5KHF1ZXJ5UGFyYW1zKSkgPyBlbmNUeXBlIDogV1NfQ09OU1RBTlRTLkNPTlRFTlRfVFlQRVMuTVVMVElQQVJUX0ZPUk1EQVRBXG4gICAgfSk7XG5cbiAgICAvLyBGb3IgTm9uIGJvZHkgbWV0aG9kcyBvbmx5LCBzZXQgdGhlIGlucHV0IGZpZWxkcyBmcm9tIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBpZiAoaW5jbHVkZXMoV1NfQ09OU1RBTlRTLk5PTl9CT0RZX0hUVFBfTUVUSE9EUywgdG9VcHBlcihyZXF1ZXN0UGFyYW1zLm1ldGhvZCkpKSB7XG4gICAgICAgIHNldFBhcmFtc0Zyb21VUkwocXVlcnlQYXJhbXMsIHBhcmFtcyk7IC8vIFNldCBwYXJhbXMgZm9yIFVSTCBxdWVyeSBwYXJhbXNcbiAgICB9XG4gICAgaWYgKCFpc0VtcHR5KHJlcXVlc3RQYXJhbXMuZGF0YSkpIHtcbiAgICAgICAgc2V0UGFyYW1zRnJvbVVSTChyZXF1ZXN0UGFyYW1zLmRhdGEsIHBhcmFtcyk7Ly8gU2V0IHBhcmFtcyBmb3IgcmVxdWVzdCBkYXRhXG4gICAgICAgIGRhdGEgPSBwYXJhbXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IGlzRW1wdHkoZGF0YUJpbmRpbmcpID8gcGFyYW1zIDogZGF0YUJpbmRpbmc7XG4gICAgfVxuICAgIGZvckVhY2goZGF0YSwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgIHBhcmFtRWxlbWVudCA9ICQoJzxpbnB1dCB0eXBlPVwiaGlkZGVuXCI+Jyk7XG4gICAgICAgIHBhcmFtRWxlbWVudC5hdHRyKHtcbiAgICAgICAgICAgICduYW1lJyAgOiBrZXksXG4gICAgICAgICAgICAndmFsdWUnIDogdmFsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3JtRWwuYXBwZW5kKHBhcmFtRWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICAvKiBhcHBlbmQgZm9ybSB0byBpRnJhbWUgYW5kIGlGcmFtZSB0byB0aGUgZG9jdW1lbnQgYW5kIHN1Ym1pdCB0aGUgZm9ybSAqL1xuICAgICQoJ2JvZHknKS5hcHBlbmQoaUZyYW1lRWxlbWVudCk7XG5cbiAgICAvLyB0aW1lb3V0IGZvciBJRSAxMCwgaWZyYW1lRWxlbWVudC5jb250ZW50cygpIGlzIGVtcHR5IGluIElFIDEwIHdpdGhvdXQgdGltZW91dFxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgY29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIGlGcmFtZUVsZW1lbnQub24oXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChjb21wbGV0ZWQpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBpRnJhbWVFbGVtZW50LmNvbnRlbnRzKCkuZmluZCgnYm9keScpLnRleHQoKTtcbiAgICAgICAgICAgIGlmICh0ZXh0ICYmIHRleHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID17ZXJyb3I6SlNPTi5wYXJzZSh0ZXh0LnRyaW0oKSl9IDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgbWVzc2FnZT1cIlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyaWdnZXJGbihlcnJvciwgbWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpRnJhbWVFbGVtZW50LmNvbnRlbnRzKCkuZmluZCgnYm9keScpLmFwcGVuZChmb3JtRWwpO1xuICAgICAgICBmb3JtRWwuc3VibWl0KCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJGbihzdWNjZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwMCk7XG4gICAgfSwgMTAwKTtcbn07XG5cbi8qKlxuICogTWFrZXMgYW4gWEhSIGNhbGwgYWdhaW5zdCB0aGUgY29uZmlnXG4gKiB0aGUgcmVzcG9uc2UgaXMgY29udmVydGVkIGludG8gYSBibG9iIHVybCwgd2hpY2ggaXMgYXNzaWduZWQgdG8gdGhlIHNyYyBhdHRyaWJ1dGUgb2YgYW4gYW5jaG9yIGVsZW1lbnQgd2l0aCBkb3dubG9hZD10cnVlXG4gKiBhIGNsaWNrIGlzIHNpbXVsYXRlZCBvbiB0aGUgYW5jaG9yIHRvIGRvd25sb2FkIHRoZSBmaWxlXG4gKiBAcGFyYW0gY29uZmlnXG4gKiBAcGFyYW0gc3VjY2Vzc1xuICogQHBhcmFtIGVycm9yXG4gKi9cbmNvbnN0IGRvd25sb2FkVGhyb3VnaEFuY2hvciA9IChjb25maWcsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgY29uc3QgdXJsICAgICA9IGNvbmZpZy51cmwsXG4gICAgICAgIG1ldGhvZCAgPSBjb25maWcubWV0aG9kLFxuICAgICAgICBkYXRhICAgID0gY29uZmlnLmRhdGFQYXJhbXMgfHwgY29uZmlnLmRhdGEsXG4gICAgICAgIGhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gaGVhZGVyc1snQ29udGVudC1UeXBlJ10gfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG5cbiAgICAvLyBUb2RvOiBSZXBsYWNlIGh0dHAgd2l0aCBnZXRTZXJ2aWNlXG4gICAgaHR0cFNlcnZpY2Uuc2VuZCh7XG4gICAgICAgICd0YXJnZXQnIDogJ1dlYlNlcnZpY2UnLFxuICAgICAgICAnYWN0aW9uJyA6ICdpbnZva2VSdW50aW1lUmVzdENhbGwnLFxuICAgICAgICAnbWV0aG9kJyA6IG1ldGhvZCxcbiAgICAgICAgJ3VybCcgICAgOiB1cmwsXG4gICAgICAgICdoZWFkZXJzJzogaGVhZGVycyxcbiAgICAgICAgJ2RhdGEnICAgOiBkYXRhLFxuICAgICAgICAncmVzcG9uc2VUeXBlJzogJ2FycmF5YnVmZmVyJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG93bmxvYWRGaWxlZnJvbVJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHJlc3BvbnNlLmhlYWRlcnMsIHN1Y2Nlc3MsIGVycm9yKTtcbiAgICAgICAgfSwgOTAwKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRyaWdnZXJGbihlcnJvciwgZXJyKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogYXBwZW5kcyBhIHRpbWVzdGFtcCBvbiB0aGUgcGFzc2VkIGZpbGVuYW1lIHRvIHByZXZlbnQgY2FjaGluZ1xuICogcmV0dXJucyB0aGUgbW9kaWZpZWQgZmlsZSBuYW1lXG4gKiBAcGFyYW0gZmlsZU5hbWVcbiAqIEBwYXJhbSBleHBvcnRGb3JtYXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGdldE1vZGlmaWVkRmlsZU5hbWUgPSAoZmlsZU5hbWUsIGV4cG9ydEZvcm1hdCkgPT4ge1xuICAgIGxldCBmaWxlRXh0ZW5zaW9uO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGV4cG9ydEZvcm1hdCkge1xuICAgICAgICBmaWxlRXh0ZW5zaW9uID0gZXhwb3J0VHlwZXNNYXBbZXhwb3J0Rm9ybWF0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlRXh0ZW5zaW9uID0gJy4nICsgbGFzdChzcGxpdChmaWxlTmFtZSwgJy4nKSk7XG4gICAgICAgIGZpbGVOYW1lID0gcmVwbGFjZShmaWxlTmFtZSwgZmlsZUV4dGVuc2lvbiwgJycpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZU5hbWUgKyAnXycgKyBjdXJyZW50VGltZXN0YW1wICsgZmlsZUV4dGVuc2lvbjtcbn07XG5cbmNvbnN0IGdldENvb2tpZUJ5TmFtZSA9IChuYW1lKSA9PiB7XG4gICAgLy8gVG9kbzogU2h1YmhhbSBJbXBsZW1lbnQgY29va2llIG5hdGl2ZSBqc1xuICAgIHJldHVybiAnY29va2llJztcbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb29raWVWYWx1ZSBpZiB4c3JmIGlzIGVuYWJsZWQuXG4gKiBJbiBkZXZpY2UsIHhzcmYgY29va2llIGlzIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UuXG4gKiBAcmV0dXJucyB4c3JmIGNvb2tpZSB2YWx1ZVxuICovXG5jb25zdCBpc1hzcmZFbmFibGVkID0gKCkgPT4ge1xuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb2JqZWN0IG5vZGUgZm9yIGEgYmluZCBvYmplY3QsIHdoZXJlIHRoZSB2YWx1ZSBoYXMgdG8gYmUgdXBkYXRlZFxuICogb2JqLnRhcmdldCA9IFwiYVwiXG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0gcm9vdFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuY29uc3QgZ2V0VGFyZ2V0T2JqID0gKG9iaiwgcm9vdCwgdmFyaWFibGUpID0+IHtcbiAgICAvKlxuICAgICAqIGlmIHRoZSB0YXJnZXQga2V5IGlzIGluIHRoZSBmb3JtIGFzIFwiWydteS5wYXJhbSddXCJcbiAgICAgKiBrZWVwIHRoZSB0YXJnZXQga2V5IGFzIFwibXkucGFyYW1cIiBhbmQgZG8gbm90IHNwbGl0IGZ1cnRoZXJcbiAgICAgKiB0aGlzIGlzIGRvbmUsIHNvIHRoYXQsIHRoZSBjb21wdXRlZCB2YWx1ZSBhZ2FpbnN0IHRoaXMgYmluZGluZyBpcyBhc3NpZ25lZCBhc1xuICAgICAqICAgICAge1wibXkucGFyYW1cIjogXCJ2YWx1ZVwifVxuICAgICAqIGFuZCBub3QgYXNcbiAgICAgKiAgICAgIHtcbiAgICAgKiAgICAgICAgICBcIm15XCI6IHtcbiAgICAgKiAgICAgICAgICAgICAgXCJwYXJhbVwiOiBcInZhbHVlXCJcbiAgICAgKiAgICAgICAgICB9XG4gICAgICogICAgICB9XG4gICAgICovXG4gICAgbGV0IHRhcmdldCA9IG9iai50YXJnZXQsXG4gICAgICAgIHRhcmdldE9iajtcbiAgICBjb25zdCByb290Tm9kZSA9IHZhcmlhYmxlW3Jvb3RdO1xuICAgIGlmIChET1RfRVhQUl9SRVgudGVzdCh0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldE9iaiA9IHJvb3ROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5zdWJzdHIoMCwgdGFyZ2V0Lmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICBpZiAob2JqLnRhcmdldCA9PT0gcm9vdCkge1xuICAgICAgICAgICAgdGFyZ2V0T2JqID0gdmFyaWFibGU7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXRPYmogPSBmaW5kVmFsdWVPZihyb290Tm9kZSwgdGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldE9iaiA9IHJvb3ROb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRPYmo7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGtleSBmb3IgdGhlIHRhcmdldCBvYmplY3RcbiAqIHRoZSBjb21wdXRlZCB2YWx1ZSB3aWxsIGJlIHVwZGF0ZWQgYWdhaW5zdCB0aGlzIGtleSBpbiB0aGUgdGFyZ2V0T2JqZWN0KGNvbXB1dGVkIGJ5IGdldFRhcmdldE9iaigpKVxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHJlZ2V4XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuY29uc3QgZ2V0VGFyZ2V0Tm9kZUtleSA9ICh0YXJnZXQpID0+IHtcbiAgICAvKlxuICAgICAqIGlmIHRoZSB0YXJnZXQga2V5IGlzIGluIHRoZSBmb3JtIGFzIFwiWydteS5wYXJhbSddXCJcbiAgICAgKiBrZWVwIHRoZSB0YXJnZXQga2V5IGFzIFwibXkucGFyYW1cIiBhbmQgZG8gbm90IHNwbGl0IGZ1cnRoZXJcbiAgICAgKiB0aGlzIGlzIGRvbmUsIHNvIHRoYXQsIHRoZSBjb21wdXRlZCB2YWx1ZSBhZ2FpbnN0IHRoaXMgYmluZGluZyBpcyBhc3NpZ25lZCBhc1xuICAgICAqICAgICAge1wibXkucGFyYW1cIjogXCJ2YWx1ZVwifVxuICAgICAqIGFuZCBub3QgYXNcbiAgICAgKiAgICAgIHtcbiAgICAgKiAgICAgICAgICBcIm15XCI6IHtcbiAgICAgKiAgICAgICAgICAgICAgXCJwYXJhbVwiOiBcInZhbHVlXCJcbiAgICAgKiAgICAgICAgICB9XG4gICAgICogICAgICB9XG4gICAgICovXG4gICAgbGV0IHRhcmdldE5vZGVLZXk7XG4gICAgaWYgKERPVF9FWFBSX1JFWC50ZXN0KHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IHRhcmdldC5yZXBsYWNlKC9eKFxcW1tcIiddKXwoW1wiJ11cXF0pJC9nLCAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IHRhcmdldC5zcGxpdCgnLicpLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0Tm9kZUtleTtcbn07XG5cbmNvbnN0IHNldFZhbHVlVG9Ob2RlID0gKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgdmFsdWUsIG5vVXBkYXRlPykgPT4ge1xuICAgIGNvbnN0IHRhcmdldE5vZGVLZXkgPSBnZXRUYXJnZXROb2RlS2V5KHRhcmdldCksXG4gICAgICAgIHRhcmdldE9iaiA9IGdldFRhcmdldE9iaihvYmosIHJvb3QsIHZhcmlhYmxlKTtcbiAgICB2YWx1ZSA9ICFpc1VuZGVmaW5lZCh2YWx1ZSkgPyB2YWx1ZSA6IG9iai52YWx1ZTtcbiAgICAvKiBzYW5pdHkgY2hlY2ssIHVzZXIgY2FuIGJpbmQgcGFyZW50IG5vZGVzIHRvIG5vbi1vYmplY3QgdmFsdWVzLCBzbyBjaGlsZCBub2RlIGJpbmRpbmdzIG1heSBmYWlsICovXG4gICAgaWYgKHRhcmdldE9iaikge1xuICAgICAgICAvLyBNdWx0aSBxdWVyeSBwYXJhbXM6IG9uZSBzbG90IHBlciBiaW5kaW5nOyByZWJpbmRzIHJlcGxhY2UgdGhhdCBzbG90IChub3QgYXBwZW5kKS5cbiAgICAgICAgLy8gRXhjZXB0aW9uOiBpZiB0aGUgYmluZCBleHByZXNzaW9uIGl0c2VsZiByZXNvbHZlZCB0byB0aGUgY29tcGxldGUgYXJyYXlcbiAgICAgICAgLy8gKGUuZy4gYGJpbmQ6WydmaXJlJywgJ3dhdGVyJ11gKSwgYXNzaWduIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgdHJlYXRpbmcgaXRcbiAgICAgICAgLy8gYXMgYSBzaW5nbGUgc2xvdCdzIHZhbHVlIOKAlCBzYW1lIGFzIHRoZSBub24tbXVsdGkgYXNzaWdubWVudCBiZWxvdy5cbiAgICAgICAgaWYgKG9iai5jb2xsZWN0aW9uRm9ybWF0ID09PSAnbXVsdGknICYmICFpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlcyA9IHRhcmdldE9ialt0YXJnZXROb2RlS2V5XTtcbiAgICAgICAgICAgIGlmICghaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gdGFyZ2V0T2JqW3RhcmdldE5vZGVLZXldID0gaXNVbmRlZmluZWQodmFsdWVzKSA/IFtdIDogW3ZhbHVlc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc2xvdCA9IG9iai5tdWx0aUluZGV4ICE9PSB1bmRlZmluZWQgPyBvYmoubXVsdGlJbmRleCA6IG9iai5fX211bHRpU2xvdEluZGV4O1xuICAgICAgICAgICAgaWYgKHNsb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNsb3QgPSBvYmouX19tdWx0aVNsb3RJbmRleCA9IHZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmouX19tdWx0aVNsb3RJbmRleCA9IHNsb3Q7XG4gICAgICAgICAgICAgICAgdmFsdWVzW3Nsb3RdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRPYmpbdGFyZ2V0Tm9kZUtleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm9jZXNzVmFyaWFibGVQb3N0QmluZFVwZGF0ZSh0YXJnZXROb2RlS2V5LCB2YWx1ZSwgb2JqLnR5cGUsIHZhcmlhYmxlLCBub1VwZGF0ZSk7XG59O1xuXG4vKipcbiAqIFRoZSBtb2RlbCBpbnRlcm5hbEJvdW5kTm9kZU1hcCBzdG9yZXMgdGhlIHJlZmVyZW5jZSB0byBsYXRlc3QgY29tcHV0ZWQgdmFsdWVzIGFnYWluc3QgaW50ZXJuYWwobmVzdGVkKSBib3VuZCBub2Rlc1xuICogVGhpcyBpcyBkb25lIHNvIHRoYXQgdGhlIGludGVybmFsIG5vZGUncyBjb21wdXRlZCB2YWx1ZSBpcyBub3QgbG9zdCwgb25jZSBpdHMgcGFyZW50IG5vZGUncyB2YWx1ZSBpcyBjb21wdXRlZCBhdCBhIGxhdGVyIHBvaW50XG4gKiBFLmcuXG4gKiBWYXJpYWJsZS5lbXBsb3llZVZhciBoYXMgZm9sbG93aW5nIGJpbmRpbmdzXG4gKiBcImRhdGFCaW5kaW5nXCI6IFtcbiAgICAge1xuICAgICAgICAgXCJ0YXJnZXRcIjogXCJkZXBhcnRtZW50LmJ1ZGdldFwiLFxuICAgICAgICAgXCJ2YWx1ZVwiOiBcImJpbmQ6VmFyaWFibGVzLmJ1ZGdldFZhci5kYXRhU2V0XCJcbiAgICAgfSxcbiAgICAge1xuICAgICAgICAgXCJ0YXJnZXRcIjogXCJkZXBhcnRtZW50XCIsXG4gICAgICAgICBcInZhbHVlXCI6IFwiYmluZDpWYXJpYWJsZXMuZGVwYXJ0bWVudFZhci5kYXRhU2V0XCJcbiAgICAgfVxuIF1cbiAqIFdoZW4gZGVwYXJ0bWVudC5idWRnZXQgaXMgY29tcHV0ZWQsIGVtcGxveWVlVmFyLmRhdGFTZXQgPSB7XG4gKiAgXCJkZXBhcnRtZW50XCI6IHtcbiAqICAgICAgXCJidWRnZXRcIjoge1wicTFcIjogMTExMX1cbiAqICB9XG4gKiB9XG4gKlxuICogV2hlbiBkZXBhcnRtZW50IGlzIGNvbXB1dGVkXG4gKiAgXCJkZXBhcnRtZW50XCI6IHtcbiAqICAgICAgXCJuYW1lXCI6IFwiSFJcIixcbiAqICAgICAgXCJsb2NhdGlvblwiOiBcIkh5ZGVyYWJhZFwiXG4gKiAgfVxuICogVGhlIGJ1ZGdldCBmaWVsZCAoY29tcHV0ZWQgZWFybGllcikgaXMgTE9TVC5cbiAqXG4gKiBUbyBhdm9pZCB0aGlzLCB0aGUgbGF0ZXN0IHZhbHVlcyBhZ2FpbnN0IGludGVybmFsIG5vZGVzIChpbiB0aGlzIGNhc2UgZGVwYXJ0bWVudC5idWRnZXQpIGFyZSBzdG9yZWQgaW4gYSBtYXBcbiAqIFRoZXNlIHZhbHVlcyBhcmUgYXNzaWduZWQgYmFjayB0byBpbnRlcm5hbCBmaWVsZHMgaWYgdGhlIHBhcmVudCBpcyBjb21wdXRlZCAoaW4gdGhpcyBjYXNlIGRlcGFydG1lbnQpXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcm9vdFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKi9cbmNvbnN0IHVwZGF0ZUludGVybmFsTm9kZXMgPSAodGFyZ2V0LCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIGNvbnN0IGJvdW5kSW50ZXJuYWxOb2RlcyA9IGtleXMoZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290XSkpLFxuICAgICAgICB0YXJnZXROb2RlS2V5ID0gZ2V0VGFyZ2V0Tm9kZUtleSh0YXJnZXQpO1xuICAgIGxldCBpbnRlcm5hbE5vZGVzO1xuICAgIGZ1bmN0aW9uIGZpbmRJbnRlcm5hbE5vZGVCb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcihib3VuZEludGVybmFsTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAvLyB0aGUgbGF0ZXIgY29uZGl0aW9uIGluIGNoZWNrICh0YXJnZXROb2RlS2V5ID09PSByb290IHx8IHRhcmdldE5vZGVLZXkgPT09ICdkYXRhQmluZGluZycpIGlzIHNwZWNpZmljYWxseSBmb3IgbGl2ZSB2YXJpYWJsZSBvZiBpbnNlcnQvdXBkYXRlIHR5cGVzXG4gICAgICAgICAgICByZXR1cm4gKG5vZGUgIT09IHRhcmdldE5vZGVLZXkgJiYgaW5jbHVkZXMobm9kZSwgdGFyZ2V0Tm9kZUtleSkpIHx8ICgodGFyZ2V0Tm9kZUtleSA9PT0gcm9vdCB8fCB0YXJnZXROb2RlS2V5ID09PSAnZGF0YUJpbmRpbmcnKSAmJiBub2RlICE9PSB0YXJnZXROb2RlS2V5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludGVybmFsTm9kZXMgPSBmaW5kSW50ZXJuYWxOb2RlQm91bmQoKTtcbiAgICBpZiAoKGludGVybmFsTm9kZXMubGVuZ3RoKSkge1xuICAgICAgICBmb3JFYWNoKGludGVybmFsTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBzZXRWYWx1ZVRvTm9kZShub2RlLCB7dGFyZ2V0OiBub2RlfSwgcm9vdCwgdmFyaWFibGUsIGdldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgbm9kZV0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBOZXcgSW1wbGVtZW50YXRpb24gKERhdGFCaW5kaW5nIEZsYXQgU3RydWN0dXJlIHdpdGggeC1wYXRoIHRhcmdldHMpXG4gKiBwcm9jZXNzZXMgYSBkYXRhQmluZGluZyBvYmplY3QsIGlmIGJvdW5kIHRvIGV4cHJlc3Npb24sIHdhdGNoZXMgb3ZlciBpdCwgZWxzZSBhc3NpZ25zIHZhbHVlIHRvIHRoZSBleHByZXNzaW9uXG4gKiBAcGFyYW0gb2JqIGRhdGFCaW5kaW5nIG9iamVjdFxuICogQHBhcmFtIHNjb3BlIHNjb3BlIG9mIHRoZSB2YXJpYWJsZVxuICogQHBhcmFtIHJvb3Qgcm9vdCBub2RlIHN0cmluZyAoZGF0YUJpbmRpbmcgZm9yIGFsbCB2YXJpYWJsZXMsIGRhdGFTZXQgZm9yIHN0YXRpYyB2YXJpYWJsZSlcbiAqIEBwYXJhbSB2YXJpYWJsZSB2YXJpYWJsZSBvYmplY3RcbiAqL1xuY29uc3QgcHJvY2Vzc0JpbmRPYmplY3QgPSAob2JqLCBzY29wZSwgcm9vdCwgdmFyaWFibGUpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBvYmoudGFyZ2V0LFxuICAgICAgICB0YXJnZXRPYmogPSBnZXRUYXJnZXRPYmoob2JqLCByb290LCB2YXJpYWJsZSksXG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSBnZXRUYXJnZXROb2RlS2V5KHRhcmdldCksXG4gICAgICAgIHJ1bk1vZGUgPSB0cnVlO1xuICAgIGNvbnN0IGRlc3Ryb3lGbiA9IHNjb3BlLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyID8gc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIuYmluZChzY29wZSkgOiBub29wO1xuXG4gICAgaWYgKHN0cmluZ1N0YXJ0c1dpdGgob2JqLnZhbHVlLCAnYmluZDonKSkge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IChuZXdWYWwsIG9sZFZhbCkgPT4ge1xuICAgICAgICAgICAgaWYgKChuZXdWYWwgPT09IG9sZFZhbCAmJiBpc1VuZGVmaW5lZChuZXdWYWwpKSB8fCAoaXNVbmRlZmluZWQobmV3VmFsKSAmJiAoIWlzVW5kZWZpbmVkKG9sZFZhbCkgfHwgIWlzVW5kZWZpbmVkKHRhcmdldE9ialt0YXJnZXROb2RlS2V5XSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNraXAgY2xvbmluZyBmb3IgYmxvYiBjb2x1bW5cbiAgICAgICAgICAgIGlmICghaW5jbHVkZXMoWydibG9iJywgJ2ZpbGUnXSwgb2JqLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsID0gZ2V0Q2xvbmVkT2JqZWN0KG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRWYWx1ZVRvTm9kZSh0YXJnZXQsIG9iaiwgcm9vdCwgdmFyaWFibGUsIG5ld1ZhbCk7IC8vIGNsb25pbmcgbmV3VmFsIHRvIGtlZXAgdGhlIHNvdXJjZSBjbGVhblxuXG4gICAgICAgICAgICBpZiAocnVuTW9kZSkge1xuICAgICAgICAgICAgICAgIC8qc2V0IHRoZSBpbnRlcm5hbCBib3VuZCBub2RlIG1hcCB3aXRoIHRoZSBsYXRlc3QgdXBkYXRlZCB2YWx1ZSovXG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbEJvdW5kTm9kZU1hcC5oYXModmFyaWFibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsQm91bmROb2RlTWFwLnNldCh2YXJpYWJsZSwge30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXQoaW50ZXJuYWxCb3VuZE5vZGVNYXAuZ2V0KHZhcmlhYmxlKSwgW3ZhcmlhYmxlLm5hbWUsIHJvb3QsIHRhcmdldF0sIG5ld1ZhbCk7XG4gICAgICAgICAgICAgICAgLyp1cGRhdGUgdGhlIGludGVybmFsIG5vZGVzIGFmdGVyIGludGVybmFsIG5vZGUgbWFwIGlzIHNldCovXG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJuYWxOb2Rlcyh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRlc3Ryb3lGbigkd2F0Y2gob2JqLnZhbHVlLnJlcGxhY2UoJ2JpbmQ6JywgJycpLCBzY29wZSwge30sIGxpc3RlbmVyLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoKSA9PiB2YXJpYWJsZS5pc011dGVkKSk7XG4gICAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQob2JqLnZhbHVlKSkge1xuICAgICAgICBzZXRWYWx1ZVRvTm9kZSh0YXJnZXQsIG9iaiwgcm9vdCwgdmFyaWFibGUsIG9iai52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChydW5Nb2RlICYmIHJvb3QgIT09IHRhcmdldE5vZGVLZXkpIHtcbiAgICAgICAgICAgIGlmICghaW50ZXJuYWxCb3VuZE5vZGVNYXAuaGFzKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgICAgIGludGVybmFsQm91bmROb2RlTWFwLnNldCh2YXJpYWJsZSwge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCB0YXJnZXRdLCBvYmoudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFVCTElDICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vXG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgd2F0Y2hlcnMgZm9yIGJpbmRpbmcgZXhwcmVzc2lvbnMgY29uZmlndXJlZCBpbiB0aGUgdmFyaWFibGVcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICogQHBhcmFtIGNvbnRleHQsIHNjb3BlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHZhcmlhYmxlIGV4aXN0c1xuICogQHBhcmFtIHtzdHJpbmd9IGJpbmRTb3VyY2UsICB0aGUgZmllbGQgaW4gdmFyaWFibGUgd2hlcmUgdGhlIGRhdGFiaW5kaW5ncyBhcmUgY29uZmlndXJlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9zdCB2YXJpYWJsZXMsIGl0IHdpbGwgYmUgJ2RhdGFCaW5kaW5nJywgaGVuY2UgZGVmYXVsdCBmYWxsYmFjayBpcyB0byAnZGF0YUJpbmRpbmcnXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzb21lIGl0IGNhbiBiZSAnZGF0YVNldCcgYW5kIGhlbmNlIHdpbGwgYmUgcGFzc2VkIGFzIHBhcmFtXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluZFRhcmdldCwgdGhlIG9iamVjdCBmaWVsZCBpbiB2YXJpYWJsZSB3aGVyZSB0aGUgY29tcHV0ZWQgYmluZGluZ3Mgd2lsbCBiZSBzZXRcbiAqL1xuLyoqXG4gKiBJbiBvbGRlciBzYXZlZCBSRVNUL1N3YWdnZXIgc2VydmljZSB2YXJpYWJsZXMsIGR1cGxpY2F0ZSBxdWVyeSBwYXJhbWV0ZXJzIG1heSBub3QgaGF2ZSBhXG4gKiBjb2xsZWN0aW9uRm9ybWF0LCBzbyB0aGV5IGFyZSB0cmVhdGVkIGFzIG11bHRpLXZhbHVlIHBhcmFtZXRlcnMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6XG4gKiBlYWNoIGR1cGxpY2F0ZSB0YXJnZXQgaXMgdGFnZ2VkIGNvbGxlY3Rpb25Gb3JtYXQgJ211bHRpJyBhbmQgZ2l2ZW4gYSBzdGFibGUgbXVsdGlJbmRleC5cbiAqIFNoYXJlZCBieSBib3RoIHByb2Nlc3NCaW5kaW5nIGltcGxlbWVudGF0aW9ucyAodGhpcyBmaWxlIGFuZCBWYXJpYWJsZXNTZXJ2aWNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5TXVsdGlJbmRleEZvckR1cGxpY2F0ZUJpbmRpbmdzID0gKGJpbmRNYXA6IGFueVtdKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0T2NjdXJyZW5jZXMgPSB7fTtcbiAgICBiaW5kTWFwLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS50YXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldE9jY3VycmVuY2VzW25vZGUudGFyZ2V0XSA9ICh0YXJnZXRPY2N1cnJlbmNlc1tub2RlLnRhcmdldF0gfHwgMCkgKyAxO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgbmV4dE11bHRpSW5kZXggPSB7fTtcbiAgICBiaW5kTWFwLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS50YXJnZXQgJiYgdGFyZ2V0T2NjdXJyZW5jZXNbbm9kZS50YXJnZXRdID4gMSkge1xuICAgICAgICAgICAgaWYgKCFub2RlLmNvbGxlY3Rpb25Gb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBub2RlLmNvbGxlY3Rpb25Gb3JtYXQgPSAnbXVsdGknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUubXVsdGlJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbmV4dE11bHRpSW5kZXhbbm9kZS50YXJnZXRdID0gbmV4dE11bHRpSW5kZXhbbm9kZS50YXJnZXRdIHx8IDA7XG4gICAgICAgICAgICAgICAgbm9kZS5tdWx0aUluZGV4ID0gbmV4dE11bHRpSW5kZXhbbm9kZS50YXJnZXRdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzQmluZGluZyA9ICh2YXJpYWJsZTogYW55LCBjb250ZXh0OiBhbnksIGJpbmRTb3VyY2U/OiBzdHJpbmcsIGJpbmRUYXJnZXQ/OiBzdHJpbmcpID0+IHtcbiAgICBiaW5kU291cmNlID0gYmluZFNvdXJjZSB8fCAnZGF0YUJpbmRpbmcnO1xuICAgIGJpbmRUYXJnZXQgPSBiaW5kVGFyZ2V0IHx8ICdkYXRhQmluZGluZyc7XG5cbiAgICBjb25zdCBiaW5kTWFwID0gdmFyaWFibGVbYmluZFNvdXJjZV07XG4gICAgdmFyaWFibGVbYmluZFNvdXJjZV0gPSB7fTtcbiAgICB2YXJpYWJsZVsnX2JpbmQnICsgYmluZFNvdXJjZV0gPSBiaW5kTWFwO1xuICAgIGlmICghYmluZE1hcCB8fCAhaXNBcnJheShiaW5kTWFwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLlNFUlZJQ0UpIHtcbiAgICAgICAgYXBwbHlNdWx0aUluZGV4Rm9yRHVwbGljYXRlQmluZGluZ3MoYmluZE1hcCk7XG4gICAgfVxuICAgIGJpbmRNYXAuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAvKiBmb3Igc3RhdGljIHZhcmlhYmxlIGNoYW5nZSB0aGUgYmluZGluZyB3aXRoIHRhcmdldCAnZGF0YUJpbmRpbmcnIHRvICdkYXRhU2V0JywgYXMgdGhlIHJlc3VsdHMgaGF2ZSB0byByZWZsZWN0IGRpcmVjdGx5IGluIHRoZSBkYXRhU2V0ICovXG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLlZhcmlhYmxlJyAmJiBub2RlLnRhcmdldCA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgbm9kZS50YXJnZXQgPSAnZGF0YVNldCc7XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0JpbmRPYmplY3Qobm9kZSwgY29udGV4dCwgYmluZFRhcmdldCwgdmFyaWFibGUpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBEb3dubG9hZHMgYSBmaWxlIGluIHRoZSBicm93c2VyLlxuICogVHdvIG1ldGhvZHMgdG8gZG8gc28sIG5hbWVseTpcbiAqIDEuIGRvd25sb2FkVGhyb3VnaEFuY2hvciwgY2FsbGVkIGlmXG4gKiAgICAgIC0gaWYgYSBoZWFkZXIgaXMgdG8gYmUgcGFzc2VkXG4gKiAgICAgIE9SXG4gKiAgICAgIC0gaWYgc2VjdXJpdHkgaXMgT04gYW5kIFhTUkYgdG9rZW4gaXMgdG8gYmUgc2VudCBhcyB3ZWxsXG4gKiBOT1RFOiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIHZlcnNpb24gMTAuMCBhbmQgYmVsb3dcbiAqXG4gKiAyLiBkb3dubG9hZFRocm91Z2hJZnJhbWVcbiAqICAgICAgLSB0aGlzIG1ldGhvZCB3b3JrcyBhY3Jvc3MgYnJvd3NlcnMgYW5kIHVzZXMgYW4gaWZyYW1lIHRvIGRvd25sYWQgdGhlIGZpbGUuXG4gKiBAcGFyYW0gcmVxdWVzdFBhcmFtcyByZXF1ZXN0IHBhcmFtcyBvYmplY3RcbiAqIEBwYXJhbSBmaWxlTmFtZSByZXByZXNlbnRzIHRoZSBmaWxlIG5hbWVcbiAqIEBwYXJhbSBleHBvcnRGb3JtYXQgZG93bmxvYWRlZCBmaWxlIGZvcm1hdFxuICogQHBhcmFtIHN1Y2Nlc3Mgc3VjY2VzcyBjYWxsYmFja1xuICogQHBhcmFtIGVycm9yIGVycm9yIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBjb25zdCBzaW11bGF0ZUZpbGVEb3dubG9hZCA9IChyZXF1ZXN0UGFyYW1zLCBmaWxlTmFtZSwgZXhwb3J0Rm9ybWF0LCBzdWNjZXNzLCBlcnJvciwgZGF0YUJpbmRpbmcpID0+IHtcbiAgICAvKnN1Y2Nlc3MgYW5kIGVycm9yIGNhbGxiYWNrcyBhcmUgZXhlY3V0ZWQgaW5jYXNlIG9mIGRvd25sb2FkVGhyb3VnaEFuY2hvclxuICAgICBEdWUgdG8gdGVjaG5pY2FsIGxpbWl0YXRpb24gY2Fubm90IGJlIGV4ZWN1dGVkIGluY2FzZSBvZiBpZnJhbWUqL1xuICAgIGlmICghaXNFbXB0eShyZXF1ZXN0UGFyYW1zLmhlYWRlcnMpIHx8IGlzWHNyZkVuYWJsZWQoKSkge1xuICAgICAgICBkb3dubG9hZFRocm91Z2hBbmNob3IocmVxdWVzdFBhcmFtcywgc3VjY2VzcywgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvd25sb2FkVGhyb3VnaElmcmFtZShyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBkYXRhQmluZGluZyxlcnJvcik7XG4gICAgfVxufTtcblxuLyoqXG4gKiBzZXRzIHRoZSB2YWx1ZSBhZ2FpbnN0IHBhc3NlZCBrZXkgb24gdGhlIFwiaW5wdXRGaWVsZHNcIiBvYmplY3QgaW4gdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gdGFyZ2V0T2JqOiB0aGUgb2JqZWN0IGluIHdoaWNoIHRoZSBrZXksIHZhbHVlIGlzIHRvIGJlIHNldFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKiBAcGFyYW0ga2V5OiBjYW4gYmU6XG4gKiAgLSBhIHN0cmluZyBlLmcuIFwidXNlcm5hbWVcIlxuICogIC0gYW4gb2JqZWN0LCBlLmcuIHtcInVzZXJuYW1lXCI6IFwiam9oblwiLCBcInNzblwiOiBcIjExMTExXCJ9XG4gKiBAcGFyYW0gdmFsXG4gKiAtIGlmIGtleSBpcyBzdHJpbmcsIHRoZSB2YWx1ZSBhZ2FpbnN0IGl0IChmb3IgdGhhdCBkYXRhIHR5cGUpXG4gKiAtIGlmIGtleSBpcyBvYmplY3QsIG5vdCByZXF1aXJlZFxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRJbnB1dCA9ICh0YXJnZXRPYmo6IGFueSwga2V5OiBhbnksIHZhbDogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICB0YXJnZXRPYmogPSB0YXJnZXRPYmogfHwge307XG4gICAgbGV0IGtleXMsXG4gICAgICAgIGxhc3RLZXksXG4gICAgICAgIHBhcmFtT2JqID0ge307XG5cbiAgICAvLyBjb250ZW50IHR5cGUgY2hlY2tcbiAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHZhbCA9IGdldEJsb2IodmFsLCBvcHRpb25zLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgdmFsID0gaXNOdW1iZXIodmFsKSA/IHZhbCA6IHBhcnNlSW50KHZhbCwgMTApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IGl0c2VsZlxuICAgICAgICBwYXJhbU9iaiA9IGtleTtcbiAgICB9IGVsc2UgaWYgKGtleS5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICAvLyBjaGVjayBmb3IgJy4nIGluIGtleSBlLmcuICdlbXBsb3llZS5kZXBhcnRtZW50J1xuICAgICAgICBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgIGxhc3RLZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICAvLyBGaW5kaW5nIHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGtleVxuICAgICAgICB0YXJnZXRPYmogPSBmaW5kVmFsdWVPZih0YXJnZXRPYmosIGtleXMuam9pbignLicpLCB0cnVlKTtcbiAgICAgICAga2V5ID0gbGFzdEtleTtcbiAgICAgICAgcGFyYW1PYmpba2V5XSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbU9ialtrZXldID0gdmFsO1xuICAgIH1cblxuICAgIGZvckVhY2gocGFyYW1PYmosIGZ1bmN0aW9uIChwYXJhbVZhbCwgcGFyYW1LZXkpIHtcbiAgICAgICAgdGFyZ2V0T2JqW3BhcmFtS2V5XSA9IHBhcmFtVmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXRPYmo7XG59O1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZiBIVE1MNSBGaWxlIEFQSSBpcyBhdmFpbGFibGUgZWxzZSBmYWxzZVxuICogQHJldHVybnMge3twcm90b3R5cGU6IEJsb2I7IG5ldyhibG9iUGFydHM/OiBhbnlbXSwgb3B0aW9ucz86IEJsb2JQcm9wZXJ0eUJhZyk6IEJsb2J9fVxuICovXG5leHBvcnQgY29uc3QgaXNGaWxlVXBsb2FkU3VwcG9ydGVkID0gKCkgPT4ge1xuICAgIHJldHVybiAod2luZG93LkZpbGUgJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGVMaXN0ICYmIHdpbmRvdy5CbG9iKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YXJPcmRlclxuICogQHBhcmFtIG9wdGlvbnNPcmRlclxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV2YWx1YXRlZE9yZGVyQnkgPSAodmFyT3JkZXIsIG9wdGlvbnNPcmRlcikgPT4ge1xuICAgIGxldCBvcHRpb25GaWVsZHMsXG4gICAgICAgIHZhck9yZGVyQnk7XG4gICAgLy8gSWYgb3B0aW9ucyBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHZhcmlhYmxlIG9yZGVyXG4gICAgaWYgKCFvcHRpb25zT3JkZXIgfHwgaXNFbXB0eShvcHRpb25zT3JkZXIpKSB7XG4gICAgICAgIHJldHVybiB2YXJPcmRlcjtcbiAgICB9XG4gICAgLy8gSWYgdmFyaWFibGUgb3JkZXIgYnkgaXMgbm90IGRlZmluZWQsIHJldHVybiBvcHRpb25zIG9yZGVyXG4gICAgaWYgKCF2YXJPcmRlcikge1xuICAgICAgICByZXR1cm4gb3B0aW9uc09yZGVyO1xuICAgIH1cbiAgICAvLyBJZiBib3RoIGFyZSBwcmVzZW50LCBjb21iaW5lIHRoZSBvcHRpb25zIG9yZGVyIGFuZCB2YXJpYWJsZSBvcmRlciwgd2l0aCBvcHRpb25zIG9yZGVyIGFzIHByZWNlZGVuY2VcbiAgICB2YXJPcmRlciA9IHNwbGl0KHZhck9yZGVyLCAnLCcpO1xuICAgIG9wdGlvbnNPcmRlciA9IHNwbGl0KG9wdGlvbnNPcmRlciwgJywnKTtcbiAgICBvcHRpb25GaWVsZHMgPSBtYXAob3B0aW9uc09yZGVyLCBmdW5jdGlvbiAob3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIHNwbGl0KHRyaW0ob3JkZXIpLCAnICcpWzBdO1xuICAgIH0pO1xuICAgIC8vIElmIGEgZmllbGQgaXMgcHJlc2VudCBpbiBib3RoIG9wdGlvbnMgYW5kIHZhcmlhYmxlLCByZW1vdmUgdGhlIHZhcmlhYmxlIG9yZGVyYnlcbiAgICByZW1vdmUodmFyT3JkZXIsIGZ1bmN0aW9uIChvcmRlckJ5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGluY2x1ZGVzKG9wdGlvbkZpZWxkcywgc3BsaXQodHJpbShvcmRlckJ5KSwgJyAnKVswXSk7XG4gICAgfSk7XG4gICAgdmFyT3JkZXJCeSA9IHZhck9yZGVyLmxlbmd0aCA/ICcsJyArIGpvaW4odmFyT3JkZXIsICcsJykgOiAnJztcbiAgICByZXR1cm4gam9pbihvcHRpb25zT3JkZXIsICcsJykgKyB2YXJPcmRlckJ5O1xufTtcblxuLyoqXG4gKiBmb3JtYXR0aW5nIHRoZSBleHByZXNzaW9uIGFzIHJlcXVpcmVkIGJ5IGJhY2tlbmQgd2hpY2ggd2FzIGVuY2xvc2VkIGJ5ICR7PGV4cHJlc3Npb24+fS5cbiAqIEBwYXJhbSBmaWVsZERlZnNcbiAqIHJldHVybnMgZmllbGREZWZzXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRFeHBvcnRFeHByZXNzaW9uID0gZmllbGREZWZzID0+IHtcbiAgICBmb3JFYWNoKGZpZWxkRGVmcywgZnVuY3Rpb24gKGZpZWxkRGVmKSB7XG4gICAgICAgIGlmIChmaWVsZERlZi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICBmaWVsZERlZi5leHByZXNzaW9uID0gJyR7JyArIGZpZWxkRGVmLmV4cHJlc3Npb24gKyAnfSc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmllbGREZWZzO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlVmFyaWFibGVDYWxsID0gX2ludm9rZTtcblxuY29uc3QgZ2V0RGF0ZVRpbWVGb3JtYXRGb3JUeXBlID0gKHR5cGUpID0+IHtcbiAgICByZXR1cm4gREVGQVVMVF9GT1JNQVRTW3RvVXBwZXIodHlwZSldO1xufTtcblxuLy8gRm9ybWF0IHZhbHVlIGZvciBkYXRldGltZSB0eXBlc1xuY29uc3QgX2Zvcm1hdERhdGUgPSAoZGF0ZVZhbHVlLCB0eXBlKSA9PiB7XG4gICAgbGV0IGVwb2NoO1xuICAgIGlmIChpc0RhdGUoZGF0ZVZhbHVlKSkge1xuICAgICAgICBlcG9jaCA9IGRhdGVWYWx1ZS5nZXRUaW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFpc05hTihkYXRlVmFsdWUpKSB7XG4gICAgICAgICAgICBkYXRlVmFsdWUgPSBwYXJzZUludChkYXRlVmFsdWUsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBlcG9jaCA9IGRhdGVWYWx1ZSAmJiBtb21lbnQoZGF0ZVZhbHVlKS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIGlmIChpc05hTihlcG9jaCkgJiYgdHlwZSAhPT0gRGF0YVR5cGUuVElNRSkge1xuICAgICAgICByZXR1cm4gZXBvY2g7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBEYXRhVHlwZS5USU1FU1RBTVApIHtcbiAgICAgICAgcmV0dXJuIGVwb2NoO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gRGF0YVR5cGUuVElNRSAmJiAhZXBvY2gpIHtcbiAgICAgICAgZXBvY2ggPSBtb21lbnQobmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSArICcgJyArIGRhdGVWYWx1ZSkudmFsdWVPZigpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZVZhbHVlICYmIGFwcE1hbmFnZXIuZ2V0UGlwZSgnZGF0ZScpLnRyYW5zZm9ybShlcG9jaCwgZ2V0RGF0ZVRpbWVGb3JtYXRGb3JUeXBlKHR5cGUpKTtcbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGNvbnZlcnQgdmFsdWVzIG9mIGRhdGUgdGltZSB0eXBlcyBpbnRvIGRlZmF1bHQgZm9ybWF0c1xuZXhwb3J0IGNvbnN0IGZvcm1hdERhdGUgPSAodmFsdWUsIHR5cGUpID0+IHtcbiAgICBpZiAoaW5jbHVkZXModHlwZSwgJy4nKSkge1xuICAgICAgICB0eXBlID0gdG9Mb3dlcihleHRyYWN0VHlwZSh0eXBlKSk7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbWFwKHZhbHVlLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Zvcm1hdERhdGUodmFsLCB0eXBlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfZm9ybWF0RGF0ZSh2YWx1ZSwgdHlwZSk7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIHZhcmlhYmxlIGRhdGEgd2hpY2ggaXMgZW5jb2RlZCBmcm9tIGJhY2tlbmQgYmVmb3JlIHNob3dpbmcgaW4gdGhlIHdpZGdldHMuXG4gKiBJdCB0YWtlcyB2YXJpYWJsZSByZXNwb25zZSBjb250ZW50IGFzIGlucHV0IGFuZCBpdGVyYXRlcyByZWN1cnNpdmVseSxcbiAqIGlmIHRoZSB2YWx1ZSBpcyBzdHJpbmcgdHlwZSB0aGVuIGl0IHdpbGwgZGVjb2RlIHRoZSBkYXRhLlxuICogQHBhcmFtIHJlc3BvbnNlQ29udGVudCAoQXJyYXkgb2Ygb2JqZWN0cylcbiAqL1xuZXhwb3J0IGNvbnN0IGRlY29kZURhdGEgPSAocmVzcG9uc2VDb250ZW50KSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZUNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGVudDtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkocmVzcG9uc2VDb250ZW50KSkge1xuICAgICAgICBmb3JFYWNoKHJlc3BvbnNlQ29udGVudCwgZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gaHRtbERlY29kZShkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBmb3JFYWNoKGRhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IGh0bWxEZWNvZGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChyZXNwb25zZUNvbnRlbnQpKSB7XG4gICAgICAgIGZvckVhY2gocmVzcG9uc2VDb250ZW50LCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGVudFtrZXldID0gaHRtbERlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGRlY29kZURhdGEodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHJlc3BvbnNlQ29udGVudCkpIHtcbiAgICAgICAgcmVzcG9uc2VDb250ZW50ID0gaHRtbERlY29kZShyZXNwb25zZUNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZW50O1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGh0bWxEZWNvZGUoaW5wdXQpIHtcbiAgICByZXR1cm4gaGUudW5lc2NhcGUoaW5wdXQpO1xufVxuIl19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { $rootScope as $rootScope$1, BaseAction, ApiAwareVariable, VARIABLE_CONSTANTS as VARIABLE_CONSTANTS$1, TimerAction, CrudVariable, LiveVariable, ServiceVariable, ModelVariable, wmSetDependency, getTarget, getTargetNodeKey as getTargetNodeKey$1, setValueToNode as setValueToNode$1, internalBoundNodeMap as internalBoundNodeMap$1 } from '@wavemaker/variables';
|
|
2
2
|
import * as i1 from '@wm/core';
|
|
3
3
|
import { $parseEvent, triggerFn, findValueOf, stringStartsWith, getClonedObject, $watch, getBlob, DEFAULT_FORMATS, DataType, extractType, getWmProjectProperties, getValidJSON, isDateTimeType, isDefined, replace as replace$1, xmlToJson, isInsecureContentRequest, isObject as isObject$1, DataSource, _WM_APP_PROJECT, $invokeWatchers, processFilterExpBindNode } from '@wm/core';
|
|
4
|
-
import { noop, debounce, isUndefined, isFunction, forEach, isString, split, join, slice, get, pickBy, isEmpty, includes, toUpper, last, replace, keys, filter, set, isObject,
|
|
4
|
+
import { noop, debounce, isUndefined, isFunction, forEach, isString, split, join, slice, get, pickBy, isEmpty, includes, toUpper, last, replace, isArray, keys, filter, set, isObject, isNumber, map, trim, remove, isDate, toLower, clone, isNil, capitalize, extend, isBoolean, each, startsWith, find, result, concat, isNull, reject } from 'lodash-es';
|
|
5
5
|
import * as momentLib from 'moment';
|
|
6
6
|
import { $WebSocket } from 'angular2-websocket/angular2-websocket';
|
|
7
7
|
import { jmespath } from '@metrichor/jmespath';
|
|
@@ -811,7 +811,28 @@ const setValueToNode = (target, obj, root, variable, value, noUpdate) => {
|
|
|
811
811
|
value = !isUndefined(value) ? value : obj.value;
|
|
812
812
|
/* sanity check, user can bind parent nodes to non-object values, so child node bindings may fail */
|
|
813
813
|
if (targetObj) {
|
|
814
|
-
|
|
814
|
+
// Multi query params: one slot per binding; rebinds replace that slot (not append).
|
|
815
|
+
// Exception: if the bind expression itself resolved to the complete array
|
|
816
|
+
// (e.g. `bind:['fire', 'water']`), assign it directly instead of treating it
|
|
817
|
+
// as a single slot's value — same as the non-multi assignment below.
|
|
818
|
+
if (obj.collectionFormat === 'multi' && !isArray(value)) {
|
|
819
|
+
let values = targetObj[targetNodeKey];
|
|
820
|
+
if (!isArray(values)) {
|
|
821
|
+
values = targetObj[targetNodeKey] = isUndefined(values) ? [] : [values];
|
|
822
|
+
}
|
|
823
|
+
let slot = obj.multiIndex !== undefined ? obj.multiIndex : obj.__multiSlotIndex;
|
|
824
|
+
if (slot === undefined) {
|
|
825
|
+
slot = obj.__multiSlotIndex = values.length;
|
|
826
|
+
values.push(value);
|
|
827
|
+
}
|
|
828
|
+
else {
|
|
829
|
+
obj.__multiSlotIndex = slot;
|
|
830
|
+
values[slot] = value;
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
else {
|
|
834
|
+
targetObj[targetNodeKey] = value;
|
|
835
|
+
}
|
|
815
836
|
}
|
|
816
837
|
processVariablePostBindUpdate(targetNodeKey, value, obj.type, variable, noUpdate);
|
|
817
838
|
};
|
|
@@ -920,6 +941,32 @@ const processBindObject = (obj, scope, root, variable) => {
|
|
|
920
941
|
* for some it can be 'dataSet' and hence will be passed as param
|
|
921
942
|
* @param {string} bindTarget, the object field in variable where the computed bindings will be set
|
|
922
943
|
*/
|
|
944
|
+
/**
|
|
945
|
+
* In older saved REST/Swagger service variables, duplicate query parameters may not have a
|
|
946
|
+
* collectionFormat, so they are treated as multi-value parameters for backward compatibility:
|
|
947
|
+
* each duplicate target is tagged collectionFormat 'multi' and given a stable multiIndex.
|
|
948
|
+
* Shared by both processBinding implementations (this file and VariablesService).
|
|
949
|
+
*/
|
|
950
|
+
const applyMultiIndexForDuplicateBindings = (bindMap) => {
|
|
951
|
+
const targetOccurrences = {};
|
|
952
|
+
bindMap.forEach(function (node) {
|
|
953
|
+
if (node && node.target) {
|
|
954
|
+
targetOccurrences[node.target] = (targetOccurrences[node.target] || 0) + 1;
|
|
955
|
+
}
|
|
956
|
+
});
|
|
957
|
+
const nextMultiIndex = {};
|
|
958
|
+
bindMap.forEach(function (node) {
|
|
959
|
+
if (node && node.target && targetOccurrences[node.target] > 1) {
|
|
960
|
+
if (!node.collectionFormat) {
|
|
961
|
+
node.collectionFormat = 'multi';
|
|
962
|
+
}
|
|
963
|
+
if (node.multiIndex === undefined) {
|
|
964
|
+
nextMultiIndex[node.target] = nextMultiIndex[node.target] || 0;
|
|
965
|
+
node.multiIndex = nextMultiIndex[node.target]++;
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
});
|
|
969
|
+
};
|
|
923
970
|
const processBinding = (variable, context, bindSource, bindTarget) => {
|
|
924
971
|
bindSource = bindSource || 'dataBinding';
|
|
925
972
|
bindTarget = bindTarget || 'dataBinding';
|
|
@@ -929,6 +976,9 @@ const processBinding = (variable, context, bindSource, bindTarget) => {
|
|
|
929
976
|
if (!bindMap || !isArray(bindMap)) {
|
|
930
977
|
return;
|
|
931
978
|
}
|
|
979
|
+
if (variable.category === VARIABLE_CONSTANTS.CATEGORY.SERVICE) {
|
|
980
|
+
applyMultiIndexForDuplicateBindings(bindMap);
|
|
981
|
+
}
|
|
932
982
|
bindMap.forEach(function (node) {
|
|
933
983
|
/* for static variable change the binding with target 'dataBinding' to 'dataSet', as the results have to reflect directly in the dataSet */
|
|
934
984
|
if (variable.category === 'wm.Variable' && node.target === 'dataBinding') {
|
|
@@ -2110,6 +2160,24 @@ class PaginationUtils {
|
|
|
2110
2160
|
const isBodyTypeQueryOrProcedure = (variable) => {
|
|
2111
2161
|
return (includes(['QueryExecution', 'ProcedureExecution'], variable.controller)) && (includes(['put', 'post'], variable.operationType));
|
|
2112
2162
|
};
|
|
2163
|
+
const appendQueryParam = (queryParams, paramName, paramValue, preEncoded = false) => {
|
|
2164
|
+
const encodedValue = preEncoded ? paramValue : encodeURIComponent(paramValue);
|
|
2165
|
+
const pair = `${paramName}=${encodedValue}`;
|
|
2166
|
+
return queryParams ? `${queryParams}&${pair}` : `?${pair}`;
|
|
2167
|
+
};
|
|
2168
|
+
const getQueryParamValues = (param, paramValue) => {
|
|
2169
|
+
if (isArray(paramValue)) {
|
|
2170
|
+
// 'multi' (duplicate query-param bindings) repeats the param, e.g. tag=a&tag=b.
|
|
2171
|
+
if (param.collectionFormat === 'multi') {
|
|
2172
|
+
return map(paramValue, (value) => ({ value, preEncoded: false }));
|
|
2173
|
+
}
|
|
2174
|
+
// Otherwise, join into a single comma-separated value, e.g. tag=a,b. Encode each
|
|
2175
|
+
// element individually so the joining commas stay literal (unambiguously the
|
|
2176
|
+
// separator) while a comma inside an element's own value stays escaped as %2C.
|
|
2177
|
+
return [{ value: map(paramValue, (value) => encodeURIComponent(value)).join(','), preEncoded: true }];
|
|
2178
|
+
}
|
|
2179
|
+
return [{ value: paramValue, preEncoded: false }];
|
|
2180
|
+
};
|
|
2113
2181
|
/**
|
|
2114
2182
|
* returns true if the variable is a Query service variable
|
|
2115
2183
|
* @param {string} controller
|
|
@@ -2327,12 +2395,12 @@ class ServiceVariableUtils {
|
|
|
2327
2395
|
if (isNull(paramValue) && isQueryServiceVar(variable.controller, variable.serviceType)) {
|
|
2328
2396
|
break;
|
|
2329
2397
|
}
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
queryParams
|
|
2335
|
-
}
|
|
2398
|
+
getQueryParamValues(param, paramValue).forEach(({ value: queryValue, preEncoded }) => {
|
|
2399
|
+
if (isNull(queryValue) && isQueryServiceVar(variable.controller, variable.serviceType)) {
|
|
2400
|
+
return;
|
|
2401
|
+
}
|
|
2402
|
+
queryParams = appendQueryParam(queryParams, param.name, queryValue, preEncoded);
|
|
2403
|
+
});
|
|
2336
2404
|
break;
|
|
2337
2405
|
case 'PATH':
|
|
2338
2406
|
/* replacing the path param based on the regular expression in the relative path */
|
|
@@ -3139,6 +3207,9 @@ class VariablesService {
|
|
|
3139
3207
|
if (!bindMap || !isArray(bindMap)) {
|
|
3140
3208
|
return;
|
|
3141
3209
|
}
|
|
3210
|
+
if (variable.category === VARIABLE_CONSTANTS.CATEGORY.SERVICE) {
|
|
3211
|
+
applyMultiIndexForDuplicateBindings(bindMap);
|
|
3212
|
+
}
|
|
3142
3213
|
bindMap.forEach((node) => {
|
|
3143
3214
|
/* for static variable change the binding with target 'dataBinding' to 'dataSet', as the results have to reflect directly in the dataSet */
|
|
3144
3215
|
if (variable.category === 'wm.Variable' && node.target === 'dataBinding') {
|