@c8y/ngx-components 1018.0.29 → 1018.0.31

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 (26) hide show
  1. package/datapoint-library/details/datapoint-library-details.component.d.ts +6 -3
  2. package/datapoint-selector/datapoint-selector-modal/datapoint-selector-modal.component.d.ts +3 -0
  3. package/datapoint-selector/datapoint-selector.component.d.ts +2 -1
  4. package/esm2020/assets-navigator/asset-selector/miller-view.component.mjs +3 -3
  5. package/esm2020/context-dashboard/widget-config.component.mjs +3 -3
  6. package/esm2020/datapoint-library/details/datapoint-library-details.component.mjs +38 -10
  7. package/esm2020/datapoint-selector/datapoint-selector-modal/datapoint-selector-modal.component.mjs +14 -5
  8. package/esm2020/datapoint-selector/datapoint-selector.component.mjs +8 -5
  9. package/fesm2015/c8y-ngx-components-assets-navigator.mjs +2 -2
  10. package/fesm2015/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  11. package/fesm2015/c8y-ngx-components-context-dashboard.mjs +2 -2
  12. package/fesm2015/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  13. package/fesm2015/c8y-ngx-components-datapoint-library-details.mjs +39 -9
  14. package/fesm2015/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
  15. package/fesm2015/c8y-ngx-components-datapoint-selector.mjs +17 -6
  16. package/fesm2015/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  17. package/fesm2020/c8y-ngx-components-assets-navigator.mjs +2 -2
  18. package/fesm2020/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  19. package/fesm2020/c8y-ngx-components-context-dashboard.mjs +2 -2
  20. package/fesm2020/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  21. package/fesm2020/c8y-ngx-components-datapoint-library-details.mjs +37 -9
  22. package/fesm2020/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
  23. package/fesm2020/c8y-ngx-components-datapoint-selector.mjs +17 -6
  24. package/fesm2020/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  25. package/locales/locales.pot +9 -6
  26. package/package.json +1 -1
@@ -8,6 +8,7 @@ import { Subscription } from 'rxjs';
8
8
  import { DatapointLibraryOptions } from '@c8y/ngx-components/datapoint-library/model';
9
9
  import { ColorService } from '@c8y/ngx-components';
10
10
  import { DatapointParserService } from '@c8y/ngx-components/datapoint-library/services';
11
+ import { DatapointSelectorService } from '@c8y/ngx-components/datapoint-selector';
11
12
  import * as i0 from "@angular/core";
12
13
  export declare class DatapointLibraryDetailsComponent implements OnInit, OnDestroy {
13
14
  private activatedRoute;
@@ -18,9 +19,10 @@ export declare class DatapointLibraryDetailsComponent implements OnInit, OnDestr
18
19
  private translate;
19
20
  private colorService;
20
21
  private parser;
22
+ private datapointSelectorService;
21
23
  config: DatapointLibraryOptions;
22
24
  path: string;
23
- formGroup: FormGroup;
25
+ formGroup: ReturnType<DatapointLibraryDetailsComponent['initForm']>;
24
26
  range: FormGroup;
25
27
  redRange: FormGroup;
26
28
  yellowRange: FormGroup;
@@ -28,12 +30,13 @@ export declare class DatapointLibraryDetailsComponent implements OnInit, OnDestr
28
30
  isLoading: boolean;
29
31
  rangeConfig: {};
30
32
  routeSub: Subscription;
31
- constructor(activatedRoute: ActivatedRoute, inventory: InventoryService, formBuilder: FormBuilder, alertService: AlertService, router: Router, translate: TranslateService, colorService: ColorService, parser: DatapointParserService, config: DatapointLibraryOptions);
33
+ constructor(activatedRoute: ActivatedRoute, inventory: InventoryService, formBuilder: FormBuilder, alertService: AlertService, router: Router, translate: TranslateService, colorService: ColorService, parser: DatapointParserService, datapointSelectorService: DatapointSelectorService, config: DatapointLibraryOptions);
32
34
  ngOnInit(): void;
33
35
  ngOnDestroy(): void;
34
36
  save(value: any): Promise<void>;
35
37
  cancel(): void;
36
38
  formChange(): void;
39
+ pickDatapoint(): Promise<void>;
37
40
  private navigateBackToList;
38
41
  private datapointUpdate;
39
42
  private extractKpiValuesFromFormValue;
@@ -41,6 +44,6 @@ export declare class DatapointLibraryDetailsComponent implements OnInit, OnDestr
41
44
  private isContextSet;
42
45
  private initForm;
43
46
  private removeNullValues;
44
- static ɵfac: i0.ɵɵFactoryDeclaration<DatapointLibraryDetailsComponent, [null, null, null, null, null, null, null, null, { optional: true; }]>;
47
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatapointLibraryDetailsComponent, [null, null, null, null, null, null, null, null, null, { optional: true; }]>;
45
48
  static ɵcmp: i0.ɵɵComponentDeclaration<DatapointLibraryDetailsComponent, "c8y-datapoint-library-details", never, {}, {}, never, never, true>;
46
49
  }
