@c8y/ngx-components 1021.36.0 → 1021.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/alarms/alarms-view.service.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.component.d.ts.map +1 -1
- package/core/common/forOf.directive.d.ts.map +1 -1
- package/core/file-picker/file-picker.component.d.ts +4 -2
- package/core/file-picker/file-picker.component.d.ts.map +1 -1
- package/core/forms/validation-pattern.d.ts +8 -0
- package/core/forms/validation-pattern.d.ts.map +1 -1
- package/core/i18n/datahub.pattern-messages.data.d.ts +30 -0
- package/core/i18n/datahub.pattern-messages.data.d.ts.map +1 -0
- package/core/i18n/i18n.module.d.ts.map +1 -1
- package/esm2022/alarms/alarms-view.service.mjs +3 -1
- package/esm2022/alarms/alarms.component.mjs +2 -2
- package/esm2022/assets-navigator/asset-selector/asset-selector.component.mjs +3 -3
- package/esm2022/context-dashboard/context-dashboard.component.mjs +8 -2
- package/esm2022/core/common/forOf.directive.mjs +5 -1
- package/esm2022/core/file-picker/file-picker.component.mjs +7 -5
- package/esm2022/core/forms/validation-pattern.mjs +9 -1
- package/esm2022/core/i18n/datahub.pattern-messages.data.mjs +31 -0
- package/esm2022/core/i18n/i18n.module.mjs +3 -1
- package/esm2022/core/navigator/navigator-bottom/navigator-bottom.component.mjs +3 -3
- package/esm2022/operations/operations-list/operations-list-item.component.mjs +14 -6
- package/esm2022/operations/operations-list/operations-list.component.mjs +13 -5
- package/esm2022/repository/configuration/list/configuration-detail.component.mjs +5 -4
- package/esm2022/repository/firmware/list/add-firmware-modal.component.mjs +5 -4
- package/esm2022/repository/software/list/add-software-modal.component.mjs +5 -4
- package/fesm2022/c8y-ngx-components-alarms.mjs +3 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs +2 -2
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +6 -0
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +25 -9
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +10 -9
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +4 -3
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +4 -3
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +115 -71
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +22 -4
- package/locales/es.po +22 -4
- package/locales/fr.po +22 -4
- package/locales/ja_JP.po +22 -5
- package/locales/ko.po +22 -5
- package/locales/locales.pot +20 -2
- package/locales/nl.po +22 -4
- package/locales/pl.po +22 -4
- package/locales/pt_BR.po +22 -4
- package/locales/zh_CN.po +22 -5
- package/locales/zh_TW.po +22 -5
- package/operations/operations-list/operations-list-item.component.d.ts +3 -1
- package/operations/operations-list/operations-list-item.component.d.ts.map +1 -1
- package/operations/operations-list/operations-list.component.d.ts +1 -0
- package/operations/operations-list/operations-list.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/repository/configuration/list/configuration-detail.component.d.ts +2 -1
- package/repository/configuration/list/configuration-detail.component.d.ts.map +1 -1
- package/repository/firmware/list/add-firmware-modal.component.d.ts +2 -1
- package/repository/firmware/list/add-firmware-modal.component.d.ts.map +1 -1
- package/repository/software/list/add-software-modal.component.d.ts +2 -1
- package/repository/software/list/add-software-modal.component.d.ts.map +1 -1
|
@@ -5,8 +5,8 @@ import { SINGLE_OPERATION_EVENT_DEVICE_TAB, SINGLE_OPERATION_EVENT_OVERVIEW } fr
|
|
|
5
5
|
import { OPERATION_STATUS_OPTIONS_MAP } from '@c8y/ngx-components/operations/shared';
|
|
6
6
|
import { StatusFilterComponent } from '@c8y/ngx-components/operations/status-filter';
|
|
7
7
|
import { flatten } from 'lodash-es';
|
|
8
|
-
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
9
|
-
import { shareReplay, switchMap, tap } from 'rxjs/operators';
|
|
8
|
+
import { BehaviorSubject, combineLatest, pipe } from 'rxjs';
|
|
9
|
+
import { map, shareReplay, switchMap, tap } from 'rxjs/operators';
|
|
10
10
|
import { OperationsListService } from './operations-list.service';
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
import * as i1 from "@c8y/ngx-components";
|
|
@@ -32,6 +32,14 @@ export class OperationsListComponent {
|
|
|
32
32
|
}), switchMap(([statusFilters]) => this.filter(statusFilters)), tap(() => {
|
|
33
33
|
this.refreshLoading = false;
|
|
34
34
|
}), shareReplay(1));
|
|
35
|
+
this.operationsFilterPipe = pipe(map((operations) => {
|
|
36
|
+
const statusFilters = this.statusFilter$.getValue();
|
|
37
|
+
if (!statusFilters || !statusFilters.length) {
|
|
38
|
+
return operations;
|
|
39
|
+
}
|
|
40
|
+
const allowedStatuses = flatten(statusFilters.map(sf => sf.status));
|
|
41
|
+
return operations.filter(op => allowedStatuses.includes(op.status));
|
|
42
|
+
}));
|
|
35
43
|
this.productExperienceEvent = {
|
|
36
44
|
eventName: !!this.deviceId ? SINGLE_OPERATION_EVENT_DEVICE_TAB : SINGLE_OPERATION_EVENT_OVERVIEW
|
|
37
45
|
};
|
|
@@ -66,7 +74,7 @@ export class OperationsListComponent {
|
|
|
66
74
|
provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
|
|
67
75
|
useExisting: forwardRef(() => OperationsListComponent)
|
|
68
76
|
}
|
|
69
|
-
], viewQueries: [{ propertyName: "statusFilter", first: true, predicate: ["statusFilter"], descendants: true, static: true }], ngImport: i0, template: "<c8y-title>{{ title | translate }}</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"showOverviewBreadcrumbs\">\n <c8y-breadcrumb-item\n [icon]=\"'c8y-overviews'\"\n [label]=\"'Overviews' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-control'\"\n [label]=\"'Device Control' | translate\"\n [path]=\"'devicecontrol/single'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-control'\"\n [label]=\"'Single operations' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <c8y-status-filter\n #statusFilter\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"statusFilter$.next($event)\"\n c8yProductExperience\n inherit\n ></c8y-status-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"realtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link d-flex a-i-center\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload$.next()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': refreshLoading }\"\n ></i>\n <span class=\"text-truncate\">\n {{ 'Reload' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n src=\"/docs/device-management-application/monitoring-and-controlling-devices/#to-view-single-operations\"\n></c8y-help>\n\n<!-- Empty state -->\n<c8y-ui-empty-state\n [icon]=\"'c8y-energy'\"\n [title]=\"'No items to display.' | translate\"\n [subtitle]=\"'Operations will be displayed here.' | translate\"\n *ngIf=\"(operations$ | async)?.data.length === 0 && !(statusFilter$ | async)\"\n></c8y-ui-empty-state>\n<!-- No results empty state -->\n<c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'Adjust or reset the filter.' | translate\"\n *ngIf=\"(operations$ | async)?.data.length === 0 && (statusFilter$ | async)\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Reset filter' | translate }}\"\n type=\"button\"\n (click)=\"statusFilter.reset()\"\n translate\n >\n Reset filter\n </button>\n</c8y-ui-empty-state>\n\n<!-- Detailed list of operations + load more button -->\n<c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header c8y-list__item c8y-list__item--double-actions hidden-xs\"\n *ngIf=\"(operations$ | async)?.data.length\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i class=\"p-l-24\"></i>\n </div>\n <div class=\"c8y-list__item__body text-truncate-wrap\">\n <div class=\"content-flex-57\">\n <div class=\"col-5\">\n {{ 'Operation' | translate }}\n </div>\n <div\n class=\"flex-grow\"\n *ngIf=\"!deviceId\"\n >\n {{ 'Device' | translate }}\n </div>\n <div class=\"col-4\">\n {{ 'Date created' | translate }}\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n <div\n class=\"d-contents\"\n *c8yFor=\"\n let op of operations$ | async;\n let i = index;\n realtime: realtime;\n realtimeOptions: { entityOrId: deviceId };\n comparator: compareOperations.bind(this);\n loadMore: 'auto'\n \"\n >\n <c8y-operations-list-item\n class=\"d-contents\"\n [operation]=\"op\"\n [isSmartRulesMicroserviceAvailable]=\"isSmartRulesMicroserviceAvailable\"\n (reload)=\"reload$.next()\"\n c8yProductExperience\n inherit\n ></c8y-operations-list-item>\n </div>\n</c8y-list-group>\n", dependencies: [{ kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i1.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "directive", type: i1.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: i1.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i1.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i5.StatusFilterComponent, selector: "c8y-status-filter", inputs: ["options", "multiple", "small"], outputs: ["onFilterChanged"] }, { kind: "component", type: i6.OperationsListItemComponent, selector: "c8y-operations-list-item", inputs: ["operation", "collapsed", "readOnly", "noExpandToggle", "isSmartRulesMicroserviceAvailable"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
77
|
+
], viewQueries: [{ propertyName: "statusFilter", first: true, predicate: ["statusFilter"], descendants: true, static: true }], ngImport: i0, template: "<c8y-title>{{ title | translate }}</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"showOverviewBreadcrumbs\">\n <c8y-breadcrumb-item\n [icon]=\"'c8y-overviews'\"\n [label]=\"'Overviews' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-control'\"\n [label]=\"'Device Control' | translate\"\n [path]=\"'devicecontrol/single'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-control'\"\n [label]=\"'Single operations' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <c8y-status-filter\n #statusFilter\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"statusFilter$.next($event)\"\n c8yProductExperience\n inherit\n ></c8y-status-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"realtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link d-flex a-i-center\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload$.next()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': refreshLoading }\"\n ></i>\n <span class=\"text-truncate\">\n {{ 'Reload' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n src=\"/docs/device-management-application/monitoring-and-controlling-devices/#to-view-single-operations\"\n></c8y-help>\n\n<!-- Empty state -->\n<c8y-ui-empty-state\n [icon]=\"'c8y-energy'\"\n [title]=\"'No items to display.' | translate\"\n [subtitle]=\"'Operations will be displayed here.' | translate\"\n *ngIf=\"(operations$ | async)?.data.length === 0 && !(statusFilter$ | async)\"\n></c8y-ui-empty-state>\n<!-- No results empty state -->\n<c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'Adjust or reset the filter.' | translate\"\n *ngIf=\"(operations$ | async)?.data.length === 0 && (statusFilter$ | async)\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Reset filter' | translate }}\"\n type=\"button\"\n (click)=\"statusFilter.reset()\"\n translate\n >\n Reset filter\n </button>\n</c8y-ui-empty-state>\n\n<!-- Detailed list of operations + load more button -->\n<c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header c8y-list__item c8y-list__item--double-actions hidden-xs\"\n *ngIf=\"(operations$ | async)?.data.length\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i class=\"p-l-24\"></i>\n </div>\n <div class=\"c8y-list__item__body text-truncate-wrap\">\n <div class=\"content-flex-57\">\n <div class=\"col-5\">\n {{ 'Operation' | translate }}\n </div>\n <div\n class=\"flex-grow\"\n *ngIf=\"!deviceId\"\n >\n {{ 'Device' | translate }}\n </div>\n <div class=\"col-4\">\n {{ 'Date created' | translate }}\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n <div\n class=\"d-contents\"\n *c8yFor=\"\n let op of operations$ | async;\n let i = index;\n realtime: realtime;\n realtimeOptions: { entityOrId: deviceId, removeOnUpdate: true, insertOnUpdate: true };\n comparator: compareOperations.bind(this);\n loadMore: 'auto';\n pipe: operationsFilterPipe\n \"\n >\n <c8y-operations-list-item\n class=\"d-contents\"\n [operation]=\"op\"\n [isSmartRulesMicroserviceAvailable]=\"isSmartRulesMicroserviceAvailable\"\n (reload)=\"reload$.next()\"\n c8yProductExperience\n inherit\n ></c8y-operations-list-item>\n </div>\n</c8y-list-group>\n", dependencies: [{ kind: "component", type: i1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i1.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "directive", type: i1.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: i1.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i1.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i5.StatusFilterComponent, selector: "c8y-status-filter", inputs: ["options", "multiple", "small"], outputs: ["onFilterChanged"] }, { kind: "component", type: i6.OperationsListItemComponent, selector: "c8y-operations-list-item", inputs: ["operation", "collapsed", "readOnly", "noExpandToggle", "isSmartRulesMicroserviceAvailable"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
70
78
|
}
|
|
71
79
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: OperationsListComponent, decorators: [{
|
|
72
80
|
type: Component,
|
|
@@ -76,9 +84,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
76
84
|
provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
|
|
77
85
|
useExisting: forwardRef(() => OperationsListComponent)
|
|
78
86
|
}
|
|
79
|
-
], template: "<c8y-title>{{ title | translate }}</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"showOverviewBreadcrumbs\">\n <c8y-breadcrumb-item\n [icon]=\"'c8y-overviews'\"\n [label]=\"'Overviews' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-control'\"\n [label]=\"'Device Control' | translate\"\n [path]=\"'devicecontrol/single'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-control'\"\n [label]=\"'Single operations' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <c8y-status-filter\n #statusFilter\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"statusFilter$.next($event)\"\n c8yProductExperience\n inherit\n ></c8y-status-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"realtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link d-flex a-i-center\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload$.next()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': refreshLoading }\"\n ></i>\n <span class=\"text-truncate\">\n {{ 'Reload' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n src=\"/docs/device-management-application/monitoring-and-controlling-devices/#to-view-single-operations\"\n></c8y-help>\n\n<!-- Empty state -->\n<c8y-ui-empty-state\n [icon]=\"'c8y-energy'\"\n [title]=\"'No items to display.' | translate\"\n [subtitle]=\"'Operations will be displayed here.' | translate\"\n *ngIf=\"(operations$ | async)?.data.length === 0 && !(statusFilter$ | async)\"\n></c8y-ui-empty-state>\n<!-- No results empty state -->\n<c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'Adjust or reset the filter.' | translate\"\n *ngIf=\"(operations$ | async)?.data.length === 0 && (statusFilter$ | async)\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Reset filter' | translate }}\"\n type=\"button\"\n (click)=\"statusFilter.reset()\"\n translate\n >\n Reset filter\n </button>\n</c8y-ui-empty-state>\n\n<!-- Detailed list of operations + load more button -->\n<c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header c8y-list__item c8y-list__item--double-actions hidden-xs\"\n *ngIf=\"(operations$ | async)?.data.length\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i class=\"p-l-24\"></i>\n </div>\n <div class=\"c8y-list__item__body text-truncate-wrap\">\n <div class=\"content-flex-57\">\n <div class=\"col-5\">\n {{ 'Operation' | translate }}\n </div>\n <div\n class=\"flex-grow\"\n *ngIf=\"!deviceId\"\n >\n {{ 'Device' | translate }}\n </div>\n <div class=\"col-4\">\n {{ 'Date created' | translate }}\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n <div\n class=\"d-contents\"\n *c8yFor=\"\n let op of operations$ | async;\n let i = index;\n realtime: realtime;\n realtimeOptions: { entityOrId: deviceId };\n comparator: compareOperations.bind(this);\n loadMore: 'auto'\n \"\n >\n <c8y-operations-list-item\n class=\"d-contents\"\n [operation]=\"op\"\n [isSmartRulesMicroserviceAvailable]=\"isSmartRulesMicroserviceAvailable\"\n (reload)=\"reload$.next()\"\n c8yProductExperience\n inherit\n ></c8y-operations-list-item>\n </div>\n</c8y-list-group>\n" }]
|
|
87
|
+
], template: "<c8y-title>{{ title | translate }}</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"showOverviewBreadcrumbs\">\n <c8y-breadcrumb-item\n [icon]=\"'c8y-overviews'\"\n [label]=\"'Overviews' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-control'\"\n [label]=\"'Device Control' | translate\"\n [path]=\"'devicecontrol/single'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-control'\"\n [label]=\"'Single operations' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <c8y-status-filter\n #statusFilter\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"statusFilter$.next($event)\"\n c8yProductExperience\n inherit\n ></c8y-status-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <c8y-realtime-btn [service]=\"realtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link d-flex a-i-center\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload$.next()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': refreshLoading }\"\n ></i>\n <span class=\"text-truncate\">\n {{ 'Reload' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n src=\"/docs/device-management-application/monitoring-and-controlling-devices/#to-view-single-operations\"\n></c8y-help>\n\n<!-- Empty state -->\n<c8y-ui-empty-state\n [icon]=\"'c8y-energy'\"\n [title]=\"'No items to display.' | translate\"\n [subtitle]=\"'Operations will be displayed here.' | translate\"\n *ngIf=\"(operations$ | async)?.data.length === 0 && !(statusFilter$ | async)\"\n></c8y-ui-empty-state>\n<!-- No results empty state -->\n<c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'Adjust or reset the filter.' | translate\"\n *ngIf=\"(operations$ | async)?.data.length === 0 && (statusFilter$ | async)\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Reset filter' | translate }}\"\n type=\"button\"\n (click)=\"statusFilter.reset()\"\n translate\n >\n Reset filter\n </button>\n</c8y-ui-empty-state>\n\n<!-- Detailed list of operations + load more button -->\n<c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header c8y-list__item c8y-list__item--double-actions hidden-xs\"\n *ngIf=\"(operations$ | async)?.data.length\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i class=\"p-l-24\"></i>\n </div>\n <div class=\"c8y-list__item__body text-truncate-wrap\">\n <div class=\"content-flex-57\">\n <div class=\"col-5\">\n {{ 'Operation' | translate }}\n </div>\n <div\n class=\"flex-grow\"\n *ngIf=\"!deviceId\"\n >\n {{ 'Device' | translate }}\n </div>\n <div class=\"col-4\">\n {{ 'Date created' | translate }}\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n <div\n class=\"d-contents\"\n *c8yFor=\"\n let op of operations$ | async;\n let i = index;\n realtime: realtime;\n realtimeOptions: { entityOrId: deviceId, removeOnUpdate: true, insertOnUpdate: true };\n comparator: compareOperations.bind(this);\n loadMore: 'auto';\n pipe: operationsFilterPipe\n \"\n >\n <c8y-operations-list-item\n class=\"d-contents\"\n [operation]=\"op\"\n [isSmartRulesMicroserviceAvailable]=\"isSmartRulesMicroserviceAvailable\"\n (reload)=\"reload$.next()\"\n c8yProductExperience\n inherit\n ></c8y-operations-list-item>\n </div>\n</c8y-list-group>\n" }]
|
|
80
88
|
}], ctorParameters: () => [{ type: i1.OperationRealtimeService }, { type: i2.OperationsListService }, { type: i3.ActivatedRoute }], propDecorators: { statusFilter: [{
|
|
81
89
|
type: ViewChild,
|
|
82
90
|
args: ['statusFilter', { static: true }]
|
|
83
91
|
}] } });
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9ucy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL29wZXJhdGlvbnMvb3BlcmF0aW9ucy1saXN0L29wZXJhdGlvbnMtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9vcGVyYXRpb25zL29wZXJhdGlvbnMtbGlzdC9vcGVyYXRpb25zLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLHdCQUF3QixFQUd4QiwrQkFBK0IsRUFDaEMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsaUNBQWlDLEVBQ2pDLCtCQUErQixFQUNoQyxNQUFNLG1EQUFtRCxDQUFDO0FBQzNELE9BQU8sRUFHTCw0QkFBNEIsRUFDN0IsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7OztBQWFsRSxNQUFNLE9BQU8sdUJBQXVCO0lBOEJsQyxZQUNTLFFBQWtDLEVBQ2pDLHFCQUE0QyxFQUM1QyxLQUFxQjtRQUZ0QixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNqQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FB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LENBQzFGLENBQUM7SUFDSixDQUFDOzhHQWxFVSx1QkFBdUI7a0dBQXZCLHVCQUF1Qiw4Q0FSdkI7WUFDVCx3QkFBd0I7WUFDeEI7Z0JBQ0UsT0FBTyxFQUFFLCtCQUErQjtnQkFDeEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQzthQUN2RDtTQUNGLHNKQ2xDSCxxeUhBbUlBOzsyRkQvRmEsdUJBQXVCO2tCQVhuQyxTQUFTOytCQUNFLHFCQUFxQixhQUVwQjt3QkFDVCx3QkFBd0I7d0JBQ3hCOzRCQUNFLE9BQU8sRUFBRSwrQkFBK0I7NEJBQ3hDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixDQUFDO3lCQUN2RDtxQkFDRjs4SkFZNEMsWUFBWTtzQkFBeEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElPcGVyYXRpb24sIElSZXN1bHRMaXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgZ2V0dGV4dCxcbiAgT3BlcmF0aW9uUmVhbHRpbWVTZXJ2aWNlLFxuICBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50LFxuICBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0VfRVZFTlRfU09VUkNFXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgU0lOR0xFX09QRVJBVElPTl9FVkVOVF9ERVZJQ0VfVEFCLFxuICBTSU5HTEVfT1BFUkFUSU9OX0VWRU5UX09WRVJWSUVXXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvb3BlcmF0aW9ucy9wcm9kdWN0LWV4cGVyaWVuY2UnO1xuaW1wb3J0IHtcbiAgT3BlcmF0aW9uU3RhdHVzT3B0aW9uLFxuICBPcGVyYXRpb25TdGF0dXNPcHRpb25zTWFwU2hhcmVkLFxuICBPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvb3BlcmF0aW9ucy9zaGFyZWQnO1xuaW1wb3J0IHsgU3RhdHVzRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9vcGVyYXRpb25zL3N0YXR1cy1maWx0ZXInO1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9wZXJhdGlvbnNMaXN0U2VydmljZSB9IGZyb20gJy4vb3BlcmF0aW9ucy1saXN0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktb3BlcmF0aW9ucy1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICdvcGVyYXRpb25zLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICBPcGVyYXRpb25SZWFsdGltZVNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9wZXJhdGlvbnNMaXN0Q29tcG9uZW50KVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25zTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2Uge1xuICBkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YT8uaWQ7XG4gIE9QRVJBVElPTl9TVEFUVVNfT1BUSU9OU19NQVA6IE9wZXJhdGlvblN0YXR1c09wdGlvbnNNYXBTaGFyZWQgPSBPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQO1xuXG4gIHRpdGxlOiBzdHJpbmc7XG4gIHJlZnJlc2hMb2FkaW5nID0gZmFsc2U7XG4gIGlzU21hcnRSdWxlc01pY3Jvc2VydmljZUF2YWlsYWJsZSA9IGZhbHNlO1xuICBzaG93T3ZlcnZpZXdCcmVhZGNydW1icyA9IGZhbHNlO1xuICBzdGF0dXNGaWx0ZXIkOiBCZWhhdmlvclN1YmplY3Q8T3BlcmF0aW9uU3RhdHVzT3B0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgcmVsb2FkJDogQmVoYXZpb3JTdWJqZWN0PHZvaWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgQFZpZXdDaGlsZCgnc3RhdHVzRmlsdGVyJywgeyBzdGF0aWM6IHRydWUgfSkgc3RhdHVzRmlsdGVyOiBTdGF0dXNGaWx0ZXJDb21wb25lbnQ7XG5cbiAgb3BlcmF0aW9ucyQ6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SU9wZXJhdGlvbj4+ID0gY29tYmluZUxhdGVzdChcbiAgICB0aGlzLnN0YXR1c0ZpbHRlciQsXG4gICAgdGhpcy5yZWxvYWQkXG4gICkucGlwZShcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoTG9hZGluZyA9IHRydWU7XG4gICAgfSksXG4gICAgc3dpdGNoTWFwKChbc3RhdHVzRmlsdGVyc10pID0+IHRoaXMuZmlsdGVyKHN0YXR1c0ZpbHRlcnMpKSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudDogUHJvZHVjdEV4cGVyaWVuY2VFdmVudCA9IHtcbiAgICBldmVudE5hbWU6ICEhdGhpcy5kZXZpY2VJZCA/IFNJTkdMRV9PUEVSQVRJT05fRVZFTlRfREVWSUNFX1RBQiA6IFNJTkdMRV9PUEVSQVRJT05fRVZFTlRfT1ZFUlZJRVdcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhbHRpbWU6IE9wZXJhdGlvblJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIG9wZXJhdGlvbnNMaXN0U2VydmljZTogT3BlcmF0aW9uc0xpc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge1xuICAgIHRoaXMudGl0bGUgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmVudC5kYXRhLmNvbnRleHREYXRhXG4gICAgICA/IHRoaXMucm91dGUuc25hcHNob3QucGFyZW50LmRhdGEuY29udGV4dERhdGEubmFtZVxuICAgICAgOiBnZXR0ZXh0KCdTaW5nbGUgb3BlcmF0aW9ucycpO1xuICAgIHRoaXMuc2hvd092ZXJ2aWV3QnJlYWRjcnVtYnMgPSAhdGhpcy5kZXZpY2VJZDtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNTbWFydFJ1bGVzTWljcm9zZXJ2aWNlQXZhaWxhYmxlID1cbiAgICAgIGF3YWl0IHRoaXMub3BlcmF0aW9uc0xpc3RTZXJ2aWNlLmlzU21hcnRSdWxlc01pY3Jvc2VydmljZUF2YWlsYWJsZSgpO1xuICB9XG5cbiAgZmlsdGVyKHN0YXR1c0ZpbHRlcnM6IE9wZXJhdGlvblN0YXR1c09wdGlvbltdKSB7XG4gICAgY29uc3Qgc3RhdHVzID1cbiAgICAgIHN0YXR1c0ZpbHRlcnMgJiYgc3RhdHVzRmlsdGVycy5sZW5ndGggPiAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3RhdHVzOiBmbGF0dGVuKHN0YXR1c0ZpbHRlcnMubWFwKHN0YXR1c0ZpbHRlciA9PiBzdGF0dXNGaWx0ZXIuc3RhdHVzKSlcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5nZXRPcGVyYXRpb25zKHN0YXR1cyk7XG4gIH1cblxuICBnZXRPcGVyYXRpb25zKGZpbHRlcj8pIHtcbiAgICBjb25zdCBxdWVyeUZpbHRlciA9IHRoaXMuZGV2aWNlSWQgPyB7IC4uLmZpbHRlciwgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQgfSA6IGZpbHRlcjtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zTGlzdFNlcnZpY2UuZ2V0T3BlcmF0aW9ucyhxdWVyeUZpbHRlcik7XG4gIH1cblxuICBjb21wYXJlT3BlcmF0aW9ucyhvcGVyYXRpb25BOiBJT3BlcmF0aW9uLCBvcGVyYXRpb25COiBJT3BlcmF0aW9uKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKFxuICAgICAgbmV3IERhdGUob3BlcmF0aW9uQS5jcmVhdGlvblRpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKG9wZXJhdGlvbkIuY3JlYXRpb25UaW1lKS5nZXRUaW1lKClcbiAgICApO1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7IHRpdGxlIHwgdHJhbnNsYXRlIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYiAqbmdJZj1cInNob3dPdmVydmlld0JyZWFkY3J1bWJzXCI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiJ2M4eS1vdmVydmlld3MnXCJcbiAgICBbbGFiZWxdPVwiJ092ZXJ2aWV3cycgfCB0cmFuc2xhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtpY29uXT1cIidjOHktZGV2aWNlLWNvbnRyb2wnXCJcbiAgICBbbGFiZWxdPVwiJ0RldmljZSBDb250cm9sJyB8IHRyYW5zbGF0ZVwiXG4gICAgW3BhdGhdPVwiJ2RldmljZWNvbnRyb2wvc2luZ2xlJ1wiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiJ2M4eS1kZXZpY2UtY29udHJvbCdcIlxuICAgIFtsYWJlbF09XCInU2luZ2xlIG9wZXJhdGlvbnMnIHwgdHJhbnNsYXRlXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgaXRlbUNsYXNzPVwibmF2YmFyLWZvcm1cIlxuPlxuICA8Yzh5LXN0YXR1cy1maWx0ZXJcbiAgICAjc3RhdHVzRmlsdGVyXG4gICAgW29wdGlvbnNdPVwiT1BFUkFUSU9OX1NUQVRVU19PUFRJT05TX01BUFwiXG4gICAgKG9uRmlsdGVyQ2hhbmdlZCk9XCJzdGF0dXNGaWx0ZXIkLm5leHQoJGV2ZW50KVwiXG4gICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICBpbmhlcml0XG4gID48L2M4eS1zdGF0dXMtZmlsdGVyPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGM4eS1yZWFsdGltZS1idG4gW3NlcnZpY2VdPVwicmVhbHRpbWVcIj48L2M4eS1yZWFsdGltZS1idG4+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgZC1mbGV4IGEtaS1jZW50ZXJcIlxuICAgIHRpdGxlPVwie3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIChjbGljayk9XCJyZWxvYWQkLm5leHQoKVwiXG4gID5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiByZWZyZXNoTG9hZGluZyB9XCJcbiAgICA+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAge3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWhlbHBcbiAgc3JjPVwiL2RvY3MvZGV2aWNlLW1hbmFnZW1lbnQtYXBwbGljYXRpb24vbW9uaXRvcmluZy1hbmQtY29udHJvbGxpbmctZGV2aWNlcy8jdG8tdmlldy1zaW5nbGUtb3BlcmF0aW9uc1wiXG4+PC9jOHktaGVscD5cblxuPCEtLSBFbXB0eSBzdGF0ZSAgLS0+XG48Yzh5LXVpLWVtcHR5LXN0YXRlXG4gIFtpY29uXT1cIidjOHktZW5lcmd5J1wiXG4gIFt0aXRsZV09XCInTm8gaXRlbXMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgW3N1YnRpdGxlXT1cIidPcGVyYXRpb25zIHdpbGwgYmUgZGlzcGxheWVkIGhlcmUuJyB8IHRyYW5zbGF0ZVwiXG4gICpuZ0lmPVwiKG9wZXJhdGlvbnMkIHwgYXN5bmMpPy5kYXRhLmxlbmd0aCA9PT0gMCAmJiAhKHN0YXR1c0ZpbHRlciQgfCBhc3luYylcIlxuPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuPCEtLSBObyByZXN1bHRzIGVtcHR5IHN0YXRlIC0tPlxuPGM4eS11aS1lbXB0eS1zdGF0ZVxuICBbaWNvbl09XCInc2VhcmNoJ1wiXG4gIFt0aXRsZV09XCInTm8gcmVzdWx0cyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICBbc3VidGl0bGVdPVwiJ0FkanVzdCBvciByZXNldCB0aGUgZmlsdGVyLicgfCB0cmFuc2xhdGVcIlxuICAqbmdJZj1cIihvcGVyYXRpb25zJCB8IGFzeW5jKT8uZGF0YS5sZW5ndGggPT09IDAgJiYgKHN0YXR1c0ZpbHRlciQgfCBhc3luYylcIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgIHRpdGxlPVwie3sgJ1Jlc2V0IGZpbHRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJzdGF0dXNGaWx0ZXIucmVzZXQoKVwiXG4gICAgdHJhbnNsYXRlXG4gID5cbiAgICBSZXNldCBmaWx0ZXJcbiAgPC9idXR0b24+XG48L2M4eS11aS1lbXB0eS1zdGF0ZT5cblxuPCEtLSBEZXRhaWxlZCBsaXN0IG9mIG9wZXJhdGlvbnMgKyBsb2FkIG1vcmUgYnV0dG9uIC0tPlxuPGM4eS1saXN0LWdyb3VwIGNsYXNzPVwibS1iLTI0XCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cInBhZ2Utc3RpY2t5LWhlYWRlciBjOHktbGlzdF9faXRlbSBjOHktbGlzdF9faXRlbS0tZG91YmxlLWFjdGlvbnMgaGlkZGVuLXhzXCJcbiAgICAqbmdJZj1cIihvcGVyYXRpb25zJCB8IGFzeW5jKT8uZGF0YS5sZW5ndGhcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19ibG9ja1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19pY29uXCI+XG4gICAgICAgIDxpIGNsYXNzPVwicC1sLTI0XCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2JvZHkgdGV4dC10cnVuY2F0ZS13cmFwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZsZXgtNTdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTVcIj5cbiAgICAgICAgICAgIHt7ICdPcGVyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3dcIlxuICAgICAgICAgICAgKm5nSWY9XCIhZGV2aWNlSWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdEZXZpY2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XG4gICAgICAgICAgICB7eyAnRGF0ZSBjcmVhdGVkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19hY3Rpb25zXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAqYzh5Rm9yPVwiXG4gICAgICBsZXQgb3Agb2Ygb3BlcmF0aW9ucyQgfCBhc3luYztcbiAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICByZWFsdGltZTogcmVhbHRpbWU7XG4gICAgICByZWFsdGltZU9wdGlvbnM6IHsgZW50aXR5T3JJZDogZGV2aWNlSWQgfTtcbiAgICAgIGNvbXBhcmF0b3I6IGNvbXBhcmVPcGVyYXRpb25zLmJpbmQodGhpcyk7XG4gICAgICBsb2FkTW9yZTogJ2F1dG8nXG4gICAgXCJcbiAgPlxuICAgIDxjOHktb3BlcmF0aW9ucy1saXN0LWl0ZW1cbiAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICBbb3BlcmF0aW9uXT1cIm9wXCJcbiAgICAgIFtpc1NtYXJ0UnVsZXNNaWNyb3NlcnZpY2VBdmFpbGFibGVdPVwiaXNTbWFydFJ1bGVzTWljcm9zZXJ2aWNlQXZhaWxhYmxlXCJcbiAgICAgIChyZWxvYWQpPVwicmVsb2FkJC5uZXh0KClcIlxuICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgIGluaGVyaXRcbiAgICA+PC9jOHktb3BlcmF0aW9ucy1saXN0LWl0ZW0+XG4gIDwvZGl2PlxuPC9jOHktbGlzdC1ncm91cD5cbiJdfQ==
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9ucy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL29wZXJhdGlvbnMvb3BlcmF0aW9ucy1saXN0L29wZXJhdGlvbnMtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9vcGVyYXRpb25zL29wZXJhdGlvbnMtbGlzdC9vcGVyYXRpb25zLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLHdCQUF3QixFQUd4QiwrQkFBK0IsRUFDaEMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsaUNBQWlDLEVBQ2pDLCtCQUErQixFQUNoQyxNQUFNLG1EQUFtRCxDQUFDO0FBQzNELE9BQU8sRUFHTCw0QkFBNEIsRUFDN0IsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0FBYWxFLE1BQU0sT0FBTyx1QkFBdUI7SUF5Q2xDLFlBQ1MsUUFBa0MsRUFDakMscUJBQTRDLEVBQzVDLEtBQXFCO1FBRnRCLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBQ2pDLDBCQUFxQixH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d0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJT3BlcmF0aW9uLCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIGdldHRleHQsXG4gIE9wZXJhdGlvblJlYWx0aW1lU2VydmljZSxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZSxcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIFNJTkdMRV9PUEVSQVRJT05fRVZFTlRfREVWSUNFX1RBQixcbiAgU0lOR0xFX09QRVJBVElPTl9FVkVOVF9PVkVSVklFV1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL29wZXJhdGlvbnMvcHJvZHVjdC1leHBlcmllbmNlJztcbmltcG9ydCB7XG4gIE9wZXJhdGlvblN0YXR1c09wdGlvbixcbiAgT3BlcmF0aW9uU3RhdHVzT3B0aW9uc01hcFNoYXJlZCxcbiAgT1BFUkFUSU9OX1NUQVRVU19PUFRJT05TX01BUFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL29wZXJhdGlvbnMvc2hhcmVkJztcbmltcG9ydCB7IFN0YXR1c0ZpbHRlckNvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvb3BlcmF0aW9ucy9zdGF0dXMtZmlsdGVyJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBwaXBlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9wZXJhdGlvbnNMaXN0U2VydmljZSB9IGZyb20gJy4vb3BlcmF0aW9ucy1saXN0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktb3BlcmF0aW9ucy1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICdvcGVyYXRpb25zLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICBPcGVyYXRpb25SZWFsdGltZVNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9wZXJhdGlvbnNMaXN0Q29tcG9uZW50KVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25zTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2Uge1xuICBkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YT8uaWQ7XG4gIE9QRVJBVElPTl9TVEFUVVNfT1BUSU9OU19NQVA6IE9wZXJhdGlvblN0YXR1c09wdGlvbnNNYXBTaGFyZWQgPSBPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQO1xuXG4gIHRpdGxlOiBzdHJpbmc7XG4gIHJlZnJlc2hMb2FkaW5nID0gZmFsc2U7XG4gIGlzU21hcnRSdWxlc01pY3Jvc2VydmljZUF2YWlsYWJsZSA9IGZhbHNlO1xuICBzaG93T3ZlcnZpZXdCcmVhZGNydW1icyA9IGZhbHNlO1xuICBzdGF0dXNGaWx0ZXIkOiBCZWhhdmlvclN1YmplY3Q8T3BlcmF0aW9uU3RhdHVzT3B0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgcmVsb2FkJDogQmVoYXZpb3JTdWJqZWN0PHZvaWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgQFZpZXdDaGlsZCgnc3RhdHVzRmlsdGVyJywgeyBzdGF0aWM6IHRydWUgfSkgc3RhdHVzRmlsdGVyOiBTdGF0dXNGaWx0ZXJDb21wb25lbnQ7XG5cbiAgb3BlcmF0aW9ucyQ6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SU9wZXJhdGlvbj4+ID0gY29tYmluZUxhdGVzdChcbiAgICB0aGlzLnN0YXR1c0ZpbHRlciQsXG4gICAgdGhpcy5yZWxvYWQkXG4gICkucGlwZShcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoTG9hZGluZyA9IHRydWU7XG4gICAgfSksXG4gICAgc3dpdGNoTWFwKChbc3RhdHVzRmlsdGVyc10pID0+IHRoaXMuZmlsdGVyKHN0YXR1c0ZpbHRlcnMpKSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgb3BlcmF0aW9uc0ZpbHRlclBpcGUgPSBwaXBlKFxuICAgIG1hcCgob3BlcmF0aW9uczogSU9wZXJhdGlvbltdKSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXNGaWx0ZXJzID0gdGhpcy5zdGF0dXNGaWx0ZXIkLmdldFZhbHVlKCk7XG4gICAgICBpZiAoIXN0YXR1c0ZpbHRlcnMgfHwgIXN0YXR1c0ZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBvcGVyYXRpb25zO1xuICAgICAgfVxuICAgICAgY29uc3QgYWxsb3dlZFN0YXR1c2VzID0gZmxhdHRlbihzdGF0dXNGaWx0ZXJzLm1hcChzZiA9PiBzZi5zdGF0dXMpKTtcbiAgICAgIHJldHVybiBvcGVyYXRpb25zLmZpbHRlcihvcCA9PiBhbGxvd2VkU3RhdHVzZXMuaW5jbHVkZXMob3Auc3RhdHVzKSk7XG4gICAgfSlcbiAgKTtcblxuICBwcm9kdWN0RXhwZXJpZW5jZUV2ZW50OiBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50ID0ge1xuICAgIGV2ZW50TmFtZTogISF0aGlzLmRldmljZUlkID8gU0lOR0xFX09QRVJBVElPTl9FVkVOVF9ERVZJQ0VfVEFCIDogU0lOR0xFX09QRVJBVElPTl9FVkVOVF9PVkVSVklFV1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFsdGltZTogT3BlcmF0aW9uUmVhbHRpbWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3BlcmF0aW9uc0xpc3RTZXJ2aWNlOiBPcGVyYXRpb25zTGlzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7XG4gICAgdGhpcy50aXRsZSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyZW50LmRhdGEuY29udGV4dERhdGFcbiAgICAgID8gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YS5uYW1lXG4gICAgICA6IGdldHRleHQoJ1NpbmdsZSBvcGVyYXRpb25zJyk7XG4gICAgdGhpcy5zaG93T3ZlcnZpZXdCcmVhZGNydW1icyA9ICF0aGlzLmRldmljZUlkO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pc1NtYXJ0UnVsZXNNaWNyb3NlcnZpY2VBdmFpbGFibGUgPVxuICAgICAgYXdhaXQgdGhpcy5vcGVyYXRpb25zTGlzdFNlcnZpY2UuaXNTbWFydFJ1bGVzTWljcm9zZXJ2aWNlQXZhaWxhYmxlKCk7XG4gIH1cblxuICBmaWx0ZXIoc3RhdHVzRmlsdGVyczogT3BlcmF0aW9uU3RhdHVzT3B0aW9uW10pIHtcbiAgICBjb25zdCBzdGF0dXMgPVxuICAgICAgc3RhdHVzRmlsdGVycyAmJiBzdGF0dXNGaWx0ZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGF0dXM6IGZsYXR0ZW4oc3RhdHVzRmlsdGVycy5tYXAoc3RhdHVzRmlsdGVyID0+IHN0YXR1c0ZpbHRlci5zdGF0dXMpKVxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmdldE9wZXJhdGlvbnMoc3RhdHVzKTtcbiAgfVxuXG4gIGdldE9wZXJhdGlvbnMoZmlsdGVyPykge1xuICAgIGNvbnN0IHF1ZXJ5RmlsdGVyID0gdGhpcy5kZXZpY2VJZCA/IHsgLi4uZmlsdGVyLCBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCB9IDogZmlsdGVyO1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnNMaXN0U2VydmljZS5nZXRPcGVyYXRpb25zKHF1ZXJ5RmlsdGVyKTtcbiAgfVxuXG4gIGNvbXBhcmVPcGVyYXRpb25zKG9wZXJhdGlvbkE6IElPcGVyYXRpb24sIG9wZXJhdGlvbkI6IElPcGVyYXRpb24pOiBudW1iZXIge1xuICAgIHJldHVybiAoXG4gICAgICBuZXcgRGF0ZShvcGVyYXRpb25BLmNyZWF0aW9uVGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUob3BlcmF0aW9uQi5jcmVhdGlvblRpbWUpLmdldFRpbWUoKVxuICAgICk7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGU+e3sgdGl0bGUgfCB0cmFuc2xhdGUgfX08L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iICpuZ0lmPVwic2hvd092ZXJ2aWV3QnJlYWRjcnVtYnNcIj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInYzh5LW92ZXJ2aWV3cydcIlxuICAgIFtsYWJlbF09XCInT3ZlcnZpZXdzJyB8IHRyYW5zbGF0ZVwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiJ2M4eS1kZXZpY2UtY29udHJvbCdcIlxuICAgIFtsYWJlbF09XCInRGV2aWNlIENvbnRyb2wnIHwgdHJhbnNsYXRlXCJcbiAgICBbcGF0aF09XCInZGV2aWNlY29udHJvbC9zaW5nbGUnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInYzh5LWRldmljZS1jb250cm9sJ1wiXG4gICAgW2xhYmVsXT1cIidTaW5nbGUgb3BlcmF0aW9ucycgfCB0cmFuc2xhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCInbGVmdCdcIlxuICBpdGVtQ2xhc3M9XCJuYXZiYXItZm9ybVwiXG4+XG4gIDxjOHktc3RhdHVzLWZpbHRlclxuICAgICNzdGF0dXNGaWx0ZXJcbiAgICBbb3B0aW9uc109XCJPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQXCJcbiAgICAob25GaWx0ZXJDaGFuZ2VkKT1cInN0YXR1c0ZpbHRlciQubmV4dCgkZXZlbnQpXCJcbiAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgIGluaGVyaXRcbiAgPjwvYzh5LXN0YXR1cy1maWx0ZXI+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8Yzh5LXJlYWx0aW1lLWJ0biBbc2VydmljZV09XCJyZWFsdGltZVwiPjwvYzh5LXJlYWx0aW1lLWJ0bj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGluayBkLWZsZXggYS1pLWNlbnRlclwiXG4gICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKGNsaWNrKT1cInJlbG9hZCQubmV4dCgpXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgIGM4eUljb249XCJyZWZyZXNoXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IHJlZnJlc2hMb2FkaW5nIH1cIlxuICAgID48L2k+XG4gICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktaGVscFxuICBzcmM9XCIvZG9jcy9kZXZpY2UtbWFuYWdlbWVudC1hcHBsaWNhdGlvbi9tb25pdG9yaW5nLWFuZC1jb250cm9sbGluZy1kZXZpY2VzLyN0by12aWV3LXNpbmdsZS1vcGVyYXRpb25zXCJcbj48L2M4eS1oZWxwPlxuXG48IS0tIEVtcHR5IHN0YXRlICAtLT5cbjxjOHktdWktZW1wdHktc3RhdGVcbiAgW2ljb25dPVwiJ2M4eS1lbmVyZ3knXCJcbiAgW3RpdGxlXT1cIidObyBpdGVtcyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICBbc3VidGl0bGVdPVwiJ09wZXJhdGlvbnMgd2lsbCBiZSBkaXNwbGF5ZWQgaGVyZS4nIHwgdHJhbnNsYXRlXCJcbiAgKm5nSWY9XCIob3BlcmF0aW9ucyQgfCBhc3luYyk/LmRhdGEubGVuZ3RoID09PSAwICYmICEoc3RhdHVzRmlsdGVyJCB8IGFzeW5jKVwiXG4+PC9jOHktdWktZW1wdHktc3RhdGU+XG48IS0tIE5vIHJlc3VsdHMgZW1wdHkgc3RhdGUgLS0+XG48Yzh5LXVpLWVtcHR5LXN0YXRlXG4gIFtpY29uXT1cIidzZWFyY2gnXCJcbiAgW3RpdGxlXT1cIidObyByZXN1bHRzIHRvIGRpc3BsYXkuJyB8IHRyYW5zbGF0ZVwiXG4gIFtzdWJ0aXRsZV09XCInQWRqdXN0IG9yIHJlc2V0IHRoZSBmaWx0ZXIuJyB8IHRyYW5zbGF0ZVwiXG4gICpuZ0lmPVwiKG9wZXJhdGlvbnMkIHwgYXN5bmMpPy5kYXRhLmxlbmd0aCA9PT0gMCAmJiAoc3RhdHVzRmlsdGVyJCB8IGFzeW5jKVwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgdGl0bGU9XCJ7eyAnUmVzZXQgZmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cInN0YXR1c0ZpbHRlci5yZXNldCgpXCJcbiAgICB0cmFuc2xhdGVcbiAgPlxuICAgIFJlc2V0IGZpbHRlclxuICA8L2J1dHRvbj5cbjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuXG48IS0tIERldGFpbGVkIGxpc3Qgb2Ygb3BlcmF0aW9ucyArIGxvYWQgbW9yZSBidXR0b24gLS0+XG48Yzh5LWxpc3QtZ3JvdXAgY2xhc3M9XCJtLWItMjRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwicGFnZS1zdGlja3ktaGVhZGVyIGM4eS1saXN0X19pdGVtIGM4eS1saXN0X19pdGVtLS1kb3VibGUtYWN0aW9ucyBoaWRkZW4teHNcIlxuICAgICpuZ0lmPVwiKG9wZXJhdGlvbnMkIHwgYXN5bmMpPy5kYXRhLmxlbmd0aFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2Jsb2NrXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2ljb25cIj5cbiAgICAgICAgPGkgY2xhc3M9XCJwLWwtMjRcIj48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjOHktbGlzdF9faXRlbV9fYm9keSB0ZXh0LXRydW5jYXRlLXdyYXBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZmxleC01N1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNVwiPlxuICAgICAgICAgICAge3sgJ09wZXJhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZsZXgtZ3Jvd1wiXG4gICAgICAgICAgICAqbmdJZj1cIiFkZXZpY2VJZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0RldmljZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cbiAgICAgICAgICAgIHt7ICdEYXRlIGNyZWF0ZWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2FjdGlvbnNcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICpjOHlGb3I9XCJcbiAgICAgIGxldCBvcCBvZiBvcGVyYXRpb25zJCB8IGFzeW5jO1xuICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgIHJlYWx0aW1lOiByZWFsdGltZTtcbiAgICAgIHJlYWx0aW1lT3B0aW9uczogeyBlbnRpdHlPcklkOiBkZXZpY2VJZCwgcmVtb3ZlT25VcGRhdGU6IHRydWUsIGluc2VydE9uVXBkYXRlOiB0cnVlIH07XG4gICAgICBjb21wYXJhdG9yOiBjb21wYXJlT3BlcmF0aW9ucy5iaW5kKHRoaXMpO1xuICAgICAgbG9hZE1vcmU6ICdhdXRvJztcbiAgICAgIHBpcGU6IG9wZXJhdGlvbnNGaWx0ZXJQaXBlXG4gICAgXCJcbiAgPlxuICAgIDxjOHktb3BlcmF0aW9ucy1saXN0LWl0ZW1cbiAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICBbb3BlcmF0aW9uXT1cIm9wXCJcbiAgICAgIFtpc1NtYXJ0UnVsZXNNaWNyb3NlcnZpY2VBdmFpbGFibGVdPVwiaXNTbWFydFJ1bGVzTWljcm9zZXJ2aWNlQXZhaWxhYmxlXCJcbiAgICAgIChyZWxvYWQpPVwicmVsb2FkJC5uZXh0KClcIlxuICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgIGluaGVyaXRcbiAgICA+PC9jOHktb3BlcmF0aW9ucy1saXN0LWl0ZW0+XG4gIDwvZGl2PlxuPC9jOHktbGlzdC1ncm91cD5cbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component, ViewChild } from '@angular/core';
|
|
2
2
|
import { NgForm } from '@angular/forms';
|
|
3
|
-
import { AlertService, gettext } from '@c8y/ngx-components';
|
|
3
|
+
import { AlertService, gettext, ValidationPattern } from '@c8y/ngx-components';
|
|
4
4
|
import { RepositoryService, RepositoryType } from '@c8y/ngx-components/repository/shared';
|
|
5
5
|
import { isUndefined, uniqBy } from 'lodash-es';
|
|
6
6
|
import { BsModalRef } from 'ngx-bootstrap/modal';
|
|
@@ -35,6 +35,7 @@ export class ConfigurationDetailComponent {
|
|
|
35
35
|
this._save = resolve;
|
|
36
36
|
this._cancel = reject;
|
|
37
37
|
});
|
|
38
|
+
this.ValidationPattern = ValidationPattern;
|
|
38
39
|
}
|
|
39
40
|
async ngOnInit() {
|
|
40
41
|
this.configs = await this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION);
|
|
@@ -107,13 +108,13 @@ export class ConfigurationDetailComponent {
|
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ConfigurationDetailComponent, deps: [{ token: i1.RepositoryService }, { token: i2.BsModalRef }, { token: i3.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
110
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ConfigurationDetailComponent, selector: "c8y-configuration-detail", viewQueries: [{ propertyName: "configurationForm", first: true, predicate: ["configurationForm"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"viewport-modal\">\n <div\n class=\"modal-header dialog-header\"\n id=\"configurationModalTitle\"\n >\n <i [c8yIcon]=\"'cogs'\"></i>\n <h4\n id=\"modal-title\"\n translate\n *ngIf=\"mo.id\"\n >\n Update configuration\n </h4>\n <h4\n id=\"modal-title\"\n translate\n *ngIf=\"!mo.id\"\n >\n Add configuration\n </h4>\n </div>\n\n <form\n class=\"d-contents\"\n #configurationForm=\"ngForm\"\n (ngSubmit)=\"configurationForm.form.valid && save()\"\n >\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div\n class=\"modal-body\"\n id=\"configurationModalDescription\"\n >\n <c8y-form-group>\n <label translate>Name</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n name=\"version\"\n type=\"text\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n [(ngModel)]=\"version\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Device type</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n name=\"deviceType\"\n type=\"text\"\n autocomplete=\"off\"\n maxlength=\"254\"\n [(ngModel)]=\"deviceType\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Description</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g. Host configuration' | translate }} c8y_Linux\"\n name=\"description\"\n type=\"text\"\n autocomplete=\"off\"\n maxlength=\"254\"\n [(ngModel)]=\"description\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Configuration type</label>\n <c8y-typeahead\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n name=\"confType\"\n [(ngModel)]=\"configurationTypeMO\"\n maxlength=\"254\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n (click)=\"configurationTypeMO = config; setPipe('')\"\n [active]=\"configurationTypeMO === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-level-2 p-8\"\n *ngIf=\"pattern.length > 0\"\n >\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n title=\"{{ 'Add new`configuration type`' | translate }}\"\n type=\"button\"\n translate\n >\n Add new`configuration type`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <div\n class=\"legend form-block m-t-40\"\n translate\n >\n Configuration file\n </div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [uploadChoice]=\"uploadChoice\"\n [fileUrl]=\"binary.url\"\n [fileBinary]=\"binary.file\"\n [fileUrlPopover]=\"textForConfigurationUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ submitButtonTitle | translate }}\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !configurationForm.valid ||\n configurationForm.pristine ||\n (!binary?.url && !binary?.file) ||\n saving\n \"\n >\n {{ submitButtonTitle | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i3.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.FilePickerComponent, selector: "c8y-file-picker", inputs: ["maxAllowedFiles", "uploadChoice", "fileUrl", "fileBinary", "config", "filePickerIndex", "fileUrlPopover"], outputs: ["onFilesPicked"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
|
|
111
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ConfigurationDetailComponent, selector: "c8y-configuration-detail", viewQueries: [{ propertyName: "configurationForm", first: true, predicate: ["configurationForm"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"viewport-modal\">\n <div\n class=\"modal-header dialog-header\"\n id=\"configurationModalTitle\"\n >\n <i [c8yIcon]=\"'cogs'\"></i>\n <h4\n id=\"modal-title\"\n translate\n *ngIf=\"mo.id\"\n >\n Update configuration\n </h4>\n <h4\n id=\"modal-title\"\n translate\n *ngIf=\"!mo.id\"\n >\n Add configuration\n </h4>\n </div>\n\n <form\n class=\"d-contents\"\n #configurationForm=\"ngForm\"\n (ngSubmit)=\"configurationForm.form.valid && save()\"\n >\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div\n class=\"modal-body\"\n id=\"configurationModalDescription\"\n >\n <c8y-form-group>\n <label translate>Name</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n name=\"version\"\n type=\"text\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n [(ngModel)]=\"version\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Device type</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n name=\"deviceType\"\n type=\"text\"\n autocomplete=\"off\"\n maxlength=\"254\"\n [(ngModel)]=\"deviceType\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Description</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g. Host configuration' | translate }} c8y_Linux\"\n name=\"description\"\n type=\"text\"\n autocomplete=\"off\"\n maxlength=\"254\"\n [(ngModel)]=\"description\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Configuration type</label>\n <c8y-typeahead\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n name=\"confType\"\n [(ngModel)]=\"configurationTypeMO\"\n maxlength=\"254\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n (click)=\"configurationTypeMO = config; setPipe('')\"\n [active]=\"configurationTypeMO === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-level-2 p-8\"\n *ngIf=\"pattern.length > 0\"\n >\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n title=\"{{ 'Add new`configuration type`' | translate }}\"\n type=\"button\"\n translate\n >\n Add new`configuration type`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <div\n class=\"legend form-block m-t-40\"\n translate\n >\n Configuration file\n </div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [uploadChoice]=\"uploadChoice\"\n [fileUrl]=\"binary.url\"\n [fileBinary]=\"binary.file\"\n [fileUrlPopover]=\"textForConfigurationUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ submitButtonTitle | translate }}\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !configurationForm.valid ||\n configurationForm.pristine ||\n (!binary?.url?.trim() && !binary?.file) ||\n saving\n \"\n >\n {{ submitButtonTitle | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i3.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.FilePickerComponent, selector: "c8y-file-picker", inputs: ["maxAllowedFiles", "uploadChoice", "fileUrl", "fileBinary", "config", "filePickerIndex", "fileUrlPopover"], outputs: ["onFilesPicked"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
|
|
111
112
|
}
|
|
112
113
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ConfigurationDetailComponent, decorators: [{
|
|
113
114
|
type: Component,
|
|
114
|
-
args: [{ selector: 'c8y-configuration-detail', template: "<div class=\"viewport-modal\">\n <div\n class=\"modal-header dialog-header\"\n id=\"configurationModalTitle\"\n >\n <i [c8yIcon]=\"'cogs'\"></i>\n <h4\n id=\"modal-title\"\n translate\n *ngIf=\"mo.id\"\n >\n Update configuration\n </h4>\n <h4\n id=\"modal-title\"\n translate\n *ngIf=\"!mo.id\"\n >\n Add configuration\n </h4>\n </div>\n\n <form\n class=\"d-contents\"\n #configurationForm=\"ngForm\"\n (ngSubmit)=\"configurationForm.form.valid && save()\"\n >\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div\n class=\"modal-body\"\n id=\"configurationModalDescription\"\n >\n <c8y-form-group>\n <label translate>Name</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n name=\"version\"\n type=\"text\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n [(ngModel)]=\"version\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Device type</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n name=\"deviceType\"\n type=\"text\"\n autocomplete=\"off\"\n maxlength=\"254\"\n [(ngModel)]=\"deviceType\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Description</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g. Host configuration' | translate }} c8y_Linux\"\n name=\"description\"\n type=\"text\"\n autocomplete=\"off\"\n maxlength=\"254\"\n [(ngModel)]=\"description\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Configuration type</label>\n <c8y-typeahead\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n name=\"confType\"\n [(ngModel)]=\"configurationTypeMO\"\n maxlength=\"254\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n (click)=\"configurationTypeMO = config; setPipe('')\"\n [active]=\"configurationTypeMO === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-level-2 p-8\"\n *ngIf=\"pattern.length > 0\"\n >\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n title=\"{{ 'Add new`configuration type`' | translate }}\"\n type=\"button\"\n translate\n >\n Add new`configuration type`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <div\n class=\"legend form-block m-t-40\"\n translate\n >\n Configuration file\n </div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [uploadChoice]=\"uploadChoice\"\n [fileUrl]=\"binary.url\"\n [fileBinary]=\"binary.file\"\n [fileUrlPopover]=\"textForConfigurationUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ submitButtonTitle | translate }}\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !configurationForm.valid ||\n configurationForm.pristine ||\n (!binary?.url && !binary?.file) ||\n saving\n \"\n >\n {{ submitButtonTitle | translate }}\n </button>\n </div>\n </form>\n</div>\n" }]
|
|
115
|
+
args: [{ selector: 'c8y-configuration-detail', template: "<div class=\"viewport-modal\">\n <div\n class=\"modal-header dialog-header\"\n id=\"configurationModalTitle\"\n >\n <i [c8yIcon]=\"'cogs'\"></i>\n <h4\n id=\"modal-title\"\n translate\n *ngIf=\"mo.id\"\n >\n Update configuration\n </h4>\n <h4\n id=\"modal-title\"\n translate\n *ngIf=\"!mo.id\"\n >\n Add configuration\n </h4>\n </div>\n\n <form\n class=\"d-contents\"\n #configurationForm=\"ngForm\"\n (ngSubmit)=\"configurationForm.form.valid && save()\"\n >\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div\n class=\"modal-body\"\n id=\"configurationModalDescription\"\n >\n <c8y-form-group>\n <label translate>Name</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n name=\"version\"\n type=\"text\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n [(ngModel)]=\"version\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Device type</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n name=\"deviceType\"\n type=\"text\"\n autocomplete=\"off\"\n maxlength=\"254\"\n [(ngModel)]=\"deviceType\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Description</label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g. Host configuration' | translate }} c8y_Linux\"\n name=\"description\"\n type=\"text\"\n autocomplete=\"off\"\n maxlength=\"254\"\n [(ngModel)]=\"description\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Configuration type</label>\n <c8y-typeahead\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n name=\"confType\"\n [(ngModel)]=\"configurationTypeMO\"\n maxlength=\"254\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n (click)=\"configurationTypeMO = config; setPipe('')\"\n [active]=\"configurationTypeMO === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-level-2 p-8\"\n *ngIf=\"pattern.length > 0\"\n >\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n title=\"{{ 'Add new`configuration type`' | translate }}\"\n type=\"button\"\n translate\n >\n Add new`configuration type`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <div\n class=\"legend form-block m-t-40\"\n translate\n >\n Configuration file\n </div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [uploadChoice]=\"uploadChoice\"\n [fileUrl]=\"binary.url\"\n [fileBinary]=\"binary.file\"\n [fileUrlPopover]=\"textForConfigurationUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ submitButtonTitle | translate }}\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !configurationForm.valid ||\n configurationForm.pristine ||\n (!binary?.url?.trim() && !binary?.file) ||\n saving\n \"\n >\n {{ submitButtonTitle | translate }}\n </button>\n </div>\n </form>\n</div>\n" }]
|
|
115
116
|
}], ctorParameters: () => [{ type: i1.RepositoryService }, { type: i2.BsModalRef }, { type: i3.AlertService }], propDecorators: { configurationForm: [{
|
|
116
117
|
type: ViewChild,
|
|
117
118
|
args: ['configurationForm', { static: true }]
|
|
118
119
|
}] } });
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1kZXRhaWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9jb25maWd1cmF0aW9uL2xpc3QvY29uZmlndXJhdGlvbi1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9jb25maWd1cmF0aW9uL2xpc3QvY29uZmlndXJhdGlvbi1kZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxZQUFZLEVBQWdDLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFGLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsY0FBYyxFQUNmLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBTXJDLE1BQU0sT0FBTyw0QkFBNEI7SUFtQ3ZDLFlBQ1UsaUJBQW9DLEVBQ3BDLFVBQXNCLEVBQ3RCLEtBQW1CO1FBRm5CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBbEM3QixXQUFNLEdBQWtDO1lBQ3RDLElBQUksRUFBRSxTQUFTO1lBQ2YsR0FBRyxFQUFFLFNBQVM7U0FDZixDQUFDO1FBSUYsWUFBTyxHQUFHLEVBQUUsQ0FB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OzsyRkQvSWEsNEJBQTRCO2tCQUp4QyxTQUFTOytCQUNFLDBCQUEwQjswSUFJYyxpQkFBaUI7c0JBQWxFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBGb3JPZkZpbHRlclBpcGUsIFBpY2tlZEZpbGVzLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBNb2RhbE1vZGVsLFxuICBSZXBvc2l0b3J5U2VydmljZSxcbiAgUmVwb3NpdG9yeVR5cGVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9yZXBvc2l0b3J5L3NoYXJlZCc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgdW5pcUJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IHBpcGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWNvbmZpZ3VyYXRpb24tZGV0YWlsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpZ3VyYXRpb24tZGV0YWlsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uRGV0YWlsQ29tcG9uZW50IGltcGxlbWVudHMgTW9kYWxNb2RlbCB7XG4gIEBWaWV3Q2hpbGQoJ2NvbmZpZ3VyYXRpb25Gb3JtJywgeyBzdGF0aWM6IHRydWUgfSkgY29uZmlndXJhdGlvbkZvcm06IE5nRm9ybTtcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBiaW5hcnk6IHsgZmlsZT86IEZpbGU7IHVybD86IHN0cmluZyB9ID0ge1xuICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICB1cmw6IHVuZGVmaW5lZFxuICB9O1xuICBkZXZpY2VUeXBlOiBzdHJpbmc7XG4gIGNvbmZpZ3VyYXRpb25UeXBlTU86IFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+O1xuXG4gIHBhdHRlcm4gPSAnJztcbiAgZmlsdGVyUGlwZTogRm9yT2ZGaWx0ZXJQaXBlO1xuICBjb25maWdzO1xuICBtbzogUGFydGlhbDxJTWFuYWdlZE9iamVjdD4gPSB7fTtcbiAgc2F2aW5nID0gZmFsc2U7XG4gIHVwbG9hZENob2ljZTogJ3VwbG9hZEJpbmFyeScgfCAndXBsb2FkVXJsJyA9ICd1cGxvYWRCaW5hcnknO1xuICBleGlzdGluZ0JpbmFyeTogRmlsZTtcbiAgc3VibWl0QnV0dG9uVGl0bGU6IHN0cmluZztcbiAgdGV4dEZvckNvbmZpZ3VyYXRpb25VcmxQb3BvdmVyOiBzdHJpbmcgPVxuICAgIGdldHRleHQoYFBhdGggZm9yIGJpbmFyaWVzIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiBkZXZpY2UgYWdlbnQgaW1wbGVtZW50YXRpb24sIGZvciBleGFtcGxlOlxuICAgIC9jb25maWd1cmF0aW9uL2JpbmFyaWVzL2NvbmZpZ3VyYXRpb24xLmJpblxuICAgIGh0dHBzOi8vY29uZmlndXJhdGlvbi9iaW5hcnkvMTIzXG4gICAgZnRwOi8vY29uZmlndXJhdGlvbi9iaW5hcnkvMTIzLnRhci5nelxuICAgIENvbmZpZ3VyYXRpb25zIHdpdGggZXh0ZXJuYWwgVVJMcyBvbmx5IHdvcmsgd2l0aCB0aGUgY29uZmlndXJhdGlvbiB0eXBlZCBkZXZpY2VzIChmaWxlLWJhc2VkIGNvbmZpZ3VyYXRpb24pLCBub3Qgd2l0aCBkZXZpY2VzIHdpdGggYSBsZWdhY3kgY29uZmlndXJhdGlvbi5cbiAgYCk7XG5cbiAgcmVzdWx0OiBQcm9taXNlPHZvaWQ+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMuX3NhdmUgPSByZXNvbHZlO1xuICAgIHRoaXMuX2NhbmNlbCA9IHJlamVjdDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfc2F2ZTtcbiAgcHJpdmF0ZSBfY2FuY2VsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVwb3NpdG9yeVNlcnZpY2U6IFJlcG9zaXRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFJlZjogQnNNb2RhbFJlZixcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29uZmlncyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeVNlcnZpY2UubGlzdFJlcG9zaXRvcnlFbnRyaWVzKFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT04pO1xuICAgIGlmICh0aGlzLm1vKSB7XG4gICAgICB0aGlzLnVwbG9hZENob2ljZSA9IHRoaXMuYmluYXJ5LmZpbGUgPyAndXBsb2FkQmluYXJ5JyA6ICd1cGxvYWRVcmwnO1xuICAgICAgdGhpcy5leGlzdGluZ0JpbmFyeSA9IHRoaXMuYmluYXJ5LmZpbGU7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb25UeXBlTU8gPSB0aGlzLm1vO1xuICAgIH1cbiAgICB0aGlzLnNldFBpcGUoJycpO1xuICAgIHRoaXMuc3VibWl0QnV0dG9uVGl0bGUgPSB0aGlzLm1vLmlkXG4gICAgICA/IGdldHRleHQoJ1VwZGF0ZSBjb25maWd1cmF0aW9uJylcbiAgICAgIDogZ2V0dGV4dCgnQWRkIGNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICAgIHRoaXMuX2NhbmNlbCgpO1xuICB9XG5cbiAgc2V0UGlwZShmaWx0ZXJTdHI6IHN0cmluZykge1xuICAgIHRoaXMucGF0dGVybiA9IGZpbHRlclN0cjtcbiAgICB0aGlzLmZpbHRlclBpcGUgPSBwaXBlKFxuICAgICAgbWFwKGRhdGEgPT4gdW5pcUJ5KGRhdGEsICdjb25maWd1cmF0aW9uVHlwZScpKSxcbiAgICAgIG1hcChkYXRhID0+IHtcbiAgICAgICAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgICAgICAgIG1vID0+XG4gICAgICAgICAgICBtby5jb25maWd1cmF0aW9uVHlwZSAmJlxuICAgICAgICAgICAgbW8uY29uZmlndXJhdGlvblR5cGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlclN0ci50b0xvd2VyQ2FzZSgpKSA+IC0xXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvbkZpbGUoZHJvcHBlZDogUGlja2VkRmlsZXMpIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25Gb3JtLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKGRyb3BwZWQudXJsKSkge1xuICAgICAgdGhpcy5iaW5hcnkgPSB7XG4gICAgICAgIHVybDogZHJvcHBlZC51cmxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChkcm9wcGVkLmRyb3BwZWRGaWxlcykge1xuICAgICAgdGhpcy5iaW5hcnkgPSB7XG4gICAgICAgIGZpbGU6IGRyb3BwZWQuZHJvcHBlZEZpbGVzWzBdLmZpbGVcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmluYXJ5ID0ge1xuICAgICAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgICAgIHVybDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHsgdmVyc2lvbiwgZGVzY3JpcHRpb24sIGJpbmFyeSwgZGV2aWNlVHlwZSB9ID0gdGhpcztcbiAgICAgIGlmICh0aGlzLmV4aXN0aW5nQmluYXJ5ID09PSB0aGlzLmJpbmFyeS5maWxlKSB7XG4gICAgICAgIGJpbmFyeS5maWxlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5U2VydmljZS5jcmVhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIGJpbmFyeSxcbiAgICAgICAgICBkZXZpY2VUeXBlLFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb25UeXBlOiB0aGlzLmNvbmZpZ3VyYXRpb25UeXBlTU8/LmNvbmZpZ3VyYXRpb25UeXBlXG4gICAgICAgIH0sXG4gICAgICAgIFJlcG9zaXRvcnlUeXBlLkNPTkZJR1VSQVRJT04sXG4gICAgICAgIHRoaXMubW9cbiAgICAgICk7XG4gICAgICB0aGlzLmFsZXJ0LnN1Y2Nlc3MoXG4gICAgICAgIHRoaXMubW8uaWQgPyBnZXR0ZXh0KCdDb25maWd1cmF0aW9uIHVwZGF0ZWQuJykgOiBnZXR0ZXh0KCdDb25maWd1cmF0aW9uIGNyZWF0ZWQuJylcbiAgICAgICk7XG4gICAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICAgICAgdGhpcy5fc2F2ZSgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0LmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgICAgdGhpcy5fY2FuY2VsKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidmlld3BvcnQtbW9kYWxcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibW9kYWwtaGVhZGVyIGRpYWxvZy1oZWFkZXJcIlxuICAgIGlkPVwiY29uZmlndXJhdGlvbk1vZGFsVGl0bGVcIlxuICA+XG4gICAgPGkgW2M4eUljb25dPVwiJ2NvZ3MnXCI+PC9pPlxuICAgIDxoNFxuICAgICAgaWQ9XCJtb2RhbC10aXRsZVwiXG4gICAgICB0cmFuc2xhdGVcbiAgICAgICpuZ0lmPVwibW8uaWRcIlxuICAgID5cbiAgICAgIFVwZGF0ZSBjb25maWd1cmF0aW9uXG4gICAgPC9oND5cbiAgICA8aDRcbiAgICAgIGlkPVwibW9kYWwtdGl0bGVcIlxuICAgICAgdHJhbnNsYXRlXG4gICAgICAqbmdJZj1cIiFtby5pZFwiXG4gICAgPlxuICAgICAgQWRkIGNvbmZpZ3VyYXRpb25cbiAgICA8L2g0PlxuICA8L2Rpdj5cblxuICA8Zm9ybVxuICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgI2NvbmZpZ3VyYXRpb25Gb3JtPVwibmdGb3JtXCJcbiAgICAobmdTdWJtaXQpPVwiY29uZmlndXJhdGlvbkZvcm0uZm9ybS52YWxpZCAmJiBzYXZlKClcIlxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJtb2RhbC1pbm5lci1zY3JvbGxcIlxuICAgICAgaWQ9XCJtb2RhbC1ib2R5XCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibW9kYWwtYm9keVwiXG4gICAgICAgIGlkPVwiY29uZmlndXJhdGlvbk1vZGFsRGVzY3JpcHRpb25cIlxuICAgICAgPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5OYW1lPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IGhvc3RzXCJcbiAgICAgICAgICAgIG5hbWU9XCJ2ZXJzaW9uXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMjU0XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmVyc2lvblwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5EZXZpY2UgdHlwZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuJyB8IHRyYW5zbGF0ZSB9fSBjOHlfTGludXhcIlxuICAgICAgICAgICAgbmFtZT1cImRldmljZVR5cGVcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjI1NFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRldmljZVR5cGVcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLiBIb3N0IGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19IGM4eV9MaW51eFwiXG4gICAgICAgICAgICBuYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjI1NFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPkNvbmZpZ3VyYXRpb24gdHlwZTwvbGFiZWw+XG4gICAgICAgICAgPGM4eS10eXBlYWhlYWRcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IHNzaFwiXG4gICAgICAgICAgICBuYW1lPVwiY29uZlR5cGVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWd1cmF0aW9uVHlwZU1PXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjI1NFwiXG4gICAgICAgICAgICAob25TZWFyY2gpPVwic2V0UGlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGRpc3BsYXlQcm9wZXJ0eT1cImNvbmZpZ3VyYXRpb25UeXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Yzh5LWxpXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1sLTggcC1yLTggYzh5LWxpc3RfX2l0ZW0tLWxpbmtcIlxuICAgICAgICAgICAgICAqYzh5Rm9yPVwibGV0IGNvbmZpZyBvZiBjb25maWdzOyBwaXBlOiBmaWx0ZXJQaXBlOyBub3RGb3VuZDogbm90Rm91bmRUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjb25maWd1cmF0aW9uVHlwZU1PID0gY29uZmlnOyBzZXRQaXBlKCcnKVwiXG4gICAgICAgICAgICAgIFthY3RpdmVdPVwiY29uZmlndXJhdGlvblR5cGVNTyA9PT0gY29uZmlnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGM4eS1oaWdobGlnaHRcbiAgICAgICAgICAgICAgICBbdGV4dF09XCJjb25maWcuY29uZmlndXJhdGlvblR5cGUgfHwgJy0tJ1wiXG4gICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwicGF0dGVyblwiXG4gICAgICAgICAgICAgID48L2M4eS1oaWdobGlnaHQ+XG4gICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90Rm91bmRUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPGM4eS1saVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYmctbGV2ZWwtMiBwLThcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwicGF0dGVybi5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5ObyBtYXRjaCBmb3VuZC48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXhzIG0tbC04XCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCBuZXdgY29uZmlndXJhdGlvbiB0eXBlYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBBZGQgbmV3YGNvbmZpZ3VyYXRpb24gdHlwZWBcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9jOHktbGk+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvYzh5LXR5cGVhaGVhZD5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9jayBtLXQtNDBcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmaWxlXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGM4eS1maWxlLXBpY2tlclxuICAgICAgICAgICAgW21heEFsbG93ZWRGaWxlc109XCIxXCJcbiAgICAgICAgICAgIChvbkZpbGVzUGlja2VkKT1cIm9uRmlsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFt1cGxvYWRDaG9pY2VdPVwidXBsb2FkQ2hvaWNlXCJcbiAgICAgICAgICAgIFtmaWxlVXJsXT1cImJpbmFyeS51cmxcIlxuICAgICAgICAgICAgW2ZpbGVCaW5hcnldPVwiYmluYXJ5LmZpbGVcIlxuICAgICAgICAgICAgW2ZpbGVVcmxQb3BvdmVyXT1cInRleHRGb3JDb25maWd1cmF0aW9uVXJsUG9wb3ZlclwiXG4gICAgICAgICAgPjwvYzh5LWZpbGUtcGlja2VyPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwic2F2aW5nXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkNhbmNlbDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgIHRpdGxlPVwie3sgc3VibWl0QnV0dG9uVGl0bGUgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnYnRuLXBlbmRpbmcnOiBzYXZpbmcgfVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAhY29uZmlndXJhdGlvbkZvcm0udmFsaWQgfHxcbiAgICAgICAgICBjb25maWd1cmF0aW9uRm9ybS5wcmlzdGluZSB8fFxuICAgICAgICAgICghYmluYXJ5Py51cmwgJiYgIWJpbmFyeT8uZmlsZSkgfHxcbiAgICAgICAgICBzYXZpbmdcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgc3VibWl0QnV0dG9uVGl0bGUgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj5cbiJdfQ==
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1kZXRhaWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9jb25maWd1cmF0aW9uL2xpc3QvY29uZmlndXJhdGlvbi1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9jb25maWd1cmF0aW9uL2xpc3QvY29uZmlndXJhdGlvbi1kZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFDTCxZQUFZLEVBRVosT0FBTyxFQUVQLGlCQUFpQixFQUNsQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsY0FBYyxFQUNmLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBTXJDLE1BQU0sT0FBTyw0QkFBNEI7SUFvQ3ZDLFlBQ1UsaUJBQW9DLEVBQ3BDLFVBQXNCLEVBQ3RCLEtBQW1CO1FBRm5CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBbkM3QixXQUFNLEdBQWtDO1lBQ3RDLElBQUksRUFBRSxTQUFTO1lBQ2YsR0FBRyxFQUFFLFNBQVM7U0FDZixDQUFDO1FBSUYsWUFBTyxH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R0EzSFUsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsc01DeEJ6Qyx1NkpBb0tBOzsyRkQ1SWEsNEJBQTRCO2tCQUp4QyxTQUFTOytCQUNFLDBCQUEwQjswSUFJYyxpQkFBaUI7c0JBQWxFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBGb3JPZkZpbHRlclBpcGUsXG4gIGdldHRleHQsXG4gIFBpY2tlZEZpbGVzLFxuICBWYWxpZGF0aW9uUGF0dGVyblxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIE1vZGFsTW9kZWwsXG4gIFJlcG9zaXRvcnlTZXJ2aWNlLFxuICBSZXBvc2l0b3J5VHlwZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3JlcG9zaXRvcnkvc2hhcmVkJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkLCB1bmlxQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgcGlwZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktY29uZmlndXJhdGlvbi1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29uZmlndXJhdGlvbi1kZXRhaWwuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25EZXRhaWxDb21wb25lbnQgaW1wbGVtZW50cyBNb2RhbE1vZGVsIHtcbiAgQFZpZXdDaGlsZCgnY29uZmlndXJhdGlvbkZvcm0nLCB7IHN0YXRpYzogdHJ1ZSB9KSBjb25maWd1cmF0aW9uRm9ybTogTmdGb3JtO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGJpbmFyeTogeyBmaWxlPzogRmlsZTsgdXJsPzogc3RyaW5nIH0gPSB7XG4gICAgZmlsZTogdW5kZWZpbmVkLFxuICAgIHVybDogdW5kZWZpbmVkXG4gIH07XG4gIGRldmljZVR5cGU6IHN0cmluZztcbiAgY29uZmlndXJhdGlvblR5cGVNTzogUGFydGlhbDxJTWFuYWdlZE9iamVjdD47XG5cbiAgcGF0dGVybiA9ICcnO1xuICBmaWx0ZXJQaXBlOiBGb3JPZkZpbHRlclBpcGU7XG4gIGNvbmZpZ3M7XG4gIG1vOiBQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0PiA9IHt9O1xuICBzYXZpbmcgPSBmYWxzZTtcbiAgdXBsb2FkQ2hvaWNlOiAndXBsb2FkQmluYXJ5JyB8ICd1cGxvYWRVcmwnID0gJ3VwbG9hZEJpbmFyeSc7XG4gIGV4aXN0aW5nQmluYXJ5OiBGaWxlO1xuICBzdWJtaXRCdXR0b25UaXRsZTogc3RyaW5nO1xuICB0ZXh0Rm9yQ29uZmlndXJhdGlvblVybFBvcG92ZXI6IHN0cmluZyA9XG4gICAgZ2V0dGV4dChgUGF0aCBmb3IgYmluYXJpZXMgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGRldmljZSBhZ2VudCBpbXBsZW1lbnRhdGlvbiwgZm9yIGV4YW1wbGU6XG4gICAgL2NvbmZpZ3VyYXRpb24vYmluYXJpZXMvY29uZmlndXJhdGlvbjEuYmluXG4gICAgaHR0cHM6Ly9jb25maWd1cmF0aW9uL2JpbmFyeS8xMjNcbiAgICBmdHA6Ly9jb25maWd1cmF0aW9uL2JpbmFyeS8xMjMudGFyLmd6XG4gICAgQ29uZmlndXJhdGlvbnMgd2l0aCBleHRlcm5hbCBVUkxzIG9ubHkgd29yayB3aXRoIHRoZSBjb25maWd1cmF0aW9uIHR5cGVkIGRldmljZXMgKGZpbGUtYmFzZWQgY29uZmlndXJhdGlvbiksIG5vdCB3aXRoIGRldmljZXMgd2l0aCBhIGxlZ2FjeSBjb25maWd1cmF0aW9uLlxuICBgKTtcblxuICByZXN1bHQ6IFByb21pc2U8dm9pZD4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5fc2F2ZSA9IHJlc29sdmU7XG4gICAgdGhpcy5fY2FuY2VsID0gcmVqZWN0O1xuICB9KTtcbiAgVmFsaWRhdGlvblBhdHRlcm4gPSBWYWxpZGF0aW9uUGF0dGVybjtcblxuICBwcml2YXRlIF9zYXZlO1xuICBwcml2YXRlIF9jYW5jZWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZXBvc2l0b3J5U2VydmljZTogUmVwb3NpdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBic01vZGFsUmVmOiBCc01vZGFsUmVmLFxuICAgIHByaXZhdGUgYWxlcnQ6IEFsZXJ0U2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb25maWdzID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5U2VydmljZS5saXN0UmVwb3NpdG9yeUVudHJpZXMoUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTik7XG4gICAgaWYgKHRoaXMubW8pIHtcbiAgICAgIHRoaXMudXBsb2FkQ2hvaWNlID0gdGhpcy5iaW5hcnkuZmlsZSA/ICd1cGxvYWRCaW5hcnknIDogJ3VwbG9hZFVybCc7XG4gICAgICB0aGlzLmV4aXN0aW5nQmluYXJ5ID0gdGhpcy5iaW5hcnkuZmlsZTtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvblR5cGVNTyA9IHRoaXMubW87XG4gICAgfVxuICAgIHRoaXMuc2V0UGlwZSgnJyk7XG4gICAgdGhpcy5zdWJtaXRCdXR0b25UaXRsZSA9IHRoaXMubW8uaWRcbiAgICAgID8gZ2V0dGV4dCgnVXBkYXRlIGNvbmZpZ3VyYXRpb24nKVxuICAgICAgOiBnZXR0ZXh0KCdBZGQgY29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gICAgdGhpcy5fY2FuY2VsKCk7XG4gIH1cblxuICBzZXRQaXBlKGZpbHRlclN0cjogc3RyaW5nKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gZmlsdGVyU3RyO1xuICAgIHRoaXMuZmlsdGVyUGlwZSA9IHBpcGUoXG4gICAgICBtYXAoZGF0YSA9PiB1bmlxQnkoZGF0YSwgJ2NvbmZpZ3VyYXRpb25UeXBlJykpLFxuICAgICAgbWFwKGRhdGEgPT4ge1xuICAgICAgICByZXR1cm4gZGF0YS5maWx0ZXIoXG4gICAgICAgICAgbW8gPT5cbiAgICAgICAgICAgIG1vLmNvbmZpZ3VyYXRpb25UeXBlICYmXG4gICAgICAgICAgICBtby5jb25maWd1cmF0aW9uVHlwZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyU3RyLnRvTG93ZXJDYXNlKCkpID4gLTFcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG9uRmlsZShkcm9wcGVkOiBQaWNrZWRGaWxlcykge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbkZvcm0uZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgIGlmICghaXNVbmRlZmluZWQoZHJvcHBlZC51cmwpKSB7XG4gICAgICB0aGlzLmJpbmFyeSA9IHtcbiAgICAgICAgdXJsOiBkcm9wcGVkLnVybFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGRyb3BwZWQuZHJvcHBlZEZpbGVzKSB7XG4gICAgICB0aGlzLmJpbmFyeSA9IHtcbiAgICAgICAgZmlsZTogZHJvcHBlZC5kcm9wcGVkRmlsZXNbMF0uZmlsZVxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaW5hcnkgPSB7XG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgeyB2ZXJzaW9uLCBkZXNjcmlwdGlvbiwgYmluYXJ5LCBkZXZpY2VUeXBlIH0gPSB0aGlzO1xuICAgICAgaWYgKHRoaXMuZXhpc3RpbmdCaW5hcnkgPT09IHRoaXMuYmluYXJ5LmZpbGUpIHtcbiAgICAgICAgYmluYXJ5LmZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgYmluYXJ5LFxuICAgICAgICAgIGRldmljZVR5cGUsXG4gICAgICAgICAgY29uZmlndXJhdGlvblR5cGU6IHRoaXMuY29uZmlndXJhdGlvblR5cGVNTz8uY29uZmlndXJhdGlvblR5cGVcbiAgICAgICAgfSxcbiAgICAgICAgUmVwb3NpdG9yeVR5cGUuQ09ORklHVVJBVElPTixcbiAgICAgICAgdGhpcy5tb1xuICAgICAgKTtcbiAgICAgIHRoaXMuYWxlcnQuc3VjY2VzcyhcbiAgICAgICAgdGhpcy5tby5pZCA/IGdldHRleHQoJ0NvbmZpZ3VyYXRpb24gdXBkYXRlZC4nKSA6IGdldHRleHQoJ0NvbmZpZ3VyYXRpb24gY3JlYXRlZC4nKVxuICAgICAgKTtcbiAgICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gICAgICB0aGlzLl9zYXZlKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnQuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgICB0aGlzLl9jYW5jZWwoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3cG9ydC1tb2RhbFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtb2RhbC1oZWFkZXIgZGlhbG9nLWhlYWRlclwiXG4gICAgaWQ9XCJjb25maWd1cmF0aW9uTW9kYWxUaXRsZVwiXG4gID5cbiAgICA8aSBbYzh5SWNvbl09XCInY29ncydcIj48L2k+XG4gICAgPGg0XG4gICAgICBpZD1cIm1vZGFsLXRpdGxlXCJcbiAgICAgIHRyYW5zbGF0ZVxuICAgICAgKm5nSWY9XCJtby5pZFwiXG4gICAgPlxuICAgICAgVXBkYXRlIGNvbmZpZ3VyYXRpb25cbiAgICA8L2g0PlxuICAgIDxoNFxuICAgICAgaWQ9XCJtb2RhbC10aXRsZVwiXG4gICAgICB0cmFuc2xhdGVcbiAgICAgICpuZ0lmPVwiIW1vLmlkXCJcbiAgICA+XG4gICAgICBBZGQgY29uZmlndXJhdGlvblxuICAgIDwvaDQ+XG4gIDwvZGl2PlxuXG4gIDxmb3JtXG4gICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAjY29uZmlndXJhdGlvbkZvcm09XCJuZ0Zvcm1cIlxuICAgIChuZ1N1Ym1pdCk9XCJjb25maWd1cmF0aW9uRm9ybS5mb3JtLnZhbGlkICYmIHNhdmUoKVwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cIm1vZGFsLWlubmVyLXNjcm9sbFwiXG4gICAgICBpZD1cIm1vZGFsLWJvZHlcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtb2RhbC1ib2R5XCJcbiAgICAgICAgaWQ9XCJjb25maWd1cmF0aW9uTW9kYWxEZXNjcmlwdGlvblwiXG4gICAgICA+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPk5hbWU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gaG9zdHNcIlxuICAgICAgICAgICAgbmFtZT1cInZlcnNpb25cIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCIyNTRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2ZXJzaW9uXCJcbiAgICAgICAgICAgIFtwYXR0ZXJuXT1cIlZhbGlkYXRpb25QYXR0ZXJuLnJ1bGVzLm5vV2hpdGVTcGFjZU9ubHkucGF0dGVyblwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5EZXZpY2UgdHlwZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuJyB8IHRyYW5zbGF0ZSB9fSBjOHlfTGludXhcIlxuICAgICAgICAgICAgbmFtZT1cImRldmljZVR5cGVcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjI1NFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRldmljZVR5cGVcIlxuICAgICAgICAgICAgW3BhdHRlcm5dPVwiVmFsaWRhdGlvblBhdHRlcm4ucnVsZXMubm9XaGl0ZVNwYWNlT25seS5wYXR0ZXJuXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPkRlc2NyaXB0aW9uPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gSG9zdCBjb25maWd1cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fSBjOHlfTGludXhcIlxuICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCIyNTRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBbcGF0dGVybl09XCJWYWxpZGF0aW9uUGF0dGVybi5ydWxlcy5ub1doaXRlU3BhY2VPbmx5LnBhdHRlcm5cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+Q29uZmlndXJhdGlvbiB0eXBlPC9sYWJlbD5cbiAgICAgICAgICA8Yzh5LXR5cGVhaGVhZFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gc3NoXCJcbiAgICAgICAgICAgIG5hbWU9XCJjb25mVHlwZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZ3VyYXRpb25UeXBlTU9cIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMjU0XCJcbiAgICAgICAgICAgIChvblNlYXJjaCk9XCJzZXRQaXBlKCRldmVudClcIlxuICAgICAgICAgICAgZGlzcGxheVByb3BlcnR5PVwiY29uZmlndXJhdGlvblR5cGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjOHktbGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWwtOCBwLXItOCBjOHktbGlzdF9faXRlbS0tbGlua1wiXG4gICAgICAgICAgICAgICpjOHlGb3I9XCJsZXQgY29uZmlnIG9mIGNvbmZpZ3M7IHBpcGU6IGZpbHRlclBpcGU7IG5vdEZvdW5kOiBub3RGb3VuZFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpZ3VyYXRpb25UeXBlTU8gPSBjb25maWc7IHNldFBpcGUoJycpXCJcbiAgICAgICAgICAgICAgW2FjdGl2ZV09XCJjb25maWd1cmF0aW9uVHlwZU1PID09PSBjb25maWdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Yzh5LWhpZ2hsaWdodFxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cImNvbmZpZy5jb25maWd1cmF0aW9uVHlwZSB8fCAnLS0nXCJcbiAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJwYXR0ZXJuXCJcbiAgICAgICAgICAgICAgPjwvYzh5LWhpZ2hsaWdodD5cbiAgICAgICAgICAgIDwvYzh5LWxpPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RGb3VuZFRlbXBsYXRlPlxuICAgICAgICAgICAgICA8Yzh5LWxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJiZy1sZXZlbC0yIHAtOFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwYXR0ZXJuLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk5vIG1hdGNoIGZvdW5kLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4teHMgbS1sLThcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIG5ld2Bjb25maWd1cmF0aW9uIHR5cGVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEFkZCBuZXdgY29uZmlndXJhdGlvbiB0eXBlYFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9jOHktdHlwZWFoZWFkPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrIG0tdC00MFwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGVcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Yzh5LWZpbGUtcGlja2VyXG4gICAgICAgICAgICBbbWF4QWxsb3dlZEZpbGVzXT1cIjFcIlxuICAgICAgICAgICAgKG9uRmlsZXNQaWNrZWQpPVwib25GaWxlKCRldmVudClcIlxuICAgICAgICAgICAgW3VwbG9hZENob2ljZV09XCJ1cGxvYWRDaG9pY2VcIlxuICAgICAgICAgICAgW2ZpbGVVcmxdPVwiYmluYXJ5LnVybFwiXG4gICAgICAgICAgICBbZmlsZUJpbmFyeV09XCJiaW5hcnkuZmlsZVwiXG4gICAgICAgICAgICBbZmlsZVVybFBvcG92ZXJdPVwidGV4dEZvckNvbmZpZ3VyYXRpb25VcmxQb3BvdmVyXCJcbiAgICAgICAgICA+PC9jOHktZmlsZS1waWNrZXI+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJzYXZpbmdcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiB0cmFuc2xhdGU+Q2FuY2VsPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgdGl0bGU9XCJ7eyBzdWJtaXRCdXR0b25UaXRsZSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdidG4tcGVuZGluZyc6IHNhdmluZyB9XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICFjb25maWd1cmF0aW9uRm9ybS52YWxpZCB8fFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb25Gb3JtLnByaXN0aW5lIHx8XG4gICAgICAgICAgKCFiaW5hcnk/LnVybD8udHJpbSgpICYmICFiaW5hcnk/LmZpbGUpIHx8XG4gICAgICAgICAgc2F2aW5nXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHt7IHN1Ym1pdEJ1dHRvblRpdGxlIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9kaXY+XG4iXX0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component, EventEmitter, Output, ViewChild } from '@angular/core';
|
|
2
2
|
import { NgForm } from '@angular/forms';
|
|
3
|
-
import { AlertService, gettext } from '@c8y/ngx-components';
|
|
3
|
+
import { AlertService, gettext, ValidationPattern } from '@c8y/ngx-components';
|
|
4
4
|
import { PRODUCT_EXPERIENCE_REPOSITORY_SHARED, RepositoryService, RepositoryType } from '@c8y/ngx-components/repository/shared';
|
|
5
5
|
import { assign, get, isUndefined } from 'lodash-es';
|
|
6
6
|
import { BsModalRef } from 'ngx-bootstrap/modal';
|
|
@@ -38,6 +38,7 @@ export class AddFirmwareModalComponent {
|
|
|
38
38
|
https://firmware/binary/123
|
|
39
39
|
ftp://firmware/binary/123.tar.gz
|
|
40
40
|
`);
|
|
41
|
+
this.ValidationPattern = ValidationPattern;
|
|
41
42
|
}
|
|
42
43
|
ngOnInit() {
|
|
43
44
|
this.setInitialState();
|
|
@@ -123,15 +124,15 @@ export class AddFirmwareModalComponent {
|
|
|
123
124
|
});
|
|
124
125
|
}
|
|
125
126
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AddFirmwareModalComponent, deps: [{ token: i1.BsModalRef }, { token: i2.RepositoryService }, { token: i3.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
126
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AddFirmwareModalComponent, selector: "c8y-add-firmware-software-modal", outputs: { saved: "saved" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["firmwareForm"], descendants: true }], ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <div class=\"modal-title\" translate id=\"addFirmwareModalTitle\">Add firmware</div>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n <p class=\"text-medium text-16 m-0\" translate>Select or create new firmware</p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwareForm=\"ngForm\"\n (ngSubmit)=\"firmwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addFirmwareModalDescription\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n data-cy=\"add-firmware-modal--input-name\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let firmware of firmwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onFirmwareSelect(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n type=\"button\"\n title=\"{{ 'Add new`firmware`' | translate }}\"\n translate\n >\n Add new`firmware`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDescription\" translate>Description</label>\n <input\n id=\"firmwareDescription\"\n data-cy=\"add-firmware-modal--input-description\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label class=\"control-label\" for=\"firmwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n triggers=\"focus\"\n placement=\"right\"\n container=\"body\"\n ></button>\n </label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n data-cy=\"add-firmware-modal--firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"firmwareVersion\" translate>Version</label>\n <input\n id=\"firmwareVersion\"\n data-cy=\"add-firmware-modal--firmwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [fileUrlPopover]=\"textForFirmwareUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n data-cy=\"add-firmware-modal--cancel-btn\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Add firmware' | translate }}\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwareForm.form.valid ||\n firmwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.REPOSITORY\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.ADD_FIRMWARE_MODAL,\n result:\n firmwarePreselected || model.selected?.id\n ? PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE_VERSION\n : PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE\n }\"\n translate\n c8yProductExperience\n >\n Add firmware\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i3.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.FilePickerComponent, selector: "c8y-file-picker", inputs: ["maxAllowedFiles", "uploadChoice", "fileUrl", "fileBinary", "config", "filePickerIndex", "fileUrlPopover"], outputs: ["onFilesPicked"] }, { kind: "directive", type: i3.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
|
|
127
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AddFirmwareModalComponent, selector: "c8y-add-firmware-software-modal", outputs: { saved: "saved" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["firmwareForm"], descendants: true }], ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <div class=\"modal-title\" translate id=\"addFirmwareModalTitle\">Add firmware</div>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n <p class=\"text-medium text-16 m-0\" translate>Select or create new firmware</p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwareForm=\"ngForm\"\n (ngSubmit)=\"firmwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addFirmwareModalDescription\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n data-cy=\"add-firmware-modal--input-name\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let firmware of firmwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onFirmwareSelect(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n type=\"button\"\n title=\"{{ 'Add new`firmware`' | translate }}\"\n translate\n >\n Add new`firmware`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDescription\" translate>Description</label>\n <input\n id=\"firmwareDescription\"\n data-cy=\"add-firmware-modal--input-description\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label class=\"control-label\" for=\"firmwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n triggers=\"focus\"\n placement=\"right\"\n container=\"body\"\n ></button>\n </label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n data-cy=\"add-firmware-modal--firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"firmwareVersion\" translate>Version</label>\n <input\n id=\"firmwareVersion\"\n data-cy=\"add-firmware-modal--firmwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [fileUrlPopover]=\"textForFirmwareUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n data-cy=\"add-firmware-modal--cancel-btn\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Add firmware' | translate }}\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwareForm.form.valid ||\n firmwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.REPOSITORY\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.ADD_FIRMWARE_MODAL,\n result:\n firmwarePreselected || model.selected?.id\n ? PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE_VERSION\n : PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE\n }\"\n translate\n c8yProductExperience\n >\n Add firmware\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i3.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.FilePickerComponent, selector: "c8y-file-picker", inputs: ["maxAllowedFiles", "uploadChoice", "fileUrl", "fileBinary", "config", "filePickerIndex", "fileUrlPopover"], outputs: ["onFilesPicked"] }, { kind: "directive", type: i3.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
|
|
127
128
|
}
|
|
128
129
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AddFirmwareModalComponent, decorators: [{
|
|
129
130
|
type: Component,
|
|
130
|
-
args: [{ selector: 'c8y-add-firmware-software-modal', template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <div class=\"modal-title\" translate id=\"addFirmwareModalTitle\">Add firmware</div>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n <p class=\"text-medium text-16 m-0\" translate>Select or create new firmware</p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwareForm=\"ngForm\"\n (ngSubmit)=\"firmwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addFirmwareModalDescription\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n data-cy=\"add-firmware-modal--input-name\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let firmware of firmwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onFirmwareSelect(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n type=\"button\"\n title=\"{{ 'Add new`firmware`' | translate }}\"\n translate\n >\n Add new`firmware`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDescription\" translate>Description</label>\n <input\n id=\"firmwareDescription\"\n data-cy=\"add-firmware-modal--input-description\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label class=\"control-label\" for=\"firmwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n triggers=\"focus\"\n placement=\"right\"\n container=\"body\"\n ></button>\n </label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n data-cy=\"add-firmware-modal--firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"firmwareVersion\" translate>Version</label>\n <input\n id=\"firmwareVersion\"\n data-cy=\"add-firmware-modal--firmwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [fileUrlPopover]=\"textForFirmwareUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n data-cy=\"add-firmware-modal--cancel-btn\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Add firmware' | translate }}\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwareForm.form.valid ||\n firmwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.REPOSITORY\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.ADD_FIRMWARE_MODAL,\n result:\n firmwarePreselected || model.selected?.id\n ? PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE_VERSION\n : PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE\n }\"\n translate\n c8yProductExperience\n >\n Add firmware\n </button>\n </div>\n </form>\n</div>\n" }]
|
|
131
|
+
args: [{ selector: 'c8y-add-firmware-software-modal', template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <div class=\"modal-title\" translate id=\"addFirmwareModalTitle\">Add firmware</div>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n <p class=\"text-medium text-16 m-0\" translate>Select or create new firmware</p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwareForm=\"ngForm\"\n (ngSubmit)=\"firmwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addFirmwareModalDescription\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n data-cy=\"add-firmware-modal--input-name\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let firmware of firmwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onFirmwareSelect(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n type=\"button\"\n title=\"{{ 'Add new`firmware`' | translate }}\"\n translate\n >\n Add new`firmware`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDescription\" translate>Description</label>\n <input\n id=\"firmwareDescription\"\n data-cy=\"add-firmware-modal--input-description\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label class=\"control-label\" for=\"firmwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n triggers=\"focus\"\n placement=\"right\"\n container=\"body\"\n ></button>\n </label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n data-cy=\"add-firmware-modal--firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"firmwareVersion\" translate>Version</label>\n <input\n id=\"firmwareVersion\"\n data-cy=\"add-firmware-modal--firmwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [fileUrlPopover]=\"textForFirmwareUrlPopover\"\n ></c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n data-cy=\"add-firmware-modal--cancel-btn\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Add firmware' | translate }}\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwareForm.form.valid ||\n firmwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.REPOSITORY\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.ADD_FIRMWARE_MODAL,\n result:\n firmwarePreselected || model.selected?.id\n ? PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE_VERSION\n : PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE\n }\"\n translate\n c8yProductExperience\n >\n Add firmware\n </button>\n </div>\n </form>\n</div>\n" }]
|
|
131
132
|
}], ctorParameters: () => [{ type: i1.BsModalRef }, { type: i2.RepositoryService }, { type: i3.AlertService }], propDecorators: { form: [{
|
|
132
133
|
type: ViewChild,
|
|
133
134
|
args: ['firmwareForm', { static: false }]
|
|
134
135
|
}], saved: [{
|
|
135
136
|
type: Output
|
|
136
137
|
}] } });
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZpcm13YXJlLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvZmlybXdhcmUvbGlzdC9hZGQtZmlybXdhcmUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9maXJtd2FyZS9saXN0L2FkZC1maXJtd2FyZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBZSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pFLE9BQU8sRUFFTCxvQ0FBb0MsRUFFcEMsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZixNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQU1wRixNQUFNLE9BQU8seUJBQXlCO0lBMEJwQyxZQUNVLEtBQWlCLEVBQ2pCLGlCQUFvQyxFQUNwQyxLQUFtQjtRQUZuQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsVUFBSyxHQUFMLEtBQUssQ0FBYztRQTVCN0IsdUJBQWtCLEdBQUcsb0NB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QUFDLENBQUM7SUFDTCxDQUFDOzhHQWhJVSx5QkFBeUI7a0dBQXpCLHlCQUF5QiwwTUNwQnRDLDJsTUFxS0E7OzJGRGpKYSx5QkFBeUI7a0JBSnJDLFNBQVM7K0JBQ0UsaUNBQWlDOzBJQUtHLElBQUk7c0JBQWpELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDbEMsS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgZ2V0dGV4dCwgUGlja2VkRmlsZXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIE1vZGFsTW9kZWwsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRV9SRVBPU0lUT1JZX1NIQVJFRCxcbiAgUmVwb3NpdG9yeUNhdGVnb3J5LFxuICBSZXBvc2l0b3J5U2VydmljZSxcbiAgUmVwb3NpdG9yeVR5cGVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9yZXBvc2l0b3J5L3NoYXJlZCc7XG5pbXBvcnQgeyBhc3NpZ24sIGdldCwgaXNVbmRlZmluZWQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWRkLWZpcm13YXJlLXNvZnR3YXJlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICdhZGQtZmlybXdhcmUtbW9kYWwuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFkZEZpcm13YXJlTW9kYWxDb21wb25lbnQge1xuICBQUk9EVUNUX0VYUEVSSUVOQ0UgPSBQUk9EVUNUX0VYUEVSSUVOQ0VfUkVQT1NJVE9SWV9TSEFSRUQ7XG4gIEBWaWV3Q2hpbGQoJ2Zpcm13YXJlRm9ybScsIHsgc3RhdGljOiBmYWxzZSB9KSBmb3JtOiBOZ0Zvcm07XG4gIEBPdXRwdXQoKSBzYXZlZDogRXZlbnRFbWl0dGVyPFJlcG9zaXRvcnlDYXRlZ29yeT4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlcG9zaXRvcnlDYXRlZ29yeT4oKTtcbiAgb25JbnB1dDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBtb2RlbDogTW9kYWxNb2RlbCA9IHtcbiAgICBzZWxlY3RlZDogdW5kZWZpbmVkLFxuICAgIHZlcnNpb246IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogdW5kZWZpbmVkLFxuICAgIGRldmljZVR5cGU6IHVuZGVmaW5lZCxcbiAgICBiaW5hcnk6IHtcbiAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgIHVybDogdW5kZWZpbmVkXG4gICAgfVxuICB9O1xuICBmaXJtd2FyZXNSZXN1bHQ7XG4gIHNhdmluZyA9IGZhbHNlO1xuICBmaXJtd2FyZVByZXNlbGVjdGVkID0gZmFsc2U7XG4gIHRleHRGb3JGaXJtd2FyZVVybFBvcG92ZXI6IHN0cmluZyA9XG4gICAgZ2V0dGV4dChgUGF0aCBmb3IgYmluYXJpZXMgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGRldmljZSBhZ2VudCBpbXBsZW1lbnRhdGlvbiwgZm9yIGV4YW1wbGU6XG4gICAgL2Zpcm13YXJlL2JpbmFyaWVzL2Zpcm13YXJlMS5iaW5cbiAgICBodHRwczovL2Zpcm13YXJlL2JpbmFyeS8xMjNcbiAgICBmdHA6Ly9maXJtd2FyZS9iaW5hcnkvMTIzLnRhci5nelxuICBgKTtcbiAgcHJpdmF0ZSBpbnB1dFN1YnNjcmlwdGlvbiQ6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1vZGFsOiBCc01vZGFsUmVmLFxuICAgIHByaXZhdGUgcmVwb3NpdG9yeVNlcnZpY2U6IFJlcG9zaXRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnQ6IEFsZXJ0U2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRGaXJtd2FyZXMoKTtcbiAgfVxuXG4gIHNldEluaXRpYWxTdGF0ZSgpIHtcbiAgICBpZiAodGhpcy5tb2RlbC5zZWxlY3RlZCkge1xuICAgICAgdGhpcy5maXJtd2FyZVByZXNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBsb2FkRmlybXdhcmVzKCkge1xuICAgIHRoaXMuaW5wdXRTdWJzY3JpcHRpb24kID0gdGhpcy5vbklucHV0XG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuZmlybXdhcmVQcmVzZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5kZXNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybS5mb3JtLmdldCgnZGVzY3JpcHRpb24nKS5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBzd2l0Y2hNYXAoc2VhcmNoU3RyID0+IHRoaXMuZ2V0RmlybXdhcmVSZXN1bHQoc2VhcmNoU3RyKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy5maXJtd2FyZXNSZXN1bHQgPSByZXN1bHQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldEZpcm13YXJlUmVzdWx0KHNlYXJjaFN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlLmxpc3RSZXBvc2l0b3J5RW50cmllcyhSZXBvc2l0b3J5VHlwZS5GSVJNV0FSRSwge1xuICAgICAgICBwYXJ0aWFsTmFtZTogc2VhcmNoU3RyLFxuICAgICAgICBza2lwTGVnYWN5OiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBzYXZlKCkge1xuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlcG9zaXRvcnlTZXJ2aWNlXG4gICAgICAuY3JlYXRlKHRoaXMubW9kZWwsIFJlcG9zaXRvcnlUeXBlLkZJUk1XQVJFKVxuICAgICAgLnRoZW4oc2F2ZWRGaXJtd2FyZSA9PiB7XG4gICAgICAgIHRoaXMuc3VjY2Vzc01zZygpO1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNhdmVkLm5leHQoc2F2ZWRGaXJtd2FyZSk7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNhdmVkLmVycm9yKGUpO1xuICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBzdWNjZXNzTXNnKCkge1xuICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0Zpcm13YXJlIGFkZGVkLicpO1xuICAgIHRoaXMuYWxlcnQuc3VjY2Vzcyhtc2cpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICAgIHRoaXMuc2F2ZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuaW5wdXRTdWJzY3JpcHRpb24kLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBvbkZpbGUoZHJvcHBlZDogUGlja2VkRmlsZXMpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKGRyb3BwZWQudXJsKSkge1xuICAgICAgdGhpcy5tb2RlbC5iaW5hcnkgPSB7XG4gICAgICAgIHVybDogZHJvcHBlZC51cmxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChkcm9wcGVkLmRyb3BwZWRGaWxlcykge1xuICAgICAgdGhpcy5tb2RlbC5iaW5hcnkgPSB7XG4gICAgICAgIGZpbGU6IGRyb3BwZWQuZHJvcHBlZEZpbGVzWzBdLmZpbGVcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9kZWwuYmluYXJ5ID0ge1xuICAgICAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgICAgIHVybDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIG9uRmlybXdhcmVTZWxlY3QoZmlybXdhcmU6IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgYXNzaWduKHRoaXMubW9kZWwsIHtcbiAgICAgIHNlbGVjdGVkOiBmaXJtd2FyZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBmaXJtd2FyZS5kZXNjcmlwdGlvbixcbiAgICAgIGRldmljZVR5cGU6IGdldChmaXJtd2FyZSwgJ2M4eV9GaWx0ZXIudHlwZScpXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3cG9ydC1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGRpYWxvZy1oZWFkZXJcIj5cbiAgICA8aSBbYzh5SWNvbl09XCInYzh5LWZpcm13YXJlJ1wiPjwvaT5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtdGl0bGVcIiB0cmFuc2xhdGUgaWQ9XCJhZGRGaXJtd2FyZU1vZGFsVGl0bGVcIj5BZGQgZmlybXdhcmU8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyIHNlcGFyYXRvci1ib3R0b21cIiAqbmdJZj1cIiFmaXJtd2FyZVByZXNlbGVjdGVkXCI+XG4gICAgPHAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSB0ZXh0LTE2IG0tMFwiIHRyYW5zbGF0ZT5TZWxlY3Qgb3IgY3JlYXRlIG5ldyBmaXJtd2FyZTwvcD5cbiAgPC9kaXY+XG4gIDxmb3JtXG4gICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICNmaXJtd2FyZUZvcm09XCJuZ0Zvcm1cIlxuICAgIChuZ1N1Ym1pdCk9XCJmaXJtd2FyZUZvcm0uZm9ybS52YWxpZCAmJiBzYXZlKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWlubmVyLXNjcm9sbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBpZD1cImFkZEZpcm13YXJlTW9kYWxEZXNjcmlwdGlvblwiPlxuICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiZmlybXdhcmVQcmVzZWxlY3RlZFwiPlxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXJtd2FyZU5hbWVcIiB0cmFuc2xhdGU+RmlybXdhcmU8L2xhYmVsPlxuICAgICAgICAgICAgPGM4eS10eXBlYWhlYWRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgIG5hbWU9XCJmaXJtd2FyZU5hbWVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdTZWxlY3Qgb3IgZW50ZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImFkZC1maXJtd2FyZS1tb2RhbC0taW5wdXQtbmFtZVwiXG4gICAgICAgICAgICAgIChvblNlYXJjaCk9XCJvbklucHV0Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGM4eS1saVxuICAgICAgICAgICAgICAgICpjOHlGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBmaXJtd2FyZSBvZiBmaXJtd2FyZXNSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICBsb2FkTW9yZTogJ2F1dG8nO1xuICAgICAgICAgICAgICAgICAgbm90Rm91bmQ6IG5vdEZvdW5kVGVtcGxhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1sLTggcC1yLTggYzh5LWxpc3RfX2l0ZW0tLWxpbmtcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkZpcm13YXJlU2VsZWN0KGZpcm13YXJlKVwiXG4gICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJtb2RlbC5zZWxlY3RlZCA9PT0gZmlybXdhcmVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGM4eS1oaWdobGlnaHRcbiAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImZpcm13YXJlLm5hbWUgfHwgJy0tJ1wiXG4gICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJvbklucHV0IHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgID48L2M4eS1oaWdobGlnaHQ+XG4gICAgICAgICAgICAgIDwvYzh5LWxpPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vdEZvdW5kVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGM4eS1saSBjbGFzcz1cImJnLWxldmVsLTIgcC04XCIgKm5nSWY9XCIob25JbnB1dCB8IGFzeW5jKT8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk5vIG1hdGNoIGZvdW5kLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXhzIG0tbC04XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCBuZXdgZmlybXdhcmVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBBZGQgbmV3YGZpcm13YXJlYFxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9jOHktbGk+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2M4eS10eXBlYWhlYWQ+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXJtd2FyZURlc2NyaXB0aW9uXCIgdHJhbnNsYXRlPkRlc2NyaXB0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cImZpcm13YXJlRGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwiYWRkLWZpcm13YXJlLW1vZGFsLS1pbnB1dC1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gRmlybXdhcmUgZm9yIGhhcmR3YXJlIHJldmlzaW9uIEInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGVsLnNlbGVjdGVkPy5pZFwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIiBmb3I9XCJmaXJtd2FyZURldmljZVR5cGVGaWx0ZXJcIj5cbiAgICAgICAgICAgICAge3sgJ0RldmljZSB0eXBlIGZpbHRlcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHBcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgICAgICdJZiB0aGUgZmlsdGVyIGlzIHNldCwgdGhlIGZpcm13YXJlIHdpbGwgc2hvdyB1cCBmb3IgaW5zdGFsbGF0aW9uIG9ubHkgZm9yIGRldmljZXMgb2YgdGhhdCB0eXBlLiBJZiBubyBmaWx0ZXIgaXMgc2V0LCBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYWxsIGRldmljZXMuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJmaXJtd2FyZURldmljZVR5cGVGaWx0ZXJcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwiYWRkLWZpcm13YXJlLW1vZGFsLS1maXJtd2FyZURldmljZVR5cGVGaWx0ZXJcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIG5hbWU9XCJmaXJtd2FyZURldmljZVR5cGVGaWx0ZXJcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLmRldmljZVR5cGVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuJyB8IHRyYW5zbGF0ZSB9fSBjOHlfTGludXhcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kZWwuc2VsZWN0ZWQ/LmlkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXJtd2FyZVZlcnNpb25cIiB0cmFuc2xhdGU+VmVyc2lvbjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cImZpcm13YXJlVmVyc2lvblwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiYWRkLWZpcm13YXJlLW1vZGFsLS1maXJtd2FyZVZlcnNpb25cIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIG5hbWU9XCJ2ZXJzaW9uXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwibW9kZWwudmVyc2lvblwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuJyB8IHRyYW5zbGF0ZSB9fSAxLjAuMFwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cblxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrIG0tdC00MFwiIHRyYW5zbGF0ZT5GaXJtd2FyZSBmaWxlPC9kaXY+XG4gICAgICAgICAgPGM4eS1maWxlLXBpY2tlclxuICAgICAgICAgICAgW21heEFsbG93ZWRGaWxlc109XCIxXCJcbiAgICAgICAgICAgIChvbkZpbGVzUGlja2VkKT1cIm9uRmlsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtmaWxlVXJsUG9wb3Zlcl09XCJ0ZXh0Rm9yRmlybXdhcmVVcmxQb3BvdmVyXCJcbiAgICAgICAgICA+PC9jOHktZmlsZS1waWNrZXI+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBkYXRhLWN5PVwiYWRkLWZpcm13YXJlLW1vZGFsLS1jYW5jZWwtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInNhdmluZ1wiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBDYW5jZWxcbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0FkZCBmaXJtd2FyZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdidG4tcGVuZGluZyc6IHNhdmluZyB9XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICFmaXJtd2FyZUZvcm0uZm9ybS52YWxpZCB8fFxuICAgICAgICAgIGZpcm13YXJlRm9ybS5mb3JtLnByaXN0aW5lIHx8XG4gICAgICAgICAgc2F2aW5nIHx8XG4gICAgICAgICAgKCFtb2RlbC5iaW5hcnk/LnVybCAmJiAhbW9kZWwuYmluYXJ5Py5maWxlKVxuICAgICAgICBcIlxuICAgICAgICBbYWN0aW9uTmFtZV09XCJQUk9EVUNUX0VYUEVSSUVOQ0UuRklSTVdBUkUuRVZFTlRTLlJFUE9TSVRPUllcIlxuICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0UuRklSTVdBUkUuQ09NUE9ORU5UUy5BRERfRklSTVdBUkVfTU9EQUwsXG4gICAgICAgICAgcmVzdWx0OlxuICAgICAgICAgICAgZmlybXdhcmVQcmVzZWxlY3RlZCB8fCBtb2RlbC5zZWxlY3RlZD8uaWRcbiAgICAgICAgICAgICAgPyBQUk9EVUNUX0VYUEVSSUVOQ0UuRklSTVdBUkUuUkVTVUxUUy5BRERfRklSTVdBUkVfVkVSU0lPTlxuICAgICAgICAgICAgICA6IFBST0RVQ1RfRVhQRVJJRU5DRS5GSVJNV0FSRS5SRVNVTFRTLkFERF9GSVJNV0FSRVxuICAgICAgICB9XCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICA+XG4gICAgICAgIEFkZCBmaXJtd2FyZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZpcm13YXJlLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvZmlybXdhcmUvbGlzdC9hZGQtZmlybXdhcmUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9maXJtd2FyZS9saXN0L2FkZC1maXJtd2FyZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVGLE9BQU8sRUFFTCxvQ0FBb0MsRUFFcEMsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZixNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQU1wRixNQUFNLE9BQU8seUJBQXlCO0lBMkJwQyxZQUNVLEtBQWlCLEVBQ2pCLGlCQUFvQyxFQUNwQyxLQUFtQjtRQUZuQixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsVUFBSyxHQUFMLEtBQUssQ0FBYztRQTdCN0IsdUJBQWtCLEdBQUcsb0NBQW9DLENBQUM7UUFFaEQsVUFBSyxHQUFxQyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUMzRixZQUFPLEdBQTRCLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLFVBQUssR0FBZTtZQUNsQixRQUFRLEVBQUUsU0FBUztZQUNuQixPQUFPLEVBQUUsU0FBUztZQUNsQixXQUFXLEVBQUUsU0FBUztZQUN0QixVQUFVLEVBQUUsU0FBUztZQUNyQixNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsR0FBRyxFQUFFLFNBQVM7YUFDZjtTQUNGLENBQUM7UUFFRixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2Ysd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLDhCQUF5QixHQUN2QixPQUFPLENBQUM7Ozs7R0FJVCxDQUFDLENBQUM7UUFDSCxzQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztJQU9uQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU87YUFDbkMsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUNGLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQzFEO2FBQ0EsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQWlCO1FBQ2pDLE9BQU8sSUFBSSxDQUNULElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1lBQ3BFLFdBQVcsRUFBRSxTQUFTO1lBQ3RCLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLGlCQUFpQjthQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO2FBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFvQjtRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHO2dCQUNsQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7YUFDakIsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUc7Z0JBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7YUFDbkMsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHO2dCQUNsQixJQUFJLEVBQUUsU0FBUztnQkFDZixHQUFHLEVBQUUsU0FBUzthQUNmLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQXdCO1FBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2pCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQztTQUM3QyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQWpJVSx5QkFBeUI7a0dBQXpCLHlCQUF5QiwwTUNwQnRDLG0wTUF3S0E7OzJGRHBKYSx5QkFBeUI7a0JBSnJDLFNBQVM7K0JBQ0UsaUNBQWlDOzBJQUtHLElBQUk7c0JBQWpELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDbEMsS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgZ2V0dGV4dCwgUGlja2VkRmlsZXMsIFZhbGlkYXRpb25QYXR0ZXJuIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBNb2RhbE1vZGVsLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0VfUkVQT1NJVE9SWV9TSEFSRUQsXG4gIFJlcG9zaXRvcnlDYXRlZ29yeSxcbiAgUmVwb3NpdG9yeVNlcnZpY2UsXG4gIFJlcG9zaXRvcnlUeXBlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS9zaGFyZWQnO1xuaW1wb3J0IHsgYXNzaWduLCBnZXQsIGlzVW5kZWZpbmVkIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFkZC1maXJtd2FyZS1zb2Z0d2FyZS1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnYWRkLWZpcm13YXJlLW1vZGFsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBZGRGaXJtd2FyZU1vZGFsQ29tcG9uZW50IHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFID0gUFJPRFVDVF9FWFBFUklFTkNFX1JFUE9TSVRPUllfU0hBUkVEO1xuICBAVmlld0NoaWxkKCdmaXJtd2FyZUZvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgZm9ybTogTmdGb3JtO1xuICBAT3V0cHV0KCkgc2F2ZWQ6IEV2ZW50RW1pdHRlcjxSZXBvc2l0b3J5Q2F0ZWdvcnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZXBvc2l0b3J5Q2F0ZWdvcnk+KCk7XG4gIG9uSW5wdXQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgbW9kZWw6IE1vZGFsTW9kZWwgPSB7XG4gICAgc2VsZWN0ZWQ6IHVuZGVmaW5lZCxcbiAgICB2ZXJzaW9uOiB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHVuZGVmaW5lZCxcbiAgICBkZXZpY2VUeXBlOiB1bmRlZmluZWQsXG4gICAgYmluYXJ5OiB7XG4gICAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgICB1cmw6IHVuZGVmaW5lZFxuICAgIH1cbiAgfTtcbiAgZmlybXdhcmVzUmVzdWx0O1xuICBzYXZpbmcgPSBmYWxzZTtcbiAgZmlybXdhcmVQcmVzZWxlY3RlZCA9IGZhbHNlO1xuICB0ZXh0Rm9yRmlybXdhcmVVcmxQb3BvdmVyOiBzdHJpbmcgPVxuICAgIGdldHRleHQoYFBhdGggZm9yIGJpbmFyaWVzIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiBkZXZpY2UgYWdlbnQgaW1wbGVtZW50YXRpb24sIGZvciBleGFtcGxlOlxuICAgIC9maXJtd2FyZS9iaW5hcmllcy9maXJtd2FyZTEuYmluXG4gICAgaHR0cHM6Ly9maXJtd2FyZS9iaW5hcnkvMTIzXG4gICAgZnRwOi8vZmlybXdhcmUvYmluYXJ5LzEyMy50YXIuZ3pcbiAgYCk7XG4gIFZhbGlkYXRpb25QYXR0ZXJuID0gVmFsaWRhdGlvblBhdHRlcm47XG4gIHByaXZhdGUgaW5wdXRTdWJzY3JpcHRpb24kOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtb2RhbDogQnNNb2RhbFJlZixcbiAgICBwcml2YXRlIHJlcG9zaXRvcnlTZXJ2aWNlOiBSZXBvc2l0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgdGhpcy5sb2FkRmlybXdhcmVzKCk7XG4gIH1cblxuICBzZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMubW9kZWwuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZmlybXdhcmVQcmVzZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbG9hZEZpcm13YXJlcygpIHtcbiAgICB0aGlzLmlucHV0U3Vic2NyaXB0aW9uJCA9IHRoaXMub25JbnB1dFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZpcm13YXJlUHJlc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGVzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybSkge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0uZm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJykucmVzZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgc3dpdGNoTWFwKHNlYXJjaFN0ciA9PiB0aGlzLmdldEZpcm13YXJlUmVzdWx0KHNlYXJjaFN0cikpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgIHRoaXMuZmlybXdhcmVzUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRGaXJtd2FyZVJlc3VsdChzZWFyY2hTdHI6IHN0cmluZykge1xuICAgIHJldHVybiBmcm9tKFxuICAgICAgdGhpcy5yZXBvc2l0b3J5U2VydmljZS5saXN0UmVwb3NpdG9yeUVudHJpZXMoUmVwb3NpdG9yeVR5cGUuRklSTVdBUkUsIHtcbiAgICAgICAgcGFydGlhbE5hbWU6IHNlYXJjaFN0cixcbiAgICAgICAgc2tpcExlZ2FjeTogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG4gICAgdGhpcy5yZXBvc2l0b3J5U2VydmljZVxuICAgICAgLmNyZWF0ZSh0aGlzLm1vZGVsLCBSZXBvc2l0b3J5VHlwZS5GSVJNV0FSRSlcbiAgICAgIC50aGVuKHNhdmVkRmlybXdhcmUgPT4ge1xuICAgICAgICB0aGlzLnN1Y2Nlc3NNc2coKTtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYXZlZC5uZXh0KHNhdmVkRmlybXdhcmUpO1xuICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYXZlZC5lcnJvcihlKTtcbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc3VjY2Vzc01zZygpIHtcbiAgICBjb25zdCBtc2cgPSBnZXR0ZXh0KCdGaXJtd2FyZSBhZGRlZC4nKTtcbiAgICB0aGlzLmFsZXJ0LnN1Y2Nlc3MobXNnKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICB0aGlzLnNhdmVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmlucHV0U3Vic2NyaXB0aW9uJC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgb25GaWxlKGRyb3BwZWQ6IFBpY2tlZEZpbGVzKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZChkcm9wcGVkLnVybCkpIHtcbiAgICAgIHRoaXMubW9kZWwuYmluYXJ5ID0ge1xuICAgICAgICB1cmw6IGRyb3BwZWQudXJsXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZHJvcHBlZC5kcm9wcGVkRmlsZXMpIHtcbiAgICAgIHRoaXMubW9kZWwuYmluYXJ5ID0ge1xuICAgICAgICBmaWxlOiBkcm9wcGVkLmRyb3BwZWRGaWxlc1swXS5maWxlXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGVsLmJpbmFyeSA9IHtcbiAgICAgICAgZmlsZTogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBvbkZpcm13YXJlU2VsZWN0KGZpcm13YXJlOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIGFzc2lnbih0aGlzLm1vZGVsLCB7XG4gICAgICBzZWxlY3RlZDogZmlybXdhcmUsXG4gICAgICBkZXNjcmlwdGlvbjogZmlybXdhcmUuZGVzY3JpcHRpb24sXG4gICAgICBkZXZpY2VUeXBlOiBnZXQoZmlybXdhcmUsICdjOHlfRmlsdGVyLnR5cGUnKVxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidmlld3BvcnQtbW9kYWxcIj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBkaWFsb2ctaGVhZGVyXCI+XG4gICAgPGkgW2M4eUljb25dPVwiJ2M4eS1maXJtd2FyZSdcIj48L2k+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgdHJhbnNsYXRlIGlkPVwiYWRkRmlybXdhcmVNb2RhbFRpdGxlXCI+QWRkIGZpcm13YXJlPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicC0xNiB0ZXh0LWNlbnRlciBzZXBhcmF0b3ItYm90dG9tXCIgKm5nSWY9XCIhZmlybXdhcmVQcmVzZWxlY3RlZFwiPlxuICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gdGV4dC0xNiBtLTBcIiB0cmFuc2xhdGU+U2VsZWN0IG9yIGNyZWF0ZSBuZXcgZmlybXdhcmU8L3A+XG4gIDwvZGl2PlxuICA8Zm9ybVxuICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAjZmlybXdhcmVGb3JtPVwibmdGb3JtXCJcbiAgICAobmdTdWJtaXQpPVwiZmlybXdhcmVGb3JtLmZvcm0udmFsaWQgJiYgc2F2ZSgpXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1pbm5lci1zY3JvbGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgaWQ9XCJhZGRGaXJtd2FyZU1vZGFsRGVzY3JpcHRpb25cIj5cbiAgICAgICAgPGRpdiBbaGlkZGVuXT1cImZpcm13YXJlUHJlc2VsZWN0ZWRcIj5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlybXdhcmVOYW1lXCIgdHJhbnNsYXRlPkZpcm13YXJlPC9sYWJlbD5cbiAgICAgICAgICAgIDxjOHktdHlwZWFoZWFkXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibW9kZWwuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICBuYW1lPVwiZmlybXdhcmVOYW1lXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VsZWN0IG9yIGVudGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIGRhdGEtY3k9XCJhZGQtZmlybXdhcmUtbW9kYWwtLWlucHV0LW5hbWVcIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25JbnB1dC5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjOHktbGlcbiAgICAgICAgICAgICAgICAqYzh5Rm9yPVwiXG4gICAgICAgICAgICAgICAgICBsZXQgZmlybXdhcmUgb2YgZmlybXdhcmVzUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgbG9hZE1vcmU6ICdhdXRvJztcbiAgICAgICAgICAgICAgICAgIG5vdEZvdW5kOiBub3RGb3VuZFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtbC04IHAtci04IGM4eS1saXN0X19pdGVtLS1saW5rXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25GaXJtd2FyZVNlbGVjdChmaXJtd2FyZSlcIlxuICAgICAgICAgICAgICAgIFthY3RpdmVdPVwibW9kZWwuc2VsZWN0ZWQgPT09IGZpcm13YXJlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjOHktaGlnaGxpZ2h0XG4gICAgICAgICAgICAgICAgICBbdGV4dF09XCJmaXJtd2FyZS5uYW1lIHx8ICctLSdcIlxuICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwib25JbnB1dCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICA+PC9jOHktaGlnaGxpZ2h0PlxuICAgICAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RGb3VuZFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxjOHktbGkgY2xhc3M9XCJiZy1sZXZlbC0yIHAtOFwiICpuZ0lmPVwiKG9uSW5wdXQgfCBhc3luYyk/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5ObyBtYXRjaCBmb3VuZC48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi14cyBtLWwtOFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQgbmV3YGZpcm13YXJlYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQWRkIG5ld2BmaXJtd2FyZWBcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvYzh5LWxpPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9jOHktdHlwZWFoZWFkPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlybXdhcmVEZXNjcmlwdGlvblwiIHRyYW5zbGF0ZT5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJmaXJtd2FyZURlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImFkZC1maXJtd2FyZS1tb2RhbC0taW5wdXQtZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibW9kZWwuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIEZpcm13YXJlIGZvciBoYXJkd2FyZSByZXZpc2lvbiBCJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RlbC5zZWxlY3RlZD8uaWRcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtwYXR0ZXJuXT1cIlZhbGlkYXRpb25QYXR0ZXJuLnJ1bGVzLm5vV2hpdGVTcGFjZU9ubHkucGF0dGVyblwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgZm9yPVwiZmlybXdhcmVEZXZpY2VUeXBlRmlsdGVyXCI+XG4gICAgICAgICAgICAgIHt7ICdEZXZpY2UgdHlwZSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7XG4gICAgICAgICAgICAgICAgICAnSWYgdGhlIGZpbHRlciBpcyBzZXQsIHRoZSBmaXJtd2FyZSB3aWxsIHNob3cgdXAgZm9yIGluc3RhbGxhdGlvbiBvbmx5IGZvciBkZXZpY2VzIG9mIHRoYXQgdHlwZS4gSWYgbm8gZmlsdGVyIGlzIHNldCwgaXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGFsbCBkZXZpY2VzLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwiZmlybXdhcmVEZXZpY2VUeXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImFkZC1maXJtd2FyZS1tb2RhbC0tZmlybXdhcmVEZXZpY2VUeXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBuYW1lPVwiZmlybXdhcmVEZXZpY2VUeXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC5kZXZpY2VUeXBlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gYzh5X0xpbnV4XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGVsLnNlbGVjdGVkPy5pZFwiXG4gICAgICAgICAgICAgIFtwYXR0ZXJuXT1cIlZhbGlkYXRpb25QYXR0ZXJuLnJ1bGVzLm5vV2hpdGVTcGFjZU9ubHkucGF0dGVyblwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlybXdhcmVWZXJzaW9uXCIgdHJhbnNsYXRlPlZlcnNpb248L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgaWQ9XCJmaXJtd2FyZVZlcnNpb25cIlxuICAgICAgICAgICAgZGF0YS1jeT1cImFkZC1maXJtd2FyZS1tb2RhbC0tZmlybXdhcmVWZXJzaW9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBuYW1lPVwidmVyc2lvblwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLnZlcnNpb25cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLicgfCB0cmFuc2xhdGUgfX0gMS4wLjBcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgW3BhdHRlcm5dPVwiVmFsaWRhdGlvblBhdHRlcm4ucnVsZXMubm9XaGl0ZVNwYWNlT25seS5wYXR0ZXJuXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kIGZvcm0tYmxvY2sgbS10LTQwXCIgdHJhbnNsYXRlPkZpcm13YXJlIGZpbGU8L2Rpdj5cbiAgICAgICAgICA8Yzh5LWZpbGUtcGlja2VyXG4gICAgICAgICAgICBbbWF4QWxsb3dlZEZpbGVzXT1cIjFcIlxuICAgICAgICAgICAgKG9uRmlsZXNQaWNrZWQpPVwib25GaWxlKCRldmVudClcIlxuICAgICAgICAgICAgW2ZpbGVVcmxQb3BvdmVyXT1cInRleHRGb3JGaXJtd2FyZVVybFBvcG92ZXJcIlxuICAgICAgICAgID48L2M4eS1maWxlLXBpY2tlcj5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGRhdGEtY3k9XCJhZGQtZmlybXdhcmUtbW9kYWwtLWNhbmNlbC1idG5cIlxuICAgICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwic2F2aW5nXCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICA+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIGZpcm13YXJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1wZW5kaW5nJzogc2F2aW5nIH1cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgIWZpcm13YXJlRm9ybS5mb3JtLnZhbGlkIHx8XG4gICAgICAgICAgZmlybXdhcmVGb3JtLmZvcm0ucHJpc3RpbmUgfHxcbiAgICAgICAgICBzYXZpbmcgfHxcbiAgICAgICAgICAoIW1vZGVsLmJpbmFyeT8udXJsICYmICFtb2RlbC5iaW5hcnk/LmZpbGUpXG4gICAgICAgIFwiXG4gICAgICAgIFthY3Rpb25OYW1lXT1cIlBST0RVQ1RfRVhQRVJJRU5DRS5GSVJNV0FSRS5FVkVOVFMuUkVQT1NJVE9SWVwiXG4gICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICBjb21wb25lbnQ6IFBST0RVQ1RfRVhQRVJJRU5DRS5GSVJNV0FSRS5DT01QT05FTlRTLkFERF9GSVJNV0FSRV9NT0RBTCxcbiAgICAgICAgICByZXN1bHQ6XG4gICAgICAgICAgICBmaXJtd2FyZVByZXNlbGVjdGVkIHx8IG1vZGVsLnNlbGVjdGVkPy5pZFxuICAgICAgICAgICAgICA/IFBST0RVQ1RfRVhQRVJJRU5DRS5GSVJNV0FSRS5SRVNVTFRTLkFERF9GSVJNV0FSRV9WRVJTSU9OXG4gICAgICAgICAgICAgIDogUFJPRFVDVF9FWFBFUklFTkNFLkZJUk1XQVJFLlJFU1VMVFMuQUREX0ZJUk1XQVJFXG4gICAgICAgIH1cIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgID5cbiAgICAgICAgQWRkIGZpcm13YXJlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9kaXY+XG4iXX0=
|