@alauda-fe/storage 0.0.1
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/esm2022/alauda-fe-storage.mjs +5 -0
- package/esm2022/index.mjs +23 -0
- package/esm2022/lib/components/pvc-delete-dialog/component.mjs +292 -0
- package/esm2022/lib/components/pvc-expand-capacity-dialog/component.mjs +193 -0
- package/esm2022/lib/components/pvc-form/component.mjs +674 -0
- package/esm2022/lib/components/rebuild-volume-dialog/component.mjs +251 -0
- package/esm2022/lib/components/source-link/component.mjs +81 -0
- package/esm2022/lib/components/spec-form/component.mjs +464 -0
- package/esm2022/lib/components/storage-feature-tags/component.mjs +146 -0
- package/esm2022/lib/components/storageclass-select/component.mjs +179 -0
- package/esm2022/lib/pipes/actual-capacity.pipe.mjs +17 -0
- package/esm2022/lib/services/common-util.service.mjs +163 -0
- package/esm2022/lib/services/pvc-util.service.mjs +416 -0
- package/esm2022/lib/types/commons.mjs +75 -0
- package/esm2022/lib/types/internal.mjs +7 -0
- package/esm2022/lib/types/k8s.mjs +2 -0
- package/esm2022/lib/types/resource-definition.mjs +13 -0
- package/esm2022/lib/types/resource-exports.mjs +8 -0
- package/esm2022/lib/types/resource-internals.mjs +2 -0
- package/esm2022/lib/utils/constants.mjs +202 -0
- package/esm2022/lib/utils/resource-exports.mjs +65 -0
- package/esm2022/lib/utils/util.mjs +132 -0
- package/index.d.ts +17 -0
- package/lib/components/pvc-delete-dialog/component.d.ts +33 -0
- package/lib/components/pvc-expand-capacity-dialog/component.d.ts +36 -0
- package/lib/components/pvc-form/component.d.ts +106 -0
- package/lib/components/rebuild-volume-dialog/component.d.ts +28 -0
- package/lib/components/source-link/component.d.ts +17 -0
- package/lib/components/spec-form/component.d.ts +71 -0
- package/lib/components/storage-feature-tags/component.d.ts +25 -0
- package/lib/components/storageclass-select/component.d.ts +26 -0
- package/lib/pipes/actual-capacity.pipe.d.ts +8 -0
- package/lib/services/common-util.service.d.ts +48 -0
- package/lib/services/pvc-util.service.d.ts +130 -0
- package/lib/types/commons.d.ts +85 -0
- package/lib/types/internal.d.ts +4 -0
- package/lib/types/k8s.d.ts +105 -0
- package/lib/types/resource-definition.d.ts +18 -0
- package/lib/types/resource-exports.d.ts +16 -0
- package/lib/types/resource-internals.d.ts +20 -0
- package/lib/utils/constants.d.ts +37 -0
- package/lib/utils/resource-exports.d.ts +12 -0
- package/lib/utils/util.d.ts +19 -0
- package/package.json +38 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { TagModule } from '@alauda/ui';
|
|
3
|
+
import { ObservableInput, publishRef, K8sUtilService, TRANSLATE_MODULE, } from '@alauda-fe/common';
|
|
4
|
+
import { AsyncPipe, NgFor, NgIf } from '@angular/common';
|
|
5
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
6
|
+
import { Observable, combineLatest, map, startWith } from 'rxjs';
|
|
7
|
+
import { StorageCommonUtilService } from '../../services/common-util.service';
|
|
8
|
+
import { StorageProvisioner, StorageclassFeature } from '../../types/commons';
|
|
9
|
+
import { STORAGE_OPTION_MAP, CSI_TOP_SNAPSHOTCLASS_NAME, } from '../../utils/constants';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@alauda-fe/common";
|
|
12
|
+
import * as i2 from "../../services/common-util.service";
|
|
13
|
+
import * as i3 from "@alauda/ui";
|
|
14
|
+
function StorageFeatureTagsComponent_ng_container_0_aui_tag_1_Template(rf, ctx) { if (rf & 1) {
|
|
15
|
+
i0.ɵɵelementStart(0, "aui-tag", 3);
|
|
16
|
+
i0.ɵɵtext(1);
|
|
17
|
+
i0.ɵɵpipe(2, "translate");
|
|
18
|
+
i0.ɵɵelementEnd();
|
|
19
|
+
} if (rf & 2) {
|
|
20
|
+
i0.ɵɵproperty("border", true);
|
|
21
|
+
i0.ɵɵadvance();
|
|
22
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, "default"), " ");
|
|
23
|
+
} }
|
|
24
|
+
function StorageFeatureTagsComponent_ng_container_0_aui_tag_2_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
+
i0.ɵɵelementStart(0, "aui-tag", 4);
|
|
26
|
+
i0.ɵɵtext(1);
|
|
27
|
+
i0.ɵɵpipe(2, "translate");
|
|
28
|
+
i0.ɵɵelementEnd();
|
|
29
|
+
} if (rf & 2) {
|
|
30
|
+
const tag_r1 = ctx.$implicit;
|
|
31
|
+
i0.ɵɵproperty("border", true);
|
|
32
|
+
i0.ɵɵadvance();
|
|
33
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 2, "storage." + tag_r1));
|
|
34
|
+
} }
|
|
35
|
+
function StorageFeatureTagsComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
+
i0.ɵɵelementContainerStart(0);
|
|
37
|
+
i0.ɵɵtemplate(1, StorageFeatureTagsComponent_ng_container_0_aui_tag_1_Template, 3, 4, "aui-tag", 1)(2, StorageFeatureTagsComponent_ng_container_0_aui_tag_2_Template, 3, 4, "aui-tag", 2);
|
|
38
|
+
i0.ɵɵpipe(3, "async");
|
|
39
|
+
i0.ɵɵelementContainerEnd();
|
|
40
|
+
} if (rf & 2) {
|
|
41
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
42
|
+
i0.ɵɵadvance();
|
|
43
|
+
i0.ɵɵproperty("ngIf", ctx_r1.hasDefault);
|
|
44
|
+
i0.ɵɵadvance();
|
|
45
|
+
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(3, 2, ctx_r1.features$));
|
|
46
|
+
} }
|
|
47
|
+
export class StorageFeatureTagsComponent {
|
|
48
|
+
constructor(k8sUtil, storageUtil) {
|
|
49
|
+
this.k8sUtil = k8sUtil;
|
|
50
|
+
this.storageUtil = storageUtil;
|
|
51
|
+
this.features$ = combineLatest([
|
|
52
|
+
this.provisioner$,
|
|
53
|
+
this.storageClass$,
|
|
54
|
+
this.volumeSnapshotClasses$.pipe(startWith([])),
|
|
55
|
+
this.storageUtil.storageDescriptionMapCache.fetch(null),
|
|
56
|
+
]).pipe(map(([provisioner, storageClass, volumeSnapshotClasses, storageDescriptionMaps,]) => {
|
|
57
|
+
const features = this.k8sUtil
|
|
58
|
+
.getAnnotation(storageClass, 'features')
|
|
59
|
+
?.split(',');
|
|
60
|
+
// 存储类列表不再依赖卷快照类,这里展示 features 完整的能力,参见 https://jira.alauda.cn/browse/ACP-31043 comment
|
|
61
|
+
const featuresSet = new Set(features);
|
|
62
|
+
this.updateStorageClassFeature(featuresSet, provisioner, storageClass);
|
|
63
|
+
this.updateVolumeSnapshotFeature(featuresSet, provisioner, storageClass, volumeSnapshotClasses);
|
|
64
|
+
this.updateThirdPartySnapshotFeature(featuresSet, storageClass, storageDescriptionMaps);
|
|
65
|
+
return Array.from(featuresSet);
|
|
66
|
+
}), map(features => features.filter(Boolean)), publishRef());
|
|
67
|
+
}
|
|
68
|
+
updateStorageClassFeature(featuresSet, provisioner, storageClass) {
|
|
69
|
+
if (storageClass) {
|
|
70
|
+
storageClass.allowVolumeExpansion
|
|
71
|
+
? featuresSet.add(StorageclassFeature.EXPANSION)
|
|
72
|
+
: featuresSet.delete(StorageclassFeature.EXPANSION);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
STORAGE_OPTION_MAP[provisioner]?.features?.forEach(feature => {
|
|
76
|
+
featuresSet.add(feature);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
updateVolumeSnapshotFeature(featuresSet, provisioner, storageClass, volumeSnapshotClasses) {
|
|
81
|
+
if (!volumeSnapshotClasses?.length) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.hasVolumeSnapshotFeature(provisioner, storageClass, volumeSnapshotClasses)
|
|
85
|
+
? featuresSet.add(StorageclassFeature.SNAPSHOT)
|
|
86
|
+
: featuresSet.delete(StorageclassFeature.SNAPSHOT);
|
|
87
|
+
}
|
|
88
|
+
hasVolumeSnapshotFeature(provisioner, storageClass, volumeSnapshotClasses) {
|
|
89
|
+
switch (provisioner) {
|
|
90
|
+
case StorageProvisioner.CEPH_FS_INTERNAL:
|
|
91
|
+
case StorageProvisioner.CEPH_FS_RBD: {
|
|
92
|
+
return volumeSnapshotClasses?.some(item => item.parameters?.clusterID ===
|
|
93
|
+
storageClass?.parameters?.clusterID &&
|
|
94
|
+
item.driver === provisioner);
|
|
95
|
+
}
|
|
96
|
+
case StorageProvisioner.TOPOLVM: {
|
|
97
|
+
return volumeSnapshotClasses?.some(item => item.metadata.name === CSI_TOP_SNAPSHOTCLASS_NAME);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
updateThirdPartySnapshotFeature(featuresSet, storageClass, storageDescriptionMaps) {
|
|
102
|
+
const thirdPartySnapshot = this.storageUtil.getThirdPartySnapshotSupported(storageClass, storageDescriptionMaps);
|
|
103
|
+
// null 表示未匹配到第三方存储
|
|
104
|
+
if (thirdPartySnapshot === null) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
thirdPartySnapshot
|
|
108
|
+
? featuresSet.add(StorageclassFeature.SNAPSHOT)
|
|
109
|
+
: featuresSet.delete(StorageclassFeature.SNAPSHOT);
|
|
110
|
+
}
|
|
111
|
+
static { this.ɵfac = function StorageFeatureTagsComponent_Factory(t) { return new (t || StorageFeatureTagsComponent)(i0.ɵɵdirectiveInject(i1.K8sUtilService), i0.ɵɵdirectiveInject(i2.StorageCommonUtilService)); }; }
|
|
112
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: StorageFeatureTagsComponent, selectors: [["acl-storage-feature-tags"]], inputs: { provisioner: "provisioner", storageClass: "storageClass", hasDefault: "hasDefault", volumeSnapshotClasses: "volumeSnapshotClasses" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 2, vars: 3, consts: [[4, "ngIf"], ["type", "success", "size", "mini", 3, "border", 4, "ngIf"], ["type", "info", "size", "mini", 3, "border", 4, "ngFor", "ngForOf"], ["type", "success", "size", "mini", 3, "border"], ["type", "info", "size", "mini", 3, "border"]], template: function StorageFeatureTagsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
+
i0.ɵɵtemplate(0, StorageFeatureTagsComponent_ng_container_0_Template, 4, 4, "ng-container", 0);
|
|
114
|
+
i0.ɵɵpipe(1, "async");
|
|
115
|
+
} if (rf & 2) {
|
|
116
|
+
let tmp_0_0;
|
|
117
|
+
i0.ɵɵproperty("ngIf", ((tmp_0_0 = i0.ɵɵpipeBind1(1, 1, ctx.features$)) == null ? null : tmp_0_0.length) || ctx.hasDefault);
|
|
118
|
+
} }, dependencies: [AsyncPipe, NgIf, NgFor, TagModule, i3.TagComponent, i1.TranslatePipe], encapsulation: 2, changeDetection: 0 }); }
|
|
119
|
+
}
|
|
120
|
+
__decorate([
|
|
121
|
+
ObservableInput(),
|
|
122
|
+
__metadata("design:type", Observable)
|
|
123
|
+
], StorageFeatureTagsComponent.prototype, "provisioner$", void 0);
|
|
124
|
+
__decorate([
|
|
125
|
+
ObservableInput(),
|
|
126
|
+
__metadata("design:type", Observable)
|
|
127
|
+
], StorageFeatureTagsComponent.prototype, "storageClass$", void 0);
|
|
128
|
+
__decorate([
|
|
129
|
+
ObservableInput(),
|
|
130
|
+
__metadata("design:type", Observable)
|
|
131
|
+
], StorageFeatureTagsComponent.prototype, "volumeSnapshotClasses$", void 0);
|
|
132
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(StorageFeatureTagsComponent, [{
|
|
133
|
+
type: Component,
|
|
134
|
+
args: [{ selector: 'acl-storage-feature-tags', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [AsyncPipe, NgIf, NgFor, TagModule, TRANSLATE_MODULE], template: "<ng-container *ngIf=\"(features$ | async)?.length || hasDefault\">\n <aui-tag\n *ngIf=\"hasDefault\"\n type=\"success\"\n size=\"mini\"\n [border]=\"true\"\n >\n {{ 'default' | translate }}\n </aui-tag>\n <aui-tag\n type=\"info\"\n size=\"mini\"\n [border]=\"true\"\n *ngFor=\"let tag of features$ | async\"\n >{{ 'storage.' + tag | translate }}</aui-tag\n >\n</ng-container>\n" }]
|
|
135
|
+
}], () => [{ type: i1.K8sUtilService }, { type: i2.StorageCommonUtilService }], { provisioner: [{
|
|
136
|
+
type: Input,
|
|
137
|
+
args: [{ required: true }]
|
|
138
|
+
}], provisioner$: [], storageClass: [{
|
|
139
|
+
type: Input
|
|
140
|
+
}], storageClass$: [], hasDefault: [{
|
|
141
|
+
type: Input
|
|
142
|
+
}], volumeSnapshotClasses: [{
|
|
143
|
+
type: Input
|
|
144
|
+
}], volumeSnapshotClasses$: [] }); })();
|
|
145
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(StorageFeatureTagsComponent, { className: "StorageFeatureTagsComponent", filePath: "lib/components/storage-feature-tags/component.ts", lineNumber: 28 }); })();
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zdG9yYWdlL3NyYy9saWIvY29tcG9uZW50cy9zdG9yYWdlLWZlYXR1cmUtdGFncy9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N0b3JhZ2Uvc3JjL2xpYi9jb21wb25lbnRzL3N0b3JhZ2UtZmVhdHVyZS10YWdzL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsY0FBYyxFQUVkLGdCQUFnQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQiwwQkFBMEIsR0FDM0IsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7O0lDakI3QixrQ0FLQztJQUNDLFlBQ0Y7O0lBQUEsaUJBQVU7O0lBSFIsNkJBQWU7SUFFZixjQUNGO0lBREUsZ0VBQ0Y7OztJQUNBLGtDQUtHO0lBQUEsWUFBa0M7O0lBQUEsaUJBQ3BDOzs7SUFIQyw2QkFBZTtJQUVkLGNBQWtDO0lBQWxDLCtEQUFrQzs7O0lBZHZD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RUFBRTs4QkFDSCxVQUFVO2lFQUFxQjtBQU05QztJQURDLGVBQWUsRUFBRTs4QkFDRixVQUFVO2tFQUFlO0FBU3pDO0lBREMsZUFBZSxFQUFFOzhCQUNPLFVBQVU7MkVBQXdCO2lGQXBCaEQsMkJBQTJCO2NBUHZDLFNBQVM7MkJBQ0UsMEJBQTBCLG1CQUVuQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztzRkFJOUQsV0FBVztrQkFEVixLQUFLO21CQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUl6QixZQUFZLE1BR1osWUFBWTtrQkFEWCxLQUFLO1lBSU4sYUFBYSxNQUdiLFVBQVU7a0JBRFQsS0FBSztZQUlOLHFCQUFxQjtrQkFEcEIsS0FBSztZQUlOLHNCQUFzQjtrRkFwQlgsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFnTW9kdWxlIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlSW5wdXQsXG4gIHB1Ymxpc2hSZWYsXG4gIEs4c1V0aWxTZXJ2aWNlLFxuICBTdHJpbmdNYXAsXG4gIFRSQU5TTEFURV9NT0RVTEUsXG59IGZyb20gJ0BhbGF1ZGEtZmUvY29tbW9uJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIG1hcCwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFN0b3JhZ2VDb21tb25VdGlsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1vbi11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVByb3Zpc2lvbmVyLCBTdG9yYWdlY2xhc3NGZWF0dXJlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbW9ucyc7XG5pbXBvcnQgeyBTdG9yYWdlQ2xhc3MsIFZvbHVtZVNuYXBzaG90Q2xhc3MgfSBmcm9tICcuLi8uLi90eXBlcy9rOHMnO1xuaW1wb3J0IHtcbiAgU1RPUkFHRV9PUFRJT05fTUFQLFxuICBDU0lfVE9QX1NOQVBTSE9UQ0xBU1NfTkFNRSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvY29uc3RhbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLXN0b3JhZ2UtZmVhdHVyZS10YWdzJyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtBc3luY1BpcGUsIE5nSWYsIE5nRm9yLCBUYWdNb2R1bGUsIFRSQU5TTEFURV9NT0RVTEVdLFxufSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlRmVhdHVyZVRhZ3NDb21wb25lbnQge1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBwcm92aXNpb25lcjogU3RvcmFnZVByb3Zpc2lvbmVyO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBwcm92aXNpb25lciQhOiBPYnNlcnZhYmxlPFN0b3JhZ2VQcm92aXNpb25lcj47XG5cbiAgQElucHV0KClcbiAgc3RvcmFnZUNsYXNzOiBTdG9yYWdlQ2xhc3M7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHN0b3JhZ2VDbGFzcyQhOiBPYnNlcnZhYmxlPFN0b3JhZ2VDbGFzcz47XG5cbiAgQElucHV0KClcbiAgaGFzRGVmYXVsdDogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICB2b2x1bWVTbmFwc2hvdENsYXNzZXM6IFZvbHVtZVNuYXBzaG90Q2xhc3NbXTtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgdm9sdW1lU25hcHNob3RDbGFzc2VzJCE6IE9ic2VydmFibGU8Vm9sdW1lU25hcHNob3RDbGFzc1tdPjtcblxuICBmZWF0dXJlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnByb3Zpc2lvbmVyJCxcbiAgICB0aGlzLnN0b3JhZ2VDbGFzcyQsXG4gICAgdGhpcy52b2x1bWVTbmFwc2hvdENsYXNzZXMkLnBpcGUoc3RhcnRXaXRoKFtdIGFzIFZvbHVtZVNuYXBzaG90Q2xhc3NbXSkpLFxuICAgIHRoaXMuc3RvcmFnZVV0aWwuc3RvcmFnZURlc2NyaXB0aW9uTWFwQ2FjaGUuZmV0Y2gobnVsbCksXG4gIF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFtcbiAgICAgICAgcHJvdmlzaW9uZXIsXG4gICAgICAgIHN0b3JhZ2VDbGFzcyxcbiAgICAgICAgdm9sdW1lU25hcHNob3RDbGFzc2VzLFxuICAgICAgICBzdG9yYWdlRGVzY3JpcHRpb25NYXBzLFxuICAgICAgXSkgPT4ge1xuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuazhzVXRpbFxuICAgICAgICAgIC5nZXRBbm5vdGF0aW9uKHN0b3JhZ2VDbGFzcywgJ2ZlYXR1cmVzJylcbiAgICAgICAgICA/LnNwbGl0KCcsJykgYXMgU3RvcmFnZWNsYXNzRmVhdHVyZVtdO1xuICAgICAgICAvLyDlrZjlgqjnsbvliJfooajkuI3lho3kvp3otZbljbflv6vnhafnsbvvvIzov5nph4zlsZXnpLogZmVhdHVyZXMg5a6M5pW055qE6IO95Yqb77yM5Y+C6KeBIGh0dHBzOi8vamlyYS5hbGF1ZGEuY24vYnJvd3NlL0FDUC0zMTA0MyBjb21tZW50XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzU2V0ID0gbmV3IFNldChmZWF0dXJlcyk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTdG9yYWdlQ2xhc3NGZWF0dXJlKGZlYXR1cmVzU2V0LCBwcm92aXNpb25lciwgc3RvcmFnZUNsYXNzKTtcbiAgICAgICAgdGhpcy51cGRhdGVWb2x1bWVTbmFwc2hvdEZlYXR1cmUoXG4gICAgICAgICAgZmVhdHVyZXNTZXQsXG4gICAgICAgICAgcHJvdmlzaW9uZXIsXG4gICAgICAgICAgc3RvcmFnZUNsYXNzLFxuICAgICAgICAgIHZvbHVtZVNuYXBzaG90Q2xhc3NlcyxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVUaGlyZFBhcnR5U25hcHNob3RGZWF0dXJlKFxuICAgICAgICAgIGZlYXR1cmVzU2V0LFxuICAgICAgICAgIHN0b3JhZ2VDbGFzcyxcbiAgICAgICAgICBzdG9yYWdlRGVzY3JpcHRpb25NYXBzLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZlYXR1cmVzU2V0KTtcbiAgICAgIH0sXG4gICAgKSxcbiAgICBtYXAoZmVhdHVyZXMgPT4gZmVhdHVyZXMuZmlsdGVyKEJvb2xlYW4pKSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNVdGlsOiBLOHNVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VVdGlsOiBTdG9yYWdlQ29tbW9uVXRpbFNlcnZpY2UsXG4gICkge31cblxuICBwcml2YXRlIHVwZGF0ZVN0b3JhZ2VDbGFzc0ZlYXR1cmUoXG4gICAgZmVhdHVyZXNTZXQ6IFNldDxzdHJpbmc+LFxuICAgIHByb3Zpc2lvbmVyOiBTdG9yYWdlUHJvdmlzaW9uZXIsXG4gICAgc3RvcmFnZUNsYXNzOiBTdG9yYWdlQ2xhc3MgfCBudWxsLFxuICApIHtcbiAgICBpZiAoc3RvcmFnZUNsYXNzKSB7XG4gICAgICBzdG9yYWdlQ2xhc3MuYWxsb3dWb2x1bWVFeHBhbnNpb25cbiAgICAgICAgPyBmZWF0dXJlc1NldC5hZGQoU3RvcmFnZWNsYXNzRmVhdHVyZS5FWFBBTlNJT04pXG4gICAgICAgIDogZmVhdHVyZXNTZXQuZGVsZXRlKFN0b3JhZ2VjbGFzc0ZlYXR1cmUuRVhQQU5TSU9OKTtcbiAgICB9IGVsc2Uge1xuICAgICAgU1RPUkFHRV9PUFRJT05fTUFQW3Byb3Zpc2lvbmVyXT8uZmVhdHVyZXM/LmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgIGZlYXR1cmVzU2V0LmFkZChmZWF0dXJlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVm9sdW1lU25hcHNob3RGZWF0dXJlKFxuICAgIGZlYXR1cmVzU2V0OiBTZXQ8c3RyaW5nPixcbiAgICBwcm92aXNpb25lcjogU3RvcmFnZVByb3Zpc2lvbmVyLFxuICAgIHN0b3JhZ2VDbGFzczogU3RvcmFnZUNsYXNzIHwgbnVsbCxcbiAgICB2b2x1bWVTbmFwc2hvdENsYXNzZXM6IFZvbHVtZVNuYXBzaG90Q2xhc3NbXSxcbiAgKSB7XG4gICAgaWYgKCF2b2x1bWVTbmFwc2hvdENsYXNzZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaGFzVm9sdW1lU25hcHNob3RGZWF0dXJlKFxuICAgICAgcHJvdmlzaW9uZXIsXG4gICAgICBzdG9yYWdlQ2xhc3MsXG4gICAgICB2b2x1bWVTbmFwc2hvdENsYXNzZXMsXG4gICAgKVxuICAgICAgPyBmZWF0dXJlc1NldC5hZGQoU3RvcmFnZWNsYXNzRmVhdHVyZS5TTkFQU0hPVClcbiAgICAgIDogZmVhdHVyZXNTZXQuZGVsZXRlKFN0b3JhZ2VjbGFzc0ZlYXR1cmUuU05BUFNIT1QpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNWb2x1bWVTbmFwc2hvdEZlYXR1cmUoXG4gICAgcHJvdmlzaW9uZXI6IFN0b3JhZ2VQcm92aXNpb25lcixcbiAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcyxcbiAgICB2b2x1bWVTbmFwc2hvdENsYXNzZXM6IFZvbHVtZVNuYXBzaG90Q2xhc3NbXSxcbiAgKSB7XG4gICAgc3dpdGNoIChwcm92aXNpb25lcikge1xuICAgICAgY2FzZSBTdG9yYWdlUHJvdmlzaW9uZXIuQ0VQSF9GU19JTlRFUk5BTDpcbiAgICAgIGNhc2UgU3RvcmFnZVByb3Zpc2lvbmVyLkNFUEhfRlNfUkJEOiB7XG4gICAgICAgIHJldHVybiB2b2x1bWVTbmFwc2hvdENsYXNzZXM/LnNvbWUoXG4gICAgICAgICAgaXRlbSA9PlxuICAgICAgICAgICAgaXRlbS5wYXJhbWV0ZXJzPy5jbHVzdGVySUQgPT09XG4gICAgICAgICAgICAgIHN0b3JhZ2VDbGFzcz8ucGFyYW1ldGVycz8uY2x1c3RlcklEICYmXG4gICAgICAgICAgICBpdGVtLmRyaXZlciA9PT0gcHJvdmlzaW9uZXIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIFN0b3JhZ2VQcm92aXNpb25lci5UT1BPTFZNOiB7XG4gICAgICAgIHJldHVybiB2b2x1bWVTbmFwc2hvdENsYXNzZXM/LnNvbWUoXG4gICAgICAgICAgaXRlbSA9PiBpdGVtLm1ldGFkYXRhLm5hbWUgPT09IENTSV9UT1BfU05BUFNIT1RDTEFTU19OQU1FLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGhpcmRQYXJ0eVNuYXBzaG90RmVhdHVyZShcbiAgICBmZWF0dXJlc1NldDogU2V0PHN0cmluZz4sXG4gICAgc3RvcmFnZUNsYXNzOiBTdG9yYWdlQ2xhc3MsXG4gICAgc3RvcmFnZURlc2NyaXB0aW9uTWFwczogU3RyaW5nTWFwW10sXG4gICkge1xuICAgIGNvbnN0IHRoaXJkUGFydHlTbmFwc2hvdCA9IHRoaXMuc3RvcmFnZVV0aWwuZ2V0VGhpcmRQYXJ0eVNuYXBzaG90U3VwcG9ydGVkKFxuICAgICAgc3RvcmFnZUNsYXNzLFxuICAgICAgc3RvcmFnZURlc2NyaXB0aW9uTWFwcyxcbiAgICApO1xuXG4gICAgLy8gbnVsbCDooajnpLrmnKrljLnphY3liLDnrKzkuInmlrnlrZjlgqhcbiAgICBpZiAodGhpcmRQYXJ0eVNuYXBzaG90ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcmRQYXJ0eVNuYXBzaG90XG4gICAgICA/IGZlYXR1cmVzU2V0LmFkZChTdG9yYWdlY2xhc3NGZWF0dXJlLlNOQVBTSE9UKVxuICAgICAgOiBmZWF0dXJlc1NldC5kZWxldGUoU3RvcmFnZWNsYXNzRmVhdHVyZS5TTkFQU0hPVCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIoZmVhdHVyZXMkIHwgYXN5bmMpPy5sZW5ndGggfHwgaGFzRGVmYXVsdFwiPlxuICA8YXVpLXRhZ1xuICAgICpuZ0lmPVwiaGFzRGVmYXVsdFwiXG4gICAgdHlwZT1cInN1Y2Nlc3NcIlxuICAgIHNpemU9XCJtaW5pXCJcbiAgICBbYm9yZGVyXT1cInRydWVcIlxuICA+XG4gICAge3sgJ2RlZmF1bHQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYXVpLXRhZz5cbiAgPGF1aS10YWdcbiAgICB0eXBlPVwiaW5mb1wiXG4gICAgc2l6ZT1cIm1pbmlcIlxuICAgIFtib3JkZXJdPVwidHJ1ZVwiXG4gICAgKm5nRm9yPVwibGV0IHRhZyBvZiBmZWF0dXJlcyQgfCBhc3luY1wiXG4gICAgPnt7ICdzdG9yYWdlLicgKyB0YWcgfCB0cmFuc2xhdGUgfX08L2F1aS10YWdcbiAgPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { SelectModule, coerceAttrBoolean } from '@alauda/ui';
|
|
3
|
+
import { FieldNotAvailablePipe, ObservableInput, PurePipe, ReadonlyFieldDirective, TranslateModule, publishRef, } from '@alauda-fe/common';
|
|
4
|
+
import { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';
|
|
5
|
+
import { Component, ChangeDetectionStrategy, inject, Input, Output, EventEmitter, } from '@angular/core';
|
|
6
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
7
|
+
import { BaseResourceFormComponent } from 'ng-resource-form-util';
|
|
8
|
+
import { Observable, combineLatest, filter, map, tap } from 'rxjs';
|
|
9
|
+
import { StorageCommonUtilService, } from '../../services/common-util.service';
|
|
10
|
+
import { StorageFeatureTagsComponent } from '../storage-feature-tags/component';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/forms";
|
|
13
|
+
import * as i2 from "@alauda/ui";
|
|
14
|
+
import * as i3 from "@alauda-fe/common";
|
|
15
|
+
const _c0 = a0 => ({ storageClassOptions: a0 });
|
|
16
|
+
const _c1 = a0 => ({ option: a0 });
|
|
17
|
+
function StorageClassSelectComponent_aui_select_0_aui_option_2_ng_container_1_Template(rf, ctx) { if (rf & 1) {
|
|
18
|
+
i0.ɵɵelementContainer(0);
|
|
19
|
+
} }
|
|
20
|
+
function StorageClassSelectComponent_aui_select_0_aui_option_2_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelementStart(0, "aui-option", 6);
|
|
22
|
+
i0.ɵɵtemplate(1, StorageClassSelectComponent_aui_select_0_aui_option_2_ng_container_1_Template, 1, 0, "ng-container", 7);
|
|
23
|
+
i0.ɵɵelementEnd();
|
|
24
|
+
} if (rf & 2) {
|
|
25
|
+
const option_r4 = ctx.$implicit;
|
|
26
|
+
i0.ɵɵnextContext(2);
|
|
27
|
+
const storageClassLabel_r5 = i0.ɵɵreference(3);
|
|
28
|
+
i0.ɵɵproperty("value", option_r4.value)("label", storageClassLabel_r5)("labelContext", i0.ɵɵpureFunction1(5, _c1, option_r4));
|
|
29
|
+
i0.ɵɵadvance();
|
|
30
|
+
i0.ɵɵproperty("ngTemplateOutlet", storageClassLabel_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(7, _c1, option_r4));
|
|
31
|
+
} }
|
|
32
|
+
function StorageClassSelectComponent_aui_select_0_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
34
|
+
i0.ɵɵelementStart(0, "aui-select", 4);
|
|
35
|
+
i0.ɵɵpipe(1, "translate");
|
|
36
|
+
i0.ɵɵlistener("ngModelChange", function StorageClassSelectComponent_aui_select_0_Template_aui_select_ngModelChange_0_listener($event) { const __r2 = i0.ɵɵrestoreView(_r1).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onStorageClassChange($event, __r2.storageClassOptions)); });
|
|
37
|
+
i0.ɵɵtemplate(2, StorageClassSelectComponent_aui_select_0_aui_option_2_Template, 2, 9, "aui-option", 5);
|
|
38
|
+
i0.ɵɵelementStart(3, "aui-option-placeholder");
|
|
39
|
+
i0.ɵɵtext(4);
|
|
40
|
+
i0.ɵɵpipe(5, "translate");
|
|
41
|
+
i0.ɵɵelementEnd()();
|
|
42
|
+
} if (rf & 2) {
|
|
43
|
+
const __r2 = ctx.ngIf;
|
|
44
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
45
|
+
const storageClassTmpl_r6 = i0.ɵɵreference(5);
|
|
46
|
+
i0.ɵɵproperty("required", ctx_r2.required)("formControl", ctx_r2.form)("clearable", !ctx_r2.required)("placeholder", i0.ɵɵpipeBind1(1, 8, "storage.select_storageclass"))("aclReadonlyField", ctx_r2.isFromSnapshot)("aclReadonlyFieldTemplate", storageClassTmpl_r6);
|
|
47
|
+
i0.ɵɵadvance(2);
|
|
48
|
+
i0.ɵɵproperty("ngForOf", __r2.storageClassOptions);
|
|
49
|
+
i0.ɵɵadvance(2);
|
|
50
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 10, "no_data"), " ");
|
|
51
|
+
} }
|
|
52
|
+
function StorageClassSelectComponent_ng_template_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
+
i0.ɵɵelementContainerStart(0);
|
|
54
|
+
i0.ɵɵelementStart(1, "span", 9);
|
|
55
|
+
i0.ɵɵtext(2);
|
|
56
|
+
i0.ɵɵelementEnd();
|
|
57
|
+
i0.ɵɵelement(3, "acl-storage-feature-tags", 10);
|
|
58
|
+
i0.ɵɵelementContainerEnd();
|
|
59
|
+
} if (rf & 2) {
|
|
60
|
+
const option_r7 = i0.ɵɵnextContext().option;
|
|
61
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
62
|
+
i0.ɵɵadvance(2);
|
|
63
|
+
i0.ɵɵtextInterpolate(option_r7.key);
|
|
64
|
+
i0.ɵɵadvance();
|
|
65
|
+
i0.ɵɵproperty("provisioner", option_r7.provisioner)("storageClass", option_r7.storageClass)("hasDefault", option_r7.isDefault)("volumeSnapshotClasses", ctx_r2.volumeSnapshotClasses);
|
|
66
|
+
} }
|
|
67
|
+
function StorageClassSelectComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
+
i0.ɵɵtemplate(0, StorageClassSelectComponent_ng_template_2_ng_container_0_Template, 4, 5, "ng-container", 8);
|
|
69
|
+
} if (rf & 2) {
|
|
70
|
+
const option_r7 = ctx.option;
|
|
71
|
+
i0.ɵɵnextContext();
|
|
72
|
+
const empty_r8 = i0.ɵɵreference(7);
|
|
73
|
+
i0.ɵɵproperty("ngIf", option_r7)("ngIfElse", empty_r8);
|
|
74
|
+
} }
|
|
75
|
+
function StorageClassSelectComponent_ng_template_4_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
+
i0.ɵɵelementContainer(0);
|
|
77
|
+
} }
|
|
78
|
+
function StorageClassSelectComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
+
i0.ɵɵtemplate(0, StorageClassSelectComponent_ng_template_4_ng_container_0_Template, 1, 0, "ng-container", 7);
|
|
80
|
+
i0.ɵɵpipe(1, "async");
|
|
81
|
+
i0.ɵɵpipe(2, "pure");
|
|
82
|
+
} if (rf & 2) {
|
|
83
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
84
|
+
const storageClassLabel_r5 = i0.ɵɵreference(3);
|
|
85
|
+
i0.ɵɵproperty("ngTemplateOutlet", storageClassLabel_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(8, _c1, i0.ɵɵpipeBind3(2, 4, ctx_r2.form.value, ctx_r2.getStorageClassOption, i0.ɵɵpipeBind1(1, 2, ctx_r2.storageClassOptions$))));
|
|
86
|
+
} }
|
|
87
|
+
function StorageClassSelectComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
|
|
88
|
+
i0.ɵɵtext(0);
|
|
89
|
+
i0.ɵɵpipe(1, "aclFieldNotAvailable");
|
|
90
|
+
} if (rf & 2) {
|
|
91
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(1, 1, null));
|
|
92
|
+
} }
|
|
93
|
+
export class StorageClassSelectComponent extends BaseResourceFormComponent {
|
|
94
|
+
constructor() {
|
|
95
|
+
super(...arguments);
|
|
96
|
+
this.selectDefault = true;
|
|
97
|
+
this.storageClassChange = new EventEmitter();
|
|
98
|
+
this.storageCommonUtil = inject(StorageCommonUtilService);
|
|
99
|
+
this.storageClassOptions$ = combineLatest([
|
|
100
|
+
this.storageClasses$.pipe(filter(list => !!list)),
|
|
101
|
+
this.storageCommonUtil.storageDescriptionMapCache.fetch(null),
|
|
102
|
+
]).pipe(map(([storageClasses, storageDescriptionMaps]) => storageClasses.map(item => this.storageCommonUtil.mapToStorageClassOption(item, storageDescriptionMaps, this.isFromSnapshot))), tap(items => {
|
|
103
|
+
if (this.selectDefault && !this.isFromSnapshot && !this.form.value) {
|
|
104
|
+
const defaultSc = items.find(item => item.isDefault);
|
|
105
|
+
if (defaultSc) {
|
|
106
|
+
this.form.setValue(defaultSc.value);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
this.onStorageClassChange(this.form.value, items);
|
|
110
|
+
}), publishRef());
|
|
111
|
+
this.errorsInDetail = true;
|
|
112
|
+
}
|
|
113
|
+
set required(value) {
|
|
114
|
+
this._required = coerceAttrBoolean(value);
|
|
115
|
+
}
|
|
116
|
+
get required() {
|
|
117
|
+
return this._required;
|
|
118
|
+
}
|
|
119
|
+
createForm() {
|
|
120
|
+
return this.fb.control('');
|
|
121
|
+
}
|
|
122
|
+
getStorageClassOption(value, options) {
|
|
123
|
+
return options?.find(option => option.value === value);
|
|
124
|
+
}
|
|
125
|
+
onStorageClassChange(storageClassName, storageClassOptions) {
|
|
126
|
+
const storageClassOption = this.getStorageClassOption(storageClassName, storageClassOptions);
|
|
127
|
+
this.storageClassChange.emit(storageClassOption);
|
|
128
|
+
}
|
|
129
|
+
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵStorageClassSelectComponent_BaseFactory; return function StorageClassSelectComponent_Factory(t) { return (ɵStorageClassSelectComponent_BaseFactory || (ɵStorageClassSelectComponent_BaseFactory = i0.ɵɵgetInheritedFactory(StorageClassSelectComponent)))(t || StorageClassSelectComponent); }; })(); }
|
|
130
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: StorageClassSelectComponent, selectors: [["acl-storageclass-select"]], inputs: { storageClasses: "storageClasses", required: "required", volumeSnapshotClasses: "volumeSnapshotClasses", selectDefault: "selectDefault", isFromSnapshot: "isFromSnapshot" }, outputs: { storageClassChange: "storageClassChange" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 8, vars: 5, consts: [["storageClassLabel", ""], ["storageClassTmpl", ""], ["empty", ""], [3, "required", "formControl", "clearable", "placeholder", "aclReadonlyField", "aclReadonlyFieldTemplate", "ngModelChange", 4, "ngIf"], [3, "ngModelChange", "required", "formControl", "clearable", "placeholder", "aclReadonlyField", "aclReadonlyFieldTemplate"], [3, "value", "label", "labelContext", 4, "ngFor", "ngForOf"], [3, "value", "label", "labelContext"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [4, "ngIf", "ngIfElse"], [1, "tw-mr-8"], [3, "provisioner", "storageClass", "hasDefault", "volumeSnapshotClasses"]], template: function StorageClassSelectComponent_Template(rf, ctx) { if (rf & 1) {
|
|
131
|
+
i0.ɵɵtemplate(0, StorageClassSelectComponent_aui_select_0_Template, 6, 12, "aui-select", 3);
|
|
132
|
+
i0.ɵɵpipe(1, "async");
|
|
133
|
+
i0.ɵɵtemplate(2, StorageClassSelectComponent_ng_template_2_Template, 1, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(4, StorageClassSelectComponent_ng_template_4_Template, 3, 10, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor)(6, StorageClassSelectComponent_ng_template_6_Template, 2, 3, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
|
|
134
|
+
} if (rf & 2) {
|
|
135
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpureFunction1(3, _c0, i0.ɵɵpipeBind1(1, 1, ctx.storageClassOptions$)));
|
|
136
|
+
} }, dependencies: [AsyncPipe,
|
|
137
|
+
NgIf,
|
|
138
|
+
NgFor,
|
|
139
|
+
NgTemplateOutlet,
|
|
140
|
+
ReactiveFormsModule, i1.NgControlStatus, i1.RequiredValidator, i1.FormControlDirective, SelectModule, i2.SelectComponent, i2.OptionComponent, i2.OptionPlaceholderComponent, PurePipe,
|
|
141
|
+
FieldNotAvailablePipe,
|
|
142
|
+
TranslateModule, i3.TranslatePipe, ReadonlyFieldDirective,
|
|
143
|
+
StorageFeatureTagsComponent], encapsulation: 2, changeDetection: 0 }); }
|
|
144
|
+
}
|
|
145
|
+
__decorate([
|
|
146
|
+
ObservableInput(),
|
|
147
|
+
__metadata("design:type", Observable)
|
|
148
|
+
], StorageClassSelectComponent.prototype, "storageClasses$", void 0);
|
|
149
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(StorageClassSelectComponent, [{
|
|
150
|
+
type: Component,
|
|
151
|
+
args: [{ selector: 'acl-storageclass-select', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
152
|
+
AsyncPipe,
|
|
153
|
+
NgIf,
|
|
154
|
+
NgFor,
|
|
155
|
+
NgTemplateOutlet,
|
|
156
|
+
ReactiveFormsModule,
|
|
157
|
+
SelectModule,
|
|
158
|
+
PurePipe,
|
|
159
|
+
FieldNotAvailablePipe,
|
|
160
|
+
TranslateModule,
|
|
161
|
+
ReadonlyFieldDirective,
|
|
162
|
+
StorageFeatureTagsComponent,
|
|
163
|
+
], template: "<aui-select\n *ngIf=\"{ storageClassOptions: storageClassOptions$ | async } as _\"\n [required]=\"required\"\n [formControl]=\"form\"\n [clearable]=\"!required\"\n [placeholder]=\"'storage.select_storageclass' | translate\"\n [aclReadonlyField]=\"isFromSnapshot\"\n [aclReadonlyFieldTemplate]=\"storageClassTmpl\"\n (ngModelChange)=\"onStorageClassChange($event, _.storageClassOptions)\"\n>\n <aui-option\n *ngFor=\"let option of _.storageClassOptions\"\n [value]=\"option.value\"\n [label]=\"storageClassLabel\"\n [labelContext]=\"{ option }\"\n >\n <ng-container\n *ngTemplateOutlet=\"storageClassLabel; context: { option }\"\n ></ng-container>\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n</aui-select>\n\n<ng-template\n #storageClassLabel\n let-option=\"option\"\n>\n <ng-container *ngIf=\"option; else empty\">\n <span class=\"tw-mr-8\">{{ option.key }}</span>\n <acl-storage-feature-tags\n [provisioner]=\"option.provisioner\"\n [storageClass]=\"option.storageClass\"\n [hasDefault]=\"option.isDefault\"\n [volumeSnapshotClasses]=\"volumeSnapshotClasses\"\n ></acl-storage-feature-tags>\n </ng-container>\n</ng-template>\n\n<ng-template #storageClassTmpl>\n <ng-container\n *ngTemplateOutlet=\"\n storageClassLabel;\n context: {\n option:form.value | pure: getStorageClassOption:(storageClassOptions$ | async)\n }\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template #empty>{{ null | aclFieldNotAvailable }}</ng-template>\n" }]
|
|
164
|
+
}], null, { storageClasses: [{
|
|
165
|
+
type: Input,
|
|
166
|
+
args: [{ required: true }]
|
|
167
|
+
}], storageClasses$: [], required: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], volumeSnapshotClasses: [{
|
|
170
|
+
type: Input
|
|
171
|
+
}], selectDefault: [{
|
|
172
|
+
type: Input
|
|
173
|
+
}], isFromSnapshot: [{
|
|
174
|
+
type: Input
|
|
175
|
+
}], storageClassChange: [{
|
|
176
|
+
type: Output
|
|
177
|
+
}] }); })();
|
|
178
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(StorageClassSelectComponent, { className: "StorageClassSelectComponent", filePath: "lib/components/storageclass-select/component.ts", lineNumber: 49 }); })();
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zdG9yYWdlL3NyYy9saWIvY29tcG9uZW50cy9zdG9yYWdlY2xhc3Mtc2VsZWN0L2NvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3RvcmFnZS9zcmMvbGliL2NvbXBvbmVudHMvc3RvcmFnZWNsYXNzLXNlbGVjdC90ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzFFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsZUFBZSxFQUNmLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLFVBQVUsR0FDWCxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuRSxPQUFPLEVBQ0wsd0JBQXdCLEdBRXpCLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7O0lDWDVFLHdCQUVnQjs7O0lBUmxCLHFDQUtDO0lBQ0Msd0hBRUM7SUFD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QkFEWCxLQUFLO1lBVU4scUJBQXFCO2tCQURwQixLQUFLO1lBSU4sYUFBYTtrQkFEWixLQUFLO1lBSU4sY0FBYztrQkFEYixLQUFLO1lBSU4sa0JBQWtCO2tCQURqQixNQUFNOztrRkF6QkksMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXR0ckJvb2xlYW4sIFNlbGVjdE1vZHVsZSwgY29lcmNlQXR0ckJvb2xlYW4gfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEZpZWxkTm90QXZhaWxhYmxlUGlwZSxcbiAgT2JzZXJ2YWJsZUlucHV0LFxuICBQdXJlUGlwZSxcbiAgUmVhZG9ubHlGaWVsZERpcmVjdGl2ZSxcbiAgVHJhbnNsYXRlTW9kdWxlLFxuICBwdWJsaXNoUmVmLFxufSBmcm9tICdAYWxhdWRhLWZlL2NvbW1vbic7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCYXNlUmVzb3VyY2VGb3JtQ29tcG9uZW50IH0gZnJvbSAnbmctcmVzb3VyY2UtZm9ybS11dGlsJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIGZpbHRlciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgU3RvcmFnZUNvbW1vblV0aWxTZXJ2aWNlLFxuICBTdG9yYWdlU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb21tb24tdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VDbGFzcywgVm9sdW1lU25hcHNob3RDbGFzcyB9IGZyb20gJy4uLy4uL3R5cGVzL2s4cyc7XG5pbXBvcnQgeyBTdG9yYWdlRmVhdHVyZVRhZ3NDb21wb25lbnQgfSBmcm9tICcuLi9zdG9yYWdlLWZlYXR1cmUtdGFncy9jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wtc3RvcmFnZWNsYXNzLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAndGVtcGxhdGUuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQXN5bmNQaXBlLFxuICAgIE5nSWYsXG4gICAgTmdGb3IsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFNlbGVjdE1vZHVsZSxcbiAgICBQdXJlUGlwZSxcbiAgICBGaWVsZE5vdEF2YWlsYWJsZVBpcGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIFJlYWRvbmx5RmllbGREaXJlY3RpdmUsXG4gICAgU3RvcmFnZUZlYXR1cmVUYWdzQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlQ2xhc3NTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBCYXNlUmVzb3VyY2VGb3JtQ29tcG9uZW50PHN0cmluZz4ge1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzdG9yYWdlQ2xhc3NlczogU3RvcmFnZUNsYXNzW107XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHN0b3JhZ2VDbGFzc2VzJCE6IE9ic2VydmFibGU8U3RvcmFnZUNsYXNzW10+O1xuXG4gIEBJbnB1dCgpXG4gIHNldCByZXF1aXJlZCh2YWx1ZTogQXR0ckJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUF0dHJCb29sZWFuKHZhbHVlKTtcbiAgfVxuXG4gIGdldCByZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICB2b2x1bWVTbmFwc2hvdENsYXNzZXM6IFZvbHVtZVNuYXBzaG90Q2xhc3NbXTtcblxuICBASW5wdXQoKVxuICBzZWxlY3REZWZhdWx0ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBpc0Zyb21TbmFwc2hvdDogYm9vbGVhbjtcblxuICBAT3V0cHV0KClcbiAgc3RvcmFnZUNsYXNzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTdG9yYWdlU2VsZWN0T3B0aW9uPigpO1xuXG4gIHN0b3JhZ2VDb21tb25VdGlsID0gaW5qZWN0KFN0b3JhZ2VDb21tb25VdGlsU2VydmljZSk7XG5cbiAgc3RvcmFnZUNsYXNzT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnN0b3JhZ2VDbGFzc2VzJC5waXBlKGZpbHRlcihsaXN0ID0+ICEhbGlzdCkpLFxuICAgIHRoaXMuc3RvcmFnZUNvbW1vblV0aWwuc3RvcmFnZURlc2NyaXB0aW9uTWFwQ2FjaGUuZmV0Y2gobnVsbCksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbc3RvcmFnZUNsYXNzZXMsIHN0b3JhZ2VEZXNjcmlwdGlvbk1hcHNdKSA9PlxuICAgICAgc3RvcmFnZUNsYXNzZXMubWFwKGl0ZW0gPT5cbiAgICAgICAgdGhpcy5zdG9yYWdlQ29tbW9uVXRpbC5tYXBUb1N0b3JhZ2VDbGFzc09wdGlvbihcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIHN0b3JhZ2VEZXNjcmlwdGlvbk1hcHMsXG4gICAgICAgICAgdGhpcy5pc0Zyb21TbmFwc2hvdCxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgICB0YXAoaXRlbXMgPT4ge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0RGVmYXVsdCAmJiAhdGhpcy5pc0Zyb21TbmFwc2hvdCAmJiAhdGhpcy5mb3JtLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTYyA9IGl0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmlzRGVmYXVsdCk7XG4gICAgICAgIGlmIChkZWZhdWx0U2MpIHtcbiAgICAgICAgICB0aGlzLmZvcm0uc2V0VmFsdWUoZGVmYXVsdFNjLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5vblN0b3JhZ2VDbGFzc0NoYW5nZSh0aGlzLmZvcm0udmFsdWUsIGl0ZW1zKTtcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgb3ZlcnJpZGUgY3JlYXRlRm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mYi5jb250cm9sKCcnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGVycm9yc0luRGV0YWlsID0gdHJ1ZTtcblxuICBnZXRTdG9yYWdlQ2xhc3NPcHRpb24odmFsdWU6IHN0cmluZywgb3B0aW9ucz86IFN0b3JhZ2VTZWxlY3RPcHRpb25bXSkge1xuICAgIHJldHVybiBvcHRpb25zPy5maW5kKG9wdGlvbiA9PiBvcHRpb24udmFsdWUgPT09IHZhbHVlKTtcbiAgfVxuXG4gIG9uU3RvcmFnZUNsYXNzQ2hhbmdlKFxuICAgIHN0b3JhZ2VDbGFzc05hbWU6IHN0cmluZyxcbiAgICBzdG9yYWdlQ2xhc3NPcHRpb25zPzogU3RvcmFnZVNlbGVjdE9wdGlvbltdLFxuICApIHtcbiAgICBjb25zdCBzdG9yYWdlQ2xhc3NPcHRpb24gPSB0aGlzLmdldFN0b3JhZ2VDbGFzc09wdGlvbihcbiAgICAgIHN0b3JhZ2VDbGFzc05hbWUsXG4gICAgICBzdG9yYWdlQ2xhc3NPcHRpb25zLFxuICAgICk7XG4gICAgdGhpcy5zdG9yYWdlQ2xhc3NDaGFuZ2UuZW1pdChzdG9yYWdlQ2xhc3NPcHRpb24pO1xuICB9XG59XG4iLCI8YXVpLXNlbGVjdFxuICAqbmdJZj1cInsgc3RvcmFnZUNsYXNzT3B0aW9uczogc3RvcmFnZUNsYXNzT3B0aW9ucyQgfCBhc3luYyB9IGFzIF9cIlxuICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICBbZm9ybUNvbnRyb2xdPVwiZm9ybVwiXG4gIFtjbGVhcmFibGVdPVwiIXJlcXVpcmVkXCJcbiAgW3BsYWNlaG9sZGVyXT1cIidzdG9yYWdlLnNlbGVjdF9zdG9yYWdlY2xhc3MnIHwgdHJhbnNsYXRlXCJcbiAgW2FjbFJlYWRvbmx5RmllbGRdPVwiaXNGcm9tU25hcHNob3RcIlxuICBbYWNsUmVhZG9ubHlGaWVsZFRlbXBsYXRlXT1cInN0b3JhZ2VDbGFzc1RtcGxcIlxuICAobmdNb2RlbENoYW5nZSk9XCJvblN0b3JhZ2VDbGFzc0NoYW5nZSgkZXZlbnQsIF8uc3RvcmFnZUNsYXNzT3B0aW9ucylcIlxuPlxuICA8YXVpLW9wdGlvblxuICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgXy5zdG9yYWdlQ2xhc3NPcHRpb25zXCJcbiAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICBbbGFiZWxdPVwic3RvcmFnZUNsYXNzTGFiZWxcIlxuICAgIFtsYWJlbENvbnRleHRdPVwieyBvcHRpb24gfVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInN0b3JhZ2VDbGFzc0xhYmVsOyBjb250ZXh0OiB7IG9wdGlvbiB9XCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gIDwvYXVpLW9wdGlvbj5cbiAgPGF1aS1vcHRpb24tcGxhY2Vob2xkZXI+XG4gICAge3sgJ25vX2RhdGEnIHwgdHJhbnNsYXRlIH19XG4gIDwvYXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbjwvYXVpLXNlbGVjdD5cblxuPG5nLXRlbXBsYXRlXG4gICNzdG9yYWdlQ2xhc3NMYWJlbFxuICBsZXQtb3B0aW9uPVwib3B0aW9uXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbjsgZWxzZSBlbXB0eVwiPlxuICAgIDxzcGFuIGNsYXNzPVwidHctbXItOFwiPnt7IG9wdGlvbi5rZXkgfX08L3NwYW4+XG4gICAgPGFjbC1zdG9yYWdlLWZlYXR1cmUtdGFnc1xuICAgICAgW3Byb3Zpc2lvbmVyXT1cIm9wdGlvbi5wcm92aXNpb25lclwiXG4gICAgICBbc3RvcmFnZUNsYXNzXT1cIm9wdGlvbi5zdG9yYWdlQ2xhc3NcIlxuICAgICAgW2hhc0RlZmF1bHRdPVwib3B0aW9uLmlzRGVmYXVsdFwiXG4gICAgICBbdm9sdW1lU25hcHNob3RDbGFzc2VzXT1cInZvbHVtZVNuYXBzaG90Q2xhc3Nlc1wiXG4gICAgPjwvYWNsLXN0b3JhZ2UtZmVhdHVyZS10YWdzPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3RvcmFnZUNsYXNzVG1wbD5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBzdG9yYWdlQ2xhc3NMYWJlbDtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgb3B0aW9uOmZvcm0udmFsdWUgfCBwdXJlOiBnZXRTdG9yYWdlQ2xhc3NPcHRpb246KHN0b3JhZ2VDbGFzc09wdGlvbnMkIHwgYXN5bmMpXG4gICAgICB9XG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eT57eyBudWxsIHwgYWNsRmllbGROb3RBdmFpbGFibGUgfX08L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { toUnitGi } from '@alauda-fe/common';
|
|
2
|
+
import { Pipe } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class ActualCapacityPipe {
|
|
5
|
+
transform(value, withUnit = true) {
|
|
6
|
+
const capacity = value?.status?.capacity?.storage ||
|
|
7
|
+
value?.spec?.resources?.requests?.storage;
|
|
8
|
+
return withUnit ? capacity : toUnitGi(capacity);
|
|
9
|
+
}
|
|
10
|
+
static { this.ɵfac = function ActualCapacityPipe_Factory(t) { return new (t || ActualCapacityPipe)(); }; }
|
|
11
|
+
static { this.ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "rcActualCapacity", type: ActualCapacityPipe, pure: true, standalone: true }); }
|
|
12
|
+
}
|
|
13
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActualCapacityPipe, [{
|
|
14
|
+
type: Pipe,
|
|
15
|
+
args: [{ standalone: true, name: 'rcActualCapacity' }]
|
|
16
|
+
}], null, null); })();
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0dWFsLWNhcGFjaXR5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N0b3JhZ2Uvc3JjL2xpYi9waXBlcy9hY3R1YWwtY2FwYWNpdHkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXlCLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUdwRCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFNBQVMsQ0FBQyxLQUE0QixFQUFFLFFBQVEsR0FBRyxJQUFJO1FBQ3JELE1BQU0sUUFBUSxHQUNaLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU87WUFDaEMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztRQUM1QyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQsQ0FBQzttRkFOVSxrQkFBa0I7MEZBQWxCLGtCQUFrQjs7aUZBQWxCLGtCQUFrQjtjQUQ5QixJQUFJO2VBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBlcnNpc3RlbnRWb2x1bWVDbGFpbSwgdG9Vbml0R2kgfSBmcm9tICdAYWxhdWRhLWZlL2NvbW1vbic7XG5pbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHsgc3RhbmRhbG9uZTogdHJ1ZSwgbmFtZTogJ3JjQWN0dWFsQ2FwYWNpdHknIH0pXG5leHBvcnQgY2xhc3MgQWN0dWFsQ2FwYWNpdHlQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogUGVyc2lzdGVudFZvbHVtZUNsYWltLCB3aXRoVW5pdCA9IHRydWUpIHtcbiAgICBjb25zdCBjYXBhY2l0eSA9XG4gICAgICB2YWx1ZT8uc3RhdHVzPy5jYXBhY2l0eT8uc3RvcmFnZSB8fFxuICAgICAgdmFsdWU/LnNwZWM/LnJlc291cmNlcz8ucmVxdWVzdHM/LnN0b3JhZ2U7XG4gICAgcmV0dXJuIHdpdGhVbml0ID8gY2FwYWNpdHkgOiB0b1VuaXRHaShjYXBhY2l0eSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { matchLabelsToString, K8sUtilService, publishRef, RESOURCE_TYPES, K8sApiService, skipError, parse, CacheStore, VolumeModes, AccessModes, } from '@alauda-fe/common';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { isBoolean } from 'lodash-es';
|
|
4
|
+
import { map, shareReplay } from 'rxjs';
|
|
5
|
+
import { StorageclassFeature } from '../types/commons';
|
|
6
|
+
import { getProvisioner, getProvisionerType, getStorageclassAccessModes, getStorageclassVolumeModes, isDefaultStorageclass, } from '../utils/util';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@alauda-fe/common";
|
|
9
|
+
export class StorageCommonUtilService {
|
|
10
|
+
constructor(k8sUtil, k8sApi) {
|
|
11
|
+
this.k8sUtil = k8sUtil;
|
|
12
|
+
this.k8sApi = k8sApi;
|
|
13
|
+
this.storageDescriptionMapCache = new CacheStore({
|
|
14
|
+
fetcher: () => this.k8sApi
|
|
15
|
+
.getGlobalResourceList({
|
|
16
|
+
type: RESOURCE_TYPES.CONFIG_MAP,
|
|
17
|
+
// 获取第三方存储能力配置,其中 ns 和 label 都固定
|
|
18
|
+
namespace: 'kube-public',
|
|
19
|
+
queryParams: {
|
|
20
|
+
labelSelector: 'features.alauda.io/type=StorageDescription',
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
.pipe(map(res => [...res.items].sort((a, b) => +new Date(a.metadata.creationTimestamp) -
|
|
24
|
+
+new Date(b.metadata.creationTimestamp))), map(items => items.map(item => item.data)), skipError([])),
|
|
25
|
+
share: () => shareReplay(1),
|
|
26
|
+
});
|
|
27
|
+
this.isStorageClassFeatureSupported =
|
|
28
|
+
this.isStorageClassFeatureSupported.bind(this);
|
|
29
|
+
}
|
|
30
|
+
getStorageClassFeatures(storageClass) {
|
|
31
|
+
const featuresSet = new Set(this.k8sUtil
|
|
32
|
+
.getAnnotation(storageClass, 'features')
|
|
33
|
+
?.split(',') || []);
|
|
34
|
+
if (storageClass?.allowVolumeExpansion) {
|
|
35
|
+
featuresSet.add(StorageclassFeature.EXPANSION);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
featuresSet.delete(StorageclassFeature.EXPANSION);
|
|
39
|
+
}
|
|
40
|
+
return [...featuresSet];
|
|
41
|
+
}
|
|
42
|
+
isStorageClassFeatureSupported(storageclass, feature) {
|
|
43
|
+
return this.getStorageClassFeatures(storageclass).includes(feature);
|
|
44
|
+
}
|
|
45
|
+
mapToStorageClassOption(sc, storageDescriptionMaps, isFromSnapshot) {
|
|
46
|
+
return {
|
|
47
|
+
key: sc.metadata.name,
|
|
48
|
+
value: sc.metadata.name,
|
|
49
|
+
isDefault: isDefaultStorageclass(sc),
|
|
50
|
+
accessModes: this.getStorageclassAccessModes(sc, storageDescriptionMaps, isFromSnapshot) || [],
|
|
51
|
+
features: this.getStorageClassFeatures(sc),
|
|
52
|
+
volumeModes: this.getStorageclassVolumeModes(sc, storageDescriptionMaps),
|
|
53
|
+
provisioner: sc.provisioner,
|
|
54
|
+
storageClass: sc,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
isClusterSnapshotPluginEnabled$(cluster) {
|
|
58
|
+
return this.k8sApi
|
|
59
|
+
.getGlobalResourceList({
|
|
60
|
+
type: RESOURCE_TYPES.MODULE_INFO,
|
|
61
|
+
queryParams: {
|
|
62
|
+
labelSelector: matchLabelsToString({
|
|
63
|
+
[this.k8sUtil.normalizeType('module-type')]: 'plugin',
|
|
64
|
+
[this.k8sUtil.normalizeType('cluster-name')]: cluster,
|
|
65
|
+
[this.k8sUtil.normalizeType('module-name')]: 'snapshot',
|
|
66
|
+
}),
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
.pipe(map(r => !!r.items?.[0]), publishRef());
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 获取第三方快照能力支持情况,若返回 null 表示未匹配到三方存储
|
|
73
|
+
*/
|
|
74
|
+
getThirdPartySnapshotSupported(sc, storageDescriptionMaps) {
|
|
75
|
+
const provisioner = getProvisioner(sc);
|
|
76
|
+
const config = this.findStorageDescriptionMap(storageDescriptionMaps, provisioner);
|
|
77
|
+
// 如果匹配到三方 provisioner 未定义和非法都按 false 处理
|
|
78
|
+
if (config) {
|
|
79
|
+
const snapshot = parse(config)?.snapshot;
|
|
80
|
+
return isBoolean(snapshot) ? snapshot : false;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
getProvisionerType(sc, storageDescriptionMaps) {
|
|
85
|
+
const provisioner = getProvisioner(sc);
|
|
86
|
+
const config = this.findStorageDescriptionMap(storageDescriptionMaps, provisioner);
|
|
87
|
+
// 解析第三方存储类型
|
|
88
|
+
if (config) {
|
|
89
|
+
const type = parse(config).type;
|
|
90
|
+
if (!type) {
|
|
91
|
+
return 'unknown';
|
|
92
|
+
}
|
|
93
|
+
const result = this.filterByAllowedValues([type], ['Filesystem', 'Block'])[0];
|
|
94
|
+
return result
|
|
95
|
+
? {
|
|
96
|
+
Filesystem: 'file_storage',
|
|
97
|
+
Block: 'block_storage',
|
|
98
|
+
}[result]
|
|
99
|
+
: 'unknown';
|
|
100
|
+
}
|
|
101
|
+
return getProvisionerType(provisioner);
|
|
102
|
+
}
|
|
103
|
+
getStorageclassAccessModes(sc, storageDescriptionMaps, isFromSnapshot) {
|
|
104
|
+
const provisioner = getProvisioner(sc);
|
|
105
|
+
const config = this.findStorageDescriptionMap(storageDescriptionMaps, provisioner);
|
|
106
|
+
// 解析第三方 AccessModes
|
|
107
|
+
if (config) {
|
|
108
|
+
return this.getThirdPartyStorageclassAccessModes(parse(config));
|
|
109
|
+
}
|
|
110
|
+
return getStorageclassAccessModes(provisioner, isFromSnapshot);
|
|
111
|
+
}
|
|
112
|
+
getStorageclassVolumeModes(sc, storageDescriptionMaps) {
|
|
113
|
+
const provisioner = getProvisioner(sc);
|
|
114
|
+
const config = this.findStorageDescriptionMap(storageDescriptionMaps, provisioner);
|
|
115
|
+
// 解析第三方 VolumeModes
|
|
116
|
+
if (config) {
|
|
117
|
+
return this.getThirdPartyStorageclassVolumeModes(parse(config));
|
|
118
|
+
}
|
|
119
|
+
return getStorageclassVolumeModes(provisioner);
|
|
120
|
+
}
|
|
121
|
+
isAccessModeDisabled(accessMode, storageClassOption) {
|
|
122
|
+
return storageClassOption
|
|
123
|
+
? !storageClassOption.accessModes.includes(accessMode)
|
|
124
|
+
: false;
|
|
125
|
+
}
|
|
126
|
+
isVolumeModeDisabled(volumeMode, storageClassOption) {
|
|
127
|
+
return storageClassOption
|
|
128
|
+
? !storageClassOption.volumeModes.includes(volumeMode)
|
|
129
|
+
: false;
|
|
130
|
+
}
|
|
131
|
+
// 获取首个匹配 provisioner 的 storageDescriptionConfig
|
|
132
|
+
findStorageDescriptionMap(configs, provisioner) {
|
|
133
|
+
const storageDescriptionMap = configs?.find(config => !!config[provisioner]);
|
|
134
|
+
return storageDescriptionMap?.[provisioner];
|
|
135
|
+
}
|
|
136
|
+
getThirdPartyStorageclassAccessModes(storageDescription) {
|
|
137
|
+
return this.filterByAllowedValues(storageDescription?.accessModes ?? [], AccessModes);
|
|
138
|
+
}
|
|
139
|
+
getThirdPartyStorageclassVolumeModes(storageDescription) {
|
|
140
|
+
return this.filterByAllowedValues(storageDescription?.volumeMode ?? [], VolumeModes);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 解析 ConfigMap 中的 AccessModes 和 VolumeModes, 要求 cm 中的配置不区分大小,满足 AccessModes 或 VolumeModes 中定义即可
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```
|
|
147
|
+
* const result = filterByAllowedValues(['ReadOnlyMany', 'Invalid'],['ReadOnlyMany', 'ReadWriteOnce', 'ReadWriteMany'])
|
|
148
|
+
* console.log(result) // ['ReadOnlyMany']
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
filterByAllowedValues(inputArray, allowedValues) {
|
|
152
|
+
return allowedValues.filter(allowedValue => inputArray.some(input => input.trim().toLowerCase() === allowedValue.trim().toLowerCase()));
|
|
153
|
+
}
|
|
154
|
+
static { this.ɵfac = function StorageCommonUtilService_Factory(t) { return new (t || StorageCommonUtilService)(i0.ɵɵinject(i1.K8sUtilService), i0.ɵɵinject(i1.K8sApiService)); }; }
|
|
155
|
+
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: StorageCommonUtilService, factory: StorageCommonUtilService.ɵfac, providedIn: 'root' }); }
|
|
156
|
+
}
|
|
157
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(StorageCommonUtilService, [{
|
|
158
|
+
type: Injectable,
|
|
159
|
+
args: [{
|
|
160
|
+
providedIn: 'root',
|
|
161
|
+
}]
|
|
162
|
+
}], () => [{ type: i1.K8sUtilService }, { type: i1.K8sApiService }], null); })();
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3RvcmFnZS9zcmMvbGliL3NlcnZpY2VzL2NvbW1vbi11dGlsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLG1CQUFtQixFQUNuQixjQUFjLEVBRWQsVUFBVSxFQUNWLGNBQWMsRUFDZCxhQUFhLEVBRWIsU0FBUyxFQUVULEtBQUssRUFDTCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFdBQVcsR0FDWixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQXNCLE1BQU0sa0JBQWtCLENBQUM7QUFFM0UsT0FBTyxFQUNMLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQixxQkFBcUIsR0FDdEIsTUFBTSxlQUFlLENBQUM7OztBQXVCdkIsTUFBTSxPQUFPLHdCQUF3QjtJQTBCbkMsWUFDbUIsT0FBdUIsRUFDdkIsTUFBcUI7UUFEckIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQTNCL0IsK0JBQTBCLEdBQUcsSUFBSSxVQUFVLENBQUM7WUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUNaLElBQUksQ0FBQyxNQUFNO2lCQUNSLHFCQUFxQixDQUFZO2dCQUNoQyxJQUFJLEVBQUUsY0FBYyxDQUFDLFVBQVU7Z0JBQy9CLGdDQUFnQztnQkFDaEMsU0FBUyxFQUFFLGFBQWE7Z0JBQ3hCLFdBQVcsRUFBRTtvQkFDWCxhQUFhLEVBQUUsNENBQTRDO2lCQUM1RDthQUNGLENBQUM7aUJBQ0QsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUNSLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUNqQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNQLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDdkMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQzFDLENBQ0YsRUFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzFDLFNBQVMsQ0FBQyxFQUFpQixDQUFDLENBQzdCO1lBQ0wsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDNUIsQ0FBQyxDQUFDO1FBTUQsSUFBSSxDQUFDLDhCQUE4QjtZQUNqQyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxZQUEwQjtRQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FDeEIsSUFBSSxDQUFDLE9BQU87YUFDVixhQUFhLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQztZQUN4QyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQTJCLElBQUksRUFBRSxDQUMvQyxDQUFDO1FBQ0YsSUFBSSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztZQUN2QyxXQUFXLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELDhCQUE4QixDQUM1QixZQUEwQixFQUMxQixPQUE0QjtRQUU1QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELHVCQUF1QixDQUNyQixFQUFnQixFQUNoQixzQkFBb0MsRUFDcEMsY0FBd0I7UUFFeEIsT0FBTztZQUNMLEdBQUcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDckIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSTtZQUN2QixTQUFTLEVBQUUscUJBQXFCLENBQUMsRUFBRSxDQUFDO1lBQ3BDLFdBQVcsRUFDVCxJQUFJLENBQUMsMEJBQTBCLENBQzdCLEVBQUUsRUFDRixzQkFBc0IsRUFDdEIsY0FBYyxDQUNmLElBQUksRUFBRTtZQUNULFFBQVEsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDO1lBQzFDLFdBQVcsRUFBRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFBRSxFQUFFLHNCQUFzQixDQUFDO1lBQ3hFLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztZQUMzQixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQUVELCtCQUErQixDQUFDLE9BQWU7UUFDN0MsT0FBTyxJQUFJLENBQUMsTUFBTTthQUNmLHFCQUFxQixDQUFhO1lBQ2pDLElBQUksRUFBRSxjQUFjLENBQUMsV0FBVztZQUNoQyxXQUFXLEVBQUU7Z0JBQ1gsYUFBYSxFQUFFLG1CQUFtQixDQUFDO29CQUNqQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsUUFBUTtvQkFDckQsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE9BQU87b0JBQ3JELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxVQUFVO2lCQUN4RCxDQUFDO2FBQ0g7U0FDRixDQUFDO2FBQ0QsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDeEIsVUFBVSxFQUFFLENBQ2IsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILDhCQUE4QixDQUM1QixFQUFzQixFQUN0QixzQkFBbUM7UUFFbkMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDM0Msc0JBQXNCLEVBQ3RCLFdBQVcsQ0FDWixDQUFDO1FBRUYsd0NBQXdDO1FBQ3hDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQXFCLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQztZQUM3RCxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDaEQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQixDQUNoQixFQUFzQixFQUN0QixzQkFBbUM7UUFFbkMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDM0Msc0JBQXNCLEVBQ3RCLFdBQVcsQ0FDWixDQUFDO1FBRUYsWUFBWTtRQUNaLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksR0FBRyxLQUFLLENBQXFCLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNwRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDdkMsQ0FBQyxJQUFJLENBQUMsRUFDTixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FDeEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNMLE9BQU8sTUFBTTtnQkFDWCxDQUFDLENBQUM7b0JBQ0UsVUFBVSxFQUFFLGNBQWM7b0JBQzFCLEtBQUssRUFBRSxlQUFlO2lCQUN2QixDQUFDLE1BQU0sQ0FBQztnQkFDWCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCwwQkFBMEIsQ0FDeEIsRUFBc0IsRUFDdEIsc0JBQW1DLEVBQ25DLGNBQXVCO1FBRXZCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQzNDLHNCQUFzQixFQUN0QixXQUFXLENBQ1osQ0FBQztRQUVGLG9CQUFvQjtRQUNwQixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUMsb0NBQW9DLENBQzlDLEtBQUssQ0FBcUIsTUFBTSxDQUFDLENBQ2xDLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELDBCQUEwQixDQUN4QixFQUFzQixFQUN0QixzQkFBbUM7UUFFbkMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDM0Msc0JBQXNCLEVBQ3RCLFdBQVcsQ0FDWixDQUFDO1FBRUYsb0JBQW9CO1FBQ3BCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQyxvQ0FBb0MsQ0FDOUMsS0FBSyxDQUFxQixNQUFNLENBQUMsQ0FDbEMsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxvQkFBb0IsQ0FDbEIsVUFBc0IsRUFDdEIsa0JBQXVDO1FBRXZDLE9BQU8sa0JBQWtCO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQ3RELENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDWixDQUFDO0lBRUQsb0JBQW9CLENBQ2xCLFVBQXNCLEVBQ3RCLGtCQUF1QztRQUV2QyxPQUFPLGtCQUFrQjtZQUN2QixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUN0RCxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1osQ0FBQztJQUVELGdEQUFnRDtJQUN4Qyx5QkFBeUIsQ0FDL0IsT0FBb0IsRUFDcEIsV0FBK0I7UUFFL0IsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUN6QyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQ2hDLENBQUM7UUFDRixPQUFPLHFCQUFxQixFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLG9DQUFvQyxDQUMxQyxrQkFBc0M7UUFFdEMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQy9CLGtCQUFrQixFQUFFLFdBQVcsSUFBSSxFQUFFLEVBQ3JDLFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUVPLG9DQUFvQyxDQUMxQyxrQkFBc0M7UUFFdEMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQy9CLGtCQUFrQixFQUFFLFVBQVUsSUFBSSxFQUFFLEVBQ3BDLFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0sscUJBQXFCLENBQzNCLFVBQWUsRUFDZixhQUFrQjtRQUVsQixPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FDekMsVUFBVSxDQUFDLElBQUksQ0FDYixLQUFLLENBQUMsRUFBRSxDQUNOLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQ25FLENBQ0YsQ0FBQztJQUNKLENBQUM7eUZBOVBVLHdCQUF3Qjt1RUFBeEIsd0JBQXdCLFdBQXhCLHdCQUF3QixtQkFGdkIsTUFBTTs7aUZBRVAsd0JBQXdCO2NBSHBDLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFjY2Vzc01vZGUsXG4gIFZvbHVtZU1vZGUsXG4gIG1hdGNoTGFiZWxzVG9TdHJpbmcsXG4gIEs4c1V0aWxTZXJ2aWNlLFxuICBNb2R1bGVJbmZvLFxuICBwdWJsaXNoUmVmLFxuICBSRVNPVVJDRV9UWVBFUyxcbiAgSzhzQXBpU2VydmljZSxcbiAgQ29uZmlnTWFwLFxuICBza2lwRXJyb3IsXG4gIFN0cmluZ01hcCxcbiAgcGFyc2UsXG4gIENhY2hlU3RvcmUsXG4gIFZvbHVtZU1vZGVzLFxuICBBY2Nlc3NNb2Rlcyxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNCb29sZWFuIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU3RvcmFnZWNsYXNzRmVhdHVyZSwgU3RvcmFnZVByb3Zpc2lvbmVyIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9ucyc7XG5pbXBvcnQgeyBDb21tb25TdG9yYWdlQ2xhc3MsIFN0b3JhZ2VDbGFzcyB9IGZyb20gJy4uL3R5cGVzL2s4cyc7XG5pbXBvcnQge1xuICBnZXRQcm92aXNpb25lcixcbiAgZ2V0UHJvdmlzaW9uZXJUeXBlLFxuICBnZXRTdG9yYWdlY2xhc3NBY2Nlc3NNb2RlcyxcbiAgZ2V0U3RvcmFnZWNsYXNzVm9sdW1lTW9kZXMsXG4gIGlzRGVmYXVsdFN0b3JhZ2VjbGFzcyxcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbCc7XG5cbmludGVyZmFjZSBTdG9yYWdlRGVzY3JpcHRpb24ge1xuICB0eXBlOiBWb2x1bWVNb2RlO1xuICBhY2Nlc3NNb2RlczogQWNjZXNzTW9kZVtdO1xuICB2b2x1bWVNb2RlOiBWb2x1bWVNb2RlW107XG4gIHNuYXBzaG90PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlU2VsZWN0T3B0aW9uIHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGlzRGVmYXVsdDogYm9vbGVhbjtcbiAgYWNjZXNzTW9kZXM6IEFjY2Vzc01vZGVbXTtcbiAgZmVhdHVyZXM6IFN0b3JhZ2VjbGFzc0ZlYXR1cmVbXTtcbiAgdm9sdW1lTW9kZXM6IFZvbHVtZU1vZGVbXTtcbiAgcHJvdmlzaW9uZXI6IFN0b3JhZ2VQcm92aXNpb25lcjtcbiAgc3RvcmFnZUNsYXNzOiBTdG9yYWdlQ2xhc3M7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlQ29tbW9uVXRpbFNlcnZpY2Uge1xuICByZWFkb25seSBzdG9yYWdlRGVzY3JpcHRpb25NYXBDYWNoZSA9IG5ldyBDYWNoZVN0b3JlKHtcbiAgICBmZXRjaGVyOiAoKSA9PlxuICAgICAgdGhpcy5rOHNBcGlcbiAgICAgICAgLmdldEdsb2JhbFJlc291cmNlTGlzdDxDb25maWdNYXA+KHtcbiAgICAgICAgICB0eXBlOiBSRVNPVVJDRV9UWVBFUy5DT05GSUdfTUFQLFxuICAgICAgICAgIC8vIOiOt+WPluesrOS4ieaWueWtmOWCqOiDveWKm+mFjee9ru+8jOWFtuS4rSBucyDlkowgbGFiZWwg6YO95Zu65a6aXG4gICAgICAgICAgbmFtZXNwYWNlOiAna3ViZS1wdWJsaWMnLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICBsYWJlbFNlbGVjdG9yOiAnZmVhdHVyZXMuYWxhdWRhLmlvL3R5cGU9U3RvcmFnZURlc2NyaXB0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAocmVzID0+XG4gICAgICAgICAgICBbLi4ucmVzLml0ZW1zXS5zb3J0KFxuICAgICAgICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICAgICAgICArbmV3IERhdGUoYS5tZXRhZGF0YS5jcmVhdGlvblRpbWVzdGFtcCkgLVxuICAgICAgICAgICAgICAgICtuZXcgRGF0ZShiLm1ldGFkYXRhLmNyZWF0aW9uVGltZXN0YW1wKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXAoaXRlbXMgPT4gaXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5kYXRhKSksXG4gICAgICAgICAgc2tpcEVycm9yKFtdIGFzIFN0cmluZ01hcFtdKSxcbiAgICAgICAgKSxcbiAgICBzaGFyZTogKCkgPT4gc2hhcmVSZXBsYXkoMSksXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzVXRpbDogSzhzVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGk6IEs4c0FwaVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuaXNTdG9yYWdlQ2xhc3NGZWF0dXJlU3VwcG9ydGVkID1cbiAgICAgIHRoaXMuaXNTdG9yYWdlQ2xhc3NGZWF0dXJlU3VwcG9ydGVkLmJpbmQodGhpcyk7XG4gIH1cblxuICBnZXRTdG9yYWdlQ2xhc3NGZWF0dXJlcyhzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcykge1xuICAgIGNvbnN0IGZlYXR1cmVzU2V0ID0gbmV3IFNldChcbiAgICAgICh0aGlzLms4c1V0aWxcbiAgICAgICAgLmdldEFubm90YXRpb24oc3RvcmFnZUNsYXNzLCAnZmVhdHVyZXMnKVxuICAgICAgICA/LnNwbGl0KCcsJykgYXMgU3RvcmFnZWNsYXNzRmVhdHVyZVtdKSB8fCBbXSxcbiAgICApO1xuICAgIGlmIChzdG9yYWdlQ2xhc3M/LmFsbG93Vm9sdW1lRXhwYW5zaW9uKSB7XG4gICAgICBmZWF0dXJlc1NldC5hZGQoU3RvcmFnZWNsYXNzRmVhdHVyZS5FWFBBTlNJT04pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWF0dXJlc1NldC5kZWxldGUoU3RvcmFnZWNsYXNzRmVhdHVyZS5FWFBBTlNJT04pO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmZlYXR1cmVzU2V0XTtcbiAgfVxuXG4gIGlzU3RvcmFnZUNsYXNzRmVhdHVyZVN1cHBvcnRlZChcbiAgICBzdG9yYWdlY2xhc3M6IFN0b3JhZ2VDbGFzcyxcbiAgICBmZWF0dXJlOiBTdG9yYWdlY2xhc3NGZWF0dXJlLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdG9yYWdlQ2xhc3NGZWF0dXJlcyhzdG9yYWdlY2xhc3MpLmluY2x1ZGVzKGZlYXR1cmUpO1xuICB9XG5cbiAgbWFwVG9TdG9yYWdlQ2xhc3NPcHRpb24oXG4gICAgc2M6IFN0b3JhZ2VDbGFzcyxcbiAgICBzdG9yYWdlRGVzY3JpcHRpb25NYXBzPzogU3RyaW5nTWFwW10sXG4gICAgaXNGcm9tU25hcHNob3Q/OiBib29sZWFuLFxuICApOiBTdG9yYWdlU2VsZWN0T3B0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBzYy5tZXRhZGF0YS5uYW1lLFxuICAgICAgdmFsdWU6IHNjLm1ldGFkYXRhLm5hbWUsXG4gICAgICBpc0RlZmF1bHQ6IGlzRGVmYXVsdFN0b3JhZ2VjbGFzcyhzYyksXG4gICAgICBhY2Nlc3NNb2RlczpcbiAgICAgICAgdGhpcy5nZXRTdG9yYWdlY2xhc3NBY2Nlc3NNb2RlcyhcbiAgICAgICAgICBzYyxcbiAgICAgICAgICBzdG9yYWdlRGVzY3JpcHRpb25NYXBzLFxuICAgICAgICAgIGlzRnJvbVNuYXBzaG90LFxuICAgICAgICApIHx8IFtdLFxuICAgICAgZmVhdHVyZXM6IHRoaXMuZ2V0U3RvcmFnZUNsYXNzRmVhdHVyZXMoc2MpLFxuICAgICAgdm9sdW1lTW9kZXM6IHRoaXMuZ2V0U3RvcmFnZWNsYXNzVm9sdW1lTW9kZXMoc2MsIHN0b3JhZ2VEZXNjcmlwdGlvbk1hcHMpLFxuICAgICAgcHJvdmlzaW9uZXI6IHNjLnByb3Zpc2lvbmVyLFxuICAgICAgc3RvcmFnZUNsYXNzOiBzYyxcbiAgICB9O1xuICB9XG5cbiAgaXNDbHVzdGVyU25hcHNob3RQbHVnaW5FbmFibGVkJChjbHVzdGVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5rOHNBcGlcbiAgICAgIC5nZXRHbG9iYWxSZXNvdXJjZUxpc3Q8TW9kdWxlSW5mbz4oe1xuICAgICAgICB0eXBlOiBSRVNPVVJDRV9UWVBFUy5NT0RVTEVfSU5GTyxcbiAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICBsYWJlbFNlbGVjdG9yOiBtYXRjaExhYmVsc1RvU3RyaW5nKHtcbiAgICAgICAgICAgIFt0aGlzLms4c1V0aWwubm9ybWFsaXplVHlwZSgnbW9kdWxlLXR5cGUnKV06ICdwbHVnaW4nLFxuICAgICAgICAgICAgW3RoaXMuazhzVXRpbC5ub3JtYWxpemVUeXBlKCdjbHVzdGVyLW5hbWUnKV06IGNsdXN0ZXIsXG4gICAgICAgICAgICBbdGhpcy5rOHNVdGlsLm5vcm1hbGl6ZVR5cGUoJ21vZHVsZS1uYW1lJyldOiAnc25hcHNob3QnLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAociA9PiAhIXIuaXRlbXM/LlswXSksXG4gICAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W56ys5LiJ5pa55b+r54Wn6IO95Yqb5pSv5oyB5oOF5Ya177yM6Iul6L+U5ZueIG51bGwg6KGo56S65pyq5Yy56YWN5Yiw5LiJ5pa55a2Y5YKoXG4gICAqL1xuICBnZXRUaGlyZFBhcnR5U25hcHNob3RTdXBwb3J0ZWQoXG4gICAgc2M6IENvbW1vblN0b3JhZ2VDbGFzcyxcbiAgICBzdG9yYWdlRGVzY3JpcHRpb25NYXBzOiBTdHJpbmdNYXBbXSxcbiAgKTogYm9vbGVhbiB8IG51bGwge1xuICAgIGNvbnN0IHByb3Zpc2lvbmVyID0gZ2V0UHJvdmlzaW9uZXIoc2MpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZmluZFN0b3JhZ2VEZXNjcmlwdGlvbk1hcChcbiAgICAgIHN0b3JhZ2VEZXNjcmlwdGlvbk1hcHMsXG4gICAgICBwcm92aXNpb25lcixcbiAgICApO1xuXG4gICAgLy8g5aaC5p6c5Yy56YWN5Yiw5LiJ5pa5IHByb3Zpc2lvbmVyIOacquWumuS5ieWSjOmdnuazlemDveaMiSBmYWxzZSDlpITnkIZcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHBhcnNlPFN0b3JhZ2VEZXNjcmlwdGlvbj4oY29uZmlnKT8uc25hcHNob3Q7XG4gICAgICByZXR1cm4gaXNCb29sZWFuKHNuYXBzaG90KSA/IHNuYXBzaG90IDogZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRQcm92aXNpb25lclR5cGUoXG4gICAgc2M6IENvbW1vblN0b3JhZ2VDbGFzcyxcbiAgICBzdG9yYWdlRGVzY3JpcHRpb25NYXBzOiBTdHJpbmdNYXBbXSxcbiAgKSB7XG4gICAgY29uc3QgcHJvdmlzaW9uZXIgPSBnZXRQcm92aXNpb25lcihzYyk7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5maW5kU3RvcmFnZURlc2NyaXB0aW9uTWFwKFxuICAgICAgc3RvcmFnZURlc2NyaXB0aW9uTWFwcyxcbiAgICAgIHByb3Zpc2lvbmVyLFxuICAgICk7XG5cbiAgICAvLyDop6PmnpDnrKzkuInmlrnlrZjlgqjnsbvlnotcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBjb25zdCB0eXBlID0gcGFyc2U8U3RvcmFnZURlc2NyaXB0aW9uPihjb25maWcpLnR5cGU7XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maWx0ZXJCeUFsbG93ZWRWYWx1ZXM8Vm9sdW1lTW9kZT4oXG4gICAgICAgIFt0eXBlXSxcbiAgICAgICAgWydGaWxlc3lzdGVtJywgJ0Jsb2NrJ10sXG4gICAgICApWzBdO1xuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIEZpbGVzeXN0ZW06ICdmaWxlX3N0b3JhZ2UnLFxuICAgICAgICAgICAgQmxvY2s6ICdibG9ja19zdG9yYWdlJyxcbiAgICAgICAgICB9W3Jlc3VsdF1cbiAgICAgICAgOiAndW5rbm93bic7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFByb3Zpc2lvbmVyVHlwZShwcm92aXNpb25lcik7XG4gIH1cblxuICBnZXRTdG9yYWdlY2xhc3NBY2Nlc3NNb2RlcyhcbiAgICBzYzogQ29tbW9uU3RvcmFnZUNsYXNzLFxuICAgIHN0b3JhZ2VEZXNjcmlwdGlvbk1hcHM6IFN0cmluZ01hcFtdLFxuICAgIGlzRnJvbVNuYXBzaG90OiBib29sZWFuLFxuICApIHtcbiAgICBjb25zdCBwcm92aXNpb25lciA9IGdldFByb3Zpc2lvbmVyKHNjKTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmZpbmRTdG9yYWdlRGVzY3JpcHRpb25NYXAoXG4gICAgICBzdG9yYWdlRGVzY3JpcHRpb25NYXBzLFxuICAgICAgcHJvdmlzaW9uZXIsXG4gICAgKTtcblxuICAgIC8vIOino+aekOesrOS4ieaWuSBBY2Nlc3NNb2Rlc1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRoaXJkUGFydHlTdG9yYWdlY2xhc3NBY2Nlc3NNb2RlcyhcbiAgICAgICAgcGFyc2U8U3RvcmFnZURlc2NyaXB0aW9uPihjb25maWcpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldFN0b3JhZ2VjbGFzc0FjY2Vzc01vZGVzKHByb3Zpc2lvbmVyLCBpc0Zyb21TbmFwc2hvdCk7XG4gIH1cblxuICBnZXRTdG9yYWdlY2xhc3NWb2x1bWVNb2RlcyhcbiAgICBzYzogQ29tbW9uU3RvcmFnZUNsYXNzLFxuICAgIHN0b3JhZ2VEZXNjcmlwdGlvbk1hcHM6IFN0cmluZ01hcFtdLFxuICApIHtcbiAgICBjb25zdCBwcm92aXNpb25lciA9IGdldFByb3Zpc2lvbmVyKHNjKTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmZpbmRTdG9yYWdlRGVzY3JpcHRpb25NYXAoXG4gICAgICBzdG9yYWdlRGVzY3JpcHRpb25NYXBzLFxuICAgICAgcHJvdmlzaW9uZXIsXG4gICAgKTtcblxuICAgIC8vIOino+aekOesrOS4ieaWuSBWb2x1bWVNb2Rlc1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRoaXJkUGFydHlTdG9yYWdlY2xhc3NWb2x1bWVNb2RlcyhcbiAgICAgICAgcGFyc2U8U3RvcmFnZURlc2NyaXB0aW9uPihjb25maWcpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldFN0b3JhZ2VjbGFzc1ZvbHVtZU1vZGVzKHByb3Zpc2lvbmVyKTtcbiAgfVxuXG4gIGlzQWNjZXNzTW9kZURpc2FibGVkKFxuICAgIGFjY2Vzc01vZGU6IEFjY2Vzc01vZGUsXG4gICAgc3RvcmFnZUNsYXNzT3B0aW9uOiBTdG9yYWdlU2VsZWN0T3B0aW9uLFxuICApIHtcbiAgICByZXR1cm4gc3RvcmFnZUNsYXNzT3B0aW9uXG4gICAgICA/ICFzdG9yYWdlQ2xhc3NPcHRpb24uYWNjZXNzTW9kZXMuaW5jbHVkZXMoYWNjZXNzTW9kZSlcbiAgICAgIDogZmFsc2U7XG4gIH1cblxuICBpc1ZvbHVtZU1vZGVEaXNhYmxlZChcbiAgICB2b2x1bWVNb2RlOiBWb2x1bWVNb2RlLFxuICAgIHN0b3JhZ2VDbGFzc09wdGlvbjogU3RvcmFnZVNlbGVjdE9wdGlvbixcbiAgKSB7XG4gICAgcmV0dXJuIHN0b3JhZ2VDbGFzc09wdGlvblxuICAgICAgPyAhc3RvcmFnZUNsYXNzT3B0aW9uLnZvbHVtZU1vZGVzLmluY2x1ZGVzKHZvbHVtZU1vZGUpXG4gICAgICA6IGZhbHNlO1xuICB9XG5cbiAgLy8g6I635Y+W6aaW5Liq5Yy56YWNIHByb3Zpc2lvbmVyIOeahCBzdG9yYWdlRGVzY3JpcHRpb25Db25maWdcbiAgcHJpdmF0ZSBmaW5kU3RvcmFnZURlc2NyaXB0aW9uTWFwKFxuICAgIGNvbmZpZ3M6IFN0cmluZ01hcFtdLFxuICAgIHByb3Zpc2lvbmVyOiBTdG9yYWdlUHJvdmlzaW9uZXIsXG4gICkge1xuICAgIGNvbnN0IHN0b3JhZ2VEZXNjcmlwdGlvbk1hcCA9IGNvbmZpZ3M/LmZpbmQoXG4gICAgICBjb25maWcgPT4gISFjb25maWdbcHJvdmlzaW9uZXJdLFxuICAgICk7XG4gICAgcmV0dXJuIHN0b3JhZ2VEZXNjcmlwdGlvbk1hcD8uW3Byb3Zpc2lvbmVyXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGhpcmRQYXJ0eVN0b3JhZ2VjbGFzc0FjY2Vzc01vZGVzKFxuICAgIHN0b3JhZ2VEZXNjcmlwdGlvbjogU3RvcmFnZURlc2NyaXB0aW9uLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJCeUFsbG93ZWRWYWx1ZXM8QWNjZXNzTW9kZT4oXG4gICAgICBzdG9yYWdlRGVzY3JpcHRpb24/LmFjY2Vzc01vZGVzID8/IFtdLFxuICAgICAgQWNjZXNzTW9kZXMsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGhpcmRQYXJ0eVN0b3JhZ2VjbGFzc1ZvbHVtZU1vZGVzKFxuICAgIHN0b3JhZ2VEZXNjcmlwdGlvbjogU3RvcmFnZURlc2NyaXB0aW9uLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJCeUFsbG93ZWRWYWx1ZXM8Vm9sdW1lTW9kZT4oXG4gICAgICBzdG9yYWdlRGVzY3JpcHRpb24/LnZvbHVtZU1vZGUgPz8gW10sXG4gICAgICBWb2x1bWVNb2RlcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOino+aekCBDb25maWdNYXAg5Lit55qEIEFjY2Vzc01vZGVzIOWSjCBWb2x1bWVNb2Rlcywg6KaB5rGCIGNtIOS4reeahOmFjee9ruS4jeWMuuWIhuWkp+Wwj++8jOa7oei2syBBY2Nlc3NNb2RlcyDmiJYgVm9sdW1lTW9kZXMg5Lit5a6a5LmJ5Y2z5Y+vXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBjb25zdCByZXN1bHQgPSBmaWx0ZXJCeUFsbG93ZWRWYWx1ZXMoWydSZWFkT25seU1hbnknLCAnSW52YWxpZCddLFsnUmVhZE9ubHlNYW55JywgJ1JlYWRXcml0ZU9uY2UnLCAnUmVhZFdyaXRlTWFueSddKVxuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpIC8vIFsnUmVhZE9ubHlNYW55J11cbiAgICogYGBgXG4gICAqL1xuICBwcml2YXRlIGZpbHRlckJ5QWxsb3dlZFZhbHVlczxUIGV4dGVuZHMgc3RyaW5nPihcbiAgICBpbnB1dEFycmF5OiBUW10sXG4gICAgYWxsb3dlZFZhbHVlczogVFtdLFxuICApIHtcbiAgICByZXR1cm4gYWxsb3dlZFZhbHVlcy5maWx0ZXIoYWxsb3dlZFZhbHVlID0+XG4gICAgICBpbnB1dEFycmF5LnNvbWUoXG4gICAgICAgIGlucHV0ID0+XG4gICAgICAgICAgaW5wdXQudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IGFsbG93ZWRWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxufVxuIl19
|