mmhglobal-dynamicform 1.3.13 → 1.3.16

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.
Files changed (29) hide show
  1. package/README.md +12 -0
  2. package/esm2020/lib/constants/constant.mjs +4 -0
  3. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +14 -1
  4. package/esm2020/lib/services/main.service.mjs +3 -15
  5. package/esm2020/lib/services/signalr.service.mjs +126 -0
  6. package/esm2020/lib/uibulletin/uibulletin.component.mjs +91 -0
  7. package/esm2020/lib/uicontainer/uicontainer.component.mjs +1 -1
  8. package/esm2020/lib/uiheader/uiheader.component.mjs +9 -6
  9. package/esm2020/lib/zform/zform.component.mjs +6 -1
  10. package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +15 -8
  11. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +20 -7
  12. package/esm2020/lib/zgrid/zgrid.component.mjs +37 -17
  13. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +3 -3
  14. package/esm2020/lib/ztreelist/ztreelist.component.mjs +1 -1
  15. package/esm2020/public-api.mjs +2 -1
  16. package/fesm2015/mmhglobal-dynamicform.mjs +312 -57
  17. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
  18. package/fesm2020/mmhglobal-dynamicform.mjs +310 -57
  19. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
  20. package/lib/constants/constant.d.ts +3 -0
  21. package/lib/mmhglobal-dynamicform.module.d.ts +73 -70
  22. package/lib/services/signalr.service.d.ts +40 -0
  23. package/lib/uibulletin/uibulletin.component.d.ts +37 -0
  24. package/lib/uiheader/uiheader.component.d.ts +1 -0
  25. package/lib/zgrid/date-range-cell-filter.component.d.ts +4 -1
  26. package/lib/zgrid/zgrid.binding.directive.d.ts +3 -2
  27. package/lib/zgrid/zgrid.component.d.ts +2 -0
  28. package/package.json +1 -1
  29. package/public-api.d.ts +1 -0
@@ -8,6 +8,7 @@ import { tap, map, switchMap, concatMap } from "rxjs/operators";
8
8
  import { process } from "@progress/kendo-data-query";
9
9
  import { TooltipDirective } from '@progress/kendo-angular-tooltip';
10
10
  import { ZComponentProperties, ZComponentHelper } from 'mmhglobal-zcore';
11
+ import { ComponentConstant } from "../constants/constant";
11
12
  import * as i0 from "@angular/core";
12
13
  import * as i1 from "@angular/router";
13
14
  import * as i2 from "@angular/forms";
@@ -71,18 +72,17 @@ export class ZgridComponent {
71
72
  total: (gData ? gData.length : 0)
72
73
  };
73
74
  this.gData = gData;
