@eqproject/eqp-dynamic-module 2.10.104 → 2.10.105

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.
@@ -33,6 +33,13 @@ export class AddFormulaComponent {
33
33
  this.fullFieldMap = {};
34
34
  this.filteredFieldMap = {};
35
35
  this.recObj = new Array;
36
+ // comparator per il pipe keyvalue: ordina in base al percorso mostrato
37
+ // (per le voci semplici il valore è la stringa, per quelle con sottocampi si usa la chiave)
38
+ this.fieldMapComparator = (a, b) => {
39
+ const left = typeof a.value === "string" ? a.value : a.key;
40
+ const right = typeof b.value === "string" ? b.value : b.key;
41
+ return this.comparePaths(left, right);
42
+ };
36
43
  }
37
44
  //#region ngOnInit
38
45
  ngOnInit() {
@@ -50,16 +57,19 @@ export class AddFormulaComponent {
50
57
  this.fullFieldMap = this.getNestedPropertiesMap(this.formulaObject);
51
58
  // aggiungo i fields
52
59
  if (this.Fields != null && this.Fields.length > 0) {
53
- this.fullFieldMap.rec = [];
60
+ // mappa dei campi del record: chiave = "rec.Label",
61
+ // valore = stringa (campo semplice) oppure array di sottopercorsi (campo strutturato)
62
+ const recMap = {};
54
63
  this.recObj = [];
55
64
  let recFiller = (item, field) => {
56
- this.fullFieldMap.rec["rec." + field.Label] = [];
65
+ const paths = [];
57
66
  // funx per le chiavi degli oggetti
58
67
  Object.keys(item).forEach((key) => {
59
- // pusho tutte le chiavi
60
- // this.fullFieldMap.rec.push("rec." + field.Label + "." + key);//;[field.Label] = "";
61
- this.fullFieldMap.rec["rec." + field.Label].push("rec." + field.Label + "." + key); //;[field.Label] = "";
68
+ // raccolgo tutte le chiavi
69
+ paths.push("rec." + field.Label + "." + key);
62
70
  });
71
+ // ordino i sottocampi per facilitarne la ricerca
72
+ recMap["rec." + field.Label] = paths.sort((a, b) => this.comparePaths(a, b));
63
73
  };
64
74
  // per ogni campo preparo le stringhe per aiutare il configuratore e gli oggetti per l'eval
65
75
  this.Fields.forEach((field) => {
@@ -73,7 +83,7 @@ export class AddFormulaComponent {
73
83
  // field type 8 elengo generico
74
84
  // preparo l'oggetto per l'eval
75
85
  this.recObj[field.Label] = [];
76
- this.fullFieldMap.rec.push("rec." + field.Label);
86
+ recMap["rec." + field.Label] = "rec." + field.Label;
77
87
  }
78
88
  else if (field.FieldType == 7 || field.FieldType == 11 || field.FieldType == 13) {
79
89
  // field type 7, 11, 13 ha risultato di tipo DynAttachment o lista di tali
@@ -82,11 +92,19 @@ export class AddFormulaComponent {
82
92
  recFiller(this.recObj[field.Label], field);
83
93
  }
84
94
  else {
85
- this.fullFieldMap.rec.push("rec." + field.Label); //;[field.Label] = "";
95
+ recMap["rec." + field.Label] = "rec." + field.Label;
86
96
  this.recObj[field.Label] = undefined;
87
97
  }
88
98
  });
99
+ // ordino alfabeticamente le voci di rec per semplificare la ricerca dei campi
100
+ this.fullFieldMap.rec = this.sortFieldEntries(recMap);
89
101
  }
102
+ // ordino anche i percorsi provenienti dal contesto (ctx.*)
103
+ Object.keys(this.fullFieldMap).forEach((key) => {
104
+ if (Array.isArray(this.fullFieldMap[key])) {
105
+ this.fullFieldMap[key] = this.fullFieldMap[key].sort((a, b) => this.comparePaths(a, b));
106
+ }
107
+ });
90
108
  this.filteredFieldMap = this.fullFieldMap;
91
109
  GlobalService.debugLog("RESULT this.getNestedPropertiesMap", this.fullFieldMap);
92
110
  /////
@@ -125,9 +143,38 @@ export class AddFormulaComponent {
125
143
  const query = this.fieldSearched.toLowerCase();
126
144
  this.filteredFieldMap = {};
127
145
  for (const key in this.fullFieldMap) {
128
- const filtered = this.fullFieldMap[key].filter(path => path.toLowerCase().includes(query));
129
- if (filtered.length > 0) {
130
- this.filteredFieldMap[key] = filtered;
146
+ const group = this.fullFieldMap[key];
147
+ if (Array.isArray(group)) {
148
+ // gruppo semplice: array di percorsi (es. ctx.*)
149
+ const filtered = group.filter(path => path.toLowerCase().includes(query));
150
+ if (filtered.length > 0) {
151
+ this.filteredFieldMap[key] = filtered;
152
+ }
153
+ }
154
+ else if (group != null && typeof group === "object") {
155
+ // gruppo strutturato (rec): voci semplici o con sottocampi
156
+ const filtered = {};
157
+ Object.keys(group).forEach((entryKey) => {
158
+ const value = group[entryKey];
159
+ if (Array.isArray(value)) {
160
+ // se il nome del campo matcha tengo tutti i sottocampi, altrimenti filtro i sottocampi
161
+ if (entryKey.toLowerCase().includes(query)) {
162
+ filtered[entryKey] = value;
163
+ }
164
+ else {
165
+ const children = value.filter(path => path.toLowerCase().includes(query));
166
+ if (children.length > 0) {
167
+ filtered[entryKey] = children;
168
+ }
169
+ }
170
+ }
171
+ else if (typeof value === "string" && value.toLowerCase().includes(query)) {
172
+ filtered[entryKey] = value;
173
+ }
174
+ });
175
+ if (Object.keys(filtered).length > 0) {
176
+ this.filteredFieldMap[key] = filtered;
177
+ }
131
178
  }
132
179
  }
133
180
  }
@@ -332,16 +379,30 @@ export class AddFormulaComponent {
332
379
  return paths;
333
380
  }
334
381
  //#endregion getPropertyPaths
382
+ //#region ordinamento campi
383
+ // confronto alfabetico dei percorsi, case-insensitive e con numeri gestiti in modo naturale
384
+ comparePaths(a, b) {
385
+ return (a || "").localeCompare((b || ""), undefined, { sensitivity: "base", numeric: true });
386
+ }
387
+ // restituisce un nuovo oggetto con le stesse voci ordinate alfabeticamente per chiave
388
+ sortFieldEntries(map) {
389
+ const sorted = {};
390
+ Object.keys(map)
391
+ .sort((a, b) => this.comparePaths(a, b))
392
+ .forEach((key) => { sorted[key] = map[key]; });
393
+ return sorted;
394
+ }
395
+ //#endregion ordinamento campi
335
396
  isKeyValueList(list) {
336
397
  const result = Array.isArray(list) && list.length > 0;
337
398
  return result;
338
399
  }
339
400
  }
340
401
  AddFormulaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AddFormulaComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
341
- AddFormulaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AddFormulaComponent, selector: "eqp-dynamic-module-add-formula-component", viewQueries: [{ propertyName: "formulaTextArea", first: true, predicate: ["formula"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-9\">\r\n <div class=\"row\">\r\n <div class=\"col-12 pt-2\">\r\n <div class=\"p-1\">\r\n <textarea\r\n name=\"formula\"\r\n #formula\r\n type=\"textarea\"\r\n id=\"formula\"\r\n rows=\"10\"\r\n style=\"width: 100%\"\r\n class=\"droptarget\"\r\n (click)=\"lostFocus(formula)\"\r\n (keyup)=\"lostFocus(formula)\"\r\n (blur)=\"lostFocus(formula)\"\r\n (mouseup)=\"onDraggedField()\"\r\n [(ngModel)]=\"stringaFormula\"\r\n ></textarea>\r\n <div>\r\n <p *ngIf=\"error\" style=\"color:red;\">{{error}}</p>\r\n <p *ngIf=\"!error\"> Ok </p>\r\n <span>\r\n <button type=\"button\" (click)=\"this.chkFormula(stringaFormula)\"> Test formula </button>\r\n <span *ngIf=\"error\" class=\"ms-3\">\r\n <!-- Spesso in fondo all'errore ci sono due numeri traparentesi. Indicano rispettivamente la riga e il carattere. -->\r\n Tra parentesi indicato la riga e il carattere in cui vi \u00E8 errore\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"p-1 form-group\">\r\n <form method=\"POST\" class=\"alert alert-secondary\">\r\n <div class=\"w-100\">\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addDateNow()\"\r\n >\r\n dateNow\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addListStringrReader()\"\r\n >\r\n Leggi Elenco Txt\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addListNumberReader()\"\r\n >\r\n Leggi Elenco Num\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addArrayList()\"\r\n >\r\n ArrayList\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"\r\n addNumber(\r\n 'if( Condizione ) { se vera } else { se falsa }'\r\n )\r\n \"\r\n >\r\n IF\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber('/100')\"\r\n >\r\n %\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-danger\"\r\n (click)=\"clear()\"\r\n >\r\n C\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('/')\"\r\n >\r\n &divide;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore ,2)')\"\r\n >\r\n x<sup>2</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore ,3)')\"\r\n >\r\n x<sup>3</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore , potenza )')\"\r\n >\r\n x<sup>y</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber(' * 3.14 ')\"\r\n >\r\n &#x213C;\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('7')\"\r\n >\r\n 7\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('8')\"\r\n >\r\n 8\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('9')\"\r\n >\r\n 9\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('*')\"\r\n >\r\n &times;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.sqrt( valore )')\"\r\n >\r\n <sup>2</sup>&radic;x\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( radice , 1/ valore )')\"\r\n >\r\n <sup>y</sup>&radic;x\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.log( valore )')\"\r\n >\r\n ln\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.log10( valore )')\"\r\n >\r\n log\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('4')\"\r\n >\r\n 4\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('5')\"\r\n >\r\n 5\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('6')\"\r\n >\r\n 6\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('-')\"\r\n >\r\n &minus;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.sin( valore )')\"\r\n >\r\n sin\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.cos( valore )')\"\r\n >\r\n cos\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.tan( valore )')\"\r\n >\r\n tan\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber('* 2.718281828459045')\"\r\n >\r\n e\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('1')\"\r\n >\r\n 1\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('2')\"\r\n >\r\n 2\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('3')\"\r\n >\r\n 3\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('+')\"\r\n >\r\n &#43;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addElencoImmagini('ButtonKey')\"\r\n >\r\n Elenco Immagini: Chiave\r\n </button>\r\n </div>\r\n <div class=\"col\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addElencoImmagini('ButtonValue')\"\r\n >\r\n Elenco Immagini: Valore\r\n </button> \r\n </div>\r\n <div class=\"col\"></div>\r\n <div class=\"col\"></div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('0')\"\r\n >\r\n 0\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('.')\"\r\n >\r\n .\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-primary bg-danger text-white \"\r\n (click)=\"back()\"\r\n >\r\n \u274C Annulla\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\" [matTooltip]=\"error ? 'Testa la formula per abilitare' : 'Testa la formula e Salva \uD83D\uDE0A'\">\r\n <button\r\n [disabled]=\"error\"\r\n class=\"form-control btn btn-sm btn-primary bg-success text-white \"\r\n (click)=\"save()\"\r\n >\r\n \uD83D\uDCBE Salva\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3 p-2 overflow-auto\" style=\"max-height: 80vh;\">\r\n <mat-form-field class=\"example-full-width\">\r\n <mat-label>Ricerca</mat-label>\r\n <input\r\n matInput\r\n placeholder=\"Cerca campo\"\r\n [(ngModel)]=\"fieldSearched\"\r\n (input)=\"fieldSearchEvent()\"\r\n />\r\n <mat-icon matSuffix>search</mat-icon>\r\n </mat-form-field>\r\n \r\n <mat-accordion multi>\r\n <mat-expansion-panel *ngFor=\"let group of filteredFieldMap | keyvalue\">\r\n <!-- ACCORDION 1 LIVELLO -->\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ group.key }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <!-- CONTENUTO PRIMO LIVELLO -->\r\n <div\r\n cdkDropList\r\n cdkDropListOrientation=\"vertical\"\r\n class=\"example-list\"\r\n >\r\n <ng-container *ngFor=\"let field of group.value | keyvalue\" >\r\n <!-- SE NON CONTINE LISTA -->\r\n <div\r\n *ngIf=\"!isKeyValueList(field.value)\" \r\n class=\"example-box\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(field.value)\"\r\n [attr.data-drag-data]=\"field.value\"\r\n >\r\n {{ field.value }}\r\n </div>\r\n\r\n <!-- SE CONTIENE LISTA -->\r\n <div *ngIf=\"isKeyValueList(field.value)\">\r\n <mat-accordion multi class=\"nested-accordion\">\r\n \r\n <!-- HEADER SECONDO LIVELLO -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ field.key }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n \r\n <!-- CONTENUTO SECONDO LIVELLO -->\r\n <div *ngFor=\"let item of field.value\"\r\n class=\"example-box\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(item)\"\r\n [attr.data-drag-data]=\"item\"\r\n >\r\n {{ item }}\r\n </div>\r\n\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n\r\n\r\n </ng-container>\r\n\r\n </div>\r\n\r\n\r\n\r\n <!-- <div\r\n cdkDropList\r\n cdkDropListOrientation=\"vertical\"\r\n class=\"example-list\"\r\n >\r\n <div\r\n class=\"example-box\"\r\n *ngFor=\"let field of group.value\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(field)\"\r\n [attr.data-drag-data]=\"field\"\r\n >\r\n {{ field }}\r\n </div>\r\n </div> -->\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n \r\n </div>\r\n</div>\r\n", styles: [".col,.col-2,.col-12{padding-left:5px;padding-right:5px}.btn-xl{font-size:1.5rem;line-height:.9}.btn-sm{border-radius:0}@media (min-width: 420px){.d-lt-none{display:none!important}.d-lt-inline{display:inline!important}.d-lt-inline-block{display:inline-block!important}.d-lt-block{display:block!important}.d-lt-table{display:table!important}.d-lt-table-row{display:table-row!important}.d-lt-table-cell{display:table-cell!important}.d-lt-flex{display:flex!important}.d-lt-inline-flex{display:inline-flex!important}.mycol-2{flex:0 0 20%;max-width:20%}}.preview{padding:20px 10px;border-right:solid 1px #ccc;color:#ff0000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;text-align:center;cursor:move;background-color:#0ff;font-size:14px;flex-grow:1;flex-basis:0}.example-box{padding:20px 10px;border-right:solid 1px #ccc;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;text-align:center;cursor:move;background:white;font-size:14px;flex-grow:1;flex-basis:0}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list{min-width:100%;max-width:100%;border:solid 1px #ccc;min-height:60px;background:white;border-radius:4px;overflow:hidden}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.example-custom-placeholder{background:#ccc;border:dotted 3px #999;min-height:60px;transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-placeholder{opacity:0}.droptarget{float:left;margin:15px 100px 15px 15px;padding:10px;border:1px solid #aaaaaa}.blink{animation:blink-animation .4s steps(5,start) infinite;-webkit-animation:blink-animation .4s steps(5,start) infinite}@keyframes blink-animation{to{visibility:hidden}}.categories-item-drag{color:red!important;text-align:center;position:relative;line-height:2rem;padding:-.5rem}\n"], dependencies: [{ kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i4.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i4.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i4.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: i8.KeyValuePipe, name: "keyvalue" }] });
402
+ AddFormulaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AddFormulaComponent, selector: "eqp-dynamic-module-add-formula-component", viewQueries: [{ propertyName: "formulaTextArea", first: true, predicate: ["formula"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-9\">\r\n <div class=\"row\">\r\n <div class=\"col-12 pt-2\">\r\n <div class=\"p-1\">\r\n <textarea\r\n name=\"formula\"\r\n #formula\r\n type=\"textarea\"\r\n id=\"formula\"\r\n rows=\"10\"\r\n style=\"width: 100%\"\r\n class=\"droptarget\"\r\n (click)=\"lostFocus(formula)\"\r\n (keyup)=\"lostFocus(formula)\"\r\n (blur)=\"lostFocus(formula)\"\r\n (mouseup)=\"onDraggedField()\"\r\n [(ngModel)]=\"stringaFormula\"\r\n ></textarea>\r\n <div>\r\n <p *ngIf=\"error\" style=\"color:red;\">{{error}}</p>\r\n <p *ngIf=\"!error\"> Ok </p>\r\n <span>\r\n <button type=\"button\" (click)=\"this.chkFormula(stringaFormula)\"> Test formula </button>\r\n <span *ngIf=\"error\" class=\"ms-3\">\r\n <!-- Spesso in fondo all'errore ci sono due numeri traparentesi. Indicano rispettivamente la riga e il carattere. -->\r\n Tra parentesi indicato la riga e il carattere in cui vi \u00E8 errore\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"p-1 form-group\">\r\n <form method=\"POST\" class=\"alert alert-secondary\">\r\n <div class=\"w-100\">\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addDateNow()\"\r\n >\r\n dateNow\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addListStringrReader()\"\r\n >\r\n Leggi Elenco Txt\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addListNumberReader()\"\r\n >\r\n Leggi Elenco Num\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addArrayList()\"\r\n >\r\n ArrayList\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"\r\n addNumber(\r\n 'if( Condizione ) { se vera } else { se falsa }'\r\n )\r\n \"\r\n >\r\n IF\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber('/100')\"\r\n >\r\n %\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-danger\"\r\n (click)=\"clear()\"\r\n >\r\n C\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('/')\"\r\n >\r\n &divide;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore ,2)')\"\r\n >\r\n x<sup>2</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore ,3)')\"\r\n >\r\n x<sup>3</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore , potenza )')\"\r\n >\r\n x<sup>y</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber(' * 3.14 ')\"\r\n >\r\n &#x213C;\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('7')\"\r\n >\r\n 7\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('8')\"\r\n >\r\n 8\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('9')\"\r\n >\r\n 9\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('*')\"\r\n >\r\n &times;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.sqrt( valore )')\"\r\n >\r\n <sup>2</sup>&radic;x\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( radice , 1/ valore )')\"\r\n >\r\n <sup>y</sup>&radic;x\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.log( valore )')\"\r\n >\r\n ln\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.log10( valore )')\"\r\n >\r\n log\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('4')\"\r\n >\r\n 4\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('5')\"\r\n >\r\n 5\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('6')\"\r\n >\r\n 6\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('-')\"\r\n >\r\n &minus;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.sin( valore )')\"\r\n >\r\n sin\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.cos( valore )')\"\r\n >\r\n cos\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.tan( valore )')\"\r\n >\r\n tan\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber('* 2.718281828459045')\"\r\n >\r\n e\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('1')\"\r\n >\r\n 1\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('2')\"\r\n >\r\n 2\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('3')\"\r\n >\r\n 3\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('+')\"\r\n >\r\n &#43;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addElencoImmagini('ButtonKey')\"\r\n >\r\n Elenco Immagini: Chiave\r\n </button>\r\n </div>\r\n <div class=\"col\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addElencoImmagini('ButtonValue')\"\r\n >\r\n Elenco Immagini: Valore\r\n </button> \r\n </div>\r\n <div class=\"col\"></div>\r\n <div class=\"col\"></div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('0')\"\r\n >\r\n 0\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('.')\"\r\n >\r\n .\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-primary bg-danger text-white \"\r\n (click)=\"back()\"\r\n >\r\n \u274C Annulla\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\" [matTooltip]=\"error ? 'Testa la formula per abilitare' : 'Testa la formula e Salva \uD83D\uDE0A'\">\r\n <button\r\n [disabled]=\"error\"\r\n class=\"form-control btn btn-sm btn-primary bg-success text-white \"\r\n (click)=\"save()\"\r\n >\r\n \uD83D\uDCBE Salva\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3 p-2 overflow-auto\" style=\"max-height: 80vh;\">\r\n <mat-form-field class=\"example-full-width\">\r\n <mat-label>Ricerca</mat-label>\r\n <input\r\n matInput\r\n placeholder=\"Cerca campo\"\r\n [(ngModel)]=\"fieldSearched\"\r\n (input)=\"fieldSearchEvent()\"\r\n />\r\n <mat-icon matSuffix>search</mat-icon>\r\n </mat-form-field>\r\n \r\n <mat-accordion multi>\r\n <mat-expansion-panel *ngFor=\"let group of filteredFieldMap | keyvalue: fieldMapComparator\">\r\n <!-- ACCORDION 1 LIVELLO -->\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ group.key }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <!-- CONTENUTO PRIMO LIVELLO -->\r\n <div\r\n cdkDropList\r\n cdkDropListOrientation=\"vertical\"\r\n class=\"example-list\"\r\n >\r\n <ng-container *ngFor=\"let field of group.value | keyvalue: fieldMapComparator\" >\r\n <!-- SE NON CONTINE LISTA -->\r\n <div\r\n *ngIf=\"!isKeyValueList(field.value)\" \r\n class=\"example-box\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(field.value)\"\r\n [attr.data-drag-data]=\"field.value\"\r\n >\r\n {{ field.value }}\r\n </div>\r\n\r\n <!-- SE CONTIENE LISTA -->\r\n <div *ngIf=\"isKeyValueList(field.value)\">\r\n <mat-accordion multi class=\"nested-accordion\">\r\n \r\n <!-- HEADER SECONDO LIVELLO -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ field.key }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n \r\n <!-- CONTENUTO SECONDO LIVELLO -->\r\n <div *ngFor=\"let item of field.value\"\r\n class=\"example-box\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(item)\"\r\n [attr.data-drag-data]=\"item\"\r\n >\r\n {{ item }}\r\n </div>\r\n\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n\r\n\r\n </ng-container>\r\n\r\n </div>\r\n\r\n\r\n\r\n <!-- <div\r\n cdkDropList\r\n cdkDropListOrientation=\"vertical\"\r\n class=\"example-list\"\r\n >\r\n <div\r\n class=\"example-box\"\r\n *ngFor=\"let field of group.value\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(field)\"\r\n [attr.data-drag-data]=\"field\"\r\n >\r\n {{ field }}\r\n </div>\r\n </div> -->\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n \r\n </div>\r\n</div>\r\n", styles: [".col,.col-2,.col-12{padding-left:5px;padding-right:5px}.btn-xl{font-size:1.5rem;line-height:.9}.btn-sm{border-radius:0}@media (min-width: 420px){.d-lt-none{display:none!important}.d-lt-inline{display:inline!important}.d-lt-inline-block{display:inline-block!important}.d-lt-block{display:block!important}.d-lt-table{display:table!important}.d-lt-table-row{display:table-row!important}.d-lt-table-cell{display:table-cell!important}.d-lt-flex{display:flex!important}.d-lt-inline-flex{display:inline-flex!important}.mycol-2{flex:0 0 20%;max-width:20%}}.preview{padding:20px 10px;border-right:solid 1px #ccc;color:#ff0000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;text-align:center;cursor:move;background-color:#0ff;font-size:14px;flex-grow:1;flex-basis:0}.example-box{padding:20px 10px;border-right:solid 1px #ccc;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;text-align:center;cursor:move;background:white;font-size:14px;flex-grow:1;flex-basis:0}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list{min-width:100%;max-width:100%;border:solid 1px #ccc;min-height:60px;background:white;border-radius:4px;overflow:hidden}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.example-custom-placeholder{background:#ccc;border:dotted 3px #999;min-height:60px;transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-placeholder{opacity:0}.droptarget{float:left;margin:15px 100px 15px 15px;padding:10px;border:1px solid #aaaaaa}.blink{animation:blink-animation .4s steps(5,start) infinite;-webkit-animation:blink-animation .4s steps(5,start) infinite}@keyframes blink-animation{to{visibility:hidden}}.categories-item-drag{color:red!important;text-align:center;position:relative;line-height:2rem;padding:-.5rem}\n"], dependencies: [{ kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i4.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i4.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i4.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: i8.KeyValuePipe, name: "keyvalue" }] });
342
403
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AddFormulaComponent, decorators: [{
343
404
  type: Component,
344
- args: [{ selector: 'eqp-dynamic-module-add-formula-component', template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-9\">\r\n <div class=\"row\">\r\n <div class=\"col-12 pt-2\">\r\n <div class=\"p-1\">\r\n <textarea\r\n name=\"formula\"\r\n #formula\r\n type=\"textarea\"\r\n id=\"formula\"\r\n rows=\"10\"\r\n style=\"width: 100%\"\r\n class=\"droptarget\"\r\n (click)=\"lostFocus(formula)\"\r\n (keyup)=\"lostFocus(formula)\"\r\n (blur)=\"lostFocus(formula)\"\r\n (mouseup)=\"onDraggedField()\"\r\n [(ngModel)]=\"stringaFormula\"\r\n ></textarea>\r\n <div>\r\n <p *ngIf=\"error\" style=\"color:red;\">{{error}}</p>\r\n <p *ngIf=\"!error\"> Ok </p>\r\n <span>\r\n <button type=\"button\" (click)=\"this.chkFormula(stringaFormula)\"> Test formula </button>\r\n <span *ngIf=\"error\" class=\"ms-3\">\r\n <!-- Spesso in fondo all'errore ci sono due numeri traparentesi. Indicano rispettivamente la riga e il carattere. -->\r\n Tra parentesi indicato la riga e il carattere in cui vi \u00E8 errore\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"p-1 form-group\">\r\n <form method=\"POST\" class=\"alert alert-secondary\">\r\n <div class=\"w-100\">\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addDateNow()\"\r\n >\r\n dateNow\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addListStringrReader()\"\r\n >\r\n Leggi Elenco Txt\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addListNumberReader()\"\r\n >\r\n Leggi Elenco Num\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addArrayList()\"\r\n >\r\n ArrayList\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"\r\n addNumber(\r\n 'if( Condizione ) { se vera } else { se falsa }'\r\n )\r\n \"\r\n >\r\n IF\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber('/100')\"\r\n >\r\n %\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-danger\"\r\n (click)=\"clear()\"\r\n >\r\n C\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('/')\"\r\n >\r\n &divide;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore ,2)')\"\r\n >\r\n x<sup>2</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore ,3)')\"\r\n >\r\n x<sup>3</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore , potenza )')\"\r\n >\r\n x<sup>y</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber(' * 3.14 ')\"\r\n >\r\n &#x213C;\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('7')\"\r\n >\r\n 7\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('8')\"\r\n >\r\n 8\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('9')\"\r\n >\r\n 9\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('*')\"\r\n >\r\n &times;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.sqrt( valore )')\"\r\n >\r\n <sup>2</sup>&radic;x\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( radice , 1/ valore )')\"\r\n >\r\n <sup>y</sup>&radic;x\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.log( valore )')\"\r\n >\r\n ln\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.log10( valore )')\"\r\n >\r\n log\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('4')\"\r\n >\r\n 4\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('5')\"\r\n >\r\n 5\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('6')\"\r\n >\r\n 6\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('-')\"\r\n >\r\n &minus;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.sin( valore )')\"\r\n >\r\n sin\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.cos( valore )')\"\r\n >\r\n cos\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.tan( valore )')\"\r\n >\r\n tan\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber('* 2.718281828459045')\"\r\n >\r\n e\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('1')\"\r\n >\r\n 1\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('2')\"\r\n >\r\n 2\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('3')\"\r\n >\r\n 3\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('+')\"\r\n >\r\n &#43;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addElencoImmagini('ButtonKey')\"\r\n >\r\n Elenco Immagini: Chiave\r\n </button>\r\n </div>\r\n <div class=\"col\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addElencoImmagini('ButtonValue')\"\r\n >\r\n Elenco Immagini: Valore\r\n </button> \r\n </div>\r\n <div class=\"col\"></div>\r\n <div class=\"col\"></div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('0')\"\r\n >\r\n 0\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('.')\"\r\n >\r\n .\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-primary bg-danger text-white \"\r\n (click)=\"back()\"\r\n >\r\n \u274C Annulla\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\" [matTooltip]=\"error ? 'Testa la formula per abilitare' : 'Testa la formula e Salva \uD83D\uDE0A'\">\r\n <button\r\n [disabled]=\"error\"\r\n class=\"form-control btn btn-sm btn-primary bg-success text-white \"\r\n (click)=\"save()\"\r\n >\r\n \uD83D\uDCBE Salva\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3 p-2 overflow-auto\" style=\"max-height: 80vh;\">\r\n <mat-form-field class=\"example-full-width\">\r\n <mat-label>Ricerca</mat-label>\r\n <input\r\n matInput\r\n placeholder=\"Cerca campo\"\r\n [(ngModel)]=\"fieldSearched\"\r\n (input)=\"fieldSearchEvent()\"\r\n />\r\n <mat-icon matSuffix>search</mat-icon>\r\n </mat-form-field>\r\n \r\n <mat-accordion multi>\r\n <mat-expansion-panel *ngFor=\"let group of filteredFieldMap | keyvalue\">\r\n <!-- ACCORDION 1 LIVELLO -->\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ group.key }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <!-- CONTENUTO PRIMO LIVELLO -->\r\n <div\r\n cdkDropList\r\n cdkDropListOrientation=\"vertical\"\r\n class=\"example-list\"\r\n >\r\n <ng-container *ngFor=\"let field of group.value | keyvalue\" >\r\n <!-- SE NON CONTINE LISTA -->\r\n <div\r\n *ngIf=\"!isKeyValueList(field.value)\" \r\n class=\"example-box\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(field.value)\"\r\n [attr.data-drag-data]=\"field.value\"\r\n >\r\n {{ field.value }}\r\n </div>\r\n\r\n <!-- SE CONTIENE LISTA -->\r\n <div *ngIf=\"isKeyValueList(field.value)\">\r\n <mat-accordion multi class=\"nested-accordion\">\r\n \r\n <!-- HEADER SECONDO LIVELLO -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ field.key }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n \r\n <!-- CONTENUTO SECONDO LIVELLO -->\r\n <div *ngFor=\"let item of field.value\"\r\n class=\"example-box\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(item)\"\r\n [attr.data-drag-data]=\"item\"\r\n >\r\n {{ item }}\r\n </div>\r\n\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n\r\n\r\n </ng-container>\r\n\r\n </div>\r\n\r\n\r\n\r\n <!-- <div\r\n cdkDropList\r\n cdkDropListOrientation=\"vertical\"\r\n class=\"example-list\"\r\n >\r\n <div\r\n class=\"example-box\"\r\n *ngFor=\"let field of group.value\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(field)\"\r\n [attr.data-drag-data]=\"field\"\r\n >\r\n {{ field }}\r\n </div>\r\n </div> -->\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n \r\n </div>\r\n</div>\r\n", styles: [".col,.col-2,.col-12{padding-left:5px;padding-right:5px}.btn-xl{font-size:1.5rem;line-height:.9}.btn-sm{border-radius:0}@media (min-width: 420px){.d-lt-none{display:none!important}.d-lt-inline{display:inline!important}.d-lt-inline-block{display:inline-block!important}.d-lt-block{display:block!important}.d-lt-table{display:table!important}.d-lt-table-row{display:table-row!important}.d-lt-table-cell{display:table-cell!important}.d-lt-flex{display:flex!important}.d-lt-inline-flex{display:inline-flex!important}.mycol-2{flex:0 0 20%;max-width:20%}}.preview{padding:20px 10px;border-right:solid 1px #ccc;color:#ff0000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;text-align:center;cursor:move;background-color:#0ff;font-size:14px;flex-grow:1;flex-basis:0}.example-box{padding:20px 10px;border-right:solid 1px #ccc;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;text-align:center;cursor:move;background:white;font-size:14px;flex-grow:1;flex-basis:0}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list{min-width:100%;max-width:100%;border:solid 1px #ccc;min-height:60px;background:white;border-radius:4px;overflow:hidden}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.example-custom-placeholder{background:#ccc;border:dotted 3px #999;min-height:60px;transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-placeholder{opacity:0}.droptarget{float:left;margin:15px 100px 15px 15px;padding:10px;border:1px solid #aaaaaa}.blink{animation:blink-animation .4s steps(5,start) infinite;-webkit-animation:blink-animation .4s steps(5,start) infinite}@keyframes blink-animation{to{visibility:hidden}}.categories-item-drag{color:red!important;text-align:center;position:relative;line-height:2rem;padding:-.5rem}\n"] }]
405
+ args: [{ selector: 'eqp-dynamic-module-add-formula-component', template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-9\">\r\n <div class=\"row\">\r\n <div class=\"col-12 pt-2\">\r\n <div class=\"p-1\">\r\n <textarea\r\n name=\"formula\"\r\n #formula\r\n type=\"textarea\"\r\n id=\"formula\"\r\n rows=\"10\"\r\n style=\"width: 100%\"\r\n class=\"droptarget\"\r\n (click)=\"lostFocus(formula)\"\r\n (keyup)=\"lostFocus(formula)\"\r\n (blur)=\"lostFocus(formula)\"\r\n (mouseup)=\"onDraggedField()\"\r\n [(ngModel)]=\"stringaFormula\"\r\n ></textarea>\r\n <div>\r\n <p *ngIf=\"error\" style=\"color:red;\">{{error}}</p>\r\n <p *ngIf=\"!error\"> Ok </p>\r\n <span>\r\n <button type=\"button\" (click)=\"this.chkFormula(stringaFormula)\"> Test formula </button>\r\n <span *ngIf=\"error\" class=\"ms-3\">\r\n <!-- Spesso in fondo all'errore ci sono due numeri traparentesi. Indicano rispettivamente la riga e il carattere. -->\r\n Tra parentesi indicato la riga e il carattere in cui vi \u00E8 errore\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"p-1 form-group\">\r\n <form method=\"POST\" class=\"alert alert-secondary\">\r\n <div class=\"w-100\">\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addDateNow()\"\r\n >\r\n dateNow\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addListStringrReader()\"\r\n >\r\n Leggi Elenco Txt\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addListNumberReader()\"\r\n >\r\n Leggi Elenco Num\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addArrayList()\"\r\n >\r\n ArrayList\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"\r\n addNumber(\r\n 'if( Condizione ) { se vera } else { se falsa }'\r\n )\r\n \"\r\n >\r\n IF\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber('/100')\"\r\n >\r\n %\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-danger\"\r\n (click)=\"clear()\"\r\n >\r\n C\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('/')\"\r\n >\r\n &divide;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore ,2)')\"\r\n >\r\n x<sup>2</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore ,3)')\"\r\n >\r\n x<sup>3</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( valore , potenza )')\"\r\n >\r\n x<sup>y</sup>\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber(' * 3.14 ')\"\r\n >\r\n &#x213C;\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('7')\"\r\n >\r\n 7\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('8')\"\r\n >\r\n 8\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('9')\"\r\n >\r\n 9\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('*')\"\r\n >\r\n &times;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.sqrt( valore )')\"\r\n >\r\n <sup>2</sup>&radic;x\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.pow( radice , 1/ valore )')\"\r\n >\r\n <sup>y</sup>&radic;x\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.log( valore )')\"\r\n >\r\n ln\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.log10( valore )')\"\r\n >\r\n log\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('4')\"\r\n >\r\n 4\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('5')\"\r\n >\r\n 5\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('6')\"\r\n >\r\n 6\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('-')\"\r\n >\r\n &minus;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.sin( valore )')\"\r\n >\r\n sin\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.cos( valore )')\"\r\n >\r\n cos\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addSymbol('Math.tan( valore )')\"\r\n >\r\n tan\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addNumber('* 2.718281828459045')\"\r\n >\r\n e\r\n </button>\r\n </div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('1')\"\r\n >\r\n 1\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('2')\"\r\n >\r\n 2\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('3')\"\r\n >\r\n 3\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-xl btn-info\"\r\n (click)=\"addNumber('+')\"\r\n >\r\n &#43;\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row pt-2\">\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addElencoImmagini('ButtonKey')\"\r\n >\r\n Elenco Immagini: Chiave\r\n </button>\r\n </div>\r\n <div class=\"col\">\r\n <button\r\n class=\"form-control btn btn-sm btn-secondary\"\r\n (click)=\"addElencoImmagini('ButtonValue')\"\r\n >\r\n Elenco Immagini: Valore\r\n </button> \r\n </div>\r\n <div class=\"col\"></div>\r\n <div class=\"col\"></div>\r\n\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('0')\"\r\n >\r\n 0\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-success\"\r\n (click)=\"addNumber('.')\"\r\n >\r\n .\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\">\r\n <button\r\n class=\"form-control btn btn-sm btn-primary bg-danger text-white \"\r\n (click)=\"back()\"\r\n >\r\n \u274C Annulla\r\n </button>\r\n </div>\r\n <div class=\"col d-lt-flex\" [matTooltip]=\"error ? 'Testa la formula per abilitare' : 'Testa la formula e Salva \uD83D\uDE0A'\">\r\n <button\r\n [disabled]=\"error\"\r\n class=\"form-control btn btn-sm btn-primary bg-success text-white \"\r\n (click)=\"save()\"\r\n >\r\n \uD83D\uDCBE Salva\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3 p-2 overflow-auto\" style=\"max-height: 80vh;\">\r\n <mat-form-field class=\"example-full-width\">\r\n <mat-label>Ricerca</mat-label>\r\n <input\r\n matInput\r\n placeholder=\"Cerca campo\"\r\n [(ngModel)]=\"fieldSearched\"\r\n (input)=\"fieldSearchEvent()\"\r\n />\r\n <mat-icon matSuffix>search</mat-icon>\r\n </mat-form-field>\r\n \r\n <mat-accordion multi>\r\n <mat-expansion-panel *ngFor=\"let group of filteredFieldMap | keyvalue: fieldMapComparator\">\r\n <!-- ACCORDION 1 LIVELLO -->\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ group.key }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <!-- CONTENUTO PRIMO LIVELLO -->\r\n <div\r\n cdkDropList\r\n cdkDropListOrientation=\"vertical\"\r\n class=\"example-list\"\r\n >\r\n <ng-container *ngFor=\"let field of group.value | keyvalue: fieldMapComparator\" >\r\n <!-- SE NON CONTINE LISTA -->\r\n <div\r\n *ngIf=\"!isKeyValueList(field.value)\" \r\n class=\"example-box\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(field.value)\"\r\n [attr.data-drag-data]=\"field.value\"\r\n >\r\n {{ field.value }}\r\n </div>\r\n\r\n <!-- SE CONTIENE LISTA -->\r\n <div *ngIf=\"isKeyValueList(field.value)\">\r\n <mat-accordion multi class=\"nested-accordion\">\r\n \r\n <!-- HEADER SECONDO LIVELLO -->\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ field.key }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n \r\n <!-- CONTENUTO SECONDO LIVELLO -->\r\n <div *ngFor=\"let item of field.value\"\r\n class=\"example-box\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(item)\"\r\n [attr.data-drag-data]=\"item\"\r\n >\r\n {{ item }}\r\n </div>\r\n\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n\r\n\r\n </ng-container>\r\n\r\n </div>\r\n\r\n\r\n\r\n <!-- <div\r\n cdkDropList\r\n cdkDropListOrientation=\"vertical\"\r\n class=\"example-list\"\r\n >\r\n <div\r\n class=\"example-box\"\r\n *ngFor=\"let field of group.value\"\r\n cdkDrag\r\n draggable=\"true\"\r\n (cdkDragStarted)=\"onDragStarted(field)\"\r\n [attr.data-drag-data]=\"field\"\r\n >\r\n {{ field }}\r\n </div>\r\n </div> -->\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </div>\r\n \r\n </div>\r\n</div>\r\n", styles: [".col,.col-2,.col-12{padding-left:5px;padding-right:5px}.btn-xl{font-size:1.5rem;line-height:.9}.btn-sm{border-radius:0}@media (min-width: 420px){.d-lt-none{display:none!important}.d-lt-inline{display:inline!important}.d-lt-inline-block{display:inline-block!important}.d-lt-block{display:block!important}.d-lt-table{display:table!important}.d-lt-table-row{display:table-row!important}.d-lt-table-cell{display:table-cell!important}.d-lt-flex{display:flex!important}.d-lt-inline-flex{display:inline-flex!important}.mycol-2{flex:0 0 20%;max-width:20%}}.preview{padding:20px 10px;border-right:solid 1px #ccc;color:#ff0000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;text-align:center;cursor:move;background-color:#0ff;font-size:14px;flex-grow:1;flex-basis:0}.example-box{padding:20px 10px;border-right:solid 1px #ccc;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;text-align:center;cursor:move;background:white;font-size:14px;flex-grow:1;flex-basis:0}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list{min-width:100%;max-width:100%;border:solid 1px #ccc;min-height:60px;background:white;border-radius:4px;overflow:hidden}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.example-custom-placeholder{background:#ccc;border:dotted 3px #999;min-height:60px;transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-placeholder{opacity:0}.droptarget{float:left;margin:15px 100px 15px 15px;padding:10px;border:1px solid #aaaaaa}.blink{animation:blink-animation .4s steps(5,start) infinite;-webkit-animation:blink-animation .4s steps(5,start) infinite}@keyframes blink-animation{to{visibility:hidden}}.categories-item-drag{color:red!important;text-align:center;position:relative;line-height:2rem;padding:-.5rem}\n"] }]
345
406
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
346
407
  type: Inject,
347
408
  args: [MAT_DIALOG_DATA]
@@ -358,4 +419,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
358
419
  type: Component,
359
420
  args: [{ selector: 'dialog-data-example', template: "<h1 mat-dialog-title>Errore!</h1>\r\n<div mat-dialog-content>\r\n La funzione inserita contiene parentesi non chiuse! prima di salvare controlla la funzione.\r\n \r\n</div>" }]
360
421
  }], ctorParameters: function () { return []; } });
361
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZvcm11bGEtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2FkZC1mb3JtdWxhLWZpZWxkL2FkZC1mb3JtdWxhLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9hZGQtZm9ybXVsYS1maWVsZC9hZGQtZm9ybXVsYS1maWVsZC5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9hZGQtZm9ybXVsYS1maWVsZC9kaWFsb2ctZGF0YS1leGFtcGxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUE0QixTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7Ozs7Ozs7Ozs7QUFRL0UsTUFBTSxPQUFPLG1CQUFtQjtJQWlCOUIsWUFBNEMsSUFBUyxF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QyxNQUFNLFFBQVEsR0FBRyxHQUFHLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFFcEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3hFLG1HQUFtRztvQkFDbkcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDdkQ7cUJBQU07b0JBQ0wsdURBQXVEO29CQUN2RCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN0QjthQUNGO1NBQ0Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCw2QkFBNkI7SUFFN0IsY0FBYyxDQUFDLElBQVc7UUFDeEIsTUFBTSxNQUFNLEdBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN2RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztpSEE5V1UsbUJBQW1CLGtCQWlCVixlQUFlO3FHQWpCeEIsbUJBQW1CLGlOQ2pCaEMsdWtrQkE0ZEE7NEZEM2NhLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSwwQ0FBMEM7OzBCQXNCdkMsTUFBTTsyQkFBQyxlQUFlOytGQWZNLGVBQWU7c0JBQXZELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7QUFtWHpDLE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsZ0JBQWdCLENBQUM7O3FIQUROLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLDJERXRZcEMsZ0xBSU07NEZGa1lPLHVCQUF1QjtrQkFKbkMsU0FBUzsrQkFDRSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZydcclxuaW1wb3J0IHsgRm9ybXVsYSB9IGZyb20gJy4uLy4uLy4uL21vZHVsZXMvZm9ybXVsYS5tb2RlbCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IEJhc2VGaWVsZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2xvYmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgKiBhcyBhY29ybiBmcm9tIFwiYWNvcm5cIjtcclxuaW1wb3J0IHsgRHluQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uLy9tb2RlbHMvZHluQXR0YWNobWVudCc7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWVsZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvYXR0YWNobWVudEZpZWxkLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZXFwLWR5bmFtaWMtbW9kdWxlLWFkZC1mb3JtdWxhLWNvbXBvbmVudCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1mb3JtdWxhLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hZGQtZm9ybXVsYS1maWVsZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQWRkRm9ybXVsYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZm9ybXVsYScsIHsgc3RhdGljOiBmYWxzZSB9KSBmb3JtdWxhVGV4dEFyZWE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XHJcbiAgY2FyZXRQb3NpdGlvbjogbnVtYmVyID0gMDtcclxuICBmaWVsZE51bGw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGZpZWxkU2VhcmNoZWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgZm9ybXVsYSA9IG5ldyBGb3JtdWxhKCcwJyk7XHJcbiAgc3RyaW5nYUZvcm11bGE6IHN0cmluZyA9IFwiXCI7XHJcbiAgY291bnRlcjogbnVtYmVyID0gMDtcclxuICBGaWVsZHM6IEFycmF5PEJhc2VGaWVsZD4gPSBbXTtcclxuICBmaWVsZEJlaW5nRHJhZ2dlZDogYW55ID0gbnVsbDtcclxuICBmb3JtdWxhT2JqZWN0OiBhbnkgPSBudWxsO1xyXG4gIGZ1bGxGaWVsZE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCBhbnk+ID0ge307XHJcbiAgZmlsdGVyZWRGaWVsZE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XHJcbiAgcmVjT2JqOiBBcnJheTxhbnk+ID0gbmV3IEFycmF5PGFueT47XHJcbiAgZXJyb3I6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXHJcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWRkRm9ybXVsYUNvbXBvbmVudD4sXHJcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2cpIHtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBuZ09uSW5pdFxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5GaWVsZHMgPSB0aGlzLmRhdGEuZmllbGRzO1xyXG5cclxuICAgIC8vLy8vXHJcbiAgICAvLyAjcmVnaW9uIEdlc3Rpb25lIEZvcm11bGFPYmplY3RcclxuICAgIC8vLy8vXHJcbiAgICBpZiAodGhpcy5kYXRhLmZvcm11bGFPYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmZvcm11bGFPYmplY3QgPSB0aGlzLmRhdGEuZm9ybXVsYU9iamVjdDtcclxuICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkZPUk1VTEFPQkpFQ1QgQVNTRUdOQVRPXCIsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybXVsYU9iamVjdCA9PSBudWxsKSB7IHRoaXMuZm9ybXVsYU9iamVjdCA9IHt9OyB9XHJcblxyXG4gICAgdGhpcy5mdWxsRmllbGRNYXAgPSB0aGlzLmdldE5lc3RlZFByb3BlcnRpZXNNYXAodGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuXHJcbiAgICAvLyBhZ2dpdW5nbyBpIGZpZWxkc1xyXG4gICAgaWYgKHRoaXMuRmllbGRzICE9IG51bGwgJiYgdGhpcy5GaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZ1bGxGaWVsZE1hcC5yZWMgPSBbXTtcclxuICAgICAgdGhpcy5yZWNPYmogPSBbXTtcclxuXHJcbiAgICAgIGxldCByZWNGaWxsZXIgPSAoaXRlbSwgZmllbGQpID0+IHtcclxuICAgICAgICB0aGlzLmZ1bGxGaWVsZE1hcC5yZWNbXCJyZWMuXCIgKyBmaWVsZC5MYWJlbF0gPSBbXTtcclxuICAgICAgICAvLyBmdW54IHBlciBsZSBjaGlhdmkgZGVnbGkgb2dnZXR0aVxyXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goXHJcbiAgICAgICAgICAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHB1c2hvIHR1dHRlIGxlIGNoaWF2aVxyXG4gICAgICAgICAgICAvLyB0aGlzLmZ1bGxGaWVsZE1hcC5yZWMucHVzaChcInJlYy5cIiArIGZpZWxkLkxhYmVsICsgXCIuXCIgKyBrZXkpOy8vO1tmaWVsZC5MYWJlbF0gPSBcIlwiO1xyXG4gICAgICAgICAgICB0aGlzLmZ1bGxGaWVsZE1hcC5yZWNbXCJyZWMuXCIgKyBmaWVsZC5MYWJlbF0ucHVzaChcInJlYy5cIiArIGZpZWxkLkxhYmVsICsgXCIuXCIgKyBrZXkpOy8vO1tmaWVsZC5MYWJlbF0gPSBcIlwiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvLyBwZXIgb2duaSBjYW1wbyBwcmVwYXJvIGxlIHN0cmluZ2hlIHBlciBhaXV0YXJlIGlsIGNvbmZpZ3VyYXRvcmUgZSBnbGkgb2dnZXR0aSBwZXIgbCdldmFsXHJcbiAgICAgIHRoaXMuRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcblxyXG4gICAgICAgIGlmKGZpZWxkLkZpZWxkVHlwZSA9PSA2ICl7XHJcbiAgICAgICAgICAvLyBmaWVsZCB0eXBlIDYgw6ggdW4gYWxsZWdhdG9cclxuICAgICAgICAgIC8vIHByZXBhcm8gbCdvZ2dldHRvIHBlciBsJ2V2YWxcclxuICAgICAgICAgIHRoaXMucmVjT2JqW2ZpZWxkLkxhYmVsXSA9IG5ldyBBdHRhY2htZW50RmllbGQoKTtcclxuICAgICAgICAgIHJlY0ZpbGxlcih0aGlzLnJlY09ialtmaWVsZC5MYWJlbF0sIGZpZWxkKVxyXG4gICAgICAgIH0gZWxzZSBpZihmaWVsZC5GaWVsZFR5cGUgPT0gOCApe1xyXG4gICAgICAgICAgLy8gZmllbGQgdHlwZSA4IGVsZW5nbyBnZW5lcmljb1xyXG4gICAgICAgICAgLy8gcHJlcGFybyBsJ29nZ2V0dG8gcGVyIGwnZXZhbFxyXG4gICAgICAgICAgdGhpcy5yZWNPYmpbZmllbGQuTGFiZWxdID0gW107XHJcbiAgICAgICAgICB0aGlzLmZ1bGxGaWVsZE1hcC5yZWMucHVzaChcInJlYy5cIiArIGZpZWxkLkxhYmVsKTtcclxuICAgICAgICB9IGVsc2UgaWYoZmllbGQuRmllbGRUeXBlID09IDcgfHwgZmllbGQuRmllbGRUeXBlID09IDExIHx8IGZpZWxkLkZpZWxkVHlwZSA9PSAxMyApe1xyXG4gICAgICAgICAgLy8gZmllbGQgdHlwZSA3LCAxMSwgMTMgaGEgcmlzdWx0YXRvIGRpIHRpcG8gRHluQXR0YWNobWVudCBvIGxpc3RhIGRpIHRhbGlcclxuICAgICAgICAgIC8vIHByZXBhcm8gbCdvZ2dldHRvIHBlciBsJ2V2YWxcclxuICAgICAgICAgIHRoaXMucmVjT2JqW2ZpZWxkLkxhYmVsXSA9IG5ldyBEeW5BdHRhY2htZW50KCk7XHJcbiAgICAgICAgICByZWNGaWxsZXIodGhpcy5yZWNPYmpbZmllbGQuTGFiZWxdLCBmaWVsZClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5mdWxsRmllbGRNYXAucmVjLnB1c2goXCJyZWMuXCIgKyBmaWVsZC5MYWJlbCk7Ly87W2ZpZWxkLkxhYmVsXSA9IFwiXCI7XHJcbiAgICAgICAgICB0aGlzLnJlY09ialtmaWVsZC5MYWJlbF0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyZWRGaWVsZE1hcCA9IHRoaXMuZnVsbEZpZWxkTWFwO1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIlJFU1VMVCB0aGlzLmdldE5lc3RlZFByb3BlcnRpZXNNYXBcIiwgdGhpcy5mdWxsRmllbGRNYXApO1xyXG4gICAgLy8vLy9cclxuICAgIC8vICNlbmRyZWdpb24gR2VzdGlvbmUgRm9ybXVsYU9iamVjdFxyXG4gICAgLy8vLy9cclxuXHJcblxyXG5cclxuICAgIGlmICh0aGlzLkZpZWxkcyAhPSB1bmRlZmluZWQpXHJcbiAgICAgIGlmICh0aGlzLkZpZWxkcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHRoaXMuZmllbGROdWxsID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpZWxkTnVsbCA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5mb3JtdWxhICE9IHVuZGVmaW5lZCAmJiB0aGlzLmRhdGEuZm9ybXVsYSAhPSBudWxsICYmIHRoaXMuZGF0YS5mb3JtdWxhICE9IFwiXCIgJiYgdGhpcy5kYXRhLmZvcm11bGEgIT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5kYXRhLmZvcm11bGE7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZm9ybXVsYVwiLCB0aGlzLmRhdGEuZm9ybXVsYSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZvcm11bGFcIiwgXCJcIik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBuZ09uSW5pdFxyXG5cclxuICBjbGVhcigpOiBhbnkge1xyXG4gICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IFwiXCI7XHJcbiAgfVxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIHRoaXMuY2FyZXRQb3NpdGlvbiA9IHRoaXMuZm9ybXVsYVRleHRBcmVhLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgfVxyXG4gIGxvc3RGb2N1cyh0ZXh0QXJlYSkge1xyXG4gICAgdGhpcy5jYXJldFBvc2l0aW9uID0gdGV4dEFyZWEuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gZmllbGRTZWFyY2hFdmVudFxyXG4gIC8vIGZpZWxkU2VhcmNoRXZlbnQoKSB7XHJcbiAgLy8gICB0aGlzLmZpZWxkU2VhcmNoKHRoaXMuZmllbGRTZWFyY2hlZCk7XHJcbiAgLy8gfVxyXG4gIGZpZWxkU2VhcmNoRXZlbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZmllbGRTZWFyY2hlZC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgdGhpcy5maWx0ZXJlZEZpZWxkTWFwID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5mdWxsRmllbGRNYXApIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmZ1bGxGaWVsZE1hcFtrZXldLmZpbHRlcihwYXRoID0+XHJcbiAgICAgICAgcGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRGaWVsZE1hcFtrZXldID0gZmlsdGVyZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpZWxkU2VhcmNoKHRleHQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5GaWVsZHMgPSB0aGlzLmRhdGEuZmllbGRzLmZpbHRlcih4ID0+IHguTGFiZWwuaW5kZXhPZih0ZXh0KSAhPSAtMSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBmaWVsZFNlYXJjaEV2ZW50XHJcblxyXG4gIGJhY2soKSB7XHJcblxyXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmb3JtdWxhJykgIT0gdW5kZWZpbmVkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmb3JtdWxhJykgIT0gbnVsbCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZm9ybXVsYScpICE9IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBmb3JtdWxhOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZm9ybXVsYScpLnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdmb3JtdWxhJyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgZm9ybXVsYTogXCIgXCIgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRTeW1ib2wodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEudHJpbSgpXHJcbiAgICBsZXQgbGFzdENoYXIgPSB0aGlzLnN0cmluZ2FGb3JtdWxhLmNoYXJBdCh0aGlzLnN0cmluZ2FGb3JtdWxhLmxlbmd0aCAtIDEpO1xyXG4gICAgLy8gc2UgbCd1bHRpbW8gY2FyYXR0ZXJlIMOoIHVuIG9wZXJhdG9yZSBtYXRlbWF0aWNvIG1pIGxpbWl0byBhIGNvbmNhdGVuYXJlIGxhIGZvbXJ1bGFcclxuICAgIC8vIGFsdHJpbWVudGkgdmFkbyBhIG1vbHRpcGxpY2FyZSBxdWVsbG8gY2hlIGMnZXJhIHByaW1hIHBlciBsYSBmb3JtdWxhIGNoZSBzdG8gYWdnaXVuZ2VuZG9cclxuICAgIGNvbnN0IG5vbkNhbGNvbGFibGVDaGFycyA9IFsnKycsJy0nLCcqJywnLycsJygnLCdbJywnXScsJ3snLCd9JywnPCcsJz4nLCc9JywnOicsJzsnLCchJywnJ107XHJcbiAgICBpZiAoIG5vbkNhbGNvbGFibGVDaGFycy5pbmNsdWRlcyhsYXN0Q2hhcikpIHtcclxuICAgICAgaWYgKHRoaXMuY2FyZXRQb3NpdGlvbiAhPSAwKSB7XHJcbiAgICAgICAgdmFyIHN1YnN0cmluZ2EgPSB0aGlzLnN0cmluZ2FGb3JtdWxhLnN1YnN0cmluZygwLCB0aGlzLmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICAgIHN1YnN0cmluZ2EgPSBzdWJzdHJpbmdhLnRyaW0oKTtcclxuICAgICAgICBzdWJzdHJpbmdhID0gc3Vic3RyaW5nYSArIFwiIFwiICsgdmFsdWUgKyB0aGlzLnN0cmluZ2FGb3JtdWxhLnN1YnN0cmluZyh0aGlzLmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSBzdWJzdHJpbmdhO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSB0aGlzLnN0cmluZ2FGb3JtdWxhICsgXCIgXCIgKyB2YWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5jYXJldFBvc2l0aW9uICE9IDApIHtcclxuICAgICAgICB2YXIgc3Vic3RyaW5nYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEuc3Vic3RyaW5nKDAsIHRoaXMuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgICAgc3Vic3RyaW5nYSA9IHN1YnN0cmluZ2EudHJpbSgpO1xyXG4gICAgICAgIHN1YnN0cmluZ2EgPSBzdWJzdHJpbmdhICsgXCIgKiBcIiArIHZhbHVlICsgdGhpcy5zdHJpbmdhRm9ybXVsYS5zdWJzdHJpbmcodGhpcy5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gc3Vic3RyaW5nYTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5zdHJpbmdhRm9ybXVsYSArIFwiICogXCIgKyB2YWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZExpc3ROdW1iZXJSZWFkZXIoKSB7XHJcbiAgICB0aGlzLmNvdW50ZXIrKztcclxuICAgIGNvbnN0IHZhbHVlID0gXCJsZXQgdmFsdWVcIiArIHRoaXMuY291bnRlciArIFwiID0gMDsgbGV0IGVsZW5jb1wiICsgdGhpcy5jb3VudGVyICsgXCIgPSBJTlNFUklTQ0lfSUxfVFVPX0VMRU5DTzsgaWYgKGVsZW5jb1wiICsgdGhpcy5jb3VudGVyICsgXCIgIT0gbnVsbCAmJiBlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiLmNvbnN0cnVjdG9yID09IEFycmF5KXsgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiLmxlbmd0aDsgaSsrKSB7IHZhbHVlXCIgKyB0aGlzLmNvdW50ZXIgKyBcIiArPSBlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiW2ldOyB9IH0gZWxzZSB7IHZhbHVlXCIgKyB0aGlzLmNvdW50ZXIgKyBcIiA9IGVsZW5jb1wiICsgdGhpcy5jb3VudGVyICsgXCIgfVwiO1xyXG4gICAgdGhpcy5hZGROdW1iZXIodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgYWRkTGlzdFN0cmluZ3JSZWFkZXIoKSB7XHJcbiAgICB0aGlzLmNvdW50ZXIrKztcclxuICAgIGNvbnN0IHZhbHVlID0gXCJsZXQgdmFsdWVcIiArIHRoaXMuY291bnRlciArIFwiID0gXFxcIlxcXCI7IGxldCBlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiID0gSU5TRVJJU0NJX0lMX1RVT19FTEVOQ087IGlmIChlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiICE9IG51bGwgJiYgZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIi5jb25zdHJ1Y3RvciA9PSBBcnJheSl7IGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIi5sZW5ndGg7IGkrKykgeyB2YWx1ZVwiICsgdGhpcy5jb3VudGVyICsgXCIgKz0gZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIltpXTsgfSB9IGVsc2UgeyB2YWx1ZVwiICsgdGhpcy5jb3VudGVyICsgXCIgPSBlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiIH1cIjtcclxuICAgIHRoaXMuYWRkTnVtYmVyKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFkZEFycmF5TGlzdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY291bnRlcisrO1xyXG4gICAgY29uc3QgdmFsdWUgPSBcInZhciBvdXRwdXRMaXN0XCIgKyB0aGlzLmNvdW50ZXIgKyBcIiA9IHsgXFxcImtleVxcXCIgOiB2YWx1ZSAsIFxcXCJrZXkyXFxcIiA6IHZhbHVlMiB9OyBvdXRwdXRMaXN0XCIgKyB0aGlzLmNvdW50ZXIgKyBcIjtcIjtcclxuICAgIHRoaXMuYWRkTnVtYmVyKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFkZE51bWJlcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5zdHJpbmdhRm9ybXVsYS50cmltKCk7XHJcbiAgICBpZiAoVXRpbGl0eUhlbHBlclNlcnZpY2UuaXNOdW1lcmljKHZhbHVlKSkge1xyXG4gICAgICBpZiAodGhpcy5jYXJldFBvc2l0aW9uICE9IDApIHtcclxuICAgICAgICBsZXQgc3Vic3RyaW5nYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEuc3Vic3RyaW5nKDAsIHRoaXMuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgICAgc3Vic3RyaW5nYSA9IHN1YnN0cmluZ2EudHJpbSgpO1xyXG4gICAgICAgIHN1YnN0cmluZ2EgPSBzdWJzdHJpbmdhICsgdmFsdWUgKyB0aGlzLnN0cmluZ2FGb3JtdWxhLnN1YnN0cmluZyh0aGlzLmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSBzdWJzdHJpbmdhO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSB0aGlzLnN0cmluZ2FGb3JtdWxhICsgdmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jYXJldFBvc2l0aW9uICs9IDE7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHZhbHVlID09IFwiLlwiKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FyZXRQb3NpdGlvbiAhPSAwKSB7XHJcbiAgICAgICAgICBsZXQgc3Vic3RyaW5nYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEuc3Vic3RyaW5nKDAsIHRoaXMuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgICAgICBzdWJzdHJpbmdhID0gc3Vic3RyaW5nYS50cmltKCk7XHJcbiAgICAgICAgICBzdWJzdHJpbmdhID0gc3Vic3RyaW5nYSArIHZhbHVlICsgdGhpcy5zdHJpbmdhRm9ybXVsYS5zdWJzdHJpbmcodGhpcy5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSBzdWJzdHJpbmdhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSB0aGlzLnN0cmluZ2FGb3JtdWxhICsgdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmNhcmV0UG9zaXRpb24gIT0gMCkge1xyXG4gICAgICAgICAgbGV0IHN1YnN0cmluZ2EgPSB0aGlzLnN0cmluZ2FGb3JtdWxhLnN1YnN0cmluZygwLCB0aGlzLmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICAgICAgc3Vic3RyaW5nYSA9IHN1YnN0cmluZ2EudHJpbSgpO1xyXG4gICAgICAgICAgc3Vic3RyaW5nYSA9IHN1YnN0cmluZ2EgKyBcIiBcIiArIHZhbHVlICsgdGhpcy5zdHJpbmdhRm9ybXVsYS5zdWJzdHJpbmcodGhpcy5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSBzdWJzdHJpbmdhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSB0aGlzLnN0cmluZ2FGb3JtdWxhICsgXCIgXCIgKyB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jYXJldFBvc2l0aW9uICs9IDI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGREYXRlTm93KCkge1xyXG4gICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEgKyBcIiBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7IGRhdGUgXCI7XHJcbiAgfVxyXG5cclxuICBhZGRFbGVuY29JbW1hZ2luaShub21lY2hpYXZlKSB7XHJcbiAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5zdHJpbmdhRm9ybXVsYSArIFwiIGxldCBmaWVsZG5hbWUgPSAnTk9NRSBERUwgQ0FNUE8nOyByZWNbZmllbGRuYW1lXS5cIiArIG5vbWVjaGlhdmUgKyBcIiBcIjtcclxuICB9XHJcblxyXG4gIG9uRHJhZ2dlZEZpZWxkKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGRCZWluZ0RyYWdnZWQgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5zdHJpbmdhRm9ybXVsYS5zdWJzdHJpbmcoMCwgdGhpcy5jYXJldFBvc2l0aW9uKSArIHRoaXMuZmllbGRCZWluZ0RyYWdnZWQgKyBcIiBcIiArIHRoaXMuc3RyaW5nYUZvcm11bGEuc3Vic3RyaW5nKHRoaXMuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgIHRoaXMuY2FyZXRQb3NpdGlvbiA9IHRoaXMuc3RyaW5nYUZvcm11bGEubGVuZ3RoO1xyXG4gICAgICB0aGlzLmZpZWxkQmVpbmdEcmFnZ2VkID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRHJhZ1N0YXJ0ZWQobGFiZWwpIHtcclxuICAgIHRoaXMuZmllbGRCZWluZ0RyYWdnZWQgPSBsYWJlbDtcclxuICB9XHJcblxyXG4gIGNoa0Zvcm11bGEoZm9ybXVsYTogc3RyaW5nKXtcclxuXHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIGFjb3JuLnBhcnNlKGZvcm11bGEsIHsgZWNtYVZlcnNpb246IDIwMjAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yZSBkaSBzaW50YXNzaTpcIiwgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLmVycm9yID0gZXJyLm1lc3NhZ2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAgIC8vIDIuIENvbnRyb2xsbyBydW50aW1lXHJcbiAgICB0cnkgeyAgICAgIFxyXG4gICAgICAvLyEgcXVlc3RvIG1ldG9kbyDDqCBwacO5IHNpY3VybyBtYSByaWNoaWVkZSBkaSB0cmFzZm9ybWFyZSB0dXR0ZSBsZSB2ZWNjaGllIGZvcm11bGUgaW4gbW9kbyBkYSBhdmVyZSB1biByZXR1cm5cclxuICAgICAgLy8gY3JlbyB1bmEgZnVuemlvbmUgY2hlIGFjY2V0dGEgcmVjIGUgY3R4XHJcbiAgICAgIC8vIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKFwicmVjXCIsIFwiY3R4XCIsIGByZXR1cm4gJHtmb3JtdWxhfTtgKTtcclxuICAgICAgLy8gZXNlZ3VvIHBhc3NhbmRvIGkgdmFsb3JpXHJcbiAgICAgIC8vIGZuKHRoaXMuZnVsbEZpZWxkTWFwLnJlYywgdGhpcy5mb3JtdWxhT2JqZWN0KVxyXG5cclxuICAgICAgLy8hIHF1ZXN0byBtZXRvZG8gw6ggcG9jbyBzaWN1cm8gbWEgw6ggbmF0byBjb3PDrFxyXG4gICAgICBsZXQgcmVjID0gdGhpcy5yZWNPYmo7XHJcbiAgICAgIGxldCBjdHggPSB0aGlzLmZvcm11bGFPYmplY3Q7XHJcbiAgICAgIGNvbnN0IGV2YWx1YXRlZFZhbHVlID0gZXZhbChmb3JtdWxhKTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcmUgZGkgcnVudGltZTogXCIgKyBlcnIubWVzc2FnZSk7XHJcbiAgICAgIHRoaXMuZXJyb3IgPSBlcnIubWVzc2FnZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIHNhdmVcclxuICBzYXZlKCkge1xyXG4gICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEudHJpbSgpO1xyXG5cclxuICAgIHRoaXMuY2hrRm9ybXVsYSh0aGlzLnN0cmluZ2FGb3JtdWxhKTtcclxuXHJcbiAgICBpZih0aGlzLmVycm9yICE9IG51bGwpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLnN0cmluZ0NoZWNrUGFyZW50ZXNpcyh0aGlzLnN0cmluZ2FGb3JtdWxhKSkge1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZm9ybXVsYScpO1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IGZvcm11bGE6IHRoaXMuc3RyaW5nYUZvcm11bGEgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihEaWFsb2dEYXRhRXhhbXBsZURpYWxvZywge1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIHNhdmVcclxuXHJcbiAgLy8jcmVnaW9uIGdldE5lc3RlZFByb3BlcnRpZXNNYXBcclxuICAvL29iajogYW55OiDDqCBsJ29nZ2V0dG8gZGEgYW5hbGl6emFyZS5cclxuICAvL1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjogaW5kaWNhIGNoZSBpbCByaXN1bHRhdG8gc2Fyw6AgdW4gb2dnZXR0byBpIGN1aSBjYW1waSBzb25vIHN0cmluZ2hlLCBlIGkgdmFsb3JpIHNvbm8gYXJyYXkgZGkgc3RyaW5naGUuXHJcbiAgZ2V0TmVzdGVkUHJvcGVydGllc01hcChvYmo6IGFueSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB7XHJcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAvL0lsIGNvbnRyb2xsbyBjb24gaGFzT3duUHJvcGVydHkgc2VydmUgcGVyIGV2aXRhcmUgcHJvcHJpZXTDoCBlcmVkaXRhdGUgKGJ1b25hIHByYXRpY2EpXHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgIC8vU2UgaWwgdmFsb3JlIMOoIHVuIG9nZ2V0dG8sIGNoaWFtaWFtbyBnZXRQcm9wZXJ0eVBhdGhzIHBlciBvdHRlbmVyZSBpIHBlcmNvcnNpIGFubmlkYXRpLlxyXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmdldFByb3BlcnR5UGF0aHModmFsdWUsIFwiY3R4LlwiICsga2V5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy9BbHRyaW1lbnRpLCBzYWx2aWFtbyBzb2xvIGlsIG5vbWUgZGlyZXR0by5cclxuICAgICAgICAgIHJlc3VsdFtrZXldID0gW1wiY3R4LlwiICsga2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0TmVzdGVkUHJvcGVydGllc01hcFxyXG5cclxuICAvLyNyZWdpb24gZ2V0UHJvcGVydHlQYXRoc1xyXG4gIC8vIFJpY2V2ZSB1biBvZ2dldHRvIGRhIGVzcGxvcmFyZSBlIHVuIHByZWZpc3NvIChcInVzZXJcIiwgXCJtZWRcIiwgZWNjLikuXHJcbiAgLy9SZXN0aXR1aXNjZSB1biBhcnJheSBkaSBzdHJpbmdoZSBjb24gaSBwZXJjb3JzaSBkZWxsZSBwcm9wcmlldMOgIGZpZ2xpZS5cclxuICBnZXRQcm9wZXJ0eVBhdGhzKG9iajogYW55LCBwcmVmaXg6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgICAgLy9Db3N0cnVpc2NlIGlsIHBlcmNvcnNvIGNvbXBsZXRvXHJcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBgJHtwcmVmaXh9LiR7a2V5fWA7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAvL1NlIHRyb3ZpYW1vIHVuIG9nZ2V0dG8gYW5uaWRhdG8gKGVzLiBDbGluaWNMaWJyYXJ5KSwgY2hpYW1pYW1vIGRpIG51b3ZvIGxhIGZ1bnppb25lIChyaWNvcnNpb25lKS5cclxuICAgICAgICAgIHBhdGhzLnB1c2goLi4udGhpcy5nZXRQcm9wZXJ0eVBhdGhzKHZhbHVlLCBmdWxsUGF0aCkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL0FsdHJpbWVudGksIGFnZ2l1bmdpYW1vIGlsIHBlcmNvcnNvIGZpbmFsZSBhbGwnYXJyYXkuXHJcbiAgICAgICAgICBwYXRocy5wdXNoKGZ1bGxQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGF0aHM7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBnZXRQcm9wZXJ0eVBhdGhzXHJcblxyXG4gIGlzS2V5VmFsdWVMaXN0KGxpc3Q6IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByZXN1bHQgPSAgQXJyYXkuaXNBcnJheShsaXN0KSAmJiBsaXN0Lmxlbmd0aCA+IDA7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkaWFsb2ctZGF0YS1leGFtcGxlJyxcclxuICB0ZW1wbGF0ZVVybDogJ2RpYWxvZy1kYXRhLWV4YW1wbGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dEYXRhRXhhbXBsZURpYWxvZyB7XHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxufSIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgcHQtMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgICBuYW1lPVwiZm9ybXVsYVwiXHJcbiAgICAgICAgICAgICAgI2Zvcm11bGFcclxuICAgICAgICAgICAgICB0eXBlPVwidGV4dGFyZWFcIlxyXG4gICAgICAgICAgICAgIGlkPVwiZm9ybXVsYVwiXHJcbiAgICAgICAgICAgICAgcm93cz1cIjEwXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImRyb3B0YXJnZXRcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJsb3N0Rm9jdXMoZm9ybXVsYSlcIlxyXG4gICAgICAgICAgICAgIChrZXl1cCk9XCJsb3N0Rm9jdXMoZm9ybXVsYSlcIlxyXG4gICAgICAgICAgICAgIChibHVyKT1cImxvc3RGb2N1cyhmb3JtdWxhKVwiXHJcbiAgICAgICAgICAgICAgKG1vdXNldXApPVwib25EcmFnZ2VkRmllbGQoKVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdHJpbmdhRm9ybXVsYVwiXHJcbiAgICAgICAgICAgID48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxwICpuZ0lmPVwiZXJyb3JcIiBzdHlsZT1cImNvbG9yOnJlZDtcIj57e2Vycm9yfX08L3A+XHJcbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCIhZXJyb3JcIj4gT2sgPC9wPlxyXG4gICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRoaXMuY2hrRm9ybXVsYShzdHJpbmdhRm9ybXVsYSlcIj4gVGVzdCBmb3JtdWxhIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwibXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFNwZXNzbyBpbiBmb25kbyBhbGwnZXJyb3JlIGNpIHNvbm8gZHVlIG51bWVyaSB0cmFwYXJlbnRlc2kuIEluZGljYW5vIHJpc3BldHRpdmFtZW50ZSBsYSByaWdhIGUgaWwgY2FyYXR0ZXJlLiAtLT5cclxuICAgICAgICAgICAgICAgICAgVHJhIHBhcmVudGVzaSBpbmRpY2F0byBsYSByaWdhIGUgaWwgY2FyYXR0ZXJlIGluIGN1aSB2aSDDqCBlcnJvcmVcclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInAtMSBmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIG1ldGhvZD1cIlBPU1RcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXNlY29uZGFyeVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBwdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGREYXRlTm93KClcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGVOb3dcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRMaXN0U3RyaW5nclJlYWRlcigpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBMZWdnaSBFbGVuY28gVHh0XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTGlzdE51bWJlclJlYWRlcigpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBMZWdnaSBFbGVuY28gTnVtXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQXJyYXlMaXN0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGROdW1iZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmKCBDb25kaXppb25lICkgeyBzZSB2ZXJhIH0gZWxzZSB7IHNlIGZhbHNhIH0nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgSUZcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJy8xMDAnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgJVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBDXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXhsIGJ0bi1pbmZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJy8nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgJmRpdmlkZTtcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3ltYm9sKCdNYXRoLnBvdyggdmFsb3JlICwyKScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB4PHN1cD4yPC9zdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3ltYm9sKCdNYXRoLnBvdyggdmFsb3JlICwzKScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB4PHN1cD4zPC9zdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3ltYm9sKCdNYXRoLnBvdyggdmFsb3JlICwgcG90ZW56YSApJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHg8c3VwPnk8L3N1cD5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJyAqIDMuMTQgJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICYjeDIxM0M7XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignNycpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA3XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignOCcpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA4XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignOScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA5XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXhsIGJ0bi1pbmZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJyonKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgJnRpbWVzO1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBwdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRTeW1ib2woJ01hdGguc3FydCggdmFsb3JlICknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHN1cD4yPC9zdXA+JnJhZGljO3hcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRTeW1ib2woJ01hdGgucG93KCByYWRpY2UgLCAxLyB2YWxvcmUgKScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3VwPnk8L3N1cD4mcmFkaWM7eFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFN5bWJvbCgnTWF0aC5sb2coIHZhbG9yZSApJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIGxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3ltYm9sKCdNYXRoLmxvZzEwKCB2YWxvcmUgKScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBsb2dcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignNCcpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA0XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignNScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA1XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignNicpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA2XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXhsIGJ0bi1pbmZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJy0nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgJm1pbnVzO1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBwdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRTeW1ib2woJ01hdGguc2luKCB2YWxvcmUgKScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBzaW5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3ltYm9sKCdNYXRoLmNvcyggdmFsb3JlICknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgY29zXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFN5bWJvbCgnTWF0aC50YW4oIHZhbG9yZSApJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHRhblxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJyogMi43MTgyODE4Mjg0NTkwNDUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc3VjY2Vzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCcxJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDFcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc3VjY2Vzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCcyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDJcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc3VjY2Vzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCczJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDNcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4teGwgYnRuLWluZm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignKycpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAmIzQzO1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBwdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRFbGVuY29JbW1hZ2luaSgnQnV0dG9uS2V5JylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIEVsZW5jbyBJbW1hZ2luaTogQ2hpYXZlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRFbGVuY29JbW1hZ2luaSgnQnV0dG9uVmFsdWUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgRWxlbmNvIEltbWFnaW5pOiBWYWxvcmVcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignMCcpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignLicpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXByaW1hcnkgYmctZGFuZ2VyIHRleHQtd2hpdGUgXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIOKdjCBBbm51bGxhXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiIFttYXRUb29sdGlwXT1cImVycm9yID8gJ1Rlc3RhIGxhIGZvcm11bGEgcGVyIGFiaWxpdGFyZScgOiAnVGVzdGEgbGEgZm9ybXVsYSBlIFNhbHZhIPCfmIonXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXByaW1hcnkgYmctc3VjY2VzcyB0ZXh0LXdoaXRlIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICDwn5K+IFNhbHZhXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0zIHAtMiBvdmVyZmxvdy1hdXRvXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA4MHZoO1wiPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPlJpY2VyY2E8L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNlcmNhIGNhbXBvXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZmllbGRTZWFyY2hlZFwiXHJcbiAgICAgICAgICAoaW5wdXQpPVwiZmllbGRTZWFyY2hFdmVudCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+c2VhcmNoPC9tYXQtaWNvbj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIFxyXG4gICAgICA8bWF0LWFjY29yZGlvbiBtdWx0aT5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZmlsdGVyZWRGaWVsZE1hcCB8IGtleXZhbHVlXCI+XHJcbiAgICAgICAgICA8IS0tIEFDQ09SRElPTiAxIExJVkVMTE8gLS0+XHJcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgICAgICAge3sgZ3JvdXAua2V5IH19XHJcbiAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHJcbiAgICAgICAgICA8IS0tIENPTlRFTlVUTyBQUklNTyBMSVZFTExPIC0tPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjZGtEcm9wTGlzdFxyXG4gICAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwidmVydGljYWxcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtbGlzdFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZ3JvdXAudmFsdWUgfCBrZXl2YWx1ZVwiID5cclxuICAgICAgICAgICAgICA8IS0tIFNFIE5PTiBDT05USU5FIExJU1RBIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzS2V5VmFsdWVMaXN0KGZpZWxkLnZhbHVlKVwiIFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJleGFtcGxlLWJveFwiXHJcbiAgICAgICAgICAgICAgICBjZGtEcmFnXHJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvbkRyYWdTdGFydGVkKGZpZWxkLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRyYWctZGF0YV09XCJmaWVsZC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sgZmllbGQudmFsdWUgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBTRSBDT05USUVORSBMSVNUQSAtLT5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNLZXlWYWx1ZUxpc3QoZmllbGQudmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWFjY29yZGlvbiBtdWx0aSBjbGFzcz1cIm5lc3RlZC1hY2NvcmRpb25cIj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICA8IS0tIEhFQURFUiBTRUNPTkRPIExJVkVMTE8gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmtleSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDT05URU5VVE8gU0VDT05ETyBMSVZFTExPIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmllbGQudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJleGFtcGxlLWJveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjZGtEcmFnXHJcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvbkRyYWdTdGFydGVkKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZHJhZy1kYXRhXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0gfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgICAgICAgIDwhLS0gPGRpdlxyXG4gICAgICAgICAgICBjZGtEcm9wTGlzdFxyXG4gICAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwidmVydGljYWxcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtbGlzdFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtYm94XCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZ3JvdXAudmFsdWVcIlxyXG4gICAgICAgICAgICAgIGNka0RyYWdcclxuICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25EcmFnU3RhcnRlZChmaWVsZClcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtZHJhZy1kYXRhXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGZpZWxkIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgIDwvbWF0LWFjY29yZGlvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iLCI8aDEgbWF0LWRpYWxvZy10aXRsZT5FcnJvcmUhPC9oMT5cclxuPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgTGEgZnVuemlvbmUgaW5zZXJpdGEgY29udGllbmUgcGFyZW50ZXNpIG5vbiBjaGl1c2UhIHByaW1hIGRpIHNhbHZhcmUgY29udHJvbGxhIGxhIGZ1bnppb25lLlxyXG4gIFxyXG48L2Rpdj4iXX0=
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZvcm11bGEtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2FkZC1mb3JtdWxhLWZpZWxkL2FkZC1mb3JtdWxhLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9hZGQtZm9ybXVsYS1maWVsZC9hZGQtZm9ybXVsYS1maWVsZC5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9hZGQtZm9ybXVsYS1maWVsZC9kaWFsb2ctZGF0YS1leGFtcGxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUE0QixTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFM0csT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7Ozs7Ozs7Ozs7QUFRL0UsTUFBTSxPQUFPLG1CQUFtQjtJQWlCOUIsWUFBNEMsSUFBUyxFQUM1QyxTQUE0QyxFQUM1QyxNQUFpQjtRQUZrQixTQUFJLEdBQUosSUFBSSxDQUFLO1FBQzVDLGNBQVMsR0FBVCxTQUFTLENBQW1DO1FBQzVDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFoQjFCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFDMUIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsWUFBTyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDcEIsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFDOUIsc0JBQWlCLEdBQVEsSUFBSSxDQUFDO1FBQzlCLGtCQUFhLEdBQVEsSUFBSSxDQUFDO1FBQzFCLGlCQUFZLEdBQW1DLEVBQUUsQ0FBQztRQUNsRCxxQkFBZ0IsR0FBbUMsRUFBRSxDQUFDO1FBQ3RELFdBQU0sR0FBZSxJQUFJLEtBQVUsQ0FBQztRQW1acEMsdUVBQXVFO1FBQ3ZFLDRGQUE0RjtRQUM1Rix1QkFBa0IsR0FBRyxDQUFDLENBQXdCLEVBQUUsQ0FBd0IsRUFBVSxFQUFFO1lBQ2xGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDM0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQTtJQW5aRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRS9CLEtBQUs7UUFDTCxpQ0FBaUM7UUFDakMsS0FBSztRQUNMLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFO1lBQ25DLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDN0MsYUFBYSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFO1lBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7U0FBRTtRQUU1RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFcEUsb0JBQW9CO1FBQ3BCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELG9EQUFvRDtZQUNwRCxzRkFBc0Y7WUFDdEYsTUFBTSxNQUFNLEdBQXNDLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUVqQixJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO2dCQUMzQixtQ0FBbUM7Z0JBQ25DLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUN2QixDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNOLDJCQUEyQjtvQkFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQy9DLENBQUMsQ0FDRixDQUFDO2dCQUNGLGlEQUFpRDtnQkFDakQsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDO1lBRUYsMkZBQTJGO1lBQzNGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBRTVCLElBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQUU7b0JBQ3ZCLDZCQUE2QjtvQkFDN0IsK0JBQStCO29CQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNqRCxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7aUJBQzNDO3FCQUFNLElBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQUU7b0JBQzlCLCtCQUErQjtvQkFDL0IsK0JBQStCO29CQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2lCQUNyRDtxQkFBTSxJQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFO29CQUNoRiwwRUFBMEU7b0JBQzFFLCtCQUErQjtvQkFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDL0MsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFBO2lCQUMzQztxQkFBTTtvQkFDTCxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztvQkFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDO2lCQUN0QztZQUVILENBQUMsQ0FBQyxDQUFDO1lBRUgsOEVBQThFO1lBQzlFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2RDtRQUVELDJEQUEyRDtRQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6RjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDMUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEYsS0FBSztRQUNMLG9DQUFvQztRQUNwQyxLQUFLO1FBSUwsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLFNBQVM7WUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQ3hCO1FBRUgsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxXQUFXLEVBQUU7WUFDOUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN4QyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BEO2FBQU07WUFDTCxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFDRCxxQkFBcUI7SUFFckIsS0FBSztRQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUM7SUFDekUsQ0FBQztJQUNELFNBQVMsQ0FBQyxRQUFRO1FBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLHVCQUF1QjtJQUN2QiwwQ0FBMEM7SUFDMUMsSUFBSTtJQUNKLGdCQUFnQjtRQUNkLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUUzQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVyQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLGlEQUFpRDtnQkFDakQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUNuQyxDQUFDO2dCQUNGLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7aUJBQ3ZDO2FBQ0Y7aUJBQU0sSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDckQsMkRBQTJEO2dCQUMzRCxNQUFNLFFBQVEsR0FBc0MsRUFBRSxDQUFDO2dCQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUN0QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDeEIsdUZBQXVGO3dCQUN2RixJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQzFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7eUJBQzVCOzZCQUFNOzRCQUNMLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7NEJBQzFFLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQ3ZCLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7NkJBQy9CO3lCQUNGO3FCQUNGO3lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQzNFLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7cUJBQzVCO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDO2lCQUN2QzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQVk7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCw2QkFBNkI7SUFFN0IsSUFBSTtRQUVGLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxXQUFXLEVBQUU7WUFDN0ksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNwQzs7WUFFQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDaEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUUscUZBQXFGO1FBQ3JGLDJGQUEyRjtRQUMzRixNQUFNLGtCQUFrQixHQUFHLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUYsSUFBSyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdEUsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDL0IsVUFBVSxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDMUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7YUFDbEM7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7YUFDekQ7U0FFRjthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdEUsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDL0IsVUFBVSxHQUFHLFVBQVUsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDNUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7YUFDbEM7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7YUFDM0Q7U0FFRjtJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsTUFBTSxLQUFLLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3Q0FBd0MsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG9CQUFvQixHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0RBQW9ELEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHVCQUF1QixHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3ZZLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixNQUFNLEtBQUssR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHdDQUF3QyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxvREFBb0QsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHVCQUF1QixHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDMVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsd0RBQXdELEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDOUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pELElBQUksb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3pDLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUU7Z0JBQzNCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3RFLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQy9CLFVBQVUsR0FBRyxVQUFVLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7YUFDbEM7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQzthQUNuRDtZQUNELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDO1NBQ3pCO2FBQ0k7WUFDSCxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUU7b0JBQzNCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3RFLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQy9CLFVBQVUsR0FBRyxVQUFVLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDcEYsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7aUJBQ2xDO3FCQUNJO29CQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7aUJBQ25EO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRTtvQkFDM0IsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDdEUsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDL0IsVUFBVSxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDMUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7aUJBQ2xDO3FCQUNJO29CQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO2lCQUN6RDthQUNGO1lBQ0QsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRywrQkFBK0IsQ0FBQztJQUM5RSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsVUFBVTtRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsb0RBQW9ELEdBQUcsVUFBVSxHQUFHLEdBQUcsQ0FBQztJQUN0SCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksRUFBRTtZQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUosSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUNoRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFLO1FBQ2pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFlO1FBR3hCLElBQUk7WUFDRixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQzdDO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDekIsT0FBTztTQUNSO1FBRUMsdUJBQXVCO1FBQ3pCLElBQUk7WUFDRiw2R0FBNkc7WUFDN0csMENBQTBDO1lBQzFDLCtEQUErRDtZQUMvRCwyQkFBMkI7WUFDM0IsZ0RBQWdEO1lBRWhELDhDQUE4QztZQUM5QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3RCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDN0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3RDO1FBQUMsT0FBTyxHQUFRLEVBQUU7WUFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ3pCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxjQUFjO0lBQ2QsSUFBSTtRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVqRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVyQyxJQUFHLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFDO1lBQ3BCLE9BQU87U0FDUjtRQUVELElBQUksb0JBQW9CLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ25FLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDeEQ7YUFDSTtZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQ3pDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUNELGlCQUFpQjtJQUVqQixnQ0FBZ0M7SUFDaEMsc0NBQXNDO0lBQ3RDLGlJQUFpSTtJQUNqSSxzQkFBc0IsQ0FBQyxHQUFRO1FBQzdCLE1BQU0sTUFBTSxHQUE2QixFQUFFLENBQUM7UUFFNUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUU7WUFDckIsdUZBQXVGO1lBQ3ZGLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDbEQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV2QixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDeEUseUZBQXlGO29CQUN6RixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7aUJBQzFEO3FCQUFNO29CQUNMLDRDQUE0QztvQkFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2lCQUM5QjthQUNGO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0QsbUNBQW1DO0lBRW5DLDBCQUEwQjtJQUMxQixzRUFBc0U7SUFDdEUseUVBQXlFO0lBQ3pFLGdCQUFnQixDQUFDLEdBQVEsRUFBRSxNQUFjO1FBQ3ZDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUUzQixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtZQUNyQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ2xELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkIsaUNBQWlDO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxHQUFHLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFFcEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3hFLG1HQUFtRztvQkFDbkcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDdkQ7cUJBQU07b0JBQ0wsdURBQXVEO29CQUN2RCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN0QjthQUNGO1NBQ0Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCw2QkFBNkI7SUFFN0IsMkJBQTJCO0lBQzNCLDRGQUE0RjtJQUM1RixZQUFZLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDL0IsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLGdCQUFnQixDQUFDLEdBQXNDO1FBQ3JELE1BQU0sTUFBTSxHQUFzQyxFQUFFLENBQUM7UUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDYixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN2QyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBU0QsOEJBQThCO0lBRTlCLGNBQWMsQ0FBQyxJQUFXO1FBQ3hCLE1BQU0sTUFBTSxHQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDdkQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7aUhBN2FVLG1CQUFtQixrQkFpQlYsZUFBZTtxR0FqQnhCLG1CQUFtQixpTkNsQmhDLCtta0JBNGRBOzRGRDFjYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsMENBQTBDOzswQkFzQnZDLE1BQU07MkJBQUMsZUFBZTsrRkFmTSxlQUFlO3NCQUF2RCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7O0FBa2J6QyxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLGdCQUFnQixDQUFDOztxSEFETix1QkFBdUI7eUdBQXZCLHVCQUF1QiwyREV0Y3BDLGdMQUlNOzRGRmtjTyx1QkFBdUI7a0JBSm5DLFNBQVM7K0JBQ0UscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEluamVjdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZydcclxuaW1wb3J0IHsgRm9ybXVsYSB9IGZyb20gJy4uLy4uLy4uL21vZHVsZXMvZm9ybXVsYS5tb2RlbCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IEJhc2VGaWVsZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2xvYmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgKiBhcyBhY29ybiBmcm9tIFwiYWNvcm5cIjtcclxuaW1wb3J0IHsgRHluQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uLy9tb2RlbHMvZHluQXR0YWNobWVudCc7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWVsZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvYXR0YWNobWVudEZpZWxkLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZXFwLWR5bmFtaWMtbW9kdWxlLWFkZC1mb3JtdWxhLWNvbXBvbmVudCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1mb3JtdWxhLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hZGQtZm9ybXVsYS1maWVsZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQWRkRm9ybXVsYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZm9ybXVsYScsIHsgc3RhdGljOiBmYWxzZSB9KSBmb3JtdWxhVGV4dEFyZWE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XHJcbiAgY2FyZXRQb3NpdGlvbjogbnVtYmVyID0gMDtcclxuICBmaWVsZE51bGw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGZpZWxkU2VhcmNoZWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgZm9ybXVsYSA9IG5ldyBGb3JtdWxhKCcwJyk7XHJcbiAgc3RyaW5nYUZvcm11bGE6IHN0cmluZyA9IFwiXCI7XHJcbiAgY291bnRlcjogbnVtYmVyID0gMDtcclxuICBGaWVsZHM6IEFycmF5PEJhc2VGaWVsZD4gPSBbXTtcclxuICBmaWVsZEJlaW5nRHJhZ2dlZDogYW55ID0gbnVsbDtcclxuICBmb3JtdWxhT2JqZWN0OiBhbnkgPSBudWxsO1xyXG4gIGZ1bGxGaWVsZE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCBhbnk+ID0ge307XHJcbiAgZmlsdGVyZWRGaWVsZE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCBhbnk+ID0ge307XHJcbiAgcmVjT2JqOiBBcnJheTxhbnk+ID0gbmV3IEFycmF5PGFueT47XHJcbiAgZXJyb3I6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXHJcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWRkRm9ybXVsYUNvbXBvbmVudD4sXHJcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2cpIHtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBuZ09uSW5pdFxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5GaWVsZHMgPSB0aGlzLmRhdGEuZmllbGRzO1xyXG5cclxuICAgIC8vLy8vXHJcbiAgICAvLyAjcmVnaW9uIEdlc3Rpb25lIEZvcm11bGFPYmplY3RcclxuICAgIC8vLy8vXHJcbiAgICBpZiAodGhpcy5kYXRhLmZvcm11bGFPYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmZvcm11bGFPYmplY3QgPSB0aGlzLmRhdGEuZm9ybXVsYU9iamVjdDtcclxuICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkZPUk1VTEFPQkpFQ1QgQVNTRUdOQVRPXCIsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybXVsYU9iamVjdCA9PSBudWxsKSB7IHRoaXMuZm9ybXVsYU9iamVjdCA9IHt9OyB9XHJcblxyXG4gICAgdGhpcy5mdWxsRmllbGRNYXAgPSB0aGlzLmdldE5lc3RlZFByb3BlcnRpZXNNYXAodGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuXHJcbiAgICAvLyBhZ2dpdW5nbyBpIGZpZWxkc1xyXG4gICAgaWYgKHRoaXMuRmllbGRzICE9IG51bGwgJiYgdGhpcy5GaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBtYXBwYSBkZWkgY2FtcGkgZGVsIHJlY29yZDogY2hpYXZlID0gXCJyZWMuTGFiZWxcIixcclxuICAgICAgLy8gdmFsb3JlID0gc3RyaW5nYSAoY2FtcG8gc2VtcGxpY2UpIG9wcHVyZSBhcnJheSBkaSBzb3R0b3BlcmNvcnNpIChjYW1wbyBzdHJ1dHR1cmF0bylcclxuICAgICAgY29uc3QgcmVjTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSB7fTtcclxuICAgICAgdGhpcy5yZWNPYmogPSBbXTtcclxuXHJcbiAgICAgIGxldCByZWNGaWxsZXIgPSAoaXRlbSwgZmllbGQpID0+IHtcclxuICAgICAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICAvLyBmdW54IHBlciBsZSBjaGlhdmkgZGVnbGkgb2dnZXR0aVxyXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goXHJcbiAgICAgICAgICAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHJhY2NvbGdvIHR1dHRlIGxlIGNoaWF2aVxyXG4gICAgICAgICAgICBwYXRocy5wdXNoKFwicmVjLlwiICsgZmllbGQuTGFiZWwgKyBcIi5cIiArIGtleSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBvcmRpbm8gaSBzb3R0b2NhbXBpIHBlciBmYWNpbGl0YXJuZSBsYSByaWNlcmNhXHJcbiAgICAgICAgcmVjTWFwW1wicmVjLlwiICsgZmllbGQuTGFiZWxdID0gcGF0aHMuc29ydCgoYSwgYikgPT4gdGhpcy5jb21wYXJlUGF0aHMoYSwgYikpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gcGVyIG9nbmkgY2FtcG8gcHJlcGFybyBsZSBzdHJpbmdoZSBwZXIgYWl1dGFyZSBpbCBjb25maWd1cmF0b3JlIGUgZ2xpIG9nZ2V0dGkgcGVyIGwnZXZhbFxyXG4gICAgICB0aGlzLkZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG5cclxuICAgICAgICBpZihmaWVsZC5GaWVsZFR5cGUgPT0gNiApe1xyXG4gICAgICAgICAgLy8gZmllbGQgdHlwZSA2IMOoIHVuIGFsbGVnYXRvXHJcbiAgICAgICAgICAvLyBwcmVwYXJvIGwnb2dnZXR0byBwZXIgbCdldmFsXHJcbiAgICAgICAgICB0aGlzLnJlY09ialtmaWVsZC5MYWJlbF0gPSBuZXcgQXR0YWNobWVudEZpZWxkKCk7XHJcbiAgICAgICAgICByZWNGaWxsZXIodGhpcy5yZWNPYmpbZmllbGQuTGFiZWxdLCBmaWVsZClcclxuICAgICAgICB9IGVsc2UgaWYoZmllbGQuRmllbGRUeXBlID09IDggKXtcclxuICAgICAgICAgIC8vIGZpZWxkIHR5cGUgOCBlbGVuZ28gZ2VuZXJpY29cclxuICAgICAgICAgIC8vIHByZXBhcm8gbCdvZ2dldHRvIHBlciBsJ2V2YWxcclxuICAgICAgICAgIHRoaXMucmVjT2JqW2ZpZWxkLkxhYmVsXSA9IFtdO1xyXG4gICAgICAgICAgcmVjTWFwW1wicmVjLlwiICsgZmllbGQuTGFiZWxdID0gXCJyZWMuXCIgKyBmaWVsZC5MYWJlbDtcclxuICAgICAgICB9IGVsc2UgaWYoZmllbGQuRmllbGRUeXBlID09IDcgfHwgZmllbGQuRmllbGRUeXBlID09IDExIHx8IGZpZWxkLkZpZWxkVHlwZSA9PSAxMyApe1xyXG4gICAgICAgICAgLy8gZmllbGQgdHlwZSA3LCAxMSwgMTMgaGEgcmlzdWx0YXRvIGRpIHRpcG8gRHluQXR0YWNobWVudCBvIGxpc3RhIGRpIHRhbGlcclxuICAgICAgICAgIC8vIHByZXBhcm8gbCdvZ2dldHRvIHBlciBsJ2V2YWxcclxuICAgICAgICAgIHRoaXMucmVjT2JqW2ZpZWxkLkxhYmVsXSA9IG5ldyBEeW5BdHRhY2htZW50KCk7XHJcbiAgICAgICAgICByZWNGaWxsZXIodGhpcy5yZWNPYmpbZmllbGQuTGFiZWxdLCBmaWVsZClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVjTWFwW1wicmVjLlwiICsgZmllbGQuTGFiZWxdID0gXCJyZWMuXCIgKyBmaWVsZC5MYWJlbDtcclxuICAgICAgICAgIHRoaXMucmVjT2JqW2ZpZWxkLkxhYmVsXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIG9yZGlubyBhbGZhYmV0aWNhbWVudGUgbGUgdm9jaSBkaSByZWMgcGVyIHNlbXBsaWZpY2FyZSBsYSByaWNlcmNhIGRlaSBjYW1waVxyXG4gICAgICB0aGlzLmZ1bGxGaWVsZE1hcC5yZWMgPSB0aGlzLnNvcnRGaWVsZEVudHJpZXMocmVjTWFwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBvcmRpbm8gYW5jaGUgaSBwZXJjb3JzaSBwcm92ZW5pZW50aSBkYWwgY29udGVzdG8gKGN0eC4qKVxyXG4gICAgT2JqZWN0LmtleXModGhpcy5mdWxsRmllbGRNYXApLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZ1bGxGaWVsZE1hcFtrZXldKSkge1xyXG4gICAgICAgIHRoaXMuZnVsbEZpZWxkTWFwW2tleV0gPSB0aGlzLmZ1bGxGaWVsZE1hcFtrZXldLnNvcnQoKGEsIGIpID0+IHRoaXMuY29tcGFyZVBhdGhzKGEsIGIpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZEZpZWxkTWFwID0gdGhpcy5mdWxsRmllbGRNYXA7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiUkVTVUxUIHRoaXMuZ2V0TmVzdGVkUHJvcGVydGllc01hcFwiLCB0aGlzLmZ1bGxGaWVsZE1hcCk7XHJcbiAgICAvLy8vL1xyXG4gICAgLy8gI2VuZHJlZ2lvbiBHZXN0aW9uZSBGb3JtdWxhT2JqZWN0XHJcbiAgICAvLy8vL1xyXG5cclxuXHJcblxyXG4gICAgaWYgKHRoaXMuRmllbGRzICE9IHVuZGVmaW5lZClcclxuICAgICAgaWYgKHRoaXMuRmllbGRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5maWVsZE51bGwgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmllbGROdWxsID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLmZvcm11bGEgIT0gdW5kZWZpbmVkICYmIHRoaXMuZGF0YS5mb3JtdWxhICE9IG51bGwgJiYgdGhpcy5kYXRhLmZvcm11bGEgIT0gXCJcIiAmJiB0aGlzLmRhdGEuZm9ybXVsYSAhPSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSB0aGlzLmRhdGEuZm9ybXVsYTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJmb3JtdWxhXCIsIHRoaXMuZGF0YS5mb3JtdWxhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZm9ybXVsYVwiLCBcIlwiKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIG5nT25Jbml0XHJcblxyXG4gIGNsZWFyKCk6IGFueSB7XHJcbiAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gXCJcIjtcclxuICB9XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5jYXJldFBvc2l0aW9uID0gdGhpcy5mb3JtdWxhVGV4dEFyZWEubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcclxuICB9XHJcbiAgbG9zdEZvY3VzKHRleHRBcmVhKSB7XHJcbiAgICB0aGlzLmNhcmV0UG9zaXRpb24gPSB0ZXh0QXJlYS5zZWxlY3Rpb25TdGFydDtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBmaWVsZFNlYXJjaEV2ZW50XHJcbiAgLy8gZmllbGRTZWFyY2hFdmVudCgpIHtcclxuICAvLyAgIHRoaXMuZmllbGRTZWFyY2godGhpcy5maWVsZFNlYXJjaGVkKTtcclxuICAvLyB9XHJcbiAgZmllbGRTZWFyY2hFdmVudCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5maWVsZFNlYXJjaGVkLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLmZpbHRlcmVkRmllbGRNYXAgPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmZ1bGxGaWVsZE1hcCkge1xyXG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuZnVsbEZpZWxkTWFwW2tleV07XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShncm91cCkpIHtcclxuICAgICAgICAvLyBncnVwcG8gc2VtcGxpY2U6IGFycmF5IGRpIHBlcmNvcnNpIChlcy4gY3R4LiopXHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBncm91cC5maWx0ZXIocGF0aCA9PlxyXG4gICAgICAgICAgcGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRGaWVsZE1hcFtrZXldID0gZmlsdGVyZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGdyb3VwICE9IG51bGwgJiYgdHlwZW9mIGdyb3VwID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgLy8gZ3J1cHBvIHN0cnV0dHVyYXRvIChyZWMpOiB2b2NpIHNlbXBsaWNpIG8gY29uIHNvdHRvY2FtcGlcclxuICAgICAgICBjb25zdCBmaWx0ZXJlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+ID0ge307XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXApLmZvckVhY2goKGVudHJ5S2V5KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdyb3VwW2VudHJ5S2V5XTtcclxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICAvLyBzZSBpbCBub21lIGRlbCBjYW1wbyBtYXRjaGEgdGVuZ28gdHV0dGkgaSBzb3R0b2NhbXBpLCBhbHRyaW1lbnRpIGZpbHRybyBpIHNvdHRvY2FtcGlcclxuICAgICAgICAgICAgaWYgKGVudHJ5S2V5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpKSB7XHJcbiAgICAgICAgICAgICAgZmlsdGVyZWRbZW50cnlLZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB2YWx1ZS5maWx0ZXIocGF0aCA9PiBwYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpKTtcclxuICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRbZW50cnlLZXldID0gY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZFtlbnRyeUtleV0gPSB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZmlsdGVyZWQpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRGaWVsZE1hcFtrZXldID0gZmlsdGVyZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmaWVsZFNlYXJjaCh0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuRmllbGRzID0gdGhpcy5kYXRhLmZpZWxkcy5maWx0ZXIoeCA9PiB4LkxhYmVsLmluZGV4T2YodGV4dCkgIT0gLTEpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZmllbGRTZWFyY2hFdmVudFxyXG5cclxuICBiYWNrKCkge1xyXG5cclxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZm9ybXVsYScpICE9IHVuZGVmaW5lZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZm9ybXVsYScpICE9IG51bGwgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Zvcm11bGEnKSAhPSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgZm9ybXVsYTogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Zvcm11bGEnKS50b1N0cmluZygpIH0pO1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZm9ybXVsYScpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IGZvcm11bGE6IFwiIFwiIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkU3ltYm9sKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSB0aGlzLnN0cmluZ2FGb3JtdWxhLnRyaW0oKVxyXG4gICAgbGV0IGxhc3RDaGFyID0gdGhpcy5zdHJpbmdhRm9ybXVsYS5jaGFyQXQodGhpcy5zdHJpbmdhRm9ybXVsYS5sZW5ndGggLSAxKTtcclxuICAgIC8vIHNlIGwndWx0aW1vIGNhcmF0dGVyZSDDqCB1biBvcGVyYXRvcmUgbWF0ZW1hdGljbyBtaSBsaW1pdG8gYSBjb25jYXRlbmFyZSBsYSBmb21ydWxhXHJcbiAgICAvLyBhbHRyaW1lbnRpIHZhZG8gYSBtb2x0aXBsaWNhcmUgcXVlbGxvIGNoZSBjJ2VyYSBwcmltYSBwZXIgbGEgZm9ybXVsYSBjaGUgc3RvIGFnZ2l1bmdlbmRvXHJcbiAgICBjb25zdCBub25DYWxjb2xhYmxlQ2hhcnMgPSBbJysnLCctJywnKicsJy8nLCcoJywnWycsJ10nLCd7JywnfScsJzwnLCc+JywnPScsJzonLCc7JywnIScsJyddO1xyXG4gICAgaWYgKCBub25DYWxjb2xhYmxlQ2hhcnMuaW5jbHVkZXMobGFzdENoYXIpKSB7XHJcbiAgICAgIGlmICh0aGlzLmNhcmV0UG9zaXRpb24gIT0gMCkge1xyXG4gICAgICAgIHZhciBzdWJzdHJpbmdhID0gdGhpcy5zdHJpbmdhRm9ybXVsYS5zdWJzdHJpbmcoMCwgdGhpcy5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgICBzdWJzdHJpbmdhID0gc3Vic3RyaW5nYS50cmltKCk7XHJcbiAgICAgICAgc3Vic3RyaW5nYSA9IHN1YnN0cmluZ2EgKyBcIiBcIiArIHZhbHVlICsgdGhpcy5zdHJpbmdhRm9ybXVsYS5zdWJzdHJpbmcodGhpcy5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gc3Vic3RyaW5nYTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5zdHJpbmdhRm9ybXVsYSArIFwiIFwiICsgdmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuY2FyZXRQb3NpdGlvbiAhPSAwKSB7XHJcbiAgICAgICAgdmFyIHN1YnN0cmluZ2EgPSB0aGlzLnN0cmluZ2FGb3JtdWxhLnN1YnN0cmluZygwLCB0aGlzLmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICAgIHN1YnN0cmluZ2EgPSBzdWJzdHJpbmdhLnRyaW0oKTtcclxuICAgICAgICBzdWJzdHJpbmdhID0gc3Vic3RyaW5nYSArIFwiICogXCIgKyB2YWx1ZSArIHRoaXMuc3RyaW5nYUZvcm11bGEuc3Vic3RyaW5nKHRoaXMuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IHN1YnN0cmluZ2E7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEgKyBcIiAqIFwiICsgdmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRMaXN0TnVtYmVyUmVhZGVyKCkge1xyXG4gICAgdGhpcy5jb3VudGVyKys7XHJcbiAgICBjb25zdCB2YWx1ZSA9IFwibGV0IHZhbHVlXCIgKyB0aGlzLmNvdW50ZXIgKyBcIiA9IDA7IGxldCBlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiID0gSU5TRVJJU0NJX0lMX1RVT19FTEVOQ087IGlmIChlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiICE9IG51bGwgJiYgZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIi5jb25zdHJ1Y3RvciA9PSBBcnJheSl7IGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIi5sZW5ndGg7IGkrKykgeyB2YWx1ZVwiICsgdGhpcy5jb3VudGVyICsgXCIgKz0gZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIltpXTsgfSB9IGVsc2UgeyB2YWx1ZVwiICsgdGhpcy5jb3VudGVyICsgXCIgPSBlbGVuY29cIiArIHRoaXMuY291bnRlciArIFwiIH1cIjtcclxuICAgIHRoaXMuYWRkTnVtYmVyKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFkZExpc3RTdHJpbmdyUmVhZGVyKCkge1xyXG4gICAgdGhpcy5jb3VudGVyKys7XHJcbiAgICBjb25zdCB2YWx1ZSA9IFwibGV0IHZhbHVlXCIgKyB0aGlzLmNvdW50ZXIgKyBcIiA9IFxcXCJcXFwiOyBsZXQgZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIiA9IElOU0VSSVNDSV9JTF9UVU9fRUxFTkNPOyBpZiAoZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIiAhPSBudWxsICYmIGVsZW5jb1wiICsgdGhpcy5jb3VudGVyICsgXCIuY29uc3RydWN0b3IgPT0gQXJyYXkpeyBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW5jb1wiICsgdGhpcy5jb3VudGVyICsgXCIubGVuZ3RoOyBpKyspIHsgdmFsdWVcIiArIHRoaXMuY291bnRlciArIFwiICs9IGVsZW5jb1wiICsgdGhpcy5jb3VudGVyICsgXCJbaV07IH0gfSBlbHNlIHsgdmFsdWVcIiArIHRoaXMuY291bnRlciArIFwiID0gZWxlbmNvXCIgKyB0aGlzLmNvdW50ZXIgKyBcIiB9XCI7XHJcbiAgICB0aGlzLmFkZE51bWJlcih2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBhZGRBcnJheUxpc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvdW50ZXIrKztcclxuICAgIGNvbnN0IHZhbHVlID0gXCJ2YXIgb3V0cHV0TGlzdFwiICsgdGhpcy5jb3VudGVyICsgXCIgPSB7IFxcXCJrZXlcXFwiIDogdmFsdWUgLCBcXFwia2V5MlxcXCIgOiB2YWx1ZTIgfTsgb3V0cHV0TGlzdFwiICsgdGhpcy5jb3VudGVyICsgXCI7XCI7XHJcbiAgICB0aGlzLmFkZE51bWJlcih2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBhZGROdW1iZXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEudHJpbSgpO1xyXG4gICAgaWYgKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmlzTnVtZXJpYyh2YWx1ZSkpIHtcclxuICAgICAgaWYgKHRoaXMuY2FyZXRQb3NpdGlvbiAhPSAwKSB7XHJcbiAgICAgICAgbGV0IHN1YnN0cmluZ2EgPSB0aGlzLnN0cmluZ2FGb3JtdWxhLnN1YnN0cmluZygwLCB0aGlzLmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICAgIHN1YnN0cmluZ2EgPSBzdWJzdHJpbmdhLnRyaW0oKTtcclxuICAgICAgICBzdWJzdHJpbmdhID0gc3Vic3RyaW5nYSArIHZhbHVlICsgdGhpcy5zdHJpbmdhRm9ybXVsYS5zdWJzdHJpbmcodGhpcy5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gc3Vic3RyaW5nYTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5zdHJpbmdhRm9ybXVsYSArIHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2FyZXRQb3NpdGlvbiArPSAxO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh2YWx1ZSA9PSBcIi5cIikge1xyXG4gICAgICAgIGlmICh0aGlzLmNhcmV0UG9zaXRpb24gIT0gMCkge1xyXG4gICAgICAgICAgbGV0IHN1YnN0cmluZ2EgPSB0aGlzLnN0cmluZ2FGb3JtdWxhLnN1YnN0cmluZygwLCB0aGlzLmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICAgICAgc3Vic3RyaW5nYSA9IHN1YnN0cmluZ2EudHJpbSgpO1xyXG4gICAgICAgICAgc3Vic3RyaW5nYSA9IHN1YnN0cmluZ2EgKyB2YWx1ZSArIHRoaXMuc3RyaW5nYUZvcm11bGEuc3Vic3RyaW5nKHRoaXMuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gc3Vic3RyaW5nYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5zdHJpbmdhRm9ybXVsYSArIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5jYXJldFBvc2l0aW9uICE9IDApIHtcclxuICAgICAgICAgIGxldCBzdWJzdHJpbmdhID0gdGhpcy5zdHJpbmdhRm9ybXVsYS5zdWJzdHJpbmcoMCwgdGhpcy5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgICAgIHN1YnN0cmluZ2EgPSBzdWJzdHJpbmdhLnRyaW0oKTtcclxuICAgICAgICAgIHN1YnN0cmluZ2EgPSBzdWJzdHJpbmdhICsgXCIgXCIgKyB2YWx1ZSArIHRoaXMuc3RyaW5nYUZvcm11bGEuc3Vic3RyaW5nKHRoaXMuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gc3Vic3RyaW5nYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0cmluZ2FGb3JtdWxhID0gdGhpcy5zdHJpbmdhRm9ybXVsYSArIFwiIFwiICsgdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2FyZXRQb3NpdGlvbiArPSAyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkRGF0ZU5vdygpIHtcclxuICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSB0aGlzLnN0cmluZ2FGb3JtdWxhICsgXCIgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpOyBkYXRlIFwiO1xyXG4gIH1cclxuXHJcbiAgYWRkRWxlbmNvSW1tYWdpbmkobm9tZWNoaWF2ZSkge1xyXG4gICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEgKyBcIiBsZXQgZmllbGRuYW1lID0gJ05PTUUgREVMIENBTVBPJzsgcmVjW2ZpZWxkbmFtZV0uXCIgKyBub21lY2hpYXZlICsgXCIgXCI7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdnZWRGaWVsZCgpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkQmVpbmdEcmFnZ2VkICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5zdHJpbmdhRm9ybXVsYSA9IHRoaXMuc3RyaW5nYUZvcm11bGEuc3Vic3RyaW5nKDAsIHRoaXMuY2FyZXRQb3NpdGlvbikgKyB0aGlzLmZpZWxkQmVpbmdEcmFnZ2VkICsgXCIgXCIgKyB0aGlzLnN0cmluZ2FGb3JtdWxhLnN1YnN0cmluZyh0aGlzLmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICB0aGlzLmNhcmV0UG9zaXRpb24gPSB0aGlzLnN0cmluZ2FGb3JtdWxhLmxlbmd0aDtcclxuICAgICAgdGhpcy5maWVsZEJlaW5nRHJhZ2dlZCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyYWdTdGFydGVkKGxhYmVsKSB7XHJcbiAgICB0aGlzLmZpZWxkQmVpbmdEcmFnZ2VkID0gbGFiZWw7XHJcbiAgfVxyXG5cclxuICBjaGtGb3JtdWxhKGZvcm11bGE6IHN0cmluZyl7XHJcblxyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICBhY29ybi5wYXJzZShmb3JtdWxhLCB7IGVjbWFWZXJzaW9uOiAyMDIwIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcmUgZGkgc2ludGFzc2k6XCIsIGVyci5tZXNzYWdlKTtcclxuICAgICAgdGhpcy5lcnJvciA9IGVyci5tZXNzYWdlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgICAvLyAyLiBDb250cm9sbG8gcnVudGltZVxyXG4gICAgdHJ5IHsgICAgICBcclxuICAgICAgLy8hIHF1ZXN0byBtZXRvZG8gw6ggcGnDuSBzaWN1cm8gbWEgcmljaGllZGUgZGkgdHJhc2Zvcm1hcmUgdHV0dGUgbGUgdmVjY2hpZSBmb3JtdWxlIGluIG1vZG8gZGEgYXZlcmUgdW4gcmV0dXJuXHJcbiAgICAgIC8vIGNyZW8gdW5hIGZ1bnppb25lIGNoZSBhY2NldHRhIHJlYyBlIGN0eFxyXG4gICAgICAvLyBjb25zdCBmbiA9IG5ldyBGdW5jdGlvbihcInJlY1wiLCBcImN0eFwiLCBgcmV0dXJuICR7Zm9ybXVsYX07YCk7XHJcbiAgICAgIC8vIGVzZWd1byBwYXNzYW5kbyBpIHZhbG9yaVxyXG4gICAgICAvLyBmbih0aGlzLmZ1bGxGaWVsZE1hcC5yZWMsIHRoaXMuZm9ybXVsYU9iamVjdClcclxuXHJcbiAgICAgIC8vISBxdWVzdG8gbWV0b2RvIMOoIHBvY28gc2ljdXJvIG1hIMOoIG5hdG8gY29zw6xcclxuICAgICAgbGV0IHJlYyA9IHRoaXMucmVjT2JqO1xyXG4gICAgICBsZXQgY3R4ID0gdGhpcy5mb3JtdWxhT2JqZWN0O1xyXG4gICAgICBjb25zdCBldmFsdWF0ZWRWYWx1ZSA9IGV2YWwoZm9ybXVsYSk7XHJcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3JlIGRpIHJ1bnRpbWU6IFwiICsgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLmVycm9yID0gZXJyLm1lc3NhZ2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBzYXZlXHJcbiAgc2F2ZSgpIHtcclxuICAgIHRoaXMuc3RyaW5nYUZvcm11bGEgPSB0aGlzLnN0cmluZ2FGb3JtdWxhLnRyaW0oKTtcclxuXHJcbiAgICB0aGlzLmNoa0Zvcm11bGEodGhpcy5zdHJpbmdhRm9ybXVsYSk7XHJcblxyXG4gICAgaWYodGhpcy5lcnJvciAhPSBudWxsKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChVdGlsaXR5SGVscGVyU2VydmljZS5zdHJpbmdDaGVja1BhcmVudGVzaXModGhpcy5zdHJpbmdhRm9ybXVsYSkpIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2Zvcm11bGEnKTtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBmb3JtdWxhOiB0aGlzLnN0cmluZ2FGb3JtdWxhIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oRGlhbG9nRGF0YUV4YW1wbGVEaWFsb2csIHtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBzYXZlXHJcblxyXG4gIC8vI3JlZ2lvbiBnZXROZXN0ZWRQcm9wZXJ0aWVzTWFwXHJcbiAgLy9vYmo6IGFueTogw6ggbCdvZ2dldHRvIGRhIGFuYWxpenphcmUuXHJcbiAgLy9SZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT46IGluZGljYSBjaGUgaWwgcmlzdWx0YXRvIHNhcsOgIHVuIG9nZ2V0dG8gaSBjdWkgY2FtcGkgc29ubyBzdHJpbmdoZSwgZSBpIHZhbG9yaSBzb25vIGFycmF5IGRpIHN0cmluZ2hlLlxyXG4gIGdldE5lc3RlZFByb3BlcnRpZXNNYXAob2JqOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgLy9JbCBjb250cm9sbG8gY29uIGhhc093blByb3BlcnR5IHNlcnZlIHBlciBldml0YXJlIHByb3ByaWV0w6AgZXJlZGl0YXRlIChidW9uYSBwcmF0aWNhKVxyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAvL1NlIGlsIHZhbG9yZSDDqCB1biBvZ2dldHRvLCBjaGlhbWlhbW8gZ2V0UHJvcGVydHlQYXRocyBwZXIgb3R0ZW5lcmUgaSBwZXJjb3JzaSBhbm5pZGF0aS5cclxuICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5nZXRQcm9wZXJ0eVBhdGhzKHZhbHVlLCBcImN0eC5cIiArIGtleSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vQWx0cmltZW50aSwgc2FsdmlhbW8gc29sbyBpbCBub21lIGRpcmV0dG8uXHJcbiAgICAgICAgICByZXN1bHRba2V5XSA9IFtcImN0eC5cIiArIGtleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGdldE5lc3RlZFByb3BlcnRpZXNNYXBcclxuXHJcbiAgLy8jcmVnaW9uIGdldFByb3BlcnR5UGF0aHNcclxuICAvLyBSaWNldmUgdW4gb2dnZXR0byBkYSBlc3Bsb3JhcmUgZSB1biBwcmVmaXNzbyAoXCJ1c2VyXCIsIFwibWVkXCIsIGVjYy4pLlxyXG4gIC8vUmVzdGl0dWlzY2UgdW4gYXJyYXkgZGkgc3RyaW5naGUgY29uIGkgcGVyY29yc2kgZGVsbGUgcHJvcHJpZXTDoCBmaWdsaWUuXHJcbiAgZ2V0UHJvcGVydHlQYXRocyhvYmo6IGFueSwgcHJlZml4OiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xyXG4gICAgICAgIC8vQ29zdHJ1aXNjZSBpbCBwZXJjb3JzbyBjb21wbGV0b1xyXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7cHJlZml4fS4ke2tleX1gO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgLy9TZSB0cm92aWFtbyB1biBvZ2dldHRvIGFubmlkYXRvIChlcy4gQ2xpbmljTGlicmFyeSksIGNoaWFtaWFtbyBkaSBudW92byBsYSBmdW56aW9uZSAocmljb3JzaW9uZSkuXHJcbiAgICAgICAgICBwYXRocy5wdXNoKC4uLnRoaXMuZ2V0UHJvcGVydHlQYXRocyh2YWx1ZSwgZnVsbFBhdGgpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy9BbHRyaW1lbnRpLCBhZ2dpdW5naWFtbyBpbCBwZXJjb3JzbyBmaW5hbGUgYWxsJ2FycmF5LlxyXG4gICAgICAgICAgcGF0aHMucHVzaChmdWxsUGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhdGhzO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0UHJvcGVydHlQYXRoc1xyXG5cclxuICAvLyNyZWdpb24gb3JkaW5hbWVudG8gY2FtcGlcclxuICAvLyBjb25mcm9udG8gYWxmYWJldGljbyBkZWkgcGVyY29yc2ksIGNhc2UtaW5zZW5zaXRpdmUgZSBjb24gbnVtZXJpIGdlc3RpdGkgaW4gbW9kbyBuYXR1cmFsZVxyXG4gIGNvbXBhcmVQYXRocyhhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGEgfHwgXCJcIikubG9jYWxlQ29tcGFyZSgoYiB8fCBcIlwiKSwgdW5kZWZpbmVkLCB7IHNlbnNpdGl2aXR5OiBcImJhc2VcIiwgbnVtZXJpYzogdHJ1ZSB9KTtcclxuICB9XHJcblxyXG4gIC8vIHJlc3RpdHVpc2NlIHVuIG51b3ZvIG9nZ2V0dG8gY29uIGxlIHN0ZXNzZSB2b2NpIG9yZGluYXRlIGFsZmFiZXRpY2FtZW50ZSBwZXIgY2hpYXZlXHJcbiAgc29ydEZpZWxkRW50cmllcyhtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPiB7XHJcbiAgICBjb25zdCBzb3J0ZWQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPiA9IHt9O1xyXG4gICAgT2JqZWN0LmtleXMobWFwKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4gdGhpcy5jb21wYXJlUGF0aHMoYSwgYikpXHJcbiAgICAgIC5mb3JFYWNoKChrZXkpID0+IHsgc29ydGVkW2tleV0gPSBtYXBba2V5XTsgfSk7XHJcbiAgICByZXR1cm4gc29ydGVkO1xyXG4gIH1cclxuXHJcbiAgLy8gY29tcGFyYXRvciBwZXIgaWwgcGlwZSBrZXl2YWx1ZTogb3JkaW5hIGluIGJhc2UgYWwgcGVyY29yc28gbW9zdHJhdG9cclxuICAvLyAocGVyIGxlIHZvY2kgc2VtcGxpY2kgaWwgdmFsb3JlIMOoIGxhIHN0cmluZ2EsIHBlciBxdWVsbGUgY29uIHNvdHRvY2FtcGkgc2kgdXNhIGxhIGNoaWF2ZSlcclxuICBmaWVsZE1hcENvbXBhcmF0b3IgPSAoYTogS2V5VmFsdWU8c3RyaW5nLCBhbnk+LCBiOiBLZXlWYWx1ZTxzdHJpbmcsIGFueT4pOiBudW1iZXIgPT4ge1xyXG4gICAgY29uc3QgbGVmdCA9IHR5cGVvZiBhLnZhbHVlID09PSBcInN0cmluZ1wiID8gYS52YWx1ZSA6IGEua2V5O1xyXG4gICAgY29uc3QgcmlnaHQgPSB0eXBlb2YgYi52YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IGIudmFsdWUgOiBiLmtleTtcclxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVQYXRocyhsZWZ0LCByaWdodCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBvcmRpbmFtZW50byBjYW1waVxyXG5cclxuICBpc0tleVZhbHVlTGlzdChsaXN0OiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gIEFycmF5LmlzQXJyYXkobGlzdCkgJiYgbGlzdC5sZW5ndGggPiAwO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZGlhbG9nLWRhdGEtZXhhbXBsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICdkaWFsb2ctZGF0YS1leGFtcGxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlhbG9nRGF0YUV4YW1wbGVEaWFsb2cge1xyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC05XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIHB0LTJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICAgbmFtZT1cImZvcm11bGFcIlxyXG4gICAgICAgICAgICAgICNmb3JtdWxhXHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRhcmVhXCJcclxuICAgICAgICAgICAgICBpZD1cImZvcm11bGFcIlxyXG4gICAgICAgICAgICAgIHJvd3M9XCIxMFwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wdGFyZ2V0XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwibG9zdEZvY3VzKGZvcm11bGEpXCJcclxuICAgICAgICAgICAgICAoa2V5dXApPVwibG9zdEZvY3VzKGZvcm11bGEpXCJcclxuICAgICAgICAgICAgICAoYmx1cik9XCJsb3N0Rm9jdXMoZm9ybXVsYSlcIlxyXG4gICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9uRHJhZ2dlZEZpZWxkKClcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RyaW5nYUZvcm11bGFcIlxyXG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICA8cCAqbmdJZj1cImVycm9yXCIgc3R5bGU9XCJjb2xvcjpyZWQ7XCI+e3tlcnJvcn19PC9wPlxyXG4gICAgICAgICAgICAgIDxwICpuZ0lmPVwiIWVycm9yXCI+IE9rIDwvcD5cclxuICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ0aGlzLmNoa0Zvcm11bGEoc3RyaW5nYUZvcm11bGEpXCI+IFRlc3QgZm9ybXVsYSA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cIm1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBTcGVzc28gaW4gZm9uZG8gYWxsJ2Vycm9yZSBjaSBzb25vIGR1ZSBudW1lcmkgdHJhcGFyZW50ZXNpLiBJbmRpY2FubyByaXNwZXR0aXZhbWVudGUgbGEgcmlnYSBlIGlsIGNhcmF0dGVyZS4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIFRyYSBwYXJlbnRlc2kgaW5kaWNhdG8gbGEgcmlnYSBlIGlsIGNhcmF0dGVyZSBpbiBjdWkgdmkgw6ggZXJyb3JlXHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTEgZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICA8Zm9ybSBtZXRob2Q9XCJQT1NUXCIgY2xhc3M9XCJhbGVydCBhbGVydC1zZWNvbmRhcnlcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRGF0ZU5vdygpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRlTm93XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTGlzdFN0cmluZ3JSZWFkZXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgTGVnZ2kgRWxlbmNvIFR4dFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZExpc3ROdW1iZXJSZWFkZXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgTGVnZ2kgRWxlbmNvIE51bVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFycmF5TGlzdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3RcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTnVtYmVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpZiggQ29uZGl6aW9uZSApIHsgc2UgdmVyYSB9IGVsc2UgeyBzZSBmYWxzYSB9J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIElGXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCcvMTAwJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICVcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQ1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi14bCBidG4taW5mb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCcvJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICZkaXZpZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB0LTJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFN5bWJvbCgnTWF0aC5wb3coIHZhbG9yZSAsMiknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgeDxzdXA+Mjwvc3VwPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFN5bWJvbCgnTWF0aC5wb3coIHZhbG9yZSAsMyknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgeDxzdXA+Mzwvc3VwPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFN5bWJvbCgnTWF0aC5wb3coIHZhbG9yZSAsIHBvdGVuemEgKScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB4PHN1cD55PC9zdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCcgKiAzLjE0ICcpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAmI3gyMTNDO1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJzcnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgN1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJzgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgOFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJzknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgOVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi14bCBidG4taW5mb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCcqJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICZ0aW1lcztcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3ltYm9sKCdNYXRoLnNxcnQoIHZhbG9yZSApJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzdXA+Mjwvc3VwPiZyYWRpYzt4XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3ltYm9sKCdNYXRoLnBvdyggcmFkaWNlICwgMS8gdmFsb3JlICknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHN1cD55PC9zdXA+JnJhZGljO3hcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRTeW1ib2woJ01hdGgubG9nKCB2YWxvcmUgKScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBsblxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFN5bWJvbCgnTWF0aC5sb2cxMCggdmFsb3JlICknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgbG9nXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJzQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgNFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJzUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgNVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJzYnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgNlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi14bCBidG4taW5mb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCctJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICZtaW51cztcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkU3ltYm9sKCdNYXRoLnNpbiggdmFsb3JlICknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgc2luXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFN5bWJvbCgnTWF0aC5jb3MoIHZhbG9yZSApJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIGNvc1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1sdC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRTeW1ib2woJ01hdGgudGFuKCB2YWxvcmUgKScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB0YW5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTnVtYmVyKCcqIDIuNzE4MjgxODI4NDU5MDQ1JylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIGVcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignMScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAxXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignMicpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAyXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE51bWJlcignMycpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAzXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXhsIGJ0bi1pbmZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJysnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgJiM0MztcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtbHQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRWxlbmNvSW1tYWdpbmkoJ0J1dHRvbktleScpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICBFbGVuY28gSW1tYWdpbmk6IENoaWF2ZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRWxlbmNvSW1tYWdpbmkoJ0J1dHRvblZhbHVlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIEVsZW5jbyBJbW1hZ2luaTogVmFsb3JlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJzAnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgMFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGROdW1iZXIoJy4nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IGJnLWRhbmdlciB0ZXh0LXdoaXRlIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFjaygpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICDinYwgQW5udWxsYVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWx0LWZsZXhcIiBbbWF0VG9vbHRpcF09XCJlcnJvciA/ICdUZXN0YSBsYSBmb3JtdWxhIHBlciBhYmlsaXRhcmUnIDogJ1Rlc3RhIGxhIGZvcm11bGEgZSBTYWx2YSDwn5iKJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJlcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IGJnLXN1Y2Nlc3MgdGV4dC13aGl0ZSBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAg8J+SviBTYWx2YVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMyBwLTIgb3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwibWF4LWhlaWdodDogODB2aDtcIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5SaWNlcmNhPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJDZXJjYSBjYW1wb1wiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpZWxkU2VhcmNoZWRcIlxyXG4gICAgICAgICAgKGlucHV0KT1cImZpZWxkU2VhcmNoRXZlbnQoKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4PnNlYXJjaDwvbWF0LWljb24+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICBcclxuICAgICAgPG1hdC1hY2NvcmRpb24gbXVsdGk+XHJcbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGZpbHRlcmVkRmllbGRNYXAgfCBrZXl2YWx1ZTogZmllbGRNYXBDb21wYXJhdG9yXCI+XHJcbiAgICAgICAgICA8IS0tIEFDQ09SRElPTiAxIExJVkVMTE8gLS0+XHJcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgICAgICAge3sgZ3JvdXAua2V5IH19XHJcbiAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHJcbiAgICAgICAgICA8IS0tIENPTlRFTlVUTyBQUklNTyBMSVZFTExPIC0tPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjZGtEcm9wTGlzdFxyXG4gICAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwidmVydGljYWxcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtbGlzdFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZ3JvdXAudmFsdWUgfCBrZXl2YWx1ZTogZmllbGRNYXBDb21wYXJhdG9yXCIgPlxyXG4gICAgICAgICAgICAgIDwhLS0gU0UgTk9OIENPTlRJTkUgTElTVEEgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNLZXlWYWx1ZUxpc3QoZmllbGQudmFsdWUpXCIgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtYm94XCJcclxuICAgICAgICAgICAgICAgIGNka0RyYWdcclxuICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cIm9uRHJhZ1N0YXJ0ZWQoZmllbGQudmFsdWUpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZHJhZy1kYXRhXT1cImZpZWxkLnZhbHVlXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBmaWVsZC52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFNFIENPTlRJRU5FIExJU1RBIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0tleVZhbHVlTGlzdChmaWVsZC52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIG11bHRpIGNsYXNzPVwibmVzdGVkLWFjY29yZGlvblwiPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gSEVBREVSIFNFQ09ORE8gTElWRUxMTyAtLT5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQua2V5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8IS0tIENPTlRFTlVUTyBTRUNPTkRPIExJVkVMTE8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWVsZC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV4YW1wbGUtYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNka0RyYWdcclxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cIm9uRHJhZ1N0YXJ0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kcmFnLWRhdGFdPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSA8ZGl2XHJcbiAgICAgICAgICAgIGNka0Ryb3BMaXN0XHJcbiAgICAgICAgICAgIGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZXhhbXBsZS1saXN0XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZXhhbXBsZS1ib3hcIlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBncm91cC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgY2RrRHJhZ1xyXG4gICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvbkRyYWdTdGFydGVkKGZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kcmFnLWRhdGFdPVwiZmllbGRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZmllbGQgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgPC9tYXQtYWNjb3JkaW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiIsIjxoMSBtYXQtZGlhbG9nLXRpdGxlPkVycm9yZSE8L2gxPlxyXG48ZGl2IG1hdC1kaWFsb2ctY29udGVudD5cclxuICBMYSBmdW56aW9uZSBpbnNlcml0YSBjb250aWVuZSBwYXJlbnRlc2kgbm9uIGNoaXVzZSEgcHJpbWEgZGkgc2FsdmFyZSBjb250cm9sbGEgbGEgZnVuemlvbmUuXHJcbiAgXHJcbjwvZGl2PiJdfQ==