@alauda-fe/network 1.0.0-beta.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.
Files changed (46) hide show
  1. package/esm2022/alauda-fe-network.mjs +5 -0
  2. package/esm2022/index.mjs +19 -0
  3. package/esm2022/lib/components/certificate-status/component.mjs +37 -0
  4. package/esm2022/lib/components/fixed-ip/component.mjs +503 -0
  5. package/esm2022/lib/components/loadbalancer-spec-form/component.mjs +251 -0
  6. package/esm2022/lib/components/service-annotations-form/annotations.component.mjs +681 -0
  7. package/esm2022/lib/components/service-annotations-form-item/annotations.component.mjs +106 -0
  8. package/esm2022/lib/components/service-form/component.mjs +307 -0
  9. package/esm2022/lib/components/service-form/fieldset/component.mjs +407 -0
  10. package/esm2022/lib/directives/subnet-validator.directive.mjs +111 -0
  11. package/esm2022/lib/services/alb-api.service.mjs +48 -0
  12. package/esm2022/lib/services/certificate-api.service.mjs +111 -0
  13. package/esm2022/lib/services/network-util.service.mjs +116 -0
  14. package/esm2022/lib/types/alb-exports.mjs +14 -0
  15. package/esm2022/lib/types/k8s-exports.mjs +13 -0
  16. package/esm2022/lib/types/resource-definition.mjs +16 -0
  17. package/esm2022/lib/utils/alb-exports.mjs +108 -0
  18. package/esm2022/lib/utils/alb-internals.mjs +2 -0
  19. package/esm2022/lib/utils/cidr-exports.mjs +359 -0
  20. package/esm2022/lib/utils/cluster-exports.mjs +18 -0
  21. package/esm2022/lib/utils/service-exports.mjs +58 -0
  22. package/esm2022/lib/utils/service-internals.mjs +7 -0
  23. package/esm2022/lib/utils/subnet-exports.mjs +18 -0
  24. package/index.d.ts +18 -0
  25. package/lib/components/certificate-status/component.d.ts +17 -0
  26. package/lib/components/fixed-ip/component.d.ts +67 -0
  27. package/lib/components/loadbalancer-spec-form/component.d.ts +34 -0
  28. package/lib/components/service-annotations-form/annotations.component.d.ts +74 -0
  29. package/lib/components/service-annotations-form-item/annotations.component.d.ts +14 -0
  30. package/lib/components/service-form/component.d.ts +56 -0
  31. package/lib/components/service-form/fieldset/component.d.ts +46 -0
  32. package/lib/directives/subnet-validator.directive.d.ts +34 -0
  33. package/lib/services/alb-api.service.d.ts +16 -0
  34. package/lib/services/certificate-api.service.d.ts +38 -0
  35. package/lib/services/network-util.service.d.ts +21 -0
  36. package/lib/types/alb-exports.d.ts +29 -0
  37. package/lib/types/k8s-exports.d.ts +130 -0
  38. package/lib/types/resource-definition.d.ts +25 -0
  39. package/lib/utils/alb-exports.d.ts +16 -0
  40. package/lib/utils/alb-internals.d.ts +10 -0
  41. package/lib/utils/cidr-exports.d.ts +85 -0
  42. package/lib/utils/cluster-exports.d.ts +14 -0
  43. package/lib/utils/service-exports.d.ts +18 -0
  44. package/lib/utils/service-internals.d.ts +2 -0
  45. package/lib/utils/subnet-exports.d.ts +20 -0
  46. package/package.json +31 -0