74
- if (this.zgrid) {
75
- this.zgrid.grid['pageSize'] = gData.length; // set grid size
76
- }
77
- if (!!this.data.ShowRecordNumber) {
78
- if (this.gridData.data) {
75
+ if (this.gData) {
76
+ if (this.zgrid) {
77
+ this.zgrid.grid['pageSize'] = gData.length; // set grid size
78
+ }
79
+ if (!!this.data.ShowRecordNumber) {
79
80
  this.gridData.data.forEach((d, i) => {
80
81
  d.GridNo = i + 1;
81
82
  });
82
83
  }
83
- }
84
- if (this.gData) {
85
84
  this.createFormControls();
85
+ this.setDateColForFiltering();
86
86
  }
87
87
  };
88
88
  /* Available Functions */
@@ -116,7 +116,7 @@ export class ZgridComponent {
116
116
  // return this.mainService.cookieStoreGet(this.gridStorageKey, this.authService.e1Token.access_token);
117
117
  //}),
118
118
  //switchMap(savedGridCache => {
119
- // if (savedGridCache) {
119
+ // if (savedGridCache) {
120
120
  // // Keep the gridSetting from cookiestore to localStorage
121
121
  // this.zGridStatePersistingService.set(this.gridStorageKey, savedGridCache);
122
122
  // return of(true);
@@ -201,6 +201,9 @@ export class ZgridComponent {
201
201
  get state() {
202
202
  return this._state;
203
203
  }
204
+ set state(state) {
205
+ this._state = state;
206
+ }
204
207
  stateExist() {
205
208
  const userGridState = this.zGridStatePersistingService.get(this.gridStorageKey);
206
209
  if (userGridState) {
@@ -211,12 +214,17 @@ export class ZgridComponent {
211
214
  }
212
215
  }
213
216
  dataStateChange(state) {
214
- if (this.zgrid) {
217
+ if (!this.data.SkipDirective) {
215
218
  this.zgrid.dataStateChange(state);
216
219
  }
217
220
  else {
221
+ this._state = state;
218
222
  this.gridData = process(this.gData, state);
219
223
  this.createFormControls();
224
+ if (this.zgrid) {
225
+ this.zgrid.state = state;
226
+ this.zgrid.data = this.gridData.data;
227
+ }
220
228
  }
221
229
  }
222
230
  filterable(value) {
@@ -254,7 +262,7 @@ export class ZgridComponent {
254
262
  // return (h < 250) ? 250 : h;
255
263
  // }else{
256
264
  // return "auto";
257
- // }
265
+ // }
258
266
  }
259
267
  /* End Grid Styling, Display */
260
268
  /* Start Grid Columns */
@@ -334,6 +342,18 @@ export class ZgridComponent {
334
342
  });
335
343
  }
336
344
  }
345
+ setDateColForFiltering() {
346
+ if (this.data.SkipDirective && this.gData && this.gData.length > 0) {
347
+ const dateCol = Object.keys(this.gData[0]).filter(x => x.includes("Date"));
348
+ if (dateCol && dateCol.length > 0) {
349
+ this.gData.forEach(data => {
350
+ dateCol.forEach(colName => {
351
+ data[`${colName}${ComponentConstant.GridColDateFilterSuffix}`] = new Date(data[colName]);
352
+ });
353
+ });
354
+ }
355
+ }
356
+ }
337
357
  getData() {
338
358
  if (this.zgrid) {
339
359
  this.zgrid.getDataBinding();
@@ -741,17 +761,17 @@ export class ZgridComponent {
741
761
  }
742
762
  /* onchange Events */
743
763
  filterChange(event) {
744
- if (this.zgrid) {
764
+ if (!this.data.SkipDirective) {
745
765
  this.zgrid.filterChange(event);
746
766
  }
747
767
  }
748
768
  pageChange(event) {
749
- if (this.zgrid) {
769
+ if (!this.data.SkipDirective) {
750
770
  this.zgrid.pageChange(event);
751
771
  }
752
772
  }
753
773
  sortChange(sort) {
754
- if (this.zgrid) {
774
+ if (!this.data.SkipDirective) {
755
775
  this.zgrid.sortChange(sort);
756
776
  }
757
777
  }
@@ -801,7 +821,7 @@ export class ZgridComponent {
801
821
  const formUniqueKeyValue = formGroup.value[uniqueKey];
802
822
  if (isNew || (!isNew && (gridExistingData[rowIndex][uniqueKey] != formUniqueKeyValue))) {
803
823
  // if new...
804
- // if edit... if current field, uniquekey value changed. need to check.
824
+ // if edit... if current field, uniquekey value changed. need to check.
805
825
  gridExistingData.forEach(data => {
806
826
  if (data[uniqueKey] === formUniqueKeyValue) {
807
827
  uniqueKeyExist = true;
@@ -873,10 +893,10 @@ export class ZgridComponent {
873
893
  }
874
894
  }
875
895
  ZgridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ZgridComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.FormBuilder }, { token: i3.AuthService }, { token: i3.WebApiService }, { token: i3.ZGridStatePersistingService }, { token: i3.ToastService }, { token: i3.ZCoreService }, { token: i3.StorageSessionService }, { token: i4.MainService }], target: i0.ɵɵFactoryTarget.Component });
876
- ZgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: ZgridComponent, selector: "app-zgrid", inputs: { data: "data", group: "group", form: "form" }, viewQueries: [{ propertyName: "tooltipDir", first: true, predicate: TooltipDirective, descendants: true }], ngImport: i0, template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div>\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <div kendoTooltip\r\n showOn=\"none\"\r\n [tooltipTemplate]=\"template\"\r\n filter=\".k-grid td\"\r\n (mouseover)=\"showTooltip($event)\"> \r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject}\" [ngClass]=\"data.Class\"\r\n [data]=\"gridData\"\r\n [pageSize]=\"state.take\"\r\n [pageable]=\"{responsive: true, buttonCount: 3, pageSizes: pageSizes, previousNext: previousNext}\"\r\n [skip]=\"state.skip\"\r\n [sort]=\"state.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"state.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n (columnReorder)=\"columnsOrderChanged($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"mySelection\"\r\n [ngStyle]=\"getGridStyle()\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\">\r\n <!--[scrollable]=\"scrollMode\" temp remove. causing some bug on pagination-->\r\n <ng-template kendoGridToolbarTemplate *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.EnableGridCommand\">\r\n <button type=\"button\" kendoButton (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>&nbsp;Refresh</button>\r\n <button type=\"button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-file-excel\"></span>&nbsp;Export Data to Excel</button>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.AllowSaveState\"><span class=\"k-icon k-i-star\"></span>&nbsp;Save Setting</button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"gridDefaultStateExist\"><span class=\"k-icon k-i-star-outline\"></span>&nbsp;Restore Setting</button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand \"><span class=\"k-icon k-i-add\"></span>Add New</button>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\"></kendo-grid-checkbox-column>\r\n <kendo-grid-column *ngFor=\"let col of columns\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title\"\r\n [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\"\r\n [filter]=\"col.filter\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [headerStyle]=\"{'white-space': 'initial'}\"\r\n [hidden]=\"col.hidden\"\r\n [format]=\"col.format\"\r\n [class]=\"col.Class\"\r\n [locked]=\"locked(col)\"\r\n [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ dataItem[col.field] | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n <!--{{ dataItem[col.field] }}--> \r\n <div [ngSwitch]=\"cellStyleCondition(col, dataItem[col.field])\">\r\n <span *ngSwitchCase=true>\r\n <div class=\"cellStyleConditionDefault\" [style]=\"setCellStyleCondition(col, dataItem[col.field])\"> \r\n {{ dataItem[col.field] }}\r\n </div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field] }}\r\n </span>\r\n </div>\r\n\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && inlineEditedFormGroups\" [ngSwitch]=\"col.fieldType\" [formGroup]=\"inlineEditedFormGroups\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <input type=\"number\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <ion-checkbox [disabled]=\"(!!col.ReadOnly ? col.ReadOnly : false)\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" color=\"primary\" (ionChange)=\"inCellCheckBoxOnChange($event, rowIndex, col)\"></ion-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate', 'ztime','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zdatetime>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <input style=\"width: 100%;\" type=\"text\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <div *ngIf=\"isLoading\" class=\"k-i-loading\"></div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-grid .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-grid-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-grid .k-button{border-radius:5px;box-shadow:0 2px 2px #0000001a;background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-grid .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-grid .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid .k-grid-filter,:host ::ng-deep kendo-grid .k-grid .k-header-column-menu,:host ::ng-deep kendo-grid .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-grid .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:#d6e0ef80}:host ::ng-deep kendo-grid tr.k-alt{background-color:#e8eef680}:host ::ng-deep kendo-grid tbody tr:hover,:host ::ng-deep kendo-grid tbody tr.k-state-hover{background-color:#d6e0ef80}:host ::ng-deep kendo-grid .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:#ff5e5b66}:host ::ng-deep kendo-grid .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-hover{color:#ff5e5b;background-color:#ff5e5b26}.cellStyleConditionDefault{border-radius:5px;text-align:center}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right}.centerAligned{text-align:center}.gridTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-secondary)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"], components: [{ type: i5.GridComponent, selector: "kendo-grid", inputs: ["data", "scrollable", "selectable", "trackBy", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "navigable", "autoSize", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "skip", "sort", "group", "navigatable", "rowClass", "rowSticky", "rowSelected", "cellSelected", "isDetailExpanded", "isGroupExpanded", "pageSize", "height", "rowHeight", "detailRowHeight", "filter"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "dataStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { type: i5.CheckboxColumnComponent, selector: "kendo-grid-checkbox-column", inputs: ["showSelectAll"] }, { type: i5.ColumnComponent, selector: "kendo-grid-column", inputs: ["sortable", "groupable", "editor", "filter", "filterable", "editable", "field", "format"] }, { type: i5.NumericFilterCellComponent, selector: "kendo-grid-numeric-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i5.EqualFilterOperatorComponent, selector: "kendo-filter-eq-operator" }, { type: i5.NotEqualFilterOperatorComponent, selector: "kendo-filter-neq-operator" }, { type: i5.LessFilterOperatorComponent, selector: "kendo-filter-lt-operator" }, { type: i5.LessOrEqualToFilterOperatorComponent, selector: "kendo-filter-lte-operator" }, { type: i5.GreaterFilterOperatorComponent, selector: "kendo-filter-gt-operator" }, { type: i5.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-filter-gte-operator" }, { type: i5.IsNullFilterOperatorComponent, selector: "kendo-filter-isnull-operator" }, { type: i5.IsNotNullFilterOperatorComponent, selector: "kendo-filter-isnotnull-operator" }, { type: i6.DateRangeFilterCellComponent, selector: "date-range-filter-cell", inputs: ["filter", "field"] }, { type: i5.DateFilterCellComponent, selector: "kendo-grid-date-filter-cell", inputs: ["showOperators"] }, { type: i5.StringFilterCellComponent, selector: "kendo-grid-string-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i5.ContainsFilterOperatorComponent, selector: "kendo-filter-contains-operator" }, { type: i5.StartsWithFilterOperatorComponent, selector: "kendo-filter-startswith-operator" }, { type: i5.EndsWithFilterOperatorComponent, selector: "kendo-filter-endswith-operator" }, { type: i7.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "decimals", "step", "spinners", "rangeValidation", "tabindex", "changeValueOnScroll", "selectOnFocus", "value", "format", "tabIndex", "size", "rounded", "fillMode", "max", "min", "placeholder", "maxlength"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i8.PopupComponent, selector: "kendo-popup", inputs: ["animate", "anchorAlign", "collision", "popupAlign", "copyAnchorStyles", "positionMode", "offset", "anchor", "popupClass", "margin"], outputs: ["anchorViewportLeave", "close", "open", "positionChange"], exportAs: ["kendo-popup"] }, { type: i9.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i7.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "size", "rounded", "fillMode", "tabIndex", "successIcon", "errorIcon", "clearButtonIcon", "placeholder", "maxlength"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { type: i9.IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "indeterminate", "mode", "name", "value"] }, { type: i10.ZselectmultipleComponent, selector: "app-zselectmultiple", inputs: ["data", "group", "form", "iconList", "buttonList"] }, { type: i11.ZtextareaComponent, selector: "app-ztextarea", inputs: ["data", "group", "form"] }, { type: i12.ZdatetimeComponent, selector: "app-zdatetime", inputs: ["data", "group", "form"] }, { type: i13.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i5.CommandColumnComponent, selector: "kendo-grid-command-column" }, { type: i5.ExcelComponent, selector: "kendo-grid-excel", inputs: ["fileName", "filterable", "creator", "date", "forceProxy", "proxyURL", "fetchData", "paddingCellOptions", "headerPaddingCellOptions", "collapsible"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i15.TooltipDirective, selector: "[kendoTooltip]", inputs: ["filter", "position", "showAfter", "callout", "closable", "offset", "tooltipTemplate", "showOn", "titleTemplate", "tooltipWidth", "tooltipHeight", "tooltipClass", "collision", "closeTitle"], exportAs: ["kendoTooltip"] }, { type: i16.ZGridBindingDirective, selector: "[zgridbinding]", inputs: ["zgridbinding"] }, { type: i14.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.SelectionDirective, selector: "[kendoGridSelectBy]" }, { type: i14.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.ToolbarTemplateDirective, selector: "[kendoGridToolbarTemplate]", inputs: ["position"] }, { type: i17.ButtonDirective, selector: "button[kendoButton], span[kendoButton]", inputs: ["toggleable", "role", "togglable", "selected", "tabIndex", "icon", "iconClass", "imageUrl", "disabled", "size", "rounded", "fillMode", "themeColor", "shape", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { type: i5.ExcelCommandDirective, selector: "[kendoGridExcelCommand]" }, { type: i5.AddCommandDirective, selector: "[kendoGridAddCommand]" }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.FilterCellTemplateDirective, selector: "[kendoGridFilterCellTemplate]" }, { type: i14.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i5.EditTemplateDirective, selector: "[kendoGridEditTemplate]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { type: i5.FooterTemplateDirective, selector: "[kendoGridFooterTemplate]" }, { type: i5.FocusableDirective, selector: "[kendoGridFocusable], [kendoGridEditCommand], [kendoGridRemoveCommand], [kendoGridSaveCommand], [kendoGridCancelCommand], [kendoGridSelectionCheckbox] ", inputs: ["kendoGridFocusable"] }, { type: i5.SaveCommandDirective, selector: "[kendoGridSaveCommand]" }, { type: i5.CancelCommandDirective, selector: "[kendoGridCancelCommand]" }, { type: i5.EditCommandDirective, selector: "[kendoGridEditCommand]" }, { type: i5.RemoveCommandDirective, selector: "[kendoGridRemoveCommand]" }], pipes: { "date": i14.DatePipe, "number": i14.DecimalPipe } });
896
+ ZgridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: ZgridComponent, selector: "app-zgrid", inputs: { data: "data", group: "group", form: "form" }, viewQueries: [{ propertyName: "tooltipDir", first: true, predicate: TooltipDirective, descendants: true }], ngImport: i0, template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div>\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <div kendoTooltip\r\n showOn=\"none\"\r\n [tooltipTemplate]=\"template\"\r\n filter=\".k-grid td\"\r\n (mouseover)=\"showTooltip($event)\">\r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject}\" [ngClass]=\"data.Class\"\r\n [data]=\"gridData\"\r\n [pageSize]=\"state.take\"\r\n [pageable]=\"{responsive: true, buttonCount: 3, pageSizes: pageSizes, previousNext: previousNext}\"\r\n [skip]=\"state.skip\"\r\n [sort]=\"state.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"state.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n (columnReorder)=\"columnsOrderChanged($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"mySelection\"\r\n [ngStyle]=\"getGridStyle()\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\">\r\n <!--[scrollable]=\"scrollMode\" temp remove. causing some bug on pagination-->\r\n <ng-template kendoGridToolbarTemplate *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.EnableGridCommand\">\r\n <button type=\"button\" kendoButton (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>&nbsp;Refresh</button>\r\n <button type=\"button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-file-excel\"></span>&nbsp;Export Data to Excel</button>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.AllowSaveState\"><span class=\"k-icon k-i-star\"></span>&nbsp;Save Setting</button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"gridDefaultStateExist\"><span class=\"k-icon k-i-star-outline\"></span>&nbsp;Restore Setting</button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand \"><span class=\"k-icon k-i-add\"></span>Add New</button>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\"></kendo-grid-checkbox-column>\r\n <kendo-grid-column *ngFor=\"let col of columns\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title\"\r\n [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\"\r\n [filter]=\"col.filter\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [headerStyle]=\"{'white-space': 'initial'}\"\r\n [hidden]=\"col.hidden\"\r\n [format]=\"col.format\"\r\n [class]=\"col.Class\"\r\n [locked]=\"locked(col)\"\r\n [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [data]=\"data\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ dataItem[col.field] | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n <!--{{ dataItem[col.field] }}-->\r\n <div [ngSwitch]=\"cellStyleCondition(col, dataItem[col.field])\">\r\n <span *ngSwitchCase=true>\r\n <div class=\"cellStyleConditionDefault\" [style]=\"setCellStyleCondition(col, dataItem[col.field])\">\r\n {{ dataItem[col.field] }}\r\n </div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field] }}\r\n </span>\r\n </div>\r\n\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && inlineEditedFormGroups\" [ngSwitch]=\"col.fieldType\" [formGroup]=\"inlineEditedFormGroups\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <input type=\"number\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <ion-checkbox [disabled]=\"(!!col.ReadOnly ? col.ReadOnly : false)\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" color=\"primary\" (ionChange)=\"inCellCheckBoxOnChange($event, rowIndex, col)\"></ion-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate', 'ztime','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zdatetime>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <input style=\"width: 100%;\" type=\"text\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <div *ngIf=\"isLoading\" class=\"k-i-loading\"></div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-grid .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-grid-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-grid .k-button{border-radius:5px;box-shadow:0 2px 2px #0000001a;background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-grid .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-grid .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid .k-grid-filter,:host ::ng-deep kendo-grid .k-grid .k-header-column-menu,:host ::ng-deep kendo-grid .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-grid .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:#d6e0ef80}:host ::ng-deep kendo-grid tr.k-alt{background-color:#e8eef680}:host ::ng-deep kendo-grid tbody tr:hover,:host ::ng-deep kendo-grid tbody tr.k-state-hover{background-color:#d6e0ef80}:host ::ng-deep kendo-grid .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:#ff5e5b66}:host ::ng-deep kendo-grid .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-hover{color:#ff5e5b;background-color:#ff5e5b26}.cellStyleConditionDefault{border-radius:5px;text-align:center}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right}.centerAligned{text-align:center}.gridTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-secondary)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"], components: [{ type: i5.GridComponent, selector: "kendo-grid", inputs: ["data", "scrollable", "selectable", "trackBy", "virtualColumns", "filterable", "sortable", "pageable", "groupable", "navigable", "autoSize", "resizable", "reorderable", "loading", "columnMenu", "hideHeader", "skip", "sort", "group", "navigatable", "rowClass", "rowSticky", "rowSelected", "cellSelected", "isDetailExpanded", "isGroupExpanded", "pageSize", "height", "rowHeight", "detailRowHeight", "filter"], outputs: ["filterChange", "pageChange", "groupChange", "sortChange", "selectionChange", "dataStateChange", "groupExpand", "groupCollapse", "detailExpand", "detailCollapse", "edit", "cancel", "save", "remove", "add", "cellClose", "cellClick", "pdfExport", "excelExport", "columnResize", "columnReorder", "columnVisibilityChange", "columnLockedChange", "columnStickyChange", "scrollBottom", "contentScroll"], exportAs: ["kendoGrid"] }, { type: i5.CheckboxColumnComponent, selector: "kendo-grid-checkbox-column", inputs: ["showSelectAll"] }, { type: i5.ColumnComponent, selector: "kendo-grid-column", inputs: ["sortable", "groupable", "editor", "filter", "filterable", "editable", "field", "format"] }, { type: i5.NumericFilterCellComponent, selector: "kendo-grid-numeric-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i5.EqualFilterOperatorComponent, selector: "kendo-filter-eq-operator" }, { type: i5.NotEqualFilterOperatorComponent, selector: "kendo-filter-neq-operator" }, { type: i5.LessFilterOperatorComponent, selector: "kendo-filter-lt-operator" }, { type: i5.LessOrEqualToFilterOperatorComponent, selector: "kendo-filter-lte-operator" }, { type: i5.GreaterFilterOperatorComponent, selector: "kendo-filter-gt-operator" }, { type: i5.GreaterOrEqualToFilterOperatorComponent, selector: "kendo-filter-gte-operator" }, { type: i5.IsNullFilterOperatorComponent, selector: "kendo-filter-isnull-operator" }, { type: i5.IsNotNullFilterOperatorComponent, selector: "kendo-filter-isnotnull-operator" }, { type: i6.DateRangeFilterCellComponent, selector: "date-range-filter-cell", inputs: ["filter", "field", "data"] }, { type: i5.DateFilterCellComponent, selector: "kendo-grid-date-filter-cell", inputs: ["showOperators"] }, { type: i5.StringFilterCellComponent, selector: "kendo-grid-string-filter-cell", inputs: ["filterDelay", "showOperators"] }, { type: i5.ContainsFilterOperatorComponent, selector: "kendo-filter-contains-operator" }, { type: i5.StartsWithFilterOperatorComponent, selector: "kendo-filter-startswith-operator" }, { type: i5.EndsWithFilterOperatorComponent, selector: "kendo-filter-endswith-operator" }, { type: i7.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "decimals", "step", "spinners", "rangeValidation", "tabindex", "changeValueOnScroll", "selectOnFocus", "value", "format", "tabIndex", "size", "rounded", "fillMode", "max", "min", "placeholder", "maxlength"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i8.PopupComponent, selector: "kendo-popup", inputs: ["animate", "anchorAlign", "collision", "popupAlign", "copyAnchorStyles", "positionMode", "offset", "anchor", "popupClass", "margin"], outputs: ["anchorViewportLeave", "close", "open", "positionChange"], exportAs: ["kendo-popup"] }, { type: i9.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i7.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "size", "rounded", "fillMode", "tabIndex", "successIcon", "errorIcon", "clearButtonIcon", "placeholder", "maxlength"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { type: i9.IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "indeterminate", "mode", "name", "value"] }, { type: i10.ZselectmultipleComponent, selector: "app-zselectmultiple", inputs: ["data", "group", "form", "iconList", "buttonList"] }, { type: i11.ZtextareaComponent, selector: "app-ztextarea", inputs: ["data", "group", "form"] }, { type: i12.ZdatetimeComponent, selector: "app-zdatetime", inputs: ["data", "group", "form"] }, { type: i13.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i5.CommandColumnComponent, selector: "kendo-grid-command-column" }, { type: i5.ExcelComponent, selector: "kendo-grid-excel", inputs: ["fileName", "filterable", "creator", "date", "forceProxy", "proxyURL", "fetchData", "paddingCellOptions", "headerPaddingCellOptions", "collapsible"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i15.TooltipDirective, selector: "[kendoTooltip]", inputs: ["filter", "position", "showAfter", "callout", "closable", "offset", "tooltipTemplate", "showOn", "titleTemplate", "tooltipWidth", "tooltipHeight", "tooltipClass", "collision", "closeTitle"], exportAs: ["kendoTooltip"] }, { type: i16.ZGridBindingDirective, selector: "[zgridbinding]", inputs: ["zgridbinding"] }, { type: i14.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.SelectionDirective, selector: "[kendoGridSelectBy]" }, { type: i14.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.ToolbarTemplateDirective, selector: "[kendoGridToolbarTemplate]", inputs: ["position"] }, { type: i17.ButtonDirective, selector: "button[kendoButton], span[kendoButton]", inputs: ["toggleable", "role", "togglable", "selected", "tabIndex", "icon", "iconClass", "imageUrl", "disabled", "size", "rounded", "fillMode", "themeColor", "shape", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { type: i5.ExcelCommandDirective, selector: "[kendoGridExcelCommand]" }, { type: i5.AddCommandDirective, selector: "[kendoGridAddCommand]" }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.FilterCellTemplateDirective, selector: "[kendoGridFilterCellTemplate]" }, { type: i14.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i5.EditTemplateDirective, selector: "[kendoGridEditTemplate]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.CellTemplateDirective, selector: "[kendoGridCellTemplate]" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { type: i5.FooterTemplateDirective, selector: "[kendoGridFooterTemplate]" }, { type: i5.FocusableDirective, selector: "[kendoGridFocusable], [kendoGridEditCommand], [kendoGridRemoveCommand], [kendoGridSaveCommand], [kendoGridCancelCommand], [kendoGridSelectionCheckbox] ", inputs: ["kendoGridFocusable"] }, { type: i5.SaveCommandDirective, selector: "[kendoGridSaveCommand]" }, { type: i5.CancelCommandDirective, selector: "[kendoGridCancelCommand]" }, { type: i5.EditCommandDirective, selector: "[kendoGridEditCommand]" }, { type: i5.RemoveCommandDirective, selector: "[kendoGridRemoveCommand]" }], pipes: { "date": i14.DatePipe, "number": i14.DecimalPipe } });
877
897
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ZgridComponent, decorators: [{
878
898
  type: Component,
879
- args: [{ selector: "app-zgrid", template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div>\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <div kendoTooltip\r\n showOn=\"none\"\r\n [tooltipTemplate]=\"template\"\r\n filter=\".k-grid td\"\r\n (mouseover)=\"showTooltip($event)\"> \r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject}\" [ngClass]=\"data.Class\"\r\n [data]=\"gridData\"\r\n [pageSize]=\"state.take\"\r\n [pageable]=\"{responsive: true, buttonCount: 3, pageSizes: pageSizes, previousNext: previousNext}\"\r\n [skip]=\"state.skip\"\r\n [sort]=\"state.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"state.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n (columnReorder)=\"columnsOrderChanged($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"mySelection\"\r\n [ngStyle]=\"getGridStyle()\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\">\r\n <!--[scrollable]=\"scrollMode\" temp remove. causing some bug on pagination-->\r\n <ng-template kendoGridToolbarTemplate *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.EnableGridCommand\">\r\n <button type=\"button\" kendoButton (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>&nbsp;Refresh</button>\r\n <button type=\"button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-file-excel\"></span>&nbsp;Export Data to Excel</button>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.AllowSaveState\"><span class=\"k-icon k-i-star\"></span>&nbsp;Save Setting</button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"gridDefaultStateExist\"><span class=\"k-icon k-i-star-outline\"></span>&nbsp;Restore Setting</button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand \"><span class=\"k-icon k-i-add\"></span>Add New</button>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\"></kendo-grid-checkbox-column>\r\n <kendo-grid-column *ngFor=\"let col of columns\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title\"\r\n [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\"\r\n [filter]=\"col.filter\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [headerStyle]=\"{'white-space': 'initial'}\"\r\n [hidden]=\"col.hidden\"\r\n [format]=\"col.format\"\r\n [class]=\"col.Class\"\r\n [locked]=\"locked(col)\"\r\n [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ dataItem[col.field] | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n <!--{{ dataItem[col.field] }}--> \r\n <div [ngSwitch]=\"cellStyleCondition(col, dataItem[col.field])\">\r\n <span *ngSwitchCase=true>\r\n <div class=\"cellStyleConditionDefault\" [style]=\"setCellStyleCondition(col, dataItem[col.field])\"> \r\n {{ dataItem[col.field] }}\r\n </div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field] }}\r\n </span>\r\n </div>\r\n\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && inlineEditedFormGroups\" [ngSwitch]=\"col.fieldType\" [formGroup]=\"inlineEditedFormGroups\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <input type=\"number\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <ion-checkbox [disabled]=\"(!!col.ReadOnly ? col.ReadOnly : false)\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" color=\"primary\" (ionChange)=\"inCellCheckBoxOnChange($event, rowIndex, col)\"></ion-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate', 'ztime','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zdatetime>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <input style=\"width: 100%;\" type=\"text\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <div *ngIf=\"isLoading\" class=\"k-i-loading\"></div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-grid .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-grid-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-grid .k-button{border-radius:5px;box-shadow:0 2px 2px #0000001a;background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-grid .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-grid .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid .k-grid-filter,:host ::ng-deep kendo-grid .k-grid .k-header-column-menu,:host ::ng-deep kendo-grid .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-grid .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:#d6e0ef80}:host ::ng-deep kendo-grid tr.k-alt{background-color:#e8eef680}:host ::ng-deep kendo-grid tbody tr:hover,:host ::ng-deep kendo-grid tbody tr.k-state-hover{background-color:#d6e0ef80}:host ::ng-deep kendo-grid .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:#ff5e5b66}:host ::ng-deep kendo-grid .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-hover{color:#ff5e5b;background-color:#ff5e5b26}.cellStyleConditionDefault{border-radius:5px;text-align:center}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right}.centerAligned{text-align:center}.gridTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-secondary)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"] }]
899
+ args: [{ selector: "app-zgrid", template: "<!--\r\n<div style=\"margin: 10px\">\r\n <div class=\"card\">\r\n <div class=\"card-block k-form\">\r\n <fieldset>\r\n <legend>Binding types</legend>\r\n <div class=\"k-form-field\">\r\n <span>Bind the data to:</span>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"array\" value=\"array\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"array\">Array object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"gridDataResult\" value=\"gridDataResult\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"gridDataResult\">GridDataResult object</label>\r\n <input [(ngModel)]=\"bindingType\" type=\"radio\" name=\"mode\" id=\"async\" value=\"async\" class=\"k-radio\"\r\n (change)=\"changeBindingType($event)\">\r\n <label class=\"k-radio-label\" for=\"async\">Asynchronous source</label>\r\n </div>\r\n </fieldset>\r\n </div>\r\n </div>\r\n</div> -->\r\n<div style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"gridTitle\">{{data.Title}}</div>\r\n <ng-template #template let-anchor>\r\n <span>{{ anchor.nativeElement.innerText }}</span>\r\n </ng-template>\r\n <div kendoTooltip\r\n showOn=\"none\"\r\n [tooltipTemplate]=\"template\"\r\n filter=\".k-grid td\"\r\n (mouseover)=\"showTooltip($event)\">\r\n <kendo-grid [zgridbinding]=\"{data: data, group: group, params: params, gridSubject: gridSubject}\" [ngClass]=\"data.Class\"\r\n [data]=\"gridData\"\r\n [pageSize]=\"state.take\"\r\n [pageable]=\"{responsive: true, buttonCount: 3, pageSizes: pageSizes, previousNext: previousNext}\"\r\n [skip]=\"state.skip\"\r\n [sort]=\"state.sort\"\r\n [sortable]=\"{allowUnsort: true,mode: 'multiple'}\"\r\n [filter]=\"state.filter\"\r\n [filterable]=\"data.enableFiltering !== false\"\r\n [resizable]=\"true\"\r\n [reorderable]=\"true\"\r\n [columnMenu]=\"data.DisableGridColumnMenu ? false : { filter: true }\"\r\n [hidden]=\"!(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n (cellClose)=\"editCellCloseHandler($event)\"\r\n (dataStateChange)=\"dataStateChange($event)\"\r\n (pageChange)=\"pageChange($event)\"\r\n (sortChange)=\"sortChange($event)\"\r\n (filterChange)=\"filterChange($event)\"\r\n (columnReorder)=\"columnsOrderChanged($event)\"\r\n [kendoGridSelectBy]=\"rowSelectionKey\"\r\n [selectable]=\"selectableSettings\"\r\n [(selectedKeys)]=\"mySelection\"\r\n [ngStyle]=\"getGridStyle()\"\r\n [trackBy]=\"trackBy\"\r\n (cancel)=\"cancelHandler($event)\"\r\n (save)=\"saveHandler($event)\"\r\n (remove)=\"removeHandler($event)\"\r\n (edit)=\"editHandler($event)\"\r\n (add)=\"addHandler($event)\">\r\n <!--[scrollable]=\"scrollMode\" temp remove. causing some bug on pagination-->\r\n <ng-template kendoGridToolbarTemplate *ngIf=\"data.AllowRefreshButton || data.AllowExport || data.AllowSaveState || data.EnableGridCommand\">\r\n <button type=\"button\" kendoButton (click)=\"refreshData()\" *ngIf=\"data.AllowRefreshButton\"><span class=\"k-icon k-i-refresh-sm\"></span>&nbsp;Refresh</button>\r\n <button type=\"button\" kendoGridExcelCommand *ngIf=\"data.AllowExport\"><span class=\"k-icon k-i-file-excel\"></span>&nbsp;Export Data to Excel</button>\r\n <button type=\"button\" kendoButton (click)=\"saveGridSettings()\" *ngIf=\"data.AllowSaveState\"><span class=\"k-icon k-i-star\"></span>&nbsp;Save Setting</button>\r\n <button type=\"button\" kendoButton (click)=\"restoreGridSettings()\" *ngIf=\"gridDefaultStateExist\"><span class=\"k-icon k-i-star-outline\"></span>&nbsp;Restore Setting</button>\r\n <button type=\"button\" kendoGridAddCommand *ngIf=\"data.EnableGridCommand \"><span class=\"k-icon k-i-add\"></span>Add New</button>\r\n </ng-template>\r\n <kendo-grid-checkbox-column *ngIf=\"!!data.SelectOptions\" [width]=\"60\" showSelectAll=\"true\" [columnMenu]=\"true\"></kendo-grid-checkbox-column>\r\n <kendo-grid-column *ngFor=\"let col of columns\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title\"\r\n [width]=\"col.width\"\r\n [minResizableWidth]=\"col.minResizableWidth\"\r\n [filter]=\"col.filter\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [headerStyle]=\"{'white-space': 'initial'}\"\r\n [hidden]=\"col.hidden\"\r\n [format]=\"col.format\"\r\n [class]=\"col.Class\"\r\n [locked]=\"locked(col)\"\r\n [columnMenu]=\"!col.disableColumnMenu\"\r\n [editor]=\"col.editorType\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'ztime'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [data]=\"data\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoGridFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-grid-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-filter-contains-operator></kendo-filter-contains-operator>\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-startswith-operator></kendo-filter-startswith-operator>\r\n <kendo-filter-endswith-operator></kendo-filter-endswith-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-grid-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- Grid Edit Template -->\r\n <ng-template kendoGridEditTemplate *ngIf=\"data.EnableGridCommand \" let-dataItem=\"dataItem\" let-column=\"col\" let-formGroup=\"formGroup\" let-isNew=\"isNew\">\r\n <div [ngSwitch]=\"col.fieldType\">\r\n <div *ngSwitchCase=\"'number'\">\r\n <kendo-numerictextbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-numerictextbox>\r\n <kendo-popup [anchor]=\"cellAnchor.numericInput\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <kendo-textbox #cellAnchor [formControl]=\"formGroup.get(col.field)\"></kendo-textbox>\r\n <kendo-popup [anchor]=\"cellAnchor.input\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !(isNew && formGroup.get(col.field).untouched)\"\r\n popupClass=\"k-widget k-tooltip k-tooltip-validation k-invalid-msg\"\r\n style=\"padding-left: 2px; opacity: 0.5;\">\r\n <span class=\"k-icon k-i-warning\"></span>\r\n <!--<ion-label style=\"padding-top: 1px; padding-left: 3px;\">{{ col.Name }} is required.</ion-label>-->\r\n\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.required\">\r\n {{ col.Name }} required.\r\n </ion-label>\r\n <ion-label style=\"padding-top: 1px; padding-left: 3px;\"\r\n *ngIf=\"formGroup.get(col.field).invalid && !formGroup.get(col.field).untouched && formGroup.get(col.field).errors?.pattern\">\r\n {{ col.ValidatorMessage ? col.ValidatorMessage : \"Please check the input value.\" }}\r\n </ion-label>\r\n </kendo-popup>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\r\n <div style=\"margin: 1px 0;\" *ngIf=\"!col.clickableIcons && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ dataItem[col.field] | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ dataItem[col.field] | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ dataItem[col.field] | number: getFormat(col, '1.2-2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ dataItem[col.field] | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n <!--{{ dataItem[col.field] }}-->\r\n <div [ngSwitch]=\"cellStyleCondition(col, dataItem[col.field])\">\r\n <span *ngSwitchCase=true>\r\n <div class=\"cellStyleConditionDefault\" [style]=\"setCellStyleCondition(col, dataItem[col.field])\">\r\n {{ dataItem[col.field] }}\r\n </div>\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field] }}\r\n </span>\r\n </div>\r\n\r\n </span>\r\n </div>\r\n <!-- <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ col.ClickableIcons }}\r\n <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon>\r\n </ion-button>\r\n </span> -->\r\n <div style=\"margin: 5px 0;\" *ngIf=\"col.isEditableInGrid === true && inlineEditedFormGroups\" [ngSwitch]=\"col.fieldType\" [formGroup]=\"inlineEditedFormGroups\"\r\n [ngClass]=\"getClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <input type=\"number\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <ion-checkbox [disabled]=\"(!!col.ReadOnly ? col.ReadOnly : false)\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" color=\"primary\" (ionChange)=\"inCellCheckBoxOnChange($event, rowIndex, col)\"></ion-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate', 'ztime','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(rowIndex)\"></app-zdatetime>\r\n </span>\r\n <span *ngSwitchDefault>\r\n <input style=\"width: 100%;\" type=\"text\" [formControl]=\"this.getFormControl(rowIndex, col.field)\" />\r\n </span>\r\n </div>\r\n <span style=\"margin-top: 10px;\" *ngFor=\"let icon of col.clickableIcons\">\r\n <span [ngClass]=\"icon.Class ? icon.Class : ''\" *ngIf=\"!!icon && (!!dataItem.WFS_StatusCode && !!icon)\r\n ? dataItem.WFS_StatusCode !== icon.WFS_StatusCode\r\n : true;\r\n else disabledButton\" (click)=\"onBtnClick($event, icon, dataItem, dataItem[col.field])\">\r\n {{icon.Name || dataItem[col.field]}} <fa-icon [icon]=\"icon.Icon\" style=\"padding: 4px 6px;\">\r\n </fa-icon>\r\n </span>\r\n <ng-template #disabledButton>\r\n </ng-template>\r\n </span>\r\n <!-- <strong>{{ dataItem[col.field] }}</strong> -->\r\n <!-- <span class=\"{{dataItem.Discontinued ? 'discontinued' : 'active'}}\">\r\n {{dataItem.Discontinued ? \"discontinued\" : \"active\"}}\r\n </span> -->\r\n </ng-template>\r\n <ng-template kendoGridFooterTemplate let-column let-columnIndex=\"columnIndex\" *ngIf=\"data.EnableAggregate\">\r\n <div style=\"margin: 5px 0;\" [ngSwitch]=\"col.fieldType\">\r\n {{col.aggregateType}}\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'ztime'\">\r\n {{ col.aggregateValue | date: 'HH:mm' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ col.aggregateValue | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ col.aggregateValue | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n {{ col.aggregateValue | number }}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{ col.aggregateValue | number: getFormat(col, '1.2.2') }}\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n {{ col.aggregateValue | number: getFormat(col) }}\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ col.aggregateValue }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ col.aggregateValue }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-grid-column>\r\n <kendo-grid-command-column *ngIf=\"data.EnableGridCommand\" width=\"180\" [columnMenu]=\"false\">\r\n <ng-template kendoGridCellTemplate let-isNew=\"isNew\">\r\n <button kendoGridSaveCommand>\r\n {{ isNew ? 'Save' : 'Update' }}\r\n </button>\r\n <button kendoGridCancelCommand [primary]=\"true\">\r\n {{ isNew ? 'Discard changes' : 'Cancel' }}\r\n </button>\r\n <button kendoGridEditCommand>\r\n {{ \"Edit\" }}\r\n </button>\r\n <button kendoGridRemoveCommand>\r\n {{ \"Remove\" }}\r\n </button>\r\n </ng-template>\r\n </kendo-grid-command-column>\r\n <kendo-grid-excel fileName=\"Export.xlsx\" [fetchData]=\"allResults\"></kendo-grid-excel>\r\n </kendo-grid>\r\n <div *ngIf=\"isLoading\" class=\"k-i-loading\"></div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep kendo-grid .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-grid .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-grid-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-grid .k-button{border-radius:5px;box-shadow:0 2px 2px #0000001a;background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-grid .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-grid .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-grid .k-grid .k-grid-filter,:host ::ng-deep kendo-grid .k-grid .k-header-column-menu,:host ::ng-deep kendo-grid .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-grid .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-grid .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:#d6e0ef80}:host ::ng-deep kendo-grid tr.k-alt{background-color:#e8eef680}:host ::ng-deep kendo-grid tbody tr:hover,:host ::ng-deep kendo-grid tbody tr.k-state-hover{background-color:#d6e0ef80}:host ::ng-deep kendo-grid .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:#ff5e5b66}:host ::ng-deep kendo-grid .k-pager-numbers .k-link:hover,:host ::ng-deep kendo-grid .k-pager-numbers .k-link.k-state-hover{color:#ff5e5b;background-color:#ff5e5b26}.cellStyleConditionDefault{border-radius:5px;text-align:center}.cellWrapText .gridCell{white-space:pre-line!important}.rightAligned{text-align:right}.centerAligned{text-align:center}.gridTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.gridCell.primary{color:var(--ion-color-primary)}.gridCell.secondary{color:var(--ion-color-secondary)}.gridCell.tertiary{color:var(--ion-color-tertiary)}.gridCell.success{color:var(--ion-color-success-shade)}.gridCell.warning{color:var(--ion-color-warning)}.gridCell.danger{color:var(--ion-color-danger)}.gridCell.dark{color:var(--ion-color-dark)}.gridCell.medium{color:var(--ion-color-medium)}.gridCell.light{color:var(--ion-color-light)}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:#ffffff4d;color:#0f4800}\n"] }]
880
900
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.FormBuilder }, { type: i3.AuthService }, { type: i3.WebApiService }, { type: i3.ZGridStatePersistingService }, { type: i3.ToastService }, { type: i3.ZCoreService }, { type: i3.StorageSessionService }, { type: i4.MainService }]; }, propDecorators: { data: [{
881
901
  type: Input
882
902
  }], group: [{
@@ -887,4 +907,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
887
907
  type: ViewChild,
888
908
  args: [TooltipDirective]
889
909
  }] } });
890
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBUyxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3ZFLE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFlbkUsT0FBTyxFQUV1QixvQkFBb0IsRUFBRSxnQkFBZ0IsRUFFbkUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCekIsTUFBTSxPQUFPLGNBQWM7SUF3RHpCLFlBQ1UsY0FBOEIsRUFDOUIsTUFBYyxFQUNkLFdBQXdCLEVBQ3hCLFdBQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLDJCQUF3RCxFQUN4RCxZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxXQUF3QjtRQVR4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIs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QUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTVCLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVMsRUFBRSxJQUFXLEVBQUUsR0FBVztRQUN0RCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMxQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLE9BQU8sR0FBRyxDQUFDO2FBQ1o7U0FDRjtRQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDOzs0R0F0aUNVLGNBQWM7Z0dBQWQsY0FBYyxxSkFJZCxnQkFBZ0IsZ0RDNUQ3Qixvbm9CQThVQTs0RkR0UmEsY0FBYztrQkFMMUIsU0FBUzsrQkFDRSxXQUFXO3dXQUtaLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUM4QixVQUFVO3NCQUE3QyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEZvcm1Db250cm9sLCBGb3JtQXJyYXksIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFwLCBkZWxheSwgbWFwLCBzd2l0Y2hNYXAsIGNvbmNhdE1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBFeGNlbEV4cG9ydERhdGEgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1leGNlbC1leHBvcnQnO1xyXG5pbXBvcnQgeyBHcmlkSXRlbSwgU2Nyb2xsTW9kZSwgU2VsZWN0YWJsZVNldHRpbmdzIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZCc7XHJcbmltcG9ydCB7IFNvcnREZXNjcmlwdG9yLCBTdGF0ZSwgcHJvY2VzcyB9IGZyb20gXCJAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeVwiO1xyXG5pbXBvcnQgeyBUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdG9vbHRpcCc7XHJcbmltcG9ydCB7XHJcbiAgR3JpZERhdGFSZXN1bHQsXHJcbiAgRGF0YVN0YXRlQ2hhbmdlRXZlbnQsXHJcbiAgUGFnZUNoYW5nZUV2ZW50LFxyXG4gIENlbGxDbGlja0V2ZW50LFxyXG4gIEdyaWRDb21wb25lbnQsXHJcbiAgUm93QXJncyxcclxuICBDb2x1bW5SZW9yZGVyRXZlbnRcclxufSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZ3JpZFwiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG4vLyBpbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gXCJzcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50XCI7XHJcbmltcG9ydCB7IE1haW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL21haW4uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBaR3JpZEJpbmRpbmdEaXJlY3RpdmUgfSBmcm9tIFwiLi96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQge1xyXG4gIEF1dGhTZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBUb2FzdFNlcnZpY2UsIEdyaWRDYWNoaW5nLFxyXG4gIFpGaWVsZCwgWkdyb3VwLCBaQ29tcG9uZW50LCBaQ29tcG9uZW50UHJvcGVydGllcywgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBaQ29yZVNlcnZpY2UsXHJcbiAgWkdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLCBaR3JpZFBvc3RBcGlQYXJhbXMsIFpHcmlkU2V0dGluZ3MsIFpHcmlkQ29sdW1uU2V0dGluZ3MsIFpHcmlkQ3VzdG9tQ29sdW1uLCBTdG9yYWdlU2Vzc2lvblNlcnZpY2VcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgWkdyaWQge1xyXG4gIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zO1xyXG4gIHN0YXRlOiBTdGF0ZTtcclxuICBjb2x1bW5zOiBhbnlbXTtcclxuICBwYWdpbmF0aW9uQXBpUG9zdFVybDogc3RyaW5nO1xyXG4gIGRhdGE6IFpGaWVsZDtcclxuICBncm91cDogWkdyb3VwO1xyXG4gIHpncmlkOiBaR3JpZEJpbmRpbmdEaXJlY3RpdmU7XHJcbiAgaW5saW5lRWRpdGVkRm9ybUdyb3VwczogRm9ybUdyb3VwO1xyXG4gIGdldEdyaWREYXRhOiAoKSA9PiBhbnlbXTtcclxuICBnZXREYXRhOiAoKSA9PiB2b2lkO1xyXG4gIGNsZWFyRGF0YTogKCkgPT4gdm9pZDtcclxuICBzZXREYXRhOiAoZGF0YTogYW55KSA9PiB2b2lkO1xyXG4gIHNldENvbHVtbnM6IChjb2x1bW5GaWVsZHNOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikgPT4gdm9pZDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXpncmlkXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96Z3JpZC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96Z3JpZC5jb21wb25lbnQuc2Nzc1wiXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgWmdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgZGF0YTogWkZpZWxkO1xyXG4gIEBJbnB1dCgpIGdyb3VwOiBaR3JvdXA7XHJcbiAgQElucHV0KCkgZm9ybTogRm9ybUdyb3VwO1xyXG4gIEBWaWV3Q2hpbGQoVG9vbHRpcERpcmVjdGl2ZSkgcHVibGljIHRvb2x0aXBEaXI6IFRvb2x0aXBEaXJlY3RpdmU7XHJcbiAgLy8gQFZpZXdDaGlsZChaR3JpZEJpbmRpbmdEaXJlY3RpdmUsIHsgc3RhdGljOiBmYWxzZSB9KSB6Z3JpZDogWkdyaWRCaW5kaW5nRGlyZWN0aXZlO1xyXG4gIHpncmlkOiBhbnkgPSBudWxsO1xyXG4gIG9hdXRoVXJsOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgc2Nyb2xsTW9kZTogU2Nyb2xsTW9kZTtcclxuICBncmlkRGF0YTogR3JpZERhdGFSZXN1bHQ7XHJcbiAgc2VsZWN0YWJsZVNldHRpbmdzOiBTZWxlY3RhYmxlU2V0dGluZ3M7XHJcbiAgbXlTZWxlY3Rpb246IGFueVtdID0gW107XHJcbiAgaW5saW5lRWRpdGVkRm9ybUdyb3VwczogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyBmb3JtR3JvdXA6IEZvcm1Hcm91cDsgLy8gZm9yIGtlbmRvIGdyaWQgYnVpbHQtaW5cclxuICBwdWJsaWMgcHJldmlvdXNOZXh0OiBib29sZWFuO1xyXG5cclxuICBjb21wb25lbnRQcm9wZXJ0aWVzID0gbmV3IFpDb21wb25lbnRQcm9wZXJ0aWVzKCk7XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24sIG5vLXVuZGVyc2NvcmUtZGFuZ2xlLCBpZC1ibGFja2xpc3QsIGlkLW1hdGNoXHJcbiAgX3N0YXRlOiBTdGF0ZSA9IHtcclxuICAgIHNraXA6IDAsXHJcbiAgICB0YWtlOiAxMFxyXG4gIH07XHJcblxyXG4gIHBhcmFtczogWkdyaWRQb3N0QXBpUGFyYW1zID0ge1xyXG4gICAgcmVmZXJJZDogbnVsbCxcclxuICAgIHBhZ2VObzogMCxcclxuICAgIHBhZ2VTaXplOiAyMCxcclxuICAgIHNvcnRDb2x1bW5OYW1lOiBcIlwiLFxyXG4gICAgc29ydE9yZGVyOiBcIlwiLFxyXG4gICAgc29ydENvbHVtbk5hbWVzOiBbXSxcclxuICAgIHNvcnRPcmRlcnM6IFtdLFxyXG4gICAgZmlsdGVyUGFyYW1zOiBbXSxcclxuICAgIHBhcmFtZXRlcnM6IFwiXCIsXHJcbiAgICBmaWx0ZXJzOiBcIlwiLFxyXG4gICAgY29sdW1uczogXCJcIixcclxuICAgIGdyYW50VHlwZTogNFxyXG4gIH07XHJcblxyXG4gIGdyaWRTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgd2lkdGhSZWR1Y2U6IG51bWJlcjtcclxuICBwcml2YXRlIGhlaWdodFJlZHVjZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgZ0RhdGE6IGFueTtcclxuXHJcbiAgY29sdW1uczogYW55W107XHJcbiAgZWRpdGFibGVDb2x1bW5zOiBhbnlbXTtcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwYWdlU2l6ZXM6IGJvb2xlYW4gfCBhbnlbXTtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW47XHJcbiAgZ3JpZFN0b3JhZ2VLZXk6IHN0cmluZztcclxuICBncmlkRGVmYXVsdFN0YXRlRXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc05ldzogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBlZGl0ZWRSb3dJbmRleDogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYkFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZTogWkdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1haW5TZXJ2aWNlOiBNYWluU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5vYXV0aFVybCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCkuZTFPYXV0aFVybCArIFwiL1wiO1xyXG4gICAgdGhpcy5hbGxSZXN1bHRzID0gdGhpcy5hbGxSZXN1bHRzLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnJlZnJlc2hEYXRhID0gdGhpcy5yZWZyZXNoRGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5jbGVhckRhdGEgPSB0aGlzLmNsZWFyRGF0YS5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5zYXZlR3JpZFNldHRpbmdzID0gdGhpcy5zYXZlR3JpZFNldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnJlc3RvcmVHcmlkU2V0dGluZ3MgPSB0aGlzLnJlc3RvcmVHcmlkU2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0Q29tcG9uZW50UHJvcGVydGllcyh0aGlzKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVnaXN0ZXJDb21wb25lbnQodGhpcyk7XHJcblxyXG4gICAgLy8gR3JpZCBzYXZlZCBzZXR0aW5nIGtleShVc2VkIGluIENvb2tpZVN0b3JlICYgTG9jYWxTdG9yYWdlKVxyXG4gICAgdGhpcy5ncmlkU3RvcmFnZUtleSA9ICdpb25pYy1maWVsZDo6JyArIHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbi51c2VyTmFtZSArICc6OicgKyB0aGlzLmRhdGEuTmFtZSArICc6OicgKyB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgb2YodHJ1ZSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgLy9jb25jYXRNYXAoKCkgPT4ge1xyXG4gICAgICAgIC8vICAvLyB0cnkgZ2V0IGdyaWRzZXR0aW5nIGZyb20gY29va2llc3RvcmVcclxuICAgICAgICAvLyAgcmV0dXJuIHRoaXMubWFpblNlcnZpY2UuY29va2llU3RvcmVHZXQodGhpcy5ncmlkU3RvcmFnZUtleSwgdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLmFjY2Vzc190b2tlbik7XHJcbiAgICAgICAgLy99KSxcclxuICAgICAgICAvL3N3aXRjaE1hcChzYXZlZEdyaWRDYWNoZSA9PiB7XHJcbiAgICAgICAgLy8gIGlmIChzYXZlZEdyaWRDYWNoZSkgeyAgXHJcbiAgICAgICAgLy8gICAgLy8gS2VlcCB0aGUgZ3JpZFNldHRpbmcgZnJvbSBjb29raWVzdG9yZSB0byBsb2NhbFN0b3JhZ2VcclxuICAgICAgICAvLyAgICB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5zZXQodGhpcy5ncmlkU3RvcmFnZUtleSwgc2F2ZWRHcmlkQ2FjaGUpO1xyXG4gICAgICAgIC8vICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAvLyAgfVxyXG4gICAgICAgIC8vICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgIC8vfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIEdyaWQgZGVmYXVsdCBzZXR0aW5nXHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMud2lkdGhSZWR1Y2UgPSB0aGlzLmRhdGEuV2lkdGhSZWR1Y2UgfHwgNjA7XHJcbiAgICAgICAgICB0aGlzLmhlaWdodFJlZHVjZSA9IHRoaXMuZGF0YS5IZWlnaHRSZWR1Y2UgfHwgNTYwO1xyXG4gICAgICAgICAgdGhpcy5fc3RhdGUudGFrZSA9IHRoaXMuZGF0YS5QYWdlU2l6ZSB8fCAyMDtcclxuICAgICAgICAgIHRoaXMucGFnZVNpemVzID0gWzIwLCA1MCwgMTAwLCAyMDAsIDUwMF07XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzTmV4dCA9IHRoaXMuZGF0YVsnRW5hYmxlUHJldmlvdXNOZXh0QnV0dG9uJ10gfHwgZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbE1vZGUgPSB0aGlzLmRhdGFbJ1Njcm9sbE1vZGUnXSA/IHRoaXMuZGF0YVsnU2Nyb2xsTW9kZSddIDogJ3ZpcnR1YWwnO1xyXG5cclxuICAgICAgICAgIC8vIFtNb2JpbGVdIERpc2FibGUgUGFnZVNpemVcclxuICAgICAgICAgIGlmICh0aGlzLmRhdGEuUGFnZVNpemVzID09PSBmYWxzZSB8fCBaQ29tcG9uZW50SGVscGVyLmlzTW9iaWxlU2NyZWVuKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZXMgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBHcmlkIFNlbGVjdGlvbiBjb2x1bW5cclxuICAgICAgICAgIGlmICh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVTZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgICAvLyBjaGVja2JveE9ubHk6IHRoaXMuY2hlY2tib3hPbmx5LFxyXG4gICAgICAgICAgICAgIG1vZGU6IHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zID09PSAnc2luZ2xlJyA/ICdzaW5nbGUnIDogJ211bHRpcGxlJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGJpbmQgdGhpcyB0byBncm91cCB1c2luZyBHcmlkIHZhbHVlXHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLlZhbHVlLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyaWRWYWx1ZSA9IHRoaXMuZGF0YS5WYWx1ZS5zbGljZSg2KTtcclxuICAgICAgICAgICAgdGhpcy5ncm91cFtncmlkVmFsdWVdID0gdGhpcztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBjbGVhciBhbnkgU3Vic2NyaXB0aW9uXHJcbiAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBpZiBubyBSZXNvdXJjZVVSTCwgc3RpbGwgZ2VuZXJhdGUgQ29sdW1uIGZpcnN0LCB0aGVuIGluc2VydCBncmlkIGRhdGEgdXNpbmcgRGF0YVNvdXJjZVxyXG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuUmVzb3VyY2VVUkwpIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLkRhdGFTb3VyY2UgJiYgdGhpcy5kYXRhLlNraXBEaXJlY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuRGF0YVNvdXJjZSxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YShkcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc2V0IGdyaWQgc2V0dGluZyBmcm9tIGRpcmVjdGl2ZSB0byBjb21wb25lbnRcclxuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5ncmlkU3ViamVjdC5zdWJzY3JpYmUoZ3JpZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuemdyaWQgPSBncmlkO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuemdyaWQuc3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuemdyaWQuZ3JpZENvbHVtbnM7XHJcbiAgICAgICAgICAgIC8vdGhpcy5jb2x1bW5zWydyZXNpemFibGUnXSA9ICdmYWxzZSc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnpncmlkKSB7IFxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnpncmlkLmdyaWQuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnpncmlkLmdyaWQuZGF0YS50b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnpncmlkLmdyaWQuZGF0YS50b3RhbCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy56Z3JpZC5ncmlkLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHMoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy56Z3JpZC5ncmlkWydwYWdlU2l6ZSddKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIDAgaW5zdGVhZCBvZiB1bmRlZmluZWQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnpncmlkLmdyaWRbJ3BhZ2VTaXplJ10gPSAyMDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIEdyaWQgc2V0dGluZyBleGlzdCBpbiBsb2NhbHN0b3JhZ2VcclxuICAgICAgICAgIHRoaXMuc3RhdGVFeGlzdCgpO1xyXG5cclxuICAgICAgICAgIC8vIFNldCBGaWx0ZXIgU2Vzc2lvbktleVxyXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YVsnU2F2ZUZpbHRlciddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R3JpZFNlc3Npb25LZXkodGhpcy5ncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZ3JpZENhbGxiYWNrKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIFN0YXJ0IEdyaWQgU3RhdGUgKHBhZ2luYXRpb24sIHNvcnRhYmxlLCBmaWx0ZXIsIG9yZGVyaW5nKSAqL1xyXG4gIGdldCBzdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGVFeGlzdCgpIHtcclxuICAgIGNvbnN0IHVzZXJHcmlkU3RhdGUgPSB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5nZXQodGhpcy5ncmlkU3RvcmFnZUtleSk7XHJcblxyXG4gICAgaWYgKHVzZXJHcmlkU3RhdGUpIHtcclxuICAgICAgdGhpcy5ncmlkRGVmYXVsdFN0YXRlRXhpc3QgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZ3JpZERlZmF1bHRTdGF0ZUV4aXN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGF0YVN0YXRlQ2hhbmdlKHN0YXRlOiBEYXRhU3RhdGVDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgdGhpcy56Z3JpZC5kYXRhU3RhdGVDaGFuZ2Uoc3RhdGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2Nlc3ModGhpcy5nRGF0YSwgc3RhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9scygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRlcmFibGUodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzb3J0YWJsZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvY2tlZChjb2xTZXR0aW5nOiBhbnkpIHtcclxuICAgIGlmIChjb2xTZXR0aW5nWydwaW5uZWRMZWZ0J10gPT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qIEVuZCBHcmlkIFN0YXRlIChwYWdpbmF0aW9uLCBzb3J0YWJsZSwgZmlsdGVyLCBvcmRlcmluZykgKi9cclxuXHJcbiAgLyogU3RhcnQgR3JpZCBTdHlsaW5nLCBEaXNwbGF5ICovXHJcbiAgcHVibGljIGdldEdyaWRTdHlsZSgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIFwiaGVpZ2h0LnB4XCI6IHRoaXMuZ2V0R3JpZEhlaWdodCgpLCAvLyB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmhlaWdodFJlZHVjZSwgLy8gNDUwLFxyXG4gICAgICBcIndpZHRoLnB4XCI6IHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy53aWR0aFJlZHVjZVxyXG4gICAgfTsgLy8gXCJ3aWR0aC5weFwiOiB0aGlzLmlubmVyV2lkdGggLSAzNVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRHcmlkSGVpZ2h0KCkge1xyXG4gICAgY29uc3QgZ3JpZEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuaGVpZ2h0UmVkdWNlO1xyXG4gICAgcmV0dXJuIChncmlkSGVpZ2h0IDwgMjUwKSA/IDI1MCA6IGdyaWRIZWlnaHQ7XHJcbiAgICAvLyBjb25zdCB2ID0gWkNvbXBvbmVudEhlbHBlci5pc01vYmlsZVNjcmVlbigpO1xyXG4gICAgLy8gaWYodil7XHJcbiAgICAvLyAgIGNvbnN0IGggPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmhlaWdodFJlZHVjZTtcclxuICAgIC8vICAgcmV0dXJuIChoIDwgMjUwKSA/IDI1MCA6IGg7XHJcbiAgICAvLyB9ZWxzZXtcclxuICAgIC8vICAgcmV0dXJuIFwiYXV0b1wiO1xyXG4gICAgLy8gfSBcclxuICB9XHJcbiAgLyogRW5kIEdyaWQgU3R5bGluZywgRGlzcGxheSAqL1xyXG5cclxuXHJcbiAgLyogU3RhcnQgR3JpZCBDb2x1bW5zICovXHJcbiAgcHVibGljIGlzU2VsZWN0T3B0aW9uKCkge1xyXG4gICAgbGV0IHNlbGVjdE9wdGlvbkV4aXN0ID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgY2hlY2tib3hPbmx5OiBmYWxzZSxcclxuICAgICAgICBtb2RlOiAodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMgPT0gXCJtdWx0aXBsZVwiKSA/IFwibXVsdGlwbGVcIiA6IFwic2luZ2xlXCJcclxuICAgICAgfTtcclxuICAgICAgc2VsZWN0T3B0aW9uRXhpc3QgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdE9wdGlvbkV4aXN0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENvbHVtbnMoY29sdW1uTmFtZTogc3RyaW5nLCBjb2x1bW5zOiBBcnJheTxaR3JpZEN1c3RvbUNvbHVtbj4pIHtcclxuICAgIHRoaXMuZ3JvdXBbY29sdW1uTmFtZV0gPSB0aGlzLndyYXBDb2x1bW5OYW1lc0luRmllbGRFbGVtZW50KGNvbHVtbnMpO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdyYXBDb2x1bW5OYW1lc0luRmllbGRFbGVtZW50KGNvbHVtbkxpc3Q6IEFycmF5PFpHcmlkQ3VzdG9tQ29sdW1uPikge1xyXG4gICAgcmV0dXJuIG9mKGNvbHVtbkxpc3QubWFwKGMgPT4ge1xyXG4gICAgICBjb25zdCBpc0hpZGRlbjogYm9vbGVhbiA9IGMuSGlkZGVuO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIE5hbWU6IGMuTmFtZSxcclxuICAgICAgICBWYWx1ZTogYy5Db2RlLFxyXG4gICAgICAgIFR5cGU6IGMuVHlwZSxcclxuICAgICAgICBncmlkQ29sVmlzaWJsZTogIWlzSGlkZGVuLFxyXG4gICAgICAgIHdpZHRoOiAxMDAgKyBjLk5hbWUubGVuZ3RoICogNCxcclxuICAgICAgICBlbmFibGVGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZVNvcnRpbmc6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlUGlubmluZzogdHJ1ZSxcclxuICAgICAgICBEaXZDbGFzczogXCJjb2wteHMtMTIgY29sLXNtLTZcIixcclxuICAgICAgICBJc0VkaXRhYmxlSW5HcmlkOiBjLkVkaXRhYmxlXHJcbiAgICAgIH07XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlR3JpZENvbHVtbnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGdyaWRTZXR0aW5nID0gdGhpcy5nZXRHcmlkU2V0dGluZ3MoKTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5GaWVsZHMkOiBPYnNlcnZhYmxlPGFueT4gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgIHRoaXMuZGF0YS5Db2x1bW5GaWVsZHMsXHJcbiAgICAgIHRoaXMuZ3JvdXBcclxuICAgICk7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS5Db2x1bW5GaWVsZHMpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkL0VtcHR5IGdyaWQoJyArIHRoaXMuZGF0YS5OYW1lICsgJykgY29sdW1uRmllbGQnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb2x1bW5GaWVsZHMkLnBpcGUoXHJcbiAgICAgIHRhcChkYXRhID0+IHtcclxuICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZC9FbXB0eSBncmlkKCcgKyB0aGlzLmRhdGEuTmFtZSArICcpIGRhdGEgdG8gZ2VuZXJhdGUgY29sdW1uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHRoaXMuZGF0YVsnRmllbGRFbGVtZW50TmFtZSddO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JpZENvbHVtbnMoZGF0YSxcclxuICAgICAgICAgIHRoaXMuY29sdW1ucyxcclxuICAgICAgICAgIHRoaXMuZ3JvdXAsXHJcbiAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLFxyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZ3JpZFNldHRpbmcsXHJcbiAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgdGhpcy5kYXRhKTtcclxuICAgICAgfSksXHJcbiAgICAgIC8vc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgLy8gIC8vR2V0IFNlc3Npb25cclxuICAgICAgLy8gIHJldHVybiB0aGlzLmdldEdyaWRTZXNzaW9uRmlsdGVyKHRoaXMuZ3JwLCB0aGlzKTtcclxuICAgICAgLy99KSxcclxuICAgICAgLy9zd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAvLyAgLy9CZWZvcmUgZ2V0IGdyaWQgZGF0YVxyXG4gICAgICAvLyAgcmV0dXJuIHRoaXMuYmVmb3JlR3JpZEdldERhdGEodGhpcy5ncnAsIHRoaXMpO1xyXG4gICAgICAvL30pLFxyXG4gICAgICAvL3N3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgIC8vICAvL1NldCBncmlkIGRhdGFcclxuICAgICAgLy8gIHJldHVybiB0aGlzLnNldEdyaWRTZXNzaW9uRmlsdGVyKHRoaXMuZ3JwLCB0aGlzKTtcclxuICAgICAgLy99KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qIEVuZCBHcmlkIENvbHVtbnMgKi9cclxuXHJcbiAgcHJpdmF0ZSBlZGl0TW9kZWwoZGF0YUl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5FZGl0Q2xpY2tVUkwpIHtcclxuICAgICAgLy8gRWRpdCBpbmNlbGwgZmllbGRcclxuICAgICAgY29uc3QgY29sRmllbGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZGF0YS5Db2x1bW5GaWVsZHMsIHRoaXMuZ3JvdXApO1xyXG4gICAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJ6Z3JpZC1jZWxsQ2xpY2tcIixcclxuICAgICAgICB0YXJnZXQ6IHRoaXMuZGF0YS5FZGl0Q2xpY2tVUkwsXHJcbiAgICAgICAgZGF0YTogZGF0YUl0ZW0sXHJcbiAgICAgICAgY29sdW1uRmllbGRzJDogY29sRmllbGRzXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBXaGVuIGNsaWNrZWQgcm91dGUgdG8gcGFnZVxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5ncm91cC5lZGl0TW9kZWxVUkwsIGRhdGFJdGVtLklkLCAnZWRpdCddLCB7XHJcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBncmlkQ2FsbGJhY2soZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YVsnQWZ0ZXJsb2FkQ2FsbGJhY2snXSkge1xyXG4gICAgICBjb25zdCBtZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMpO1xyXG5cclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiemdyaWQtQWZ0ZXJsb2FkQ2FsbGJhY2tcIixcclxuICAgICAgICB0YXJnZXQ6IHRoaXMuZGF0YVsnQWZ0ZXJsb2FkQ2FsbGJhY2snXSxcclxuICAgICAgICBkYXRhOiBtZVxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGF0YSA9IChnRGF0YTogYW55KSA9PiB7XHJcbiAgICB0aGlzLmdyaWREYXRhID0ge1xyXG4gICAgICBkYXRhOiBnRGF0YSxcclxuICAgICAgdG90YWw6IChnRGF0YSA/IGdEYXRhLmxlbmd0aCA6IDApXHJcbiAgICB9O1xyXG4gICAgdGhpcy5nRGF0YSA9IGdEYXRhO1xyXG5cclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIHRoaXMuemdyaWQuZ3JpZFsncGFnZVNpemUnXSA9IGdEYXRhLmxlbmd0aDsgLy8gc2V0IGdyaWQgc2l6ZVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghIXRoaXMuZGF0YS5TaG93UmVjb3JkTnVtYmVyKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWREYXRhLmRhdGEpIHtcclxuICAgICAgICB0aGlzLmdyaWREYXRhLmRhdGEuZm9yRWFjaCgoZCwgaSkgPT4ge1xyXG4gICAgICAgICAgZC5HcmlkTm8gPSBpICsgMTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdEYXRhKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpIHtcclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIHRoaXMuemdyaWQuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLlNraXBEaXJlY3RpdmUpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2Nlc3ModGhpcy5nRGF0YSwgdGhpcy5zdGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0R3JpZERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nRGF0YTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybUNvbnRyb2wocm93SW5kZXg6IG51bWJlciwgcHJvcGVydHk6IHN0cmluZykge1xyXG4gICAgY29uc3QgZm9ybUFycmF5OiBGb3JtQXJyYXkgPSB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcclxuICAgIGNvbnN0IGZvcm1JdGVtID0gZm9ybUFycmF5LmF0KHJvd0luZGV4KTtcclxuXHJcbiAgICBpZiAoZm9ybUl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGZvcm1JdGVtLmdldChwcm9wZXJ0eSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZvcm1Db250cm9scygpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgLy8gb25seSBjcmVhdGUgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBlZGl0YWJsZSBjb2x1bW5cclxuICAgICAgaWYgKHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5pc0VkaXRhYmxlSW5HcmlkKSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMgPSBuZXcgRm9ybUdyb3VwKHsgaXRlbXM6IG5ldyBGb3JtQXJyYXkoW10pIH0pO1xyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkRGF0YS5kYXRhKSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZERhdGEuZGF0YS5mb3JFYWNoKGQgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB7fTtcclxuICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgICBpdGVtc1tjLmZpZWxkXSA9IG5ldyBGb3JtQ29udHJvbChkW2MuZmllbGRdKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChpdGVtcyk7XHJcbiAgICAgICAgICAoPEZvcm1BcnJheT50aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZ2V0KFwiaXRlbXNcIikpLnB1c2goZm9ybUdyb3VwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZUZvcm1Hcm91cChkYXRhSXRlbTogYW55LCBmaWVsZE5hbWU6IGFueSk6IEZvcm1Hcm91cCB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIFtmaWVsZE5hbWVdOiBkYXRhSXRlbVtmaWVsZE5hbWVdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHcm91cFZhbHVlKHZhbHVlOiBzdHJpbmcsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLlZhbHVlLCB0aGlzLmdyb3VwKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcHVibGljIG9uQnRuQ2xpY2soZXZlbnQ6IGFueSwgY29sU2V0dGluZzogYW55LCByb3dEYXRhOiBhbnksIGNlbGxEYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMub25OYXZpZ2F0ZVRvKGV2ZW50LCBjb2xTZXR0aW5nLCByb3dEYXRhLCBjZWxsRGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2VsbENsaWNrSGFuZGxlcihldmVudDogQ2VsbENsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGRpc2FibGVBbGxDb2x1bW5DZWxsQ2xpY2tIYW5kbGVyID0gdGhpcy5kYXRhLkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyID8gdGhpcy5kYXRhLkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyIDogZmFsc2U7XHJcbiAgICBjb25zdCBpc0NvbW1hbmRDb2x1bW4gPSBldmVudC5jb2x1bW4uY29uc3RydWN0b3IubmFtZSA9PSAnQ29tbWFuZENvbHVtbkNvbXBvbmVudCcgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMudG9vbHRpcERpcikge1xyXG4gICAgICB0aGlzLnRvb2x0aXBEaXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZGlzYWJsZUFsbENvbHVtbkNlbGxDbGlja0hhbmRsZXIgJiYgIWlzQ29tbWFuZENvbHVtbikge1xyXG4gICAgICBjb25zdCBpbkNlbGxFZGl0YWJsZSA9IHRoaXMuZGF0YS5JbkNlbGxFZGl0YWJsZSA/IHRoaXMuZGF0YS5JbkNlbGxFZGl0YWJsZSA6IGZhbHNlO1xyXG4gICAgICBpZiAoaW5DZWxsRWRpdGFibGUpIHtcclxuICAgICAgICB0aGlzLmVkaXRhYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIocyA9PiBzLmlzRWRpdGFibGVJbkRhdGFJdGVtID09PSB0cnVlKTtcclxuICAgICAgICBpZiAoISF0aGlzLmVkaXRhYmxlQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbnMubWFwKHMgPT4gZXZlbnQuc2VuZGVyLmVkaXRDZWxsKGV2ZW50LnJvd0luZGV4LCBldmVudC5jb2x1bW5JbmRleCwgdGhpcy5jcmVhdGVGb3JtR3JvdXAoZXZlbnQuZGF0YUl0ZW0sIHMuZmllbGQpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY2VsbENsaWNrIGV2ZW50OiBcIiwgZXZlbnQpO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuT25JdGVtQ2xpY2spIHtcclxuICAgICAgICAgIGNvbnN0IGZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLk9uSXRlbUNsaWNrKTtcclxuICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgICAgICAgIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWRpdE1vZGVsKGV2ZW50LmRhdGFJdGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRDZWxsQ2xvc2VIYW5kbGVyKGFyZ3M6IGFueSkge1xyXG4gICAgY29uc3QgeyBmb3JtR3JvdXAsIGRhdGFJdGVtIH0gPSBhcmdzO1xyXG4gICAgaWYgKCFmb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgYXJncy5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfSBlbHNlIGlmIChmb3JtR3JvdXAuZGlydHkpIHtcclxuICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKHMgPT4gcy5pc0VkaXRhYmxlSW5EYXRhSXRlbSA9PT0gdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zLm1hcChzID0+XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkYXRhSXRlbSwgeyBbcy5maWVsZF06IGZvcm1Hcm91cC52YWx1ZVtzLmZpZWxkXSB9KSk7XHJcbiAgICAgIHRoaXMubXlTZWxlY3Rpb24ubWFwKHMgPT4gKHMuSWQgPT09IGRhdGFJdGVtLklkKSA/IE9iamVjdC5hc3NpZ24ocywgZGF0YUl0ZW0pIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIG9uTmF2aWdhdGVUbyhldmVudDogYW55LCBjbGlja0FjdGlvbjogYW55LCByb3dEYXRhOiBhbnksIGNlbGxEYXRhOiBzdHJpbmcpIHtcclxuICAgIC8vIGRlYnVnZ2VyO1xyXG4gICAgLy8gY29uc3QgbiA9IGNvbFNldHRpbmcubmF2aWdhdGVUby5yZXBsYWNlKCcvOmlkJywgY2VsbERhdGEpO1xyXG4gICAgY29uc3QgbiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBjbGlja0FjdGlvbi5DbGljayk7XHJcbiAgICBpZiAobikge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6ICd6Z3JpZC1vbk5hdmlnYXRlVG8nLFxyXG4gICAgICAgIHRhcmdldDogY2xpY2tBY3Rpb24uQ2xpY2ssXHJcbiAgICAgICAgcm93RGF0YTogcm93RGF0YSxcclxuICAgICAgICBkYXRhOiBjZWxsRGF0YVxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1Rvb2x0aXAoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGxldCBpc0NvbW1hbmRDb2x1bW4gPSBmYWxzZTtcclxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgIGlmIChkYXRhID09ICdrLWNvbW1hbmQtY2VsbCcpIHtcclxuICAgICAgICBpc0NvbW1hbmRDb2x1bW4gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoKChlbGVtZW50Lm5vZGVOYW1lID09PSAnVEQnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdUSCcpICYmIGVsZW1lbnQub2Zmc2V0V2lkdGggPCBlbGVtZW50LnNjcm9sbFdpZHRoKSAmJiAhaXNDb21tYW5kQ29sdW1uKSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcERpci50b2dnbGUoZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy50b29sdGlwRGlyLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3dTZWxlY3Rpb25LZXkoY29udGV4dDogUm93QXJncyk6IGFueSB7XHJcbiAgICByZXR1cm4gY29udGV4dC5kYXRhSXRlbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFZhbHVlcygpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubXlTZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaEdyaWQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgY29uc3QgX2dyaWRPcHRpb25TZWdtZW50ID0gZXZlbnQudGFyZ2V0LnRyaW0oKS5zcGxpdCgnLicpO1xyXG4gICAgY29uc3QgX2dyaWRPcHRpb24gPSBfZ3JpZE9wdGlvblNlZ21lbnRbMV07XHJcbiAgICBpZiAoX2dyaWRPcHRpb24pIHtcclxuICAgICAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbX2dyaWRPcHRpb25dIGFzIFpHcmlkO1xyXG4gICAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGZpbmQgZ3JpZCB2YWx1ZTogJyArIF9ncmlkT3B0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ0ludmFsaWQgcmVmcmVzaEdyaWQgZXZlbnQ6ICcsIGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoRGF0YSgpIHtcclxuICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRGF0YSgpIHtcclxuICAgIHRoaXMuemdyaWQuY2xlYXJEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2VsbFN0eWxlQ29uZGl0aW9uKGNvbCwgY29sVmFsdWU6IGFueSkge1xyXG4gICAgaWYgKGNvbFsnQ2VsbFN0eWxlQ29uZGl0aW9uJ10pIHsgXHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvbkhpZ2hsaWdodGNvbDogW10gPSBjb2xbJ0NlbGxTdHlsZUNvbmRpdGlvbiddO1xyXG4gICAgICBsZXQgY29uZGl0aW9uUmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgICBjb25kaXRpb25IaWdobGlnaHRjb2wuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICBpZiAoIWNvbmRpdGlvblJlc3VsdCkge1xyXG4gICAgICAgICAgaWYgKGRhdGFbJ1ZhbHVlJ10gPT0gY29sVmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgIFxyXG4gICAgICByZXR1cm4gY29uZGl0aW9uUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENlbGxTdHlsZUNvbmRpdGlvbihjb2wsIGNvbFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChjb2xbJ0NlbGxTdHlsZUNvbmRpdGlvbiddKSB7IFxyXG4gICAgICBjb25zdCBjb25kaXRpb25IaWdobGlnaHRjb2w6IFtdID0gY29sWydDZWxsU3R5bGVDb25kaXRpb24nXTtcclxuICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9ICcnO1xyXG5cclxuICAgICAgY29uZGl0aW9uSGlnaGxpZ2h0Y29sLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGFbJ1ZhbHVlJ10gPT0gY29sVmFsdWUpIHtcclxuICAgICAgICAgIGlmIChkYXRhWydCYWNrZ3JvdW5kQ29sb3InXSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSAnYmFja2dyb3VuZC1jb2xvcjonICsgZGF0YVsnQmFja2dyb3VuZENvbG9yJ10gKyAnOyc7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFbJ0NvbG9yJ10pIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ICs9ICdjb2xvcjonICsgZGF0YVsnQ29sb3InXSArICc7JztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZGF0YVsnU3R5bGVFeHByZXNzaW9uJ10pIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ICs9IGRhdGFbJ1N0eWxlRXhwcmVzc2lvbiddO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gY29uZGl0aW9uUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFsbFJlc3VsdHMoKTogT2JzZXJ2YWJsZTxFeGNlbEV4cG9ydERhdGE+IHtcclxuICAgIGNvbnN0IF96Z3JpZENvbnRyb2wgPSB0aGlzLnpncmlkIGFzIFpHcmlkO1xyXG4gICAgY29uc3QgX3pncmlkQ29tcG9uZW50ID0gdGhpcy56Z3JpZC5ncmlkIGFzIEdyaWRDb21wb25lbnQ7XHJcbiAgICBjb25zdCBfZGF0YSA9IF96Z3JpZENvbXBvbmVudC5kYXRhIGFzIEdyaWREYXRhUmVzdWx0O1xyXG5cclxuICAgIGNvbnN0IHBhZ2luYXRpb25BcGlQb3N0VXJsID0gX3pncmlkQ29udHJvbC5wYWdpbmF0aW9uQXBpUG9zdFVybDtcclxuXHJcbiAgICAvLyBOZWVkIHRvIGNsb25lLCBpZiBub3Qgd2lsbCBhZmZlY3QgdGhlIGdyaWQgcGFyYW1zLlxyXG4gICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbXMpO1xyXG4gICAgcGFyYW1zLnBhZ2VObyA9IDA7XHJcbiAgICBwYXJhbXMucGFnZVNpemUgPSBfZGF0YS50b3RhbDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChwYWdpbmF0aW9uQXBpUG9zdFVybCwgcGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogRXhjZWxFeHBvcnREYXRhID0ge1xyXG4gICAgICAgICAgZGF0YTogcHJvY2VzcyhkYXRhLmRhdGFTZXQsIHt9KS5kYXRhXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2xhc3MoZGF0YUl0ZW06IGFueSwgY29sOiBhbnkpIHtcclxuICAgIGxldCBuZ0NsYXNzID0gXCJncmlkQ2VsbCBcIjtcclxuICAgIGlmIChjb2wuZmllbGRUeXBlID09PSAnbnVtYmVyJyB8fCBjb2wuZmllbGRUeXBlID09PSAnY3VycmVuY3knIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6bnVtZXJpYycpIHtcclxuICAgICAgbmdDbGFzcyArPSBcInJpZ2h0QWxpZ25lZCBcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YUl0ZW1bY29sLmZpZWxkICsgJ19DbGFzcyddKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gZGF0YUl0ZW1bY29sLmZpZWxkICsgJ19DbGFzcyddICsgXCIgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbC5DbGFzcykge1xyXG4gICAgICBuZ0NsYXNzICs9IGNvbC5DbGFzcyArIFwiIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZ0NsYXNzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm1hdChjb2w6IGFueSwgZGVmYXVsdEZvcm1hdD86IGFueSkge1xyXG4gICAgbGV0IGZvcm1hdCA9IFwiXCI7XHJcbiAgICBpZiAoY29sLkZvcm1hdE9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3JtYXQgPSBkZWZhdWx0Rm9ybWF0ID8gZGVmYXVsdEZvcm1hdCA6IFwiXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBmb3JtYXRBcnIgPSBjb2wuRm9ybWF0T3B0aW9ucy5zcGxpdChcIi5cIilcclxuICAgICAgbGV0IGRwID0gMDtcclxuXHJcbiAgICAgIGlmIChmb3JtYXRBcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGRwID0gZm9ybWF0QXJyWzFdLmxlbmd0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRwICE9PSAwKSB7XHJcbiAgICAgICAgZm9ybWF0ID0gXCIxLlwiICsgZHAgKyBcIi1cIiArIGRwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZm9ybWF0O1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBzZXRIZWFkZXJUZXh0KGNvbHVtbk5hbWU6IHN0cmluZywgbmV3SGVhZGVyVGl0bGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZ3JpZENvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XHJcbiAgICBncmlkQ29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoY29sLk5hbWUgPT09IGNvbHVtbk5hbWUpIHtcclxuICAgICAgICBjb2wudGl0bGUgPSBuZXdIZWFkZXJUaXRsZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0R3JpZElzTG9hZGluZyh0cmlnZ2VyZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJpZ2dlcmVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEdyaWRTZXNzaW9uS2V5KGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdID0gJ3pncmlkXycgKyBncm91cC5yZXNvdXJjZVVSTCArICdfJyArIHRoaXMuZGF0YS5WYWx1ZSArICc6OicgKyB0aGlzLmF1dGhTZXJ2aWNlLmUxVG9rZW4udXNlck5hbWU7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogR3JpZEl0ZW0pOiBhbnkge1xyXG4gICAgLy9jb25zb2xlLmxvZyhpdGVtLmRhdGFbJ0lkJ10gfHwgaW5kZXgpO1xyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuXHJcbiAgLyogR3JpZCBjb25maWd1cmF0aW9uIGZ1bmN0aW9uICovXHJcbiAgcHVibGljIHNhdmVHcmlkU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBfemdyaWRDb21wb25lbnQgPSB0aGlzLnpncmlkLmdyaWQgYXMgR3JpZENvbXBvbmVudDtcclxuICAgIGNvbnN0IF9jb2x1bW5zID0gX3pncmlkQ29tcG9uZW50LmNvbHVtbnM7XHJcblxyXG4gICAgb2YodGhpcy5jb2x1bW5zKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29uZmlnVmFsdWU6IFpHcmlkQ29sdW1uU2V0dGluZ3NbXSA9IF9jb2x1bW5zLnRvQXJyYXkoKS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IF96R3JpZENvbHVtblNldHRpbmdzOiBaR3JpZENvbHVtblNldHRpbmdzID0gT2JqZWN0LmtleXMoaXRlbSlcclxuICAgICAgICAgICAgICAuZmlsdGVyKHByb3BOYW1lID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhcHJvcE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndGVtcGxhdGUnKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiAoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLmFjYyxcclxuICAgICAgICAgICAgICAgICAgLi4ueyBbY3Vycl06IGl0ZW1bY3Vycl0gfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICwge30gYXMgWkdyaWRDb2x1bW5TZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIHJldHVybiBfekdyaWRDb2x1bW5TZXR0aW5ncztcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIHJlbW92ZSBleHRyYSBlbGVtZW50IGZvcm0gYXJyYXlcclxuICAgICAgICAgIGNvbmZpZ1ZhbHVlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtWydoZWFkZXJTdHlsZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgaXRlbVsnX19uZ0NvbnRleHRfXyddO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZ3JpZFNldHRpbmc6IFpHcmlkU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgIC8vIHN0YXRlOiB0aGlzLnN0YXRlLFxyXG4gICAgICAgICAgICBjb2x1bW5zQ29uZmlnOiBjb25maWdWYWx1ZVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAvLyBGaW5kIGFueSBzZXR0aW5nIGZyb20gbG9jYWxzdG9yYWdlIGFuZCB1cGRhdGUsIGlmIG5vdCBqdXN0IGFkZCBpbi5cclxuICAgICAgICAgIGxldCBfYXJyR3JpZENhY2hpbmc6IEdyaWRDYWNoaW5nW10gPSB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5nZXQodGhpcy5ncmlkU3RvcmFnZUtleSk7XHJcbiAgICAgICAgICBsZXQgX2dyaWRDb25maWc6IEdyaWRDYWNoaW5nID0gbnVsbDtcclxuICAgICAgICAgIGlmIChfYXJyR3JpZENhY2hpbmcgJiYgX2FyckdyaWRDYWNoaW5nWzBdKSB7XHJcbiAgICAgICAgICAgIF9ncmlkQ29uZmlnID0gX2FyckdyaWRDYWNoaW5nLmZpbmQoeCA9PiB4WydkYXRhRm9ybUZpZWxkcyddID09PSB0aGlzLmdyaWRTdG9yYWdlS2V5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChfZ3JpZENvbmZpZykge1xyXG4gICAgICAgICAgICAgIF9ncmlkQ29uZmlnLmdyaWRTZXR0aW5ncyA9IGdyaWRTZXR0aW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgX2FyckdyaWRDYWNoaW5nID0gW107XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCFfZ3JpZENvbmZpZykge1xyXG4gICAgICAgICAgICBfZ3JpZENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICBkYXRhRm9ybUZpZWxkczogdGhpcy5ncmlkU3RvcmFnZUtleSxcclxuICAgICAgICAgICAgICBncmlkU2V0dGluZ3M6IGdyaWRTZXR0aW5nXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBfYXJyR3JpZENhY2hpbmcucHVzaChfZ3JpZENvbmZpZyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gX2FyckdyaWRDYWNoaW5nO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNvbmNhdE1hcChncmlkQ2FjaGUgPT4ge1xyXG4gICAgICAgICAgLy8gU2F2ZSBncmlkIGNhY2hpbmcgdG8gbG9jYWxzdG9yYWdlXHJcbiAgICAgICAgICB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5zZXQodGhpcy5ncmlkU3RvcmFnZUtleSwgZ3JpZENhY2hlKTtcclxuICAgICAgICAgIC8vIFNhdmUgdG8gQ29va2llU3RvcmVcclxuICAgICAgICAgIHJldHVybiB0aGlzLm1haW5TZXJ2aWNlLmNvb2tpZVN0b3JlUG9zdCh0aGlzLmdyaWRTdG9yYWdlS2V5LCBncmlkQ2FjaGUpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcChzYXZlZEdyaWRDYWNoZSA9PiB7XHJcbiAgICAgICAgICAvLyBjaGVjayBpcyBzYXZlZCBzdGF0ZSBleGlzdCB0byBlbmFibGUvaGlkZSByZXN0b3JlIGJ1dHRvblxyXG4gICAgICAgICAgdGhpcy5zdGF0ZUV4aXN0KCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIEFsZXJ0XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KCdHcmlkIFNldHRpbmcgU2F2ZWQnLCBcInRvcFwiLCB0cnVlLCAyMDAwLCAnc3VjY2VzcycpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzdG9yZUdyaWRTZXR0aW5ncygpIHtcclxuICAgIG9mKHRydWUpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAvLyBDbGVhciBsb2NhbHN0b3JhZ2UgZ3JpZCBzZXR0aW5nXHJcbiAgICAgICAgICB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5yZW1vdmUodGhpcy5ncmlkU3RvcmFnZUtleSk7XHJcbiAgICAgICAgICByZXR1cm4gb2YodHJ1ZSlcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gZGVsZXRlIGNvb2tpZXN0b3JlIGdyaWRTZXR0aW5nIGJ5IHN0b3JhZ2VrZXkgYXMgbmFtZVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWFpblNlcnZpY2UuY29va2llU3RvcmVEZWxldGVNdWx0aXBsZSh0aGlzLmdyaWRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjb25jYXRNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gVXNlIG9yaWdpbmFsIGNvbHVtbiBzZXR0aW5nXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIGNoZWNrIGlzIHNhdmVkIHN0YXRlIGV4aXN0XHJcbiAgICAgICAgICB0aGlzLnN0YXRlRXhpc3QoKTtcclxuICAgICAgICAgIC8vIEFsZXJ0XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KCdHcmlkIFNldHRpbmcgUmVzdG9yZWQnLCBcInRvcFwiLCB0cnVlLCAyMDAwLCAnc3VjY2VzcycpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyaWRTZXR0aW5ncygpOiBaR3JpZENvbHVtblNldHRpbmdzW10ge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5BbGxvd1NhdmVTdGF0ZSkge1xyXG4gICAgICBjb25zdCBfc3RvcmFnZUtleSA9ICdpb25pYy1maWVsZDo6JyArIHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbi51c2VyTmFtZSArICc6OicgKyB0aGlzLmRhdGEuTmFtZSArICc6OicgKyB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgICAvLyBGaW5kIGFueSBzZXR0aW5nIGZyb20gbG9jYWxzdG9yYWdlLi5cclxuICAgICAgbGV0IF9hcnJHcmlkQ2FjaGluZzogR3JpZENhY2hpbmdbXSA9IHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLmdldChfc3RvcmFnZUtleSk7XHJcbiAgICAgIGlmIChfYXJyR3JpZENhY2hpbmcpIHtcclxuICAgICAgICBjb25zdCBfZ3JpZENhY2hpbmc6IEdyaWRDYWNoaW5nID0gSlNPTi5wYXJzZShfYXJyR3JpZENhY2hpbmdbJ1ZhbHVlJ10pO1xyXG4gICAgICAgIGlmIChfZ3JpZENhY2hpbmcpIHtcclxuICAgICAgICAgIHJldHVybiBfZ3JpZENhY2hpbmcuZ3JpZFNldHRpbmdzLmNvbHVtbnNDb25maWcuc29ydCgoYSwgYikgPT4gYS5vcmRlckluZGV4IC0gYi5vcmRlckluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIElubGluZSBzZXR0aW5nICovXHJcbiAgcHVibGljIGdldElubGluZUZpZWxkKHZhbHVlOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZCh4ID0+IHguVmFsdWUgPT09IHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJbmxpbmVGb3JtKHJvd0luZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGZvcm1BcnJheTogRm9ybUFycmF5ID0gdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzLmdldCgnaXRlbXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICByZXR1cm4gZm9ybUFycmF5LmF0KHJvd0luZGV4KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm1Db250cm9sRGF0YSh2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzLnZhbHVlLml0ZW1zO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qIEV2ZW50ICovXHJcbiAgcHVibGljIGJlZm9yZUdyaWRHZXREYXRhKGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGNvbnNvbGUud2FybihcImJlZm9yZURhdGFCaW5kaW5nIHRyaWdnZXJlZFwiKTtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlR3JpZEdldERhdGEpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlRGF0YUJpbmRpbmcgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlR3JpZEdldERhdGEoZ3JvdXAsIG1lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRHcmlkU2Vzc2lvbkZpbHRlcihncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoIWdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl0pIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBTdG9yYWdlS2V5ID0gZ3JvdXBbXCJHcmlkU3RvcmFnZUtleVwiXTtcclxuXHJcbiAgICBpZiAodGhpcy5zdG9yYWdlU2VydmljZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldChTdG9yYWdlS2V5KVxyXG4gICAgICAgIC50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnZhbHVlIHx8IGRhdGEudmFsdWUgPT09IFwibnVsbFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoZGF0YS52YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZmlsdGVyID0gSlNPTi5wYXJzZShyZXN1bHRbXCJTdGF0ZUZpbHRlclwiXSk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IEpTT04ucGFyc2UocmVzdWx0W1wiRmlsdGVyUGFyYW1zXCJdKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZmlsdGVyLmZpbHRlcnMuZm9yRWFjaCgoc3RhdGVGaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChzdGF0ZUZpbHRlci5maWVsZC5pbmNsdWRlcygnVVRDJykpIHtcclxuICAgICAgICAgICAgICAgIHN0YXRlRmlsdGVyLnZhbHVlID0gbmV3IERhdGUoc3RhdGVGaWx0ZXIudmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRHcmlkU2Vzc2lvbkZpbHRlcihncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoIWdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl0pIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBTdG9yYWdlS2V5ID0gZ3JvdXBbXCJHcmlkU3RvcmFnZUtleVwiXTtcclxuXHJcbiAgICBsZXQgbHN0R3JpZEZpbHRlcjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG5cclxuICAgIGlmIChtZS5zdGF0ZS5maWx0ZXIgJiYgdGhpcy5zdG9yYWdlU2VydmljZSAmJiB0aGlzLmRhdGFbJ1NhdmVGaWx0ZXInXSkge1xyXG4gICAgICAvL2xpc3Qgb2YgZGF0YSBmb3IgU3RhdGVGaWx0ZXIgYW5kIEZpbHRlclBhcmFtc1xyXG4gICAgICBsc3RHcmlkRmlsdGVyID0geyBcIlN0YXRlRmlsdGVyXCI6IEpTT04uc3RyaW5naWZ5KG1lLnN0YXRlLmZpbHRlciksIFwiRmlsdGVyUGFyYW1zXCI6IEpTT04uc3RyaW5naWZ5KG1lLnBhcmFtcy5maWx0ZXJQYXJhbXMpIH1cclxuICAgICAgLy9jcmVhdGUgc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KFN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KGxzdEdyaWRGaWx0ZXIpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIEF2YWlsYWJsZSBGdW5jdGlvbnMgKi9cclxuICBwdWJsaWMgc2V0RW5hYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkgPSAhc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlID0gc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhLlZpc2libGUgPSBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVxdWlyZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkID0gc3RhdHVzO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5jaGFuZ2VWYWxpZGF0b3Ioc3RhdHVzLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUsIHRoaXMuY29tcG9uZW50UHJvcGVydGllcywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyogb25jaGFuZ2UgRXZlbnRzICovXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy56Z3JpZCkge1xyXG4gICAgICB0aGlzLnpncmlkLmZpbHRlckNoYW5nZShldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFnZUNoYW5nZShldmVudDogUGFnZUNoYW5nZUV2ZW50KTogdm9pZCB7IFxyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgdGhpcy56Z3JpZC5wYWdlQ2hhbmdlKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzb3J0Q2hhbmdlKHNvcnQ6IFNvcnREZXNjcmlwdG9yW10pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIHRoaXMuemdyaWQuc29ydENoYW5nZShzb3J0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbkNlbGxDaGVja0JveE9uQ2hhbmdlKGV2ZW50OiBhbnksIHJvd0luZGV4OiBhbnksIGNvbHVtbjogYW55KSB7XHJcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC5kZXRhaWwuY2hlY2tlZDtcclxuICAgIHRoaXMuZ0RhdGFbcm93SW5kZXhdW2NvbHVtbi5WYWx1ZV0gPSBpc0NoZWNrZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29sdW1uc09yZGVyQ2hhbmdlZChldmVudDogQ29sdW1uUmVvcmRlckV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBfemdyaWRDb250cm9sID0gdGhpcy56Z3JpZCBhcyBaR3JpZDtcclxuICAgIGNvbnN0IF96Z3JpZENvbXBvbmVudCA9IHRoaXMuemdyaWQuZ3JpZCBhcyBHcmlkQ29tcG9uZW50O1xyXG4gICAgY29uc3QgX2RhdGEgPSBfemdyaWRDb21wb25lbnQuZGF0YSBhcyBHcmlkRGF0YVJlc3VsdDtcclxuXHJcbiAgICBpZiAodGhpcy56Z3JpZCkge1xyXG4gICAgICBjb25zdCBfemdyaWQgPSB0aGlzLnpncmlkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qIGdyaWQgY29tbWFuZCBoYW5kbGVyICovXHJcbiAgcHVibGljIGFkZEhhbmRsZXIoeyBzZW5kZXIgfSkge1xyXG4gICAgdGhpcy5pc05ldyA9IHRydWU7XHJcblxyXG4gICAgLy8gY2xvc2UgYW55IGV4aXN0aW5nIGVkaXRvclxyXG4gICAgdGhpcy5jbG9zZUVkaXRvcihzZW5kZXIpO1xyXG5cclxuICAgIC8vIGxvb3AgYWxsIGNvbHVtbiB0byBnZXQgdmFsaWRhdGlvbiBhbmQgY3JlYXRlIGZvcm0gY29udHJvbFxyXG4gICAgY29uc3QgY29sRm9ybUNvbnRyb2wgPSB7fTtcclxuICAgIHRoaXMuemdyaWQuZ3JpZENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgICAgIGlmIChjb2wuSXNSZXF1aXJlZCkge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sLlZhbGlkYXRvclBhdHRlcm4pIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSk7XHJcbiAgICAgIH0gXHJcblxyXG4gICAgICBjb2xGb3JtQ29udHJvbFtjb2wuVmFsdWVdID0gbmV3IEZvcm1Db250cm9sKG51bGwsIHZhbGlkYXRvcnMpOyBcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIHNldCBmb3JtIGNvbnRyb2wgb2JqZWN0IHRvIGZvcm0gZ3JvdXBcclxuICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChjb2xGb3JtQ29udHJvbCk7XHJcblxyXG4gICAgLy8gYWRkIHRvIGdyaWQgcm93XHJcbiAgICBzZW5kZXIuYWRkUm93KHRoaXMuZm9ybUdyb3VwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlSGFuZGxlcih7IHNlbmRlciwgcm93SW5kZXgsIGZvcm1Hcm91cCwgaXNOZXcgfSk6IHZvaWQge1xyXG4gICAgLy8gZ2V0IGdyaWQgZGF0YS5cclxuICAgIGNvbnN0IGdyaWRFeGlzdGluZ0RhdGEgPSB0aGlzLmdEYXRhID8gdGhpcy5nRGF0YSA6IHRoaXMuZ3JpZERhdGEgPyB0aGlzLmdyaWREYXRhLmRhdGEgOiBbXTtcclxuXHJcbiAgICAvLyBpZiB2YWxpZFxyXG4gICAgaWYgKGZvcm1Hcm91cC52YWxpZCkge1xyXG4gICAgICAvLyBjaGVjayBmb3IgZHVwbGljYXRlIFVuaXF1ZUtleVxyXG4gICAgICBsZXQgdW5pcXVlS2V5RXhpc3Q6IGJvb2xlYW47XHJcbiAgICAgIGNvbnN0IHVuaXF1ZUtleSA9IHRoaXMuZGF0YVsnVW5pcXVlS2V5J107XHJcbiAgICAgIGlmICh1bmlxdWVLZXkpIHsgXHJcbiAgICAgICAgY29uc3QgZm9ybVVuaXF1ZUtleVZhbHVlID0gZm9ybUdyb3VwLnZhbHVlW3VuaXF1ZUtleV07XHJcblxyXG4gICAgICAgIGlmIChpc05ldyB8fCAoIWlzTmV3ICYmIChncmlkRXhpc3RpbmdEYXRhW3Jvd0luZGV4XVt1bmlxdWVLZXldICE9IGZvcm1VbmlxdWVLZXlWYWx1ZSkpKSB7XHJcbiAgICAgICAgICAvLyBpZiBuZXcuLi5cclxuICAgICAgICAgIC8vIGlmIGVkaXQuLi4gaWYgY3VycmVudCBmaWVsZCwgdW5pcXVla2V5IHZhbHVlIGNoYW5nZWQuIG5lZWQgdG8gY2hlY2suICBcclxuICAgICAgICAgIGdyaWRFeGlzdGluZ0RhdGEuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgICAgaWYgKGRhdGFbdW5pcXVlS2V5XSA9PT0gZm9ybVVuaXF1ZUtleVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgdW5pcXVlS2V5RXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXVuaXF1ZUtleUV4aXN0KSB7XHJcbiAgICAgICAgaWYgKGlzTmV3KSB7XHJcbiAgICAgICAgICAvLyBpZiBuZXcsIHB1c2ggdG8gZGF0YVxyXG4gICAgICAgICAgZ3JpZEV4aXN0aW5nRGF0YS5wdXNoKGZvcm1Hcm91cC52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gaWYgZWRpdCwgdXBkYXRlIGRhdGFcclxuICAgICAgICAgIGdyaWRFeGlzdGluZ0RhdGFbcm93SW5kZXhdID0gZm9ybUdyb3VwLnZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXREYXRhKGdyaWRFeGlzdGluZ0RhdGEpO1xyXG5cclxuICAgICAgICBzZW5kZXIuY2xvc2VSb3cocm93SW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coJ0Vycm9yIG9jY3VyOiBEdXBsaWNhdGVkIHVuaXF1ZSBmaWVsZCBlbnRyeS4nLCAndG9wJywgdHJ1ZSwgMzAwMCwgJ2RhbmdlcicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsSGFuZGxlcih7IHNlbmRlciwgcm93SW5kZXggfSkge1xyXG4gICAgLy8gY2FuY2VsIGFueSBleGlzdGluZyBlZGl0b3JcclxuICAgIHNlbmRlci5jbG9zZVJvdyhyb3dJbmRleCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZWRpdEhhbmRsZXIoeyBzZW5kZXIsIHJvd0luZGV4LCBkYXRhSXRlbSB9KSB7XHJcbiAgICB0aGlzLmlzTmV3ID0gZmFsc2U7XHJcblxyXG4gICAgLy8gY2xvc2UgYW55IGV4aXN0aW5nIGVkaXRvclxyXG4gICAgdGhpcy5jbG9zZUVkaXRvcihzZW5kZXIpO1xyXG4gICAgIFxyXG4gICAgLy8gbG9vcCBhbGwgY29sdW1uIHRvIGdldCB2YWxpZGF0aW9uIGFuZCBjcmVhdGUgZm9ybSBjb250cm9sLCBhcHBlbmQgY3VycmVudCByb3cgdmFsdWVcclxuICAgIGNvbnN0IGNvbEZvcm1Db250cm9sID0ge307XHJcbiAgICB0aGlzLnpncmlkLmdyaWRDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICBpZiAoY29sLklzUmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihjb2wuVmFsaWRhdG9yUGF0dGVybikpO1xyXG4gICAgICB9XHJcbiAgICAgICBcclxuICAgICAgY29sRm9ybUNvbnRyb2xbY29sLlZhbHVlXSA9IG5ldyBGb3JtQ29udHJvbChkYXRhSXRlbVtjb2wuVmFsdWVdLCB2YWxpZGF0b3JzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIHNldCBmb3JtIGNvbnRyb2wgb2JqZWN0IHRvIGZvcm0gZ3JvdXBcclxuICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChjb2xGb3JtQ29udHJvbCk7XHJcblxyXG4gICAgLy8gc2V0IGdyaWQgcm93IHRvIGVkaXRcclxuICAgIHRoaXMuZWRpdGVkUm93SW5kZXggPSByb3dJbmRleDsgXHJcbiAgICBzZW5kZXIuZWRpdFJvdyhyb3dJbmRleCwgdGhpcy5mb3JtR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUhhbmRsZXIoeyBzZW5kZXIsIGRhdGFJdGVtIH0pIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJdGVtSW5kZXgoZGF0YUl0ZW0sIHRoaXMuZ0RhdGEsIHRoaXMuZGF0YVsnVW5pcXVlS2V5J10pO1xyXG4gICAgdGhpcy5nRGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgIHNlbmRlci5jYW5jZWxDZWxsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlRWRpdG9yKGdyaWQsIHJvd0luZGV4ID0gdGhpcy5lZGl0ZWRSb3dJbmRleCkge1xyXG4gICAgZ3JpZC5jbG9zZVJvdyhyb3dJbmRleCk7XHJcbiAgICB0aGlzLmVkaXRlZFJvd0luZGV4ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEl0ZW1JbmRleChpdGVtOiBhbnksIGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBkYXRhLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgaWYgKGRhdGFbaWR4XVtrZXldID09PSBpdGVtW2tleV0pIHtcclxuICAgICAgICByZXR1cm4gaWR4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxufVxyXG4iLCI8IS0tXHJcbjxkaXYgc3R5bGU9XCJtYXJnaW46IDEwcHhcIj5cclxuICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBrLWZvcm1cIj5cclxuICAgICAgICAgIDxmaWVsZHNldD5cclxuICAgICAgICAgICAgPGxlZ2VuZD5CaW5kaW5nIHR5cGVzPC9sZWdlbmQ+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrLWZvcm0tZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPkJpbmQgdGhlIGRhdGEgdG86PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiYmluZGluZ1R5cGVcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwibW9kZVwiIGlkPVwiYXJyYXlcIiB2YWx1ZT1cImFycmF5XCIgY2xhc3M9XCJrLXJhZGlvXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQmluZGluZ1R5cGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiay1yYWRpby1sYWJlbFwiIGZvcj1cImFycmF5XCI+QXJyYXkgb2JqZWN0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImJpbmRpbmdUeXBlXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVcIiBpZD1cImdyaWREYXRhUmVzdWx0XCIgdmFsdWU9XCJncmlkRGF0YVJlc3VsdFwiIGNsYXNzPVwiay1yYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUJpbmRpbmdUeXBlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstcmFkaW8tbGFiZWxcIiBmb3I9XCJncmlkRGF0YVJlc3VsdFwiPkdyaWREYXRhUmVzdWx0IG9iamVjdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJiaW5kaW5nVHlwZVwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlXCIgaWQ9XCJhc3luY1wiIHZhbHVlPVwiYXN5bmNcIiBjbGFzcz1cImstcmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VCaW5kaW5nVHlwZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJrLXJhZGlvLWxhYmVsXCIgZm9yPVwiYXN5bmNcIj5Bc3luY2hyb25vdXMgc291cmNlPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+IC0tPlxyXG48ZGl2IHN0eWxlPVwibWFyZ2luOiAxMHB4IDAgNnB4IDA7XCI+XHJcbiAgPGRpdiAqbmdJZj1cImRhdGEuVGl0bGVcIiBjbGFzcz1cImdyaWRUaXRsZVwiPnt7ZGF0YS5UaXRsZX19PC9kaXY+XHJcbiAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBsZXQtYW5jaG9yPlxyXG4gICAgPHNwYW4+e3sgYW5jaG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJUZXh0IH19PC9zcGFuPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPGRpdiBrZW5kb1Rvb2x0aXBcclxuICAgICAgIHNob3dPbj1cIm5vbmVcIlxyXG4gICAgICAgW3Rvb2x0aXBUZW1wbGF0ZV09XCJ0ZW1wbGF0ZVwiXHJcbiAgICAgICBmaWx0ZXI9XCIuay1ncmlkIHRkXCJcclxuICAgICAgIChtb3VzZW92ZXIpPVwic2hvd1Rvb2x0aXAoJGV2ZW50KVwiPiBcclxuICAgIDxrZW5kby1ncmlkIFt6Z3JpZGJpbmRpbmddPVwie2RhdGE6IGRhdGEsIGdyb3VwOiBncm91cCwgcGFyYW1zOiBwYXJhbXMsIGdyaWRTdWJqZWN0OiBncmlkU3ViamVjdH1cIiBbbmdDbGFzc109XCJkYXRhLkNsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImdyaWREYXRhXCJcclxuICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJzdGF0ZS50YWtlXCJcclxuICAgICAgICAgICAgICAgIFtwYWdlYWJsZV09XCJ7cmVzcG9uc2l2ZTogdHJ1ZSwgYnV0dG9uQ291bnQ6IDMsIHBhZ2VTaXplczogcGFnZVNpemVzLCBwcmV2aW91c05leHQ6IHByZXZpb3VzTmV4dH1cIlxyXG4gICAgICAgICAgICAgICAgW3NraXBdPVwic3RhdGUuc2tpcFwiXHJcbiAgICAgICAgICAgICAgICBbc29ydF09XCJzdGF0ZS5zb3J0XCJcclxuICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJ7YWxsb3dVbnNvcnQ6IHRydWUsbW9kZTogJ211bHRpcGxlJ31cIlxyXG4gICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJzdGF0ZS5maWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiZGF0YS5lbmFibGVGaWx0ZXJpbmcgIT09IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbcmVvcmRlcmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbY29sdW1uTWVudV09XCJkYXRhLkRpc2FibGVHcmlkQ29sdW1uTWVudSA/IGZhbHNlIDogeyBmaWx0ZXI6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSlcIlxyXG4gICAgICAgICAgICAgICAgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2tIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGNlbGxDbG9zZSk9XCJlZGl0Q2VsbENsb3NlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChkYXRhU3RhdGVDaGFuZ2UpPVwiZGF0YVN0YXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cInNvcnRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImZpbHRlckNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChjb2x1bW5SZW9yZGVyKT1cImNvbHVtbnNPcmRlckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBba2VuZG9HcmlkU2VsZWN0QnldPVwicm93U2VsZWN0aW9uS2V5XCJcclxuICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICBbKHNlbGVjdGVkS2V5cyldPVwibXlTZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0R3JpZFN0eWxlKClcIlxyXG4gICAgICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXHJcbiAgICAgICAgICAgICAgICAoY2FuY2VsKT1cImNhbmNlbEhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoc2F2ZSk9XCJzYXZlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChyZW1vdmUpPVwicmVtb3ZlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChlZGl0KT1cImVkaXRIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGFkZCk9XCJhZGRIYW5kbGVyKCRldmVudClcIj5cclxuICAgICAgPCEtLVtzY3JvbGxhYmxlXT1cInNjcm9sbE1vZGVcIiB0ZW1wIHJlbW92ZS4gY2F1c2luZyBzb21lIGJ1ZyBvbiBwYWdpbmF0aW9uLS0+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRUb29sYmFyVGVtcGxhdGUgKm5nSWY9XCJkYXRhLkFsbG93UmVmcmVzaEJ1dHRvbiB8fCBkYXRhLkFsbG93RXhwb3J0IHx8IGRhdGEuQWxsb3dTYXZlU3RhdGUgfHwgZGF0YS5FbmFibGVHcmlkQ29tbWFuZFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJyZWZyZXNoRGF0YSgpXCIgKm5nSWY9XCJkYXRhLkFsbG93UmVmcmVzaEJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1yZWZyZXNoLXNtXCI+PC9zcGFuPiZuYnNwO1JlZnJlc2g8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0dyaWRFeGNlbENvbW1hbmQgKm5nSWY9XCJkYXRhLkFsbG93RXhwb3J0XCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLWZpbGUtZXhjZWxcIj48L3NwYW4+Jm5ic3A7RXhwb3J0IERhdGEgdG8gRXhjZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0J1dHRvbiAoY2xpY2spPVwic2F2ZUdyaWRTZXR0aW5ncygpXCIgKm5nSWY9XCJkYXRhLkFsbG93U2F2ZVN0YXRlXCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXN0YXJcIj48L3NwYW4+Jm5ic3A7U2F2ZSBTZXR0aW5nPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIga2VuZG9CdXR0b24gKGNsaWNrKT1cInJlc3RvcmVHcmlkU2V0dGluZ3MoKVwiICpuZ0lmPVwiZ3JpZERlZmF1bHRTdGF0ZUV4aXN0XCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXN0YXItb3V0bGluZVwiPjwvc3Bhbj4mbmJzcDtSZXN0b3JlIFNldHRpbmc8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0dyaWRBZGRDb21tYW5kICpuZ0lmPVwiZGF0YS5FbmFibGVHcmlkQ29tbWFuZCBcIj48c3BhbiBjbGFzcz1cImstaWNvbiBrLWktYWRkXCI+PC9zcGFuPkFkZCBOZXc8L2J1dHRvbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPGtlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uICpuZ0lmPVwiISFkYXRhLlNlbGVjdE9wdGlvbnNcIiBbd2lkdGhdPVwiNjBcIiBzaG93U2VsZWN0QWxsPVwidHJ1ZVwiIFtjb2x1bW5NZW51XT1cInRydWVcIj48L2tlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uPlxyXG4gICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImNvbC50aXRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiY29sLndpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5SZXNpemFibGVXaWR0aF09XCJjb2wubWluUmVzaXphYmxlV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJjb2wuZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGUoY29sLmVuYWJsZUZpbHRlcmluZylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cInNvcnRhYmxlKGNvbC5lbmFibGVTb3J0aW5nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGVhZGVyU3R5bGVdPVwieyd3aGl0ZS1zcGFjZSc6ICdpbml0aWFsJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJjb2wuaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwiY29sLmZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLkNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtsb2NrZWRdPVwibG9ja2VkKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbk1lbnVdPVwiIWNvbC5kaXNhYmxlQ29sdW1uTWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZWRpdG9yXT1cImNvbC5lZGl0b3JUeXBlXCI+XHJcbiAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiY29sLmZpZWxkVHlwZSA9PT0gJ251bWJlcidcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ2N1cnJlbmN5J1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnem51bWVyaWMnXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtbnVtZXJpYy1maWx0ZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJlcVwiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1udW1lcmljLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJjb2wuZmllbGRUeXBlID09ICd6ZGF0ZSdcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3p0aW1lJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnemRhdGV0aW1lJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnenVpZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IHRydWVcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiIG9wZXJhdG9yPVwibHRlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGF0ZS1yYW5nZS1maWx0ZXItY2VsbCBjbGFzcz1cImRhdGUtcmFuZ2UtZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuZmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPC9kYXRlLXJhbmdlLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmZpbHRlckJ5RGF0ZVJhbmdlID09PSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImx0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtZGF0ZS1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxyXG4gICAgICAgICAgICAgIDxrZW5kby1ncmlkLXN0cmluZy1maWx0ZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJjb250YWluc1wiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1jb250YWlucy1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1jb250YWlucy1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZXEtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1uZXEtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLXN0YXJ0c3dpdGgtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItc3RhcnRzd2l0aC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZW5kc3dpdGgtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZW5kc3dpdGgtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgPC9rZW5kby1ncmlkLXN0cmluZy1maWx0ZXItY2VsbD5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gR3JpZCBFZGl0IFRlbXBsYXRlIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRFZGl0VGVtcGxhdGUgKm5nSWY9XCJkYXRhLkVuYWJsZUdyaWRDb21tYW5kIFwiIGxldC1kYXRhSXRlbT1cImRhdGFJdGVtXCIgbGV0LWNvbHVtbj1cImNvbFwiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIiBsZXQtaXNOZXc9XCJpc05ld1wiPlxyXG4gICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgIDxrZW5kby1udW1lcmljdGV4dGJveCAjY2VsbEFuY2hvciBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpXCI+PC9rZW5kby1udW1lcmljdGV4dGJveD5cclxuICAgICAgICAgICAgICA8a2VuZG8tcG9wdXAgW2FuY2hvcl09XCJjZWxsQW5jaG9yLm51bWVyaWNJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIShpc05ldyAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwQ2xhc3M9XCJrLXdpZGdldCBrLXRvb2x0aXAgay10b29sdGlwLXZhbGlkYXRpb24gay1pbnZhbGlkLW1zZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAycHg7IG9wYWNpdHk6IDAuNTtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmVycm9ycz8ucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLk5hbWUgfX0gcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgc3R5bGU9XCJwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWxlZnQ6IDNweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5lcnJvcnM/LnBhdHRlcm5cIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLlZhbGlkYXRvck1lc3NhZ2UgPyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA6IFwiUGxlYXNlIGNoZWNrIHRoZSBpbnB1dCB2YWx1ZS5cIiB9fVxyXG4gICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9rZW5kby1wb3B1cD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICA8a2VuZG8tdGV4dGJveCAjY2VsbEFuY2hvciBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpXCI+PC9rZW5kby10ZXh0Ym94PlxyXG4gICAgICAgICAgICAgIDxrZW5kby1wb3B1cCBbYW5jaG9yXT1cImNlbGxBbmNob3IuaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICEoaXNOZXcgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cENsYXNzPVwiay13aWRnZXQgay10b29sdGlwIGstdG9vbHRpcC12YWxpZGF0aW9uIGstaW52YWxpZC1tc2dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogMnB4OyBvcGFjaXR5OiAwLjU7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWktd2FybmluZ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwhLS08aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCI+e3sgY29sLk5hbWUgfX0gaXMgcmVxdWlyZWQuPC9pb24tbGFiZWw+LS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmVycm9ycz8ucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLk5hbWUgfX0gcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgc3R5bGU9XCJwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWxlZnQ6IDNweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS5lcnJvcnM/LnBhdHRlcm5cIj5cclxuICAgICAgICAgICAgICAgICAge3sgY29sLlZhbGlkYXRvck1lc3NhZ2UgPyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA6IFwiUGxlYXNlIGNoZWNrIHRoZSBpbnB1dCB2YWx1ZS5cIiB9fVxyXG4gICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9rZW5kby1wb3B1cD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWRhdGFJdGVtIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiAxcHggMDtcIiAqbmdJZj1cIiFjb2wuY2xpY2thYmxlSWNvbnMgJiYgY29sLmlzRWRpdGFibGVJbkdyaWQgIT09IHRydWVcIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiXHJcbiAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzKGRhdGFJdGVtLCBjb2wpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGUnXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6ICdkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenRpbWUnXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6ICdISDptbScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pzaG9ydGRhdGUnXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IGRhdGU6ICdNTU0geXl5eScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlciB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCwgJzEuMi0yJykgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pudW1lcmljJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBudW1iZXI6IGdldEZvcm1hdChjb2wpIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid1cmwnXCIgc3R5bGU9XCJjb2xvcjogYmx1ZTsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO1wiPlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgIDwhLS17eyBkYXRhSXRlbVtjb2wuZmllbGRdIH19LS0+IFxyXG4gICAgICAgICAgICAgIDxkaXYgW25nU3dpdGNoXT1cImNlbGxTdHlsZUNvbmRpdGlvbihjb2wsIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPXRydWU+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZWxsU3R5bGVDb25kaXRpb25EZWZhdWx0XCIgW3N0eWxlXT1cInNldENlbGxTdHlsZUNvbmRpdGlvbihjb2wsIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+IFxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIiEhY29sLm5hdmlnYXRlVG9cIiAoY2xpY2spPVwib25OYXZpZ2F0ZVRvKCRldmVudCwgY29sLCBkYXRhSXRlbSwgZGF0YUl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJsaWdodFwiIHNpemU9XCJzbWFsbFwiPlxyXG4gICAgICB7eyBjb2wuQ2xpY2thYmxlSWNvbnMgfX1cclxuICAgICAgPGlvbi1pY29uIHNsb3Q9IFwiZW5kXCIgbmFtZT1cImFycm93LWZvcndhcmRcIj48L2lvbi1pY29uPlxyXG4gICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgIDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiA1cHggMDtcIiAqbmdJZj1cImNvbC5pc0VkaXRhYmxlSW5HcmlkID09PSB0cnVlICYmIGlubGluZUVkaXRlZEZvcm1Hcm91cHNcIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiIFtmb3JtR3JvdXBdPVwiaW5saW5lRWRpdGVkRm9ybUdyb3Vwc1wiXHJcbiAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzKGRhdGFJdGVtLCBjb2wpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cInRoaXMuZ2V0Rm9ybUNvbnRyb2wocm93SW5kZXgsIGNvbC5maWVsZClcIiAvPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XHJcbiAgICAgICAgICAgICAgPGlvbi1jaGVja2JveCBbZGlzYWJsZWRdPVwiKCEhY29sLlJlYWRPbmx5ID8gY29sLlJlYWRPbmx5IDogZmFsc2UpXCIgW2Zvcm1Db250cm9sXT1cInRoaXMuZ2V0Rm9ybUNvbnRyb2wocm93SW5kZXgsIGNvbC5maWVsZClcIiBjb2xvcj1cInByaW1hcnlcIiAoaW9uQ2hhbmdlKT1cImluQ2VsbENoZWNrQm94T25DaGFuZ2UoJGV2ZW50LCByb3dJbmRleCwgY29sKVwiPjwvaW9uLWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenVpc2VsZWN0bXVsdGlwbGUnXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16c2VsZWN0bXVsdGlwbGUgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbZGF0YV09XCJnZXRJbmxpbmVGaWVsZChjb2wuVmFsdWUpXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZ2V0SW5saW5lRm9ybShyb3dJbmRleClcIj48L2FwcC16c2VsZWN0bXVsdGlwbGU+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0ZXh0YXJlYSdcIj5cclxuICAgICAgICAgICAgICA8YXBwLXp0ZXh0YXJlYSBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIFtkYXRhXT1cImdldElubGluZUZpZWxkKGNvbC5WYWx1ZSlcIiBbZ3JvdXBdPVwiZ3JvdXBcIiBbZm9ybV09XCJnZXRJbmxpbmVGb3JtKHJvd0luZGV4KVwiPjwvYXBwLXp0ZXh0YXJlYT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiWyd6dWlkYXRldGltZScsJ3pkYXRlJywgJ3p0aW1lJywnemRhdGV0aW1lJywnenNob3J0ZGF0ZSddLmluY2x1ZGVzKGNvbC5maWVsZFR5cGUpID8gY29sLmZpZWxkVHlwZSA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16ZGF0ZXRpbWUgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbZGF0YV09XCJnZXRJbmxpbmVGaWVsZChjb2wuVmFsdWUpXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZ2V0SW5saW5lRm9ybShyb3dJbmRleClcIj48L2FwcC16ZGF0ZXRpbWU+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJ0aGlzLmdldEZvcm1Db250cm9sKHJvd0luZGV4LCBjb2wuZmllbGQpXCIgLz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sLmNsaWNrYWJsZUljb25zXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImljb24uQ2xhc3MgPyBpY29uLkNsYXNzIDogJydcIiAqbmdJZj1cIiEhaWNvbiAmJiAoISFkYXRhSXRlbS5XRlNfU3RhdHVzQ29kZSAmJiAhIWljb24pXHJcbiAgICAgICAgICAgICAgPyBkYXRhSXRlbS5XRlNfU3RhdHVzQ29kZSAhPT0gaWNvbi5XRlNfU3RhdHVzQ29kZVxyXG4gICAgICAgICAgICAgIDogdHJ1ZTtcclxuICAgICAgICAgICAgZWxzZSBkaXNhYmxlZEJ1dHRvblwiIChjbGljayk9XCJvbkJ0bkNsaWNrKCRldmVudCwgaWNvbiwgZGF0YUl0ZW0sIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAge3tpY29uLk5hbWUgfHwgZGF0YUl0ZW1bY29sLmZpZWxkXX19IDxmYS1pY29uIFtpY29uXT1cImljb24uSWNvblwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweDtcIj5cclxuICAgICAgICAgICAgICA8L2ZhLWljb24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZEJ1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwhLS0gPHN0cm9uZz57eyBkYXRhSXRlbVtjb2wuZmllbGRdIH19PC9zdHJvbmc+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInt7ZGF0YUl0ZW0uRGlzY29udGludWVkID8gJ2Rpc2NvbnRpbnVlZCcgOiAnYWN0aXZlJ319XCI+XHJcbiAgICAgICAge3tkYXRhSXRlbS5EaXNjb250aW51ZWQgPyBcImRpc2NvbnRpbnVlZFwiIDogXCJhY3RpdmVcIn19XHJcbiAgICAgIDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRm9vdGVyVGVtcGxhdGUgbGV0LWNvbHVtbiBsZXQtY29sdW1uSW5kZXg9XCJjb2x1bW5JbmRleFwiICpuZ0lmPVwiZGF0YS5FbmFibGVBZ2dyZWdhdGVcIj5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDVweCAwO1wiIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCI+XHJcbiAgICAgICAgICAgIHt7Y29sLmFnZ3JlZ2F0ZVR5cGV9fVxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6ICdkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenRpbWUnXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogJ0hIOm1tJyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenNob3J0ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiAnTU1NIHl5eXknIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBudW1iZXIgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCwgJzEuMi4yJykgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pudW1lcmljJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCkgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3VybCdcIiBzdHlsZT1cImNvbG9yOiBibHVlOyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cclxuICAgICAgPGtlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4gKm5nSWY9XCJkYXRhLkVuYWJsZUdyaWRDb21tYW5kXCIgd2lkdGg9XCIxODBcIiBbY29sdW1uTWVudV09XCJmYWxzZVwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWlzTmV3PVwiaXNOZXdcIj5cclxuICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkU2F2ZUNvbW1hbmQ+XHJcbiAgICAgICAgICAgIHt7IGlzTmV3ID8gJ1NhdmUnIDogJ1VwZGF0ZScgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBrZW5kb0dyaWRDYW5jZWxDb21tYW5kIFtwcmltYXJ5XT1cInRydWVcIj5cclxuICAgICAgICAgICAge3sgaXNOZXcgPyAnRGlzY2FyZCBjaGFuZ2VzJyA6ICdDYW5jZWwnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkRWRpdENvbW1hbmQ+XHJcbiAgICAgICAgICAgIHt7IFwiRWRpdFwiIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkUmVtb3ZlQ29tbWFuZD5cclxuICAgICAgICAgICAge3sgXCJSZW1vdmVcIiB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9rZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uPlxyXG4gICAgICA8a2VuZG8tZ3JpZC1leGNlbCBmaWxlTmFtZT1cIkV4cG9ydC54bHN4XCIgW2ZldGNoRGF0YV09XCJhbGxSZXN1bHRzXCI+PC9rZW5kby1ncmlkLWV4Y2VsPlxyXG4gICAgPC9rZW5kby1ncmlkPlxyXG4gICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwiay1pLWxvYWRpbmdcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
910
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemdyaWQvemdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hFLE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFlbkUsT0FBTyxFQUV1QixvQkFBb0IsRUFBRSxnQkFBZ0IsRUFFbkUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCMUQsTUFBTSxPQUFPLGNBQWM7SUF3RHpCLFlBQ1UsY0FBOEIsRUFDOUIsTUFBYyxFQUNkLFdBQXdCLEVBQ3hCLFdBQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLDJCQUF3RCxFQUN4RCxZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxXQUF3QjtRQVR4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUFDeEQsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBN0RsQyxxRkFBcUY7UUFDckYsVUFBSyxHQUFRLElBQUksQ0FBQztRQUNsQixhQUFRLEdBQVcsSUFBSSxDQUFDO1FBS3hCLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBS3hCLHdCQUFtQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUVqRCw4R0FBOEc7UUFDOUcsV0FBTSxHQUFVO1lBQ2QsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsRUFBRTtTQUNULENBQUM7UUFFRixXQUFNLEdBQXVCO1lBQzNCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLENBQUM7WUFDVCxRQUFRLEVBQUUsRUFBRTtZQUNaLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsZUFBZSxFQUFFLEVBQUU7WUFDbkIsVUFBVSxFQUFFLEVBQUU7WUFDZCxZQUFZLEVBQUUsRUFBRTtZQUNoQixVQUFVLEVBQUUsRUFBRTtZQUNkLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEVBQUU7WUFDWCxTQUFTLEVBQUUsQ0FBQztTQUNiLENBQUM7UUFFRixnQkFBVyxHQUFpQixJQUFJLE9BQU8sRUFBTyxDQUFDO1FBWS9DLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2QyxVQUFLLEdBQVksSUFBSSxDQUFDO1FBdVVmLFlBQU8sR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUc7Z0JBQ2QsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEMsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBRW5CLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGdCQUFnQjtpQkFDN0Q7Z0JBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUNsQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUMvQjtRQUNILENBQUMsQ0FBQTtRQTRmRCx5QkFBeUI7UUFDbEIsY0FBUyxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFTSxlQUFVLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDN0IsQ0FBQyxDQUFBO1FBRU0sZUFBVSxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDN0MsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkgsQ0FBQyxDQUFBO1FBcjFCQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUNwRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBR0QsUUFBUTtRQUNOLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpDLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsY0FBYyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUUzSCxFQUFFLENBQUMsSUFBSSxDQUFDO2FBQ0wsSUFBSTtRQUNILG1CQUFtQjtRQUNuQiwyQ0FBMkM7UUFDM0MsdUdBQXVHO1FBQ3ZHLEtBQUs7UUFDTCwrQkFBK0I7UUFDL0IseUJBQXlCO1FBQ3pCLDhEQUE4RDtRQUM5RCxnRkFBZ0Y7UUFDaEYsc0JBQXNCO1FBQ3RCLEtBQUs7UUFDTCxxQkFBcUI7UUFDckIsS0FBSztRQUNMLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYix1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUM7WUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksS0FBSyxDQUFDO1lBQ25FLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRWhGLDRCQUE0QjtZQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsRUFBRTtnQkFDdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7YUFDeEI7WUFFRCx3QkFBd0I7WUFDeEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHO29CQUN4QixtQ0FBbUM7b0JBQ25DLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVTtpQkFDbkUsQ0FBQzthQUNIO1lBRUQsc0NBQXNDO1lBQ3RDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN4QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1lBRUQseUJBQXlCO1lBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNqQztZQUVELHlGQUF5RjtZQUN6RixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ3hDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7d0JBQ25ELE1BQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQ3BCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQzt3QkFDRixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUNsQjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBRUQsNERBQTREO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO2dCQUN0QyxzQ0FBc0M7Z0JBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3lCQUNoQzt3QkFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN4RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztxQkFDM0I7b0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUNoQyxxQ0FBcUM7d0JBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQkFDbEM7aUJBRUY7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILDJDQUEyQztZQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFbEIsd0JBQXdCO1lBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNwQztZQUNELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsS0FBSztRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWhGLElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7U0FDbkM7YUFDSTtZQUNILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU0sZUFBZSxDQUFDLEtBQTJCO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuQzthQUFNO1lBRUwsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUUxQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzthQUN0QztTQUNGO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFVO1FBQzFCLElBQUksS0FBSyxLQUFLLEtBQUssRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBZTtRQUMzQixJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDZEQUE2RDtJQUU3RCxpQ0FBaUM7SUFDMUIsWUFBWTtRQUNqQixPQUFPO1lBQ0wsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDakMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVc7U0FDakQsQ0FBQyxDQUFDLG1DQUFtQztJQUN4QyxDQUFDO0lBRU8sYUFBYTtRQUNuQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDMUQsT0FBTyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDN0MsK0NBQStDO1FBQy9DLFNBQVM7UUFDVCxzREFBc0Q7UUFDdEQsZ0NBQWdDO1FBQ2hDLFNBQVM7UUFDVCxtQkFBbUI7UUFDbkIsSUFBSTtJQUNOLENBQUM7SUFDRCwrQkFBK0I7SUFHL0Isd0JBQXdCO0lBQ2pCLGNBQWM7UUFDbkIsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLEdBQUc7Z0JBQ3hCLFlBQVksRUFBRSxLQUFLO2dCQUNuQixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRO2FBQ3RFLENBQUM7WUFDRixpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDMUI7UUFDRCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFFTSxVQUFVLENBQUMsVUFBa0IsRUFBRSxPQUFpQztRQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRU8sNkJBQTZCLENBQUMsVUFBb0M7UUFDeEUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzQixNQUFNLFFBQVEsR0FBWSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ25DLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNaLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDYixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Z0JBQ1osY0FBYyxFQUFFLENBQUMsUUFBUTtnQkFDekIsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUM5QixlQUFlLEVBQUUsS0FBSztnQkFDdEIsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixRQUFRLEVBQUUsb0JBQW9CO2dCQUM5QixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsUUFBUTthQUM3QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTNDLE1BQU0sYUFBYSxHQUFvQixnQkFBZ0IsQ0FBQyxhQUFhLENBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUN0QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQztTQUN4RTtRQUNELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FDdkIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1QsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLDJCQUEyQixDQUFDLENBQUM7YUFDcEY7WUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbEIsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksRUFDbEMsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxXQUFXLEVBQ2hCLFNBQVMsRUFDVCxXQUFXLEVBQ1gsSUFBSSxFQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQWFILENBQUM7SUFDSixDQUFDO0lBRUQsc0JBQXNCO0lBRWQsU0FBUyxDQUFDLFFBQWE7UUFDN0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUMxQixvQkFBb0I7WUFDcEIsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQzlCLElBQUksRUFBRSxRQUFRO2dCQUNkLGFBQWEsRUFBRSxTQUFTO2FBQ0EsQ0FBQyxDQUFDO1NBQzdCO2FBQ0k7WUFDSCw2QkFBNkI7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNuRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWM7YUFDaEMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUN0QixJQUFJLEVBQUUseUJBQXlCO2dCQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztnQkFDdEMsSUFBSSxFQUFFLEVBQUU7YUFDZ0IsQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQXdCTyxzQkFBc0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNsRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN4QixPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUN4QixJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUcsaUJBQWlCLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUMzRixDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDN0I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVNLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFHTSxjQUFjLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUN0RCxNQUFNLFNBQVMsR0FBYyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBYyxDQUFDO1FBQ25GLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFeEMsSUFBSSxRQUFRLEVBQUU7WUFDWixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDL0I7YUFDSTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixxREFBcUQ7WUFDckQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDNUQsT0FBTzthQUNSO1lBRUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUUxRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUM3QixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUN2QixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDL0MsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzNCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RSxDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sZUFBZSxDQUFDLFFBQWEsRUFBRSxTQUFjO1FBQ2xELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDNUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDL0MsT0FBTyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFJTSxVQUFVLENBQUMsS0FBVSxFQUFFLFVBQWUsRUFBRSxPQUFZLEVBQUUsUUFBZ0I7UUFDM0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsS0FBcUI7UUFDM0MsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkgsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUVqRyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyxnQ0FBZ0MsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNuRixJQUFJLGNBQWMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hJO2FBQ0Y7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDekIsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNsRixJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRTt3QkFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNqRCxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2pCO29CQUNELE9BQU87aUJBQ1I7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDaEM7U0FDRjtJQUNILENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxJQUFTO1FBQ25DLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjthQUFNLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRTtZQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkY7SUFDSCxDQUFDO0lBR00sWUFBWSxDQUFDLEtBQVUsRUFBRSxXQUFnQixFQUFFLE9BQVksRUFBRSxRQUFnQjtRQUM5RSxZQUFZO1FBQ1osNkRBQTZEO1FBQzdELE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxFQUFFO1lBQ0wsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDdEIsSUFBSSxFQUFFLG9CQUFvQjtnQkFDMUIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxLQUFLO2dCQUN6QixPQUFPLEVBQUUsT0FBTztnQkFDaEIsSUFBSSxFQUFFLFFBQVE7YUFDVSxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRU0sV0FBVyxDQUFDLENBQWE7UUFDOUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQXFCLENBQUM7UUFFeEMsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLElBQUksSUFBSSxJQUFJLGdCQUFnQixFQUFFO2dCQUM1QixlQUFlLEdBQUcsSUFBSSxDQUFDO2FBQ3hCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQy9ILElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO2FBQ0k7WUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVNLGVBQWUsQ0FBQyxPQUFnQjtRQUNyQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUE0QixFQUFFLEtBQWEsRUFBRSxFQUFPO1FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFVLENBQUM7WUFDakQsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN4QjtpQkFBTTtnQkFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixHQUFHLFdBQVcsQ0FBQyxDQUFDO2FBQzFEO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbkQ7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsUUFBYTtRQUMxQyxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQzdCLE1BQU0scUJBQXFCLEdBQU8sR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDNUQsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBRTVCLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxFQUFFO3dCQUM3QixlQUFlLEdBQUcsSUFBSSxDQUFDO3FCQUN4QjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxlQUFlLENBQUM7U0FDeEI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsUUFBYTtRQUM3QyxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQzdCLE1BQU0scUJBQXFCLEdBQU8sR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDNUQsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBRXpCLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxFQUFFO29CQUM3QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO3dCQUMzQixlQUFlLEdBQUcsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsR0FBRyxDQUFDO3FCQUN2RTtvQkFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDakIsZUFBZSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDO3FCQUNuRDtvQkFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO3dCQUMzQixlQUFlLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7cUJBQzVDO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLGVBQWUsQ0FBQztTQUN4QjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLFVBQVU7UUFDZixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBYyxDQUFDO1FBQzFDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBcUIsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBc0IsQ0FBQztRQUVyRCxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztRQUVoRSxxREFBcUQ7UUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUU5QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDcEUsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQW9CO2dCQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSTthQUNyQyxDQUFDO1lBRUYsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTSxRQUFRLENBQUMsUUFBYSxFQUFFLEdBQVE7UUFDckMsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDO1FBQzFCLElBQUksR0FBRyxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLFNBQVMsS0FBSyxVQUFVLElBQUksR0FBRyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUU7WUFDOUYsT0FBTyxJQUFJLGVBQWUsQ0FBQztTQUM1QjtRQUVELElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEVBQUU7WUFDbEMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztTQUNqRDtRQUVELElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtZQUNiLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztTQUM1QjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxTQUFTLENBQUMsR0FBUSxFQUFFLGFBQW1CO1FBQzVDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLEdBQUcsQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ25DLE1BQU0sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzdDO2FBQU07WUFDTCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUM5QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFWCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUMxQjtZQUVELElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDWixNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO2FBQy9CO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBR00sYUFBYSxDQUFDLFVBQWtCLEVBQUUsY0FBc0I7UUFDN0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNqQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDL0IsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtnQkFDM0IsR0FBRyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUM7YUFDNUI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxTQUFrQjtRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRU0saUJBQWlCLENBQUMsS0FBYTtRQUNwQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQzNCLE9BQU87U0FDUjthQUNJO1lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDM0g7SUFFSCxDQUFDO0lBRU0sT0FBTyxDQUFDLEtBQWEsRUFBRSxJQUFjO1FBQzFDLHdDQUF3QztRQUN4QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxpQ0FBaUM7SUFDMUIsZ0JBQWdCO1FBQ3JCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBcUIsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBRXpDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ2IsSUFBSSxDQUNILFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixNQUFNLFdBQVcsR0FBMEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdkUsTUFBTSxvQkFBb0IsR0FBd0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7cUJBQ2hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDakIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQ3JELENBQUMsQ0FBQztxQkFDRCxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUNyQjtvQkFDRSxHQUFHLEdBQUc7b0JBQ04sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2lCQUMxQixDQUFDLEVBQ0EsRUFBeUIsQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLG9CQUFvQixDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1lBRUgsa0NBQWtDO1lBQ2xDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMzQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sV0FBVyxHQUFrQjtnQkFDakMscUJBQXFCO2dCQUNyQixhQUFhLEVBQUUsV0FBVzthQUMzQixDQUFDO1lBRUYscUVBQXFFO1lBQ3JFLElBQUksZUFBZSxHQUFrQixJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvRixJQUFJLFdBQVcsR0FBZ0IsSUFBSSxDQUFDO1lBQ3BDLElBQUksZUFBZSxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBRXJGLElBQUksV0FBVyxFQUFFO29CQUNmLFdBQVcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO2lCQUN4QzthQUNGO2lCQUNJO2dCQUNILGVBQWUsR0FBRyxFQUFFLENBQUM7YUFDdEI7WUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNoQixXQUFXLEdBQUc7b0JBQ1osY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO29CQUNuQyxZQUFZLEVBQUUsV0FBVztpQkFDMUIsQ0FBQztnQkFFRixlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ25DO1lBQ0QsT0FBTyxlQUFlLENBQUM7UUFDekIsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3BCLG9DQUFvQztZQUNwQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDckUsc0JBQXNCO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDbkIsMkRBQTJEO1lBQzNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsUUFBUTtZQUNSLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdFLENBQUMsQ0FBQyxDQUNILENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixFQUFFLENBQUMsSUFBSSxDQUFDO2FBQ0wsSUFBSSxDQUNILFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDN0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakIsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNiLHVEQUF1RDtZQUN2RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYiw4QkFBOEI7WUFDOUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsNkJBQTZCO1lBQzdCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixRQUFRO1lBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzVCLE1BQU0sV0FBVyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUV6SCx1Q0FBdUM7WUFDdkMsSUFBSSxlQUFlLEdBQWtCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkYsSUFBSSxlQUFlLEVBQUU7Z0JBQ25CLE1BQU0sWUFBWSxHQUFnQixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLFlBQVksRUFBRTtvQkFDaEIsT0FBTyxZQUFZLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDNUY7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELG9CQUFvQjtJQUNiLGNBQWMsQ0FBQyxLQUFVO1FBQzlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxhQUFhLENBQUMsUUFBZ0I7UUFDbkMsTUFBTSxTQUFTLEdBQWMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQWMsQ0FBQztRQUNuRixPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVNLGtCQUFrQixDQUFDLEtBQVU7UUFDbEMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBR0QsV0FBVztJQUNKLGlCQUFpQixDQUFDLEtBQWEsRUFBRSxFQUFPO1FBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFO1lBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUNyRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQjtRQUNELE9BQU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxFQUFPO1FBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFM0MsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO2lCQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUU7b0JBQ2pELE9BQU8sSUFBSSxDQUFDO2lCQUNiO3FCQUNJO29CQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUU5RCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFO3dCQUNyRCxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUNyQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDakQ7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBRUgsT0FBTyxJQUFJLENBQUM7aUJBQ2I7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQ0k7WUFDSCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVNLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxFQUFPO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFM0MsSUFBSSxhQUFhLEdBQThCLEVBQUUsQ0FBQztRQUVsRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNyRSwrQ0FBK0M7WUFDL0MsYUFBYSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUE7WUFDMUgsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDcEU7SUFDSCxDQUFDO0lBa0JELHFCQUFxQjtJQUNkLFlBQVksQ0FBQyxLQUFVO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFTSxVQUFVLENBQUMsS0FBc0I7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxJQUFzQjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsS0FBVSxFQUFFLFFBQWEsRUFBRSxNQUFXO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sbUJBQW1CLENBQUMsS0FBeUI7UUFDbEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQWMsQ0FBQztRQUMxQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQXFCLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQXNCLENBQUM7UUFFckQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUMzQjtJQUNILENBQUM7SUFHRCwwQkFBMEI7SUFDbkIsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRWxCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpCLDREQUE0RDtRQUM1RCxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLE1BQU0sVUFBVSxHQUFrQixFQUFFLENBQUM7WUFDckMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUNsQixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN0QztZQUNELElBQUksR0FBRyxDQUFDLGdCQUFnQixFQUFFO2dCQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzthQUMzRDtZQUVELGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFL0Msa0JBQWtCO1FBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7UUFDdkQsaUJBQWlCO1FBQ2pCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUUzRixXQUFXO1FBQ1gsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ25CLGdDQUFnQztZQUNoQyxJQUFJLGNBQXVCLENBQUM7WUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxJQUFJLFNBQVMsRUFBRTtnQkFDYixNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRXRELElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLEVBQUU7b0JBQ3RGLFlBQVk7b0JBQ1osdUVBQXVFO29CQUN2RSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzlCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLGtCQUFrQixFQUFFOzRCQUMxQyxjQUFjLEdBQUcsSUFBSSxDQUFDOzRCQUN0QixPQUFPO3lCQUNSO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7WUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNuQixJQUFJLEtBQUssRUFBRTtvQkFDVCx1QkFBdUI7b0JBQ3ZCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3hDO3FCQUNJO29CQUNILHVCQUF1QjtvQkFDdkIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztpQkFDOUM7Z0JBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUUvQixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzNCO2lCQUNJO2dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3BHO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtRQUN2Qyw2QkFBNkI7UUFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU0sV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekIsc0ZBQXNGO1FBQ3RGLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkMsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQztZQUNyQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xCLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3RDO1lBQ0QsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFL0MsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0sYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtRQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFNUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBSSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYztRQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBUyxFQUFFLElBQVcsRUFBRSxHQUFXO1FBQ3RELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxHQUFHLENBQUM7YUFDWjtTQUNGO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7OzRHQTdqQ1UsY0FBYztnR0FBZCxjQUFjLHFKQUlkLGdCQUFnQixnREM3RDdCLDRxb0JBK1VBOzRGRHRSYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFdBQVc7d1dBS1osSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQzhCLFVBQVU7c0JBQTdDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YXAsIG1hcCwgc3dpdGNoTWFwLCBjb25jYXRNYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgRXhjZWxFeHBvcnREYXRhIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZXhjZWwtZXhwb3J0JztcclxuaW1wb3J0IHsgR3JpZEl0ZW0sIFNjcm9sbE1vZGUsIFNlbGVjdGFibGVTZXR0aW5ncyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWQnO1xyXG5pbXBvcnQgeyBTb3J0RGVzY3JpcHRvciwgU3RhdGUsIHByb2Nlc3MgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWRhdGEtcXVlcnlcIjtcclxuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLXRvb2x0aXAnO1xyXG5pbXBvcnQge1xyXG4gIEdyaWREYXRhUmVzdWx0LFxyXG4gIERhdGFTdGF0ZUNoYW5nZUV2ZW50LFxyXG4gIFBhZ2VDaGFuZ2VFdmVudCxcclxuICBDZWxsQ2xpY2tFdmVudCxcclxuICBHcmlkQ29tcG9uZW50LFxyXG4gIFJvd0FyZ3MsXHJcbiAgQ29sdW1uUmVvcmRlckV2ZW50XHJcbn0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWRcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuLy8gaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tIFwic3JjL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudFwiO1xyXG5pbXBvcnQgeyBNYWluU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9tYWluLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgWkdyaWRCaW5kaW5nRGlyZWN0aXZlIH0gZnJvbSBcIi4vemdyaWQuYmluZGluZy5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHtcclxuICBBdXRoU2VydmljZSwgV2ViQXBpU2VydmljZSwgVG9hc3RTZXJ2aWNlLCBHcmlkQ2FjaGluZyxcclxuICBaRmllbGQsIFpHcm91cCwgWkNvbXBvbmVudCwgWkNvbXBvbmVudFByb3BlcnRpZXMsIFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCwgWkNvcmVTZXJ2aWNlLFxyXG4gIFpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZSwgWkdyaWRQb3N0QXBpUGFyYW1zLCBaR3JpZFNldHRpbmdzLCBaR3JpZENvbHVtblNldHRpbmdzLCBaR3JpZEN1c3RvbUNvbHVtbiwgU3RvcmFnZVNlc3Npb25TZXJ2aWNlXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29uc3RhbnQgfSBmcm9tIFwiLi4vY29uc3RhbnRzL2NvbnN0YW50XCI7XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBaR3JpZCB7XHJcbiAgcGFyYW1zOiBaR3JpZFBvc3RBcGlQYXJhbXM7XHJcbiAgc3RhdGU6IFN0YXRlO1xyXG4gIGNvbHVtbnM6IGFueVtdO1xyXG4gIHBhZ2luYXRpb25BcGlQb3N0VXJsOiBzdHJpbmc7XHJcbiAgZGF0YTogWkZpZWxkO1xyXG4gIGdyb3VwOiBaR3JvdXA7XHJcbiAgemdyaWQ6IFpHcmlkQmluZGluZ0RpcmVjdGl2ZTtcclxuICBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzOiBGb3JtR3JvdXA7XHJcbiAgZ2V0R3JpZERhdGE6ICgpID0+IGFueVtdO1xyXG4gIGdldERhdGE6ICgpID0+IHZvaWQ7XHJcbiAgY2xlYXJEYXRhOiAoKSA9PiB2b2lkO1xyXG4gIHNldERhdGE6IChkYXRhOiBhbnkpID0+IHZvaWQ7XHJcbiAgc2V0Q29sdW1uczogKGNvbHVtbkZpZWxkc05hbWU6IHN0cmluZywgY29sdW1uczogQXJyYXk8WkdyaWRDdXN0b21Db2x1bW4+KSA9PiB2b2lkO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtemdyaWRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3pncmlkLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3pncmlkLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaZ3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgQFZpZXdDaGlsZChUb29sdGlwRGlyZWN0aXZlKSBwdWJsaWMgdG9vbHRpcERpcjogVG9vbHRpcERpcmVjdGl2ZTtcclxuICAvLyBAVmlld0NoaWxkKFpHcmlkQmluZGluZ0RpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlIH0pIHpncmlkOiBaR3JpZEJpbmRpbmdEaXJlY3RpdmU7XHJcbiAgemdyaWQ6IGFueSA9IG51bGw7XHJcbiAgb2F1dGhVcmw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxNb2RlOiBTY3JvbGxNb2RlO1xyXG4gIGdyaWREYXRhOiBHcmlkRGF0YVJlc3VsdDtcclxuICBzZWxlY3RhYmxlU2V0dGluZ3M6IFNlbGVjdGFibGVTZXR0aW5ncztcclxuICBteVNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuICBpbmxpbmVFZGl0ZWRGb3JtR3JvdXBzOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwOyAvLyBmb3Iga2VuZG8gZ3JpZCBidWlsdC1pblxyXG4gIHB1YmxpYyBwcmV2aW91c05leHQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbXBvbmVudFByb3BlcnRpZXMgPSBuZXcgWkNvbXBvbmVudFByb3BlcnRpZXMoKTtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiwgbm8tdW5kZXJzY29yZS1kYW5nbGUsIGlkLWJsYWNrbGlzdCwgaWQtbWF0Y2hcclxuICBfc3RhdGU6IFN0YXRlID0ge1xyXG4gICAgc2tpcDogMCxcclxuICAgIHRha2U6IDEwXHJcbiAgfTtcclxuXHJcbiAgcGFyYW1zOiBaR3JpZFBvc3RBcGlQYXJhbXMgPSB7XHJcbiAgICByZWZlcklkOiBudWxsLFxyXG4gICAgcGFnZU5vOiAwLFxyXG4gICAgcGFnZVNpemU6IDIwLFxyXG4gICAgc29ydENvbHVtbk5hbWU6IFwiXCIsXHJcbiAgICBzb3J0T3JkZXI6IFwiXCIsXHJcbiAgICBzb3J0Q29sdW1uTmFtZXM6IFtdLFxyXG4gICAgc29ydE9yZGVyczogW10sXHJcbiAgICBmaWx0ZXJQYXJhbXM6IFtdLFxyXG4gICAgcGFyYW1ldGVyczogXCJcIixcclxuICAgIGZpbHRlcnM6IFwiXCIsXHJcbiAgICBjb2x1bW5zOiBcIlwiLFxyXG4gICAgZ3JhbnRUeXBlOiA0XHJcbiAgfTtcclxuXHJcbiAgZ3JpZFN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSB3aWR0aFJlZHVjZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgaGVpZ2h0UmVkdWNlOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBnRGF0YTogYW55O1xyXG5cclxuICBjb2x1bW5zOiBhbnlbXTtcclxuICBlZGl0YWJsZUNvbHVtbnM6IGFueVtdO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHBhZ2VTaXplczogYm9vbGVhbiB8IGFueVtdO1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcclxuICBncmlkU3RvcmFnZUtleTogc3RyaW5nO1xyXG4gIGdyaWREZWZhdWx0U3RhdGVFeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTmV3OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGVkaXRlZFJvd0luZGV4OiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlOiBaR3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB6Y29yZVNlcnZpY2U6IFpDb3JlU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgbWFpblNlcnZpY2U6IE1haW5TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLm9hdXRoVXJsID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKS5lMU9hdXRoVXJsICsgXCIvXCI7XHJcbiAgICB0aGlzLmFsbFJlc3VsdHMgPSB0aGlzLmFsbFJlc3VsdHMuYmluZCh0aGlzKTtcclxuICAgIHRoaXMucmVmcmVzaERhdGEgPSB0aGlzLnJlZnJlc2hEYXRhLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLmNsZWFyRGF0YSA9IHRoaXMuY2xlYXJEYXRhLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnNhdmVHcmlkU2V0dGluZ3MgPSB0aGlzLnNhdmVHcmlkU2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgIHRoaXMucmVzdG9yZUdyaWRTZXR0aW5ncyA9IHRoaXMucmVzdG9yZUdyaWRTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRDb21wb25lbnRQcm9wZXJ0aWVzKHRoaXMpO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5yZWdpc3RlckNvbXBvbmVudCh0aGlzKTtcclxuXHJcbiAgICAvLyBHcmlkIHNhdmVkIHNldHRpbmcga2V5KFVzZWQgaW4gQ29va2llU3RvcmUgJiBMb2NhbFN0b3JhZ2UpXHJcbiAgICB0aGlzLmdyaWRTdG9yYWdlS2V5ID0gJ2lvbmljLWZpZWxkOjonICsgdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLnVzZXJOYW1lICsgJzo6JyArIHRoaXMuZGF0YS5OYW1lICsgJzo6JyArIHRoaXMucm91dGVyLnVybDtcclxuXHJcbiAgICBvZih0cnVlKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICAvL2NvbmNhdE1hcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gIC8vIHRyeSBnZXQgZ3JpZHNldHRpbmcgZnJvbSBjb29raWVzdG9yZVxyXG4gICAgICAgIC8vICByZXR1cm4gdGhpcy5tYWluU2VydmljZS5jb29raWVTdG9yZUdldCh0aGlzLmdyaWRTdG9yYWdlS2V5LCB0aGlzLmF1dGhTZXJ2aWNlLmUxVG9rZW4uYWNjZXNzX3Rva2VuKTtcclxuICAgICAgICAvL30pLFxyXG4gICAgICAgIC8vc3dpdGNoTWFwKHNhdmVkR3JpZENhY2hlID0+IHtcclxuICAgICAgICAvLyAgaWYgKHNhdmVkR3JpZENhY2hlKSB7XHJcbiAgICAgICAgLy8gICAgLy8gS2VlcCB0aGUgZ3JpZFNldHRpbmcgZnJvbSBjb29raWVzdG9yZSB0byBsb2NhbFN0b3JhZ2VcclxuICAgICAgICAvLyAgICB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5zZXQodGhpcy5ncmlkU3RvcmFnZUtleSwgc2F2ZWRHcmlkQ2FjaGUpO1xyXG4gICAgICAgIC8vICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAvLyAgfVxyXG4gICAgICAgIC8vICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgIC8vfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIEdyaWQgZGVmYXVsdCBzZXR0aW5nXHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMud2lkdGhSZWR1Y2UgPSB0aGlzLmRhdGEuV2lkdGhSZWR1Y2UgfHwgNjA7XHJcbiAgICAgICAgICB0aGlzLmhlaWdodFJlZHVjZSA9IHRoaXMuZGF0YS5IZWlnaHRSZWR1Y2UgfHwgNTYwO1xyXG4gICAgICAgICAgdGhpcy5fc3RhdGUudGFrZSA9IHRoaXMuZGF0YS5QYWdlU2l6ZSB8fCAyMDtcclxuICAgICAgICAgIHRoaXMucGFnZVNpemVzID0gWzIwLCA1MCwgMTAwLCAyMDAsIDUwMF07XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzTmV4dCA9IHRoaXMuZGF0YVsnRW5hYmxlUHJldmlvdXNOZXh0QnV0dG9uJ10gfHwgZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbE1vZGUgPSB0aGlzLmRhdGFbJ1Njcm9sbE1vZGUnXSA/IHRoaXMuZGF0YVsnU2Nyb2xsTW9kZSddIDogJ3ZpcnR1YWwnO1xyXG5cclxuICAgICAgICAgIC8vIFtNb2JpbGVdIERpc2FibGUgUGFnZVNpemVcclxuICAgICAgICAgIGlmICh0aGlzLmRhdGEuUGFnZVNpemVzID09PSBmYWxzZSB8fCBaQ29tcG9uZW50SGVscGVyLmlzTW9iaWxlU2NyZWVuKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZXMgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBHcmlkIFNlbGVjdGlvbiBjb2x1bW5cclxuICAgICAgICAgIGlmICh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGFibGVTZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgICAvLyBjaGVja2JveE9ubHk6IHRoaXMuY2hlY2tib3hPbmx5LFxyXG4gICAgICAgICAgICAgIG1vZGU6IHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zID09PSAnc2luZ2xlJyA/ICdzaW5nbGUnIDogJ211bHRpcGxlJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGJpbmQgdGhpcyB0byBncm91cCB1c2luZyBHcmlkIHZhbHVlXHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLlZhbHVlLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyaWRWYWx1ZSA9IHRoaXMuZGF0YS5WYWx1ZS5zbGljZSg2KTtcclxuICAgICAgICAgICAgdGhpcy5ncm91cFtncmlkVmFsdWVdID0gdGhpcztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBjbGVhciBhbnkgU3Vic2NyaXB0aW9uXHJcbiAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBpZiBubyBSZXNvdXJjZVVSTCwgc3RpbGwgZ2VuZXJhdGUgQ29sdW1uIGZpcnN0LCB0aGVuIGluc2VydCBncmlkIGRhdGEgdXNpbmcgRGF0YVNvdXJjZVxyXG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuUmVzb3VyY2VVUkwpIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLkRhdGFTb3VyY2UgJiYgdGhpcy5kYXRhLlNraXBEaXJlY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuRGF0YVNvdXJjZSxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YShkcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc2V0IGdyaWQgc2V0dGluZyBmcm9tIGRpcmVjdGl2ZSB0byBjb21wb25lbnRcclxuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5ncmlkU3ViamVjdC5zdWJzY3JpYmUoZ3JpZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuemdyaWQgPSBncmlkO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuemdyaWQuc3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuemdyaWQuZ3JpZENvbHVtbnM7XHJcbiAgICAgICAgICAgIC8vdGhpcy5jb2x1bW5zWydyZXNpemFibGUnXSA9ICdmYWxzZSc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuemdyaWQuZ3JpZC5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuemdyaWQuZ3JpZC5kYXRhLnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuemdyaWQuZ3JpZC5kYXRhLnRvdGFsID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnpncmlkLmdyaWQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9scygpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnpncmlkLmdyaWRbJ3BhZ2VTaXplJ10pIHtcclxuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gMCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgIHRoaXMuemdyaWQuZ3JpZFsncGFnZVNpemUnXSA9IDIwO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIEdyaWQgc2V0dGluZyBleGlzdCBpbiBsb2NhbHN0b3JhZ2VcclxuICAgICAgICAgIHRoaXMuc3RhdGVFeGlzdCgpO1xyXG5cclxuICAgICAgICAgIC8vIFNldCBGaWx0ZXIgU2Vzc2lvbktleVxyXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YVsnU2F2ZUZpbHRlciddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R3JpZFNlc3Npb25LZXkodGhpcy5ncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZ3JpZENhbGxiYWNrKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIFN0YXJ0IEdyaWQgU3RhdGUgKHBhZ2luYXRpb24sIHNvcnRhYmxlLCBmaWx0ZXIsIG9yZGVyaW5nKSAqL1xyXG4gIGdldCBzdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBzdGF0ZShzdGF0ZSkge1xyXG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGVFeGlzdCgpIHtcclxuICAgIGNvbnN0IHVzZXJHcmlkU3RhdGUgPSB0aGlzLnpHcmlkU3RhdGVQZXJzaXN0aW5nU2VydmljZS5nZXQodGhpcy5ncmlkU3RvcmFnZUtleSk7XHJcblxyXG4gICAgaWYgKHVzZXJHcmlkU3RhdGUpIHtcclxuICAgICAgdGhpcy5ncmlkRGVmYXVsdFN0YXRlRXhpc3QgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZ3JpZERlZmF1bHRTdGF0ZUV4aXN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGF0YVN0YXRlQ2hhbmdlKHN0YXRlOiBEYXRhU3RhdGVDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRhdGEuU2tpcERpcmVjdGl2ZSkge1xyXG4gICAgICB0aGlzLnpncmlkLmRhdGFTdGF0ZUNoYW5nZShzdGF0ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2Nlc3ModGhpcy5nRGF0YSwgc3RhdGUpO1xyXG4gICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9scygpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgICB0aGlzLnpncmlkLnN0YXRlID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy56Z3JpZC5kYXRhID0gdGhpcy5ncmlkRGF0YS5kYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyYWJsZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRhYmxlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9ja2VkKGNvbFNldHRpbmc6IGFueSkge1xyXG4gICAgaWYgKGNvbFNldHRpbmdbJ3Bpbm5lZExlZnQnXSA9PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyogRW5kIEdyaWQgU3RhdGUgKHBhZ2luYXRpb24sIHNvcnRhYmxlLCBmaWx0ZXIsIG9yZGVyaW5nKSAqL1xyXG5cclxuICAvKiBTdGFydCBHcmlkIFN0eWxpbmcsIERpc3BsYXkgKi9cclxuICBwdWJsaWMgZ2V0R3JpZFN0eWxlKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgXCJoZWlnaHQucHhcIjogdGhpcy5nZXRHcmlkSGVpZ2h0KCksIC8vIHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuaGVpZ2h0UmVkdWNlLCAvLyA0NTAsXHJcbiAgICAgIFwid2lkdGgucHhcIjogd2luZG93LmlubmVyV2lkdGggLSB0aGlzLndpZHRoUmVkdWNlXHJcbiAgICB9OyAvLyBcIndpZHRoLnB4XCI6IHRoaXMuaW5uZXJXaWR0aCAtIDM1XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyaWRIZWlnaHQoKSB7XHJcbiAgICBjb25zdCBncmlkSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5oZWlnaHRSZWR1Y2U7XHJcbiAgICByZXR1cm4gKGdyaWRIZWlnaHQgPCAyNTApID8gMjUwIDogZ3JpZEhlaWdodDtcclxuICAgIC8vIGNvbnN0IHYgPSBaQ29tcG9uZW50SGVscGVyLmlzTW9iaWxlU2NyZWVuKCk7XHJcbiAgICAvLyBpZih2KXtcclxuICAgIC8vICAgY29uc3QgaCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuaGVpZ2h0UmVkdWNlO1xyXG4gICAgLy8gICByZXR1cm4gKGggPCAyNTApID8gMjUwIDogaDtcclxuICAgIC8vIH1lbHNle1xyXG4gICAgLy8gICByZXR1cm4gXCJhdXRvXCI7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG4gIC8qIEVuZCBHcmlkIFN0eWxpbmcsIERpc3BsYXkgKi9cclxuXHJcblxyXG4gIC8qIFN0YXJ0IEdyaWQgQ29sdW1ucyAqL1xyXG4gIHB1YmxpYyBpc1NlbGVjdE9wdGlvbigpIHtcclxuICAgIGxldCBzZWxlY3RPcHRpb25FeGlzdCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0YWJsZVNldHRpbmdzID0ge1xyXG4gICAgICAgIGNoZWNrYm94T25seTogZmFsc2UsXHJcbiAgICAgICAgbW9kZTogKHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zID09IFwibXVsdGlwbGVcIikgPyBcIm11bHRpcGxlXCIgOiBcInNpbmdsZVwiXHJcbiAgICAgIH07XHJcbiAgICAgIHNlbGVjdE9wdGlvbkV4aXN0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3RPcHRpb25FeGlzdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDb2x1bW5zKGNvbHVtbk5hbWU6IHN0cmluZywgY29sdW1uczogQXJyYXk8WkdyaWRDdXN0b21Db2x1bW4+KSB7XHJcbiAgICB0aGlzLmdyb3VwW2NvbHVtbk5hbWVdID0gdGhpcy53cmFwQ29sdW1uTmFtZXNJbkZpZWxkRWxlbWVudChjb2x1bW5zKTtcclxuICAgIHRoaXMuZ2VuZXJhdGVHcmlkQ29sdW1ucygpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3cmFwQ29sdW1uTmFtZXNJbkZpZWxkRWxlbWVudChjb2x1bW5MaXN0OiBBcnJheTxaR3JpZEN1c3RvbUNvbHVtbj4pIHtcclxuICAgIHJldHVybiBvZihjb2x1bW5MaXN0Lm1hcChjID0+IHtcclxuICAgICAgY29uc3QgaXNIaWRkZW46IGJvb2xlYW4gPSBjLkhpZGRlbjtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBOYW1lOiBjLk5hbWUsXHJcbiAgICAgICAgVmFsdWU6IGMuQ29kZSxcclxuICAgICAgICBUeXBlOiBjLlR5cGUsXHJcbiAgICAgICAgZ3JpZENvbFZpc2libGU6ICFpc0hpZGRlbixcclxuICAgICAgICB3aWR0aDogMTAwICsgYy5OYW1lLmxlbmd0aCAqIDQsXHJcbiAgICAgICAgZW5hYmxlRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVTb3J0aW5nOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZVBpbm5pbmc6IHRydWUsXHJcbiAgICAgICAgRGl2Q2xhc3M6IFwiY29sLXhzLTEyIGNvbC1zbS02XCIsXHJcbiAgICAgICAgSXNFZGl0YWJsZUluR3JpZDogYy5FZGl0YWJsZVxyXG4gICAgICB9O1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUdyaWRDb2x1bW5zKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBncmlkU2V0dGluZyA9IHRoaXMuZ2V0R3JpZFNldHRpbmdzKCk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uRmllbGRzJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmRhdGEuQ29sdW1uRmllbGRzLFxyXG4gICAgICB0aGlzLmdyb3VwXHJcbiAgICApO1xyXG4gICAgaWYgKCF0aGlzLmRhdGEuQ29sdW1uRmllbGRzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZC9FbXB0eSBncmlkKCcgKyB0aGlzLmRhdGEuTmFtZSArICcpIGNvbHVtbkZpZWxkJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29sdW1uRmllbGRzJC5waXBlKFxyXG4gICAgICB0YXAoZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQvRW1wdHkgZ3JpZCgnICsgdGhpcy5kYXRhLk5hbWUgKyAnKSBkYXRhIHRvIGdlbmVyYXRlIGNvbHVtbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmRhdGFbJ0ZpZWxkRWxlbWVudE5hbWUnXTtcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKGRhdGEsXHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMsXHJcbiAgICAgICAgICB0aGlzLmdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5hdXRoU2VydmljZSxcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGdyaWRTZXR0aW5nLFxyXG4gICAgICAgICAgbnVsbCxcclxuICAgICAgICAgIHRoaXMuZGF0YSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICAvL3N3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgIC8vICAvL0dldCBTZXNzaW9uXHJcbiAgICAgIC8vICByZXR1cm4gdGhpcy5nZXRHcmlkU2Vzc2lvbkZpbHRlcih0aGlzLmdycCwgdGhpcyk7XHJcbiAgICAgIC8vfSksXHJcbiAgICAgIC8vc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgLy8gIC8vQmVmb3JlIGdldCBncmlkIGRhdGFcclxuICAgICAgLy8gIHJldHVybiB0aGlzLmJlZm9yZUdyaWRHZXREYXRhKHRoaXMuZ3JwLCB0aGlzKTtcclxuICAgICAgLy99KSxcclxuICAgICAgLy9zd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAvLyAgLy9TZXQgZ3JpZCBkYXRhXHJcbiAgICAgIC8vICByZXR1cm4gdGhpcy5zZXRHcmlkU2Vzc2lvbkZpbHRlcih0aGlzLmdycCwgdGhpcyk7XHJcbiAgICAgIC8vfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiBFbmQgR3JpZCBDb2x1bW5zICovXHJcblxyXG4gIHByaXZhdGUgZWRpdE1vZGVsKGRhdGFJdGVtOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuRWRpdENsaWNrVVJMKSB7XHJcbiAgICAgIC8vIEVkaXQgaW5jZWxsIGZpZWxkXHJcbiAgICAgIGNvbnN0IGNvbEZpZWxkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuQ29sdW1uRmllbGRzLCB0aGlzLmdyb3VwKTtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiemdyaWQtY2VsbENsaWNrXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuRWRpdENsaWNrVVJMLFxyXG4gICAgICAgIGRhdGE6IGRhdGFJdGVtLFxyXG4gICAgICAgIGNvbHVtbkZpZWxkcyQ6IGNvbEZpZWxkc1xyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gV2hlbiBjbGlja2VkIHJvdXRlIHRvIHBhZ2VcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZ3JvdXAuZWRpdE1vZGVsVVJMLCBkYXRhSXRlbS5JZCwgJ2VkaXQnXSwge1xyXG4gICAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGVcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ3JpZENhbGxiYWNrKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICh0aGlzLmRhdGFbJ0FmdGVybG9hZENhbGxiYWNrJ10pIHtcclxuICAgICAgY29uc3QgbWUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzKTtcclxuXHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcInpncmlkLUFmdGVybG9hZENhbGxiYWNrXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGFbJ0FmdGVybG9hZENhbGxiYWNrJ10sXHJcbiAgICAgICAgZGF0YTogbWVcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERhdGEgPSAoZ0RhdGE6IGFueSkgPT4ge1xyXG4gICAgdGhpcy5ncmlkRGF0YSA9IHtcclxuICAgICAgZGF0YTogZ0RhdGEsXHJcbiAgICAgIHRvdGFsOiAoZ0RhdGEgPyBnRGF0YS5sZW5ndGggOiAwKVxyXG4gICAgfTtcclxuICAgIHRoaXMuZ0RhdGEgPSBnRGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5nRGF0YSkge1xyXG4gICAgICBpZiAodGhpcy56Z3JpZCkge1xyXG4gICAgICAgIHRoaXMuemdyaWQuZ3JpZFsncGFnZVNpemUnXSA9IGdEYXRhLmxlbmd0aDsgLy8gc2V0IGdyaWQgc2l6ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoISF0aGlzLmRhdGEuU2hvd1JlY29yZE51bWJlcikge1xyXG4gICAgICAgIHRoaXMuZ3JpZERhdGEuZGF0YS5mb3JFYWNoKChkLCBpKSA9PiB7XHJcbiAgICAgICAgICBkLkdyaWRObyA9IGkgKyAxO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKCk7XHJcbiAgICAgIHRoaXMuc2V0RGF0ZUNvbEZvckZpbHRlcmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREYXRlQ29sRm9yRmlsdGVyaW5nKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5Ta2lwRGlyZWN0aXZlICYmIHRoaXMuZ0RhdGEgJiYgdGhpcy5nRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVDb2wgPSBPYmplY3Qua2V5cyh0aGlzLmdEYXRhWzBdKS5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKFwiRGF0ZVwiKSk7XHJcbiAgICAgIGlmIChkYXRlQ29sICYmIGRhdGVDb2wubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuZ0RhdGEuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgIGRhdGVDb2wuZm9yRWFjaChjb2xOYW1lID0+IHtcclxuICAgICAgICAgICAgZGF0YVtgJHtjb2xOYW1lfSR7Q29tcG9uZW50Q29uc3RhbnQuR3JpZENvbERhdGVGaWx0ZXJTdWZmaXh9YF0gPSBuZXcgRGF0ZShkYXRhW2NvbE5hbWVdKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpIHtcclxuICAgIGlmICh0aGlzLnpncmlkKSB7XHJcbiAgICAgIHRoaXMuemdyaWQuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLlNraXBEaXJlY3RpdmUpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2Nlc3ModGhpcy5nRGF0YSwgdGhpcy5zdGF0ZSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0R3JpZERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nRGF0YTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybUNvbnRyb2wocm93SW5kZXg6IG51bWJlciwgcHJvcGVydHk6IHN0cmluZykge1xyXG4gICAgY29uc3QgZm9ybUFycmF5OiBGb3JtQXJyYXkgPSB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcclxuICAgIGNvbnN0IGZvcm1JdGVtID0gZm9ybUFycmF5LmF0KHJvd0luZGV4KTtcclxuXHJcbiAgICBpZiAoZm9ybUl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGZvcm1JdGVtLmdldChwcm9wZXJ0eSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZvcm1Db250cm9scygpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgLy8gb25seSBjcmVhdGUgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBlZGl0YWJsZSBjb2x1bW5cclxuICAgICAgaWYgKHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5pc0VkaXRhYmxlSW5HcmlkKSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMgPSBuZXcgRm9ybUdyb3VwKHsgaXRlbXM6IG5ldyBGb3JtQXJyYXkoW10pIH0pO1xyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ncmlkRGF0YS5kYXRhKSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZERhdGEuZGF0YS5mb3JFYWNoKGQgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB7fTtcclxuICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgICBpdGVtc1tjLmZpZWxkXSA9IG5ldyBGb3JtQ29udHJvbChkW2MuZmllbGRdKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChpdGVtcyk7XHJcbiAgICAgICAgICAoPEZvcm1BcnJheT50aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZ2V0KFwiaXRlbXNcIikpLnB1c2goZm9ybUdyb3VwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZUZvcm1Hcm91cChkYXRhSXRlbTogYW55LCBmaWVsZE5hbWU6IGFueSk6IEZvcm1Hcm91cCB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIFtmaWVsZE5hbWVdOiBkYXRhSXRlbVtmaWVsZE5hbWVdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHcm91cFZhbHVlKHZhbHVlOiBzdHJpbmcsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLlZhbHVlLCB0aGlzLmdyb3VwKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcHVibGljIG9uQnRuQ2xpY2soZXZlbnQ6IGFueSwgY29sU2V0dGluZzogYW55LCByb3dEYXRhOiBhbnksIGNlbGxEYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMub25OYXZpZ2F0ZVRvKGV2ZW50LCBjb2xTZXR0aW5nLCByb3dEYXRhLCBjZWxsRGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2VsbENsaWNrSGFuZGxlcihldmVudDogQ2VsbENsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGRpc2FibGVBbGxDb2x1bW5DZWxsQ2xpY2tIYW5kbGVyID0gdGhpcy5kYXRhLkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyID8gdGhpcy5kYXRhLkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyIDogZmFsc2U7XHJcbiAgICBjb25zdCBpc0NvbW1hbmRDb2x1bW4gPSBldmVudC5jb2x1bW4uY29uc3RydWN0b3IubmFtZSA9PSAnQ29tbWFuZENvbHVtbkNvbXBvbmVudCcgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMudG9vbHRpcERpcikge1xyXG4gICAgICB0aGlzLnRvb2x0aXBEaXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZGlzYWJsZUFsbENvbHVtbkNlbGxDbGlja0hhbmRsZXIgJiYgIWlzQ29tbWFuZENvbHVtbikge1xyXG4gICAgICBjb25zdCBpbkNlbGxFZGl0YWJsZSA9IHRoaXMuZGF0YS5JbkNlbGxFZGl0YWJsZSA/IHRoaXMuZGF0YS5JbkNlbGxFZGl0YWJsZSA6IGZhbHNlO1xyXG4gICAgICBpZiAoaW5DZWxsRWRpdGFibGUpIHtcclxuICAgICAgICB0aGlzLmVkaXRhYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIocyA9PiBzLmlzRWRpdGFibGVJbkRhdGFJdGVtID09PSB0cnVlKTtcclxuICAgICAgICBpZiAoISF0aGlzLmVkaXRhYmxlQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbnMubWFwKHMgPT4gZXZlbnQuc2VuZGVyLmVkaXRDZWxsKGV2ZW50LnJvd0luZGV4LCBldmVudC5jb2x1bW5JbmRleCwgdGhpcy5jcmVhdGVGb3JtR3JvdXAoZXZlbnQuZGF0YUl0ZW0sIHMuZmllbGQpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY2VsbENsaWNrIGV2ZW50OiBcIiwgZXZlbnQpO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuT25JdGVtQ2xpY2spIHtcclxuICAgICAgICAgIGNvbnN0IGZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLk9uSXRlbUNsaWNrKTtcclxuICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgICAgICAgIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWRpdE1vZGVsKGV2ZW50LmRhdGFJdGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRDZWxsQ2xvc2VIYW5kbGVyKGFyZ3M6IGFueSkge1xyXG4gICAgY29uc3QgeyBmb3JtR3JvdXAsIGRhdGFJdGVtIH0gPSBhcmdzO1xyXG4gICAgaWYgKCFmb3JtR3JvdXAudmFsaWQpIHtcclxuICAgICAgYXJncy5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfSBlbHNlIGlmIChmb3JtR3JvdXAuZGlydHkpIHtcclxuICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKHMgPT4gcy5pc0VkaXRhYmxlSW5EYXRhSXRlbSA9PT0gdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5zLm1hcChzID0+XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkYXRhSXRlbSwgeyBbcy5maWVsZF06IGZvcm1Hcm91cC52YWx1ZVtzLmZpZWxkXSB9KSk7XHJcbiAgICAgIHRoaXMubXlTZWxlY3Rpb24ubWFwKHMgPT4gKHMuSWQgPT09IGRhdGFJdGVtLklkKSA/IE9iamVjdC5hc3NpZ24ocywgZGF0YUl0ZW0pIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIG9uTmF2aWdhdGVUbyhldmVudDogYW55LCBjbGlja0FjdGlvbjogYW55LCByb3dEYXRhOiBhbnksIGNlbGxEYXRhOiBzdHJpbmcpIHtcclxuICAgIC8vIGRlYnVnZ2VyO1xyXG4gICAgLy8gY29uc3QgbiA9IGNvbFNldHRpbmcubmF2aWdhdGVUby5yZXBsYWNlKCcvOmlkJywgY2VsbERhdGEpO1xyXG4gICAgY29uc3QgbiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBjbGlja0FjdGlvbi5DbGljayk7XHJcbiAgICBpZiAobikge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6ICd6Z3JpZC1vbk5hdmlnYXRlVG8nLFxyXG4gICAgICAgIHRhcmdldDogY2xpY2tBY3Rpb24uQ2xpY2ssXHJcbiAgICAgICAgcm93RGF0YTogcm93RGF0YSxcclxuICAgICAgICBkYXRhOiBjZWxsRGF0YVxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1Rvb2x0aXAoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGxldCBpc0NvbW1hbmRDb2x1bW4gPSBmYWxzZTtcclxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgIGlmIChkYXRhID09ICdrLWNvbW1hbmQtY2VsbCcpIHtcclxuICAgICAgICBpc0NvbW1hbmRDb2x1bW4gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoKChlbGVtZW50Lm5vZGVOYW1lID09PSAnVEQnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdUSCcpICYmIGVsZW1lbnQub2Zmc2V0V2lkdGggPCBlbGVtZW50LnNjcm9sbFdpZHRoKSAmJiAhaXNDb21tYW5kQ29sdW1uKSB7XHJcbiAgICAgIHRoaXMudG9vbHRpcERpci50b2dnbGUoZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy50b29sdGlwRGlyLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3dTZWxlY3Rpb25LZXkoY29udGV4dDogUm93QXJncyk6IGFueSB7XHJcbiAgICByZXR1cm4gY29udGV4dC5kYXRhSXRlbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFZhbHVlcygpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubXlTZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaEdyaWQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgY29uc3QgX2dyaWRPcHRpb25TZWdtZW50ID0gZXZlbnQudGFyZ2V0LnRyaW0oKS5zcGxpdCgnLicpO1xyXG4gICAgY29uc3QgX2dyaWRPcHRpb24gPSBfZ3JpZE9wdGlvblNlZ21lbnRbMV07XHJcbiAgICBpZiAoX2dyaWRPcHRpb24pIHtcclxuICAgICAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbX2dyaWRPcHRpb25dIGFzIFpHcmlkO1xyXG4gICAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGZpbmQgZ3JpZCB2YWx1ZTogJyArIF9ncmlkT3B0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ0ludmFsaWQgcmVmcmVzaEdyaWQgZXZlbnQ6ICcsIGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoRGF0YSgpIHtcclxuICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRGF0YSgpIHtcclxuICAgIHRoaXMuemdyaWQuY2xlYXJEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2VsbFN0eWxlQ29uZGl0aW9uKGNvbCwgY29sVmFsdWU6IGFueSkge1xyXG4gICAgaWYgKGNvbFsnQ2VsbFN0eWxlQ29uZGl0aW9uJ10pIHtcclxuICAgICAgY29uc3QgY29uZGl0aW9uSGlnaGxpZ2h0Y29sOiBbXSA9IGNvbFsnQ2VsbFN0eWxlQ29uZGl0aW9uJ107XHJcbiAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGNvbmRpdGlvbkhpZ2hsaWdodGNvbC5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgIGlmICghY29uZGl0aW9uUmVzdWx0KSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVsnVmFsdWUnXSA9PSBjb2xWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gY29uZGl0aW9uUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENlbGxTdHlsZUNvbmRpdGlvbihjb2wsIGNvbFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChjb2xbJ0NlbGxTdHlsZUNvbmRpdGlvbiddKSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvbkhpZ2hsaWdodGNvbDogW10gPSBjb2xbJ0NlbGxTdHlsZUNvbmRpdGlvbiddO1xyXG4gICAgICBsZXQgY29uZGl0aW9uUmVzdWx0ID0gJyc7XHJcblxyXG4gICAgICBjb25kaXRpb25IaWdobGlnaHRjb2wuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICBpZiAoZGF0YVsnVmFsdWUnXSA9PSBjb2xWYWx1ZSkge1xyXG4gICAgICAgICAgaWYgKGRhdGFbJ0JhY2tncm91bmRDb2xvciddKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdCA9ICdiYWNrZ3JvdW5kLWNvbG9yOicgKyBkYXRhWydCYWNrZ3JvdW5kQ29sb3InXSArICc7JztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZGF0YVsnQ29sb3InXSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgKz0gJ2NvbG9yOicgKyBkYXRhWydDb2xvciddICsgJzsnO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhWydTdHlsZUV4cHJlc3Npb24nXSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgKz0gZGF0YVsnU3R5bGVFeHByZXNzaW9uJ107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBjb25kaXRpb25SZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWxsUmVzdWx0cygpOiBPYnNlcnZhYmxlPEV4Y2VsRXhwb3J0RGF0YT4ge1xyXG4gICAgY29uc3QgX3pncmlkQ29udHJvbCA9IHRoaXMuemdyaWQgYXMgWkdyaWQ7XHJcbiAgICBjb25zdCBfemdyaWRDb21wb25lbnQgPSB0aGlzLnpncmlkLmdyaWQgYXMgR3JpZENvbXBvbmVudDtcclxuICAgIGNvbnN0IF9kYXRhID0gX3pncmlkQ29tcG9uZW50LmRhdGEgYXMgR3JpZERhdGFSZXN1bHQ7XHJcblxyXG4gICAgY29uc3QgcGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBfemdyaWRDb250cm9sLnBhZ2luYXRpb25BcGlQb3N0VXJsO1xyXG5cclxuICAgIC8vIE5lZWQgdG8gY2xvbmUsIGlmIG5vdCB3aWxsIGFmZmVjdCB0aGUgZ3JpZCBwYXJhbXMuXHJcbiAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcmFtcyk7XHJcbiAgICBwYXJhbXMucGFnZU5vID0gMDtcclxuICAgIHBhcmFtcy5wYWdlU2l6ZSA9IF9kYXRhLnRvdGFsO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKHBhZ2luYXRpb25BcGlQb3N0VXJsLCBwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBFeGNlbEV4cG9ydERhdGEgPSB7XHJcbiAgICAgICAgICBkYXRhOiBwcm9jZXNzKGRhdGEuZGF0YVNldCwge30pLmRhdGFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDbGFzcyhkYXRhSXRlbTogYW55LCBjb2w6IGFueSkge1xyXG4gICAgbGV0IG5nQ2xhc3MgPSBcImdyaWRDZWxsIFwiO1xyXG4gICAgaWYgKGNvbC5maWVsZFR5cGUgPT09ICdudW1iZXInIHx8IGNvbC5maWVsZFR5cGUgPT09ICdjdXJyZW5jeScgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3pudW1lcmljJykge1xyXG4gICAgICBuZ0NsYXNzICs9IFwicmlnaHRBbGlnbmVkIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhSXRlbVtjb2wuZmllbGQgKyAnX0NsYXNzJ10pIHtcclxuICAgICAgbmdDbGFzcyArPSBkYXRhSXRlbVtjb2wuZmllbGQgKyAnX0NsYXNzJ10gKyBcIiBcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sLkNsYXNzKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gY29sLkNsYXNzICsgXCIgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5nQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybWF0KGNvbDogYW55LCBkZWZhdWx0Rm9ybWF0PzogYW55KSB7XHJcbiAgICBsZXQgZm9ybWF0ID0gXCJcIjtcclxuICAgIGlmIChjb2wuRm9ybWF0T3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZvcm1hdCA9IGRlZmF1bHRGb3JtYXQgPyBkZWZhdWx0Rm9ybWF0IDogXCJcIjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGZvcm1hdEFyciA9IGNvbC5Gb3JtYXRPcHRpb25zLnNwbGl0KFwiLlwiKVxyXG4gICAgICBsZXQgZHAgPSAwO1xyXG5cclxuICAgICAgaWYgKGZvcm1hdEFyci5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgZHAgPSBmb3JtYXRBcnJbMV0ubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZHAgIT09IDApIHtcclxuICAgICAgICBmb3JtYXQgPSBcIjEuXCIgKyBkcCArIFwiLVwiICsgZHA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtYXQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIHNldEhlYWRlclRleHQoY29sdW1uTmFtZTogc3RyaW5nLCBuZXdIZWFkZXJUaXRsZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBncmlkQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcclxuICAgIGdyaWRDb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChjb2wuTmFtZSA9PT0gY29sdW1uTmFtZSkge1xyXG4gICAgICAgIGNvbC50aXRsZSA9IG5ld0hlYWRlclRpdGxlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRHcmlkSXNMb2FkaW5nKHRyaWdnZXJlZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cmlnZ2VyZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0R3JpZFNlc3Npb25LZXkoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKGdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGdyb3VwW1wiR3JpZFN0b3JhZ2VLZXlcIl0gPSAnemdyaWRfJyArIGdyb3VwLnJlc291cmNlVVJMICsgJ18nICsgdGhpcy5kYXRhLlZhbHVlICsgJzo6JyArIHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbi51c2VyTmFtZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBHcmlkSXRlbSk6IGFueSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKGl0ZW0uZGF0YVsnSWQnXSB8fCBpbmRleCk7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICAvKiBHcmlkIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKi9cclxuICBwdWJsaWMgc2F2ZUdyaWRTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGNvbnN0IF96Z3JpZENvbXBvbmVudCA9IHRoaXMuemdyaWQuZ3JpZCBhcyBHcmlkQ29tcG9uZW50O1xyXG4gICAgY29uc3QgX2NvbHVtbnMgPSBfemdyaWRDb21wb25lbnQuY29sdW1ucztcclxuXHJcbiAgICBvZih0aGlzLmNvbHVtbnMpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb25maWdWYWx1ZTogWkdyaWRDb2x1bW5TZXR0aW5nc1tdID0gX2NvbHVtbnMudG9BcnJheSgpLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgY29uc3QgX3pHcmlkQ29sdW1uU2V0dGluZ3M6IFpHcmlkQ29sdW1uU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhpdGVtKVxyXG4gICAgICAgICAgICAgIC5maWx0ZXIocHJvcE5hbWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFwcm9wTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCd0ZW1wbGF0ZScpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIGN1cnIpID0+IChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgLi4uYWNjLFxyXG4gICAgICAgICAgICAgICAgICAuLi57IFtjdXJyXTogaXRlbVtjdXJyXSB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLCB7fSBhcyBaR3JpZENvbHVtblNldHRpbmdzKTtcclxuICAgICAgICAgICAgcmV0dXJuIF96R3JpZENvbHVtblNldHRpbmdzO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gcmVtb3ZlIGV4dHJhIGVsZW1lbnQgZm9ybSBhcnJheVxyXG4gICAgICAgICAgY29uZmlnVmFsdWUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGl0ZW1bJ2hlYWRlclN0eWxlJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtWydfX25nQ29udGV4dF9fJ107XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBjb25zdCBncmlkU2V0dGluZzogWkdyaWRTZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgLy8gc3RhdGU6IHRoaXMuc3RhdGUsXHJcbiAgICAgICAgICAgIGNvbHVtbnNDb25maWc6IGNvbmZpZ1ZhbHVlXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIC8vIEZpbmQgYW55IHNldHRpbmcgZnJvbSBsb2NhbHN0b3JhZ2UgYW5kIHVwZGF0ZSwgaWYgbm90IGp1c3QgYWRkIGluLlxyXG4gICAgICAgICAgbGV0IF9hcnJHcmlkQ2FjaGluZzogR3JpZENhY2hpbmdbXSA9IHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLmdldCh0aGlzLmdyaWRTdG9yYWdlS2V5KTtcclxuICAgICAgICAgIGxldCBfZ3JpZENvbmZpZzogR3JpZENhY2hpbmcgPSBudWxsO1xyXG4gICAgICAgICAgaWYgKF9hcnJHcmlkQ2FjaGluZyAmJiBfYXJyR3JpZENhY2hpbmdbMF0pIHtcclxuICAgICAgICAgICAgX2dyaWRDb25maWcgPSBfYXJyR3JpZENhY2hpbmcuZmluZCh4ID0+IHhbJ2RhdGFGb3JtRmllbGRzJ10gPT09IHRoaXMuZ3JpZFN0b3JhZ2VLZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKF9ncmlkQ29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgX2dyaWRDb25maWcuZ3JpZFNldHRpbmdzID0gZ3JpZFNldHRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBfYXJyR3JpZENhY2hpbmcgPSBbXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIV9ncmlkQ29uZmlnKSB7XHJcbiAgICAgICAgICAgIF9ncmlkQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgIGRhdGFGb3JtRmllbGRzOiB0aGlzLmdyaWRTdG9yYWdlS2V5LFxyXG4gICAgICAgICAgICAgIGdyaWRTZXR0aW5nczogZ3JpZFNldHRpbmdcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIF9hcnJHcmlkQ2FjaGluZy5wdXNoKF9ncmlkQ29uZmlnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBfYXJyR3JpZENhY2hpbmc7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY29uY2F0TWFwKGdyaWRDYWNoZSA9PiB7XHJcbiAgICAgICAgICAvLyBTYXZlIGdyaWQgY2FjaGluZyB0byBsb2NhbHN0b3JhZ2VcclxuICAgICAgICAgIHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLnNldCh0aGlzLmdyaWRTdG9yYWdlS2V5LCBncmlkQ2FjaGUpO1xyXG4gICAgICAgICAgLy8gU2F2ZSB0byBDb29raWVTdG9yZVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWFpblNlcnZpY2UuY29va2llU3RvcmVQb3N0KHRoaXMuZ3JpZFN0b3JhZ2VLZXksIGdyaWRDYWNoZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKHNhdmVkR3JpZENhY2hlID0+IHtcclxuICAgICAgICAgIC8vIGNoZWNrIGlzIHNhdmVkIHN0YXRlIGV4aXN0IHRvIGVuYWJsZS9oaWRlIHJlc3RvcmUgYnV0dG9uXHJcbiAgICAgICAgICB0aGlzLnN0YXRlRXhpc3QoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gQWxlcnRcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coJ0dyaWQgU2V0dGluZyBTYXZlZCcsIFwidG9wXCIsIHRydWUsIDIwMDAsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXN0b3JlR3JpZFNldHRpbmdzKCkge1xyXG4gICAgb2YodHJ1ZSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIC8vIENsZWFyIGxvY2Fsc3RvcmFnZSBncmlkIHNldHRpbmdcclxuICAgICAgICAgIHRoaXMuekdyaWRTdGF0ZVBlcnNpc3RpbmdTZXJ2aWNlLnJlbW92ZSh0aGlzLmdyaWRTdG9yYWdlS2V5KTtcclxuICAgICAgICAgIHJldHVybiBvZih0cnVlKVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAvLyBkZWxldGUgY29va2llc3RvcmUgZ3JpZFNldHRpbmcgYnkgc3RvcmFnZWtleSBhcyBuYW1lXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYWluU2VydmljZS5jb29raWVTdG9yZURlbGV0ZU11bHRpcGxlKHRoaXMuZ3JpZFN0b3JhZ2VLZXkpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNvbmNhdE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAvLyBVc2Ugb3JpZ2luYWwgY29sdW1uIHNldHRpbmdcclxuICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gY2hlY2sgaXMgc2F2ZWQgc3RhdGUgZXhpc3RcclxuICAgICAgICAgIHRoaXMuc3RhdGVFeGlzdCgpO1xyXG4gICAgICAgICAgLy8gQWxlcnRcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coJ0dyaWQgU2V0dGluZyBSZXN0b3JlZCcsIFwidG9wXCIsIHRydWUsIDIwMDAsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0R3JpZFNldHRpbmdzKCk6IFpHcmlkQ29sdW1uU2V0dGluZ3NbXSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkFsbG93U2F2ZVN0YXRlKSB7XHJcbiAgICAgIGNvbnN0IF9zdG9yYWdlS2V5ID0gJ2lvbmljLWZpZWxkOjonICsgdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLnVzZXJOYW1lICsgJzo6JyArIHRoaXMuZGF0YS5OYW1lICsgJzo6JyArIHRoaXMucm91dGVyLnVybDtcclxuXHJcbiAgICAgIC8vIEZpbmQgYW55IHNldHRpbmcgZnJvbSBsb2NhbHN0b3JhZ2UuLlxyXG4gICAgICBsZXQgX2FyckdyaWRDYWNoaW5nOiBHcmlkQ2FjaGluZ1tdID0gdGhpcy56R3JpZFN0YXRlUGVyc2lzdGluZ1NlcnZpY2UuZ2V0KF9zdG9yYWdlS2V5KTtcclxuICAgICAgaWYgKF9hcnJHcmlkQ2FjaGluZykge1xyXG4gICAgICAgIGNvbnN0IF9ncmlkQ2FjaGluZzogR3JpZENhY2hpbmcgPSBKU09OLnBhcnNlKF9hcnJHcmlkQ2FjaGluZ1snVmFsdWUnXSk7XHJcbiAgICAgICAgaWYgKF9ncmlkQ2FjaGluZykge1xyXG4gICAgICAgICAgcmV0dXJuIF9ncmlkQ2FjaGluZy5ncmlkU2V0dGluZ3MuY29sdW1uc0NvbmZpZy5zb3J0KChhLCBiKSA9PiBhLm9yZGVySW5kZXggLSBiLm9yZGVySW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogSW5saW5lIHNldHRpbmcgKi9cclxuICBwdWJsaWMgZ2V0SW5saW5lRmllbGQodmFsdWU6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKHggPT4geC5WYWx1ZSA9PT0gdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldElubGluZUZvcm0ocm93SW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgZm9ybUFycmF5OiBGb3JtQXJyYXkgPSB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZ2V0KCdpdGVtcycpIGFzIEZvcm1BcnJheTtcclxuICAgIHJldHVybiBmb3JtQXJyYXkuYXQocm93SW5kZXgpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybUNvbnRyb2xEYXRhKHZhbHVlOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMudmFsdWUuaXRlbXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyogRXZlbnQgKi9cclxuICBwdWJsaWMgYmVmb3JlR3JpZEdldERhdGEoZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgY29uc29sZS53YXJuKFwiYmVmb3JlRGF0YUJpbmRpbmcgdHJpZ2dlcmVkXCIpO1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVHcmlkR2V0RGF0YSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVEYXRhQmluZGluZyBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVHcmlkR2V0RGF0YShncm91cCwgbWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEdyaWRTZXNzaW9uRmlsdGVyKGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGlmICghZ3JvdXBbXCJHcmlkU3RvcmFnZUtleVwiXSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IFN0b3JhZ2VLZXkgPSBncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdO1xyXG5cclxuICAgIGlmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KFN0b3JhZ2VLZXkpXHJcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEudmFsdWUgfHwgZGF0YS52YWx1ZSA9PT0gXCJudWxsXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShkYXRhLnZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5maWx0ZXIgPSBKU09OLnBhcnNlKHJlc3VsdFtcIlN0YXRlRmlsdGVyXCJdKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gSlNPTi5wYXJzZShyZXN1bHRbXCJGaWx0ZXJQYXJhbXNcIl0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5maWx0ZXIuZmlsdGVycy5mb3JFYWNoKChzdGF0ZUZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHN0YXRlRmlsdGVyLmZpZWxkLmluY2x1ZGVzKCdVVEMnKSkge1xyXG4gICAgICAgICAgICAgICAgc3RhdGVGaWx0ZXIudmFsdWUgPSBuZXcgRGF0ZShzdGF0ZUZpbHRlci52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEdyaWRTZXNzaW9uRmlsdGVyKGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGlmICghZ3JvdXBbXCJHcmlkU3RvcmFnZUtleVwiXSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IFN0b3JhZ2VLZXkgPSBncm91cFtcIkdyaWRTdG9yYWdlS2V5XCJdO1xyXG5cclxuICAgIGxldCBsc3RHcmlkRmlsdGVyOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcblxyXG4gICAgaWYgKG1lLnN0YXRlLmZpbHRlciAmJiB0aGlzLnN0b3JhZ2VTZXJ2aWNlICYmIHRoaXMuZGF0YVsnU2F2ZUZpbHRlciddKSB7XHJcbiAgICAgIC8vbGlzdCBvZiBkYXRhIGZvciBTdGF0ZUZpbHRlciBhbmQgRmlsdGVyUGFyYW1zXHJcbiAgICAgIGxzdEdyaWRGaWx0ZXIgPSB7IFwiU3RhdGVGaWx0ZXJcIjogSlNPTi5zdHJpbmdpZnkobWUuc3RhdGUuZmlsdGVyKSwgXCJGaWx0ZXJQYXJhbXNcIjogSlNPTi5zdHJpbmdpZnkobWUucGFyYW1zLmZpbHRlclBhcmFtcykgfVxyXG4gICAgICAvL2NyZWF0ZSBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkobHN0R3JpZEZpbHRlcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogQXZhaWxhYmxlIEZ1bmN0aW9ucyAqL1xyXG4gIHB1YmxpYyBzZXRFbmFibGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSA9ICFzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUgPSBzdGF0dXM7XHJcbiAgICB0aGlzLmRhdGEuVmlzaWJsZSA9IHN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRSZXF1aXJlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQgPSBzdGF0dXM7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmNoYW5nZVZhbGlkYXRvcihzdGF0dXMsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YS5WYWx1ZSwgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICB9XHJcblxyXG5cclxuICAvKiBvbmNoYW5nZSBFdmVudHMgKi9cclxuICBwdWJsaWMgZmlsdGVyQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kYXRhLlNraXBEaXJlY3RpdmUpIHtcclxuICAgICAgdGhpcy56Z3JpZC5maWx0ZXJDaGFuZ2UoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2VDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRhdGEuU2tpcERpcmVjdGl2ZSkge1xyXG4gICAgICB0aGlzLnpncmlkLnBhZ2VDaGFuZ2UoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRDaGFuZ2Uoc29ydDogU29ydERlc2NyaXB0b3JbXSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRhdGEuU2tpcERpcmVjdGl2ZSkge1xyXG4gICAgICB0aGlzLnpncmlkLnNvcnRDaGFuZ2Uoc29ydCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5DZWxsQ2hlY2tCb3hPbkNoYW5nZShldmVudDogYW55LCByb3dJbmRleDogYW55LCBjb2x1bW46IGFueSkge1xyXG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQuZGV0YWlsLmNoZWNrZWQ7XHJcbiAgICB0aGlzLmdEYXRhW3Jvd0luZGV4XVtjb2x1bW4uVmFsdWVdID0gaXNDaGVja2VkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbHVtbnNPcmRlckNoYW5nZWQoZXZlbnQ6IENvbHVtblJlb3JkZXJFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgX3pncmlkQ29udHJvbCA9IHRoaXMuemdyaWQgYXMgWkdyaWQ7XHJcbiAgICBjb25zdCBfemdyaWRDb21wb25lbnQgPSB0aGlzLnpncmlkLmdyaWQgYXMgR3JpZENvbXBvbmVudDtcclxuICAgIGNvbnN0IF9kYXRhID0gX3pncmlkQ29tcG9uZW50LmRhdGEgYXMgR3JpZERhdGFSZXN1bHQ7XHJcblxyXG4gICAgaWYgKHRoaXMuemdyaWQpIHtcclxuICAgICAgY29uc3QgX3pncmlkID0gdGhpcy56Z3JpZDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKiBncmlkIGNvbW1hbmQgaGFuZGxlciAqL1xyXG4gIHB1YmxpYyBhZGRIYW5kbGVyKHsgc2VuZGVyIH0pIHtcclxuICAgIHRoaXMuaXNOZXcgPSB0cnVlO1xyXG5cclxuICAgIC8vIGNsb3NlIGFueSBleGlzdGluZyBlZGl0b3JcclxuICAgIHRoaXMuY2xvc2VFZGl0b3Ioc2VuZGVyKTtcclxuXHJcbiAgICAvLyBsb29wIGFsbCBjb2x1bW4gdG8gZ2V0IHZhbGlkYXRpb24gYW5kIGNyZWF0ZSBmb3JtIGNvbnRyb2xcclxuICAgIGNvbnN0IGNvbEZvcm1Db250cm9sID0ge307XHJcbiAgICB0aGlzLnpncmlkLmdyaWRDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICBpZiAoY29sLklzUmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihjb2wuVmFsaWRhdG9yUGF0dGVybikpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2xGb3JtQ29udHJvbFtjb2wuVmFsdWVdID0gbmV3IEZvcm1Db250cm9sKG51bGwsIHZhbGlkYXRvcnMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc2V0IGZvcm0gY29udHJvbCBvYmplY3QgdG8gZm9ybSBncm91cFxyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGNvbEZvcm1Db250cm9sKTtcclxuXHJcbiAgICAvLyBhZGQgdG8gZ3JpZCByb3dcclxuICAgIHNlbmRlci5hZGRSb3codGhpcy5mb3JtR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmVIYW5kbGVyKHsgc2VuZGVyLCByb3dJbmRleCwgZm9ybUdyb3VwLCBpc05ldyB9KTogdm9pZCB7XHJcbiAgICAvLyBnZXQgZ3JpZCBkYXRhLlxyXG4gICAgY29uc3QgZ3JpZEV4aXN0aW5nRGF0YSA9IHRoaXMuZ0RhdGEgPyB0aGlzLmdEYXRhIDogdGhpcy5ncmlkRGF0YSA/IHRoaXMuZ3JpZERhdGEuZGF0YSA6IFtdO1xyXG5cclxuICAgIC8vIGlmIHZhbGlkXHJcbiAgICBpZiAoZm9ybUdyb3VwLnZhbGlkKSB7XHJcbiAgICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGUgVW5pcXVlS2V5XHJcbiAgICAgIGxldCB1bmlxdWVLZXlFeGlzdDogYm9vbGVhbjtcclxuICAgICAgY29uc3QgdW5pcXVlS2V5ID0gdGhpcy5kYXRhWydVbmlxdWVLZXknXTtcclxuICAgICAgaWYgKHVuaXF1ZUtleSkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1VbmlxdWVLZXlWYWx1ZSA9IGZvcm1Hcm91cC52YWx1ZVt1bmlxdWVLZXldO1xyXG5cclxuICAgICAgICBpZiAoaXNOZXcgfHwgKCFpc05ldyAmJiAoZ3JpZEV4aXN0aW5nRGF0YVtyb3dJbmRleF1bdW5pcXVlS2V5XSAhPSBmb3JtVW5pcXVlS2V5VmFsdWUpKSkge1xyXG4gICAgICAgICAgLy8gaWYgbmV3Li4uXHJcbiAgICAgICAgICAvLyBpZiBlZGl0Li4uIGlmIGN1cnJlbnQgZmllbGQsIHVuaXF1ZWtleSB2YWx1ZSBjaGFuZ2VkLiBuZWVkIHRvIGNoZWNrLlxyXG4gICAgICAgICAgZ3JpZEV4aXN0aW5nRGF0YS5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZGF0YVt1bmlxdWVLZXldID09PSBmb3JtVW5pcXVlS2V5VmFsdWUpIHtcclxuICAgICAgICAgICAgICB1bmlxdWVLZXlFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdW5pcXVlS2V5RXhpc3QpIHtcclxuICAgICAgICBpZiAoaXNOZXcpIHtcclxuICAgICAgICAgIC8vIGlmIG5ldywgcHVzaCB0byBkYXRhXHJcbiAgICAgICAgICBncmlkRXhpc3RpbmdEYXRhLnB1c2goZm9ybUdyb3VwLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBpZiBlZGl0LCB1cGRhdGUgZGF0YVxyXG4gICAgICAgICAgZ3JpZEV4aXN0aW5nRGF0YVtyb3dJbmRleF0gPSBmb3JtR3JvdXAudmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldERhdGEoZ3JpZEV4aXN0aW5nRGF0YSk7XHJcblxyXG4gICAgICAgIHNlbmRlci5jbG9zZVJvdyhyb3dJbmRleCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdygnRXJyb3Igb2NjdXI6IER1cGxpY2F0ZWQgdW5pcXVlIGZpZWxkIGVudHJ5LicsICd0b3AnLCB0cnVlLCAzMDAwLCAnZGFuZ2VyJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYW5jZWxIYW5kbGVyKHsgc2VuZGVyLCByb3dJbmRleCB9KSB7XHJcbiAgICAvLyBjYW5jZWwgYW55IGV4aXN0aW5nIGVkaXRvclxyXG4gICAgc2VuZGVyLmNsb3NlUm93KHJvd0luZGV4KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0SGFuZGxlcih7IHNlbmRlciwgcm93SW5kZXgsIGRhdGFJdGVtIH0pIHtcclxuICAgIHRoaXMuaXNOZXcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBjbG9zZSBhbnkgZXhpc3RpbmcgZWRpdG9yXHJcbiAgICB0aGlzLmNsb3NlRWRpdG9yKHNlbmRlcik7XHJcblxyXG4gICAgLy8gbG9vcCBhbGwgY29sdW1uIHRvIGdldCB2YWxpZGF0aW9uIGFuZCBjcmVhdGUgZm9ybSBjb250cm9sLCBhcHBlbmQgY3VycmVudCByb3cgdmFsdWVcclxuICAgIGNvbnN0IGNvbEZvcm1Db250cm9sID0ge307XHJcbiAgICB0aGlzLnpncmlkLmdyaWRDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICBpZiAoY29sLklzUmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbC5WYWxpZGF0b3JQYXR0ZXJuKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihjb2wuVmFsaWRhdG9yUGF0dGVybikpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2xGb3JtQ29udHJvbFtjb2wuVmFsdWVdID0gbmV3IEZvcm1Db250cm9sKGRhdGFJdGVtW2NvbC5WYWx1ZV0sIHZhbGlkYXRvcnMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc2V0IGZvcm0gY29udHJvbCBvYmplY3QgdG8gZm9ybSBncm91cFxyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGNvbEZvcm1Db250cm9sKTtcclxuXHJcbiAgICAvLyBzZXQgZ3JpZCByb3cgdG8gZWRpdFxyXG4gICAgdGhpcy5lZGl0ZWRSb3dJbmRleCA9IHJvd0luZGV4O1xyXG4gICAgc2VuZGVyLmVkaXRSb3cocm93SW5kZXgsIHRoaXMuZm9ybUdyb3VwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVIYW5kbGVyKHsgc2VuZGVyLCBkYXRhSXRlbSB9KSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KGRhdGFJdGVtLCB0aGlzLmdEYXRhLCB0aGlzLmRhdGFbJ1VuaXF1ZUtleSddKTtcclxuICAgIHRoaXMuZ0RhdGEuc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICBzZW5kZXIuY2FuY2VsQ2VsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZUVkaXRvcihncmlkLCByb3dJbmRleCA9IHRoaXMuZWRpdGVkUm93SW5kZXgpIHtcclxuICAgIGdyaWQuY2xvc2VSb3cocm93SW5kZXgpO1xyXG4gICAgdGhpcy5lZGl0ZWRSb3dJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZm9ybUdyb3VwID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJdGVtSW5kZXgoaXRlbTogYW55LCBkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZGF0YS5sZW5ndGg7IGlkeCsrKSB7XHJcbiAgICAgIGlmIChkYXRhW2lkeF1ba2V5XSA9PT0gaXRlbVtrZXldKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkeDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcbn1cclxuIiwiPCEtLVxyXG48ZGl2IHN0eWxlPVwibWFyZ2luOiAxMHB4XCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgay1mb3JtXCI+XHJcbiAgICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICAgIDxsZWdlbmQ+QmluZGluZyB0eXBlczwvbGVnZW5kPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay1mb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5CaW5kIHRoZSBkYXRhIHRvOjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImJpbmRpbmdUeXBlXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVcIiBpZD1cImFycmF5XCIgdmFsdWU9XCJhcnJheVwiIGNsYXNzPVwiay1yYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUJpbmRpbmdUeXBlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImstcmFkaW8tbGFiZWxcIiBmb3I9XCJhcnJheVwiPkFycmF5IG9iamVjdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJiaW5kaW5nVHlwZVwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlXCIgaWQ9XCJncmlkRGF0YVJlc3VsdFwiIHZhbHVlPVwiZ3JpZERhdGFSZXN1bHRcIiBjbGFzcz1cImstcmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VCaW5kaW5nVHlwZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJrLXJhZGlvLWxhYmVsXCIgZm9yPVwiZ3JpZERhdGFSZXN1bHRcIj5HcmlkRGF0YVJlc3VsdCBvYmplY3Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiYmluZGluZ1R5cGVcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwibW9kZVwiIGlkPVwiYXN5bmNcIiB2YWx1ZT1cImFzeW5jXCIgY2xhc3M9XCJrLXJhZGlvXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQmluZGluZ1R5cGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiay1yYWRpby1sYWJlbFwiIGZvcj1cImFzeW5jXCI+QXN5bmNocm9ub3VzIHNvdXJjZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiAtLT5cclxuPGRpdiBzdHlsZT1cIm1hcmdpbjogMTBweCAwIDZweCAwO1wiPlxyXG4gIDxkaXYgKm5nSWY9XCJkYXRhLlRpdGxlXCIgY2xhc3M9XCJncmlkVGl0bGVcIj57e2RhdGEuVGl0bGV9fTwvZGl2PlxyXG4gIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgbGV0LWFuY2hvcj5cclxuICAgIDxzcGFuPnt7IGFuY2hvci5uYXRpdmVFbGVtZW50LmlubmVyVGV4dCB9fTwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxkaXYga2VuZG9Ub29sdGlwXHJcbiAgICAgICBzaG93T249XCJub25lXCJcclxuICAgICAgIFt0b29sdGlwVGVtcGxhdGVdPVwidGVtcGxhdGVcIlxyXG4gICAgICAgZmlsdGVyPVwiLmstZ3JpZCB0ZFwiXHJcbiAgICAgICAobW91c2VvdmVyKT1cInNob3dUb29sdGlwKCRldmVudClcIj5cclxuICAgIDxrZW5kby1ncmlkIFt6Z3JpZGJpbmRpbmddPVwie2RhdGE6IGRhdGEsIGdyb3VwOiBncm91cCwgcGFyYW1zOiBwYXJhbXMsIGdyaWRTdWJqZWN0OiBncmlkU3ViamVjdH1cIiBbbmdDbGFzc109XCJkYXRhLkNsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImdyaWREYXRhXCJcclxuICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJzdGF0ZS50YWtlXCJcclxuICAgICAgICAgICAgICAgIFtwYWdlYWJsZV09XCJ7cmVzcG9uc2l2ZTogdHJ1ZSwgYnV0dG9uQ291bnQ6IDMsIHBhZ2VTaXplczogcGFnZVNpemVzLCBwcmV2aW91c05leHQ6IHByZXZpb3VzTmV4dH1cIlxyXG4gICAgICAgICAgICAgICAgW3NraXBdPVwic3RhdGUuc2tpcFwiXHJcbiAgICAgICAgICAgICAgICBbc29ydF09XCJzdGF0ZS5zb3J0XCJcclxuICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJ7YWxsb3dVbnNvcnQ6IHRydWUsbW9kZTogJ211bHRpcGxlJ31cIlxyXG4gICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJzdGF0ZS5maWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgW2ZpbHRlcmFibGVdPVwiZGF0YS5lbmFibGVGaWx0ZXJpbmcgIT09IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbcmVvcmRlcmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbY29sdW1uTWVudV09XCJkYXRhLkRpc2FibGVHcmlkQ29sdW1uTWVudSA/IGZhbHNlIDogeyBmaWx0ZXI6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSlcIlxyXG4gICAgICAgICAgICAgICAgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2tIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGNlbGxDbG9zZSk9XCJlZGl0Q2VsbENsb3NlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChkYXRhU3RhdGVDaGFuZ2UpPVwiZGF0YVN0YXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cInNvcnRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImZpbHRlckNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChjb2x1bW5SZW9yZGVyKT1cImNvbHVtbnNPcmRlckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBba2VuZG9HcmlkU2VsZWN0QnldPVwicm93U2VsZWN0aW9uS2V5XCJcclxuICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICBbKHNlbGVjdGVkS2V5cyldPVwibXlTZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0R3JpZFN0eWxlKClcIlxyXG4gICAgICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXHJcbiAgICAgICAgICAgICAgICAoY2FuY2VsKT1cImNhbmNlbEhhbmRsZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoc2F2ZSk9XCJzYXZlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChyZW1vdmUpPVwicmVtb3ZlSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChlZGl0KT1cImVkaXRIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGFkZCk9XCJhZGRIYW5kbGVyKCRldmVudClcIj5cclxuICAgICAgPCEtLVtzY3JvbGxhYmxlXT1cInNjcm9sbE1vZGVcIiB0ZW1wIHJlbW92ZS4gY2F1c2luZyBzb21lIGJ1ZyBvbiBwYWdpbmF0aW9uLS0+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRUb29sYmFyVGVtcGxhdGUgKm5nSWY9XCJkYXRhLkFsbG93UmVmcmVzaEJ1dHRvbiB8fCBkYXRhLkFsbG93RXhwb3J0IHx8IGRhdGEuQWxsb3dTYXZlU3RhdGUgfHwgZGF0YS5FbmFibGVHcmlkQ29tbWFuZFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGtlbmRvQnV0dG9uIChjbGljayk9XCJyZWZyZXNoRGF0YSgpXCIgKm5nSWY9XCJkYXRhLkFsbG93UmVmcmVzaEJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiay1pY29uIGstaS1yZWZyZXNoLXNtXCI+PC9zcGFuPiZuYnNwO1JlZnJlc2g8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0dyaWRFeGNlbENvbW1hbmQgKm5nSWY9XCJkYXRhLkFsbG93RXhwb3J0XCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLWZpbGUtZXhjZWxcIj48L3NwYW4+Jm5ic3A7RXhwb3J0IERhdGEgdG8gRXhjZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0J1dHRvbiAoY2xpY2spPVwic2F2ZUdyaWRTZXR0aW5ncygpXCIgKm5nSWY9XCJkYXRhLkFsbG93U2F2ZVN0YXRlXCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXN0YXJcIj48L3NwYW4+Jm5ic3A7U2F2ZSBTZXR0aW5nPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIga2VuZG9CdXR0b24gKGNsaWNrKT1cInJlc3RvcmVHcmlkU2V0dGluZ3MoKVwiICpuZ0lmPVwiZ3JpZERlZmF1bHRTdGF0ZUV4aXN0XCI+PHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXN0YXItb3V0bGluZVwiPjwvc3Bhbj4mbmJzcDtSZXN0b3JlIFNldHRpbmc8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBrZW5kb0dyaWRBZGRDb21tYW5kICpuZ0lmPVwiZGF0YS5FbmFibGVHcmlkQ29tbWFuZCBcIj48c3BhbiBjbGFzcz1cImstaWNvbiBrLWktYWRkXCI+PC9zcGFuPkFkZCBOZXc8L2J1dHRvbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPGtlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uICpuZ0lmPVwiISFkYXRhLlNlbGVjdE9wdGlvbnNcIiBbd2lkdGhdPVwiNjBcIiBzaG93U2VsZWN0QWxsPVwidHJ1ZVwiIFtjb2x1bW5NZW51XT1cInRydWVcIj48L2tlbmRvLWdyaWQtY2hlY2tib3gtY29sdW1uPlxyXG4gICAgICA8a2VuZG8tZ3JpZC1jb2x1bW4gKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImNvbC50aXRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiY29sLndpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5SZXNpemFibGVXaWR0aF09XCJjb2wubWluUmVzaXphYmxlV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJjb2wuZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGUoY29sLmVuYWJsZUZpbHRlcmluZylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRhYmxlXT1cInNvcnRhYmxlKGNvbC5lbmFibGVTb3J0aW5nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGVhZGVyU3R5bGVdPVwieyd3aGl0ZS1zcGFjZSc6ICdpbml0aWFsJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJjb2wuaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwiY29sLmZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLkNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtsb2NrZWRdPVwibG9ja2VkKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbk1lbnVdPVwiIWNvbC5kaXNhYmxlQ29sdW1uTWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZWRpdG9yXT1cImNvbC5lZGl0b3JUeXBlXCI+XHJcbiAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiY29sLmZpZWxkVHlwZSA9PT0gJ251bWJlcidcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ2N1cnJlbmN5J1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnem51bWVyaWMnXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtbnVtZXJpYy1maWx0ZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgb3BlcmF0b3I9XCJlcVwiPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1udW1lcmljLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJjb2wuZmllbGRUeXBlID09ICd6ZGF0ZSdcclxuICAgICAgICAgICAgICAgfHwgY29sLmZpZWxkVHlwZSA9PT0gJ3p0aW1lJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnemRhdGV0aW1lJ1xyXG4gICAgICAgICAgICAgICB8fCBjb2wuZmllbGRUeXBlID09PSAnenVpZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IHRydWVcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRmlsdGVyQ2VsbFRlbXBsYXRlIGxldC1maWx0ZXIgbGV0LWNvbHVtbj1cImNvbHVtblwiIG9wZXJhdG9yPVwibHRlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGF0ZS1yYW5nZS1maWx0ZXItY2VsbCBjbGFzcz1cImRhdGUtcmFuZ2UtZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImRhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0LW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1sdGUtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3Qtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWd0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc25vdG51bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICA8L2RhdGUtcmFuZ2UtZmlsdGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmlsdGVyQnlEYXRlUmFuZ2UgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEZpbHRlckNlbGxUZW1wbGF0ZSBsZXQtZmlsdGVyIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1ncmlkLWRhdGUtZmlsdGVyLWNlbGwgW2NvbHVtbl09XCJjb2x1bW5cIiBbZmlsdGVyXT1cImZpbHRlclwiIG9wZXJhdG9yPVwibHRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItbHQtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbHRlLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWx0ZS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1ndC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1ndGUtb3BlcmF0b3I+PC9rZW5kby1maWx0ZXItZ3RlLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1pc251bGwtb3BlcmF0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDwva2VuZG8tZ3JpZC1kYXRlLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWZpbHRlciBsZXQtY29sdW1uPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiBvcGVyYXRvcj1cImNvbnRhaW5zXCI+XHJcbiAgICAgICAgICAgICAgICA8a2VuZG8tZmlsdGVyLWNvbnRhaW5zLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWNvbnRhaW5zLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItbmVxLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLW5lcS1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItc3RhcnRzd2l0aC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1zdGFydHN3aXRoLW9wZXJhdG9yPlxyXG4gICAgICAgICAgICAgICAgPGtlbmRvLWZpbHRlci1lbmRzd2l0aC1vcGVyYXRvcj48L2tlbmRvLWZpbHRlci1lbmRzd2l0aC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICAgIDxrZW5kby1maWx0ZXItaXNub3RudWxsLW9wZXJhdG9yPjwva2VuZG8tZmlsdGVyLWlzbm90bnVsbC1vcGVyYXRvcj5cclxuICAgICAgICAgICAgICA8L2tlbmRvLWdyaWQtc3RyaW5nLWZpbHRlci1jZWxsPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBHcmlkIEVkaXQgVGVtcGxhdGUgLS0+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZEVkaXRUZW1wbGF0ZSAqbmdJZj1cImRhdGEuRW5hYmxlR3JpZENvbW1hbmQgXCIgbGV0LWRhdGFJdGVtPVwiZGF0YUl0ZW1cIiBsZXQtY29sdW1uPVwiY29sXCIgbGV0LWZvcm1Hcm91cD1cImZvcm1Hcm91cFwiIGxldC1pc05ldz1cImlzTmV3XCI+XHJcbiAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLW51bWVyaWN0ZXh0Ym94ICNjZWxsQW5jaG9yIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZClcIj48L2tlbmRvLW51bWVyaWN0ZXh0Ym94PlxyXG4gICAgICAgICAgICAgIDxrZW5kby1wb3B1cCBbYW5jaG9yXT1cImNlbGxBbmNob3IubnVtZXJpY0lucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhKGlzTmV3ICYmIGZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBDbGFzcz1cImstd2lkZ2V0IGstdG9vbHRpcCBrLXRvb2x0aXAtdmFsaWRhdGlvbiBrLWludmFsaWQtbXNnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDJweDsgb3BhY2l0eTogMC41O1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXdhcm5pbmdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZCAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuZXJyb3JzPy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuTmFtZSB9fSByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmVycm9ycz8ucGF0dGVyblwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA/IGNvbC5WYWxpZGF0b3JNZXNzYWdlIDogXCJQbGVhc2UgY2hlY2sgdGhlIGlucHV0IHZhbHVlLlwiIH19XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICA8L2tlbmRvLXBvcHVwPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgIDxrZW5kby10ZXh0Ym94ICNjZWxsQW5jaG9yIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZClcIj48L2tlbmRvLXRleHRib3g+XHJcbiAgICAgICAgICAgICAgPGtlbmRvLXBvcHVwIFthbmNob3JdPVwiY2VsbEFuY2hvci5pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIShpc05ldyAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkudW50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwQ2xhc3M9XCJrLXdpZGdldCBrLXRvb2x0aXAgay10b29sdGlwLXZhbGlkYXRpb24gay1pbnZhbGlkLW1zZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAycHg7IG9wYWNpdHk6IDAuNTtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiay1pY29uIGstaS13YXJuaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPCEtLTxpb24tbGFiZWwgc3R5bGU9XCJwYWRkaW5nLXRvcDogMXB4OyBwYWRkaW5nLWxlZnQ6IDNweDtcIj57eyBjb2wuTmFtZSB9fSBpcyByZXF1aXJlZC48L2lvbi1sYWJlbD4tLT5cclxuXHJcbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHN0eWxlPVwicGFkZGluZy10b3A6IDFweDsgcGFkZGluZy1sZWZ0OiAzcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuaW52YWxpZCAmJiAhZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLnVudG91Y2hlZCAmJiBmb3JtR3JvdXAuZ2V0KGNvbC5maWVsZCkuZXJyb3JzPy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuTmFtZSB9fSByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxcHg7IHBhZGRpbmctbGVmdDogM3B4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoY29sLmZpZWxkKS51bnRvdWNoZWQgJiYgZm9ybUdyb3VwLmdldChjb2wuZmllbGQpLmVycm9ycz8ucGF0dGVyblwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjb2wuVmFsaWRhdG9yTWVzc2FnZSA/IGNvbC5WYWxpZGF0b3JNZXNzYWdlIDogXCJQbGVhc2UgY2hlY2sgdGhlIGlucHV0IHZhbHVlLlwiIH19XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICA8L2tlbmRvLXBvcHVwPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvR3JpZENlbGxUZW1wbGF0ZSBsZXQtZGF0YUl0ZW0gbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDFweCAwO1wiICpuZ0lmPVwiIWNvbC5jbGlja2FibGVJY29ucyAmJiBjb2wuaXNFZGl0YWJsZUluR3JpZCAhPT0gdHJ1ZVwiIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCJcclxuICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3MoZGF0YUl0ZW0sIGNvbClcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ2RkL01NL3l5eXknIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dGltZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ0hIOm1tJyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenNob3J0ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInemRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3p1aWRhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfCBkYXRlOiAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgbnVtYmVyIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICB7eyBkYXRhSXRlbVtjb2wuZmllbGRdIHwgbnVtYmVyOiBnZXRGb3JtYXQoY29sLCAnMS4yLTInKSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInem51bWVyaWMnXCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCkgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3VybCdcIiBzdHlsZT1cImNvbG9yOiBibHVlOyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCI+XHJcbiAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgPCEtLXt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfX0tLT5cclxuICAgICAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJjZWxsU3R5bGVDb25kaXRpb24oY29sLCBkYXRhSXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT10cnVlPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VsbFN0eWxlQ29uZGl0aW9uRGVmYXVsdFwiIFtzdHlsZV09XCJzZXRDZWxsU3R5bGVDb25kaXRpb24oY29sLCBkYXRhSXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZGF0YUl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGRhdGFJdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIiEhY29sLm5hdmlnYXRlVG9cIiAoY2xpY2spPVwib25OYXZpZ2F0ZVRvKCRldmVudCwgY29sLCBkYXRhSXRlbSwgZGF0YUl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJsaWdodFwiIHNpemU9XCJzbWFsbFwiPlxyXG4gICAgICB7eyBjb2wuQ2xpY2thYmxlSWNvbnMgfX1cclxuICAgICAgPGlvbi1pY29uIHNsb3Q9IFwiZW5kXCIgbmFtZT1cImFycm93LWZvcndhcmRcIj48L2lvbi1pY29uPlxyXG4gICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgIDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luOiA1cHggMDtcIiAqbmdJZj1cImNvbC5pc0VkaXRhYmxlSW5HcmlkID09PSB0cnVlICYmIGlubGluZUVkaXRlZEZvcm1Hcm91cHNcIiBbbmdTd2l0Y2hdPVwiY29sLmZpZWxkVHlwZVwiIFtmb3JtR3JvdXBdPVwiaW5saW5lRWRpdGVkRm9ybUdyb3Vwc1wiXHJcbiAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzKGRhdGFJdGVtLCBjb2wpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cInRoaXMuZ2V0Rm9ybUNvbnRyb2wocm93SW5kZXgsIGNvbC5maWVsZClcIiAvPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XHJcbiAgICAgICAgICAgICAgPGlvbi1jaGVja2JveCBbZGlzYWJsZWRdPVwiKCEhY29sLlJlYWRPbmx5ID8gY29sLlJlYWRPbmx5IDogZmFsc2UpXCIgW2Zvcm1Db250cm9sXT1cInRoaXMuZ2V0Rm9ybUNvbnRyb2wocm93SW5kZXgsIGNvbC5maWVsZClcIiBjb2xvcj1cInByaW1hcnlcIiAoaW9uQ2hhbmdlKT1cImluQ2VsbENoZWNrQm94T25DaGFuZ2UoJGV2ZW50LCByb3dJbmRleCwgY29sKVwiPjwvaW9uLWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenVpc2VsZWN0bXVsdGlwbGUnXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16c2VsZWN0bXVsdGlwbGUgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbZGF0YV09XCJnZXRJbmxpbmVGaWVsZChjb2wuVmFsdWUpXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZ2V0SW5saW5lRm9ybShyb3dJbmRleClcIj48L2FwcC16c2VsZWN0bXVsdGlwbGU+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0ZXh0YXJlYSdcIj5cclxuICAgICAgICAgICAgICA8YXBwLXp0ZXh0YXJlYSBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIFtkYXRhXT1cImdldElubGluZUZpZWxkKGNvbC5WYWx1ZSlcIiBbZ3JvdXBdPVwiZ3JvdXBcIiBbZm9ybV09XCJnZXRJbmxpbmVGb3JtKHJvd0luZGV4KVwiPjwvYXBwLXp0ZXh0YXJlYT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiWyd6dWlkYXRldGltZScsJ3pkYXRlJywgJ3p0aW1lJywnemRhdGV0aW1lJywnenNob3J0ZGF0ZSddLmluY2x1ZGVzKGNvbC5maWVsZFR5cGUpID8gY29sLmZpZWxkVHlwZSA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC16ZGF0ZXRpbWUgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbZGF0YV09XCJnZXRJbmxpbmVGaWVsZChjb2wuVmFsdWUpXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZ2V0SW5saW5lRm9ybShyb3dJbmRleClcIj48L2FwcC16ZGF0ZXRpbWU+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJ0aGlzLmdldEZvcm1Db250cm9sKHJvd0luZGV4LCBjb2wuZmllbGQpXCIgLz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sLmNsaWNrYWJsZUljb25zXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImljb24uQ2xhc3MgPyBpY29uLkNsYXNzIDogJydcIiAqbmdJZj1cIiEhaWNvbiAmJiAoISFkYXRhSXRlbS5XRlNfU3RhdHVzQ29kZSAmJiAhIWljb24pXHJcbiAgICAgICAgICAgICAgPyBkYXRhSXRlbS5XRlNfU3RhdHVzQ29kZSAhPT0gaWNvbi5XRlNfU3RhdHVzQ29kZVxyXG4gICAgICAgICAgICAgIDogdHJ1ZTtcclxuICAgICAgICAgICAgZWxzZSBkaXNhYmxlZEJ1dHRvblwiIChjbGljayk9XCJvbkJ0bkNsaWNrKCRldmVudCwgaWNvbiwgZGF0YUl0ZW0sIGRhdGFJdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAge3tpY29uLk5hbWUgfHwgZGF0YUl0ZW1bY29sLmZpZWxkXX19IDxmYS1pY29uIFtpY29uXT1cImljb24uSWNvblwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweDtcIj5cclxuICAgICAgICAgICAgICA8L2ZhLWljb24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZEJ1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwhLS0gPHN0cm9uZz57eyBkYXRhSXRlbVtjb2wuZmllbGRdIH19PC9zdHJvbmc+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInt7ZGF0YUl0ZW0uRGlzY29udGludWVkID8gJ2Rpc2NvbnRpbnVlZCcgOiAnYWN0aXZlJ319XCI+XHJcbiAgICAgICAge3tkYXRhSXRlbS5EaXNjb250aW51ZWQgPyBcImRpc2NvbnRpbnVlZFwiIDogXCJhY3RpdmVcIn19XHJcbiAgICAgIDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUga2VuZG9HcmlkRm9vdGVyVGVtcGxhdGUgbGV0LWNvbHVtbiBsZXQtY29sdW1uSW5kZXg9XCJjb2x1bW5JbmRleFwiICpuZ0lmPVwiZGF0YS5FbmFibGVBZ2dyZWdhdGVcIj5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW46IDVweCAwO1wiIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRUeXBlXCI+XHJcbiAgICAgICAgICAgIHt7Y29sLmFnZ3JlZ2F0ZVR5cGV9fVxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IGRhdGU6ICdkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenRpbWUnXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogJ0hIOm1tJyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInenNob3J0ZGF0ZSdcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiAnTU1NIHl5eXknIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6ZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXkgaGg6bW06c3MgYWEnIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid6dWlkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBkYXRlOiAnZGQvTU0veXl5eSBoaDptbTpzcyBhYScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfCBudW1iZXIgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCwgJzEuMi4yJykgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3pudW1lcmljJ1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5hZ2dyZWdhdGVWYWx1ZSB8IG51bWJlcjogZ2V0Rm9ybWF0KGNvbCkgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3VybCdcIiBzdHlsZT1cImNvbG9yOiBibHVlOyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7XCI+XHJcbiAgICAgICAgICAgICAge3sgY29sLmFnZ3JlZ2F0ZVZhbHVlIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICB7eyBjb2wuYWdncmVnYXRlVmFsdWUgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9rZW5kby1ncmlkLWNvbHVtbj5cclxuICAgICAgPGtlbmRvLWdyaWQtY29tbWFuZC1jb2x1bW4gKm5nSWY9XCJkYXRhLkVuYWJsZUdyaWRDb21tYW5kXCIgd2lkdGg9XCIxODBcIiBbY29sdW1uTWVudV09XCJmYWxzZVwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0dyaWRDZWxsVGVtcGxhdGUgbGV0LWlzTmV3PVwiaXNOZXdcIj5cclxuICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkU2F2ZUNvbW1hbmQ+XHJcbiAgICAgICAgICAgIHt7IGlzTmV3ID8gJ1NhdmUnIDogJ1VwZGF0ZScgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBrZW5kb0dyaWRDYW5jZWxDb21tYW5kIFtwcmltYXJ5XT1cInRydWVcIj5cclxuICAgICAgICAgICAge3sgaXNOZXcgPyAnRGlzY2FyZCBjaGFuZ2VzJyA6ICdDYW5jZWwnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkRWRpdENvbW1hbmQ+XHJcbiAgICAgICAgICAgIHt7IFwiRWRpdFwiIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24ga2VuZG9HcmlkUmVtb3ZlQ29tbWFuZD5cclxuICAgICAgICAgICAge3sgXCJSZW1vdmVcIiB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9rZW5kby1ncmlkLWNvbW1hbmQtY29sdW1uPlxyXG4gICAgICA8a2VuZG8tZ3JpZC1leGNlbCBmaWxlTmFtZT1cIkV4cG9ydC54bHN4XCIgW2ZldGNoRGF0YV09XCJhbGxSZXN1bHRzXCI+PC9rZW5kby1ncmlkLWV4Y2VsPlxyXG4gICAgPC9rZW5kby1ncmlkPlxyXG4gICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwiay1pLWxvYWRpbmdcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==