@esfaenza/extensions 15.2.17 → 15.2.18
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/esm2020/lib/models/ExportConsts.mjs +3 -1
- package/esm2020/lib/services/extensions.exports.service.mjs +9 -4
- package/fesm2015/esfaenza-extensions.mjs +9 -2
- package/fesm2015/esfaenza-extensions.mjs.map +1 -1
- package/fesm2020/esfaenza-extensions.mjs +9 -2
- package/fesm2020/esfaenza-extensions.mjs.map +1 -1
- package/lib/models/ExportConsts.d.ts +2 -0
- package/package.json +1 -1
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
* utilizzato dal servizio di esportazione per prendere il valore delle proprietà di un oggetto
|
|
4
4
|
*/
|
|
5
5
|
export const csvValueNavigator = "_csvnav";
|
|
6
|
+
/** Suffisso con le informazioni del tipo per le esportazioni di oggetti */
|
|
7
|
+
export const csvValueType = "_csvtype";
|
|
6
8
|
/** Suffisso della proprietà da generare in cui salvare l'ordine di esportazione */
|
|
7
9
|
export const csvOrdPrefix = "_csvord";
|
|
8
10
|
/** Suffisso della proprietà da generare in cui salvare la visibilità di questa proprietà */
|
|
@@ -27,4 +29,4 @@ export const csvFormatPrefix = "_csvfmt";
|
|
|
27
29
|
export const exportList = "__export_list__";
|
|
28
30
|
/** Nome della proprietà che contiene la classe di localizzazione da utilizzare per una data esportazione */
|
|
29
31
|
export const locProperty = "__loc__";
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwb3J0Q29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL21vZGVscy9FeHBvcnRDb25zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQVcsU0FBUyxDQUFDO0FBQ25ELDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsVUFBVSxDQUFDO0FBQy9DLG1GQUFtRjtBQUNuRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsU0FBUyxDQUFDO0FBQzlDLDRGQUE0RjtBQUM1RixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsU0FBUyxDQUFDO0FBQzlDLGdIQUFnSDtBQUNoSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsU0FBUyxDQUFDO0FBQzlDLDJHQUEyRztBQUMzRyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQVcsU0FBUyxDQUFDO0FBQzVDLGdIQUFnSDtBQUNoSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBVyxhQUFhLENBQUM7QUFDdEQsZ0xBQWdMO0FBQ2hMLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFXLGFBQWEsQ0FBQztBQUN0RCxrTEFBa0w7QUFDbEwsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQVcsbUJBQW1CLENBQUM7QUFDNUQscUhBQXFIO0FBQ3JILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFXLGlCQUFpQixDQUFDO0FBQ2hFLHlMQUF5TDtBQUN6TCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBVyxpQkFBaUIsQ0FBQztBQUNoRSwyR0FBMkc7QUFDM0csTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFXLFNBQVMsQ0FBQztBQUNqRCx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFXLGlCQUFpQixDQUFDO0FBQ3BELDRHQUE0RztBQUM1RyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQVcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgbmF2aWdhdG9yZSBcclxuICogdXRpbGl6emF0byBkYWwgc2Vydml6aW8gZGkgZXNwb3J0YXppb25lIHBlciBwcmVuZGVyZSBpbCB2YWxvcmUgZGVsbGUgcHJvcHJpZXTDoCBkaSB1biBvZ2dldHRvXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3N2VmFsdWVOYXZpZ2F0b3I6IHN0cmluZyA9IFwiX2Nzdm5hdlwiO1xyXG4vKiogU3VmZmlzc28gY29uIGxlIGluZm9ybWF6aW9uaSBkZWwgdGlwbyBwZXIgbGUgZXNwb3J0YXppb25pIGRpIG9nZ2V0dGkgKi9cclxuZXhwb3J0IGNvbnN0IGNzdlZhbHVlVHlwZTogc3RyaW5nID0gXCJfY3N2dHlwZVwiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBsJ29yZGluZSBkaSBlc3BvcnRhemlvbmUgKi9cclxuZXhwb3J0IGNvbnN0IGNzdk9yZFByZWZpeDogc3RyaW5nID0gXCJfY3N2b3JkXCI7XHJcbi8qKiBTdWZmaXNzbyBkZWxsYSBwcm9wcmlldMOgIGRhIGdlbmVyYXJlIGluIGN1aSBzYWx2YXJlIGxhIHZpc2liaWxpdMOgIGRpIHF1ZXN0YSBwcm9wcmlldMOgICovXHJcbmV4cG9ydCBjb25zdCBjc3ZWaXNQcmVmaXg6IHN0cmluZyA9IFwiX2NzdnZpc1wiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBpbCBub21lIGRlbGxhIGNvbG9ubmEgaW4gY3VpIHNhbHZhcmUgcXVlc3RhIHByb3ByaWV0w6AgKi9cclxuZXhwb3J0IGNvbnN0IGNzdkhkclByZWZpeDogc3RyaW5nID0gXCJfY3N2aGRyXCI7XHJcbi8qKiBTdWZmaXNzbyBkZWxsYSBwcm9wcmlldMOgIGRhIGdlbmVyYXJlIGluIGN1aSBzYWx2YXJlIGlsIGNvZGljZSBkZWwgdGggYSBjdWkgc2kgcmlmZXJpc2NlIHF1ZXN0byBjYW1wbyAqL1xyXG5leHBvcnQgY29uc3QgY3N2UHJvcEtleTogc3RyaW5nID0gXCJfY3N2a2V5XCI7XHJcbi8qKiBTdWZmaXNzbyBkZWxsYSBwcm9wcmlldMOgIGRhIGdlbmVyYXJlIGluIGN1aSBzYWx2YXJlIGlsIHZhbG9yZSBkYSBwcmVuZGVyZSBwZXIgdW5hIHByb3ByaWV0w6AgZGkgdGlwbyBMaXN0YSAqL1xyXG5leHBvcnQgY29uc3QgbGlzdENzdlZhbFByZWZpeDogc3RyaW5nID0gXCJfbGlzdGNzdnZhbFwiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBsJ0hlYWRlciBkZWxsYSBwcm9wcmlldMOgIGRpIHRpcG8gTGlzdGEgcmVsYXRpdm8gYWwgdmFsb3JlIGVzcG9ydGF0byBuZWxsYSBwcm9wcmlldMOgIGNvbiBzdWZmaXNzbyAqKmxpc3RDc3ZWYWxQcmVmaXgqKiAqL1xyXG5leHBvcnQgY29uc3QgbGlzdENzdkhkclByZWZpeDogc3RyaW5nID0gXCJfbGlzdGNzdmhkclwiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBpbCBmb3JtYXRvIGRlbGxhIHByb3ByaWV0w6AgZGkgdGlwbyBMaXN0YSByZWxhdGl2byBhbCB2YWxvcmUgZXNwb3J0YXRvIG5lbGxhIHByb3ByaWV0w6AgY29uIHN1ZmZpc3NvICoqbGlzdENzdlZhbFByZWZpeCoqICovXHJcbmV4cG9ydCBjb25zdCBsaXN0Q3N2VmFsRm9ybWF0OiBzdHJpbmcgPSBcIl9saXN0Y3N2dmFsZm9ybWF0XCI7XHJcbi8qKiBTdWZmaXNzbyBkZWxsYSBwcm9wcmlldMOgIGRhIGdlbmVyYXJlIGluIGN1aSBzYWx2YXJlIGlsIHZhbG9yZSBkYSBwcmVuZGVyZSBwZXIgdW5hIHByb3ByaWV0w6AgZGkgdGlwbyBEaXppb25hcmlvICovXHJcbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4OiBzdHJpbmcgPSBcIl9mbGF0bGlzdGNzdnZhbFwiO1xyXG4vKiogU3VmZmlzc28gZGVsbGEgcHJvcHJpZXTDoCBkYSBnZW5lcmFyZSBpbiBjdWkgc2FsdmFyZSBsJ0hlYWRlciBkZWxsYSBwcm9wcmlldMOgIGRpIHVuIERpemlvbmFyaW8gcmVsYXRpdm8gYWwgdmFsb3JlIGVzcG9ydGF0byBuZWxsYSBwcm9wcmlldMOgIGNvbiBzdWZmaXNzbyAqKmRpY3Rpb25hcnlDc3ZWYWxQcmVmaXgqKiAqL1xyXG5leHBvcnQgY29uc3QgZGljdGlvbmFyeUNzdkhkclByZWZpeDogc3RyaW5nID0gXCJfZmxhdGxpc3Rjc3ZoZHJcIjtcclxuLyoqIFN1ZmZpc3NvIGRlbGxhIHByb3ByaWV0w6AgZGEgZ2VuZXJhcmUgaW4gY3VpIHNhbHZhcmUgaWwgZm9ybWF0byBkZWxsYSBwcm9wcmlldMOgIGNoZSBzaSBzdGEgZXNwb3J0YW5kbyAqL1xyXG5leHBvcnQgY29uc3QgY3N2Rm9ybWF0UHJlZml4OiBzdHJpbmcgPSBcIl9jc3ZmbXRcIjtcclxuLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgdHV0dGkgaSBub21pIGRpIHR1dHRlIGxlIHByb3ByaWV0w6AgZGEgZXNwb3J0YXJlICovXHJcbmV4cG9ydCBjb25zdCBleHBvcnRMaXN0OiBzdHJpbmcgPSBcIl9fZXhwb3J0X2xpc3RfX1wiO1xyXG4vKiogTm9tZSBkZWxsYSBwcm9wcmlldMOgIGNoZSBjb250aWVuZSBsYSBjbGFzc2UgZGkgbG9jYWxpenphemlvbmUgZGEgdXRpbGl6emFyZSBwZXIgdW5hIGRhdGEgZXNwb3J0YXppb25lICovXHJcbmV4cG9ydCBjb25zdCBsb2NQcm9wZXJ0eTogc3RyaW5nID0gXCJfX2xvY19fXCI7Il19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Angular
|
|
2
2
|
import { Injectable } from "@angular/core";
|
|
3
3
|
// Configurazioni
|
|
4
|
-
import { exportList, csvFormatPrefix, csvHdrPrefix, csvOrdPrefix, csvValueNavigator, csvVisPrefix, dictionaryCsvHdrPrefix, dictionaryCsvValPrefix, listCsvHdrPrefix, listCsvValFormat, listCsvValPrefix, csvPropKey, locProperty } from "../models/ExportConsts";
|
|
4
|
+
import { exportList, csvFormatPrefix, csvHdrPrefix, csvOrdPrefix, csvValueNavigator, csvVisPrefix, dictionaryCsvHdrPrefix, dictionaryCsvValPrefix, listCsvHdrPrefix, listCsvValFormat, listCsvValPrefix, csvPropKey, locProperty, csvValueType } from "../models/ExportConsts";
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "./extensions.dates.service";
|
|
7
7
|
import * as i2 from "./extensions.utilities.service";
|
|
@@ -108,6 +108,7 @@ export const ExportAs = (order, type, prefix) => (target, propertyKey) => {
|
|
|
108
108
|
Object.defineProperty(target, propertyKey + prop + csvValueNavigator, { value: propertyKey + "." + prop, writable: false });
|
|
109
109
|
Object.defineProperty(target, propertyKey + prop + csvVisPrefix, { value: toEmit, writable: false });
|
|
110
110
|
Object.defineProperty(target, propertyKey + prop + csvHdrPrefix, { value: (prefix ? prefix + ' ' : '') + lbl, writable: false });
|
|
111
|
+
Object.defineProperty(target, propertyKey + prop + csvValueType, { value: propertyKey + "." + prop, writable: false });
|
|
111
112
|
if (target[exportList])
|
|
112
113
|
target[exportList].push(propertyKey + prop + csvVisPrefix);
|
|
113
114
|
else
|
|
@@ -379,10 +380,14 @@ export class ExportService {
|
|
|
379
380
|
parseObject(obj, prop, headers, loc) {
|
|
380
381
|
//se questa proprietà ha un navigator significa che deriva da un oggetto interno, recupero il valore in questa fase dato che prima non ce l'ho
|
|
381
382
|
let valuenavigator = obj[prop + csvValueNavigator];
|
|
382
|
-
// Localizzazione presa dalla classe base se c'è, altrimenti dalla classe interna
|
|
383
|
-
loc = loc || this.lc.generateFromType(obj[locProperty]);
|
|
384
383
|
//Es. di valuenavigator obj.subobj.subsubobj.property
|
|
385
384
|
let jmps = valuenavigator.split(".");
|
|
385
|
+
// Localizzazione presa dalla classe base se c'è, altrimenti dalla classe interna (cioè dal primo saltino)
|
|
386
|
+
if (!loc) {
|
|
387
|
+
let type = obj[prop + csvValueType];
|
|
388
|
+
let proto = new type();
|
|
389
|
+
loc = proto[locProperty];
|
|
390
|
+
}
|
|
386
391
|
//Mi clono l'oggetto originale per non uccidergli i riferimenti
|
|
387
392
|
let clone = JSON.parse(JSON.stringify(obj));
|
|
388
393
|
//Salto ricorsivamente su me stesso per arrivare alla proprietà
|
|
@@ -619,4 +624,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
619
624
|
type: Injectable,
|
|
620
625
|
args: [{ providedIn: "root" }]
|
|
621
626
|
}], ctorParameters: function () { return [{ type: i1.DateService }, { type: i2.UtilityService }, { type: i3.LocalizationService }]; } });
|
|
622
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLakQsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFRalE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQThCO0lBQy9ELE9BQU8sU0FBUyxZQUFZLENBQXdDLFdBQWM7UUFDaEYsT0FBTyxLQUFNLFNBQVEsV0FBVztZQUF6Qjs7Z0JBQTRCLFlBQU8sR0FBRyxHQUFHLENBQUM7WUFBQyxDQUFDO1NBQUEsQ0FBQztJQUN0RCxDQUFDLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUFjLEVBQUUsU0FBaUIsSUFBSSxFQUFFLFVBQWtCLElBQUksRUFBRSxFQUFFLENBQ3JHLENBQUMsTUFBYyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtJQUN0QyxJQUFJLE1BQU07UUFDUixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMs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LENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDckksQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsS0FBWSxFQUFFLE1BQXNCLEVBQUUsUUFBZ0IsRUFBRSxJQUFlLEVBQUUsYUFBd0IsRUFBRSxjQUE2QjtRQUM1SSxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9CLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsS0FBSSxJQUFJLFFBQVEsSUFBSSxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkQsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDM0ksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDcEcsQ0FBQzs7MEdBcGZVLGFBQWE7OEdBQWIsYUFBYSxjQURBLE1BQU07MkZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIEVzZmFlbnphXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcblxyXG5pbXBvcnQgeyBleHBvcnRMaXN0LCBjc3ZGb3JtYXRQcmVmaXgsIGNzdkhkclByZWZpeCwgY3N2T3JkUHJlZml4LCBjc3ZWYWx1ZU5hdmlnYXRvciwgY3N2VmlzUHJlZml4LCBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4LCBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4LCBsaXN0Q3N2SGRyUHJlZml4LCBsaXN0Q3N2VmFsRm9ybWF0LCBsaXN0Q3N2VmFsUHJlZml4LCBjc3ZQcm9wS2V5LCBsb2NQcm9wZXJ0eSB9IGZyb20gXCIuLi9tb2RlbHMvRXhwb3J0Q29uc3RzXCI7XHJcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zLmRhdGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gXCIuL2V4dGVuc2lvbnMudXRpbGl0aWVzLnNlcnZpY2VcIjtcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQ3N2SGVhZGVycyB9IGZyb20gXCIuLi9tb2RlbHMvQ3N2SGVhZGVyc1wiO1xyXG5pbXBvcnQgeyBHZW5lcmljSXRlbSB9IGZyb20gXCIuLi9tb2RlbHMvR2VuZXJpY0l0ZW1cIjtcclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGNoZSBmb3JuaXNjZSBsYSBjbGFzc2UgZGkgbG9jYWxpenphemlvbmUgcGVyIHR1dHRlIGxlIHByb3ByaWV0w6AgZXNwb3J0YXRlIGNvbiBARXhwb3J0IGUgcXVhbHNpYXNpIGFsdHJvIHRhZyBjaGUgcmljaGllZGEgbG9jYWxpenphemlvbmkuXHJcbiAqIFxyXG4gKiBTb3N0YW56aWxhbWVudGUgYWdnaXVuZ2UgbGEgcHJvcHJpZXTDoCAqKl9fbG9jX18qKiBhbGwnb2dnZXR0byBjcmVhdG8gZGFsbGEgY2xhc3NlIGNvcnJlbnRlIGFzc2VnbmFuZG9nbGkgY29tZSB2YWxvcmUgaWwgdGlwbyBkZWwgTG9jYWxpemF0aW9uU2VydmljZSBkYSB1c2FyZSBwZXIgbGEgdHJhZHV6aW9uZVxyXG4gKiBcclxuICogQHBhcmFtIHtUeXBlPExvY2FsaXphdGlvblNlcnZpY2U+fSBsb2MgVGlwbyBlcmVkaXRhdG8gZGFsIExvY2FsaXphdGlvblNlcnZpY2UgY2hlIHB1w7IgZXNzZXJlIGNyZWF0byBhIHJ1bnRpbWUgc290dG8gY29udGVzdG8gZGVsbGEgREkgZGkgQW5ndWxhclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydExvY2FsaXphdGlvbihsb2M6IFR5cGU8TG9jYWxpemF0aW9uU2VydmljZT4pIHtcclxuICByZXR1cm4gZnVuY3Rpb24gaW50ZWdyYXRlTG9jPFQgZXh0ZW5kcyB7IG5ldyguLi5hcmdzOiBhbnlbXSk6IHt9IH0+KGNvbnN0cnVjdG9yOiBUKSB7XHJcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBjb25zdHJ1Y3RvciB7IF9fbG9jX18gPSBsb2M7IH07XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuYSBwcm9wcmlldMOgIHNpbmdvbGEuIFxyXG4gKiBWZXJyYW5ubyBnZW5lcmF0ZSAzIHByb3ByaWV0w6AgY2hlIGdlc3RpcmFubm8gbCdlc3BvcnRhemlvbmU6IChwcm9wLCBwcm9wX2NzdnZpcywgcHJvcF9jc3ZoZHIpLiBcclxuICogXHJcbiAqIEFkIGVzZW1waW8sIGRhIHF1ZXN0YSBjb25maWd1cmF6aW9uZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBARXhwb3J0KHRydWUsIFwiTXlIZWFkZXJcIilcclxuICogY2lhbzogc3RyaW5nO1xyXG4gKiBgYGBcclxuICogXHJcbiAqIE5hc2NlcmFubm8gbGUgc2VndWVudGkgcHJvcHJpZXTDoCBuZWxsJ29nZ2V0dG8gZXNwb3J0YWJpbGU6XHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBcclxuICogY2lhb19jc3Z2aXM6IHN0cmluZzsgPT4gdHJ1ZVxyXG4gKiBjaWFvOiBzdHJpbmc7XHJcbiAqIGNpYW9fY3N2aGRyOiBzdHJpbmcgPT4gXCJNeUhlYWRlclwiXHJcbiAqIGBgYFxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIE9yZGluZSBkaSBlc3BvcnRhemlvbmUuIFBpw7kgcGljY29sbyDDqCwgcHJpbWEgYXBwYXJlIGlsIHZhbG9yZVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyIFRpdG9sbyBkZWxsYSBjb2xvbm5hIG5lbCBmaWxlIENTViBlc3BvcnRhdG9cclxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCBGb3JtYXRvIGRpIGVzcG9ydGF6aW9uZS4gUHXDsiBlc3NlcmUgdW4gZm9ybWF0byBkYXRhIHBlciBpIGNhbXBpIGRhdGEgbyAnRicgcGVyIGkgY2FtcGkgZmxvYXRpbmcgcG9pbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnQgPSAob3JkZXI6IG51bWJlciwgaGVhZGVyOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nID0gbnVsbCwgdGFibGVpZDogc3RyaW5nID0gbnVsbCkgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIGlmIChmb3JtYXQpXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2Rm9ybWF0UHJlZml4LCB7IHZhbHVlOiBmb3JtYXQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2T3JkUHJlZml4LCB7IHZhbHVlOiBvcmRlciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZWaXNQcmVmaXgsIHsgdmFsdWU6ICEhaGVhZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBpZiAodGFibGVpZClcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZQcm9wS2V5LCB7IHZhbHVlOiB0YWJsZWlkLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBjc3ZWaXNQcmVmaXgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBjc3ZWaXNQcmVmaXhdXHJcbiAgfTtcclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW4gb2dnZXR0by4gXHJcbiAqIFBlciBvZ25pIHByb3ByaWV0w6AgZGVsbCdvZ2dldHRvIHZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcikuIFxyXG4gKiBQZXIgZXNzZXJlIGVzcG9ydGF0ZSwgbGUgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gZGV2b25vIGVzc2VyZSBtYXJjYXRlIGNvbiBpIERlY29yYXRvcmkgZGkgZXNwb3J0YXppb25lXHJcbiAqIFxyXG4gKiBBZCBlc2VtcGlvLCBkYSBxdWVzdGEgY29uZmlndXJhemlvbmU6XHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBcclxuICogTXlPYmoge1xyXG4gKiAgICAgQEV4cG9ydCh0cnVlLCBcIk15SGVhZGVyXCIpXHJcbiAqICAgICBjaWFvOiBzdHJpbmc7XHJcbiAqIH1cclxuICogXHJcbiAqIEBFeHBvcnRPYmplY3QodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiB0ZXN0OiBNeU9iajsgXHJcbiAqIGBgYFxyXG4gKiBcclxuICogTmFzY2VyYW5ubyBsZSBzZWd1ZW50aSBwcm9wcmlldMOgIG5lbGwnb2dnZXR0byBlc3BvcnRhYmlsZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiB0ZXN0Y2lhbzogc3RyaW5nOyA9PiBWYWxvcmUgZGkgTXlPYmouY2lhb1xyXG4gKiB0ZXN0Y2lhb19jc3Z2aXM6IHN0cmluZzsgPT4gdHJ1ZVxyXG4gKiB0ZXN0Y2lhb19jc3ZoZHI6IHN0cmluZyA9PiBcIk15SGVhZGVyXCIgXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7YW55fSB0eXBlIFRpcG8gZGEgZXNwb3J0YXJlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXhwb3J0QXMgPSAob3JkZXI6IG51bWJlciwgdHlwZTogYW55LCBwcmVmaXg/OiBzdHJpbmcpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICB2YXIgdCA9IG5ldyB0eXBlKCk7XHJcbiAgICB2YXIgcHJvcHMgPSB0W2V4cG9ydExpc3RdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcHJvcCA9IHByb3BzW2ldLnJlcGxhY2UoY3N2VmlzUHJlZml4LCAnJyk7XHJcbiAgICAgIGlmICh0eXBlb2YgdFtwcm9wICsgY3N2VmlzUHJlZml4XSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHZhciB0b0VtaXQ6IGJvb2xlYW4gPSB0W3Byb3AgKyBjc3ZWaXNQcmVmaXhdO1xyXG4gICAgICAgIHZhciBsYmwgPSB0W3Byb3AgKyBjc3ZIZHJQcmVmaXhdO1xyXG4gICAgICAgIHZhciBmb3JtYXQgPSB0W3Byb3AgKyBjc3ZGb3JtYXRQcmVmaXhdO1xyXG4gICAgICAgIHZhciBvcmRlclByb3AgPSB0W3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG4gICAgICAgIGlmIChmb3JtYXQpXHJcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZGb3JtYXRQcmVmaXgsIHsgdmFsdWU6IGZvcm1hdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyUHJvcCArIG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wLCB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWYWx1ZU5hdmlnYXRvciwgeyB2YWx1ZTogcHJvcGVydHlLZXkgKyBcIi5cIiArIHByb3AsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXgsIHsgdmFsdWU6IHRvRW1pdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdkhkclByZWZpeCwgeyB2YWx1ZTogKHByZWZpeCA/IHByZWZpeCArICcgJyA6ICcnKSArIGxibCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgICAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBwcm9wICsgY3N2VmlzUHJlZml4KTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2VmlzUHJlZml4XVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIGxpc3RhLCBcclxuICogc2kgdXRpbGl6emFubyAyIG5hdmlnYXRvciByaXNwZXR0aXZhbWVudGUgcGVyIGxhIHZhbG9yaXp6YXppb25lIGRlbGwnSGVhZGVyIGUgZGVsIFZhbG9yZSBlIFxyXG4gKiBwZXIgb2duaSBlbGVtZW50byBkZWxsJ2FycmF5IHZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcilcclxuICogXHJcbiAqIEFUVEVOWklPTkU6IEdsaSBvZ2dldHRpIGVzcG9ydGF0aSBpbiBxdWVzdGEgbW9kYWxpdMOgIG5vbiBkZXZvbm8gcHJlc2VudGFyZSBhbHRyaSB0YWcgZGkgdGlwbyBARXhwb3J0ey4uLn0gYWxsJ2ludGVybm8uIEZhIHR1dHRvIHF1ZXN0byBkZWNvcmF0b3JlXHJcbiAqIFxyXG4gKiBJIG5hdmlnYXRvciBoYW5ubyBxdWVzdGEgY29udmVuemlvbmU6XHJcbiAqIFxyXG4gKiAuIC0tPiBkaXZpZGUgZHVlIHByb3ByaWV0w6AgZGEgcmljaGlhbWFyZSBjb25zZWN1dGl2YW1lbnRlOiBcImEuYlwiIHJpY2hpYW1lcsOgIFwib2JqLmEuYlwiO1xyXG4gKiBcclxuICogfCAtLT4gZGl2aWRlIHBpw7kgcHJvcHJpZXTDoCBwZXIgbGUgY29uY2F0ZW5hemlvbmkgY29uIHVubyBzcGF6aW8gZnJhIHVuYSBlIGwnYWx0cmE6IFwicmVnZGVzY3xzbGljZS5zbGljZW5hbWVcIiBkaXZlbnRlcsOgIG9iai5yZWdkZXNjICsgXCIgXCIgKyBvYmouc2xpY2Uuc2xpY2VuYW1lXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHRpdG9sbyBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHZhbG9yZSBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVmb3JtYXQgRm9ybWF0byBkaSBlc3BvcnRhemlvbmUgcGVyIGkgdmFsb3JpIHNlbGV6aW9uYXRpIGRhbCAqKnZhbHVlbmF2aWdhdG9yKiouIFB1w7IgZXNzZXJlIHVuIGZvcm1hdG8gZGF0YSBwZXIgaSBjYW1waSBkYXRhIG8gJ0YnIHBlciBpIGNhbXBpIGZsb2F0aW5nIHBvaW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXhwb3J0TGlzdCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXJuYXZpZ2F0b3I6IHN0cmluZywgdmFsdWVuYXZpZ2F0b3I6IHN0cmluZywgdmFsdWVmb3JtYXQ6IHN0cmluZyA9IG51bGwpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVybmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGxpc3RDc3ZWYWxGb3JtYXQsIHsgdmFsdWU6IHZhbHVlZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgbGlzdENzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1biBkaXppb25hcmlvLiBTZSBhZCBlc2VtcGlvIHNpIHZvZ2xpb25vIGdlbmVyYXJlIGxlIGNvbG9ubmVcclxuICogXHJcbiAqIFZhbG9yZSBBID0gMVxyXG4gKiBcclxuICogVmFsb3JlIEIgPSAyXHJcbiAqIFxyXG4gKiBWYWxvcmUgQyA9IDNcclxuICogXHJcbiAqIHBhcnRlbmRvIGRhIHVuIG9nZ2V0dG8gaW5pemlhbGUgeyBWYWxvcmUgeyBBOiAxLCBCOiAyLCBDOiAzIH0gfVxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIE9yZGluZSBkaSBlc3BvcnRhemlvbmUuIFBpw7kgcGljY29sbyDDqCwgcHJpbWEgYXBwYXJlIGlsIHZhbG9yZVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVybmF2aWdhdG9yIE5hdmlnYXRvciBjb2wgY29tcGl0byBkaSBzZWxlemlvbmFyZSBpbCB0aXRvbG8gcGVyIGxhIGNvbG9ubmFcclxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlbmF2aWdhdG9yIE5hdmlnYXRvciBjb2wgY29tcGl0byBkaSBzZWxlemlvbmFyZSBpbCB2YWxvcmUgcGVyIGxhIGNvbG9ubmFcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnREaWN0aW9uYXJ5ID0gKG9yZGVyOiBudW1iZXIsIGhlYWRlcm5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZW5hdmlnYXRvcjogc3RyaW5nKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXgsIHsgdmFsdWU6IHZhbHVlbmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgsIHsgdmFsdWU6IGhlYWRlcm5hdmlnYXRvciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XS5wdXNoKHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXhdXHJcbiAgfTtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIGNoZSBzaSBvY2N1cGEgZGVsbCdlc3BvcnRhemlvbmUgZGVnbGkgb2dnZXR0aSBtYXJjYXRpIGRhaSBEZWNvcmF0b3JpICoqRXhwb3J0RGljdGlvbmFyeSoqLCAqKkV4cG9ydExpc3QqKiwgKipFeHBvcnRBcyoqIG8gKipFeHBvcnQqKlxyXG4gKi9cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxyXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvc3RydXR0b3JlXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVzOiBEYXRlU2VydmljZSwgcHJpdmF0ZSB1dGlFeHRzOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBsYzogTG9jYWxpemF0aW9uU2VydmljZSkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJhIGdsaSBoZWFkZXIgcGVyIGwnZXNwb3J0YXppb25lIGUgaW50ZWdyYSBvZ25pIG9nZ2V0dG8gY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueVtdfSBvYmpzIE9nZ2V0dGkgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwdWJsaWMgc2V0dXBGb3JFeHBvcnQob2JqczogYW55W10sIGNvbHVtbnM6IHN0cmluZ1tdID0gW10pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgbGV0IGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG4gICAgbGV0IGhlYWRlcnNDYWNoZSA9IHt9O1xyXG5cclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICAvLyBHbGkgaGVhZGVyIGxpIHJhY2NvbGdvIHR1dHRpIHBvaSBmYWNjaW8gdWFuIGRpc3RpbmN0IGluIG1vZG8gZGEgZXNwb3J0YXJlIHR1dHRlIGxlIHByb3ByaWV0w6AgcGVyIGJlbmVcclxuICAgIGxldCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9ID0ge307XHJcblxyXG4gICAgaWYgKGNvbHVtbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucz8ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgY29sdW1uU2VsZWN0aW9uRGljdGlvbmFyeVtjb2x1bW5zW2ldXSA9IHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoZHMgPSB0aGlzLnBhcnNlQW5kR2V0SGVhZGVycyhvYmpzW2ldLCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5KTtcclxuICAgICAgLy8gQWdnaXVuZ28gZ2xpIGhlYWRlciBmYWNlbmRvIGluIG1vZG8gZGkgbm9uIGFnZ2l1bmdlcm5lIG1haSBkdWUgdWd1YWxpIHBlciBub24gZG92ZXIgZmFyZSB1bmEgZGlzdGluY3QgZG9wb1xyXG4gICAgICAvLyBjaGUgY29zdGVyZWJiZSBjb211bnF1ZSByaXNvcnNlLiBVdGlsaXp6byB1biBkaXppb25hcmlvIGQnYXBwb2dnaW8gcGVyIGxvb2t1cCBpc3RhbnRhbmVpXHJcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGRzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzQ2FjaGVbaGRzW2tdLmtleV0pIHtcclxuICAgICAgICAgIGhlYWRlcnNDYWNoZVtoZHNba10ua2V5XSA9IHRydWU7XHJcbiAgICAgICAgICBoZWFkZXJzLnB1c2goaGRzW2tdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT0gMClcclxuICAgICAgcmV0dXJuIGhlYWRlcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFNlIG1pIGFycml2YSBsYSBsaXN0YSBkaSBjb2xvbm5lIG5vbiBtaSBkw6Agc29sbyBsYSB2aXNpYmlsaXTDoCwgbWEgYW5jaGUgbCdvcmRpbmFtZW50b1xyXG4gICAgICAvLyBsZSBlc3BvcnRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICAgIGxldCBvcmRlcmVkSGVhZGVycyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgdGhpc0lkID0gY29sdW1uc1tpXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWFkZXJzW2ldLnByb3BLZXkgPT0gdGhpc0lkKSB7XHJcbiAgICAgICAgICAgIG9yZGVyZWRIZWFkZXJzLnB1c2goaGVhZGVyc1tpXSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3JkZXJlZEhlYWRlcnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRhIHVuYSBsaXN0YSBkaSBvZ2dldHRpIGdlbmVyaWNpIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGludGVncmEgb2duaSBvZ2dldHRvIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbVtdfSBvYmpzIE9nZ2V0dGkgZ2VuZXJpY2kgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzW119IGNvbHVtbnMgQ29sb25uZSByaWNoaWVzdGUgZGFsbCdlc3BvcnRhemlvbmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXR1cEZvckdlbmVyaWNFeHBvcnQob2JqczogR2VuZXJpY0l0ZW1bXSwgY29sdW1uczogQ3N2SGVhZGVyc1tdKTogQ3N2SGVhZGVyc1tdIHtcclxuICAgIGxldCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10gPSBbXTtcclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICBvYmpzLmZvckVhY2goKG9iaiwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKGluZGV4ID09IDApXHJcbiAgICAgICAgaGVhZGVycyA9IHRoaXMucGFyc2VBbmRHZXRHZW5lcmljSGVhZGVycyhvYmosIGNvbHVtbnMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5wYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iaiwgY29sdW1ucyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmljbyBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yR2VuZXJpY0V4cG9ydCoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZDb2x1bW5bXX0gY29sdW1ucyBDb2xvbm5lIHJpY2hpZXN0ZSBkYWxsJ2VzcG9ydGF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDc3ZIZWFkZXJzW119IEhlYWRlciBkaSBlc3BvcnRhemlvbmUgZ2nDoCBvcmRpbmF0aSBjb3JyZXR0YW1lbnRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iajogR2VuZXJpY0l0ZW0sIGNvbHVtbnM6IENzdkhlYWRlcnNbXSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICBpZiAoIW9iai5wcm9wZXJ0aWVzKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB2YXIgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcblxyXG4gICAgLy9NaXJhY2xlIGluY29taW5nXHJcbiAgICBjb2x1bW5zLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBvYmoucHJvcGVydGllc1t0LmtleV07XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHQua2V5ICsgXCJfZXhwXCIsIHsgdmFsdWU6IHByb3BWYWx1ZSwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbDogdC5sYWJlbCwga2V5OiB0LmtleSArIFwiX2V4cFwiLCBvcmRlcjogdC5vcmRlciwgdHlwZTogdC50eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9UaXJhdGkgZnVvcmkgdHV0dGkgZ2xpIGhlYWRlciBmYWNjaW8gc29ydCBzdWxsJ29yZGluYW1lbnRvXHJcbiAgICByZXR1cm4gaGVhZGVycy5zb3J0KChhLCBiKSA9PiB7IHJldHVybiBhLm9yZGVyIC0gYi5vcmRlciB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yRXhwb3J0KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQW5kR2V0SGVhZGVycyhvYmo6IGFueSwgY29sdW1uc1NlbGVjdGlvbj86IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgdmFyIGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG5cclxuICAgIC8vIE1pcmFjbGUgaW5jb21pbmdcclxuICAgIGxldCBleHBvcnRQcm9wcyA9IG9ialtleHBvcnRMaXN0XSB8fCBbXTtcclxuICAgIGxldCBsb2MgPSB0aGlzLmxjLmdlbmVyYXRlRnJvbVR5cGUob2JqW2xvY1Byb3BlcnR5XSk7XHJcblxyXG4gICAgaWYgKGV4cG9ydFByb3BzLmxlbmd0aCA9PSAwKVxyXG4gICAgICBjb25zb2xlLndhcm4oXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIE5lc3N1bmEgY29sb25uYSBjb25maWd1cmF0YSBkYSBlc3BvcnRhcmUhXCIpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0UHJvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHByb3AgPSBleHBvcnRQcm9wc1tpXTtcclxuICAgICAgbGV0IHByb3BCYXNlID0gXCJcIjtcclxuICAgICAgbGV0IHRvQ2FsbDogRnVuY3Rpb247XHJcbiAgICAgIGlmIChwcm9wLmVuZHNXaXRoKGxpc3RDc3ZIZHJQcmVmaXgpKSB7XHJcbiAgICAgICAgcHJvcEJhc2UgPSBwcm9wLnJlcGxhY2UobGlzdENzdkhkclByZWZpeCwgJycpO1xyXG4gICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VMaXN0LmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocHJvcC5lbmRzV2l0aChkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgsICcnKTtcclxuICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlRGljdGlvbmFyeS5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHByb3AuZW5kc1dpdGgoY3N2VmlzUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGNzdlZpc1ByZWZpeCwgJycpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW3Byb3BCYXNlICsgY3N2VmFsdWVOYXZpZ2F0b3JdICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZU9iamVjdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VQcm9wZXJ0eS5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodG9DYWxsKVxyXG4gICAgICAgIHRvQ2FsbChvYmosIHByb3BCYXNlLCBoZWFkZXJzLCBjb2x1bW5zU2VsZWN0aW9uLCBsb2MpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBzaW5nb2xhIHByb3ByaWV0w6AuIFxyXG4gICAqIFZpZW5lIGdlbmVyYXRvIGwnaGVhZGVyIGUgbGEgcHJvcHJpZXTDoCByZWxhdGl2YSBhbCB2YWxvcmUgZm9ybWF0dGF0byBvIG5vXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZSBcclxuICAgKiBAcGFyYW0ge0xvY2FsaXphdGlvblNlcnZpY2V9IGxvYyBTZXJ2aXppbyBkaSBsb2NhbGl6emF6aW9uZSBjaGUgdHJhZHVjZSB0dXR0aSBpIG5vbWkgY2hlIHB1w7JcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlUHJvcGVydHkob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgbGV0IHRvRW1pdDogYm9vbGVhbiA9IG9ialtwcm9wICsgY3N2VmlzUHJlZml4XTtcclxuICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IG9ialtwcm9wICsgY3N2Rm9ybWF0UHJlZml4XTtcclxuICAgIGxldCBwcm9wS2V5ID0gb2JqW3Byb3AgKyBjc3ZQcm9wS2V5XTtcclxuXHJcbiAgICBpZiAocHJvcEtleSAmJiAhY29sdW1uc1NlbGVjdGlvbltwcm9wS2V5XSAmJiBPYmplY3Qua2V5cyhjb2x1bW5zU2VsZWN0aW9uKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBDb2xvbm5hIGRhIG5vbiBlc3BvcnRhcmU6IFwiICsgcHJvcEtleSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGV4dCA9IG9ialtwcm9wICsgY3N2SGRyUHJlZml4XTtcclxuICAgIGxldCBsYWJlbCA9IGxvYyAmJiB0ZXh0ID8gbG9jLmxvYyh0ZXh0KSA6IHRleHQgfHwgXCJcIjtcclxuICAgIGxldCBvcmRlciA9IG9ialtwcm9wICsgY3N2T3JkUHJlZml4XTtcclxuXHJcbiAgICBpZiAoIXRvRW1pdClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNlIG5vbiBobyB1biBmb3JtYXRvIGVzcG9ydG8gZGlyZXR0YW1lbnRlXHJcbiAgICBpZiAoIWZvcm1hdCkge1xyXG4gICAgICAvLyBTZSDDqCB1biBmb3JtYXRvIGRhdGEgbWkgYXNzaWN1cm8gZGkgbm9uIHN0YW1wYXJlIG1haSB1bmEgZGF0YSAwMDowMDowMCBhbHRyaW1lbnRpIGluIGVzcG9ydGF6aW9uZSB2aWVuZSB1bm8gc2NoaWZvXHJcbiAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF0gPyB0aGlzLmRhdGVzLnRyaW1TZWNvbmRzKG9ialtwcm9wXS50b1N0cmluZygpKSA6IFwiXCI7XHJcbiAgICAgIGxldCBrZXkgPSBwcm9wICsgXCJfbm9mbXRcIjtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWwsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleSwgb3JkZXIsIHR5cGU6IFwic3RyaW5nXCIsIHByb3BLZXkgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQga2V5ID0gcHJvcCArIFwiX2ZtdFwiO1xyXG5cclxuICAgICAgLy8gQ2FzbyBmb3JtYXRvIG51bWVyaWNvXHJcbiAgICAgIGlmIChmb3JtYXQgPT0gXCJGXCIpIHtcclxuICAgICAgICAvLyBDaGVjayBjb25zaWRlcmFuZG8gbGEgcG9zc2liaWxpdMOgIGRpIHplcmlcclxuICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdICE9IG51bGwgPyBvYmpbcHJvcF0udG9TdHJpbmcoKSA6IFwiXCI7XHJcbiAgICAgICAgLy8gRWxpbWlubyB0dXR0ZSBsZSB2aXJnb2xlIChpbmRpY2F0b3JpIGRpIG1pZ2xpYWlhIHBlciBsYSBjdWx0dXJlIGRlZmF1bHQgZW4tVVMpXHJcbiAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLywvLCBcIlwiKTtcclxuICAgICAgICAvLyBJbCBzaW5nb2xvIHB1bnRvIGNoZSBjJ8OoLCBzZSBwcmVzZW50ZSAoc2VwYXJhdG9yZSBkZWNpbWFsaSkgbG8gdHJhc2Zvcm1vIGluIHZpcmdvbGFcclxuICAgICAgICBsZXQgdmFsQ29udmVydGVkID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWxDb252ZXJ0ZWQsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5LCBvcmRlciwgdHlwZTogXCJudW1iZXJcIiwgcHJvcEtleSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBTZSBobyB1biBmb3JtYXRvIGRhdGEgdHJhc2Zvcm1vIGluIGRheWpzLCBmb3JtYXR0byBlZCBlc3BvcnRvXHJcbiAgICAgICAgLy8gUGVyIGxhIHRyYXNmb3JtYXppb25lIGluIGRheWpzIHByb3ZvIHByaW1hIGEgcGFzc2FyZ2xpIGxhIHN0cmluZ2EgZGkgbmV0dG8sIHNwZXJhbmRvIGxhIHJpY29ub3NjYVxyXG4gICAgICAgIC8vIFNlIG5vbiBmdW56aW9uYSBwcm92byBhIGRlZmluaXJnbGkgbGEgZm9ybWF0dGF6aW9uZSBzdGFuZGFyZCBkZWwgbWV0ZXJpbmcgcGVyIHF1ZWwgbGluZ3VhZ2dpb1xyXG4gICAgICAgIGxldCB2YWwgPSB0aGlzLmRhdGVzLmdldEZvcm1hdHRlZChvYmpbcHJvcF0sIGZvcm1hdC5sZW5ndGggPD0gMTAsIGZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWwgPz8gXCJcIiwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXksIG9yZGVyLCB0eXBlOiBcImRhdGVcIiwgcHJvcEtleSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBzaW5nb2xhIHByb3ByaWV0w6AgZGEgdW4gb2dnZXR0by4gXHJcbiAgICogVmllbmUgZ2VuZXJhdG8gbCdoZWFkZXIgZSBsYSBwcm9wcmlldMOgIHJlbGF0aXZhIGFsIHZhbG9yZSBmb3JtYXR0YXRvIG8gbm8uIFxyXG4gICAqIFxyXG4gICAqIFBlciBvdHRlbmVyZSBpbCB2YWxvcmUgZSBsJ2hlYWRlciBkZWxsYSBwcm9wcmlldMOgIHZlbmdvbm8gdXRpbGl6emF0aSBpIG5hdmlnYXRvcmkgYXV0by1nZW5lcmF0aSBuZWwgZGVjb3JhdG9yZSAqKkV4cG9ydEFzKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VPYmplY3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICAvL3NlIHF1ZXN0YSBwcm9wcmlldMOgIGhhIHVuIG5hdmlnYXRvciBzaWduaWZpY2EgY2hlIGRlcml2YSBkYSB1biBvZ2dldHRvIGludGVybm8sIHJlY3VwZXJvIGlsIHZhbG9yZSBpbiBxdWVzdGEgZmFzZSBkYXRvIGNoZSBwcmltYSBub24gY2UgbCdob1xyXG4gICAgbGV0IHZhbHVlbmF2aWdhdG9yID0gb2JqW3Byb3AgKyBjc3ZWYWx1ZU5hdmlnYXRvcl07XHJcblxyXG4gICAgLy8gTG9jYWxpenphemlvbmUgcHJlc2EgZGFsbGEgY2xhc3NlIGJhc2Ugc2UgYyfDqCwgYWx0cmltZW50aSBkYWxsYSBjbGFzc2UgaW50ZXJuYVxyXG4gICAgbG9jID0gbG9jIHx8IHRoaXMubGMuZ2VuZXJhdGVGcm9tVHlwZShvYmpbbG9jUHJvcGVydHldKTtcclxuXHJcbiAgICAvL0VzLiBkaSB2YWx1ZW5hdmlnYXRvciBvYmouc3Vib2JqLnN1YnN1Ym9iai5wcm9wZXJ0eVxyXG4gICAgbGV0IGptcHMgPSB2YWx1ZW5hdmlnYXRvci5zcGxpdChcIi5cIik7XHJcbiAgICAvL01pIGNsb25vIGwnb2dnZXR0byBvcmlnaW5hbGUgcGVyIG5vbiB1Y2NpZGVyZ2xpIGkgcmlmZXJpbWVudGlcclxuICAgIGxldCBjbG9uZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbiAgICAvL1NhbHRvIHJpY29yc2l2YW1lbnRlIHN1IG1lIHN0ZXNzbyBwZXIgYXJyaXZhcmUgYWxsYSBwcm9wcmlldMOgXHJcbiAgICAvL1NhbHRvIDEgPiBkaXZlbnRhIG9ialxyXG4gICAgLy9TYWx0byAyID4gZGl2ZW50YSBvYmouc3Vib2JqXHJcbiAgICAvL2VjYy4uLlxyXG4gICAgam1wcy5mb3JFYWNoKHBwID0+IHsgY2xvbmUgPSBjbG9uZVtwcF07IH0pO1xyXG5cclxuICAgIC8vVmFsb3JlIGZpbmFsZSA6RFxyXG4gICAgbGV0IHZhbHVlID0gY2xvbmU7XHJcblxyXG4gICAgbGV0IHRleHQgPSBvYmpbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgbGFiZWwgPSBsb2MgJiYgdGV4dCA/IGxvYy5sb2ModGV4dCkgOiB0ZXh0IHx8IFwiXCI7XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgLy9TZSBwZXIgcXVlc3RhIHByb3ByaWV0w6AgaG8gdW4gZm9ybWF0byBsbyBhcHBsaWNvXHJcbiAgICBsZXQgZm9ybWF0OiBzdHJpbmcgPSBvYmpbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyA9IFwic3RyaW5nXCI7XHJcbiAgICBpZiAoZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgIGxldCB2YWwgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICB2YWx1ZSA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcbiAgICAgIHR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm9ybWF0KSB7XHJcbiAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQodmFsdWUsIGZvcm1hdC5sZW5ndGggPD0gMTAsIGZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgIHR5cGUgPSBcImRhdGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5OiBwcm9wLCBvcmRlciwgdHlwZSwgcHJvcEtleTogbnVsbCB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgbGlzdGEgZGkgdmFsb3JpIHBpdm90dGF0aSBkaW5hbWljYW1lbnRlOlxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGlsIHZhbG9yZSB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBsJ2hlYWRlciB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBDb24gaWwgdmFsb3JlIGNpIGNyZW8gbGEgcHJvcGVydHlcclxuICAgKiBcclxuICAgKiA9PiBDb24gbCdoZWFkZXIgZSBpbCByaWZlcmltZW50byBhbGxhIHByb3BlcnR5IGFwcGVuYSBjcmVhdGEgY3JlbyB1biByZWNvcmQgbmVnbGkgaGVhZGVyIGRhIGVzcG9ydGFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUxpc3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBsZXQgaGVhZGVybmF2aWdhdG9yID0gb2JqW3Byb3AgKyBsaXN0Q3N2SGRyUHJlZml4XTtcclxuICAgIGxldCB2YWx1ZW5hdmlnYXRvciA9IG9ialtwcm9wICsgbGlzdENzdlZhbFByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVmb3JtYXQgPSBvYmpbcHJvcCArIGxpc3RDc3ZWYWxGb3JtYXRdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcblxyXG4gICAgICB2YXIgaGVhZGVyc3BsaXQgPSBoZWFkZXJuYXZpZ2F0b3Iuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gUGVyIGwnaGVhZGVyIHNpIGNvbnNpZGVyYSBhIHNlIHN0YW50ZSBvZ25pIHBlenpvIHNlcGFyYXRvIGRhIHNwYXppbyBwZXIgZmFyZSBsZSBjb25jYXRlbmF6aW9uaVxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9ICEhbG9jID8gbG9jLmxvYyh0bXBSZXMpIDogdG1wUmVzO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBqdW1wcyA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLlwiKTtcclxuICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgIGxldCB2YWx1ZSA9IHRtcFJlcztcclxuXHJcbiAgICAgIGxldCB0eXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2RhdGUnID0gXCJzdHJpbmdcIjtcclxuICAgICAgaWYgKHZhbHVlZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogXCJcIjtcclxuICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICAgIHZhbHVlID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuICAgICAgICB0eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh2YWx1ZWZvcm1hdCkge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQob2JqW3Byb3BdLCB2YWx1ZWZvcm1hdC5sZW5ndGggPD0gMTAsIHZhbHVlZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgICB0eXBlID0gXCJkYXRlXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AgKyBpZHgsIHsgdmFsdWU6IHZhbHVlID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleTogcHJvcCArIGlkeCwgb3JkZXI6IG9yZGVyICsgaWR4LCB0eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBsaXN0YSBkaSB2YWxvcmkgcGl2b3R0YXRpIGRpbmFtaWNhbWVudGU6XHJcbiAgICogXHJcbiAgICogPT4gUmVjdXBlcm8gaWwgdmFsb3JlIHV0aWxpenphbmRvIGkgbmF2aWdhdG9yaVxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGwnaGVhZGVyIHV0aWxpenphbmRvIGkgbmF2aWdhdG9yaVxyXG4gICAqIFxyXG4gICAqID0+IENvbiBpbCB2YWxvcmUgY2kgY3JlbyBsYSBwcm9wZXJ0eVxyXG4gICAqIFxyXG4gICAqID0+IENvbiBsJ2hlYWRlciBlIGlsIHJpZmVyaW1lbnRvIGFsbGEgcHJvcGVydHkgYXBwZW5hIGNyZWF0YSBjcmVvIHVuIHJlY29yZCBuZWdsaSBoZWFkZXIgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZVxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VEaWN0aW9uYXJ5KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgbGV0IGhlYWRlcm5hdmlnYXRvciA9IG9ialtwcm9wICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXhdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcbiAgICAgIHZhciBoZWFkZXJzcGxpdCA9IGhlYWRlcm5hdmlnYXRvci5zcGxpdChcIiBcIik7XHJcbiAgICAgIHZhciBsYWJlbCA9IFwiXCI7XHJcblxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9ICEhbG9jID8gbG9jLmxvYyh0bXBSZXMpIDogdG1wUmVzO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgdmFsdWVzcGxpdCA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgdmFsdWVzcGxpdC5mb3JFYWNoKCh0LCBpZHhpbnRlcm5hbCkgPT4ge1xyXG4gICAgICAgIHZhciBuYXZpZyA9IHQuc3BsaXQoXCItXCIpWzFdO1xyXG4gICAgICAgIHZhciBkZXNjID0gdC5zcGxpdChcIi1cIilbMF07XHJcblxyXG4gICAgICAgIGp1bXBzID0gbmF2aWcuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIHRtcFJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGlzdGl0ZW0pKTtcclxuICAgICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdG1wUmVzO1xyXG5cclxuICAgICAgICBsZXQgcHJvcG5hbWUgPSBwcm9wICsgaWR4LnRvU3RyaW5nKCkgKyBpZHhpbnRlcm5hbC50b1N0cmluZygpO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BuYW1lLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWw6IGxhYmVsICsgXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2MoZGVzYykgOiBkZXNjLCBrZXk6IHByb3BuYW1lLCBvcmRlcjogb3JkZXIgKyBpZHgsIHR5cGU6ICdzdHJpbmcnLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBFZmZldHR1YSBsJ2VzcG9ydGF6aW9uZSBpbiBmaWxlIENTViBcclxuICAgKi9cclxuICBwcml2YXRlIGV4cG9ydENTVihmbjogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGRhdGE6IGFueVtdKSB7XHJcbiAgICBsZXQgY3N2RGF0YSA9ICcnLCByb3cgPSAnJywgc2VwID0gJzsnO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgaCA9IGhlYWRlcnNbaV07XHJcbiAgICAgIHJvdyArPSBgJHtyb3cgIT0gJycgPyBzZXAgOiAnJ31cIiR7aC5sYWJlbH1cImA7XHJcbiAgICB9XHJcbiAgICBjc3ZEYXRhICs9IHJvdyArICdcXHJcXG4nO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICByb3cgPSAnJztcclxuICAgICAgbGV0IGl0ZW0gPSBkYXRhW2ldO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhlYWRlcnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBsZXQgdmFsID0gaXRlbVtoZWFkZXJzW2pdLmtleV07XHJcbiAgICAgICAgcm93ICs9IGAke3JvdyAhPSAnJyA/IHNlcCA6ICcnfVwiJHt2YWx9XCJgO1xyXG4gICAgICB9XHJcbiAgICAgIGNzdkRhdGEgKz0gcm93ICsgJ1xcclxcbic7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIEJPTSA9IG5ldyBVaW50OEFycmF5KFsweEVGLDB4QkIsMHhCRl0pO1xyXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbQk9NLCBjc3ZEYXRhXSwgeyB0eXBlOiAndGV4dC9jc3YnIH0pO1xyXG4gICAgdmFyIG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICB0aGlzLnV0aUV4dHMuZmlsZURvd25sb2FkKG9iamVjdFVybCwgZm4uZW5kc1dpdGgoJy54bHN4JykgPyBmbi5yZXBsYWNlKCcueGxzeCcsICcuY3N2JykgOiBmbi5lbmRzV2l0aCgnLmNzdicpID8gZm4gOiBmbiArIFwiLmNzdlwiKTtcclxuICB9XHJcblxyXG5cclxuICAvKiogQ2FjaGUgZGVsIG1vZHVsbyBwZXIgbCdlc3BvcnRhemlvbmUgRXhjZWwgKi9cclxuICBwcml2YXRlIEV4Y2VsSlM6IGFueTtcclxuXHJcbiAgLyoqIEVmZmV0dHVhIGwnZXNwb3J0YXppb25lIGRlbCBmaWxlIEV4Y2VsIGJhc2FuZG9zaSBzdWwgbW9kdWxvICoqRXhjZWxKUyoqLCBzdWdsaSBoZWFkZXIgKipoZWFkZXJzKiogZSBzdWkgZGF0aSAqKmRhdGEqKiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgZXhwb3J0RXhjZWwoZm46IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBkYXRhOiBhbnlbXSkge1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuRXhjZWxKUyA9IHRoaXMuRXhjZWxKUyB8fCBhd2FpdCBpbXBvcnQoXCJleGNlbGpzXCIpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2gge1xyXG4gICAgICB0aHJvdyBcIkltcG9zc2liaWxlIGNhcmljYXJlIGxhIGxpYnJlcmlhIHBlciBsJ2VzcG9ydGF6aW9uZSBpbiBFeGNlbFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpRml4ID0gMTtcclxuICAgIGxldCB3b3JrYm9vayA9IG5ldyB0aGlzLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIHdvcmtib29rLmNyZWF0b3IgPSBcIkVtYSdzIGJpZyBFcy1UYWJsZVwiO1xyXG4gICAgd29ya2Jvb2suY3JlYXRlZCA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgbGV0IHNoZWV0ID0gd29ya2Jvb2suYWRkV29ya3NoZWV0KCdEYXRhJyk7XHJcbiAgICBsZXQgaGVhZGVyID0gc2hlZXQuZ2V0Um93KDEpO1xyXG4gICAgaGVhZGVyLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNvcnQoKGE6IENzdkhlYWRlcnMsIGI6IENzdkhlYWRlcnMpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGggPSBoZWFkZXJzW2ldO1xyXG4gICAgICBoZWFkZXIuZ2V0Q2VsbChpICsgaUZpeCkudmFsdWUgPSBoLmxhYmVsO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcm93ID0gc2hlZXQuZ2V0Um93KGkgKyBpRml4ICsgMSk7XHJcbiAgICAgIGxldCBpdGVtID0gZGF0YVtpXTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGggPSBoZWFkZXJzW2ldO1xyXG4gICAgICAgIGxldCBjZWxsID0gcm93LmdldENlbGwoaSArIDEpO1xyXG4gICAgICAgIGxldCB2YWwgPSBpdGVtW2gua2V5XTtcclxuXHJcbiAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgIGNlbGwudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKGgudHlwZSkge1xyXG4gICAgICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgICAgIC8vIEV4Y2VsSlMgdmEgZGkgZGVmYXVsdCBpbiBVVEMgcXVpbmRpIHJpc2NoaWVyZWJiZSBkaSB0aXJhcmUgZ2nDuSAyIG9yZSBhZCBvZ25pIGVzcG9ydGF6aW9uZVxyXG4gICAgICAgICAgICAvLyBCaXNvZ25hIGFnZ2l1bmdlcmUgbCd1dGMgb2Zmc2V0IGFsbGEgZGF0YSBhdHR1YWxlXHJcbiAgICAgICAgICAgIGxldCBkYXRlID0gdGhpcy5kYXRlcy5nZXREYXRlQ29udmVydGlvbih2YWwpO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xyXG4gICAgICAgICAgICAgIGxldCBjb3JyZWN0ZWREYXRlID0gZGF0ZS5hZGQoZGF0ZS51dGNPZmZzZXQoKSwgJ21pbnV0ZScpO1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSBjb3JyZWN0ZWREYXRlLnRvRGF0ZSgpO1xyXG4gICAgICAgICAgICAgIGNlbGwubnVtRm10ID0gdmFsLmxlbmd0aCA+IDEwID8gJ2RkL21tL3l5eXkgaDptOnMnIDogJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgICAgICBsZXQgY29udmVydGVkID0gcGFyc2VGbG9hdCh2YWwucmVwbGFjZSgnLCcsICcuJykpO1xyXG4gICAgICAgICAgICBjZWxsLnZhbHVlID0gaXNOYU4oY29udmVydGVkKSA/IFwiXCIgOiBjb252ZXJ0ZWQ7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJ1ZmZlciA9IGF3YWl0IHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKTtcclxuICAgIGxldCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldDtcIiB9KTtcclxuICAgIGxldCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgdGhpcy51dGlFeHRzLmZpbGVEb3dubG9hZChvYmplY3RVcmwsIGZuLmVuZHNXaXRoKCcuY3N2JykgPyBmbi5yZXBsYWNlKCcuY3N2JywgJy54bHN4JykgOiBmbi5lbmRzV2l0aCgnLnhsc3gnKSA/IGZuIDogZm4gKyBcIi54bHN4XCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGNoZSBlZmZldHRpdmFtZW50ZSBnZW5lcmEgZ2xpIGhlYWRlciBlIGkgZGF0aSBwZXIgbCdlc3BvcnRhemlvbmUgY29uICoqbmd4LWNzdioqXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueVtdfSBpdGVtcyBPZ2dldHRpIGRhIGVzcG9ydGFyZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBleHBvcnQoaXRlbXM6IGFueVtdLCBmb3JtYXQ6ICdDU1YnIHwgJ1hMU1gnLCBmaWxlTmFtZTogc3RyaW5nLCB0eXBlOiBUeXBlPGFueT4sIGNvbHVtbnNGaWx0ZXI/OiBzdHJpbmdbXSwgZ2VuZXJpY0hlYWRlcnM/OiBDc3ZIZWFkZXJzW10pIHtcclxuICAgIHZhciBjcmVhdGVkSXRlbXMgPSBpdGVtcy5tYXAodCA9PiB7XHJcbiAgICAgIGxldCB0bXAgPSBuZXcgdHlwZSgpO1xyXG4gICAgICBmb3IobGV0IHByb3BlcnR5IGluIHQpIHRtcFtwcm9wZXJ0eV0gPSB0W3Byb3BlcnR5XTtcclxuICAgICAgcmV0dXJuIHRtcDtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBoZWFkZXJzID0gZ2VuZXJpY0hlYWRlcnMgPyB0aGlzLnNldHVwRm9yR2VuZXJpY0V4cG9ydChjcmVhdGVkSXRlbXMsIGdlbmVyaWNIZWFkZXJzKSA6IHRoaXMuc2V0dXBGb3JFeHBvcnQoY3JlYXRlZEl0ZW1zLCBjb2x1bW5zRmlsdGVyKTtcclxuICAgIChmb3JtYXQgPT0gXCJDU1ZcIiA/IHRoaXMuZXhwb3J0Q1NWIDogdGhpcy5leHBvcnRFeGNlbCkuYmluZCh0aGlzKShmaWxlTmFtZSwgaGVhZGVycywgY3JlYXRlZEl0ZW1zKTtcclxuICB9XHJcbn0iXX0=
|
|
627
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLakQsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0FBUS9ROzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUE4QjtJQUMvRCxPQUFPLFNBQVMsWUFBWSxDQUF3QyxXQUFjO1FBQ2hGLE9BQU8sS0FBTSxTQUFRLFdBQVc7WUFBekI7O2dCQUE0QixZQUFPLEdBQUcsR0FBRyxDQUFDO1lBQUMsQ0FBQztTQUFBLENBQUM7SUFDdEQsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLFNBQWlCLElBQUksRUFBRSxVQUFrQixJQUFJLEVBQUUsRUFBRSxDQUNyRyxDQUFDLE1BQWMsRUFBRSxXQUFtQixFQUFFLEVBQUU7SUFDdEMsSUFBSSxNQUFNO1FBQ1IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUss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QUUsWUFBWSxDQUFDLENBQUM7SUFDcEcsQ0FBQzs7MEdBemZVLGFBQWE7OEdBQWIsYUFBYSxjQURBLE1BQU07MkZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIEVzZmFlbnphXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcblxyXG5pbXBvcnQgeyBleHBvcnRMaXN0LCBjc3ZGb3JtYXRQcmVmaXgsIGNzdkhkclByZWZpeCwgY3N2T3JkUHJlZml4LCBjc3ZWYWx1ZU5hdmlnYXRvciwgY3N2VmlzUHJlZml4LCBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4LCBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4LCBsaXN0Q3N2SGRyUHJlZml4LCBsaXN0Q3N2VmFsRm9ybWF0LCBsaXN0Q3N2VmFsUHJlZml4LCBjc3ZQcm9wS2V5LCBsb2NQcm9wZXJ0eSwgY3N2VmFsdWVUeXBlIH0gZnJvbSBcIi4uL21vZGVscy9FeHBvcnRDb25zdHNcIjtcclxuaW1wb3J0IHsgRGF0ZVNlcnZpY2UgfSBmcm9tICcuL2V4dGVuc2lvbnMuZGF0ZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIi4vZXh0ZW5zaW9ucy51dGlsaXRpZXMuc2VydmljZVwiO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBDc3ZIZWFkZXJzIH0gZnJvbSBcIi4uL21vZGVscy9Dc3ZIZWFkZXJzXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9HZW5lcmljSXRlbVwiO1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgY2hlIGZvcm5pc2NlIGxhIGNsYXNzZSBkaSBsb2NhbGl6emF6aW9uZSBwZXIgdHV0dGUgbGUgcHJvcHJpZXTDoCBlc3BvcnRhdGUgY29uIEBFeHBvcnQgZSBxdWFsc2lhc2kgYWx0cm8gdGFnIGNoZSByaWNoaWVkYSBsb2NhbGl6emF6aW9uaS5cclxuICogXHJcbiAqIFNvc3RhbnppbGFtZW50ZSBhZ2dpdW5nZSBsYSBwcm9wcmlldMOgICoqX19sb2NfXyoqIGFsbCdvZ2dldHRvIGNyZWF0byBkYWxsYSBjbGFzc2UgY29ycmVudGUgYXNzZWduYW5kb2dsaSBjb21lIHZhbG9yZSBpbCB0aXBvIGRlbCBMb2NhbGl6YXRpb25TZXJ2aWNlIGRhIHVzYXJlIHBlciBsYSB0cmFkdXppb25lXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1R5cGU8TG9jYWxpemF0aW9uU2VydmljZT59IGxvYyBUaXBvIGVyZWRpdGF0byBkYWwgTG9jYWxpemF0aW9uU2VydmljZSBjaGUgcHXDsiBlc3NlcmUgY3JlYXRvIGEgcnVudGltZSBzb3R0byBjb250ZXN0byBkZWxsYSBESSBkaSBBbmd1bGFyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gRXhwb3J0TG9jYWxpemF0aW9uKGxvYzogVHlwZTxMb2NhbGl6YXRpb25TZXJ2aWNlPikge1xyXG4gIHJldHVybiBmdW5jdGlvbiBpbnRlZ3JhdGVMb2M8VCBleHRlbmRzIHsgbmV3KC4uLmFyZ3M6IGFueVtdKToge30gfT4oY29uc3RydWN0b3I6IFQpIHtcclxuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGNvbnN0cnVjdG9yIHsgX19sb2NfXyA9IGxvYzsgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIHByb3ByaWV0w6Agc2luZ29sYS4gXHJcbiAqIFZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcikuIFxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiBjaWFvOiBzdHJpbmc7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogTmFzY2VyYW5ubyBsZSBzZWd1ZW50aSBwcm9wcmlldMOgIG5lbGwnb2dnZXR0byBlc3BvcnRhYmlsZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIGNpYW86IHN0cmluZztcclxuICogY2lhb19jc3ZoZHI6IHN0cmluZyA9PiBcIk15SGVhZGVyXCJcclxuICogYGBgXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXIgVGl0b2xvIGRlbGxhIGNvbG9ubmEgbmVsIGZpbGUgQ1NWIGVzcG9ydGF0b1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IEZvcm1hdG8gZGkgZXNwb3J0YXppb25lLiBQdcOyIGVzc2VyZSB1biBmb3JtYXRvIGRhdGEgcGVyIGkgY2FtcGkgZGF0YSBvICdGJyBwZXIgaSBjYW1waSBmbG9hdGluZyBwb2ludFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXI6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgPSBudWxsLCB0YWJsZWlkOiBzdHJpbmcgPSBudWxsKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGZvcm1hdClcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZGb3JtYXRQcmVmaXgsIHsgdmFsdWU6IGZvcm1hdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogISFoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIGlmICh0YWJsZWlkKVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlByb3BLZXksIHsgdmFsdWU6IHRhYmxlaWQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1biBvZ2dldHRvLiBcclxuICogUGVyIG9nbmkgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gdmVycmFubm8gZ2VuZXJhdGUgMyBwcm9wcmlldMOgIGNoZSBnZXN0aXJhbm5vIGwnZXNwb3J0YXppb25lOiAocHJvcCwgcHJvcF9jc3Z2aXMsIHByb3BfY3N2aGRyKS4gXHJcbiAqIFBlciBlc3NlcmUgZXNwb3J0YXRlLCBsZSBwcm9wcmlldMOgIGRlbGwnb2dnZXR0byBkZXZvbm8gZXNzZXJlIG1hcmNhdGUgY29uIGkgRGVjb3JhdG9yaSBkaSBlc3BvcnRhemlvbmVcclxuICogXHJcbiAqIEFkIGVzZW1waW8sIGRhIHF1ZXN0YSBjb25maWd1cmF6aW9uZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBNeU9iaiB7XHJcbiAqICAgICBARXhwb3J0KHRydWUsIFwiTXlIZWFkZXJcIilcclxuICogICAgIGNpYW86IHN0cmluZztcclxuICogfVxyXG4gKiBcclxuICogQEV4cG9ydE9iamVjdCh0cnVlLCBcIk15SGVhZGVyXCIpXHJcbiAqIHRlc3Q6IE15T2JqOyBcclxuICogYGBgXHJcbiAqIFxyXG4gKiBOYXNjZXJhbm5vIGxlIHNlZ3VlbnRpIHByb3ByaWV0w6AgbmVsbCdvZ2dldHRvIGVzcG9ydGFiaWxlOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIHRlc3RjaWFvOiBzdHJpbmc7ID0+IFZhbG9yZSBkaSBNeU9iai5jaWFvXHJcbiAqIHRlc3RjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIHRlc3RjaWFvX2Nzdmhkcjogc3RyaW5nID0+IFwiTXlIZWFkZXJcIiBcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcmRlciBPcmRpbmUgZGkgZXNwb3J0YXppb25lLiBQacO5IHBpY2NvbG8gw6gsIHByaW1hIGFwcGFyZSBpbCB2YWxvcmVcclxuICogQHBhcmFtIHthbnl9IHR5cGUgVGlwbyBkYSBlc3BvcnRhcmVcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnRBcyA9IChvcmRlcjogbnVtYmVyLCB0eXBlOiBhbnksIHByZWZpeD86IHN0cmluZykgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIHZhciB0ID0gbmV3IHR5cGUoKTtcclxuICAgIHZhciBwcm9wcyA9IHRbZXhwb3J0TGlzdF07XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwcm9wID0gcHJvcHNbaV0ucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgaWYgKHR5cGVvZiB0W3Byb3AgKyBjc3ZWaXNQcmVmaXhdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdmFyIHRvRW1pdDogYm9vbGVhbiA9IHRbcHJvcCArIGNzdlZpc1ByZWZpeF07XHJcbiAgICAgICAgdmFyIGxibCA9IHRbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICAgICAgdmFyIG9yZGVyUHJvcCA9IHRbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcbiAgICAgICAgaWYgKGZvcm1hdClcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdkZvcm1hdFByZWZpeCwgeyB2YWx1ZTogZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXJQcm9wICsgb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AsIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZhbHVlTmF2aWdhdG9yLCB7IHZhbHVlOiBwcm9wZXJ0eUtleSArIFwiLlwiICsgcHJvcCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogdG9FbWl0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiAocHJlZml4ID8gcHJlZml4ICsgJyAnIDogJycpICsgbGJsLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2VmFsdWVUeXBlLCB7IHZhbHVlOiBwcm9wZXJ0eUtleSArIFwiLlwiICsgcHJvcCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgICAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBwcm9wICsgY3N2VmlzUHJlZml4KTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2VmlzUHJlZml4XVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIGxpc3RhLCBcclxuICogc2kgdXRpbGl6emFubyAyIG5hdmlnYXRvciByaXNwZXR0aXZhbWVudGUgcGVyIGxhIHZhbG9yaXp6YXppb25lIGRlbGwnSGVhZGVyIGUgZGVsIFZhbG9yZSBlIFxyXG4gKiBwZXIgb2duaSBlbGVtZW50byBkZWxsJ2FycmF5IHZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcilcclxuICogXHJcbiAqIEFUVEVOWklPTkU6IEdsaSBvZ2dldHRpIGVzcG9ydGF0aSBpbiBxdWVzdGEgbW9kYWxpdMOgIG5vbiBkZXZvbm8gcHJlc2VudGFyZSBhbHRyaSB0YWcgZGkgdGlwbyBARXhwb3J0ey4uLn0gYWxsJ2ludGVybm8uIEZhIHR1dHRvIHF1ZXN0byBkZWNvcmF0b3JlXHJcbiAqIFxyXG4gKiBJIG5hdmlnYXRvciBoYW5ubyBxdWVzdGEgY29udmVuemlvbmU6XHJcbiAqIFxyXG4gKiAuIC0tPiBkaXZpZGUgZHVlIHByb3ByaWV0w6AgZGEgcmljaGlhbWFyZSBjb25zZWN1dGl2YW1lbnRlOiBcImEuYlwiIHJpY2hpYW1lcsOgIFwib2JqLmEuYlwiO1xyXG4gKiBcclxuICogfCAtLT4gZGl2aWRlIHBpw7kgcHJvcHJpZXTDoCBwZXIgbGUgY29uY2F0ZW5hemlvbmkgY29uIHVubyBzcGF6aW8gZnJhIHVuYSBlIGwnYWx0cmE6IFwicmVnZGVzY3xzbGljZS5zbGljZW5hbWVcIiBkaXZlbnRlcsOgIG9iai5yZWdkZXNjICsgXCIgXCIgKyBvYmouc2xpY2Uuc2xpY2VuYW1lXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHRpdG9sbyBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHZhbG9yZSBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVmb3JtYXQgRm9ybWF0byBkaSBlc3BvcnRhemlvbmUgcGVyIGkgdmFsb3JpIHNlbGV6aW9uYXRpIGRhbCAqKnZhbHVlbmF2aWdhdG9yKiouIFB1w7IgZXNzZXJlIHVuIGZvcm1hdG8gZGF0YSBwZXIgaSBjYW1waSBkYXRhIG8gJ0YnIHBlciBpIGNhbXBpIGZsb2F0aW5nIHBvaW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXhwb3J0TGlzdCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXJuYXZpZ2F0b3I6IHN0cmluZywgdmFsdWVuYXZpZ2F0b3I6IHN0cmluZywgdmFsdWVmb3JtYXQ6IHN0cmluZyA9IG51bGwpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVybmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGxpc3RDc3ZWYWxGb3JtYXQsIHsgdmFsdWU6IHZhbHVlZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgbGlzdENzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1biBkaXppb25hcmlvLiBTZSBhZCBlc2VtcGlvIHNpIHZvZ2xpb25vIGdlbmVyYXJlIGxlIGNvbG9ubmVcclxuICogXHJcbiAqIFZhbG9yZSBBID0gMVxyXG4gKiBcclxuICogVmFsb3JlIEIgPSAyXHJcbiAqIFxyXG4gKiBWYWxvcmUgQyA9IDNcclxuICogXHJcbiAqIHBhcnRlbmRvIGRhIHVuIG9nZ2V0dG8gaW5pemlhbGUgeyBWYWxvcmUgeyBBOiAxLCBCOiAyLCBDOiAzIH0gfVxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIE9yZGluZSBkaSBlc3BvcnRhemlvbmUuIFBpw7kgcGljY29sbyDDqCwgcHJpbWEgYXBwYXJlIGlsIHZhbG9yZVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVybmF2aWdhdG9yIE5hdmlnYXRvciBjb2wgY29tcGl0byBkaSBzZWxlemlvbmFyZSBpbCB0aXRvbG8gcGVyIGxhIGNvbG9ubmFcclxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlbmF2aWdhdG9yIE5hdmlnYXRvciBjb2wgY29tcGl0byBkaSBzZWxlemlvbmFyZSBpbCB2YWxvcmUgcGVyIGxhIGNvbG9ubmFcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnREaWN0aW9uYXJ5ID0gKG9yZGVyOiBudW1iZXIsIGhlYWRlcm5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZW5hdmlnYXRvcjogc3RyaW5nKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXgsIHsgdmFsdWU6IHZhbHVlbmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgsIHsgdmFsdWU6IGhlYWRlcm5hdmlnYXRvciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XS5wdXNoKHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXhdXHJcbiAgfTtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIGNoZSBzaSBvY2N1cGEgZGVsbCdlc3BvcnRhemlvbmUgZGVnbGkgb2dnZXR0aSBtYXJjYXRpIGRhaSBEZWNvcmF0b3JpICoqRXhwb3J0RGljdGlvbmFyeSoqLCAqKkV4cG9ydExpc3QqKiwgKipFeHBvcnRBcyoqIG8gKipFeHBvcnQqKlxyXG4gKi9cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxyXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvc3RydXR0b3JlXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVzOiBEYXRlU2VydmljZSwgcHJpdmF0ZSB1dGlFeHRzOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBsYzogTG9jYWxpemF0aW9uU2VydmljZSkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJhIGdsaSBoZWFkZXIgcGVyIGwnZXNwb3J0YXppb25lIGUgaW50ZWdyYSBvZ25pIG9nZ2V0dG8gY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueVtdfSBvYmpzIE9nZ2V0dGkgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwdWJsaWMgc2V0dXBGb3JFeHBvcnQob2JqczogYW55W10sIGNvbHVtbnM6IHN0cmluZ1tdID0gW10pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgbGV0IGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG4gICAgbGV0IGhlYWRlcnNDYWNoZSA9IHt9O1xyXG5cclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICAvLyBHbGkgaGVhZGVyIGxpIHJhY2NvbGdvIHR1dHRpIHBvaSBmYWNjaW8gdWFuIGRpc3RpbmN0IGluIG1vZG8gZGEgZXNwb3J0YXJlIHR1dHRlIGxlIHByb3ByaWV0w6AgcGVyIGJlbmVcclxuICAgIGxldCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9ID0ge307XHJcblxyXG4gICAgaWYgKGNvbHVtbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucz8ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgY29sdW1uU2VsZWN0aW9uRGljdGlvbmFyeVtjb2x1bW5zW2ldXSA9IHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoZHMgPSB0aGlzLnBhcnNlQW5kR2V0SGVhZGVycyhvYmpzW2ldLCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5KTtcclxuICAgICAgLy8gQWdnaXVuZ28gZ2xpIGhlYWRlciBmYWNlbmRvIGluIG1vZG8gZGkgbm9uIGFnZ2l1bmdlcm5lIG1haSBkdWUgdWd1YWxpIHBlciBub24gZG92ZXIgZmFyZSB1bmEgZGlzdGluY3QgZG9wb1xyXG4gICAgICAvLyBjaGUgY29zdGVyZWJiZSBjb211bnF1ZSByaXNvcnNlLiBVdGlsaXp6byB1biBkaXppb25hcmlvIGQnYXBwb2dnaW8gcGVyIGxvb2t1cCBpc3RhbnRhbmVpXHJcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGRzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzQ2FjaGVbaGRzW2tdLmtleV0pIHtcclxuICAgICAgICAgIGhlYWRlcnNDYWNoZVtoZHNba10ua2V5XSA9IHRydWU7XHJcbiAgICAgICAgICBoZWFkZXJzLnB1c2goaGRzW2tdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT0gMClcclxuICAgICAgcmV0dXJuIGhlYWRlcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFNlIG1pIGFycml2YSBsYSBsaXN0YSBkaSBjb2xvbm5lIG5vbiBtaSBkw6Agc29sbyBsYSB2aXNpYmlsaXTDoCwgbWEgYW5jaGUgbCdvcmRpbmFtZW50b1xyXG4gICAgICAvLyBsZSBlc3BvcnRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICAgIGxldCBvcmRlcmVkSGVhZGVycyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgdGhpc0lkID0gY29sdW1uc1tpXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWFkZXJzW2ldLnByb3BLZXkgPT0gdGhpc0lkKSB7XHJcbiAgICAgICAgICAgIG9yZGVyZWRIZWFkZXJzLnB1c2goaGVhZGVyc1tpXSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3JkZXJlZEhlYWRlcnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRhIHVuYSBsaXN0YSBkaSBvZ2dldHRpIGdlbmVyaWNpIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGludGVncmEgb2duaSBvZ2dldHRvIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbVtdfSBvYmpzIE9nZ2V0dGkgZ2VuZXJpY2kgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzW119IGNvbHVtbnMgQ29sb25uZSByaWNoaWVzdGUgZGFsbCdlc3BvcnRhemlvbmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXR1cEZvckdlbmVyaWNFeHBvcnQob2JqczogR2VuZXJpY0l0ZW1bXSwgY29sdW1uczogQ3N2SGVhZGVyc1tdKTogQ3N2SGVhZGVyc1tdIHtcclxuICAgIGxldCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10gPSBbXTtcclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICBvYmpzLmZvckVhY2goKG9iaiwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKGluZGV4ID09IDApXHJcbiAgICAgICAgaGVhZGVycyA9IHRoaXMucGFyc2VBbmRHZXRHZW5lcmljSGVhZGVycyhvYmosIGNvbHVtbnMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5wYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iaiwgY29sdW1ucyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmljbyBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yR2VuZXJpY0V4cG9ydCoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZDb2x1bW5bXX0gY29sdW1ucyBDb2xvbm5lIHJpY2hpZXN0ZSBkYWxsJ2VzcG9ydGF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDc3ZIZWFkZXJzW119IEhlYWRlciBkaSBlc3BvcnRhemlvbmUgZ2nDoCBvcmRpbmF0aSBjb3JyZXR0YW1lbnRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iajogR2VuZXJpY0l0ZW0sIGNvbHVtbnM6IENzdkhlYWRlcnNbXSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICBpZiAoIW9iai5wcm9wZXJ0aWVzKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB2YXIgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcblxyXG4gICAgLy9NaXJhY2xlIGluY29taW5nXHJcbiAgICBjb2x1bW5zLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBvYmoucHJvcGVydGllc1t0LmtleV07XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHQua2V5ICsgXCJfZXhwXCIsIHsgdmFsdWU6IHByb3BWYWx1ZSwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbDogdC5sYWJlbCwga2V5OiB0LmtleSArIFwiX2V4cFwiLCBvcmRlcjogdC5vcmRlciwgdHlwZTogdC50eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9UaXJhdGkgZnVvcmkgdHV0dGkgZ2xpIGhlYWRlciBmYWNjaW8gc29ydCBzdWxsJ29yZGluYW1lbnRvXHJcbiAgICByZXR1cm4gaGVhZGVycy5zb3J0KChhLCBiKSA9PiB7IHJldHVybiBhLm9yZGVyIC0gYi5vcmRlciB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yRXhwb3J0KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQW5kR2V0SGVhZGVycyhvYmo6IGFueSwgY29sdW1uc1NlbGVjdGlvbj86IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgdmFyIGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG5cclxuICAgIC8vIE1pcmFjbGUgaW5jb21pbmdcclxuICAgIGxldCBleHBvcnRQcm9wcyA9IG9ialtleHBvcnRMaXN0XSB8fCBbXTtcclxuICAgIGxldCBsb2MgPSB0aGlzLmxjLmdlbmVyYXRlRnJvbVR5cGUob2JqW2xvY1Byb3BlcnR5XSk7XHJcblxyXG4gICAgaWYgKGV4cG9ydFByb3BzLmxlbmd0aCA9PSAwKVxyXG4gICAgICBjb25zb2xlLndhcm4oXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIE5lc3N1bmEgY29sb25uYSBjb25maWd1cmF0YSBkYSBlc3BvcnRhcmUhXCIpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0UHJvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHByb3AgPSBleHBvcnRQcm9wc1tpXTtcclxuICAgICAgbGV0IHByb3BCYXNlID0gXCJcIjtcclxuICAgICAgbGV0IHRvQ2FsbDogRnVuY3Rpb247XHJcbiAgICAgIGlmIChwcm9wLmVuZHNXaXRoKGxpc3RDc3ZIZHJQcmVmaXgpKSB7XHJcbiAgICAgICAgcHJvcEJhc2UgPSBwcm9wLnJlcGxhY2UobGlzdENzdkhkclByZWZpeCwgJycpO1xyXG4gICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VMaXN0LmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocHJvcC5lbmRzV2l0aChkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgsICcnKTtcclxuICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlRGljdGlvbmFyeS5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHByb3AuZW5kc1dpdGgoY3N2VmlzUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGNzdlZpc1ByZWZpeCwgJycpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW3Byb3BCYXNlICsgY3N2VmFsdWVOYXZpZ2F0b3JdICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZU9iamVjdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VQcm9wZXJ0eS5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodG9DYWxsKVxyXG4gICAgICAgIHRvQ2FsbChvYmosIHByb3BCYXNlLCBoZWFkZXJzLCBjb2x1bW5zU2VsZWN0aW9uLCBsb2MpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBzaW5nb2xhIHByb3ByaWV0w6AuIFxyXG4gICAqIFZpZW5lIGdlbmVyYXRvIGwnaGVhZGVyIGUgbGEgcHJvcHJpZXTDoCByZWxhdGl2YSBhbCB2YWxvcmUgZm9ybWF0dGF0byBvIG5vXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZSBcclxuICAgKiBAcGFyYW0ge0xvY2FsaXphdGlvblNlcnZpY2V9IGxvYyBTZXJ2aXppbyBkaSBsb2NhbGl6emF6aW9uZSBjaGUgdHJhZHVjZSB0dXR0aSBpIG5vbWkgY2hlIHB1w7JcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlUHJvcGVydHkob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgbGV0IHRvRW1pdDogYm9vbGVhbiA9IG9ialtwcm9wICsgY3N2VmlzUHJlZml4XTtcclxuICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IG9ialtwcm9wICsgY3N2Rm9ybWF0UHJlZml4XTtcclxuICAgIGxldCBwcm9wS2V5ID0gb2JqW3Byb3AgKyBjc3ZQcm9wS2V5XTtcclxuXHJcbiAgICBpZiAocHJvcEtleSAmJiAhY29sdW1uc1NlbGVjdGlvbltwcm9wS2V5XSAmJiBPYmplY3Qua2V5cyhjb2x1bW5zU2VsZWN0aW9uKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBDb2xvbm5hIGRhIG5vbiBlc3BvcnRhcmU6IFwiICsgcHJvcEtleSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGV4dCA9IG9ialtwcm9wICsgY3N2SGRyUHJlZml4XTtcclxuICAgIGxldCBsYWJlbCA9IGxvYyAmJiB0ZXh0ID8gbG9jLmxvYyh0ZXh0KSA6IHRleHQgfHwgXCJcIjtcclxuICAgIGxldCBvcmRlciA9IG9ialtwcm9wICsgY3N2T3JkUHJlZml4XTtcclxuXHJcbiAgICBpZiAoIXRvRW1pdClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNlIG5vbiBobyB1biBmb3JtYXRvIGVzcG9ydG8gZGlyZXR0YW1lbnRlXHJcbiAgICBpZiAoIWZvcm1hdCkge1xyXG4gICAgICAvLyBTZSDDqCB1biBmb3JtYXRvIGRhdGEgbWkgYXNzaWN1cm8gZGkgbm9uIHN0YW1wYXJlIG1haSB1bmEgZGF0YSAwMDowMDowMCBhbHRyaW1lbnRpIGluIGVzcG9ydGF6aW9uZSB2aWVuZSB1bm8gc2NoaWZvXHJcbiAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF0gPyB0aGlzLmRhdGVzLnRyaW1TZWNvbmRzKG9ialtwcm9wXS50b1N0cmluZygpKSA6IFwiXCI7XHJcbiAgICAgIGxldCBrZXkgPSBwcm9wICsgXCJfbm9mbXRcIjtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWwsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleSwgb3JkZXIsIHR5cGU6IFwic3RyaW5nXCIsIHByb3BLZXkgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQga2V5ID0gcHJvcCArIFwiX2ZtdFwiO1xyXG5cclxuICAgICAgLy8gQ2FzbyBmb3JtYXRvIG51bWVyaWNvXHJcbiAgICAgIGlmIChmb3JtYXQgPT0gXCJGXCIpIHtcclxuICAgICAgICAvLyBDaGVjayBjb25zaWRlcmFuZG8gbGEgcG9zc2liaWxpdMOgIGRpIHplcmlcclxuICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdICE9IG51bGwgPyBvYmpbcHJvcF0udG9TdHJpbmcoKSA6IFwiXCI7XHJcbiAgICAgICAgLy8gRWxpbWlubyB0dXR0ZSBsZSB2aXJnb2xlIChpbmRpY2F0b3JpIGRpIG1pZ2xpYWlhIHBlciBsYSBjdWx0dXJlIGRlZmF1bHQgZW4tVVMpXHJcbiAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLywvLCBcIlwiKTtcclxuICAgICAgICAvLyBJbCBzaW5nb2xvIHB1bnRvIGNoZSBjJ8OoLCBzZSBwcmVzZW50ZSAoc2VwYXJhdG9yZSBkZWNpbWFsaSkgbG8gdHJhc2Zvcm1vIGluIHZpcmdvbGFcclxuICAgICAgICBsZXQgdmFsQ29udmVydGVkID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWxDb252ZXJ0ZWQsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5LCBvcmRlciwgdHlwZTogXCJudW1iZXJcIiwgcHJvcEtleSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBTZSBobyB1biBmb3JtYXRvIGRhdGEgdHJhc2Zvcm1vIGluIGRheWpzLCBmb3JtYXR0byBlZCBlc3BvcnRvXHJcbiAgICAgICAgLy8gUGVyIGxhIHRyYXNmb3JtYXppb25lIGluIGRheWpzIHByb3ZvIHByaW1hIGEgcGFzc2FyZ2xpIGxhIHN0cmluZ2EgZGkgbmV0dG8sIHNwZXJhbmRvIGxhIHJpY29ub3NjYVxyXG4gICAgICAgIC8vIFNlIG5vbiBmdW56aW9uYSBwcm92byBhIGRlZmluaXJnbGkgbGEgZm9ybWF0dGF6aW9uZSBzdGFuZGFyZCBkZWwgbWV0ZXJpbmcgcGVyIHF1ZWwgbGluZ3VhZ2dpb1xyXG4gICAgICAgIGxldCB2YWwgPSB0aGlzLmRhdGVzLmdldEZvcm1hdHRlZChvYmpbcHJvcF0sIGZvcm1hdC5sZW5ndGggPD0gMTAsIGZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWwgPz8gXCJcIiwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXksIG9yZGVyLCB0eXBlOiBcImRhdGVcIiwgcHJvcEtleSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBzaW5nb2xhIHByb3ByaWV0w6AgZGEgdW4gb2dnZXR0by4gXHJcbiAgICogVmllbmUgZ2VuZXJhdG8gbCdoZWFkZXIgZSBsYSBwcm9wcmlldMOgIHJlbGF0aXZhIGFsIHZhbG9yZSBmb3JtYXR0YXRvIG8gbm8uIFxyXG4gICAqIFxyXG4gICAqIFBlciBvdHRlbmVyZSBpbCB2YWxvcmUgZSBsJ2hlYWRlciBkZWxsYSBwcm9wcmlldMOgIHZlbmdvbm8gdXRpbGl6emF0aSBpIG5hdmlnYXRvcmkgYXV0by1nZW5lcmF0aSBuZWwgZGVjb3JhdG9yZSAqKkV4cG9ydEFzKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VPYmplY3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICAvL3NlIHF1ZXN0YSBwcm9wcmlldMOgIGhhIHVuIG5hdmlnYXRvciBzaWduaWZpY2EgY2hlIGRlcml2YSBkYSB1biBvZ2dldHRvIGludGVybm8sIHJlY3VwZXJvIGlsIHZhbG9yZSBpbiBxdWVzdGEgZmFzZSBkYXRvIGNoZSBwcmltYSBub24gY2UgbCdob1xyXG4gICAgbGV0IHZhbHVlbmF2aWdhdG9yID0gb2JqW3Byb3AgKyBjc3ZWYWx1ZU5hdmlnYXRvcl07XHJcblxyXG4gICAgLy9Fcy4gZGkgdmFsdWVuYXZpZ2F0b3Igb2JqLnN1Ym9iai5zdWJzdWJvYmoucHJvcGVydHlcclxuICAgIGxldCBqbXBzID0gdmFsdWVuYXZpZ2F0b3Iuc3BsaXQoXCIuXCIpO1xyXG5cclxuICAgIC8vIExvY2FsaXp6YXppb25lIHByZXNhIGRhbGxhIGNsYXNzZSBiYXNlIHNlIGMnw6gsIGFsdHJpbWVudGkgZGFsbGEgY2xhc3NlIGludGVybmEgKGNpb8OoIGRhbCBwcmltbyBzYWx0aW5vKVxyXG4gICAgaWYgKCFsb2MpIHtcclxuICAgICAgbGV0IHR5cGUgPSBvYmpbcHJvcCArIGNzdlZhbHVlVHlwZV07XHJcbiAgICAgIGxldCBwcm90byA9IG5ldyB0eXBlKCk7XHJcbiAgICAgIGxvYyA9IHByb3RvW2xvY1Byb3BlcnR5XTtcclxuICAgIH1cclxuXHJcbiAgICAvL01pIGNsb25vIGwnb2dnZXR0byBvcmlnaW5hbGUgcGVyIG5vbiB1Y2NpZGVyZ2xpIGkgcmlmZXJpbWVudGlcclxuICAgIGxldCBjbG9uZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbiAgICAvL1NhbHRvIHJpY29yc2l2YW1lbnRlIHN1IG1lIHN0ZXNzbyBwZXIgYXJyaXZhcmUgYWxsYSBwcm9wcmlldMOgXHJcbiAgICAvL1NhbHRvIDEgPiBkaXZlbnRhIG9ialxyXG4gICAgLy9TYWx0byAyID4gZGl2ZW50YSBvYmouc3Vib2JqXHJcbiAgICAvL2VjYy4uLlxyXG4gICAgam1wcy5mb3JFYWNoKHBwID0+IHsgY2xvbmUgPSBjbG9uZVtwcF07IH0pO1xyXG5cclxuICAgIC8vVmFsb3JlIGZpbmFsZSA6RFxyXG4gICAgbGV0IHZhbHVlID0gY2xvbmU7XHJcblxyXG4gICAgbGV0IHRleHQgPSBvYmpbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgbGFiZWwgPSBsb2MgJiYgdGV4dCA/IGxvYy5sb2ModGV4dCkgOiB0ZXh0IHx8IFwiXCI7XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgLy9TZSBwZXIgcXVlc3RhIHByb3ByaWV0w6AgaG8gdW4gZm9ybWF0byBsbyBhcHBsaWNvXHJcbiAgICBsZXQgZm9ybWF0OiBzdHJpbmcgPSBvYmpbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyA9IFwic3RyaW5nXCI7XHJcbiAgICBpZiAoZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgIGxldCB2YWwgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICB2YWx1ZSA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcbiAgICAgIHR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm9ybWF0KSB7XHJcbiAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQodmFsdWUsIGZvcm1hdC5sZW5ndGggPD0gMTAsIGZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgIHR5cGUgPSBcImRhdGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5OiBwcm9wLCBvcmRlciwgdHlwZSwgcHJvcEtleTogbnVsbCB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgbGlzdGEgZGkgdmFsb3JpIHBpdm90dGF0aSBkaW5hbWljYW1lbnRlOlxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGlsIHZhbG9yZSB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBsJ2hlYWRlciB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBDb24gaWwgdmFsb3JlIGNpIGNyZW8gbGEgcHJvcGVydHlcclxuICAgKiBcclxuICAgKiA9PiBDb24gbCdoZWFkZXIgZSBpbCByaWZlcmltZW50byBhbGxhIHByb3BlcnR5IGFwcGVuYSBjcmVhdGEgY3JlbyB1biByZWNvcmQgbmVnbGkgaGVhZGVyIGRhIGVzcG9ydGFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUxpc3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBsZXQgaGVhZGVybmF2aWdhdG9yID0gb2JqW3Byb3AgKyBsaXN0Q3N2SGRyUHJlZml4XTtcclxuICAgIGxldCB2YWx1ZW5hdmlnYXRvciA9IG9ialtwcm9wICsgbGlzdENzdlZhbFByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVmb3JtYXQgPSBvYmpbcHJvcCArIGxpc3RDc3ZWYWxGb3JtYXRdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcblxyXG4gICAgICB2YXIgaGVhZGVyc3BsaXQgPSBoZWFkZXJuYXZpZ2F0b3Iuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gUGVyIGwnaGVhZGVyIHNpIGNvbnNpZGVyYSBhIHNlIHN0YW50ZSBvZ25pIHBlenpvIHNlcGFyYXRvIGRhIHNwYXppbyBwZXIgZmFyZSBsZSBjb25jYXRlbmF6aW9uaVxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9ICEhbG9jID8gbG9jLmxvYyh0bXBSZXMpIDogdG1wUmVzO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBqdW1wcyA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLlwiKTtcclxuICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgIGxldCB2YWx1ZSA9IHRtcFJlcztcclxuXHJcbiAgICAgIGxldCB0eXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2RhdGUnID0gXCJzdHJpbmdcIjtcclxuICAgICAgaWYgKHZhbHVlZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogXCJcIjtcclxuICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICAgIHZhbHVlID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuICAgICAgICB0eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh2YWx1ZWZvcm1hdCkge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQob2JqW3Byb3BdLCB2YWx1ZWZvcm1hdC5sZW5ndGggPD0gMTAsIHZhbHVlZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgICB0eXBlID0gXCJkYXRlXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AgKyBpZHgsIHsgdmFsdWU6IHZhbHVlID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleTogcHJvcCArIGlkeCwgb3JkZXI6IG9yZGVyICsgaWR4LCB0eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBsaXN0YSBkaSB2YWxvcmkgcGl2b3R0YXRpIGRpbmFtaWNhbWVudGU6XHJcbiAgICogXHJcbiAgICogPT4gUmVjdXBlcm8gaWwgdmFsb3JlIHV0aWxpenphbmRvIGkgbmF2aWdhdG9yaVxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGwnaGVhZGVyIHV0aWxpenphbmRvIGkgbmF2aWdhdG9yaVxyXG4gICAqIFxyXG4gICAqID0+IENvbiBpbCB2YWxvcmUgY2kgY3JlbyBsYSBwcm9wZXJ0eVxyXG4gICAqIFxyXG4gICAqID0+IENvbiBsJ2hlYWRlciBlIGlsIHJpZmVyaW1lbnRvIGFsbGEgcHJvcGVydHkgYXBwZW5hIGNyZWF0YSBjcmVvIHVuIHJlY29yZCBuZWdsaSBoZWFkZXIgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZVxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VEaWN0aW9uYXJ5KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgbGV0IGhlYWRlcm5hdmlnYXRvciA9IG9ialtwcm9wICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXhdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcbiAgICAgIHZhciBoZWFkZXJzcGxpdCA9IGhlYWRlcm5hdmlnYXRvci5zcGxpdChcIiBcIik7XHJcbiAgICAgIHZhciBsYWJlbCA9IFwiXCI7XHJcblxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9ICEhbG9jID8gbG9jLmxvYyh0bXBSZXMpIDogdG1wUmVzO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgdmFsdWVzcGxpdCA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgdmFsdWVzcGxpdC5mb3JFYWNoKCh0LCBpZHhpbnRlcm5hbCkgPT4ge1xyXG4gICAgICAgIHZhciBuYXZpZyA9IHQuc3BsaXQoXCItXCIpWzFdO1xyXG4gICAgICAgIHZhciBkZXNjID0gdC5zcGxpdChcIi1cIilbMF07XHJcblxyXG4gICAgICAgIGp1bXBzID0gbmF2aWcuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIHRtcFJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGlzdGl0ZW0pKTtcclxuICAgICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdG1wUmVzO1xyXG5cclxuICAgICAgICBsZXQgcHJvcG5hbWUgPSBwcm9wICsgaWR4LnRvU3RyaW5nKCkgKyBpZHhpbnRlcm5hbC50b1N0cmluZygpO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BuYW1lLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWw6IGxhYmVsICsgXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2MoZGVzYykgOiBkZXNjLCBrZXk6IHByb3BuYW1lLCBvcmRlcjogb3JkZXIgKyBpZHgsIHR5cGU6ICdzdHJpbmcnLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBFZmZldHR1YSBsJ2VzcG9ydGF6aW9uZSBpbiBmaWxlIENTViBcclxuICAgKi9cclxuICBwcml2YXRlIGV4cG9ydENTVihmbjogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGRhdGE6IGFueVtdKSB7XHJcbiAgICBsZXQgY3N2RGF0YSA9ICcnLCByb3cgPSAnJywgc2VwID0gJzsnO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgaCA9IGhlYWRlcnNbaV07XHJcbiAgICAgIHJvdyArPSBgJHtyb3cgIT0gJycgPyBzZXAgOiAnJ31cIiR7aC5sYWJlbH1cImA7XHJcbiAgICB9XHJcbiAgICBjc3ZEYXRhICs9IHJvdyArICdcXHJcXG4nO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICByb3cgPSAnJztcclxuICAgICAgbGV0IGl0ZW0gPSBkYXRhW2ldO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhlYWRlcnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBsZXQgdmFsID0gaXRlbVtoZWFkZXJzW2pdLmtleV07XHJcbiAgICAgICAgcm93ICs9IGAke3JvdyAhPSAnJyA/IHNlcCA6ICcnfVwiJHt2YWx9XCJgO1xyXG4gICAgICB9XHJcbiAgICAgIGNzdkRhdGEgKz0gcm93ICsgJ1xcclxcbic7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIEJPTSA9IG5ldyBVaW50OEFycmF5KFsweEVGLDB4QkIsMHhCRl0pO1xyXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbQk9NLCBjc3ZEYXRhXSwgeyB0eXBlOiAndGV4dC9jc3YnIH0pO1xyXG4gICAgdmFyIG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICB0aGlzLnV0aUV4dHMuZmlsZURvd25sb2FkKG9iamVjdFVybCwgZm4uZW5kc1dpdGgoJy54bHN4JykgPyBmbi5yZXBsYWNlKCcueGxzeCcsICcuY3N2JykgOiBmbi5lbmRzV2l0aCgnLmNzdicpID8gZm4gOiBmbiArIFwiLmNzdlwiKTtcclxuICB9XHJcblxyXG5cclxuICAvKiogQ2FjaGUgZGVsIG1vZHVsbyBwZXIgbCdlc3BvcnRhemlvbmUgRXhjZWwgKi9cclxuICBwcml2YXRlIEV4Y2VsSlM6IGFueTtcclxuXHJcbiAgLyoqIEVmZmV0dHVhIGwnZXNwb3J0YXppb25lIGRlbCBmaWxlIEV4Y2VsIGJhc2FuZG9zaSBzdWwgbW9kdWxvICoqRXhjZWxKUyoqLCBzdWdsaSBoZWFkZXIgKipoZWFkZXJzKiogZSBzdWkgZGF0aSAqKmRhdGEqKiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgZXhwb3J0RXhjZWwoZm46IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBkYXRhOiBhbnlbXSkge1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuRXhjZWxKUyA9IHRoaXMuRXhjZWxKUyB8fCBhd2FpdCBpbXBvcnQoXCJleGNlbGpzXCIpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2gge1xyXG4gICAgICB0aHJvdyBcIkltcG9zc2liaWxlIGNhcmljYXJlIGxhIGxpYnJlcmlhIHBlciBsJ2VzcG9ydGF6aW9uZSBpbiBFeGNlbFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpRml4ID0gMTtcclxuICAgIGxldCB3b3JrYm9vayA9IG5ldyB0aGlzLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIHdvcmtib29rLmNyZWF0b3IgPSBcIkVtYSdzIGJpZyBFcy1UYWJsZVwiO1xyXG4gICAgd29ya2Jvb2suY3JlYXRlZCA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgbGV0IHNoZWV0ID0gd29ya2Jvb2suYWRkV29ya3NoZWV0KCdEYXRhJyk7XHJcbiAgICBsZXQgaGVhZGVyID0gc2hlZXQuZ2V0Um93KDEpO1xyXG4gICAgaGVhZGVyLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNvcnQoKGE6IENzdkhlYWRlcnMsIGI6IENzdkhlYWRlcnMpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGggPSBoZWFkZXJzW2ldO1xyXG4gICAgICBoZWFkZXIuZ2V0Q2VsbChpICsgaUZpeCkudmFsdWUgPSBoLmxhYmVsO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcm93ID0gc2hlZXQuZ2V0Um93KGkgKyBpRml4ICsgMSk7XHJcbiAgICAgIGxldCBpdGVtID0gZGF0YVtpXTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGggPSBoZWFkZXJzW2ldO1xyXG4gICAgICAgIGxldCBjZWxsID0gcm93LmdldENlbGwoaSArIDEpO1xyXG4gICAgICAgIGxldCB2YWwgPSBpdGVtW2gua2V5XTtcclxuXHJcbiAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgIGNlbGwudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKGgudHlwZSkge1xyXG4gICAgICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgICAgIC8vIEV4Y2VsSlMgdmEgZGkgZGVmYXVsdCBpbiBVVEMgcXVpbmRpIHJpc2NoaWVyZWJiZSBkaSB0aXJhcmUgZ2nDuSAyIG9yZSBhZCBvZ25pIGVzcG9ydGF6aW9uZVxyXG4gICAgICAgICAgICAvLyBCaXNvZ25hIGFnZ2l1bmdlcmUgbCd1dGMgb2Zmc2V0IGFsbGEgZGF0YSBhdHR1YWxlXHJcbiAgICAgICAgICAgIGxldCBkYXRlID0gdGhpcy5kYXRlcy5nZXREYXRlQ29udmVydGlvbih2YWwpO1xyXG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xyXG4gICAgICAgICAgICAgIGxldCBjb3JyZWN0ZWREYXRlID0gZGF0ZS5hZGQoZGF0ZS51dGNPZmZzZXQoKSwgJ21pbnV0ZScpO1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSBjb3JyZWN0ZWREYXRlLnRvRGF0ZSgpO1xyXG4gICAgICAgICAgICAgIGNlbGwubnVtRm10ID0gdmFsLmxlbmd0aCA+IDEwID8gJ2RkL21tL3l5eXkgaDptOnMnIDogJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgICAgICBsZXQgY29udmVydGVkID0gcGFyc2VGbG9hdCh2YWwucmVwbGFjZSgnLCcsICcuJykpO1xyXG4gICAgICAgICAgICBjZWxsLnZhbHVlID0gaXNOYU4oY29udmVydGVkKSA/IFwiXCIgOiBjb252ZXJ0ZWQ7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJ1ZmZlciA9IGF3YWl0IHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKTtcclxuICAgIGxldCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldDtcIiB9KTtcclxuICAgIGxldCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgdGhpcy51dGlFeHRzLmZpbGVEb3dubG9hZChvYmplY3RVcmwsIGZuLmVuZHNXaXRoKCcuY3N2JykgPyBmbi5yZXBsYWNlKCcuY3N2JywgJy54bHN4JykgOiBmbi5lbmRzV2l0aCgnLnhsc3gnKSA/IGZuIDogZm4gKyBcIi54bHN4XCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGNoZSBlZmZldHRpdmFtZW50ZSBnZW5lcmEgZ2xpIGhlYWRlciBlIGkgZGF0aSBwZXIgbCdlc3BvcnRhemlvbmUgY29uICoqbmd4LWNzdioqXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueVtdfSBpdGVtcyBPZ2dldHRpIGRhIGVzcG9ydGFyZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBleHBvcnQoaXRlbXM6IGFueVtdLCBmb3JtYXQ6ICdDU1YnIHwgJ1hMU1gnLCBmaWxlTmFtZTogc3RyaW5nLCB0eXBlOiBUeXBlPGFueT4sIGNvbHVtbnNGaWx0ZXI/OiBzdHJpbmdbXSwgZ2VuZXJpY0hlYWRlcnM/OiBDc3ZIZWFkZXJzW10pIHtcclxuICAgIHZhciBjcmVhdGVkSXRlbXMgPSBpdGVtcy5tYXAodCA9PiB7XHJcbiAgICAgIGxldCB0bXAgPSBuZXcgdHlwZSgpO1xyXG4gICAgICBmb3IobGV0IHByb3BlcnR5IGluIHQpIHRtcFtwcm9wZXJ0eV0gPSB0W3Byb3BlcnR5XTtcclxuICAgICAgcmV0dXJuIHRtcDtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBoZWFkZXJzID0gZ2VuZXJpY0hlYWRlcnMgPyB0aGlzLnNldHVwRm9yR2VuZXJpY0V4cG9ydChjcmVhdGVkSXRlbXMsIGdlbmVyaWNIZWFkZXJzKSA6IHRoaXMuc2V0dXBGb3JFeHBvcnQoY3JlYXRlZEl0ZW1zLCBjb2x1bW5zRmlsdGVyKTtcclxuICAgIChmb3JtYXQgPT0gXCJDU1ZcIiA/IHRoaXMuZXhwb3J0Q1NWIDogdGhpcy5leHBvcnRFeGNlbCkuYmluZCh0aGlzKShmaWxlTmFtZSwgaGVhZGVycywgY3JlYXRlZEl0ZW1zKTtcclxuICB9XHJcbn0iXX0=
|
|
@@ -321,6 +321,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
321
321
|
* utilizzato dal servizio di esportazione per prendere il valore delle proprietà di un oggetto
|
|
322
322
|
*/
|
|
323
323
|
const csvValueNavigator = "_csvnav";
|
|
324
|
+
/** Suffisso con le informazioni del tipo per le esportazioni di oggetti */
|
|
325
|
+
const csvValueType = "_csvtype";
|
|
324
326
|
/** Suffisso della proprietà da generare in cui salvare l'ordine di esportazione */
|
|
325
327
|
const csvOrdPrefix = "_csvord";
|
|
326
328
|
/** Suffisso della proprietà da generare in cui salvare la visibilità di questa proprietà */
|
|
@@ -703,6 +705,7 @@ const ExportAs = (order, type, prefix) => (target, propertyKey) => {
|
|
|
703
705
|
Object.defineProperty(target, propertyKey + prop + csvValueNavigator, { value: propertyKey + "." + prop, writable: false });
|
|
704
706
|
Object.defineProperty(target, propertyKey + prop + csvVisPrefix, { value: toEmit, writable: false });
|
|
705
707
|
Object.defineProperty(target, propertyKey + prop + csvHdrPrefix, { value: (prefix ? prefix + ' ' : '') + lbl, writable: false });
|
|
708
|
+
Object.defineProperty(target, propertyKey + prop + csvValueType, { value: propertyKey + "." + prop, writable: false });
|
|
706
709
|
if (target[exportList])
|
|
707
710
|
target[exportList].push(propertyKey + prop + csvVisPrefix);
|
|
708
711
|
else
|
|
@@ -974,10 +977,14 @@ class ExportService {
|
|
|
974
977
|
parseObject(obj, prop, headers, loc) {
|
|
975
978
|
//se questa proprietà ha un navigator significa che deriva da un oggetto interno, recupero il valore in questa fase dato che prima non ce l'ho
|
|
976
979
|
let valuenavigator = obj[prop + csvValueNavigator];
|
|
977
|
-
// Localizzazione presa dalla classe base se c'è, altrimenti dalla classe interna
|
|
978
|
-
loc = loc || this.lc.generateFromType(obj[locProperty]);
|
|
979
980
|
//Es. di valuenavigator obj.subobj.subsubobj.property
|
|
980
981
|
let jmps = valuenavigator.split(".");
|
|
982
|
+
// Localizzazione presa dalla classe base se c'è, altrimenti dalla classe interna (cioè dal primo saltino)
|
|
983
|
+
if (!loc) {
|
|
984
|
+
let type = obj[prop + csvValueType];
|
|
985
|
+
let proto = new type();
|
|
986
|
+
loc = proto[locProperty];
|
|
987
|
+
}
|
|
981
988
|
//Mi clono l'oggetto originale per non uccidergli i riferimenti
|
|
982
989
|
let clone = JSON.parse(JSON.stringify(obj));
|
|
983
990
|
//Salto ricorsivamente su me stesso per arrivare alla proprietà
|