@@ -0,0 +1,106 @@
1
+ import { FormModule } from '@alauda/ui';
2
+ import { FoldableBlockComponent, PurePipe, TranslateModule, } from '@alauda-fe/common';
3
+ import { NgIf, NgTemplateOutlet } from '@angular/common';
4
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
5
+ import { ReactiveFormsModule } from '@angular/forms';
6
+ import { BaseResourceFormComponent } from 'ng-resource-form-util';
7
+ import { ClusterType, isPublicCloud } from '../../utils/cluster-exports';
8
+ import { ServiceAnnotationsFormComponent } from '../service-annotations-form/annotations.component';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/forms";
11
+ import * as i2 from "@alauda/ui";
12
+ import * as i3 from "@alauda-fe/common";
13
+ function ServiceAnnotationsFormItemComponent_ng_container_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {
14
+ i0.ɵɵelementContainer(0);
15
+ } }
16
+ function ServiceAnnotationsFormItemComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {
17
+ i0.ɵɵelementContainerStart(0);
18
+ i0.ɵɵtemplate(1, ServiceAnnotationsFormItemComponent_ng_container_0_ng_container_1_Template, 1, 0, "ng-container", 3);
19
+ i0.ɵɵelementContainerEnd();
20
+ } if (rf & 2) {
21
+ i0.ɵɵnextContext();
22
+ const _r3 = i0.ɵɵreference(5);
23
+ i0.ɵɵadvance(1);
24
+ i0.ɵɵproperty("ngTemplateOutlet", _r3);
25
+ } }
26
+ function ServiceAnnotationsFormItemComponent_ng_template_2_ng_container_2_Template(rf, ctx) { if (rf & 1) {
27
+ i0.ɵɵelementContainer(0);
28
+ } }
29
+ function ServiceAnnotationsFormItemComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "acl-foldable-block", 4);
31
+ i0.ɵɵpipe(1, "translate");
32
+ i0.ɵɵtemplate(2, ServiceAnnotationsFormItemComponent_ng_template_2_ng_container_2_Template, 1, 0, "ng-container", 3);
33
+ i0.ɵɵelementEnd();
34
+ } if (rf & 2) {
35
+ const ctx_r2 = i0.ɵɵnextContext();
36
+ const _r3 = i0.ɵɵreference(5);
37
+ i0.ɵɵproperty("expandHint", i0.ɵɵpipeBind1(1, 2, ctx_r2.resourceName));
38
+ i0.ɵɵadvance(2);
39
+ i0.ɵɵproperty("ngTemplateOutlet", _r3);
40
+ } }
41
+ function ServiceAnnotationsFormItemComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
42
+ i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 5);
43
+ i0.ɵɵtext(2);
44
+ i0.ɵɵpipe(3, "translate");
45
+ i0.ɵɵelementEnd();
46
+ i0.ɵɵelementStart(4, "acl-service-annotations-form", 6);
47
+ i0.ɵɵprojection(5);
48
+ i0.ɵɵelementEnd()();
49
+ } if (rf & 2) {
50
+ const ctx_r4 = i0.ɵɵnextContext();
51
+ i0.ɵɵadvance(2);
52
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 5, ctx_r4.resourceName));
53
+ i0.ɵɵadvance(2);
54
+ i0.ɵɵproperty("formControl", ctx_r4.form)("isUpdate", ctx_r4.isUpdate)("clusterType", ctx_r4.clusterType)("resourceName", ctx_r4.resourceName);
55
+ } }
56
+ const _c0 = ["*"];
57
+ export class ServiceAnnotationsFormItemComponent extends BaseResourceFormComponent {
58
+ constructor() {
59
+ super(...arguments);
60
+ this.isPublicCloud = isPublicCloud;
61
+ }
62
+ get resourceName() {
63
+ return this.inService ? 'annotation' : 'service_annotations';
64
+ }
65
+ createForm() {
66
+ return this.fb.control({});
67
+ }
68
+ static { this.ɵfac = /*@__PURE__*/ function () { let ɵServiceAnnotationsFormItemComponent_BaseFactory; return function ServiceAnnotationsFormItemComponent_Factory(t) { return (ɵServiceAnnotationsFormItemComponent_BaseFactory || (ɵServiceAnnotationsFormItemComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ServiceAnnotationsFormItemComponent)))(t || ServiceAnnotationsFormItemComponent); }; }(); }
69
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ServiceAnnotationsFormItemComponent, selectors: [["acl-service-annotations-form-item"]], inputs: { isUpdate: "isUpdate", clusterType: "clusterType", inService: "inService" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], ngContentSelectors: _c0, decls: 6, vars: 5, consts: [[4, "ngIf", "ngIfElse"], ["nonPublicCloud", ""], ["innerFormItem", ""], [4, "ngTemplateOutlet"], [3, "expandHint"], ["auiFormItemLabel", ""], ["auiFormItemControl", "", 3, "formControl", "isUpdate", "clusterType", "resourceName"]], template: function ServiceAnnotationsFormItemComponent_Template(rf, ctx) { if (rf & 1) {
70
+ i0.ɵɵprojectionDef();
71
+ i0.ɵɵtemplate(0, ServiceAnnotationsFormItemComponent_ng_container_0_Template, 2, 1, "ng-container", 0);
72
+ i0.ɵɵpipe(1, "pure");
73
+ i0.ɵɵtemplate(2, ServiceAnnotationsFormItemComponent_ng_template_2_Template, 3, 4, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
74
+ i0.ɵɵtemplate(4, ServiceAnnotationsFormItemComponent_ng_template_4_Template, 6, 7, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
75
+ } if (rf & 2) {
76
+ const _r1 = i0.ɵɵreference(3);
77
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(1, 2, ctx.clusterType, ctx.isPublicCloud))("ngIfElse", _r1);
78
+ } }, dependencies: [ReactiveFormsModule, i1.NgControlStatus, i1.FormControlDirective, NgIf,
79
+ NgTemplateOutlet,
80
+ PurePipe,
81
+ FormModule, i2.FormItemComponent, i2.FormItemLabelDirective, i2.FormItemControlDirective, FoldableBlockComponent,
82
+ ServiceAnnotationsFormComponent,
83
+ TranslateModule, i3.TranslatePipe], styles: ["acl-foldable-block[_ngcontent-%COMP%] .foldable{margin-bottom:20px}acl-foldable-block[_ngcontent-%COMP%] .aui-form-item{margin-bottom:0}"], changeDetection: 0 }); }
84
+ }
85
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ServiceAnnotationsFormItemComponent, [{
86
+ type: Component,
87
+ args: [{ selector: 'acl-service-annotations-form-item', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
88
+ ReactiveFormsModule,
89
+ NgIf,
90
+ NgTemplateOutlet,
91
+ PurePipe,
92
+ FormModule,
93
+ FoldableBlockComponent,
94
+ ServiceAnnotationsFormComponent,
95
+ TranslateModule,
96
+ ], template: "<ng-container *ngIf=\"clusterType | pure: isPublicCloud; else nonPublicCloud\">\n <ng-container *ngTemplateOutlet=\"innerFormItem\"></ng-container>\n</ng-container>\n\n<ng-template #nonPublicCloud>\n <acl-foldable-block [expandHint]=\"resourceName | translate\">\n <ng-container *ngTemplateOutlet=\"innerFormItem\"></ng-container>\n </acl-foldable-block>\n</ng-template>\n\n<ng-template #innerFormItem>\n <aui-form-item>\n <label auiFormItemLabel>{{ resourceName | translate }}</label>\n <acl-service-annotations-form\n auiFormItemControl\n [formControl]=\"form\"\n [isUpdate]=\"isUpdate\"\n [clusterType]=\"clusterType\"\n [resourceName]=\"resourceName\"\n >\n <ng-content></ng-content>\n </acl-service-annotations-form>\n </aui-form-item>\n</ng-template>\n", styles: ["acl-foldable-block ::ng-deep .foldable{margin-bottom:20px}acl-foldable-block ::ng-deep .aui-form-item{margin-bottom:0}\n"] }]
97
+ }], null, { isUpdate: [{
98
+ type: Input,
99
+ args: [{ required: true }]
100
+ }], clusterType: [{
101
+ type: Input,
102
+ args: [{ required: true }]
103
+ }], inService: [{
104
+ type: Input
105
+ }] }); })();
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0taXRlbS9hbm5vdGF0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9jb21wb25lbnRzL3NlcnZpY2UtYW5ub3RhdGlvbnMtZm9ybS1pdGVtL2Fubm90YXRpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixRQUFRLEVBRVIsZUFBZSxHQUNoQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDOzs7Ozs7SUNabEcsd0JBQStEOzs7SUFEakUsNkJBQTZFO0lBQzNFLHFIQUErRDtJQUNqRSwwQkFBZTs7OztJQURFLGVBQStCO0lBQS9CLHNDQUErQjs7O0lBSzVDLHdCQUErRDs7O0lBRGpFLDZDQUE0RDs7SUFDMUQsb0hBQStEO0lBQ2pFLGlCQUFxQjs7OztJQUZELHNFQUF1QztJQUMxQyxlQUErQjtJQUEvQixzQ0FBK0I7OztJQUtoRCxxQ0FBZSxlQUFBO0lBQ1csWUFBOEI7O0lBQUEsaUJBQVE7SUFDOUQsdURBTUM7SUFDQyxrQkFBeUI7SUFDM0IsaUJBQStCLEVBQUE7OztJQVRQLGVBQThCO0lBQTlCLCtEQUE4QjtJQUdwRCxlQUFvQjtJQUFwQix5Q0FBb0IsNkJBQUEsbUNBQUEscUNBQUE7OztBRGlCMUIsTUFBTSxPQUFPLG1DQUFvQyxTQUFRLHlCQUFvQztJQWpCN0Y7O1FBK0JFLGtCQUFhLEdBQUcsYUFBYSxDQUFDO0tBSy9CO0lBVEMsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO0lBQy9ELENBQUM7SUFJUSxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztxVEFsQlUsbUNBQW1DLFNBQW5DLG1DQUFtQztvRUFBbkMsbUNBQW1DOztZQ2hDaEQsc0dBRWU7O1lBRWYscUlBSWM7WUFFZCxxSUFhYzs7O1lBdkJDLCtFQUF5QyxpQkFBQTs0QkRzQnBELG1CQUFtQiwrQ0FDbkIsSUFBSTtZQUNKLGdCQUFnQjtZQUNoQixRQUFRO1lBQ1IsVUFBVSxnRkFDVixzQkFBc0I7WUFDdEIsK0JBQStCO1lBQy9CLGVBQWU7O3VGQUdOLG1DQUFtQztjQWpCL0MsU0FBUzsyQkFDRSxtQ0FBbUMsbUJBRzVCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO29CQUNQLG1CQUFtQjtvQkFDbkIsSUFBSTtvQkFDSixnQkFBZ0I7b0JBQ2hCLFFBQVE7b0JBQ1IsVUFBVTtvQkFDVixzQkFBc0I7b0JBQ3RCLCtCQUErQjtvQkFDL0IsZUFBZTtpQkFDaEI7Z0JBSUQsUUFBUTtrQkFEUCxLQUFLO21CQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUl6QixXQUFXO2tCQURWLEtBQUs7bUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBSXpCLFNBQVM7a0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Nb2R1bGUgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEZvbGRhYmxlQmxvY2tDb21wb25lbnQsXG4gIFB1cmVQaXBlLFxuICBTdHJpbmdNYXAsXG4gIFRyYW5zbGF0ZU1vZHVsZSxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJhc2VSZXNvdXJjZUZvcm1Db21wb25lbnQgfSBmcm9tICduZy1yZXNvdXJjZS1mb3JtLXV0aWwnO1xuXG5pbXBvcnQgeyBDbHVzdGVyVHlwZSwgaXNQdWJsaWNDbG91ZCB9IGZyb20gJy4uLy4uL3V0aWxzL2NsdXN0ZXItZXhwb3J0cyc7XG5pbXBvcnQgeyBTZXJ2aWNlQW5ub3RhdGlvbnNGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VydmljZS1hbm5vdGF0aW9ucy1mb3JtL2Fubm90YXRpb25zLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0taXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnYW5ub3RhdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnYW5ub3RhdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBQdXJlUGlwZSxcbiAgICBGb3JtTW9kdWxlLFxuICAgIEZvbGRhYmxlQmxvY2tDb21wb25lbnQsXG4gICAgU2VydmljZUFubm90YXRpb25zRm9ybUNvbXBvbmVudCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNlcnZpY2VBbm5vdGF0aW9uc0Zvcm1JdGVtQ29tcG9uZW50IGV4dGVuZHMgQmFzZVJlc291cmNlRm9ybUNvbXBvbmVudDxTdHJpbmdNYXA+IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgaXNVcGRhdGU6IGJvb2xlYW47XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgY2x1c3RlclR5cGU6IENsdXN0ZXJUeXBlO1xuXG4gIEBJbnB1dCgpXG4gIGluU2VydmljZTogYm9vbGVhbjtcblxuICBnZXQgcmVzb3VyY2VOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmluU2VydmljZSA/ICdhbm5vdGF0aW9uJyA6ICdzZXJ2aWNlX2Fubm90YXRpb25zJztcbiAgfVxuXG4gIGlzUHVibGljQ2xvdWQgPSBpc1B1YmxpY0Nsb3VkO1xuXG4gIG92ZXJyaWRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZmIuY29udHJvbCh7fSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjbHVzdGVyVHlwZSB8IHB1cmU6IGlzUHVibGljQ2xvdWQ7IGVsc2Ugbm9uUHVibGljQ2xvdWRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlubmVyRm9ybUl0ZW1cIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI25vblB1YmxpY0Nsb3VkPlxuICA8YWNsLWZvbGRhYmxlLWJsb2NrIFtleHBhbmRIaW50XT1cInJlc291cmNlTmFtZSB8IHRyYW5zbGF0ZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbm5lckZvcm1JdGVtXCI+PC9uZy1jb250YWluZXI+XG4gIDwvYWNsLWZvbGRhYmxlLWJsb2NrPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbm5lckZvcm1JdGVtPlxuICA8YXVpLWZvcm0taXRlbT5cbiAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyByZXNvdXJjZU5hbWUgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgIDxhY2wtc2VydmljZS1hbm5vdGF0aW9ucy1mb3JtXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtXCJcbiAgICAgIFtpc1VwZGF0ZV09XCJpc1VwZGF0ZVwiXG4gICAgICBbY2x1c3RlclR5cGVdPVwiY2x1c3RlclR5cGVcIlxuICAgICAgW3Jlc291cmNlTmFtZV09XCJyZXNvdXJjZU5hbWVcIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2FjbC1zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0+XG4gIDwvYXVpLWZvcm0taXRlbT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -0,0 +1,307 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { FormModule, IconModule, InputModule, RadioModule, SwitchModule, TooltipModule, } from '@alauda/ui';
3
+ import { DISPLAY_NAME, SERVICE_TYPES, FeatureGateService, K8sUtilService, ObservableInput, publishRef, TranslateModule, ReadonlyFieldDirective, ErrorsMapperModule, DisabledDirective, K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY, DOMAIN_PATTERN, ServiceTypeMeta, } from '@alauda-fe/common';
4
+ import { AsyncPipe, NgFor, NgIf } from '@angular/common';
5
+ import { ChangeDetectionStrategy, Component, Injector, Input, } from '@angular/core';
6
+ import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
7
+ import { BaseResourceFormGroupComponent } from 'ng-resource-form-util';
8
+ import { combineLatest, map, Observable, startWith, switchMap, takeUntil, } from 'rxjs';
9
+ import { ServicePortsFieldsetComponent } from './fieldset/component';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@alauda-fe/common";
12
+ import * as i2 from "@alauda/ui";
13
+ import * as i3 from "@angular/forms";
14
+ function K8sServiceFormComponent_aui_radio_button_20_Template(rf, ctx) { if (rf & 1) {
15
+ i0.ɵɵelementStart(0, "aui-radio-button", 21);
16
+ i0.ɵɵtext(1);
17
+ i0.ɵɵelementEnd();
18
+ } if (rf & 2) {
19
+ const option_r2 = ctx.$implicit;
20
+ i0.ɵɵproperty("value", option_r2);
21
+ i0.ɵɵadvance(1);
22
+ i0.ɵɵtextInterpolate1(" ", option_r2, " ");
23
+ } }
24
+ function K8sServiceFormComponent_div_22_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "div", 22);
26
+ i0.ɵɵtext(1);
27
+ i0.ɵɵpipe(2, "translate");
28
+ i0.ɵɵelementEnd();
29
+ } if (rf & 2) {
30
+ i0.ɵɵadvance(1);
31
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "service_external_name_hint"), " ");
32
+ } }
33
+ const _c0 = function () { return ["metadata", "name"]; };
34
+ const _c1 = function (a0) { return { pattern: a0 }; };
35
+ const _c2 = function () { return ["spec", "type"]; };
36
+ const _c3 = function () { return ["spec", "externalName"]; };
37
+ const _c4 = ["*"];
38
+ const NON_LB_SERVICE_TYPES = SERVICE_TYPES.filter(op => op !== 'LoadBalancer');
39
+ // K8s base service form
40
+ export class K8sServiceFormComponent extends BaseResourceFormGroupComponent {
41
+ constructor(injector, k8sUtil, featureGate) {
42
+ super(injector);
43
+ this.k8sUtil = k8sUtil;
44
+ this.featureGate = featureGate;
45
+ this.isUpdate = false;
46
+ this.targetComponent = 'workload';
47
+ this.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY = K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY;
48
+ this.DOMAIN_PATTERN = DOMAIN_PATTERN;
49
+ this.displayNameKey = this.k8sUtil.normalizeType(DISPLAY_NAME);
50
+ this.isLbEnabled$ = this.cluster$.pipe(switchMap(cluster => this.featureGate.isEnabled('loadbalancer-service', cluster)), startWith(null), publishRef());
51
+ this.types$ = combineLatest([
52
+ this.isUpdate$,
53
+ this.isLbEnabled$,
54
+ this.resource$,
55
+ ]).pipe(map(([isUpdate, isLbEnabled, resource]) => {
56
+ return isLbEnabled ||
57
+ (isUpdate && resource?.spec?.type === 'LoadBalancer')
58
+ ? SERVICE_TYPES
59
+ : NON_LB_SERVICE_TYPES;
60
+ }), publishRef());
61
+ }
62
+ ngAfterViewInit() {
63
+ super.ngAfterViewInit();
64
+ const typeCtrl = this.form.get('spec.type');
65
+ typeCtrl.valueChanges
66
+ .pipe(takeUntil(this.destroy$), startWith(typeCtrl.value))
67
+ .subscribe(type => {
68
+ const virtualIpCtrl = this.form.get('virtualIp');
69
+ if (this.isUpdate) {
70
+ virtualIpCtrl.disable();
71
+ return;
72
+ }
73
+ if (['NodePort', 'LoadBalancer'].includes(type)) {
74
+ virtualIpCtrl.setValue(true);
75
+ virtualIpCtrl.disable();
76
+ }
77
+ else {
78
+ virtualIpCtrl.enable();
79
+ }
80
+ if (type !== 'ExternalName') {
81
+ this.onVirtualIpChange(virtualIpCtrl.value);
82
+ }
83
+ });
84
+ }
85
+ getDefaultFormModel() {
86
+ return {
87
+ kind: 'Service',
88
+ virtualIp: true,
89
+ sessionPersistence: false,
90
+ spec: {
91
+ type: 'ClusterIP',
92
+ ports: [],
93
+ externalName: '',
94
+ },
95
+ };
96
+ }
97
+ createForm() {
98
+ return this.fb.group({
99
+ virtualIp: this.fb.control(true),
100
+ sessionPersistence: false,
101
+ metadata: this.fb.group({
102
+ name: this.fb.control('', [
103
+ Validators.required,
104
+ Validators.maxLength(32),
105
+ Validators.pattern(K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.pattern),
106
+ ]),
107
+ labels: this.fb.control({}),
108
+ annotations: this.fb.group({
109
+ [this.displayNameKey]: '',
110
+ }),
111
+ }),
112
+ spec: this.fb.group({
113
+ type: 'ClusterIP',
114
+ ports: null,
115
+ externalName: '',
116
+ }),
117
+ });
118
+ }
119
+ adaptFormModel({ virtualIp, sessionPersistence, ...resource }) {
120
+ const service = { ...ServiceTypeMeta, ...resource };
121
+ // `ExternalName` type just need externalName
122
+ if (resource.spec.type === 'ExternalName') {
123
+ service.spec = {
124
+ type: 'ExternalName',
125
+ externalName: resource.spec.externalName,
126
+ };
127
+ return service;
128
+ }
129
+ // It must be non Headless if `virtualIp` is enabled
130
+ if (virtualIp) {
131
+ if (service.spec.clusterIP === 'None') {
132
+ delete service.spec.clusterIP;
133
+ }
134
+ }
135
+ // virtualIp 被禁用后为 undefined, 此时不做处理
136
+ else if (virtualIp === false) {
137
+ // Headless
138
+ service.spec.clusterIP = 'None';
139
+ }
140
+ service.spec.sessionAffinity = sessionPersistence ? 'ClientIP' : 'None';
141
+ return service;
142
+ }
143
+ adaptResourceModel(resource) {
144
+ return {
145
+ ...resource,
146
+ virtualIp: resource?.spec?.clusterIP !== 'None',
147
+ sessionPersistence: resource?.spec?.sessionAffinity === 'ClientIP',
148
+ };
149
+ }
150
+ onVirtualIpChange(virtualIp) {
151
+ if (!virtualIp) {
152
+ return;
153
+ }
154
+ const portsCtrl = this.form.get('spec.ports');
155
+ if (!portsCtrl.value?.length) {
156
+ portsCtrl.patchValue([{}]);
157
+ }
158
+ }
159
+ static { this.ɵfac = function K8sServiceFormComponent_Factory(t) { return new (t || K8sServiceFormComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.K8sUtilService), i0.ɵɵdirectiveInject(i1.FeatureGateService)); }; }
160
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: K8sServiceFormComponent, selectors: [["acl-k8s-service-form"]], inputs: { cluster: "cluster", isUpdate: "isUpdate", containerPortSuggestions: "containerPortSuggestions", targetComponent: "targetComponent" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], ngContentSelectors: _c4, decls: 51, vars: 69, consts: [["auiForm", "", 3, "formGroup"], ["formGroupName", "metadata"], ["width", "large"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", "required", "", "name", "name", "formControlName", "name", 3, "aclReadonlyField", "placeholder"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["width", "large", "formGroupName", "annotations"], ["auiFormItemControl", "", "aui-input", "", 3, "formControlName"], ["formGroupName", "spec"], ["formControlName", "type"], [3, "value", 4, "ngFor", "ngForOf"], ["auiFormItemHint", "", 4, "ngIf"], ["formGroupName", "spec", "width", "large", 1, "last-form-item-no-margin", 3, "hidden"], ["type", "text", "aui-input", "", "auiFormItemControl", "", "formControlName", "externalName", 3, "aclDisabled", "required", "pattern", "placeholder"], [3, "hidden"], ["formControlName", "virtualIp", 3, "valueChange"], ["auiFormItemAddon", ""], ["icon", "question_circle", 1, "icon--help", 3, "auiTooltip", "auiTooltipPosition"], ["auiFormItemControl", "", "name", "ports", "formControlName", "ports", 1, "tw-w-full", 3, "required", "aclDisabled", "serviceType", "containerPortSuggestions", "targetComponent"], [1, "last-form-item-no-margin"], ["formControlName", "sessionPersistence"], [3, "value"], ["auiFormItemHint", ""]], template: function K8sServiceFormComponent_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵprojectionDef();
162
+ i0.ɵɵelementStart(0, "form", 0);
163
+ i0.ɵɵelementContainerStart(1, 1);
164
+ i0.ɵɵelementStart(2, "aui-form-item", 2)(3, "label", 3);
165
+ i0.ɵɵtext(4);
166
+ i0.ɵɵpipe(5, "translate");
167
+ i0.ɵɵelementEnd();
168
+ i0.ɵɵelement(6, "input", 4);
169
+ i0.ɵɵpipe(7, "translate");
170
+ i0.ɵɵelement(8, "acl-errors-mapper", 5);
171
+ i0.ɵɵpipe(9, "translate");
172
+ i0.ɵɵelementEnd();
173
+ i0.ɵɵelementStart(10, "aui-form-item", 6)(11, "label", 3);
174
+ i0.ɵɵtext(12);
175
+ i0.ɵɵpipe(13, "translate");
176
+ i0.ɵɵelementEnd();
177
+ i0.ɵɵelement(14, "input", 7);
178
+ i0.ɵɵelementEnd();
179
+ i0.ɵɵelementContainerEnd();
180
+ i0.ɵɵelementStart(15, "aui-form-item", 8)(16, "label", 3);
181
+ i0.ɵɵtext(17);
182
+ i0.ɵɵpipe(18, "translate");
183
+ i0.ɵɵelementEnd();
184
+ i0.ɵɵelementStart(19, "aui-radio-group", 9);
185
+ i0.ɵɵtemplate(20, K8sServiceFormComponent_aui_radio_button_20_Template, 2, 2, "aui-radio-button", 10);
186
+ i0.ɵɵpipe(21, "async");
187
+ i0.ɵɵelementEnd();
188
+ i0.ɵɵtemplate(22, K8sServiceFormComponent_div_22_Template, 3, 3, "div", 11);
189
+ i0.ɵɵelementEnd();
190
+ i0.ɵɵelementStart(23, "aui-form-item", 12)(24, "label", 3);
191
+ i0.ɵɵtext(25);
192
+ i0.ɵɵpipe(26, "translate");
193
+ i0.ɵɵelementEnd();
194
+ i0.ɵɵelement(27, "input", 13);
195
+ i0.ɵɵpipe(28, "translate");
196
+ i0.ɵɵelement(29, "acl-errors-mapper", 5);
197
+ i0.ɵɵpipe(30, "translate");
198
+ i0.ɵɵelementEnd();
199
+ i0.ɵɵelementStart(31, "div", 14)(32, "aui-form-item")(33, "label", 3);
200
+ i0.ɵɵtext(34);
201
+ i0.ɵɵpipe(35, "translate");
202
+ i0.ɵɵelementEnd();
203
+ i0.ɵɵelementStart(36, "aui-switch", 15);
204
+ i0.ɵɵlistener("valueChange", function K8sServiceFormComponent_Template_aui_switch_valueChange_36_listener($event) { return ctx.onVirtualIpChange($event); });
205
+ i0.ɵɵelementEnd();
206
+ i0.ɵɵelementStart(37, "div", 16);
207
+ i0.ɵɵelement(38, "aui-icon", 17);
208
+ i0.ɵɵpipe(39, "translate");
209
+ i0.ɵɵelementEnd()();
210
+ i0.ɵɵprojection(40);
211
+ i0.ɵɵelementStart(41, "aui-form-item", 8)(42, "label", 3);
212
+ i0.ɵɵtext(43);
213
+ i0.ɵɵpipe(44, "translate");
214
+ i0.ɵɵelementEnd();
215
+ i0.ɵɵelement(45, "acl-service-ports-fieldset", 18);
216
+ i0.ɵɵelementEnd();
217
+ i0.ɵɵelementStart(46, "aui-form-item", 19)(47, "label", 3);
218
+ i0.ɵɵtext(48);
219
+ i0.ɵɵpipe(49, "translate");
220
+ i0.ɵɵelementEnd();
221
+ i0.ɵɵelement(50, "aui-switch", 20);
222
+ i0.ɵɵelementEnd()()();
223
+ } if (rf & 2) {
224
+ i0.ɵɵproperty("formGroup", ctx.form);
225
+ i0.ɵɵadvance(4);
226
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 30, "name"));
227
+ i0.ɵɵadvance(2);
228
+ i0.ɵɵproperty("aclReadonlyField", ctx.isUpdate)("placeholder", i0.ɵɵpipeBind1(7, 32, ctx.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip));
229
+ i0.ɵɵadvance(2);
230
+ i0.ɵɵproperty("errors", ctx.form.get(i0.ɵɵpureFunction0(56, _c0)).errors)("errorsMapper", i0.ɵɵpureFunction1(57, _c1, i0.ɵɵpipeBind1(9, 34, ctx.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip)));
231
+ i0.ɵɵadvance(4);
232
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(13, 36, "display_name"));
233
+ i0.ɵɵadvance(2);
234
+ i0.ɵɵproperty("formControlName", ctx.displayNameKey);
235
+ i0.ɵɵadvance(3);
236
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(18, 38, "type"));
237
+ i0.ɵɵadvance(3);
238
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(21, 40, ctx.types$));
239
+ i0.ɵɵadvance(2);
240
+ i0.ɵɵproperty("ngIf", ctx.form.get(i0.ɵɵpureFunction0(59, _c2)).value === "ExternalName");
241
+ i0.ɵɵadvance(1);
242
+ i0.ɵɵproperty("hidden", ctx.form.get(i0.ɵɵpureFunction0(60, _c2)).value !== "ExternalName");
243
+ i0.ɵɵadvance(2);
244
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 42, "service_external_name_mapping_domain"), " ");
245
+ i0.ɵɵadvance(2);
246
+ i0.ɵɵproperty("aclDisabled", ctx.form.get(i0.ɵɵpureFunction0(61, _c2)).value !== "ExternalName")("required", ctx.form.get(i0.ɵɵpureFunction0(62, _c2)).value === "ExternalName")("pattern", ctx.DOMAIN_PATTERN.pattern)("placeholder", i0.ɵɵpipeBind1(28, 44, "service_external_name_domain_placeholder"));
247
+ i0.ɵɵadvance(2);
248
+ i0.ɵɵproperty("errors", ctx.form.get(i0.ɵɵpureFunction0(63, _c3)).errors)("errorsMapper", i0.ɵɵpureFunction1(64, _c1, i0.ɵɵpipeBind1(30, 46, ctx.DOMAIN_PATTERN.tip)));
249
+ i0.ɵɵadvance(2);
250
+ i0.ɵɵproperty("hidden", ctx.form.get(i0.ɵɵpureFunction0(66, _c2)).value === "ExternalName");
251
+ i0.ɵɵadvance(3);
252
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(35, 48, "virtual_ip"));
253
+ i0.ɵɵadvance(4);
254
+ i0.ɵɵproperty("auiTooltip", i0.ɵɵpipeBind1(39, 50, "virtual_ip_hint"))("auiTooltipPosition", "top center");
255
+ i0.ɵɵadvance(5);
256
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(44, 52, "ports"));
257
+ i0.ɵɵadvance(2);
258
+ i0.ɵɵproperty("required", !!ctx.form.get("virtualIp").value)("aclDisabled", ctx.form.get(i0.ɵɵpureFunction0(67, _c2)).value === "ExternalName")("serviceType", ctx.form.get(i0.ɵɵpureFunction0(68, _c2)).value)("containerPortSuggestions", ctx.containerPortSuggestions)("targetComponent", ctx.targetComponent);
259
+ i0.ɵɵadvance(3);
260
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(49, 54, "session_affinity"));
261
+ } }, dependencies: [AsyncPipe,
262
+ FormModule, i2.FormDirective, i2.FormItemComponent, i2.FormItemAddonDirective, i2.FormItemErrorDirective, i2.FormItemHintDirective, i2.FormItemLabelDirective, i2.FormItemControlDirective, InputModule, i2.InputComponent, NgIf,
263
+ NgFor,
264
+ FormsModule, i3.ɵNgNoValidate, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.RequiredValidator, i3.PatternValidator, ReactiveFormsModule, i3.FormGroupDirective, i3.FormControlName, i3.FormGroupName, SwitchModule, i2.SwitchComponent, IconModule, i2.IconComponent, TranslateModule, i1.TranslatePipe, RadioModule, i2.RadioGroupComponent, i2.RadioButtonComponent, TooltipModule, i2.TooltipDirective, ErrorsMapperModule, i1.ErrorsMapperComponent, ServicePortsFieldsetComponent,
265
+ ReadonlyFieldDirective,
266
+ DisabledDirective], encapsulation: 2, changeDetection: 0 }); }
267
+ }
268
+ __decorate([
269
+ ObservableInput(),
270
+ __metadata("design:type", Observable)
271
+ ], K8sServiceFormComponent.prototype, "cluster$", void 0);
272
+ __decorate([
273
+ ObservableInput(),
274
+ __metadata("design:type", Observable)
275
+ ], K8sServiceFormComponent.prototype, "isUpdate$", void 0);
276
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(K8sServiceFormComponent, [{
277
+ type: Component,
278
+ args: [{ standalone: true, selector: 'acl-k8s-service-form', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
279
+ AsyncPipe,
280
+ FormModule,
281
+ InputModule,
282
+ NgIf,
283
+ NgFor,
284
+ FormsModule,
285
+ ReactiveFormsModule,
286
+ SwitchModule,
287
+ IconModule,
288
+ TranslateModule,
289
+ RadioModule,
290
+ TooltipModule,
291
+ ErrorsMapperModule,
292
+ ServicePortsFieldsetComponent,
293
+ ReadonlyFieldDirective,
294
+ DisabledDirective,
295
+ ], template: "<form\n auiForm\n [formGroup]=\"form\"\n>\n <ng-container formGroupName=\"metadata\">\n <aui-form-item width=\"large\">\n <label auiFormItemLabel>{{ 'name' | translate }}</label>\n <input\n [aclReadonlyField]=\"isUpdate\"\n aui-input\n auiFormItemControl\n required\n name=\"name\"\n formControlName=\"name\"\n [placeholder]=\"K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip | translate\"\n />\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"form.get(['metadata', 'name']).errors\"\n [errorsMapper]=\"{\n pattern: K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip | translate\n }\"\n ></acl-errors-mapper>\n </aui-form-item>\n\n <aui-form-item\n width=\"large\"\n formGroupName=\"annotations\"\n >\n <label auiFormItemLabel>{{ 'display_name' | translate }}</label>\n <input\n auiFormItemControl\n aui-input\n [formControlName]=\"displayNameKey\"\n />\n </aui-form-item>\n </ng-container>\n\n <aui-form-item formGroupName=\"spec\">\n <label auiFormItemLabel>{{ 'type' | translate }}</label>\n <aui-radio-group formControlName=\"type\">\n <aui-radio-button\n *ngFor=\"let option of types$ | async\"\n [value]=\"option\"\n >\n {{ option }}\n </aui-radio-button>\n </aui-radio-group>\n <div\n auiFormItemHint\n *ngIf=\"form.get(['spec', 'type']).value === 'ExternalName'\"\n >\n {{ 'service_external_name_hint' | translate }}\n </div>\n </aui-form-item>\n\n <aui-form-item\n formGroupName=\"spec\"\n width=\"large\"\n class=\"last-form-item-no-margin\"\n [hidden]=\"form.get(['spec', 'type']).value !== 'ExternalName'\"\n >\n <label auiFormItemLabel>\n {{ 'service_external_name_mapping_domain' | translate }}\n </label>\n <input\n type=\"text\"\n aui-input\n auiFormItemControl\n [aclDisabled]=\"form.get(['spec', 'type']).value !== 'ExternalName'\"\n [required]=\"form.get(['spec', 'type']).value === 'ExternalName'\"\n formControlName=\"externalName\"\n [pattern]=\"DOMAIN_PATTERN.pattern\"\n [placeholder]=\"'service_external_name_domain_placeholder' | translate\"\n />\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"form.get(['spec', 'externalName']).errors\"\n [errorsMapper]=\"{\n pattern: DOMAIN_PATTERN.tip | translate\n }\"\n >\n </acl-errors-mapper>\n </aui-form-item>\n\n <!-- ExternalName \u7C7B\u578B\u65F6\u9690\u85CF\u5176\u4ED6\u5C5E\u6027 -->\n <div [hidden]=\"form.get(['spec', 'type']).value === 'ExternalName'\">\n <aui-form-item>\n <label auiFormItemLabel>{{ 'virtual_ip' | translate }}</label>\n <aui-switch\n formControlName=\"virtualIp\"\n (valueChange)=\"onVirtualIpChange($event)\"\n ></aui-switch>\n <div auiFormItemAddon>\n <aui-icon\n [auiTooltip]=\"'virtual_ip_hint' | translate\"\n [auiTooltipPosition]=\"'top center'\"\n icon=\"question_circle\"\n class=\"icon--help\"\n ></aui-icon>\n </div>\n </aui-form-item>\n\n <!-- \u81EA\u5B9A\u4E49 Controls -->\n <ng-content></ng-content>\n\n <aui-form-item formGroupName=\"spec\">\n <label auiFormItemLabel>{{ 'ports' | translate }}</label>\n <acl-service-ports-fieldset\n class=\"tw-w-full\"\n auiFormItemControl\n [required]=\"!!form.get('virtualIp').value\"\n [aclDisabled]=\"form.get(['spec', 'type']).value === 'ExternalName'\"\n name=\"ports\"\n formControlName=\"ports\"\n [serviceType]=\"form.get(['spec', 'type']).value\"\n [containerPortSuggestions]=\"containerPortSuggestions\"\n [targetComponent]=\"targetComponent\"\n ></acl-service-ports-fieldset>\n </aui-form-item>\n\n <aui-form-item class=\"last-form-item-no-margin\">\n <label auiFormItemLabel>{{ 'session_affinity' | translate }}</label>\n <aui-switch formControlName=\"sessionPersistence\"></aui-switch>\n </aui-form-item>\n </div>\n</form>\n" }]
296
+ }], function () { return [{ type: i0.Injector }, { type: i1.K8sUtilService }, { type: i1.FeatureGateService }]; }, { cluster: [{
297
+ type: Input,
298
+ args: [{ required: true }]
299
+ }], cluster$: [], isUpdate: [{
300
+ type: Input
301
+ }], isUpdate$: [], containerPortSuggestions: [{
302
+ type: Input,
303
+ args: [{ required: true }]
304
+ }], targetComponent: [{
305
+ type: Input
306
+ }] }); })();
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWZvcm0vY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWZvcm0vdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxHQUNkLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFFTCxZQUFZLEVBQ1osYUFBYSxFQUNiLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsZUFBZSxFQUNmLFVBQVUsRUFFVixlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsdUNBQXVDLEVBQ3ZDLGNBQWMsRUFDZCxlQUFlLEdBQ2hCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssR0FDTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxhQUFhLEVBQ2IsR0FBRyxFQUNILFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNCQUFz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Q25CLFlBQVk7b0JBQ1osVUFBVTtvQkFDVixlQUFlO29CQUNmLFdBQVc7b0JBQ1gsYUFBYTtvQkFDYixrQkFBa0I7b0JBQ2xCLDZCQUE2QjtvQkFDN0Isc0JBQXNCO29CQUN0QixpQkFBaUI7aUJBQ2xCO3lIQU9ELE9BQU87a0JBRE4sS0FBSzttQkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFJekIsUUFBUSxNQUdSLFFBQVE7a0JBRFAsS0FBSztZQUlOLFNBQVMsTUFHVCx3QkFBd0I7a0JBRHZCLEtBQUs7bUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBSXpCLGVBQWU7a0JBRGQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEZvcm1Nb2R1bGUsXG4gIEljb25Nb2R1bGUsXG4gIElucHV0TW9kdWxlLFxuICBSYWRpb01vZHVsZSxcbiAgU3dpdGNoTW9kdWxlLFxuICBUb29sdGlwTW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIENvbnRhaW5lclBvcnQsXG4gIERJU1BMQVlfTkFNRSxcbiAgU0VSVklDRV9UWVBFUyxcbiAgRmVhdHVyZUdhdGVTZXJ2aWNlLFxuICBLOHNVdGlsU2VydmljZSxcbiAgT2JzZXJ2YWJsZUlucHV0LFxuICBwdWJsaXNoUmVmLFxuICBTZXJ2aWNlLFxuICBUcmFuc2xhdGVNb2R1bGUsXG4gIFJlYWRvbmx5RmllbGREaXJlY3RpdmUsXG4gIEVycm9yc01hcHBlck1vZHVsZSxcbiAgRGlzYWJsZWREaXJlY3RpdmUsXG4gIEs4U19SRVNPVVJDRV9OQU1FX1NUQVJUX1dJVEhfQ0hBUlNfT05MWSxcbiAgRE9NQUlOX1BBVFRFUk4sXG4gIFNlcnZpY2VUeXBlTWV0YSxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCYXNlUmVzb3VyY2VGb3JtR3JvdXBDb21wb25lbnQgfSBmcm9tICduZy1yZXNvdXJjZS1mb3JtLXV0aWwnO1xuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2VydmljZVBvcnRzRmllbGRzZXRDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkc2V0L2NvbXBvbmVudCc7XG5cbmNvbnN0IE5PTl9MQl9TRVJWSUNFX1RZUEVTID0gU0VSVklDRV9UWVBFUy5maWx0ZXIob3AgPT4gb3AgIT09ICdMb2FkQmFsYW5jZXInKTtcbmludGVyZmFjZSBTZXJ2aWNlRm9ybU1vZGVsIGV4dGVuZHMgU2VydmljZSB7XG4gIHZpcnR1YWxJcD86IGJvb2xlYW47IC8vIOiZmuaLnyBpcO+8jOS4uiBmYWxzZSDml7bpnIDopoHorr7nva4gc3BlYy5jbHVzdGVySXA6IE5vbmVcbiAgc2Vzc2lvblBlcnNpc3RlbmNlPzogYm9vbGVhbjsgLy8g5Lya6K+d5L+d5oyB77yM5a+55bqUIHNwZWMuc2Vzc2lvbkFmZmluaXR5OiBDbGllbnRJUC9Ob25lXG59XG5cbi8vIEs4cyBiYXNlIHNlcnZpY2UgZm9ybVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLWs4cy1zZXJ2aWNlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgQXN5bmNQaXBlLFxuICAgIEZvcm1Nb2R1bGUsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgTmdJZixcbiAgICBOZ0ZvcixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFN3aXRjaE1vZHVsZSxcbiAgICBJY29uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBSYWRpb01vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIEVycm9yc01hcHBlck1vZHVsZSxcbiAgICBTZXJ2aWNlUG9ydHNGaWVsZHNldENvbXBvbmVudCxcbiAgICBSZWFkb25seUZpZWxkRGlyZWN0aXZlLFxuICAgIERpc2FibGVkRGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBLOHNTZXJ2aWNlRm9ybUNvbXBvbmVudFxuICBleHRlbmRzIEJhc2VSZXNvdXJjZUZvcm1Hcm91cENvbXBvbmVudDxTZXJ2aWNlLCBTZXJ2aWNlRm9ybU1vZGVsPlxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXRcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgY2x1c3Rlcjogc3RyaW5nO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBjbHVzdGVyJCE6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoKVxuICBpc1VwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBpc1VwZGF0ZSQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIGNvbnRhaW5lclBvcnRTdWdnZXN0aW9uczogQ29udGFpbmVyUG9ydFtdO1xuXG4gIEBJbnB1dCgpXG4gIHRhcmdldENvbXBvbmVudDogJ3dvcmtsb2FkJyB8ICd2bScgfCAnbGFiZWwtc2VsZWN0b3JzJyA9ICd3b3JrbG9hZCc7XG5cbiAgSzhTX1JFU09VUkNFX05BTUVfU1RBUlRfV0lUSF9DSEFSU19PTkxZID1cbiAgICBLOFNfUkVTT1VSQ0VfTkFNRV9TVEFSVF9XSVRIX0NIQVJTX09OTFk7XG5cbiAgRE9NQUlOX1BBVFRFUk4gPSBET01BSU5fUEFUVEVSTjtcbiAgZGlzcGxheU5hbWVLZXkgPSB0aGlzLms4c1V0aWwubm9ybWFsaXplVHlwZShESVNQTEFZX05BTUUpO1xuXG4gIGlzTGJFbmFibGVkJCA9IHRoaXMuY2x1c3RlciQucGlwZShcbiAgICBzd2l0Y2hNYXAoY2x1c3RlciA9PlxuICAgICAgdGhpcy5mZWF0dXJlR2F0ZS5pc0VuYWJsZWQoJ2xvYWRiYWxhbmNlci1zZXJ2aWNlJywgY2x1c3RlciksXG4gICAgKSxcbiAgICBzdGFydFdpdGgobnVsbCksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHR5cGVzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaXNVcGRhdGUkLFxuICAgIHRoaXMuaXNMYkVuYWJsZWQkLFxuICAgIHRoaXMucmVzb3VyY2UkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lzVXBkYXRlLCBpc0xiRW5hYmxlZCwgcmVzb3VyY2VdKSA9PiB7XG4gICAgICByZXR1cm4gaXNMYkVuYWJsZWQgfHxcbiAgICAgICAgKGlzVXBkYXRlICYmIHJlc291cmNlPy5zcGVjPy50eXBlID09PSAnTG9hZEJhbGFuY2VyJylcbiAgICAgICAgPyBTRVJWSUNFX1RZUEVTXG4gICAgICAgIDogTk9OX0xCX1NFUlZJQ0VfVFlQRVM7XG4gICAgfSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGs4c1V0aWw6IEs4c1V0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmVhdHVyZUdhdGU6IEZlYXR1cmVHYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuXG4gICAgY29uc3QgdHlwZUN0cmwgPSB0aGlzLmZvcm0uZ2V0KCdzcGVjLnR5cGUnKTtcbiAgICB0eXBlQ3RybC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgc3RhcnRXaXRoKHR5cGVDdHJsLnZhbHVlKSlcbiAgICAgIC5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAgIGNvbnN0IHZpcnR1YWxJcEN0cmwgPSB0aGlzLmZvcm0uZ2V0KCd2aXJ0dWFsSXAnKTtcblxuICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZSkge1xuICAgICAgICAgIHZpcnR1YWxJcEN0cmwuZGlzYWJsZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChbJ05vZGVQb3J0JywgJ0xvYWRCYWxhbmNlciddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgdmlydHVhbElwQ3RybC5zZXRWYWx1ZSh0cnVlKTtcbiAgICAgICAgICB2aXJ0dWFsSXBDdHJsLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aXJ0dWFsSXBDdHJsLmVuYWJsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgIT09ICdFeHRlcm5hbE5hbWUnKSB7XG4gICAgICAgICAgdGhpcy5vblZpcnR1YWxJcENoYW5nZSh2aXJ0dWFsSXBDdHJsLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBnZXREZWZhdWx0Rm9ybU1vZGVsKCk6IFNlcnZpY2VGb3JtTW9kZWwge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnU2VydmljZScsXG4gICAgICB2aXJ0dWFsSXA6IHRydWUsXG4gICAgICBzZXNzaW9uUGVyc2lzdGVuY2U6IGZhbHNlLFxuICAgICAgc3BlYzoge1xuICAgICAgICB0eXBlOiAnQ2x1c3RlcklQJyxcbiAgICAgICAgcG9ydHM6IFtdLFxuICAgICAgICBleHRlcm5hbE5hbWU6ICcnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICB2aXJ0dWFsSXA6IHRoaXMuZmIuY29udHJvbCh0cnVlKSxcbiAgICAgIHNlc3Npb25QZXJzaXN0ZW5jZTogZmFsc2UsXG4gICAgICBtZXRhZGF0YTogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IHRoaXMuZmIuY29udHJvbCgnJywgW1xuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzIpLFxuICAgICAgICAgIFZhbGlkYXRvcnMucGF0dGVybihLOFNfUkVTT1VSQ0VfTkFNRV9TVEFSVF9XSVRIX0NIQVJTX09OTFkucGF0dGVybiksXG4gICAgICAgIF0pLFxuICAgICAgICBsYWJlbHM6IHRoaXMuZmIuY29udHJvbCh7fSksXG4gICAgICAgIGFubm90YXRpb25zOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICBbdGhpcy5kaXNwbGF5TmFtZUtleV06ICcnLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgc3BlYzogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIHR5cGU6ICdDbHVzdGVySVAnLFxuICAgICAgICBwb3J0czogbnVsbCxcbiAgICAgICAgZXh0ZXJuYWxOYW1lOiAnJyxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRhcHRGb3JtTW9kZWwoe1xuICAgIHZpcnR1YWxJcCxcbiAgICBzZXNzaW9uUGVyc2lzdGVuY2UsXG4gICAgLi4ucmVzb3VyY2VcbiAgfTogU2VydmljZUZvcm1Nb2RlbCk6IFNlcnZpY2Uge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB7IC4uLlNlcnZpY2VUeXBlTWV0YSwgLi4ucmVzb3VyY2UgfTtcbiAgICAvLyBgRXh0ZXJuYWxOYW1lYCB0eXBlIGp1c3QgbmVlZCBleHRlcm5hbE5hbWVcbiAgICBpZiAocmVzb3VyY2Uuc3BlYy50eXBlID09PSAnRXh0ZXJuYWxOYW1lJykge1xuICAgICAgc2VydmljZS5zcGVjID0ge1xuICAgICAgICB0eXBlOiAnRXh0ZXJuYWxOYW1lJyxcbiAgICAgICAgZXh0ZXJuYWxOYW1lOiByZXNvdXJjZS5zcGVjLmV4dGVybmFsTmFtZSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gc2VydmljZTtcbiAgICB9XG4gICAgLy8gSXQgbXVzdCBiZSBub24gSGVhZGxlc3MgaWYgYHZpcnR1YWxJcGAgaXMgZW5hYmxlZFxuICAgIGlmICh2aXJ0dWFsSXApIHtcbiAgICAgIGlmIChzZXJ2aWNlLnNwZWMuY2x1c3RlcklQID09PSAnTm9uZScpIHtcbiAgICAgICAgZGVsZXRlIHNlcnZpY2Uuc3BlYy5jbHVzdGVySVA7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHZpcnR1YWxJcCDooqvnpoHnlKjlkI7kuLogdW5kZWZpbmVk77yMIOatpOaXtuS4jeWBmuWkhOeQhlxuICAgIGVsc2UgaWYgKHZpcnR1YWxJcCA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEhlYWRsZXNzXG4gICAgICBzZXJ2aWNlLnNwZWMuY2x1c3RlcklQID0gJ05vbmUnO1xuICAgIH1cblxuICAgIHNlcnZpY2Uuc3BlYy5zZXNzaW9uQWZmaW5pdHkgPSBzZXNzaW9uUGVyc2lzdGVuY2UgPyAnQ2xpZW50SVAnIDogJ05vbmUnO1xuICAgIHJldHVybiBzZXJ2aWNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRhcHRSZXNvdXJjZU1vZGVsKHJlc291cmNlOiBTZXJ2aWNlKTogU2VydmljZUZvcm1Nb2RlbCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc291cmNlLFxuICAgICAgdmlydHVhbElwOiByZXNvdXJjZT8uc3BlYz8uY2x1c3RlcklQICE9PSAnTm9uZScsXG4gICAgICBzZXNzaW9uUGVyc2lzdGVuY2U6IHJlc291cmNlPy5zcGVjPy5zZXNzaW9uQWZmaW5pdHkgPT09ICdDbGllbnRJUCcsXG4gICAgfTtcbiAgfVxuXG4gIG9uVmlydHVhbElwQ2hhbmdlKHZpcnR1YWxJcDogYm9vbGVhbikge1xuICAgIGlmICghdmlydHVhbElwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydHNDdHJsID0gdGhpcy5mb3JtLmdldCgnc3BlYy5wb3J0cycpO1xuXG4gICAgaWYgKCFwb3J0c0N0cmwudmFsdWU/Lmxlbmd0aCkge1xuICAgICAgcG9ydHNDdHJsLnBhdGNoVmFsdWUoW3t9XSk7XG4gICAgfVxuICB9XG59XG4iLCI8Zm9ybVxuICBhdWlGb3JtXG4gIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4+XG4gIDxuZy1jb250YWluZXIgZm9ybUdyb3VwTmFtZT1cIm1ldGFkYXRhXCI+XG4gICAgPGF1aS1mb3JtLWl0ZW0gd2lkdGg9XCJsYXJnZVwiPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ25hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBbYWNsUmVhZG9ubHlGaWVsZF09XCJpc1VwZGF0ZVwiXG4gICAgICAgIGF1aS1pbnB1dFxuICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgbmFtZT1cIm5hbWVcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIks4U19SRVNPVVJDRV9OQU1FX1NUQVJUX1dJVEhfQ0hBUlNfT05MWS50aXAgfCB0cmFuc2xhdGVcIlxuICAgICAgLz5cbiAgICAgIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgICAgICBhdWlGb3JtSXRlbUVycm9yXG4gICAgICAgIFtlcnJvcnNdPVwiZm9ybS5nZXQoWydtZXRhZGF0YScsICduYW1lJ10pLmVycm9yc1wiXG4gICAgICAgIFtlcnJvcnNNYXBwZXJdPVwie1xuICAgICAgICAgIHBhdHRlcm46IEs4U19SRVNPVVJDRV9OQU1FX1NUQVJUX1dJVEhfQ0hBUlNfT05MWS50aXAgfCB0cmFuc2xhdGVcbiAgICAgICAgfVwiXG4gICAgICA+PC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgICA8YXVpLWZvcm0taXRlbVxuICAgICAgd2lkdGg9XCJsYXJnZVwiXG4gICAgICBmb3JtR3JvdXBOYW1lPVwiYW5ub3RhdGlvbnNcIlxuICAgID5cbiAgICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdkaXNwbGF5X25hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgYXVpLWlucHV0XG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGlzcGxheU5hbWVLZXlcIlxuICAgICAgLz5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxhdWktZm9ybS1pdGVtIGZvcm1Hcm91cE5hbWU9XCJzcGVjXCI+XG4gICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ3R5cGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8YXVpLXJhZGlvLWdyb3VwIGZvcm1Db250cm9sTmFtZT1cInR5cGVcIj5cbiAgICAgIDxhdWktcmFkaW8tYnV0dG9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgdHlwZXMkIHwgYXN5bmNcIlxuICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCJcbiAgICAgID5cbiAgICAgICAge3sgb3B0aW9uIH19XG4gICAgICA8L2F1aS1yYWRpby1idXR0b24+XG4gICAgPC9hdWktcmFkaW8tZ3JvdXA+XG4gICAgPGRpdlxuICAgICAgYXVpRm9ybUl0ZW1IaW50XG4gICAgICAqbmdJZj1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlID09PSAnRXh0ZXJuYWxOYW1lJ1wiXG4gICAgPlxuICAgICAge3sgJ3NlcnZpY2VfZXh0ZXJuYWxfbmFtZV9oaW50JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgPGF1aS1mb3JtLWl0ZW1cbiAgICBmb3JtR3JvdXBOYW1lPVwic3BlY1wiXG4gICAgd2lkdGg9XCJsYXJnZVwiXG4gICAgY2xhc3M9XCJsYXN0LWZvcm0taXRlbS1uby1tYXJnaW5cIlxuICAgIFtoaWRkZW5dPVwiZm9ybS5nZXQoWydzcGVjJywgJ3R5cGUnXSkudmFsdWUgIT09ICdFeHRlcm5hbE5hbWUnXCJcbiAgPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPlxuICAgICAge3sgJ3NlcnZpY2VfZXh0ZXJuYWxfbmFtZV9tYXBwaW5nX2RvbWFpbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2xhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgYXVpLWlucHV0XG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIFthY2xEaXNhYmxlZF09XCJmb3JtLmdldChbJ3NwZWMnLCAndHlwZSddKS52YWx1ZSAhPT0gJ0V4dGVybmFsTmFtZSdcIlxuICAgICAgW3JlcXVpcmVkXT1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlID09PSAnRXh0ZXJuYWxOYW1lJ1wiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJleHRlcm5hbE5hbWVcIlxuICAgICAgW3BhdHRlcm5dPVwiRE9NQUlOX1BBVFRFUk4ucGF0dGVyblwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiJ3NlcnZpY2VfZXh0ZXJuYWxfbmFtZV9kb21haW5fcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAvPlxuICAgIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgICAgYXVpRm9ybUl0ZW1FcnJvclxuICAgICAgW2Vycm9yc109XCJmb3JtLmdldChbJ3NwZWMnLCAnZXh0ZXJuYWxOYW1lJ10pLmVycm9yc1wiXG4gICAgICBbZXJyb3JzTWFwcGVyXT1cIntcbiAgICAgICAgcGF0dGVybjogRE9NQUlOX1BBVFRFUk4udGlwIHwgdHJhbnNsYXRlXG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgPC9hdWktZm9ybS1pdGVtPlxuXG4gIDwhLS0gRXh0ZXJuYWxOYW1lIOexu+Wei+aXtumakOiXj+WFtuS7luWxnuaApyAtLT5cbiAgPGRpdiBbaGlkZGVuXT1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlID09PSAnRXh0ZXJuYWxOYW1lJ1wiPlxuICAgIDxhdWktZm9ybS1pdGVtPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ3ZpcnR1YWxfaXAnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxhdWktc3dpdGNoXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZpcnR1YWxJcFwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZpcnR1YWxJcENoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L2F1aS1zd2l0Y2g+XG4gICAgICA8ZGl2IGF1aUZvcm1JdGVtQWRkb24+XG4gICAgICAgIDxhdWktaWNvblxuICAgICAgICAgIFthdWlUb29sdGlwXT1cIid2aXJ0dWFsX2lwX2hpbnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXVpVG9vbHRpcFBvc2l0aW9uXT1cIid0b3AgY2VudGVyJ1wiXG4gICAgICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICAgICAgY2xhc3M9XCJpY29uLS1oZWxwXCJcbiAgICAgICAgPjwvYXVpLWljb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgICA8IS0tIOiHquWumuS5iSBDb250cm9scyAtLT5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICA8YXVpLWZvcm0taXRlbSBmb3JtR3JvdXBOYW1lPVwic3BlY1wiPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ3BvcnRzJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICA8YWNsLXNlcnZpY2UtcG9ydHMtZmllbGRzZXRcbiAgICAgICAgY2xhc3M9XCJ0dy13LWZ1bGxcIlxuICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgW3JlcXVpcmVkXT1cIiEhZm9ybS5nZXQoJ3ZpcnR1YWxJcCcpLnZhbHVlXCJcbiAgICAgICAgW2FjbERpc2FibGVkXT1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlID09PSAnRXh0ZXJuYWxOYW1lJ1wiXG4gICAgICAgIG5hbWU9XCJwb3J0c1wiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBvcnRzXCJcbiAgICAgICAgW3NlcnZpY2VUeXBlXT1cImZvcm0uZ2V0KFsnc3BlYycsICd0eXBlJ10pLnZhbHVlXCJcbiAgICAgICAgW2NvbnRhaW5lclBvcnRTdWdnZXN0aW9uc109XCJjb250YWluZXJQb3J0U3VnZ2VzdGlvbnNcIlxuICAgICAgICBbdGFyZ2V0Q29tcG9uZW50XT1cInRhcmdldENvbXBvbmVudFwiXG4gICAgICA+PC9hY2wtc2VydmljZS1wb3J0cy1maWVsZHNldD5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgICA8YXVpLWZvcm0taXRlbSBjbGFzcz1cImxhc3QtZm9ybS1pdGVtLW5vLW1hcmdpblwiPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ3Nlc3Npb25fYWZmaW5pdHknIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxhdWktc3dpdGNoIGZvcm1Db250cm9sTmFtZT1cInNlc3Npb25QZXJzaXN0ZW5jZVwiPjwvYXVpLXN3aXRjaD5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19