@@ -15,6 +15,8 @@ export declare class DatapointSelectorModalComponent implements OnInit {
15
15
  saveButtonLabel: string;
16
16
  guessDatapointUnit: boolean;
17
17
  defaultActiveState: boolean;
18
+ finishWithFirstSelection: boolean;
19
+ ignoreDatapointTemplates: boolean;
18
20
  assetSelectorConfig: Partial<DatapointSelectorModalAssetSelectorOptions>;
19
21
  readonly result: Promise<KPIDetails[]>;
20
22
  private save;
@@ -23,6 +25,7 @@ export declare class DatapointSelectorModalComponent implements OnInit {
23
25
  ngOnInit(): void;
24
26
  saveChanges(): void;
25
27
  close(): void;
28
+ selectionChange(selection: Array<KPIDetails>): void;
26
29
  /**
27
30
  * changes the z-index of the modal, to make sure this modal is on top.
28
31
  * required as angularJS modals are placing them selves on top via adjusting z-index.
@@ -15,6 +15,7 @@ export declare class DatapointSelectorComponent implements OnInit, ControlValueA
15
15
  ignoreDatapointTemplates: boolean;
16
16
  guessDatapointUnit: boolean;
17
17
  allowSearch: boolean;
18
+ hideSelection: boolean;
18
19
  searchString: string;
19
20
  maxNumberOfDatapoints: number;
20
21
  loadingDatapoints: boolean;
@@ -46,5 +47,5 @@ export declare class DatapointSelectorComponent implements OnInit, ControlValueA
46
47
  private markAsTouched;
47
48
  private includesSearchString;
48
49
  static ɵfac: i0.ɵɵFactoryDeclaration<DatapointSelectorComponent, never>;
49
- static ɵcmp: i0.ɵɵComponentDeclaration<DatapointSelectorComponent, "c8y-datapoint-selector", never, { "contextAsset": "contextAsset"; "allowChangingContext": "allowChangingContext"; "allowDatapointsFromMultipleAssets": "allowDatapointsFromMultipleAssets"; "defaultActiveState": "defaultActiveState"; "ignoreDatapointTemplates": "ignoreDatapointTemplates"; "guessDatapointUnit": "guessDatapointUnit"; "allowSearch": "allowSearch"; }, {}, never, never, false>;
50
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatapointSelectorComponent, "c8y-datapoint-selector", never, { "contextAsset": "contextAsset"; "allowChangingContext": "allowChangingContext"; "allowDatapointsFromMultipleAssets": "allowDatapointsFromMultipleAssets"; "defaultActiveState": "defaultActiveState"; "ignoreDatapointTemplates": "ignoreDatapointTemplates"; "guessDatapointUnit": "guessDatapointUnit"; "allowSearch": "allowSearch"; "hideSelection": "hideSelection"; }, {}, never, never, false>;
50
51
  }
@@ -142,7 +142,7 @@ MillerViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ve
142
142
  useExisting: forwardRef(() => MillerViewComponent),
143
143
  multi: true
144
144
  }
145
- ], viewQueries: [{ propertyName: "millerViewWrapper", first: true, predicate: ["millerViewWrapper"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n #millerViewWrapper\n class=\"miller-view-wrapper\"\n [ngClass]=\"{ 'single-column': config.singleColumn }\"\n>\n <div *ngFor=\"let column of columns; index as i\" class=\"miller-column bg-inherit\">\n <c8y-asset-selector\n [config]=\"config\"\n [index]=\"i\"\n [active]=\"columns[i + 1]\"\n [rootNode]=\"column\"\n [selectedItems]=\"selected || []\"\n [selectedDevice]=\"selectedDevice\"\n (onSelected)=\"onSelectionChange($event)\"\n (onClearSelected)=\"onClearSelected.emit()\"\n (onRowSelected)=\"addNewColumn($event)\"\n (onLoad)=\"onLoad($event)\"\n [container]=\"container\"\n class=\"bg-inherit p-t-4\"\n >\n </c8y-asset-selector>\n\n <div class=\"p-relative p-b-64\" *ngIf=\"isLoading && columnIndex === i && !selectedDevice\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!column.children.length && !isLoading\" class=\"p-l-8 p-r-8\">\n <c8y-ui-empty-state\n *ngIf=\"!filterText; else noSearchResults\"\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'The selected asset has no children.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-template #noSearchResults>\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display for the current filter.' | translate\"\n [subtitle]=\"'There are no assets matching the filter.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i4.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.LoadingComponent, selector: "c8y-loading" }, { kind: "component", type: i6.AssetSelectorComponent, selector: "c8y-asset-selector", inputs: ["config", "active", "index", "asset", "selectedDevice", "selected", "rootNode", "selectedItems", "container"], outputs: ["onSelected", "onClearSelected", "onRowSelected", "onLoad"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] });
145
+ ], viewQueries: [{ propertyName: "millerViewWrapper", first: true, predicate: ["millerViewWrapper"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n #millerViewWrapper\n class=\"miller-view-wrapper\"\n [ngClass]=\"{ 'single-column': config.singleColumn }\"\n>\n <div *ngFor=\"let column of columns; index as i\" class=\"miller-column bg-inherit\">\n <c8y-asset-selector\n [config]=\"config\"\n [index]=\"i\"\n [active]=\"columns[i + 1]\"\n [rootNode]=\"column\"\n [selectedItems]=\"selected || []\"\n [selectedDevice]=\"selectedDevice\"\n (onSelected)=\"onSelectionChange($event)\"\n (onClearSelected)=\"onClearSelected.emit()\"\n (onRowSelected)=\"addNewColumn($event)\"\n (onLoad)=\"onLoad($event)\"\n [container]=\"container\"\n class=\"bg-inherit\"\n >\n </c8y-asset-selector>\n\n <div class=\"p-relative p-b-64\" *ngIf=\"isLoading && columnIndex === i && !selectedDevice\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!column.children.length && !isLoading\" class=\"p-l-8 p-r-8\">\n <c8y-ui-empty-state\n *ngIf=\"!filterText; else noSearchResults\"\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'The selected asset has no children.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-template #noSearchResults>\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display for the current filter.' | translate\"\n [subtitle]=\"'There are no assets matching the filter.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i4.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.LoadingComponent, selector: "c8y-loading" }, { kind: "component", type: i6.AssetSelectorComponent, selector: "c8y-asset-selector", inputs: ["config", "active", "index", "asset", "selectedDevice", "selected", "rootNode", "selectedItems", "container"], outputs: ["onSelected", "onClearSelected", "onRowSelected", "onLoad"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] });
146
146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: MillerViewComponent, decorators: [{
147
147
  type: Component,
148
148
  args: [{ selector: 'c8y-asset-selector-miller', providers: [
@@ -151,7 +151,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
151
151
  useExisting: forwardRef(() => MillerViewComponent),
152
152
  multi: true
153
153
  }
154
- ], template: "<div\n #millerViewWrapper\n class=\"miller-view-wrapper\"\n [ngClass]=\"{ 'single-column': config.singleColumn }\"\n>\n <div *ngFor=\"let column of columns; index as i\" class=\"miller-column bg-inherit\">\n <c8y-asset-selector\n [config]=\"config\"\n [index]=\"i\"\n [active]=\"columns[i + 1]\"\n [rootNode]=\"column\"\n [selectedItems]=\"selected || []\"\n [selectedDevice]=\"selectedDevice\"\n (onSelected)=\"onSelectionChange($event)\"\n (onClearSelected)=\"onClearSelected.emit()\"\n (onRowSelected)=\"addNewColumn($event)\"\n (onLoad)=\"onLoad($event)\"\n [container]=\"container\"\n class=\"bg-inherit p-t-4\"\n >\n </c8y-asset-selector>\n\n <div class=\"p-relative p-b-64\" *ngIf=\"isLoading && columnIndex === i && !selectedDevice\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!column.children.length && !isLoading\" class=\"p-l-8 p-r-8\">\n <c8y-ui-empty-state\n *ngIf=\"!filterText; else noSearchResults\"\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'The selected asset has no children.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-template #noSearchResults>\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display for the current filter.' | translate\"\n [subtitle]=\"'There are no assets matching the filter.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n </div>\n</div>\n" }]
154
+ ], template: "<div\n #millerViewWrapper\n class=\"miller-view-wrapper\"\n [ngClass]=\"{ 'single-column': config.singleColumn }\"\n>\n <div *ngFor=\"let column of columns; index as i\" class=\"miller-column bg-inherit\">\n <c8y-asset-selector\n [config]=\"config\"\n [index]=\"i\"\n [active]=\"columns[i + 1]\"\n [rootNode]=\"column\"\n [selectedItems]=\"selected || []\"\n [selectedDevice]=\"selectedDevice\"\n (onSelected)=\"onSelectionChange($event)\"\n (onClearSelected)=\"onClearSelected.emit()\"\n (onRowSelected)=\"addNewColumn($event)\"\n (onLoad)=\"onLoad($event)\"\n [container]=\"container\"\n class=\"bg-inherit\"\n >\n </c8y-asset-selector>\n\n <div class=\"p-relative p-b-64\" *ngIf=\"isLoading && columnIndex === i && !selectedDevice\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!column.children.length && !isLoading\" class=\"p-l-8 p-r-8\">\n <c8y-ui-empty-state\n *ngIf=\"!filterText; else noSearchResults\"\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'The selected asset has no children.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-template #noSearchResults>\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display for the current filter.' | translate\"\n [subtitle]=\"'There are no assets matching the filter.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n </div>\n</div>\n" }]
155
155
  }], ctorParameters: function () { return [{ type: i1.GroupNodeService }, { type: i2.InventoryService }, { type: i3.AssetSelectorService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
156
156
  type: Input
157
157
  }], asset: [{
@@ -170,4 +170,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
170
170
  }], container: [{
171
171
  type: Input
172
172
  }] } });
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsbGVyLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXNzZXRzLW5hdmlnYXRvci9hc3NldC1zZWxlY3Rvci9taWxsZXItdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9hc3NldHMtbmF2aWdhdG9yL2Fzc2V0LXNlbGVjdG9yL21pbGxlci12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBK0IsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7QUFhekMsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGlCQUFpQjtJQWlEeEQsWUFDWSxnQkFBa0MsRUFDbEMsU0FBMkIsRUFDM0Isb0JBQTBDLEVBQzFDLEVBQXFCO1FBRS9CLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUwvQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFwRGpDOztXQUVHO1FBQ00sV0FBTSxHQUF5QixFQUFFLENBQUM7UUFDM0M7O1dBRUc7UUFDTSxVQUFLLEdBQWdCLFNBQVMsQ0FBQztRQUN4Qzs7V0FFRztRQUNNLG1CQUFjLEdBQW1CLFNBQVMsQ0FBQztRQUtwRDs7V0FFRztRQUNPLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUNyRTs7V0FFRztRQUNPLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUtyRDs7O1dBR0c7UUFDSCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2I7O1dBRUc7UUFDSCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBS1AsY0FBUyxHQUFnQixNQUFNLENBQUM7UUFFekMseUJBQW9CLEdBQXlCO1lBQzNDLElBQUksRUFBRSxRQUFRO1lBQ2QsWUFBWSxFQUFFLEtBQUs7U0FDcEIsQ0FBQztJQVNGLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRS9ELE1BQU0sZ0JBQWdCLEdBQ3BCLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlDO1FBRUQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDbEYsSUFBSSxzQkFBc0IsRUFBRTtZQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBc0I7UUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM5RCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDdkY7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsSUFBSTtRQUNmLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQztRQUN4RCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUN6QjtRQUVELE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNyRSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSw0QkFBNEIsRUFBRTtZQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsRUFBRTtZQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsNERBQTREO1lBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQztZQUNqQixNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdGOzs7O2NBSUU7WUFDRixVQUFVLENBQUM7Z0JBQ1QsTUFBTSxDQUFDLHFCQUFxQixDQUMxQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUMvRCxDQUFDO1lBQ0osQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ1Q7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBSztRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUMzQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQixDQUFDLEtBQWdDO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsT0FBTztTQUNSO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7O2dIQXBKVSxtQkFBbUI7b0dBQW5CLG1CQUFtQiw2UEFSbkI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztZQUNsRCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsOExDN0JILDJtREE2Q0E7MkZEZGEsbUJBQW1CO2tCQVgvQixTQUFTOytCQUNFLDJCQUEyQixhQUUxQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7eU1BTVEsTUFBTTtzQkFBZCxLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUksVUFBVTtzQkFBbkIsTUFBTTtnQkFJRyxlQUFlO3NCQUF4QixNQUFNO2dCQUl5QixpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQWNyQixTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSUlkZW50aWZpZWQsIElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQXNzZXRTZWxlY3RvclNlcnZpY2UgfSBmcm9tICcuL2Fzc2V0LXNlbGVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JvdXBOb2RlU2VydmljZSB9IGZyb20gJy4vZ3JvdXAtbm9kZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFzc2V0U2VsZWN0aW9uQ2hhbmdlRXZlbnQsIEFzc2V0U2VsZWN0b3JPcHRpb25zIH0gZnJvbSAnLi9hc3NldC1zZWxlY3Rvci5tb2RlbCc7XG5pbXBvcnQgeyBBc3NldFNlbGVjdG9yQmFzZSB9IGZyb20gJy4vYXNzZXQtc2VsZWN0b3ItYmFzZSc7XG5pbXBvcnQgeyBHcm91cE5vZGUgfSBmcm9tICcuL2dyb3VwLW5vZGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXNzZXQtc2VsZWN0b3ItbWlsbGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21pbGxlci12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNaWxsZXJWaWV3Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1pbGxlclZpZXdDb21wb25lbnQgZXh0ZW5kcyBBc3NldFNlbGVjdG9yQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBDb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIG9wdGlvbnMgZm9yIHRoZSBhc3NldCBzZWxlY3Rvci5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZzogQXNzZXRTZWxlY3Rvck9wdGlvbnMgPSB7fTtcbiAgLyoqXG4gICAqIFRoZSBhc3NldCB0byB1c2UgYXMgcm9vdC5cbiAgICovXG4gIEBJbnB1dCgpIGFzc2V0OiBJSWRlbnRpZmllZCA9IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzZWxlY3RlZCBkZXZpY2VzLlxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWREZXZpY2U6IElNYW5hZ2VkT2JqZWN0ID0gdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG5vZGUgdG8gdXNlIGFzIHJvb3QuIFlvdSBjYW4gZWl0aGVyIHNldCB0aGlzLCBvciB0aGUgYXNzZXQgdG8gc3RhcnQgZnJvbS5cbiAgICovXG4gIEBJbnB1dCgpIHJvb3ROb2RlOiBHcm91cE5vZGU7XG4gIC8qKlxuICAgKiBFbWl0cyBpZiB0aGUgc2VsZWN0aW9uIGNoYW5nZXNcbiAgICovXG4gIEBPdXRwdXQoKSBvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxBc3NldFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xuICAvKipcbiAgICogRW1pdHMgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBhc3NldCBpcyBjbGVhcmVkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uQ2xlYXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ21pbGxlclZpZXdXcmFwcGVyJykgbWlsbGVyVmlld1dyYXBwZXI6IEVsZW1lbnRSZWY7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGFycmF5IHdpbGwgY29udGFpbiBhbGwgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVzXG4gICAqICB3aGljaCB3aWxsIGZvcm0gdGhlIG1pbGxlciB2aWV3IGNvbHVtbnMgKG9ubHkgb25lIHBlciBsZXZlbCkuXG4gICAqL1xuICBjb2x1bW5zID0gW107XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBmaWx0ZXIgYXBwbGllZC4gVXNlZCBmb3IgdGhlIGVtcHR5IHN0YXRlIHRleHQgaW4gdGhlIHZpZXcuXG4gICAqL1xuICBmaWx0ZXJUZXh0ID0gJyc7XG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgY29sdW1uIHVzZWQgdG8gY2hlY2sgd2hlcmUgdG8gc2hvdyB0aGUgbG9hZGluZyBzdGF0ZS5cbiAgICovXG4gIGNvbHVtbkluZGV4OiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbnRhaW5lcjogJycgfCAnYm9keScgPSAnYm9keSc7XG5cbiAgY29uZmlnT3B0aW9uc0RlZmF1bHQ6IEFzc2V0U2VsZWN0b3JPcHRpb25zID0ge1xuICAgIHZpZXc6ICdtaWxsZXInLFxuICAgIHNpbmdsZUNvbHVtbjogZmFsc2VcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZ3JvdXBOb2RlU2VydmljZTogR3JvdXBOb2RlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgaW52ZW50b3J5OiBJbnZlbnRvcnlTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhc3NldFNlbGVjdG9yU2VydmljZTogQXNzZXRTZWxlY3RvclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcihncm91cE5vZGVTZXJ2aWNlLCBpbnZlbnRvcnksIGFzc2V0U2VsZWN0b3JTZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5jb25maWdPcHRpb25zRGVmYXVsdCwgLi4udGhpcy5jb25maWcgfTtcblxuICAgIGNvbnN0IGlzQW55Tm9kZURlZmluZWQgPVxuICAgICAgIXRoaXMucm9vdE5vZGUgJiYgKCF0aGlzLmFzc2V0IHx8IE9iamVjdC5rZXlzKHRoaXMuYXNzZXQpLmxlbmd0aCA9PT0gMCk7XG4gICAgaWYgKGlzQW55Tm9kZURlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRSb290Tm9kZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzT25seUFzc2V0Tm9kZURlZmluZWQgPSB0aGlzLmFzc2V0ICYmIE9iamVjdC5rZXlzKHRoaXMuYXNzZXQpLmxlbmd0aCAhPT0gMDtcbiAgICBpZiAoaXNPbmx5QXNzZXROb2RlRGVmaW5lZCkge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuYWdlZE9iamVjdFJvb3ROb2RlKHRoaXMuYXNzZXQpO1xuICAgICAgdGhpcy5yb290Tm9kZS5jbGljaygpO1xuICAgIH1cblxuICAgIHRoaXMuY29sdW1ucy5wdXNoKHRoaXMucm9vdE5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5hc3NldCAmJiBjaGFuZ2VzLmFzc2V0LmN1cnJlbnRWYWx1ZSAmJiAhdGhpcy5hc3NldCkge1xuICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaChhd2FpdCB0aGlzLmNyZWF0ZU1hbmFnZWRPYmplY3RSb290Tm9kZShjaGFuZ2VzLmFzc2V0LmN1cnJlbnRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgY29sdW1uIHdpdGggdGhlIHNlbGVjdGVkIG5vZGUgYXMgcm9vdC5cbiAgICovXG4gIGFkZE5ld0NvbHVtbihub2RlKTogdm9pZCB7XG4gICAgY29uc3QgbGV2ZWwgPSBub2RlLmluZGV4O1xuICAgIHRoaXMuc2VsZWN0ZWREZXZpY2UgPSBub2RlLnNlbGVjdGVkRGV2aWNlcyB8fCB1bmRlZmluZWQ7XG4gICAgaWYgKG5vZGUucm9vdCkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiAodGhpcy5taWxsZXJWaWV3V3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwKSk7XG4gICAgICB0aGlzLmNvbHVtbnMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0xldmVsTG93ZXJUaGFuQ29sdW1uTnVtYmVyID0gbGV2ZWwgPCB0aGlzLmNvbHVtbnMubGVuZ3RoIC0gMTtcbiAgICBsZXQgZ29CYWNrID0gZmFsc2U7XG4gICAgaWYgKGlzTGV2ZWxMb3dlclRoYW5Db2x1bW5OdW1iZXIpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5sZW5ndGggPSBsZXZlbCArIDE7XG4gICAgICBnb0JhY2sgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW5vZGUucm9vdCAmJiAhKHRoaXMuY29uZmlnLnNpbmdsZUNvbHVtbiAmJiBnb0JhY2spKSB7XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaChub2RlLm5vZGVDb3B5KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgY29uc3QgY29sID0gdGhpcztcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gKGNvbC5taWxsZXJWaWV3V3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSA1MDAwMCkpO1xuICAgICAgLyogdHJpZ2dlcmVkIHR3aWNlIHdpdGggYSBzbWFsbCBkZWxheSBhcyBhIHdvcmthcm91bmQgZm9yIGRlYWxpbmcgd2l0aCBTYWZhcmkncyBidWc6XG4gICAgICAgXCJTYWZhcmkgZG9lc27igJl0IHVwZGF0ZSB0aGUgc2Nyb2xsVG9wIC8gc2Nyb2xsTGVmdCBwcm9wZXJ0aWVzIG9mIGFuIGVsZW1lbnQgaXRzIGFueSBvZiBpdHNcbiAgICAgICAgYW5jZXN0b3JzIGhhcyBvdmVyZmxvdyBzZXQgdG8gaGlkZGVuLlwiXG4gICAgICAgIFRoaXMgd2FzIHJlcG9ydGVkIG9uIGN1c3RvbWVyIHBvcnRhbCB3aXRoIHRoZSB0aWNrZXQgU0ktNDg4NTczXG4gICAgICAqL1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICAgKCkgPT4gKGNvbC5taWxsZXJWaWV3V3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSA1NTAwMClcbiAgICAgICAgKTtcbiAgICAgIH0sIDcwMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGUgYXNzZXQgc2VsZWN0b3IuXG4gICAqL1xuICBvbkxvYWQoZXZlbnQpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGV2ZW50LmxvYWRpbmc7XG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gZXZlbnQuZmlsdGVyVGV4dDtcbiAgICB0aGlzLmNvbHVtbkluZGV4ID0gZXZlbnQuaW5kZXg7XG4gICAgdGhpcy5zZWxlY3RlZERldmljZSA9IGV2ZW50LnNlbGVjdGVkRGV2aWNlO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgc2VsZWN0ZWQgbm9kZSB0byB0aGUgc2VsZWN0ZWQgYXJyYXkuXG4gICAqL1xuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogQXNzZXRTZWxlY3Rpb25DaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcubXVsdGkpIHtcbiAgICAgIHRoaXMuZGVzZWxlY3RBbGwoZXZlbnQuY2hhbmdlLml0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY2hhbmdlLmlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0KGV2ZW50LmNoYW5nZS5pdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZXNlbGVjdChldmVudC5jaGFuZ2UuaXRlbSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI21pbGxlclZpZXdXcmFwcGVyXG4gIGNsYXNzPVwibWlsbGVyLXZpZXctd3JhcHBlclwiXG4gIFtuZ0NsYXNzXT1cInsgJ3NpbmdsZS1jb2x1bW4nOiBjb25maWcuc2luZ2xlQ29sdW1uIH1cIlxuPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgaW5kZXggYXMgaVwiIGNsYXNzPVwibWlsbGVyLWNvbHVtbiBiZy1pbmhlcml0XCI+XG4gICAgPGM4eS1hc3NldC1zZWxlY3RvclxuICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgW2FjdGl2ZV09XCJjb2x1bW5zW2kgKyAxXVwiXG4gICAgICBbcm9vdE5vZGVdPVwiY29sdW1uXCJcbiAgICAgIFtzZWxlY3RlZEl0ZW1zXT1cInNlbGVjdGVkIHx8IFtdXCJcbiAgICAgIFtzZWxlY3RlZERldmljZV09XCJzZWxlY3RlZERldmljZVwiXG4gICAgICAob25TZWxlY3RlZCk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChvbkNsZWFyU2VsZWN0ZWQpPVwib25DbGVhclNlbGVjdGVkLmVtaXQoKVwiXG4gICAgICAob25Sb3dTZWxlY3RlZCk9XCJhZGROZXdDb2x1bW4oJGV2ZW50KVwiXG4gICAgICAob25Mb2FkKT1cIm9uTG9hZCgkZXZlbnQpXCJcbiAgICAgIFtjb250YWluZXJdPVwiY29udGFpbmVyXCJcbiAgICAgIGNsYXNzPVwiYmctaW5oZXJpdCBwLXQtNFwiXG4gICAgPlxuICAgIDwvYzh5LWFzc2V0LXNlbGVjdG9yPlxuXG4gICAgPGRpdiBjbGFzcz1cInAtcmVsYXRpdmUgcC1iLTY0XCIgKm5nSWY9XCJpc0xvYWRpbmcgJiYgY29sdW1uSW5kZXggPT09IGkgJiYgIXNlbGVjdGVkRGV2aWNlXCI+XG4gICAgICA8Yzh5LWxvYWRpbmc+PC9jOHktbG9hZGluZz5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmNoaWxkcmVuLmxlbmd0aCAmJiAhaXNMb2FkaW5nXCIgY2xhc3M9XCJwLWwtOCBwLXItOFwiPlxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICAqbmdJZj1cIiFmaWx0ZXJUZXh0OyBlbHNlIG5vU2VhcmNoUmVzdWx0c1wiXG4gICAgICAgIFtpY29uXT1cIidmb2xkZXItb3BlbidcIlxuICAgICAgICBbdGl0bGVdPVwiJ05vIHJlc3VsdHMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIidUaGUgc2VsZWN0ZWQgYXNzZXQgaGFzIG5vIGNoaWxkcmVuLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9TZWFyY2hSZXN1bHRzPlxuICAgICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgICAgW2ljb25dPVwiJ2ZvbGRlci1vcGVuJ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIidObyByZXN1bHRzIHRvIGRpc3BsYXkgZm9yIHRoZSBjdXJyZW50IGZpbHRlci4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbc3VidGl0bGVdPVwiJ1RoZXJlIGFyZSBubyBhc3NldHMgbWF0Y2hpbmcgdGhlIGZpbHRlci4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsbGVyLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXNzZXRzLW5hdmlnYXRvci9hc3NldC1zZWxlY3Rvci9taWxsZXItdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9hc3NldHMtbmF2aWdhdG9yL2Fzc2V0LXNlbGVjdG9yL21pbGxlci12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBK0IsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7QUFhekMsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGlCQUFpQjtJQWlEeEQsWUFDWSxnQkFBa0MsRUFDbEMsU0FBMkIsRUFDM0Isb0JBQTBDLEVBQzFDLEVBQXFCO1FBRS9CLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUwvQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFwRGpDOztX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LEtBQUssRUFBRTtZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsT0FBTztTQUNSO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7O2dIQXBKVSxtQkFBbUI7b0dBQW5CLG1CQUFtQiw2UEFSbkI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztZQUNsRCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsOExDN0JILHFtREE2Q0E7MkZEZGEsbUJBQW1CO2tCQVgvQixTQUFTOytCQUNFLDJCQUEyQixhQUUxQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7eU1BTVEsTUFBTTtzQkFBZCxLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUksVUFBVTtzQkFBbkIsTUFBTTtnQkFJRyxlQUFlO3NCQUF4QixNQUFNO2dCQUl5QixpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQWNyQixTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSUlkZW50aWZpZWQsIElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQXNzZXRTZWxlY3RvclNlcnZpY2UgfSBmcm9tICcuL2Fzc2V0LXNlbGVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JvdXBOb2RlU2VydmljZSB9IGZyb20gJy4vZ3JvdXAtbm9kZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFzc2V0U2VsZWN0aW9uQ2hhbmdlRXZlbnQsIEFzc2V0U2VsZWN0b3JPcHRpb25zIH0gZnJvbSAnLi9hc3NldC1zZWxlY3Rvci5tb2RlbCc7XG5pbXBvcnQgeyBBc3NldFNlbGVjdG9yQmFzZSB9IGZyb20gJy4vYXNzZXQtc2VsZWN0b3ItYmFzZSc7XG5pbXBvcnQgeyBHcm91cE5vZGUgfSBmcm9tICcuL2dyb3VwLW5vZGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXNzZXQtc2VsZWN0b3ItbWlsbGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21pbGxlci12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNaWxsZXJWaWV3Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1pbGxlclZpZXdDb21wb25lbnQgZXh0ZW5kcyBBc3NldFNlbGVjdG9yQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBDb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIG9wdGlvbnMgZm9yIHRoZSBhc3NldCBzZWxlY3Rvci5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZzogQXNzZXRTZWxlY3Rvck9wdGlvbnMgPSB7fTtcbiAgLyoqXG4gICAqIFRoZSBhc3NldCB0byB1c2UgYXMgcm9vdC5cbiAgICovXG4gIEBJbnB1dCgpIGFzc2V0OiBJSWRlbnRpZmllZCA9IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzZWxlY3RlZCBkZXZpY2VzLlxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWREZXZpY2U6IElNYW5hZ2VkT2JqZWN0ID0gdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG5vZGUgdG8gdXNlIGFzIHJvb3QuIFlvdSBjYW4gZWl0aGVyIHNldCB0aGlzLCBvciB0aGUgYXNzZXQgdG8gc3RhcnQgZnJvbS5cbiAgICovXG4gIEBJbnB1dCgpIHJvb3ROb2RlOiBHcm91cE5vZGU7XG4gIC8qKlxuICAgKiBFbWl0cyBpZiB0aGUgc2VsZWN0aW9uIGNoYW5nZXNcbiAgICovXG4gIEBPdXRwdXQoKSBvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxBc3NldFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xuICAvKipcbiAgICogRW1pdHMgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBhc3NldCBpcyBjbGVhcmVkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uQ2xlYXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ21pbGxlclZpZXdXcmFwcGVyJykgbWlsbGVyVmlld1dyYXBwZXI6IEVsZW1lbnRSZWY7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGFycmF5IHdpbGwgY29udGFpbiBhbGwgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVzXG4gICAqICB3aGljaCB3aWxsIGZvcm0gdGhlIG1pbGxlciB2aWV3IGNvbHVtbnMgKG9ubHkgb25lIHBlciBsZXZlbCkuXG4gICAqL1xuICBjb2x1bW5zID0gW107XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBmaWx0ZXIgYXBwbGllZC4gVXNlZCBmb3IgdGhlIGVtcHR5IHN0YXRlIHRleHQgaW4gdGhlIHZpZXcuXG4gICAqL1xuICBmaWx0ZXJUZXh0ID0gJyc7XG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgY29sdW1uIHVzZWQgdG8gY2hlY2sgd2hlcmUgdG8gc2hvdyB0aGUgbG9hZGluZyBzdGF0ZS5cbiAgICovXG4gIGNvbHVtbkluZGV4OiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbnRhaW5lcjogJycgfCAnYm9keScgPSAnYm9keSc7XG5cbiAgY29uZmlnT3B0aW9uc0RlZmF1bHQ6IEFzc2V0U2VsZWN0b3JPcHRpb25zID0ge1xuICAgIHZpZXc6ICdtaWxsZXInLFxuICAgIHNpbmdsZUNvbHVtbjogZmFsc2VcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZ3JvdXBOb2RlU2VydmljZTogR3JvdXBOb2RlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgaW52ZW50b3J5OiBJbnZlbnRvcnlTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhc3NldFNlbGVjdG9yU2VydmljZTogQXNzZXRTZWxlY3RvclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcihncm91cE5vZGVTZXJ2aWNlLCBpbnZlbnRvcnksIGFzc2V0U2VsZWN0b3JTZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5jb25maWdPcHRpb25zRGVmYXVsdCwgLi4udGhpcy5jb25maWcgfTtcblxuICAgIGNvbnN0IGlzQW55Tm9kZURlZmluZWQgPVxuICAgICAgIXRoaXMucm9vdE5vZGUgJiYgKCF0aGlzLmFzc2V0IHx8IE9iamVjdC5rZXlzKHRoaXMuYXNzZXQpLmxlbmd0aCA9PT0gMCk7XG4gICAgaWYgKGlzQW55Tm9kZURlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRSb290Tm9kZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzT25seUFzc2V0Tm9kZURlZmluZWQgPSB0aGlzLmFzc2V0ICYmIE9iamVjdC5rZXlzKHRoaXMuYXNzZXQpLmxlbmd0aCAhPT0gMDtcbiAgICBpZiAoaXNPbmx5QXNzZXROb2RlRGVmaW5lZCkge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuYWdlZE9iamVjdFJvb3ROb2RlKHRoaXMuYXNzZXQpO1xuICAgICAgdGhpcy5yb290Tm9kZS5jbGljaygpO1xuICAgIH1cblxuICAgIHRoaXMuY29sdW1ucy5wdXNoKHRoaXMucm9vdE5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5hc3NldCAmJiBjaGFuZ2VzLmFzc2V0LmN1cnJlbnRWYWx1ZSAmJiAhdGhpcy5hc3NldCkge1xuICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaChhd2FpdCB0aGlzLmNyZWF0ZU1hbmFnZWRPYmplY3RSb290Tm9kZShjaGFuZ2VzLmFzc2V0LmN1cnJlbnRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgY29sdW1uIHdpdGggdGhlIHNlbGVjdGVkIG5vZGUgYXMgcm9vdC5cbiAgICovXG4gIGFkZE5ld0NvbHVtbihub2RlKTogdm9pZCB7XG4gICAgY29uc3QgbGV2ZWwgPSBub2RlLmluZGV4O1xuICAgIHRoaXMuc2VsZWN0ZWREZXZpY2UgPSBub2RlLnNlbGVjdGVkRGV2aWNlcyB8fCB1bmRlZmluZWQ7XG4gICAgaWYgKG5vZGUucm9vdCkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiAodGhpcy5taWxsZXJWaWV3V3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwKSk7XG4gICAgICB0aGlzLmNvbHVtbnMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0xldmVsTG93ZXJUaGFuQ29sdW1uTnVtYmVyID0gbGV2ZWwgPCB0aGlzLmNvbHVtbnMubGVuZ3RoIC0gMTtcbiAgICBsZXQgZ29CYWNrID0gZmFsc2U7XG4gICAgaWYgKGlzTGV2ZWxMb3dlclRoYW5Db2x1bW5OdW1iZXIpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5sZW5ndGggPSBsZXZlbCArIDE7XG4gICAgICBnb0JhY2sgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW5vZGUucm9vdCAmJiAhKHRoaXMuY29uZmlnLnNpbmdsZUNvbHVtbiAmJiBnb0JhY2spKSB7XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaChub2RlLm5vZGVDb3B5KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgY29uc3QgY29sID0gdGhpcztcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gKGNvbC5taWxsZXJWaWV3V3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSA1MDAwMCkpO1xuICAgICAgLyogdHJpZ2dlcmVkIHR3aWNlIHdpdGggYSBzbWFsbCBkZWxheSBhcyBhIHdvcmthcm91bmQgZm9yIGRlYWxpbmcgd2l0aCBTYWZhcmkncyBidWc6XG4gICAgICAgXCJTYWZhcmkgZG9lc27igJl0IHVwZGF0ZSB0aGUgc2Nyb2xsVG9wIC8gc2Nyb2xsTGVmdCBwcm9wZXJ0aWVzIG9mIGFuIGVsZW1lbnQgaXRzIGFueSBvZiBpdHNcbiAgICAgICAgYW5jZXN0b3JzIGhhcyBvdmVyZmxvdyBzZXQgdG8gaGlkZGVuLlwiXG4gICAgICAgIFRoaXMgd2FzIHJlcG9ydGVkIG9uIGN1c3RvbWVyIHBvcnRhbCB3aXRoIHRoZSB0aWNrZXQgU0ktNDg4NTczXG4gICAgICAqL1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICAgKCkgPT4gKGNvbC5taWxsZXJWaWV3V3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSA1NTAwMClcbiAgICAgICAgKTtcbiAgICAgIH0sIDcwMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGUgYXNzZXQgc2VsZWN0b3IuXG4gICAqL1xuICBvbkxvYWQoZXZlbnQpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGV2ZW50LmxvYWRpbmc7XG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gZXZlbnQuZmlsdGVyVGV4dDtcbiAgICB0aGlzLmNvbHVtbkluZGV4ID0gZXZlbnQuaW5kZXg7XG4gICAgdGhpcy5zZWxlY3RlZERldmljZSA9IGV2ZW50LnNlbGVjdGVkRGV2aWNlO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgc2VsZWN0ZWQgbm9kZSB0byB0aGUgc2VsZWN0ZWQgYXJyYXkuXG4gICAqL1xuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogQXNzZXRTZWxlY3Rpb25DaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcubXVsdGkpIHtcbiAgICAgIHRoaXMuZGVzZWxlY3RBbGwoZXZlbnQuY2hhbmdlLml0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY2hhbmdlLmlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0KGV2ZW50LmNoYW5nZS5pdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZXNlbGVjdChldmVudC5jaGFuZ2UuaXRlbSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI21pbGxlclZpZXdXcmFwcGVyXG4gIGNsYXNzPVwibWlsbGVyLXZpZXctd3JhcHBlclwiXG4gIFtuZ0NsYXNzXT1cInsgJ3NpbmdsZS1jb2x1bW4nOiBjb25maWcuc2luZ2xlQ29sdW1uIH1cIlxuPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgaW5kZXggYXMgaVwiIGNsYXNzPVwibWlsbGVyLWNvbHVtbiBiZy1pbmhlcml0XCI+XG4gICAgPGM4eS1hc3NldC1zZWxlY3RvclxuICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgW2luZGV4XT1cImlcIlxuICAgICAgW2FjdGl2ZV09XCJjb2x1bW5zW2kgKyAxXVwiXG4gICAgICBbcm9vdE5vZGVdPVwiY29sdW1uXCJcbiAgICAgIFtzZWxlY3RlZEl0ZW1zXT1cInNlbGVjdGVkIHx8IFtdXCJcbiAgICAgIFtzZWxlY3RlZERldmljZV09XCJzZWxlY3RlZERldmljZVwiXG4gICAgICAob25TZWxlY3RlZCk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChvbkNsZWFyU2VsZWN0ZWQpPVwib25DbGVhclNlbGVjdGVkLmVtaXQoKVwiXG4gICAgICAob25Sb3dTZWxlY3RlZCk9XCJhZGROZXdDb2x1bW4oJGV2ZW50KVwiXG4gICAgICAob25Mb2FkKT1cIm9uTG9hZCgkZXZlbnQpXCJcbiAgICAgIFtjb250YWluZXJdPVwiY29udGFpbmVyXCJcbiAgICAgIGNsYXNzPVwiYmctaW5oZXJpdFwiXG4gICAgPlxuICAgIDwvYzh5LWFzc2V0LXNlbGVjdG9yPlxuXG4gICAgPGRpdiBjbGFzcz1cInAtcmVsYXRpdmUgcC1iLTY0XCIgKm5nSWY9XCJpc0xvYWRpbmcgJiYgY29sdW1uSW5kZXggPT09IGkgJiYgIXNlbGVjdGVkRGV2aWNlXCI+XG4gICAgICA8Yzh5LWxvYWRpbmc+PC9jOHktbG9hZGluZz5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmNoaWxkcmVuLmxlbmd0aCAmJiAhaXNMb2FkaW5nXCIgY2xhc3M9XCJwLWwtOCBwLXItOFwiPlxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICAqbmdJZj1cIiFmaWx0ZXJUZXh0OyBlbHNlIG5vU2VhcmNoUmVzdWx0c1wiXG4gICAgICAgIFtpY29uXT1cIidmb2xkZXItb3BlbidcIlxuICAgICAgICBbdGl0bGVdPVwiJ05vIHJlc3VsdHMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIidUaGUgc2VsZWN0ZWQgYXNzZXQgaGFzIG5vIGNoaWxkcmVuLicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9TZWFyY2hSZXN1bHRzPlxuICAgICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgICAgW2ljb25dPVwiJ2ZvbGRlci1vcGVuJ1wiXG4gICAgICAgICAgW3RpdGxlXT1cIidObyByZXN1bHRzIHRvIGRpc3BsYXkgZm9yIHRoZSBjdXJyZW50IGZpbHRlci4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbc3VidGl0bGVdPVwiJ1RoZXJlIGFyZSBubyBhc3NldHMgbWF0Y2hpbmcgdGhlIGZpbHRlci4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -227,12 +227,12 @@ export class WidgetConfigComponent {
227
227
  }
228
228
  }
229
229
  WidgetConfigComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WidgetConfigComponent, deps: [{ token: i1.WidgetService }, { token: i2.BsModalRef }, { token: i3.InventoryService }, { token: i4.ContextDashboardService }], target: i0.ɵɵFactoryTarget.Component });
230
- WidgetConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: WidgetConfigComponent, selector: "c8y-widget-config", viewQueries: [{ propertyName: "dynamicComponent", first: true, predicate: ["config"], descendants: true }], ngImport: i0, template: "<div class=\"modal-header separator\">\n <div\n id=\"modal-title\"\n class=\"h3\"\n title=\"{{ 'Add widget' | translate }}\"\n *ngIf=\"!current\"\n translate\n >\n Add widget\n </div>\n <div\n id=\"modal-title\"\n class=\"h3\"\n title=\"{{ 'Edit widget' | translate }}\"\n *ngIf=\"current\"\n translate\n >\n Edit widget\n </div>\n</div>\n<form #configForm=\"ngForm\" name=\"form\">\n <div class=\"c8y-modal-tabs\" id=\"modal-body\">\n <div class=\"tabContainer\">\n <ul class=\"nav nav-tabs nav-tabsc8y p-l-24\">\n <li [class.active]=\"mode === 'select'\">\n <button\n title=\"{{ 'Select widget' | translate }}\"\n type=\"button\"\n class=\"btn\"\n (click)=\"changeMode('select'); (false)\"\n >\n <i c8yIcon=\"th-large\"></i>\n <span translate>Select widget</span>\n </button>\n </li>\n <li [class.active]=\"mode === 'config'\">\n <button\n title=\"{{ 'Configuration' | translate }}\"\n type=\"button\"\n class=\"btn\"\n [disabled]=\"!selected\"\n (click)=\"changeMode('config'); (false)\"\n >\n <i c8yIcon=\"cog\"></i>\n <span translate>Configuration</span>\n </button>\n </li>\n <li [class.active]=\"mode === 'style'\">\n <button\n title=\"{{ 'Appearance' | translate }}\"\n type=\"button\"\n class=\"btn\"\n [disabled]=\"!selected\"\n (click)=\"changeMode('style'); (false)\"\n >\n <i c8yIcon=\"paint-brush\"></i>\n <span translate>Appearance</span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"modal-inner-scroll modal-inner-scroll--fixed\">\n <div\n *ngIf=\"mode === 'select'\"\n class=\"bg-level-0 p-l-24 p-r-24 p-t-8 p-b-8 sticky-header-top-0\"\n style=\"z-index: 2\"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <div class=\"input-group input-group-search\">\n <input\n [attr.aria-label]=\"'Search' | translate\"\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"text\"\n [(ngModel)]=\"searchTerm\"\n [ngModelOptions]=\"{ standalone: true }\"\n (keydown)=\"searchChange$.next($event)\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n (click)=\"resetSearch()\"\n >\n <i [c8yIcon]=\"searchTerm.length === 0 ? 'search' : 'close'\"></i>\n </button>\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal-body bg-level-2\" *ngIf=\"mode === 'select'\">\n <div class=\"card-group card-select m-b-0\">\n <div\n class=\"col-md-3 col-sm-4 col-xs-6\"\n *ngFor=\"let cmp of searchResult || components\"\n title=\"{{ cmp.description | translate }}\"\n >\n <button\n type=\"button\"\n class=\"btn-clean card p-8\"\n [class.active]=\"selected === cmp\"\n (click)=\"select(cmp)\"\n >\n <div class=\"text-center p-8 m-b-8 d-col flex-center bg-level-2\" role=\"presentation\">\n <ng-container *ngIf=\"!cmp.previewImage; else previewImage\">\n <div class=\"h1\"><i c8yIcon=\"file-image-o\"></i></div>\n <small translate>Preview not available</small>\n </ng-container>\n <ng-template #previewImage>\n <img class=\"img-responsive\" alt=\"\" [src]=\"cmp.previewImage\" />\n </ng-template>\n </div>\n <p class=\"card-title text-truncate\">\n <c8y-highlight\n text=\"{{ cmp.label | translate }}\"\n [pattern]=\"searchTerm\"\n ></c8y-highlight>\n </p>\n </button>\n </div>\n\n <div class=\"c8y-empty-state text-center\" *ngIf=\"searchResult && searchResult.length === 0\">\n <div class=\"h1\" c8yIcon=\"search\"></div>\n <h3 translate>No widgets found.</h3>\n <div class=\"d-flex\">\n <p translate class=\"m-r-8\">Rephrase your search term.</p>\n <button\n title=\"{{ 'Reset search' | translate }}\"\n class=\"btn btn-primary\"\n type=\"button\"\n (click)=\"resetSearch()\"\n >\n {{ 'Reset search' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- The following is intentional set to hidden to allow the ViewChild ref in the controller -->\n <div *ngIf=\"selected\" [ngClass]=\"{ hidden: mode !== 'config' }\" class=\"d-flex d-col fit-h\">\n <div class=\"p-t-16 flex-no-shrink separator-bottom p-b-16\">\n <div class=\"row\">\n <div class=\"col-sm-4\">\n <div class=\"p-l-24\">\n <div class=\"text-left text-medium h4\">\n {{ selected.label | translate }}\n </div>\n <p>\n {{ selected.description | translate }}\n </p>\n </div>\n </div>\n <div class=\"col-sm-8\">\n <div class=\"p-r-24\">\n <c8y-form-group>\n <label for=\"widgetTitle\" translate>Title</label>\n <input\n id=\"widgetTitle\"\n [(ngModel)]=\"selected.data.title\"\n type=\"text\"\n name=\"title\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} {{ componentLabel | translate }}\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row flex-grow\" [ngClass]=\"{ 'd-flex': widgetConfig.options || hasConfig() }\">\n <div\n *ngIf=\"!widgetConfig.settings?.noDeviceTarget\"\n class=\"a-s-stretch\"\n [ngClass]=\"{\n 'bg-level-1 col-sm-4 p-r-0': hasConfig(),\n 'bg-level-0 col-sm-12': !hasConfig()\n }\"\n >\n <div class=\"fit-h bg-inherit p-l-16\" [ngClass]=\"{ 'p-r-24': !hasConfig() }\">\n <div class=\"p-relative bg-inherit\">\n <c8y-asset-selector-miller\n (onSelected)=\"selectionChanged($event)\"\n (onClearSelected)=\"selectionChanged()\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: this.widgetConfig.settings?.groupsSelectable,\n showChildDevices: true,\n columnHeaders: true,\n showUnassignedDevices: true,\n search: !this.widgetConfig.settings.context?.additionParents,\n showFilter: true,\n singleColumn: !!this.hasConfig()\n }\"\n [asset]=\"widgetConfig.settings?.context\"\n [selectedDevice]=\"selectedDevice\"\n class=\"d-block bg-inherit p-relative\"\n style=\"height: calc(100vh - 406px)\"\n ></c8y-asset-selector-miller>\n </div>\n </div>\n </div>\n <div\n [ngClass]=\"{\n 'col-sm-8': !widgetConfig.settings?.noDeviceTarget,\n 'col-sm-12': widgetConfig.settings?.noDeviceTarget,\n 'sr-only': !hasConfig()\n }\"\n >\n <c8y-dynamic-component\n class=\"d-block\"\n [ngClass]=\"{ 'inner-scroll p-r-24': !widgetConfig.settings?.noDeviceTarget }\"\n style=\"{{ hasConfig() ? 'height: calc(100vh - 406px);' : 'height: 0;' }}\"\n [componentId]=\"selected.id\"\n mode=\"config\"\n [config]=\"widgetConfig\"\n [notFoundError]=\"false\"\n #config\n ></c8y-dynamic-component>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"mode === 'style'\" class=\"modal-body p-t-0\" style=\"height: calc(100vh - 310px)\">\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <c8y-appearance-settings\n [(themeClass)]=\"styling.contentClass\"\n [(headerClass)]=\"styling.headerClass\"\n [possibleStylingTheme]=\"possibleStyling.WIDGET_CONTENT_CLASSES\"\n [possibleStylingHeader]=\"possibleStyling.WIDGET_HEADER_CLASSES\"\n [defaultThemeClass]=\"defaultStyling.contentClass\"\n [defaultHeaderClass]=\"defaultStyling.headerClass\"\n ></c8y-appearance-settings>\n </div>\n <div class=\"col-xs-6 sticky-header-top-0\">\n <c8y-widget-preview\n [previewClasses]=\"getStyle(true)\"\n style=\"height: calc(100vh - 382px)\"\n ></c8y-widget-preview>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"\n contextDashboardService.formDisabled || configForm.invalid || checkIfDeviceRequired()\n \"\n c8yProductExperience\n [actionName]=\"current ? 'editWidget' : 'createWidget'\"\n [actionData]=\"{ widgetName: selected && selected.id }\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i5.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i5.DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "directive", type: i5.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: i8.MillerViewComponent, selector: "c8y-asset-selector-miller", inputs: ["config", "asset", "selectedDevice", "rootNode", "container"], outputs: ["onSelected", "onClearSelected"] }, { kind: "component", type: i9.AppearanceSettingsComponent, selector: "c8y-appearance-settings", inputs: ["themeClass", "headerClass", "defaultThemeClass", "defaultHeaderClass", "possibleStylingTheme", "possibleStylingHeader"], outputs: ["themeClassChange", "headerClassChange"] }, { kind: "component", type: i10.WidgetPreviewComponent, selector: "c8y-widget-preview", inputs: ["previewClasses", "tab"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }] });
230
+ WidgetConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: WidgetConfigComponent, selector: "c8y-widget-config", viewQueries: [{ propertyName: "dynamicComponent", first: true, predicate: ["config"], descendants: true }], ngImport: i0, template: "<div class=\"modal-header separator\">\n <div\n class=\"h3\"\n title=\"{{ 'Add widget' | translate }}\"\n id=\"modal-title\"\n *ngIf=\"!current\"\n translate\n >\n Add widget\n </div>\n <div\n class=\"h3\"\n title=\"{{ 'Edit widget' | translate }}\"\n id=\"modal-title\"\n *ngIf=\"current\"\n translate\n >\n Edit widget\n </div>\n</div>\n<form name=\"form\" #configForm=\"ngForm\">\n <div class=\"c8y-modal-tabs\" id=\"modal-body\">\n <div class=\"tabContainer\">\n <ul class=\"nav nav-tabs nav-tabsc8y p-l-24\">\n <li [class.active]=\"mode === 'select'\">\n <button\n class=\"btn\"\n type=\"button\"\n title=\"{{ 'Select widget' | translate }}\"\n (click)=\"changeMode('select'); (false)\"\n >\n <i c8yIcon=\"th-large\"></i>\n <span translate>Select widget</span>\n </button>\n </li>\n <li [class.active]=\"mode === 'config'\">\n <button\n class=\"btn\"\n type=\"button\"\n title=\"{{ 'Configuration' | translate }}\"\n [disabled]=\"!selected\"\n (click)=\"changeMode('config'); (false)\"\n >\n <i c8yIcon=\"cog\"></i>\n <span translate>Configuration</span>\n </button>\n </li>\n <li [class.active]=\"mode === 'style'\">\n <button\n class=\"btn\"\n type=\"button\"\n title=\"{{ 'Appearance' | translate }}\"\n [disabled]=\"!selected\"\n (click)=\"changeMode('style'); (false)\"\n >\n <i c8yIcon=\"paint-brush\"></i>\n <span translate>Appearance</span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"modal-inner-scroll modal-inner-scroll--fixed\">\n <div\n class=\"bg-level-0 p-l-24 p-r-24 p-t-8 p-b-8 sticky-header-top-0\"\n style=\"z-index: 2\"\n *ngIf=\"mode === 'select'\"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n data-cy=\"widget-config--Search\"\n type=\"text\"\n [attr.aria-label]=\"'Search' | translate\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n [(ngModel)]=\"searchTerm\"\n [ngModelOptions]=\"{ standalone: true }\"\n (keydown)=\"searchChange$.next($event)\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n type=\"button\"\n title=\"{{ 'Search' | translate }}\"\n (click)=\"resetSearch()\"\n >\n <i [c8yIcon]=\"searchTerm.length === 0 ? 'search' : 'close'\"></i>\n </button>\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal-body bg-level-2\" *ngIf=\"mode === 'select'\">\n <div class=\"card-group card-select m-b-0\">\n <div\n class=\"col-md-3 col-sm-4 col-xs-6\"\n title=\"{{ cmp.description | translate }}\"\n *ngFor=\"let cmp of searchResult || components\"\n >\n <button\n class=\"btn-clean card p-8\"\n type=\"button\"\n [class.active]=\"selected === cmp\"\n (click)=\"select(cmp)\"\n >\n <div class=\"text-center p-8 m-b-8 d-col flex-center bg-level-2\" role=\"presentation\">\n <ng-container *ngIf=\"!cmp.previewImage; else previewImage\">\n <div class=\"h1\"><i c8yIcon=\"file-image-o\"></i></div>\n <small translate>Preview not available</small>\n </ng-container>\n <ng-template #previewImage>\n <img class=\"img-responsive\" alt [src]=\"cmp.previewImage\" />\n </ng-template>\n </div>\n <p class=\"card-title text-truncate\">\n <c8y-highlight\n text=\"{{ cmp.label | translate }}\"\n [pattern]=\"searchTerm\"\n ></c8y-highlight>\n </p>\n </button>\n </div>\n\n <div class=\"c8y-empty-state text-center\" *ngIf=\"searchResult && searchResult.length === 0\">\n <div class=\"h1\" c8yIcon=\"search\"></div>\n <h3 translate>No widgets found.</h3>\n <div class=\"d-flex\">\n <p class=\"m-r-8\" translate>Rephrase your search term.</p>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Reset search' | translate }}\"\n (click)=\"resetSearch()\"\n >\n {{ 'Reset search' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- The following is intentional set to hidden to allow the ViewChild ref in the controller -->\n <div class=\"d-flex d-col fit-h\" *ngIf=\"selected\" [ngClass]=\"{ hidden: mode !== 'config' }\">\n <div class=\"p-t-16 flex-no-shrink separator-bottom p-b-16\">\n <div class=\"row\">\n <div class=\"col-sm-4\">\n <div class=\"p-l-24\">\n <div class=\"text-left text-medium h4\">\n {{ selected.label | translate }}\n </div>\n <p>\n {{ selected.description | translate }}\n </p>\n </div>\n </div>\n <div class=\"col-sm-8\">\n <div class=\"p-r-24\">\n <c8y-form-group>\n <label for=\"widgetTitle\" translate>Title</label>\n <input\n class=\"form-control\"\n type=\"text\"\n id=\"widgetTitle\"\n name=\"title\"\n [(ngModel)]=\"selected.data.title\"\n placeholder=\"{{ 'e.g.' | translate }} {{ componentLabel | translate }}\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row flex-grow\" [ngClass]=\"{ 'd-flex': widgetConfig.options || hasConfig() }\">\n <div\n class=\"a-s-stretch\"\n *ngIf=\"!widgetConfig.settings?.noDeviceTarget\"\n [ngClass]=\"{\n 'bg-level-1 col-sm-4 p-r-0': hasConfig(),\n 'bg-level-0 col-sm-12': !hasConfig()\n }\"\n >\n <div class=\"fit-h bg-inherit p-l-16\" [ngClass]=\"{ 'p-r-24': !hasConfig() }\">\n <div class=\"p-relative bg-inherit\">\n <c8y-asset-selector-miller\n class=\"d-block bg-inherit p-relative\"\n style=\"height: calc(100vh - 422px)\"\n (onSelected)=\"selectionChanged($event)\"\n (onClearSelected)=\"selectionChanged()\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: this.widgetConfig.settings?.groupsSelectable,\n showChildDevices: true,\n columnHeaders: true,\n showUnassignedDevices: true,\n search: !this.widgetConfig.settings.context?.additionParents,\n showFilter: true,\n singleColumn: !!this.hasConfig()\n }\"\n [asset]=\"widgetConfig.settings?.context\"\n [selectedDevice]=\"selectedDevice\"\n ></c8y-asset-selector-miller>\n </div>\n </div>\n </div>\n <div\n [ngClass]=\"{\n 'col-sm-8': !widgetConfig.settings?.noDeviceTarget,\n 'col-sm-12': widgetConfig.settings?.noDeviceTarget,\n 'sr-only': !hasConfig()\n }\"\n >\n <c8y-dynamic-component\n class=\"d-block\"\n style=\"height: {{ hasConfig() ? 'calc(100vh - 422px)' : '0' }}\"\n [ngClass]=\"{ 'inner-scroll p-r-24': !widgetConfig.settings?.noDeviceTarget }\"\n [componentId]=\"selected.id\"\n mode=\"config\"\n [config]=\"widgetConfig\"\n [notFoundError]=\"false\"\n #config\n ></c8y-dynamic-component>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body p-t-0\" style=\"height: calc(100vh - 310px)\" *ngIf=\"mode === 'style'\">\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <c8y-appearance-settings\n [(themeClass)]=\"styling.contentClass\"\n [(headerClass)]=\"styling.headerClass\"\n [possibleStylingTheme]=\"possibleStyling.WIDGET_CONTENT_CLASSES\"\n [possibleStylingHeader]=\"possibleStyling.WIDGET_HEADER_CLASSES\"\n [defaultThemeClass]=\"defaultStyling.contentClass\"\n [defaultHeaderClass]=\"defaultStyling.headerClass\"\n ></c8y-appearance-settings>\n </div>\n <div class=\"col-xs-6 sticky-header-top-0\">\n <c8y-widget-preview\n style=\"height: calc(100vh - 382px)\"\n [previewClasses]=\"getStyle(true)\"\n ></c8y-widget-preview>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"save()\"\n [disabled]=\"\n contextDashboardService.formDisabled || configForm.invalid || checkIfDeviceRequired()\n \"\n c8yProductExperience\n [actionName]=\"current ? 'editWidget' : 'createWidget'\"\n [actionData]=\"{ widgetName: selected && selected.id }\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i5.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i5.DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "directive", type: i5.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: i8.MillerViewComponent, selector: "c8y-asset-selector-miller", inputs: ["config", "asset", "selectedDevice", "rootNode", "container"], outputs: ["onSelected", "onClearSelected"] }, { kind: "component", type: i9.AppearanceSettingsComponent, selector: "c8y-appearance-settings", inputs: ["themeClass", "headerClass", "defaultThemeClass", "defaultHeaderClass", "possibleStylingTheme", "possibleStylingHeader"], outputs: ["themeClassChange", "headerClassChange"] }, { kind: "component", type: i10.WidgetPreviewComponent, selector: "c8y-widget-preview", inputs: ["previewClasses", "tab"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }] });
231
231
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WidgetConfigComponent, decorators: [{
232
232
  type: Component,
233
- args: [{ selector: 'c8y-widget-config', template: "<div class=\"modal-header separator\">\n <div\n id=\"modal-title\"\n class=\"h3\"\n title=\"{{ 'Add widget' | translate }}\"\n *ngIf=\"!current\"\n translate\n >\n Add widget\n </div>\n <div\n id=\"modal-title\"\n class=\"h3\"\n title=\"{{ 'Edit widget' | translate }}\"\n *ngIf=\"current\"\n translate\n >\n Edit widget\n </div>\n</div>\n<form #configForm=\"ngForm\" name=\"form\">\n <div class=\"c8y-modal-tabs\" id=\"modal-body\">\n <div class=\"tabContainer\">\n <ul class=\"nav nav-tabs nav-tabsc8y p-l-24\">\n <li [class.active]=\"mode === 'select'\">\n <button\n title=\"{{ 'Select widget' | translate }}\"\n type=\"button\"\n class=\"btn\"\n (click)=\"changeMode('select'); (false)\"\n >\n <i c8yIcon=\"th-large\"></i>\n <span translate>Select widget</span>\n </button>\n </li>\n <li [class.active]=\"mode === 'config'\">\n <button\n title=\"{{ 'Configuration' | translate }}\"\n type=\"button\"\n class=\"btn\"\n [disabled]=\"!selected\"\n (click)=\"changeMode('config'); (false)\"\n >\n <i c8yIcon=\"cog\"></i>\n <span translate>Configuration</span>\n </button>\n </li>\n <li [class.active]=\"mode === 'style'\">\n <button\n title=\"{{ 'Appearance' | translate }}\"\n type=\"button\"\n class=\"btn\"\n [disabled]=\"!selected\"\n (click)=\"changeMode('style'); (false)\"\n >\n <i c8yIcon=\"paint-brush\"></i>\n <span translate>Appearance</span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"modal-inner-scroll modal-inner-scroll--fixed\">\n <div\n *ngIf=\"mode === 'select'\"\n class=\"bg-level-0 p-l-24 p-r-24 p-t-8 p-b-8 sticky-header-top-0\"\n style=\"z-index: 2\"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <div class=\"input-group input-group-search\">\n <input\n [attr.aria-label]=\"'Search' | translate\"\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"text\"\n [(ngModel)]=\"searchTerm\"\n [ngModelOptions]=\"{ standalone: true }\"\n (keydown)=\"searchChange$.next($event)\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n (click)=\"resetSearch()\"\n >\n <i [c8yIcon]=\"searchTerm.length === 0 ? 'search' : 'close'\"></i>\n </button>\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal-body bg-level-2\" *ngIf=\"mode === 'select'\">\n <div class=\"card-group card-select m-b-0\">\n <div\n class=\"col-md-3 col-sm-4 col-xs-6\"\n *ngFor=\"let cmp of searchResult || components\"\n title=\"{{ cmp.description | translate }}\"\n >\n <button\n type=\"button\"\n class=\"btn-clean card p-8\"\n [class.active]=\"selected === cmp\"\n (click)=\"select(cmp)\"\n >\n <div class=\"text-center p-8 m-b-8 d-col flex-center bg-level-2\" role=\"presentation\">\n <ng-container *ngIf=\"!cmp.previewImage; else previewImage\">\n <div class=\"h1\"><i c8yIcon=\"file-image-o\"></i></div>\n <small translate>Preview not available</small>\n </ng-container>\n <ng-template #previewImage>\n <img class=\"img-responsive\" alt=\"\" [src]=\"cmp.previewImage\" />\n </ng-template>\n </div>\n <p class=\"card-title text-truncate\">\n <c8y-highlight\n text=\"{{ cmp.label | translate }}\"\n [pattern]=\"searchTerm\"\n ></c8y-highlight>\n </p>\n </button>\n </div>\n\n <div class=\"c8y-empty-state text-center\" *ngIf=\"searchResult && searchResult.length === 0\">\n <div class=\"h1\" c8yIcon=\"search\"></div>\n <h3 translate>No widgets found.</h3>\n <div class=\"d-flex\">\n <p translate class=\"m-r-8\">Rephrase your search term.</p>\n <button\n title=\"{{ 'Reset search' | translate }}\"\n class=\"btn btn-primary\"\n type=\"button\"\n (click)=\"resetSearch()\"\n >\n {{ 'Reset search' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- The following is intentional set to hidden to allow the ViewChild ref in the controller -->\n <div *ngIf=\"selected\" [ngClass]=\"{ hidden: mode !== 'config' }\" class=\"d-flex d-col fit-h\">\n <div class=\"p-t-16 flex-no-shrink separator-bottom p-b-16\">\n <div class=\"row\">\n <div class=\"col-sm-4\">\n <div class=\"p-l-24\">\n <div class=\"text-left text-medium h4\">\n {{ selected.label | translate }}\n </div>\n <p>\n {{ selected.description | translate }}\n </p>\n </div>\n </div>\n <div class=\"col-sm-8\">\n <div class=\"p-r-24\">\n <c8y-form-group>\n <label for=\"widgetTitle\" translate>Title</label>\n <input\n id=\"widgetTitle\"\n [(ngModel)]=\"selected.data.title\"\n type=\"text\"\n name=\"title\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} {{ componentLabel | translate }}\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row flex-grow\" [ngClass]=\"{ 'd-flex': widgetConfig.options || hasConfig() }\">\n <div\n *ngIf=\"!widgetConfig.settings?.noDeviceTarget\"\n class=\"a-s-stretch\"\n [ngClass]=\"{\n 'bg-level-1 col-sm-4 p-r-0': hasConfig(),\n 'bg-level-0 col-sm-12': !hasConfig()\n }\"\n >\n <div class=\"fit-h bg-inherit p-l-16\" [ngClass]=\"{ 'p-r-24': !hasConfig() }\">\n <div class=\"p-relative bg-inherit\">\n <c8y-asset-selector-miller\n (onSelected)=\"selectionChanged($event)\"\n (onClearSelected)=\"selectionChanged()\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: this.widgetConfig.settings?.groupsSelectable,\n showChildDevices: true,\n columnHeaders: true,\n showUnassignedDevices: true,\n search: !this.widgetConfig.settings.context?.additionParents,\n showFilter: true,\n singleColumn: !!this.hasConfig()\n }\"\n [asset]=\"widgetConfig.settings?.context\"\n [selectedDevice]=\"selectedDevice\"\n class=\"d-block bg-inherit p-relative\"\n style=\"height: calc(100vh - 406px)\"\n ></c8y-asset-selector-miller>\n </div>\n </div>\n </div>\n <div\n [ngClass]=\"{\n 'col-sm-8': !widgetConfig.settings?.noDeviceTarget,\n 'col-sm-12': widgetConfig.settings?.noDeviceTarget,\n 'sr-only': !hasConfig()\n }\"\n >\n <c8y-dynamic-component\n class=\"d-block\"\n [ngClass]=\"{ 'inner-scroll p-r-24': !widgetConfig.settings?.noDeviceTarget }\"\n style=\"{{ hasConfig() ? 'height: calc(100vh - 406px);' : 'height: 0;' }}\"\n [componentId]=\"selected.id\"\n mode=\"config\"\n [config]=\"widgetConfig\"\n [notFoundError]=\"false\"\n #config\n ></c8y-dynamic-component>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"mode === 'style'\" class=\"modal-body p-t-0\" style=\"height: calc(100vh - 310px)\">\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <c8y-appearance-settings\n [(themeClass)]=\"styling.contentClass\"\n [(headerClass)]=\"styling.headerClass\"\n [possibleStylingTheme]=\"possibleStyling.WIDGET_CONTENT_CLASSES\"\n [possibleStylingHeader]=\"possibleStyling.WIDGET_HEADER_CLASSES\"\n [defaultThemeClass]=\"defaultStyling.contentClass\"\n [defaultHeaderClass]=\"defaultStyling.headerClass\"\n ></c8y-appearance-settings>\n </div>\n <div class=\"col-xs-6 sticky-header-top-0\">\n <c8y-widget-preview\n [previewClasses]=\"getStyle(true)\"\n style=\"height: calc(100vh - 382px)\"\n ></c8y-widget-preview>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"\n contextDashboardService.formDisabled || configForm.invalid || checkIfDeviceRequired()\n \"\n c8yProductExperience\n [actionName]=\"current ? 'editWidget' : 'createWidget'\"\n [actionData]=\"{ widgetName: selected && selected.id }\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n" }]
233
+ args: [{ selector: 'c8y-widget-config', template: "<div class=\"modal-header separator\">\n <div\n class=\"h3\"\n title=\"{{ 'Add widget' | translate }}\"\n id=\"modal-title\"\n *ngIf=\"!current\"\n translate\n >\n Add widget\n </div>\n <div\n class=\"h3\"\n title=\"{{ 'Edit widget' | translate }}\"\n id=\"modal-title\"\n *ngIf=\"current\"\n translate\n >\n Edit widget\n </div>\n</div>\n<form name=\"form\" #configForm=\"ngForm\">\n <div class=\"c8y-modal-tabs\" id=\"modal-body\">\n <div class=\"tabContainer\">\n <ul class=\"nav nav-tabs nav-tabsc8y p-l-24\">\n <li [class.active]=\"mode === 'select'\">\n <button\n class=\"btn\"\n type=\"button\"\n title=\"{{ 'Select widget' | translate }}\"\n (click)=\"changeMode('select'); (false)\"\n >\n <i c8yIcon=\"th-large\"></i>\n <span translate>Select widget</span>\n </button>\n </li>\n <li [class.active]=\"mode === 'config'\">\n <button\n class=\"btn\"\n type=\"button\"\n title=\"{{ 'Configuration' | translate }}\"\n [disabled]=\"!selected\"\n (click)=\"changeMode('config'); (false)\"\n >\n <i c8yIcon=\"cog\"></i>\n <span translate>Configuration</span>\n </button>\n </li>\n <li [class.active]=\"mode === 'style'\">\n <button\n class=\"btn\"\n type=\"button\"\n title=\"{{ 'Appearance' | translate }}\"\n [disabled]=\"!selected\"\n (click)=\"changeMode('style'); (false)\"\n >\n <i c8yIcon=\"paint-brush\"></i>\n <span translate>Appearance</span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"modal-inner-scroll modal-inner-scroll--fixed\">\n <div\n class=\"bg-level-0 p-l-24 p-r-24 p-t-8 p-b-8 sticky-header-top-0\"\n style=\"z-index: 2\"\n *ngIf=\"mode === 'select'\"\n >\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n data-cy=\"widget-config--Search\"\n type=\"text\"\n [attr.aria-label]=\"'Search' | translate\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n [(ngModel)]=\"searchTerm\"\n [ngModelOptions]=\"{ standalone: true }\"\n (keydown)=\"searchChange$.next($event)\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot\"\n type=\"button\"\n title=\"{{ 'Search' | translate }}\"\n (click)=\"resetSearch()\"\n >\n <i [c8yIcon]=\"searchTerm.length === 0 ? 'search' : 'close'\"></i>\n </button>\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal-body bg-level-2\" *ngIf=\"mode === 'select'\">\n <div class=\"card-group card-select m-b-0\">\n <div\n class=\"col-md-3 col-sm-4 col-xs-6\"\n title=\"{{ cmp.description | translate }}\"\n *ngFor=\"let cmp of searchResult || components\"\n >\n <button\n class=\"btn-clean card p-8\"\n type=\"button\"\n [class.active]=\"selected === cmp\"\n (click)=\"select(cmp)\"\n >\n <div class=\"text-center p-8 m-b-8 d-col flex-center bg-level-2\" role=\"presentation\">\n <ng-container *ngIf=\"!cmp.previewImage; else previewImage\">\n <div class=\"h1\"><i c8yIcon=\"file-image-o\"></i></div>\n <small translate>Preview not available</small>\n </ng-container>\n <ng-template #previewImage>\n <img class=\"img-responsive\" alt [src]=\"cmp.previewImage\" />\n </ng-template>\n </div>\n <p class=\"card-title text-truncate\">\n <c8y-highlight\n text=\"{{ cmp.label | translate }}\"\n [pattern]=\"searchTerm\"\n ></c8y-highlight>\n </p>\n </button>\n </div>\n\n <div class=\"c8y-empty-state text-center\" *ngIf=\"searchResult && searchResult.length === 0\">\n <div class=\"h1\" c8yIcon=\"search\"></div>\n <h3 translate>No widgets found.</h3>\n <div class=\"d-flex\">\n <p class=\"m-r-8\" translate>Rephrase your search term.</p>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Reset search' | translate }}\"\n (click)=\"resetSearch()\"\n >\n {{ 'Reset search' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- The following is intentional set to hidden to allow the ViewChild ref in the controller -->\n <div class=\"d-flex d-col fit-h\" *ngIf=\"selected\" [ngClass]=\"{ hidden: mode !== 'config' }\">\n <div class=\"p-t-16 flex-no-shrink separator-bottom p-b-16\">\n <div class=\"row\">\n <div class=\"col-sm-4\">\n <div class=\"p-l-24\">\n <div class=\"text-left text-medium h4\">\n {{ selected.label | translate }}\n </div>\n <p>\n {{ selected.description | translate }}\n </p>\n </div>\n </div>\n <div class=\"col-sm-8\">\n <div class=\"p-r-24\">\n <c8y-form-group>\n <label for=\"widgetTitle\" translate>Title</label>\n <input\n class=\"form-control\"\n type=\"text\"\n id=\"widgetTitle\"\n name=\"title\"\n [(ngModel)]=\"selected.data.title\"\n placeholder=\"{{ 'e.g.' | translate }} {{ componentLabel | translate }}\"\n required\n />\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row flex-grow\" [ngClass]=\"{ 'd-flex': widgetConfig.options || hasConfig() }\">\n <div\n class=\"a-s-stretch\"\n *ngIf=\"!widgetConfig.settings?.noDeviceTarget\"\n [ngClass]=\"{\n 'bg-level-1 col-sm-4 p-r-0': hasConfig(),\n 'bg-level-0 col-sm-12': !hasConfig()\n }\"\n >\n <div class=\"fit-h bg-inherit p-l-16\" [ngClass]=\"{ 'p-r-24': !hasConfig() }\">\n <div class=\"p-relative bg-inherit\">\n <c8y-asset-selector-miller\n class=\"d-block bg-inherit p-relative\"\n style=\"height: calc(100vh - 422px)\"\n (onSelected)=\"selectionChanged($event)\"\n (onClearSelected)=\"selectionChanged()\"\n [config]=\"{\n view: 'miller',\n groupsSelectable: this.widgetConfig.settings?.groupsSelectable,\n showChildDevices: true,\n columnHeaders: true,\n showUnassignedDevices: true,\n search: !this.widgetConfig.settings.context?.additionParents,\n showFilter: true,\n singleColumn: !!this.hasConfig()\n }\"\n [asset]=\"widgetConfig.settings?.context\"\n [selectedDevice]=\"selectedDevice\"\n ></c8y-asset-selector-miller>\n </div>\n </div>\n </div>\n <div\n [ngClass]=\"{\n 'col-sm-8': !widgetConfig.settings?.noDeviceTarget,\n 'col-sm-12': widgetConfig.settings?.noDeviceTarget,\n 'sr-only': !hasConfig()\n }\"\n >\n <c8y-dynamic-component\n class=\"d-block\"\n style=\"height: {{ hasConfig() ? 'calc(100vh - 422px)' : '0' }}\"\n [ngClass]=\"{ 'inner-scroll p-r-24': !widgetConfig.settings?.noDeviceTarget }\"\n [componentId]=\"selected.id\"\n mode=\"config\"\n [config]=\"widgetConfig\"\n [notFoundError]=\"false\"\n #config\n ></c8y-dynamic-component>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body p-t-0\" style=\"height: calc(100vh - 310px)\" *ngIf=\"mode === 'style'\">\n <div class=\"row\">\n <div class=\"col-xs-6\">\n <c8y-appearance-settings\n [(themeClass)]=\"styling.contentClass\"\n [(headerClass)]=\"styling.headerClass\"\n [possibleStylingTheme]=\"possibleStyling.WIDGET_CONTENT_CLASSES\"\n [possibleStylingHeader]=\"possibleStyling.WIDGET_HEADER_CLASSES\"\n [defaultThemeClass]=\"defaultStyling.contentClass\"\n [defaultHeaderClass]=\"defaultStyling.headerClass\"\n ></c8y-appearance-settings>\n </div>\n <div class=\"col-xs-6 sticky-header-top-0\">\n <c8y-widget-preview\n style=\"height: calc(100vh - 382px)\"\n [previewClasses]=\"getStyle(true)\"\n ></c8y-widget-preview>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"save()\"\n [disabled]=\"\n contextDashboardService.formDisabled || configForm.invalid || checkIfDeviceRequired()\n \"\n c8yProductExperience\n [actionName]=\"current ? 'editWidget' : 'createWidget'\"\n [actionData]=\"{ widgetName: selected && selected.id }\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n" }]
234
234
  }], ctorParameters: function () { return [{ type: i1.WidgetService }, { type: i2.BsModalRef }, { type: i3.InventoryService }, { type: i4.ContextDashboardService }]; }, propDecorators: { dynamicComponent: [{
235
235
  type: ViewChild,
236
236
  args: ['config', { static: false }]
237
237
  }] } });
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb250ZXh0LWRhc2hib2FyZC93aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL3dpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFzQyx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBHLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUV0QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7QUFNL0QsTUFBTSxPQUFPLHFCQUFxQjtJQTRDaEMsWUFDVSxhQUE0QixFQUM1QixLQUFpQixFQUNqQixTQUEyQixFQUM1Qix1QkFBZ0Q7UUFIL0Msa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtR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ImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnREZWZpbml0aW9uLCBXaWRnZXQsIER5bmFtaWNDb21wb25lbnRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFzc2V0U2VsZWN0aW9uQ2hhbmdlRXZlbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2Fzc2V0cy1uYXZpZ2F0b3InO1xuaW1wb3J0IHsgY2xvbmUsIGNsb25lRGVlcCwgZXNjYXBlUmVnRXhwLCBnZXQsIG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgaWlmLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCxcbiAgV0lER0VUX0NPTlRFTlRfQ0xBU1NFUyxcbiAgV0lER0VUX0hFQURFUl9DTEFTU0VTLFxuICBDb250ZXh0V2lkZ2V0Q29uZmlnXG59IGZyb20gJy4vY29udGV4dC1kYXNoYm9hcmQubW9kZWwnO1xuaW1wb3J0IHsgV2lkZ2V0U2VydmljZSB9IGZyb20gJy4vd2lkZ2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZFNlcnZpY2UgfSBmcm9tICcuL2NvbnRleHQtZGFzaGJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS13aWRnZXQtY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHNlbGVjdGVkRGV2aWNlOiBJTWFuYWdlZE9iamVjdDtcbiAgbW9kZTogJ2NvbmZpZycgfCAnc2VsZWN0JyB8ICdzdHlsZScgPSAnc2VsZWN0JztcbiAgc2VhcmNoUmVzdWx0OiBEeW5hbWljQ29tcG9uZW50RGVmaW5pdGlvbltdO1xuICBjb21wb25lbnRzOiBEeW5hbWljQ29tcG9uZW50RGVmaW5pdGlvbltdO1xuICBzZWxlY3RlZDogRHluYW1pY0NvbXBvbmVudERlZmluaXRpb247XG4gIHNlYXJjaENoYW5nZSQgPSBuZXcgU3ViamVjdCgpO1xuICBzZWFyY2hUZXJtID0gJyc7XG4gIGNvbnRleHQ6IGFueTtcbiAgY29tcG9uZW50TGFiZWw6IHN0cmluZztcbiAgbW86IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0O1xuICBzdHlsaW5nID0ge1xuICAgIGhlYWRlckNsYXNzOiAncGFuZWwtdGl0bGUtcmVndWxhcicsXG4gICAgY29udGVudENsYXNzOiAncGFuZWwtY29udGVudC1saWdodCdcbiAgfTtcbiAgZGVmYXVsdFN0eWxpbmcgPSB7XG4gICAgaGVhZGVyQ2xhc3M6ICdwYW5lbC10aXRsZS1yZWd1bGFyJyxcbiAgICBjb250ZW50Q2xhc3M6ICdwYW5lbC1jb250ZW50LWxpZ2h0J1xuICB9O1xuICBwb3NzaWJsZVN0eWxpbmcgPSB7IFdJREdFVF9IRUFERVJfQ0xBU1NFUywgV0lER0VUX0NPTlRFTlRfQ0xBU1NFUyB9O1xuICBjdXJyZW50OiBhbnk7XG4gIHdpZGdldENvbmZpZzogQ29udGV4dFdpZGdldENvbmZpZztcbiAgaXNVcGdyYWRlID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnY29uZmlnJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGR5bmFtaWNDb21wb25lbnQ6IER5bmFtaWNDb21wb25lbnRDb21wb25lbnQ7XG5cbiAgZ2V0IGlzRWRpdCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmN1cnJlbnQ7XG4gIH1cblxuICBnZXQgaXNEZXZpY2VUeXBlRGFzaGJvYXJkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMubW8uYzh5X0Rhc2hib2FyZD8uZGV2aWNlVHlwZSAmJiAhIXRoaXMubW8uYzh5X0Rhc2hib2FyZD8uZGV2aWNlVHlwZVZhbHVlO1xuICB9XG5cbiAgcmVzdWx0OiBQcm9taXNlPFdpZGdldD4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5fc2F2ZSA9IHJlc29sdmU7XG4gICAgdGhpcy5fY2FuY2VsID0gcmVqZWN0O1xuICB9KTtcblxuICBwcml2YXRlIHNlYXJjaFN1YjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9zYXZlOiAodmFsdWU6IFdpZGdldCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfY2FuY2VsOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgd2lkZ2V0U2VydmljZTogV2lkZ2V0U2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsOiBCc01vZGFsUmVmLFxuICAgIHByaXZhdGUgaW52ZW50b3J5OiBJbnZlbnRvcnlTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb250ZXh0RGFzaGJvYXJkU2VydmljZTogQ29udGV4dERhc2hib2FyZFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLndpZGdldFNlcnZpY2UuZ2V0V2lkZ2V0RGVmaW5pdGlvbnMoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBjbG9uZSh0aGlzLnNlbGVjdGVkKTtcbiAgICAgIHRoaXMuc2VsZWN0KHRoaXMuc2VsZWN0ZWQsIHRoaXMuaXNFZGl0ID8gJ2NvbmZpZycgOiAnc2VsZWN0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hTdWIgPSB0aGlzLnNlYXJjaENoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBpaWYoKCkgPT4gZXZlbnQud2hpY2ggIT09IDEzLCB0aW1lcigyMDApLCB0aW1lcigxMCkpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2V0U3R5bGluZ3MoKTtcbiAgICBpZiAodGhpcy53aWRnZXRDb25maWc/LmRldmljZSkge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwodGhpcy53aWRnZXRDb25maWcuZGV2aWNlLmlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREZXZpY2UgPSBkYXRhO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrSWZEZXZpY2VSZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMud2lkZ2V0Q29uZmlnIHx8XG4gICAgICAoIXRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzLmRldmljZVRhcmdldE5vdFJlcXVpcmVkICYmXG4gICAgICAgICF0aGlzLndpZGdldENvbmZpZy5kZXZpY2UgJiZcbiAgICAgICAgIXRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzLm5vRGV2aWNlVGFyZ2V0KVxuICAgICk7XG4gIH1cblxuICBzZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbj86IEFzc2V0U2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICB0aGlzLndpZGdldENvbmZpZy5kZXZpY2UgPSBzZWxlY3Rpb24/LmNoYW5nZT8uaXRlbTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnQuZW1pdENvbmZpZ0NoYW5nZSh7XG4gICAgICBkZXZpY2U6IHRoaXMud2lkZ2V0Q29uZmlnLmRldmljZVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICBjb25zdCBob29rU3VjY2VzcyA9IGF3YWl0IHRoaXMuZHluYW1pY0NvbXBvbmVudC5jYWxsTGlmZUN5Y2xlSG9va3MoKS50b1Byb21pc2UoKTtcbiAgICBpZiAoIWhvb2tTdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBfeCwgX3ksIF93aWR0aCwgX2hlaWdodCB9ID0gdGhpcy5zZWxlY3RlZC5kYXRhO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRDb25maWcgJiZcbiAgICAgIHRoaXMud2lkZ2V0Q29uZmlnLmRldmljZSAmJlxuICAgICAgLy8gc2VyaWFsaXppbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHJlc29sdmVyXG4gICAgICAhdGhpcy5zZWxlY3RlZD8ucmVzb2x2ZT8uZGV2aWNlXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSB0aGlzLndpZGdldENvbmZpZy5kZXZpY2U7XG4gICAgICB0aGlzLndpZGdldENvbmZpZy5kZXZpY2UgPSB7IGlkLCBuYW1lIH07XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkZ2V0ID0ge1xuICAgICAgX3gsXG4gICAgICBfeSxcbiAgICAgIF93aWR0aCxcbiAgICAgIF9oZWlnaHQsXG4gICAgICBjb25maWc6IG9taXQodGhpcy53aWRnZXRDb25maWcsIFsnc2V0dGluZ3MnLCAnZGlzcGxheVNldHRpbmdzJ10pLFxuICAgICAgdGl0bGU6IHRoaXMuc2VsZWN0ZWQuZGF0YS50aXRsZSxcbiAgICAgIGNvbXBvbmVudElkOiB0aGlzLnNlbGVjdGVkLmlkLFxuICAgICAgaWQ6IHRoaXMuaXNFZGl0ID8gdGhpcy5jdXJyZW50LmRhdGEuaWQgOiBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc3Vic3RyKDIpLFxuICAgICAgY2xhc3NlczogdGhpcy5nZXRTdHlsZSgpLFxuICAgICAgLi4uKCF0aGlzLmlzRWRpdCA/IHRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzLndpZGdldERlZmF1bHRzIDoge30pXG4gICAgfSBhcyBXaWRnZXQ7XG5cbiAgICB0aGlzLl9zYXZlKHdpZGdldCk7XG4gIH1cblxuICBzZWxlY3QoY21wLCBtb2RlOiAnc2VsZWN0JyB8ICdjb25maWcnID0gJ2NvbmZpZycpIHtcbiAgICBjbXAuZGF0YSA9IGNtcC5kYXRhIHx8IHt9O1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjbXA7XG5cbiAgICB0aGlzLmlzVXBncmFkZSA9ICEhZ2V0KGNtcCwgJ2RhdGEuc2V0dGluZ3MudXBncmFkZScpO1xuICAgIHRoaXMuY29udGV4dERhc2hib2FyZFNlcnZpY2UuZm9ybURpc2FibGVkID0gdGhpcy5pc1VwZ3JhZGU7XG5cbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcbiAgICAgIGNvbnN0IHsgX3gsIF95LCBfd2lkdGgsIF9oZWlnaHQsIGNsYXNzZXMsIHRpdGxlIH0gPSB0aGlzLmN1cnJlbnQuZGF0YTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQuZGF0YSA9IHsgLi4udGhpcy5zZWxlY3RlZC5kYXRhLCBfeCwgX3ksIF93aWR0aCwgX2hlaWdodCwgY2xhc3NlcywgdGl0bGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLndpZGdldENvbmZpZyA9IGNsb25lRGVlcCh0aGlzLmNvbXBvc2VXaWRnZXRDb25maWcodGhpcy5zZWxlY3RlZCwgdGhpcy5jb250ZXh0KSk7XG5cbiAgICB0aGlzLnNlbGVjdGVkLmRhdGEudGl0bGUgPSB0aGlzLnNlbGVjdGVkLmRhdGEudGl0bGUgfHwgY21wLmxhYmVsO1xuICAgIHRoaXMuY29tcG9uZW50TGFiZWwgPSBjbXAubGFiZWw7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuXG4gIHNlYXJjaCgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXJtLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VhcmNoUmVzdWx0ID0gdGhpcy5jb21wb25lbnRzLmZpbHRlcihjbXAgPT5cbiAgICAgICAgbmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAodGhpcy5zZWFyY2hUZXJtLnRyaW0oKSksICdpJykudGVzdChjbXAubGFiZWwpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc2V0U2VhcmNoKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRTZWFyY2goKSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGFuZ2VNb2RlKG1vZGU6ICdjb25maWcnIHwgJ3NlbGVjdCcgfCAnc3R5bGUnKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuX2NhbmNlbCgpO1xuICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICB9XG5cbiAgZ2V0U3R5bGUoaXNQcmV2aWV3ID0gZmFsc2UpIHtcbiAgICBjb25zdCBjc3NDbGFzc2VzID0ge307XG4gICAgaWYgKGlzUHJldmlldyB8fCAhdGhpcy5pc0Rhc2hib2FyZERlZmF1bHRTdHlsZSh0aGlzLnN0eWxpbmcuaGVhZGVyQ2xhc3MpKSB7XG4gICAgICBjc3NDbGFzc2VzW3RoaXMuc3R5bGluZy5oZWFkZXJDbGFzc10gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXZpZXcgfHwgIXRoaXMuaXNEYXNoYm9hcmREZWZhdWx0U3R5bGUodGhpcy5zdHlsaW5nLmNvbnRlbnRDbGFzcykpIHtcbiAgICAgIGNzc0NsYXNzZXNbdGhpcy5zdHlsaW5nLmNvbnRlbnRDbGFzc10gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXZpZXcpIHtcbiAgICAgIGNzc0NsYXNzZXNbYGRhc2hib2FyZC10aGVtZS0ke3RoaXMuZGVmYXVsdFN0eWxpbmcuY29udGVudENsYXNzLnNwbGl0KCctJykucG9wKCl9YF0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBjc3NDbGFzc2VzO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0RGFzaGJvYXJkU2VydmljZS5mb3JtRGlzYWJsZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNlYXJjaFN1Yikge1xuICAgICAgdGhpcy5zZWFyY2hTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBoYXNDb25maWcoKSB7XG4gICAgaWYgKHRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzPy51cGdyYWRlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLndpZGdldENvbmZpZy5zZXR0aW5ncz8uY29uZmlnQ29tcG9uZW50IHx8IHRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzPy5jb25maWdUZW1wbGF0ZVVybFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmR5bmFtaWNDb21wb25lbnQ/LmVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdHlsaW5ncygpOiB2b2lkIHtcbiAgICBjb25zdCBkYXNoYm9hcmRDbGFzc2VzOiBzdHJpbmdbXSA9XG4gICAgICAodGhpcy5tby5jOHlfRGFzaGJvYXJkPy5jbGFzc2VzICYmIE9iamVjdC5rZXlzKHRoaXMubW8uYzh5X0Rhc2hib2FyZC5jbGFzc2VzKSkgfHwgW107XG4gICAgY29uc3QgZGFzaGJvYXJkV2lkZ2V0Q2xhc3Nlczogc3RyaW5nW10gPVxuICAgICAgKHRoaXMubW8uYzh5X0Rhc2hib2FyZD8ud2lkZ2V0Q2xhc3NlcyAmJiBPYmplY3Qua2V5cyh0aGlzLm1vLmM4eV9EYXNoYm9hcmQud2lkZ2V0Q2xhc3NlcykpIHx8XG4gICAgICBbXTtcbiAgICBjb25zdCB3aWRnZXRDbGFzc2VzOiBzdHJpbmdbXSA9IHRoaXMuaXNFZGl0ID8gT2JqZWN0LmtleXModGhpcy5jdXJyZW50LmRhdGEuY2xhc3NlcykgOiBbXTtcblxuICAgIHRoaXMuc3R5bGluZyA9IHRoaXMuc2V0RGVmYXVsdFN0eWxlKFtcbiAgICAgIC4uLmRhc2hib2FyZENsYXNzZXMsXG4gICAgICAuLi5kYXNoYm9hcmRXaWRnZXRDbGFzc2VzLFxuICAgICAgLi4ud2lkZ2V0Q2xhc3Nlc1xuICAgIF0pO1xuICAgIHRoaXMuZGVmYXVsdFN0eWxpbmcgPSB0aGlzLnNldERlZmF1bHRTdHlsZShbLi4uZGFzaGJvYXJkQ2xhc3NlcywgLi4uZGFzaGJvYXJkV2lkZ2V0Q2xhc3Nlc10pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Rhc2hib2FyZERlZmF1bHRTdHlsZShjbGFzc05hbWUpIHtcbiAgICBjb25zdCBhbGxDbGFzc2VzID0ge1xuICAgICAgLi4udGhpcy5tby5jOHlfRGFzaGJvYXJkLmNsYXNzZXMsXG4gICAgICAuLi50aGlzLm1vLmM4eV9EYXNoYm9hcmQud2lkZ2V0Q2xhc3Nlc1xuICAgIH07XG4gICAgY29uc3Qgc3R5bGVzID0gT2JqZWN0LmtleXMoYWxsQ2xhc3NlcykubWFwKGNzc0NsYXNzID0+ICh7IGNsYXNzOiBjc3NDbGFzcyB9KSk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmdldFN0eWxpbmcoXG4gICAgICBzdHlsZXMsXG4gICAgICBjbGFzc05hbWUuc3BsaXQoJy0nKS5wb3AoKSxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgcmV0dXJuICEhc3R5bGU7XG4gIH1cblxuICBwcml2YXRlIHNldERlZmF1bHRTdHlsZShzZXRDbGFzc2VzOiBzdHJpbmdbXSkge1xuICAgIGxldCBjb250ZW50Q2xhc3MgPSB0aGlzLnN0eWxpbmcuY29udGVudENsYXNzO1xuICAgIGxldCBoZWFkZXJDbGFzcyA9IHRoaXMuc3R5bGluZy5oZWFkZXJDbGFzcztcbiAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlXG4gICAgICAuZ2V0RmlsdGVyZWREYXNoYm9hcmRTdHlsZXMoc2V0Q2xhc3NlcylcbiAgICAgIC5tYXAoYyA9PiBjLnNwbGl0KCctJykucG9wKCkpO1xuICAgIHN0eWxlcy5mb3JFYWNoKHN0eWxlTmFtZSA9PiB7XG4gICAgICBjb250ZW50Q2xhc3MgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmdldFN0eWxpbmcoXG4gICAgICAgIFdJREdFVF9DT05URU5UX0NMQVNTRVMsXG4gICAgICAgIHN0eWxlTmFtZSxcbiAgICAgICAgY29udGVudENsYXNzXG4gICAgICApO1xuICAgICAgaGVhZGVyQ2xhc3MgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmdldFN0eWxpbmcoXG4gICAgICAgIFdJREdFVF9IRUFERVJfQ0xBU1NFUyxcbiAgICAgICAgc3R5bGVOYW1lLFxuICAgICAgICBoZWFkZXJDbGFzc1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGhlYWRlckNsYXNzLCBjb250ZW50Q2xhc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcG9zZVdpZGdldENvbmZpZyhzZWxlY3RlZENvbXBvbmVudCwgY29udGV4dCA9IHt9KSB7XG4gICAgY29uc3Qgc2V0dGluZyA9IHtcbiAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgIC4uLnNlbGVjdGVkQ29tcG9uZW50LmRhdGEuc2V0dGluZ3MsXG4gICAgICAgIC4uLmdldChzZWxlY3RlZENvbXBvbmVudC5kYXRhLnNldHRpbmdzLCAnbmcxLm9wdGlvbnMnKSxcbiAgICAgICAgLi4uZ2V0KHNlbGVjdGVkQ29tcG9uZW50LmRhdGEsICduZzEub3B0aW9ucycpLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBkYXNoYm9hcmRNbzogdGhpcy5tby5jOHlfRGFzaGJvYXJkXG4gICAgICB9LFxuICAgICAgLi4uc2VsZWN0ZWRDb21wb25lbnQuZGF0YS5jb25maWdcbiAgICB9IGFzIENvbnRleHRXaWRnZXRDb25maWc7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlUYXJnZXRJZkRldmljZURhc2hib2FyZChzZXR0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUYXJnZXRJZkRldmljZURhc2hib2FyZCh3aWRnZXRDb25maWc6IENvbnRleHRXaWRnZXRDb25maWcpIHtcbiAgICBjb25zdCBpc0RldmljZVR5cGUgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmlzRGV2aWNlVHlwZSh0aGlzLm1vKTtcblxuICAgIGlmIChpc0RldmljZVR5cGUpIHtcbiAgICAgIHdpZGdldENvbmZpZy5zZXR0aW5ncy5oaWRlVGFyZ2V0ID0gaXNEZXZpY2VUeXBlO1xuXG4gICAgICBjb25zdCBub0RldmljZVRhcmdldCA9IHdpZGdldENvbmZpZy5zZXR0aW5ncy5uZzFcbiAgICAgICAgPyB3aWRnZXRDb25maWcuc2V0dGluZ3MubmcxLm9wdGlvbnMubm9EZXZpY2VUYXJnZXRcbiAgICAgICAgOiB3aWRnZXRDb25maWcuc2V0dGluZ3Mubm9EZXZpY2VUYXJnZXQ7XG5cbiAgICAgIGlmICghbm9EZXZpY2VUYXJnZXQpIHtcbiAgICAgICAgd2lkZ2V0Q29uZmlnLmRldmljZSA9IHtcbiAgICAgICAgICBpZDogdGhpcy5jb250ZXh0LmlkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuY29udGV4dC5uYW1lXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3aWRnZXRDb25maWc7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgc2VwYXJhdG9yXCI+XG4gIDxkaXZcbiAgICBpZD1cIm1vZGFsLXRpdGxlXCJcbiAgICBjbGFzcz1cImgzXCJcbiAgICB0aXRsZT1cInt7ICdBZGQgd2lkZ2V0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKm5nSWY9XCIhY3VycmVudFwiXG4gICAgdHJhbnNsYXRlXG4gID5cbiAgICBBZGQgd2lkZ2V0XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgaWQ9XCJtb2RhbC10aXRsZVwiXG4gICAgY2xhc3M9XCJoM1wiXG4gICAgdGl0bGU9XCJ7eyAnRWRpdCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAqbmdJZj1cImN1cnJlbnRcIlxuICAgIHRyYW5zbGF0ZVxuICA+XG4gICAgRWRpdCB3aWRnZXRcbiAgPC9kaXY+XG48L2Rpdj5cbjxmb3JtICNjb25maWdGb3JtPVwibmdGb3JtXCIgbmFtZT1cImZvcm1cIj5cbiAgPGRpdiBjbGFzcz1cImM4eS1tb2RhbC10YWJzXCIgaWQ9XCJtb2RhbC1ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cInRhYkNvbnRhaW5lclwiPlxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIG5hdi10YWJzYzh5IHAtbC0yNFwiPlxuICAgICAgICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJtb2RlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1NlbGVjdCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJidG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vZGUoJ3NlbGVjdCcpOyAoZmFsc2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwidGgtbGFyZ2VcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+U2VsZWN0IHdpZGdldDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpIFtjbGFzcy5hY3RpdmVdPVwibW9kZSA9PT0gJ2NvbmZpZydcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdDb25maWd1cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vZGUoJ2NvbmZpZycpOyAoZmFsc2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwiY29nXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkNvbmZpZ3VyYXRpb248L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBbY2xhc3MuYWN0aXZlXT1cIm1vZGUgPT09ICdzdHlsZSdcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBcHBlYXJhbmNlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vZGUoJ3N0eWxlJyk7IChmYWxzZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJwYWludC1icnVzaFwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5BcHBlYXJhbmNlPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWlubmVyLXNjcm9sbCBtb2RhbC1pbm5lci1zY3JvbGwtLWZpeGVkXCI+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJtb2RlID09PSAnc2VsZWN0J1wiXG4gICAgICBjbGFzcz1cImJnLWxldmVsLTAgcC1sLTI0IHAtci0yNCBwLXQtOCBwLWItOCBzdGlja3ktaGVhZGVyLXRvcC0wXCJcbiAgICAgIHN0eWxlPVwiei1pbmRleDogMlwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VhcmNo4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXJtXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwic2VhcmNoQ2hhbmdlJC5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdTZWFyY2gnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRTZWFyY2goKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBbYzh5SWNvbl09XCJzZWFyY2hUZXJtLmxlbmd0aCA9PT0gMCA/ICdzZWFyY2gnIDogJ2Nsb3NlJ1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgYmctbGV2ZWwtMlwiICpuZ0lmPVwibW9kZSA9PT0gJ3NlbGVjdCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWdyb3VwIGNhcmQtc2VsZWN0IG0tYi0wXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIGNvbC1zbS00IGNvbC14cy02XCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY21wIG9mIHNlYXJjaFJlc3VsdCB8fCBjb21wb25lbnRzXCJcbiAgICAgICAgICB0aXRsZT1cInt7IGNtcC5kZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIGNhcmQgcC04XCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWQgPT09IGNtcFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0KGNtcClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwLTggbS1iLTggZC1jb2wgZmxleC1jZW50ZXIgYmctbGV2ZWwtMlwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjbXAucHJldmlld0ltYWdlOyBlbHNlIHByZXZpZXdJbWFnZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoMVwiPjxpIGM4eUljb249XCJmaWxlLWltYWdlLW9cIj48L2k+PC9kaXY+XG4gICAgICAgICAgICAgICAgPHNtYWxsIHRyYW5zbGF0ZT5QcmV2aWV3IG5vdCBhdmFpbGFibGU8L3NtYWxsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwcmV2aWV3SW1hZ2U+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1yZXNwb25zaXZlXCIgYWx0PVwiXCIgW3NyY109XCJjbXAucHJldmlld0ltYWdlXCIgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgPGM4eS1oaWdobGlnaHRcbiAgICAgICAgICAgICAgICB0ZXh0PVwie3sgY21wLmxhYmVsIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJzZWFyY2hUZXJtXCJcbiAgICAgICAgICAgICAgPjwvYzh5LWhpZ2hsaWdodD5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSB0ZXh0LWNlbnRlclwiICpuZ0lmPVwic2VhcmNoUmVzdWx0ICYmIHNlYXJjaFJlc3VsdC5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaDFcIiBjOHlJY29uPVwic2VhcmNoXCI+PC9kaXY+XG4gICAgICAgICAgPGgzIHRyYW5zbGF0ZT5ObyB3aWRnZXRzIGZvdW5kLjwvaDM+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgPHAgdHJhbnNsYXRlIGNsYXNzPVwibS1yLThcIj5SZXBocmFzZSB5b3VyIHNlYXJjaCB0ZXJtLjwvcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVzZXQgc2VhcmNoJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZXNldFNlYXJjaCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ1Jlc2V0IHNlYXJjaCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUaGUgZm9sbG93aW5nIGlzIGludGVudGlvbmFsIHNldCB0byBoaWRkZW4gdG8gYWxsb3cgdGhlIFZpZXdDaGlsZCByZWYgaW4gdGhlIGNvbnRyb2xsZXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkXCIgW25nQ2xhc3NdPVwieyBoaWRkZW46IG1vZGUgIT09ICdjb25maWcnIH1cIiBjbGFzcz1cImQtZmxleCBkLWNvbCBmaXQtaFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtdC0xNiBmbGV4LW5vLXNocmluayBzZXBhcmF0b3ItYm90dG9tIHAtYi0xNlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1sLTI0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxlZnQgdGV4dC1tZWRpdW0gaDRcIj5cbiAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZC5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAge3sgc2VsZWN0ZWQuZGVzY3JpcHRpb24gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1yLTI0XCI+XG4gICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwid2lkZ2V0VGl0bGVcIiB0cmFuc2xhdGU+VGl0bGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgaWQ9XCJ3aWRnZXRUaXRsZVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkLmRhdGEudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IHt7IGNvbXBvbmVudExhYmVsIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBmbGV4LWdyb3dcIiBbbmdDbGFzc109XCJ7ICdkLWZsZXgnOiB3aWRnZXRDb25maWcub3B0aW9ucyB8fCBoYXNDb25maWcoKSB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRDb25maWcuc2V0dGluZ3M/Lm5vRGV2aWNlVGFyZ2V0XCJcbiAgICAgICAgICBjbGFzcz1cImEtcy1zdHJldGNoXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnYmctbGV2ZWwtMSBjb2wtc20tNCBwLXItMCc6IGhhc0NvbmZpZygpLFxuICAgICAgICAgICAgJ2JnLWxldmVsLTAgY29sLXNtLTEyJzogIWhhc0NvbmZpZygpXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml0LWggYmctaW5oZXJpdCBwLWwtMTZcIiBbbmdDbGFzc109XCJ7ICdwLXItMjQnOiAhaGFzQ29uZmlnKCkgfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtcmVsYXRpdmUgYmctaW5oZXJpdFwiPlxuICAgICAgICAgICAgICA8Yzh5LWFzc2V0LXNlbGVjdG9yLW1pbGxlclxuICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cInNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xlYXJTZWxlY3RlZCk9XCJzZWxlY3Rpb25DaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwie1xuICAgICAgICAgICAgICAgICAgdmlldzogJ21pbGxlcicsXG4gICAgICAgICAgICAgICAgICBncm91cHNTZWxlY3RhYmxlOiB0aGlzLndpZGdldENvbmZpZy5zZXR0aW5ncz8uZ3JvdXBzU2VsZWN0YWJsZSxcbiAgICAgICAgICAgICAgICAgIHNob3dDaGlsZERldmljZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICBjb2x1bW5IZWFkZXJzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgc2hvd1VuYXNzaWduZWREZXZpY2VzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgc2VhcmNoOiAhdGhpcy53aWRnZXRDb25maWcuc2V0dGluZ3MuY29udGV4dD8uYWRkaXRpb25QYXJlbnRzLFxuICAgICAgICAgICAgICAgICAgc2hvd0ZpbHRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHNpbmdsZUNvbHVtbjogISF0aGlzLmhhc0NvbmZpZygpXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW2Fzc2V0XT1cIndpZGdldENvbmZpZy5zZXR0aW5ncz8uY29udGV4dFwiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkRGV2aWNlXT1cInNlbGVjdGVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImQtYmxvY2sgYmctaW5oZXJpdCBwLXJlbGF0aXZlXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDQwNnB4KVwiXG4gICAgICAgICAgICAgID48L2M4eS1hc3NldC1zZWxlY3Rvci1taWxsZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY29sLXNtLTgnOiAhd2lkZ2V0Q29uZmlnLnNldHRpbmdzPy5ub0RldmljZVRhcmdldCxcbiAgICAgICAgICAgICdjb2wtc20tMTInOiB3aWRnZXRDb25maWcuc2V0dGluZ3M/Lm5vRGV2aWNlVGFyZ2V0LFxuICAgICAgICAgICAgJ3NyLW9ubHknOiAhaGFzQ29uZmlnKClcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjOHktZHluYW1pYy1jb21wb25lbnRcbiAgICAgICAgICAgIGNsYXNzPVwiZC1ibG9ja1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpbm5lci1zY3JvbGwgcC1yLTI0JzogIXdpZGdldENvbmZpZy5zZXR0aW5ncz8ubm9EZXZpY2VUYXJnZXQgfVwiXG4gICAgICAgICAgICBzdHlsZT1cInt7IGhhc0NvbmZpZygpID8gJ2hlaWdodDogY2FsYygxMDB2aCAtIDQwNnB4KTsnIDogJ2hlaWdodDogMDsnIH19XCJcbiAgICAgICAgICAgIFtjb21wb25lbnRJZF09XCJzZWxlY3RlZC5pZFwiXG4gICAgICAgICAgICBtb2RlPVwiY29uZmlnXCJcbiAgICAgICAgICAgIFtjb25maWddPVwid2lkZ2V0Q29uZmlnXCJcbiAgICAgICAgICAgIFtub3RGb3VuZEVycm9yXT1cImZhbHNlXCJcbiAgICAgICAgICAgICNjb25maWdcbiAgICAgICAgICA+PC9jOHktZHluYW1pYy1jb21wb25lbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gJ3N0eWxlJ1wiIGNsYXNzPVwibW9kYWwtYm9keSBwLXQtMFwiIHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMzEwcHgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNlwiPlxuICAgICAgICAgIDxjOHktYXBwZWFyYW5jZS1zZXR0aW5nc1xuICAgICAgICAgICAgWyh0aGVtZUNsYXNzKV09XCJzdHlsaW5nLmNvbnRlbnRDbGFzc1wiXG4gICAgICAgICAgICBbKGhlYWRlckNsYXNzKV09XCJzdHlsaW5nLmhlYWRlckNsYXNzXCJcbiAgICAgICAgICAgIFtwb3NzaWJsZVN0eWxpbmdUaGVtZV09XCJwb3NzaWJsZVN0eWxpbmcuV0lER0VUX0NPTlRFTlRfQ0xBU1NFU1wiXG4gICAgICAgICAgICBbcG9zc2libGVTdHlsaW5nSGVhZGVyXT1cInBvc3NpYmxlU3R5bGluZy5XSURHRVRfSEVBREVSX0NMQVNTRVNcIlxuICAgICAgICAgICAgW2RlZmF1bHRUaGVtZUNsYXNzXT1cImRlZmF1bHRTdHlsaW5nLmNvbnRlbnRDbGFzc1wiXG4gICAgICAgICAgICBbZGVmYXVsdEhlYWRlckNsYXNzXT1cImRlZmF1bHRTdHlsaW5nLmhlYWRlckNsYXNzXCJcbiAgICAgICAgICA+PC9jOHktYXBwZWFyYW5jZS1zZXR0aW5ncz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBzdGlja3ktaGVhZGVyLXRvcC0wXCI+XG4gICAgICAgICAgPGM4eS13aWRnZXQtcHJldmlld1xuICAgICAgICAgICAgW3ByZXZpZXdDbGFzc2VzXT1cImdldFN0eWxlKHRydWUpXCJcbiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMzgycHgpXCJcbiAgICAgICAgICA+PC9jOHktd2lkZ2V0LXByZXZpZXc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uXG4gICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgID5cbiAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAoY2xpY2spPVwic2F2ZSgpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgY29udGV4dERhc2hib2FyZFNlcnZpY2UuZm9ybURpc2FibGVkIHx8IGNvbmZpZ0Zvcm0uaW52YWxpZCB8fCBjaGVja0lmRGV2aWNlUmVxdWlyZWQoKVxuICAgICAgXCJcbiAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICBbYWN0aW9uTmFtZV09XCJjdXJyZW50ID8gJ2VkaXRXaWRnZXQnIDogJ2NyZWF0ZVdpZGdldCdcIlxuICAgICAgW2FjdGlvbkRhdGFdPVwieyB3aWRnZXROYW1lOiBzZWxlY3RlZCAmJiBzZWxlY3RlZC5pZCB9XCJcbiAgICA+XG4gICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb250ZXh0LWRhc2hib2FyZC93aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL3dpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFzQyx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBHLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUV0QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7QUFNL0QsTUFBTSxPQUFPLHFCQUFxQjtJQTRDaEMsWUFDVSxhQUE0QixFQUM1QixLQUFpQixFQUNqQixTQUEyQixFQUM1Qix1QkFBZ0Q7UUFIL0Msa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtR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ImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnREZWZpbml0aW9uLCBXaWRnZXQsIER5bmFtaWNDb21wb25lbnRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFzc2V0U2VsZWN0aW9uQ2hhbmdlRXZlbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2Fzc2V0cy1uYXZpZ2F0b3InO1xuaW1wb3J0IHsgY2xvbmUsIGNsb25lRGVlcCwgZXNjYXBlUmVnRXhwLCBnZXQsIG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgaWlmLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdCxcbiAgV0lER0VUX0NPTlRFTlRfQ0xBU1NFUyxcbiAgV0lER0VUX0hFQURFUl9DTEFTU0VTLFxuICBDb250ZXh0V2lkZ2V0Q29uZmlnXG59IGZyb20gJy4vY29udGV4dC1kYXNoYm9hcmQubW9kZWwnO1xuaW1wb3J0IHsgV2lkZ2V0U2VydmljZSB9IGZyb20gJy4vd2lkZ2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZFNlcnZpY2UgfSBmcm9tICcuL2NvbnRleHQtZGFzaGJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS13aWRnZXQtY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHNlbGVjdGVkRGV2aWNlOiBJTWFuYWdlZE9iamVjdDtcbiAgbW9kZTogJ2NvbmZpZycgfCAnc2VsZWN0JyB8ICdzdHlsZScgPSAnc2VsZWN0JztcbiAgc2VhcmNoUmVzdWx0OiBEeW5hbWljQ29tcG9uZW50RGVmaW5pdGlvbltdO1xuICBjb21wb25lbnRzOiBEeW5hbWljQ29tcG9uZW50RGVmaW5pdGlvbltdO1xuICBzZWxlY3RlZDogRHluYW1pY0NvbXBvbmVudERlZmluaXRpb247XG4gIHNlYXJjaENoYW5nZSQgPSBuZXcgU3ViamVjdCgpO1xuICBzZWFyY2hUZXJtID0gJyc7XG4gIGNvbnRleHQ6IGFueTtcbiAgY29tcG9uZW50TGFiZWw6IHN0cmluZztcbiAgbW86IENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0O1xuICBzdHlsaW5nID0ge1xuICAgIGhlYWRlckNsYXNzOiAncGFuZWwtdGl0bGUtcmVndWxhcicsXG4gICAgY29udGVudENsYXNzOiAncGFuZWwtY29udGVudC1saWdodCdcbiAgfTtcbiAgZGVmYXVsdFN0eWxpbmcgPSB7XG4gICAgaGVhZGVyQ2xhc3M6ICdwYW5lbC10aXRsZS1yZWd1bGFyJyxcbiAgICBjb250ZW50Q2xhc3M6ICdwYW5lbC1jb250ZW50LWxpZ2h0J1xuICB9O1xuICBwb3NzaWJsZVN0eWxpbmcgPSB7IFdJREdFVF9IRUFERVJfQ0xBU1NFUywgV0lER0VUX0NPTlRFTlRfQ0xBU1NFUyB9O1xuICBjdXJyZW50OiBhbnk7XG4gIHdpZGdldENvbmZpZzogQ29udGV4dFdpZGdldENvbmZpZztcbiAgaXNVcGdyYWRlID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnY29uZmlnJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGR5bmFtaWNDb21wb25lbnQ6IER5bmFtaWNDb21wb25lbnRDb21wb25lbnQ7XG5cbiAgZ2V0IGlzRWRpdCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmN1cnJlbnQ7XG4gIH1cblxuICBnZXQgaXNEZXZpY2VUeXBlRGFzaGJvYXJkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMubW8uYzh5X0Rhc2hib2FyZD8uZGV2aWNlVHlwZSAmJiAhIXRoaXMubW8uYzh5X0Rhc2hib2FyZD8uZGV2aWNlVHlwZVZhbHVlO1xuICB9XG5cbiAgcmVzdWx0OiBQcm9taXNlPFdpZGdldD4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5fc2F2ZSA9IHJlc29sdmU7XG4gICAgdGhpcy5fY2FuY2VsID0gcmVqZWN0O1xuICB9KTtcblxuICBwcml2YXRlIHNlYXJjaFN1YjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9zYXZlOiAodmFsdWU6IFdpZGdldCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfY2FuY2VsOiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgd2lkZ2V0U2VydmljZTogV2lkZ2V0U2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsOiBCc01vZGFsUmVmLFxuICAgIHByaXZhdGUgaW52ZW50b3J5OiBJbnZlbnRvcnlTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb250ZXh0RGFzaGJvYXJkU2VydmljZTogQ29udGV4dERhc2hib2FyZFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLndpZGdldFNlcnZpY2UuZ2V0V2lkZ2V0RGVmaW5pdGlvbnMoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBjbG9uZSh0aGlzLnNlbGVjdGVkKTtcbiAgICAgIHRoaXMuc2VsZWN0KHRoaXMuc2VsZWN0ZWQsIHRoaXMuaXNFZGl0ID8gJ2NvbmZpZycgOiAnc2VsZWN0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hTdWIgPSB0aGlzLnNlYXJjaENoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBpaWYoKCkgPT4gZXZlbnQud2hpY2ggIT09IDEzLCB0aW1lcigyMDApLCB0aW1lcigxMCkpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2V0U3R5bGluZ3MoKTtcbiAgICBpZiAodGhpcy53aWRnZXRDb25maWc/LmRldmljZSkge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwodGhpcy53aWRnZXRDb25maWcuZGV2aWNlLmlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREZXZpY2UgPSBkYXRhO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrSWZEZXZpY2VSZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMud2lkZ2V0Q29uZmlnIHx8XG4gICAgICAoIXRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzLmRldmljZVRhcmdldE5vdFJlcXVpcmVkICYmXG4gICAgICAgICF0aGlzLndpZGdldENvbmZpZy5kZXZpY2UgJiZcbiAgICAgICAgIXRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzLm5vRGV2aWNlVGFyZ2V0KVxuICAgICk7XG4gIH1cblxuICBzZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbj86IEFzc2V0U2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICB0aGlzLndpZGdldENvbmZpZy5kZXZpY2UgPSBzZWxlY3Rpb24/LmNoYW5nZT8uaXRlbTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnQuZW1pdENvbmZpZ0NoYW5nZSh7XG4gICAgICBkZXZpY2U6IHRoaXMud2lkZ2V0Q29uZmlnLmRldmljZVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICBjb25zdCBob29rU3VjY2VzcyA9IGF3YWl0IHRoaXMuZHluYW1pY0NvbXBvbmVudC5jYWxsTGlmZUN5Y2xlSG9va3MoKS50b1Byb21pc2UoKTtcbiAgICBpZiAoIWhvb2tTdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBfeCwgX3ksIF93aWR0aCwgX2hlaWdodCB9ID0gdGhpcy5zZWxlY3RlZC5kYXRhO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRDb25maWcgJiZcbiAgICAgIHRoaXMud2lkZ2V0Q29uZmlnLmRldmljZSAmJlxuICAgICAgLy8gc2VyaWFsaXppbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHJlc29sdmVyXG4gICAgICAhdGhpcy5zZWxlY3RlZD8ucmVzb2x2ZT8uZGV2aWNlXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSB0aGlzLndpZGdldENvbmZpZy5kZXZpY2U7XG4gICAgICB0aGlzLndpZGdldENvbmZpZy5kZXZpY2UgPSB7IGlkLCBuYW1lIH07XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkZ2V0ID0ge1xuICAgICAgX3gsXG4gICAgICBfeSxcbiAgICAgIF93aWR0aCxcbiAgICAgIF9oZWlnaHQsXG4gICAgICBjb25maWc6IG9taXQodGhpcy53aWRnZXRDb25maWcsIFsnc2V0dGluZ3MnLCAnZGlzcGxheVNldHRpbmdzJ10pLFxuICAgICAgdGl0bGU6IHRoaXMuc2VsZWN0ZWQuZGF0YS50aXRsZSxcbiAgICAgIGNvbXBvbmVudElkOiB0aGlzLnNlbGVjdGVkLmlkLFxuICAgICAgaWQ6IHRoaXMuaXNFZGl0ID8gdGhpcy5jdXJyZW50LmRhdGEuaWQgOiBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc3Vic3RyKDIpLFxuICAgICAgY2xhc3NlczogdGhpcy5nZXRTdHlsZSgpLFxuICAgICAgLi4uKCF0aGlzLmlzRWRpdCA/IHRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzLndpZGdldERlZmF1bHRzIDoge30pXG4gICAgfSBhcyBXaWRnZXQ7XG5cbiAgICB0aGlzLl9zYXZlKHdpZGdldCk7XG4gIH1cblxuICBzZWxlY3QoY21wLCBtb2RlOiAnc2VsZWN0JyB8ICdjb25maWcnID0gJ2NvbmZpZycpIHtcbiAgICBjbXAuZGF0YSA9IGNtcC5kYXRhIHx8IHt9O1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBjbXA7XG5cbiAgICB0aGlzLmlzVXBncmFkZSA9ICEhZ2V0KGNtcCwgJ2RhdGEuc2V0dGluZ3MudXBncmFkZScpO1xuICAgIHRoaXMuY29udGV4dERhc2hib2FyZFNlcnZpY2UuZm9ybURpc2FibGVkID0gdGhpcy5pc1VwZ3JhZGU7XG5cbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcbiAgICAgIGNvbnN0IHsgX3gsIF95LCBfd2lkdGgsIF9oZWlnaHQsIGNsYXNzZXMsIHRpdGxlIH0gPSB0aGlzLmN1cnJlbnQuZGF0YTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQuZGF0YSA9IHsgLi4udGhpcy5zZWxlY3RlZC5kYXRhLCBfeCwgX3ksIF93aWR0aCwgX2hlaWdodCwgY2xhc3NlcywgdGl0bGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLndpZGdldENvbmZpZyA9IGNsb25lRGVlcCh0aGlzLmNvbXBvc2VXaWRnZXRDb25maWcodGhpcy5zZWxlY3RlZCwgdGhpcy5jb250ZXh0KSk7XG5cbiAgICB0aGlzLnNlbGVjdGVkLmRhdGEudGl0bGUgPSB0aGlzLnNlbGVjdGVkLmRhdGEudGl0bGUgfHwgY21wLmxhYmVsO1xuICAgIHRoaXMuY29tcG9uZW50TGFiZWwgPSBjbXAubGFiZWw7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuXG4gIHNlYXJjaCgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXJtLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VhcmNoUmVzdWx0ID0gdGhpcy5jb21wb25lbnRzLmZpbHRlcihjbXAgPT5cbiAgICAgICAgbmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAodGhpcy5zZWFyY2hUZXJtLnRyaW0oKSksICdpJykudGVzdChjbXAubGFiZWwpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc2V0U2VhcmNoKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRTZWFyY2goKSB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGFuZ2VNb2RlKG1vZGU6ICdjb25maWcnIHwgJ3NlbGVjdCcgfCAnc3R5bGUnKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuX2NhbmNlbCgpO1xuICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICB9XG5cbiAgZ2V0U3R5bGUoaXNQcmV2aWV3ID0gZmFsc2UpIHtcbiAgICBjb25zdCBjc3NDbGFzc2VzID0ge307XG4gICAgaWYgKGlzUHJldmlldyB8fCAhdGhpcy5pc0Rhc2hib2FyZERlZmF1bHRTdHlsZSh0aGlzLnN0eWxpbmcuaGVhZGVyQ2xhc3MpKSB7XG4gICAgICBjc3NDbGFzc2VzW3RoaXMuc3R5bGluZy5oZWFkZXJDbGFzc10gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXZpZXcgfHwgIXRoaXMuaXNEYXNoYm9hcmREZWZhdWx0U3R5bGUodGhpcy5zdHlsaW5nLmNvbnRlbnRDbGFzcykpIHtcbiAgICAgIGNzc0NsYXNzZXNbdGhpcy5zdHlsaW5nLmNvbnRlbnRDbGFzc10gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXZpZXcpIHtcbiAgICAgIGNzc0NsYXNzZXNbYGRhc2hib2FyZC10aGVtZS0ke3RoaXMuZGVmYXVsdFN0eWxpbmcuY29udGVudENsYXNzLnNwbGl0KCctJykucG9wKCl9YF0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBjc3NDbGFzc2VzO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0RGFzaGJvYXJkU2VydmljZS5mb3JtRGlzYWJsZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNlYXJjaFN1Yikge1xuICAgICAgdGhpcy5zZWFyY2hTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBoYXNDb25maWcoKSB7XG4gICAgaWYgKHRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzPy51cGdyYWRlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLndpZGdldENvbmZpZy5zZXR0aW5ncz8uY29uZmlnQ29tcG9uZW50IHx8IHRoaXMud2lkZ2V0Q29uZmlnLnNldHRpbmdzPy5jb25maWdUZW1wbGF0ZVVybFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmR5bmFtaWNDb21wb25lbnQ/LmVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdHlsaW5ncygpOiB2b2lkIHtcbiAgICBjb25zdCBkYXNoYm9hcmRDbGFzc2VzOiBzdHJpbmdbXSA9XG4gICAgICAodGhpcy5tby5jOHlfRGFzaGJvYXJkPy5jbGFzc2VzICYmIE9iamVjdC5rZXlzKHRoaXMubW8uYzh5X0Rhc2hib2FyZC5jbGFzc2VzKSkgfHwgW107XG4gICAgY29uc3QgZGFzaGJvYXJkV2lkZ2V0Q2xhc3Nlczogc3RyaW5nW10gPVxuICAgICAgKHRoaXMubW8uYzh5X0Rhc2hib2FyZD8ud2lkZ2V0Q2xhc3NlcyAmJiBPYmplY3Qua2V5cyh0aGlzLm1vLmM4eV9EYXNoYm9hcmQud2lkZ2V0Q2xhc3NlcykpIHx8XG4gICAgICBbXTtcbiAgICBjb25zdCB3aWRnZXRDbGFzc2VzOiBzdHJpbmdbXSA9IHRoaXMuaXNFZGl0ID8gT2JqZWN0LmtleXModGhpcy5jdXJyZW50LmRhdGEuY2xhc3NlcykgOiBbXTtcblxuICAgIHRoaXMuc3R5bGluZyA9IHRoaXMuc2V0RGVmYXVsdFN0eWxlKFtcbiAgICAgIC4uLmRhc2hib2FyZENsYXNzZXMsXG4gICAgICAuLi5kYXNoYm9hcmRXaWRnZXRDbGFzc2VzLFxuICAgICAgLi4ud2lkZ2V0Q2xhc3Nlc1xuICAgIF0pO1xuICAgIHRoaXMuZGVmYXVsdFN0eWxpbmcgPSB0aGlzLnNldERlZmF1bHRTdHlsZShbLi4uZGFzaGJvYXJkQ2xhc3NlcywgLi4uZGFzaGJvYXJkV2lkZ2V0Q2xhc3Nlc10pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Rhc2hib2FyZERlZmF1bHRTdHlsZShjbGFzc05hbWUpIHtcbiAgICBjb25zdCBhbGxDbGFzc2VzID0ge1xuICAgICAgLi4udGhpcy5tby5jOHlfRGFzaGJvYXJkLmNsYXNzZXMsXG4gICAgICAuLi50aGlzLm1vLmM4eV9EYXNoYm9hcmQud2lkZ2V0Q2xhc3Nlc1xuICAgIH07XG4gICAgY29uc3Qgc3R5bGVzID0gT2JqZWN0LmtleXMoYWxsQ2xhc3NlcykubWFwKGNzc0NsYXNzID0+ICh7IGNsYXNzOiBjc3NDbGFzcyB9KSk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmdldFN0eWxpbmcoXG4gICAgICBzdHlsZXMsXG4gICAgICBjbGFzc05hbWUuc3BsaXQoJy0nKS5wb3AoKSxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgcmV0dXJuICEhc3R5bGU7XG4gIH1cblxuICBwcml2YXRlIHNldERlZmF1bHRTdHlsZShzZXRDbGFzc2VzOiBzdHJpbmdbXSkge1xuICAgIGxldCBjb250ZW50Q2xhc3MgPSB0aGlzLnN0eWxpbmcuY29udGVudENsYXNzO1xuICAgIGxldCBoZWFkZXJDbGFzcyA9IHRoaXMuc3R5bGluZy5oZWFkZXJDbGFzcztcbiAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlXG4gICAgICAuZ2V0RmlsdGVyZWREYXNoYm9hcmRTdHlsZXMoc2V0Q2xhc3NlcylcbiAgICAgIC5tYXAoYyA9PiBjLnNwbGl0KCctJykucG9wKCkpO1xuICAgIHN0eWxlcy5mb3JFYWNoKHN0eWxlTmFtZSA9PiB7XG4gICAgICBjb250ZW50Q2xhc3MgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmdldFN0eWxpbmcoXG4gICAgICAgIFdJREdFVF9DT05URU5UX0NMQVNTRVMsXG4gICAgICAgIHN0eWxlTmFtZSxcbiAgICAgICAgY29udGVudENsYXNzXG4gICAgICApO1xuICAgICAgaGVhZGVyQ2xhc3MgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmdldFN0eWxpbmcoXG4gICAgICAgIFdJREdFVF9IRUFERVJfQ0xBU1NFUyxcbiAgICAgICAgc3R5bGVOYW1lLFxuICAgICAgICBoZWFkZXJDbGFzc1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGhlYWRlckNsYXNzLCBjb250ZW50Q2xhc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcG9zZVdpZGdldENvbmZpZyhzZWxlY3RlZENvbXBvbmVudCwgY29udGV4dCA9IHt9KSB7XG4gICAgY29uc3Qgc2V0dGluZyA9IHtcbiAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgIC4uLnNlbGVjdGVkQ29tcG9uZW50LmRhdGEuc2V0dGluZ3MsXG4gICAgICAgIC4uLmdldChzZWxlY3RlZENvbXBvbmVudC5kYXRhLnNldHRpbmdzLCAnbmcxLm9wdGlvbnMnKSxcbiAgICAgICAgLi4uZ2V0KHNlbGVjdGVkQ29tcG9uZW50LmRhdGEsICduZzEub3B0aW9ucycpLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBkYXNoYm9hcmRNbzogdGhpcy5tby5jOHlfRGFzaGJvYXJkXG4gICAgICB9LFxuICAgICAgLi4uc2VsZWN0ZWRDb21wb25lbnQuZGF0YS5jb25maWdcbiAgICB9IGFzIENvbnRleHRXaWRnZXRDb25maWc7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlUYXJnZXRJZkRldmljZURhc2hib2FyZChzZXR0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUYXJnZXRJZkRldmljZURhc2hib2FyZCh3aWRnZXRDb25maWc6IENvbnRleHRXaWRnZXRDb25maWcpIHtcbiAgICBjb25zdCBpc0RldmljZVR5cGUgPSB0aGlzLmNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmlzRGV2aWNlVHlwZSh0aGlzLm1vKTtcblxuICAgIGlmIChpc0RldmljZVR5cGUpIHtcbiAgICAgIHdpZGdldENvbmZpZy5zZXR0aW5ncy5oaWRlVGFyZ2V0ID0gaXNEZXZpY2VUeXBlO1xuXG4gICAgICBjb25zdCBub0RldmljZVRhcmdldCA9IHdpZGdldENvbmZpZy5zZXR0aW5ncy5uZzFcbiAgICAgICAgPyB3aWRnZXRDb25maWcuc2V0dGluZ3MubmcxLm9wdGlvbnMubm9EZXZpY2VUYXJnZXRcbiAgICAgICAgOiB3aWRnZXRDb25maWcuc2V0dGluZ3Mubm9EZXZpY2VUYXJnZXQ7XG5cbiAgICAgIGlmICghbm9EZXZpY2VUYXJnZXQpIHtcbiAgICAgICAgd2lkZ2V0Q29uZmlnLmRldmljZSA9IHtcbiAgICAgICAgICBpZDogdGhpcy5jb250ZXh0LmlkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuY29udGV4dC5uYW1lXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3aWRnZXRDb25maWc7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgc2VwYXJhdG9yXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImgzXCJcbiAgICB0aXRsZT1cInt7ICdBZGQgd2lkZ2V0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgaWQ9XCJtb2RhbC10aXRsZVwiXG4gICAgKm5nSWY9XCIhY3VycmVudFwiXG4gICAgdHJhbnNsYXRlXG4gID5cbiAgICBBZGQgd2lkZ2V0XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJoM1wiXG4gICAgdGl0bGU9XCJ7eyAnRWRpdCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICBpZD1cIm1vZGFsLXRpdGxlXCJcbiAgICAqbmdJZj1cImN1cnJlbnRcIlxuICAgIHRyYW5zbGF0ZVxuICA+XG4gICAgRWRpdCB3aWRnZXRcbiAgPC9kaXY+XG48L2Rpdj5cbjxmb3JtIG5hbWU9XCJmb3JtXCIgI2NvbmZpZ0Zvcm09XCJuZ0Zvcm1cIj5cbiAgPGRpdiBjbGFzcz1cImM4eS1tb2RhbC10YWJzXCIgaWQ9XCJtb2RhbC1ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cInRhYkNvbnRhaW5lclwiPlxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIG5hdi10YWJzYzh5IHAtbC0yNFwiPlxuICAgICAgICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJtb2RlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnU2VsZWN0IHdpZGdldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vZGUoJ3NlbGVjdCcpOyAoZmFsc2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwidGgtbGFyZ2VcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+U2VsZWN0IHdpZGdldDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpIFtjbGFzcy5hY3RpdmVdPVwibW9kZSA9PT0gJ2NvbmZpZydcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0blwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vZGUoJ2NvbmZpZycpOyAoZmFsc2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwiY29nXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkNvbmZpZ3VyYXRpb248L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBbY2xhc3MuYWN0aXZlXT1cIm1vZGUgPT09ICdzdHlsZSdcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0blwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FwcGVhcmFuY2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vZGUoJ3N0eWxlJyk7IChmYWxzZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJwYWludC1icnVzaFwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5BcHBlYXJhbmNlPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWlubmVyLXNjcm9sbCBtb2RhbC1pbm5lci1zY3JvbGwtLWZpeGVkXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJiZy1sZXZlbC0wIHAtbC0yNCBwLXItMjQgcC10LTggcC1iLTggc3RpY2t5LWhlYWRlci10b3AtMFwiXG4gICAgICBzdHlsZT1cInotaW5kZXg6IDJcIlxuICAgICAgKm5nSWY9XCJtb2RlID09PSAnc2VsZWN0J1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwid2lkZ2V0LWNvbmZpZy0tU2VhcmNoXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VhcmNo4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGVybVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cInNlYXJjaENoYW5nZSQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnU2VhcmNoJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0U2VhcmNoKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwic2VhcmNoVGVybS5sZW5ndGggPT09IDAgPyAnc2VhcmNoJyA6ICdjbG9zZSdcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGJnLWxldmVsLTJcIiAqbmdJZj1cIm1vZGUgPT09ICdzZWxlY3QnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncm91cCBjYXJkLXNlbGVjdCBtLWItMFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tNCBjb2wteHMtNlwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyBjbXAuZGVzY3JpcHRpb24gfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjbXAgb2Ygc2VhcmNoUmVzdWx0IHx8IGNvbXBvbmVudHNcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gY2FyZCBwLThcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkID09PSBjbXBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdChjbXApXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcC04IG0tYi04IGQtY29sIGZsZXgtY2VudGVyIGJnLWxldmVsLTJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY21wLnByZXZpZXdJbWFnZTsgZWxzZSBwcmV2aWV3SW1hZ2VcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaDFcIj48aSBjOHlJY29uPVwiZmlsZS1pbWFnZS1vXCI+PC9pPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxzbWFsbCB0cmFuc2xhdGU+UHJldmlldyBub3QgYXZhaWxhYmxlPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcHJldmlld0ltYWdlPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctcmVzcG9uc2l2ZVwiIGFsdCBbc3JjXT1cImNtcC5wcmV2aWV3SW1hZ2VcIiAvPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGUgdGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICA8Yzh5LWhpZ2hsaWdodFxuICAgICAgICAgICAgICAgIHRleHQ9XCJ7eyBjbXAubGFiZWwgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIFtwYXR0ZXJuXT1cInNlYXJjaFRlcm1cIlxuICAgICAgICAgICAgICA+PC9jOHktaGlnaGxpZ2h0PlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LWVtcHR5LXN0YXRlIHRleHQtY2VudGVyXCIgKm5nSWY9XCJzZWFyY2hSZXN1bHQgJiYgc2VhcmNoUmVzdWx0Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoMVwiIGM4eUljb249XCJzZWFyY2hcIj48L2Rpdj5cbiAgICAgICAgICA8aDMgdHJhbnNsYXRlPk5vIHdpZGdldHMgZm91bmQuPC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm0tci04XCIgdHJhbnNsYXRlPlJlcGhyYXNlIHlvdXIgc2VhcmNoIHRlcm0uPC9wPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZXNldCBzZWFyY2gnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0U2VhcmNoKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnUmVzZXQgc2VhcmNoJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRoZSBmb2xsb3dpbmcgaXMgaW50ZW50aW9uYWwgc2V0IHRvIGhpZGRlbiB0byBhbGxvdyB0aGUgVmlld0NoaWxkIHJlZiBpbiB0aGUgY29udHJvbGxlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGQtY29sIGZpdC1oXCIgKm5nSWY9XCJzZWxlY3RlZFwiIFtuZ0NsYXNzXT1cInsgaGlkZGVuOiBtb2RlICE9PSAnY29uZmlnJyB9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTE2IGZsZXgtbm8tc2hyaW5rIHNlcGFyYXRvci1ib3R0b20gcC1iLTE2XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWwtMjRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbGVmdCB0ZXh0LW1lZGl1bSBoNFwiPlxuICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZC5kZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLXItMjRcIj5cbiAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ3aWRnZXRUaXRsZVwiIHRyYW5zbGF0ZT5UaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBpZD1cIndpZGdldFRpdGxlXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkLmRhdGEudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0ge3sgY29tcG9uZW50TGFiZWwgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGZsZXgtZ3Jvd1wiIFtuZ0NsYXNzXT1cInsgJ2QtZmxleCc6IHdpZGdldENvbmZpZy5vcHRpb25zIHx8IGhhc0NvbmZpZygpIH1cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYS1zLXN0cmV0Y2hcIlxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldENvbmZpZy5zZXR0aW5ncz8ubm9EZXZpY2VUYXJnZXRcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdiZy1sZXZlbC0xIGNvbC1zbS00IHAtci0wJzogaGFzQ29uZmlnKCksXG4gICAgICAgICAgICAnYmctbGV2ZWwtMCBjb2wtc20tMTInOiAhaGFzQ29uZmlnKClcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXQtaCBiZy1pbmhlcml0IHAtbC0xNlwiIFtuZ0NsYXNzXT1cInsgJ3Atci0yNCc6ICFoYXNDb25maWcoKSB9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1yZWxhdGl2ZSBiZy1pbmhlcml0XCI+XG4gICAgICAgICAgICAgIDxjOHktYXNzZXQtc2VsZWN0b3ItbWlsbGVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWJsb2NrIGJnLWluaGVyaXQgcC1yZWxhdGl2ZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwdmggLSA0MjJweClcIlxuICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cInNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xlYXJTZWxlY3RlZCk9XCJzZWxlY3Rpb25DaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwie1xuICAgICAgICAgICAgICAgICAgdmlldzogJ21pbGxlcicsXG4gICAgICAgICAgICAgICAgICBncm91cHNTZWxlY3RhYmxlOiB0aGlzLndpZGdldENvbmZpZy5zZXR0aW5ncz8uZ3JvdXBzU2VsZWN0YWJsZSxcbiAgICAgICAgICAgICAgICAgIHNob3dDaGlsZERldmljZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICBjb2x1bW5IZWFkZXJzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgc2hvd1VuYXNzaWduZWREZXZpY2VzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgc2VhcmNoOiAhdGhpcy53aWRnZXRDb25maWcuc2V0dGluZ3MuY29udGV4dD8uYWRkaXRpb25QYXJlbnRzLFxuICAgICAgICAgICAgICAgICAgc2hvd0ZpbHRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHNpbmdsZUNvbHVtbjogISF0aGlzLmhhc0NvbmZpZygpXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW2Fzc2V0XT1cIndpZGdldENvbmZpZy5zZXR0aW5ncz8uY29udGV4dFwiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkRGV2aWNlXT1cInNlbGVjdGVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgPjwvYzh5LWFzc2V0LXNlbGVjdG9yLW1pbGxlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdjb2wtc20tOCc6ICF3aWRnZXRDb25maWcuc2V0dGluZ3M/Lm5vRGV2aWNlVGFyZ2V0LFxuICAgICAgICAgICAgJ2NvbC1zbS0xMic6IHdpZGdldENvbmZpZy5zZXR0aW5ncz8ubm9EZXZpY2VUYXJnZXQsXG4gICAgICAgICAgICAnc3Itb25seSc6ICFoYXNDb25maWcoKVxuICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGM4eS1keW5hbWljLWNvbXBvbmVudFxuICAgICAgICAgICAgY2xhc3M9XCJkLWJsb2NrXCJcbiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiB7eyBoYXNDb25maWcoKSA/ICdjYWxjKDEwMHZoIC0gNDIycHgpJyA6ICcwJyB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpbm5lci1zY3JvbGwgcC1yLTI0JzogIXdpZGdldENvbmZpZy5zZXR0aW5ncz8ubm9EZXZpY2VUYXJnZXQgfVwiXG4gICAgICAgICAgICBbY29tcG9uZW50SWRdPVwic2VsZWN0ZWQuaWRcIlxuICAgICAgICAgICAgbW9kZT1cImNvbmZpZ1wiXG4gICAgICAgICAgICBbY29uZmlnXT1cIndpZGdldENvbmZpZ1wiXG4gICAgICAgICAgICBbbm90Rm91bmRFcnJvcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAjY29uZmlnXG4gICAgICAgICAgPjwvYzh5LWR5bmFtaWMtY29tcG9uZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgcC10LTBcIiBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDMxMHB4KVwiICpuZ0lmPVwibW9kZSA9PT0gJ3N0eWxlJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTZcIj5cbiAgICAgICAgICA8Yzh5LWFwcGVhcmFuY2Utc2V0dGluZ3NcbiAgICAgICAgICAgIFsodGhlbWVDbGFzcyldPVwic3R5bGluZy5jb250ZW50Q2xhc3NcIlxuICAgICAgICAgICAgWyhoZWFkZXJDbGFzcyldPVwic3R5bGluZy5oZWFkZXJDbGFzc1wiXG4gICAgICAgICAgICBbcG9zc2libGVTdHlsaW5nVGhlbWVdPVwicG9zc2libGVTdHlsaW5nLldJREdFVF9DT05URU5UX0NMQVNTRVNcIlxuICAgICAgICAgICAgW3Bvc3NpYmxlU3R5bGluZ0hlYWRlcl09XCJwb3NzaWJsZVN0eWxpbmcuV0lER0VUX0hFQURFUl9DTEFTU0VTXCJcbiAgICAgICAgICAgIFtkZWZhdWx0VGhlbWVDbGFzc109XCJkZWZhdWx0U3R5bGluZy5jb250ZW50Q2xhc3NcIlxuICAgICAgICAgICAgW2RlZmF1bHRIZWFkZXJDbGFzc109XCJkZWZhdWx0U3R5bGluZy5oZWFkZXJDbGFzc1wiXG4gICAgICAgICAgPjwvYzh5LWFwcGVhcmFuY2Utc2V0dGluZ3M+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTYgc3RpY2t5LWhlYWRlci10b3AtMFwiPlxuICAgICAgICAgIDxjOHktd2lkZ2V0LXByZXZpZXdcbiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMzgycHgpXCJcbiAgICAgICAgICAgIFtwcmV2aWV3Q2xhc3Nlc109XCJnZXRTdHlsZSh0cnVlKVwiXG4gICAgICAgICAgPjwvYzh5LXdpZGdldC1wcmV2aWV3PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcbiAgICA+XG4gICAgICB7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgIGNvbnRleHREYXNoYm9hcmRTZXJ2aWNlLmZvcm1EaXNhYmxlZCB8fCBjb25maWdGb3JtLmludmFsaWQgfHwgY2hlY2tJZkRldmljZVJlcXVpcmVkKClcbiAgICAgIFwiXG4gICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgW2FjdGlvbk5hbWVdPVwiY3VycmVudCA/ICdlZGl0V2lkZ2V0JyA6ICdjcmVhdGVXaWRnZXQnXCJcbiAgICAgIFthY3Rpb25EYXRhXT1cInsgd2lkZ2V0TmFtZTogc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuaWQgfVwiXG4gICAgPlxuICAgICAge3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19