@alauda-fe/network 1.0.1 → 1.0.2

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 (62) hide show
  1. package/esm2022/index.mjs +10 -2
  2. package/esm2022/lib/components/certificate-status/component.mjs +7 -6
  3. package/esm2022/lib/components/fixed-ip/component.mjs +134 -91
  4. package/esm2022/lib/components/loadbalancer-spec-form/component.mjs +57 -57
  5. package/esm2022/lib/components/service-annotations-form/annotations.component.mjs +136 -142
  6. package/esm2022/lib/components/service-annotations-form-item/annotations.component.mjs +24 -25
  7. package/esm2022/lib/components/service-form/component.mjs +34 -33
  8. package/esm2022/lib/components/service-form/fieldset/component.mjs +92 -95
  9. package/esm2022/lib/directives/subnet-validator.directive.mjs +5 -5
  10. package/esm2022/lib/features/network-policy/components/add-peer-rule-handler/component.mjs +69 -0
  11. package/esm2022/lib/features/network-policy/components/ip-block-display/component.mjs +54 -0
  12. package/esm2022/lib/features/network-policy/components/label-selector-display/component.mjs +117 -0
  13. package/esm2022/lib/features/network-policy/components/peer-container/component.mjs +81 -0
  14. package/esm2022/lib/features/network-policy/components/pod-review/component.mjs +250 -0
  15. package/esm2022/lib/features/network-policy/components/rule-table/component.mjs +269 -0
  16. package/esm2022/lib/features/network-policy/form/network-policy/component.mjs +429 -0
  17. package/esm2022/lib/features/network-policy/form/network-policy-ip-block/component.mjs +102 -0
  18. package/esm2022/lib/features/network-policy/form/network-policy-peer/component.mjs +247 -0
  19. package/esm2022/lib/features/network-policy/form/network-policy-ports/component.mjs +161 -0
  20. package/esm2022/lib/features/network-policy/form/network-policy-remote-except-input/component.mjs +128 -0
  21. package/esm2022/lib/features/network-policy/form/network-policy-rule/component.mjs +142 -0
  22. package/esm2022/lib/services/alb-api.service.mjs +26 -6
  23. package/esm2022/lib/services/certificate-api.service.mjs +4 -4
  24. package/esm2022/lib/services/network-util.service.mjs +18 -4
  25. package/esm2022/lib/services/subnet-util.service.mjs +121 -0
  26. package/esm2022/lib/types/alb-exports.mjs +1 -1
  27. package/esm2022/lib/types/k8s-exports.mjs +2 -1
  28. package/esm2022/lib/types/metallb-exports.mjs +2 -0
  29. package/esm2022/lib/types/resource-definition.mjs +28 -2
  30. package/esm2022/lib/utils/alb-exports.mjs +1 -1
  31. package/esm2022/lib/utils/cidr-exports.mjs +3 -3
  32. package/esm2022/lib/utils/common-exports.mjs +22 -0
  33. package/esm2022/lib/utils/service-exports.mjs +1 -1
  34. package/esm2022/lib/utils/validators-exports.mjs +44 -0
  35. package/index.d.ts +9 -1
  36. package/lib/components/fixed-ip/component.d.ts +10 -3
  37. package/lib/components/service-annotations-form/annotations.component.d.ts +6 -6
  38. package/lib/components/service-annotations-form-item/annotations.component.d.ts +1 -1
  39. package/lib/components/service-form/component.d.ts +1 -1
  40. package/lib/features/network-policy/components/add-peer-rule-handler/component.d.ts +8 -0
  41. package/lib/features/network-policy/components/ip-block-display/component.d.ts +7 -0
  42. package/lib/features/network-policy/components/label-selector-display/component.d.ts +13 -0
  43. package/lib/features/network-policy/components/peer-container/component.d.ts +18 -0
  44. package/lib/features/network-policy/components/pod-review/component.d.ts +37 -0
  45. package/lib/features/network-policy/components/rule-table/component.d.ts +21 -0
  46. package/lib/features/network-policy/form/network-policy/component.d.ts +70 -0
  47. package/lib/features/network-policy/form/network-policy-ip-block/component.d.ts +23 -0
  48. package/lib/features/network-policy/form/network-policy-peer/component.d.ts +43 -0
  49. package/lib/features/network-policy/form/network-policy-ports/component.d.ts +17 -0
  50. package/lib/features/network-policy/form/network-policy-remote-except-input/component.d.ts +23 -0
  51. package/lib/features/network-policy/form/network-policy-rule/component.d.ts +28 -0
  52. package/lib/services/alb-api.service.d.ts +4 -2
  53. package/lib/services/network-util.service.d.ts +1 -0
  54. package/lib/services/subnet-util.service.d.ts +25 -0
  55. package/lib/types/alb-exports.d.ts +23 -0
  56. package/lib/types/k8s-exports.d.ts +51 -1
  57. package/lib/types/metallb-exports.d.ts +65 -0
  58. package/lib/types/resource-definition.d.ts +143 -0
  59. package/lib/utils/common-exports.d.ts +5 -0
  60. package/lib/utils/validators-exports.d.ts +16 -0
  61. package/package.json +9 -4
  62. package/styles.css +1 -0
@@ -0,0 +1,429 @@
1
+ import { ButtonModule, CheckboxModule, ConfirmType, DialogService, FormModule, IconModule, InputModule, TabsModule, } from '@alauda/ui';
2
+ import { DISPLAY_NAME, DeclareDirective, ERRORS_MAPPER_MODULE, EffectDirectiveModule, K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY, K8sUtilService, KeyValueFormTableComponent, ReadonlyFieldDirective, SPEC, TRANSLATE_MODULE, TranslateService, getK8sResourceLabelErrorMapper$, k8sResourceLabelValidator, } from '@alauda-fe/common';
3
+ import { CommonModule } from '@angular/common';
4
+ import { ChangeDetectionStrategy, Component, Injector, Input, } from '@angular/core';
5
+ import { Validators, ReactiveFormsModule } from '@angular/forms';
6
+ import { has, uniq } from 'lodash-es';
7
+ import { BaseResourceFormGroupComponent } from 'ng-resource-form-util';
8
+ import { PodPreviewComponent } from '../../components/pod-review/component';
9
+ import { NetworkPolicyRuleFormComponent } from '../network-policy-rule/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/common";
14
+ import * as i4 from "@angular/forms";
15
+ const _c0 = a0 => ({ pattern: a0 });
16
+ const _c1 = () => ["spec", "podSelector", "matchLabels"];
17
+ const _c2 = a0 => ({ xxx: a0 });
18
+ const _c3 = a0 => ["spec", a0];
19
+ const _c4 = (a0, a1) => ({ policyType: a0, ruleDisabled: a1 });
20
+ function NetworkPolicyFormComponent_ng_template_29_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementStart(0, "span", 17);
22
+ i0.ɵɵtext(1);
23
+ i0.ɵɵpipe(2, "translate");
24
+ i0.ɵɵelementEnd();
25
+ } if (rf & 2) {
26
+ i0.ɵɵadvance();
27
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, "network.target_pod_selector_no_data_tip"));
28
+ } }
29
+ function NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_ng_container_1_ng_container_1_aui_icon_1_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelement(0, "aui-icon", 31);
31
+ } }
32
+ function NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_ng_container_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelementContainerStart(0);
34
+ i0.ɵɵtemplate(1, NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_ng_container_1_ng_container_1_aui_icon_1_Template, 1, 0, "aui-icon", 30);
35
+ i0.ɵɵelementStart(2, "span");
36
+ i0.ɵɵtext(3);
37
+ i0.ɵɵpipe(4, "translate");
38
+ i0.ɵɵelementEnd();
39
+ i0.ɵɵelementContainerEnd();
40
+ } if (rf & 2) {
41
+ const control_r6 = i0.ɵɵnextContext().ngIf;
42
+ const policyType_r2 = i0.ɵɵnextContext(4).$implicit;
43
+ i0.ɵɵadvance();
44
+ i0.ɵɵproperty("ngIf", control_r6.invalid && control_r6.dirty);
45
+ i0.ɵɵadvance(2);
46
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 2, policyType_r2), " ");
47
+ } }
48
+ function NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_ng_container_1_Template(rf, ctx) { if (rf & 1) {
49
+ i0.ɵɵelementContainerStart(0);
50
+ i0.ɵɵtemplate(1, NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_ng_container_1_ng_container_1_Template, 5, 4, "ng-container", 28);
51
+ i0.ɵɵelement(2, "acl-network-policy-rule-form", 29);
52
+ i0.ɵɵelementContainerEnd();
53
+ } if (rf & 2) {
54
+ const control_r6 = ctx.ngIf;
55
+ const policyType_r2 = i0.ɵɵnextContext(4).$implicit;
56
+ const ctx_r2 = i0.ɵɵnextContext();
57
+ i0.ɵɵadvance(2);
58
+ i0.ɵɵproperty("formControl", control_r6)("baseParams", ctx_r2.baseParams)("policyType", policyType_r2);
59
+ } }
60
+ function NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_Template(rf, ctx) { if (rf & 1) {
61
+ const _r4 = i0.ɵɵgetCurrentView();
62
+ i0.ɵɵelementStart(0, "aui-tab", 27);
63
+ i0.ɵɵlistener("close", function NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_Template_aui_tab_close_0_listener() { const index_r5 = i0.ɵɵrestoreView(_r4).index; const policyType_r2 = i0.ɵɵnextContext(3).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.removeRule(index_r5, policyType_r2)); });
64
+ i0.ɵɵtemplate(1, NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_ng_container_1_Template, 3, 3, "ng-container", 24);
65
+ i0.ɵɵelementEnd();
66
+ } if (rf & 2) {
67
+ const item_r7 = ctx.$implicit;
68
+ i0.ɵɵproperty("closeable", true);
69
+ i0.ɵɵadvance();
70
+ i0.ɵɵproperty("ngIf", item_r7);
71
+ } }
72
+ function NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_Template(rf, ctx) { if (rf & 1) {
73
+ i0.ɵɵelementContainerStart(0);
74
+ i0.ɵɵelementStart(1, "aui-tab-group", 25);
75
+ i0.ɵɵtemplate(2, NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_aui_tab_2_Template, 2, 2, "aui-tab", 26);
76
+ i0.ɵɵelementEnd();
77
+ i0.ɵɵelementContainerEnd();
78
+ } if (rf & 2) {
79
+ const ruleControls_r8 = i0.ɵɵnextContext().declare;
80
+ i0.ɵɵadvance(2);
81
+ i0.ɵɵproperty("ngForOf", ruleControls_r8);
82
+ } }
83
+ function NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_2_Template(rf, ctx) { if (rf & 1) {
84
+ i0.ɵɵelementContainerStart(0);
85
+ i0.ɵɵelementContainer(1, 32);
86
+ i0.ɵɵelementContainerEnd();
87
+ } if (rf & 2) {
88
+ const policyType_r2 = i0.ɵɵnextContext(2).$implicit;
89
+ const ctx_r2 = i0.ɵɵnextContext();
90
+ const emptyTemplate_r9 = i0.ɵɵreference(33);
91
+ i0.ɵɵadvance();
92
+ i0.ɵɵproperty("ngTemplateOutlet", emptyTemplate_r9)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c4, policyType_r2, ctx_r2.ruleDisabledStateMap[policyType_r2]));
93
+ } }
94
+ function NetworkPolicyFormComponent_ng_container_31_ng_container_14_Template(rf, ctx) { if (rf & 1) {
95
+ i0.ɵɵelementContainerStart(0);
96
+ i0.ɵɵtemplate(1, NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_1_Template, 3, 1, "ng-container", 24)(2, NetworkPolicyFormComponent_ng_container_31_ng_container_14_ng_container_2_Template, 2, 5, "ng-container", 24);
97
+ i0.ɵɵelementContainerEnd();
98
+ } if (rf & 2) {
99
+ const ruleControls_r8 = ctx.declare;
100
+ const policyType_r2 = i0.ɵɵnextContext().$implicit;
101
+ const ctx_r2 = i0.ɵɵnextContext();
102
+ i0.ɵɵadvance();
103
+ i0.ɵɵproperty("ngIf", !ctx_r2.ruleDisabledStateMap[policyType_r2] && ruleControls_r8.length);
104
+ i0.ɵɵadvance();
105
+ i0.ɵɵproperty("ngIf", !ruleControls_r8.length || ctx_r2.ruleDisabledStateMap[policyType_r2]);
106
+ } }
107
+ function NetworkPolicyFormComponent_ng_container_31_Template(rf, ctx) { if (rf & 1) {
108
+ const _r1 = i0.ɵɵgetCurrentView();
109
+ i0.ɵɵelementContainerStart(0);
110
+ i0.ɵɵelementStart(1, "div", 18)(2, "div", 10);
111
+ i0.ɵɵtext(3);
112
+ i0.ɵɵpipe(4, "translate");
113
+ i0.ɵɵelementEnd();
114
+ i0.ɵɵelementStart(5, "div", 19)(6, "button", 20);
115
+ i0.ɵɵlistener("click", function NetworkPolicyFormComponent_ng_container_31_Template_button_click_6_listener() { const policyType_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.addRule(policyType_r2)); });
116
+ i0.ɵɵelement(7, "aui-icon", 21);
117
+ i0.ɵɵtext(8);
118
+ i0.ɵɵpipe(9, "translate");
119
+ i0.ɵɵpipe(10, "translate");
120
+ i0.ɵɵelementEnd();
121
+ i0.ɵɵelementStart(11, "aui-checkbox", 22);
122
+ i0.ɵɵlistener("valueChange", function NetworkPolicyFormComponent_ng_container_31_Template_aui_checkbox_valueChange_11_listener($event) { const policyType_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.ruleDisabledChanged($event, policyType_r2)); });
123
+ i0.ɵɵtext(12);
124
+ i0.ɵɵpipe(13, "translate");
125
+ i0.ɵɵelementEnd()()();
126
+ i0.ɵɵtemplate(14, NetworkPolicyFormComponent_ng_container_31_ng_container_14_Template, 3, 2, "ng-container", 23);
127
+ i0.ɵɵelementContainerEnd();
128
+ } if (rf & 2) {
129
+ const policyType_r2 = ctx.$implicit;
130
+ const i_r10 = ctx.index;
131
+ const ctx_r2 = i0.ɵɵnextContext();
132
+ i0.ɵɵadvance();
133
+ i0.ɵɵclassMap(i_r10 === 1 ? "tw-mt-16" : "");
134
+ i0.ɵɵadvance(2);
135
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 9, "network.direction_" + policyType_r2), " ");
136
+ i0.ɵɵadvance(3);
137
+ i0.ɵɵproperty("plain", true)("disabled", ctx_r2.ruleDisabledStateMap[policyType_r2]);
138
+ i0.ɵɵadvance(2);
139
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(10, 13, "add_xxx", i0.ɵɵpureFunction1(18, _c2, i0.ɵɵpipeBind1(9, 11, policyType_r2))), " ");
140
+ i0.ɵɵadvance(3);
141
+ i0.ɵɵproperty("value", ctx_r2.ruleDisabledStateMap[policyType_r2]);
142
+ i0.ɵɵadvance();
143
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(13, 16, "network.block_all_" + policyType_r2 + "_traffic"));
144
+ i0.ɵɵadvance(2);
145
+ i0.ɵɵproperty("declare", ctx_r2.form.get(i0.ɵɵpureFunction1(20, _c3, policyType_r2)).controls);
146
+ } }
147
+ function NetworkPolicyFormComponent_ng_template_32_span_1_Template(rf, ctx) { if (rf & 1) {
148
+ i0.ɵɵelementStart(0, "span", 35);
149
+ i0.ɵɵtext(1);
150
+ i0.ɵɵpipe(2, "translate");
151
+ i0.ɵɵelementEnd();
152
+ } if (rf & 2) {
153
+ const policyType_r11 = i0.ɵɵnextContext().policyType;
154
+ i0.ɵɵadvance();
155
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "network." + policyType_r11 + "_rule_no_data_tip"), " ");
156
+ } }
157
+ function NetworkPolicyFormComponent_ng_template_32_span_2_Template(rf, ctx) { if (rf & 1) {
158
+ i0.ɵɵelementStart(0, "span");
159
+ i0.ɵɵtext(1);
160
+ i0.ɵɵpipe(2, "translate");
161
+ i0.ɵɵelementEnd();
162
+ } if (rf & 2) {
163
+ const policyType_r11 = i0.ɵɵnextContext().policyType;
164
+ i0.ɵɵadvance();
165
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, "network.block_all_" + policyType_r11 + "_tip"));
166
+ } }
167
+ function NetworkPolicyFormComponent_ng_template_32_Template(rf, ctx) { if (rf & 1) {
168
+ i0.ɵɵelementStart(0, "div", 33);
169
+ i0.ɵɵtemplate(1, NetworkPolicyFormComponent_ng_template_32_span_1_Template, 3, 3, "span", 34)(2, NetworkPolicyFormComponent_ng_template_32_span_2_Template, 3, 3, "span", 24);
170
+ i0.ɵɵelementEnd();
171
+ } if (rf & 2) {
172
+ const ruleDisabled_r12 = ctx.ruleDisabled;
173
+ i0.ɵɵadvance();
174
+ i0.ɵɵproperty("ngIf", !ruleDisabled_r12);
175
+ i0.ɵɵadvance();
176
+ i0.ɵɵproperty("ngIf", ruleDisabled_r12);
177
+ } }
178
+ const PolicyTypes = ['ingress', 'egress'];
179
+ export class NetworkPolicyFormComponent extends BaseResourceFormGroupComponent {
180
+ get ingressRuleFormArray() {
181
+ return this.form.get([SPEC, 'ingress']);
182
+ }
183
+ get ingressRuleControls() {
184
+ return this.ingressRuleFormArray.controls ?? [];
185
+ }
186
+ get egressRuleFormArray() {
187
+ return this.form.get([SPEC, 'egress']);
188
+ }
189
+ get egressRuleControls() {
190
+ return [...(this.egressRuleFormArray.controls ?? [])];
191
+ }
192
+ constructor(injector, k8sUtil, translate, dialog) {
193
+ super(injector);
194
+ this.k8sUtil = k8sUtil;
195
+ this.translate = translate;
196
+ this.dialog = dialog;
197
+ this.isUpdate = false;
198
+ this.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY = K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY;
199
+ this.labelValidator = k8sResourceLabelValidator;
200
+ this.labelErrorMapper$ = getK8sResourceLabelErrorMapper$(this.translate);
201
+ this.PolicyTypes = PolicyTypes;
202
+ this.displayNameKey = this.k8sUtil.normalizeType(DISPLAY_NAME);
203
+ this.ruleDisabledStateMap = {
204
+ ingress: false,
205
+ egress: false,
206
+ };
207
+ }
208
+ createForm() {
209
+ const metadataForm = this.fb.group({
210
+ name: this.fb.control('', [
211
+ Validators.required,
212
+ Validators.pattern(K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.pattern),
213
+ ]),
214
+ namespace: this.fb.control(''),
215
+ annotations: this.fb.group({
216
+ [this.displayNameKey]: this.fb.control(''),
217
+ }),
218
+ });
219
+ const specForm = this.fb.group({
220
+ podSelector: this.fb.group({
221
+ matchLabels: this.fb.control(null),
222
+ }),
223
+ ingress: this.fb.array([]),
224
+ egress: this.fb.array([]),
225
+ policyTypes: this.fb.control([]),
226
+ });
227
+ return this.fb.group({
228
+ metadata: metadataForm,
229
+ spec: specForm,
230
+ });
231
+ }
232
+ getOnFormArrayResizeFn() {
233
+ return () => {
234
+ return this.fb.control({});
235
+ };
236
+ }
237
+ adaptResourceModel(resource) {
238
+ if (!resource) {
239
+ return resource;
240
+ }
241
+ this.updateRuleDisabledStateMap(resource);
242
+ if (this.ruleDisabledStateMap.ingress) {
243
+ resource.spec.policyTypes = ['Ingress'];
244
+ }
245
+ if (this.ruleDisabledStateMap.egress) {
246
+ resource.spec.policyTypes = uniq([
247
+ ...(resource.spec.policyTypes ?? []),
248
+ 'Egress',
249
+ ]);
250
+ }
251
+ return resource;
252
+ }
253
+ async ruleDisabledChanged(disabled, policyType) {
254
+ const ruleFormArray = this.form.get([SPEC, policyType]);
255
+ if (disabled) {
256
+ if (ruleFormArray.length > 0) {
257
+ const result = await this.ruleDisabledConfirm(policyType);
258
+ if (result !== 'ok') {
259
+ this.ruleDisabledStateMap[policyType] = false;
260
+ return;
261
+ }
262
+ ruleFormArray.clear();
263
+ }
264
+ this.addPolicyType(policyType);
265
+ this.ruleDisabledStateMap[policyType] = true;
266
+ }
267
+ else {
268
+ this.removePolicyType(policyType);
269
+ this.ruleDisabledStateMap[policyType] = false;
270
+ }
271
+ }
272
+ addRule(policyType) {
273
+ this.form.get([SPEC, policyType]).push(this.fb.control({
274
+ ports: [],
275
+ [policyType === 'ingress' ? 'from' : 'to']: [],
276
+ }));
277
+ this.addPolicyType(policyType);
278
+ }
279
+ removeRule(index, policyType) {
280
+ const ruleFormArray = this?.[policyType === 'ingress'
281
+ ? 'ingressRuleFormArray'
282
+ : 'egressRuleFormArray'];
283
+ ruleFormArray.removeAt(index);
284
+ this.removePolicyType(policyType);
285
+ }
286
+ async ruleDisabledConfirm(policyType) {
287
+ return await this.dialog
288
+ .confirm({
289
+ title: this.translate.get('network.disabled_rule_confirm', {
290
+ direction: this.translate.get(`network.direction_${policyType}`),
291
+ }),
292
+ confirmType: ConfirmType.Warning,
293
+ confirmText: this.translate.get('network.block'),
294
+ cancelText: this.translate.get('cancel'),
295
+ })
296
+ .then(() => 'ok')
297
+ .catch(() => 'cancel');
298
+ }
299
+ addPolicyType(policyType) {
300
+ const policyTypesCtrl = this.form.get([SPEC, 'policyTypes']);
301
+ const updatedPolicyTypes = uniq([
302
+ ...policyTypesCtrl.value,
303
+ policyType === 'ingress' ? 'Ingress' : 'Egress',
304
+ ]);
305
+ policyTypesCtrl.setValue(updatedPolicyTypes);
306
+ }
307
+ removePolicyType(policyType) {
308
+ const policyTypesCtrl = this.form.get([SPEC, 'policyTypes']);
309
+ const policyTypes = policyTypesCtrl.value;
310
+ const ruleFormArray = this?.[policyType === 'ingress'
311
+ ? 'ingressRuleFormArray'
312
+ : 'egressRuleFormArray'];
313
+ if (ruleFormArray.length === 0) {
314
+ const policyTypeToRemove = policyType === 'ingress' ? 'Ingress' : 'Egress';
315
+ const updatedPolicyTypes = policyTypes.filter(type => type !== policyTypeToRemove);
316
+ policyTypesCtrl.setValue(updatedPolicyTypes);
317
+ }
318
+ }
319
+ updateRuleDisabledStateMap(resource) {
320
+ const policyTypes = resource?.spec?.policyTypes;
321
+ const ruleTypes = ['ingress', 'egress'];
322
+ if (!policyTypes?.length &&
323
+ !ruleTypes.some(type => has(resource.spec, type))) {
324
+ this.ruleDisabledStateMap.ingress = true;
325
+ return;
326
+ }
327
+ policyTypes?.forEach(policyType => {
328
+ const type = policyType.toLowerCase();
329
+ this.ruleDisabledStateMap[type] = !resource.spec[type]?.length;
330
+ });
331
+ }
332
+ static { this.ɵfac = function NetworkPolicyFormComponent_Factory(t) { return new (t || NetworkPolicyFormComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.K8sUtilService), i0.ɵɵdirectiveInject(i1.TranslateService), i0.ɵɵdirectiveInject(i2.DialogService)); }; }
333
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NetworkPolicyFormComponent, selectors: [["acl-network-policy-form"]], inputs: { baseParams: "baseParams", isUpdate: "isUpdate" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 34, vars: 36, consts: [["zeroStateTemplate", ""], ["emptyTemplate", ""], ["auiForm", "", "aclScrollToFirstInvalid", "", 3, "formGroup"], ["formGroupName", "metadata"], ["width", "large"], ["auiFormItemLabel", ""], ["type", "text", "aui-input", "", "required", "", "auiFormItemControl", "", "formControlName", "name", "maxlength", "63", 3, "placeholder", "aclReadonlyField"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["formGroupName", "annotations"], ["auiFormItemControl", "", "type", "text", "aui-input", "", 3, "formControlName"], [1, "rc-secondary-title"], ["formGroupName", "spec"], ["formGroupName", "podSelector"], ["auiFormItemControl", "", "formControlName", "matchLabels", 3, "zeroStateTemplate", "validator", "errorMapper"], ["auiFormItemHint", ""], [3, "hint", "baseParams", "podLabelSelector"], [4, "ngFor", "ngForOf"], [1, "empty-placeholder", "!tw-border-0", "!tw-min-h-[48px]", "!tw-py-14"], [1, "tw-flex", "tw-w-full", "tw-items-center"], [1, "tw-flex", "tw-mb-16", "tw-ml-16", "tw-justify-between", "tw-flex-1"], ["aui-button", "primary", "type", "button", 3, "click", "plain", "disabled"], ["icon", "plus_circle_s"], [3, "valueChange", "value"], [4, "declare"], [4, "ngIf"], ["formGroupName", "spec", "type", "card"], [3, "closeable", "close", 4, "ngFor", "ngForOf"], [3, "close", "closeable"], [4, "auiTabLabel"], [3, "formControl", "baseParams", "policyType"], ["class", "icon--error", "icon", "xmark_circle_s", "size", "16", 4, "ngIf"], ["icon", "xmark_circle_s", "size", "16", 1, "icon--error"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tw-pt-[40px]", "tw-text-center", "tw-pb-[40px]", "tw-bg-n-9"], ["class", "tw-text-n-4", 4, "ngIf"], [1, "tw-text-n-4"]], template: function NetworkPolicyFormComponent_Template(rf, ctx) { if (rf & 1) {
334
+ i0.ɵɵelementStart(0, "form", 2);
335
+ i0.ɵɵelementContainerStart(1, 3);
336
+ i0.ɵɵelementStart(2, "aui-form-item", 4)(3, "label", 5);
337
+ i0.ɵɵtext(4);
338
+ i0.ɵɵpipe(5, "translate");
339
+ i0.ɵɵelementEnd();
340
+ i0.ɵɵelement(6, "input", 6);
341
+ i0.ɵɵpipe(7, "translate");
342
+ i0.ɵɵelement(8, "acl-errors-mapper", 7);
343
+ i0.ɵɵpipe(9, "translate");
344
+ i0.ɵɵelementEnd();
345
+ i0.ɵɵelementContainerStart(10, 8);
346
+ i0.ɵɵelementStart(11, "aui-form-item", 4)(12, "label", 5);
347
+ i0.ɵɵtext(13);
348
+ i0.ɵɵpipe(14, "translate");
349
+ i0.ɵɵelementEnd();
350
+ i0.ɵɵelement(15, "input", 9);
351
+ i0.ɵɵelementEnd();
352
+ i0.ɵɵelementContainerEnd()();
353
+ i0.ɵɵelementStart(16, "div", 10);
354
+ i0.ɵɵtext(17);
355
+ i0.ɵɵpipe(18, "translate");
356
+ i0.ɵɵelementEnd();
357
+ i0.ɵɵelementContainerStart(19, 11);
358
+ i0.ɵɵelementStart(20, "aui-form-item", 12)(21, "label", 5);
359
+ i0.ɵɵtext(22);
360
+ i0.ɵɵpipe(23, "translate");
361
+ i0.ɵɵelementEnd();
362
+ i0.ɵɵelement(24, "acl-key-value-form-table", 13);
363
+ i0.ɵɵpipe(25, "async");
364
+ i0.ɵɵelementStart(26, "div", 14);
365
+ i0.ɵɵelement(27, "acl-pod-preview", 15);
366
+ i0.ɵɵpipe(28, "translate");
367
+ i0.ɵɵelementEnd();
368
+ i0.ɵɵtemplate(29, NetworkPolicyFormComponent_ng_template_29_Template, 3, 3, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
369
+ i0.ɵɵelementEnd();
370
+ i0.ɵɵelementContainerEnd();
371
+ i0.ɵɵtemplate(31, NetworkPolicyFormComponent_ng_container_31_Template, 15, 22, "ng-container", 16)(32, NetworkPolicyFormComponent_ng_template_32_Template, 3, 2, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
372
+ i0.ɵɵelementEnd();
373
+ } if (rf & 2) {
374
+ const zeroStateTemplate_r13 = i0.ɵɵreference(30);
375
+ i0.ɵɵproperty("formGroup", ctx.form);
376
+ i0.ɵɵadvance(4);
377
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 17, "name"), " ");
378
+ i0.ɵɵadvance(2);
379
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(7, 19, ctx.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip))("aclReadonlyField", ctx.isUpdate);
380
+ i0.ɵɵadvance(2);
381
+ i0.ɵɵproperty("errors", ctx.form.get("metadata.name").errors)("errorsMapper", i0.ɵɵpureFunction1(33, _c0, i0.ɵɵpipeBind1(9, 21, ctx.K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip)));
382
+ i0.ɵɵadvance(5);
383
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 23, "display_name"));
384
+ i0.ɵɵadvance(2);
385
+ i0.ɵɵproperty("formControlName", ctx.displayNameKey);
386
+ i0.ɵɵadvance(2);
387
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(18, 25, "network.target_pod"), " ");
388
+ i0.ɵɵadvance(5);
389
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(23, 27, "network.pod_selector"), " ");
390
+ i0.ɵɵadvance(2);
391
+ i0.ɵɵproperty("zeroStateTemplate", zeroStateTemplate_r13)("validator", ctx.labelValidator)("errorMapper", i0.ɵɵpipeBind1(25, 29, ctx.labelErrorMapper$));
392
+ i0.ɵɵadvance(3);
393
+ i0.ɵɵproperty("hint", i0.ɵɵpipeBind1(28, 31, "network.target_pod_affected_by_strategy_hint"))("baseParams", ctx.baseParams)("podLabelSelector", ctx.form.get(i0.ɵɵpureFunction0(35, _c1)).value);
394
+ i0.ɵɵadvance(4);
395
+ i0.ɵɵproperty("ngForOf", ctx.PolicyTypes);
396
+ } }, dependencies: [EffectDirectiveModule, i1.E2eAttributeBindingDirective, i1.ValidatorsDirective, CommonModule, i3.NgForOf, i3.NgIf, i3.NgTemplateOutlet, i3.AsyncPipe, ReactiveFormsModule, i4.ɵNgNoValidate, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgControlStatusGroup, i4.RequiredValidator, i4.MaxLengthValidator, i4.FormControlDirective, i4.FormGroupDirective, i4.FormControlName, i4.FormGroupName, FormModule, i2.FormDirective, i2.FormItemComponent, i2.FormItemErrorDirective, i2.FormItemHintDirective, i2.FormItemLabelDirective, i2.FormItemControlDirective, KeyValueFormTableComponent,
397
+ PodPreviewComponent,
398
+ TabsModule, i2.TabGroupComponent, i2.TabComponent, i2.TabLabelDirective, ButtonModule, i2.ButtonComponent, IconModule, i2.IconComponent, InputModule, i2.InputComponent, CheckboxModule, i2.CheckboxComponent, i1.TranslatePipe, i1.ErrorsMapperComponent, DeclareDirective,
399
+ NetworkPolicyRuleFormComponent,
400
+ ReadonlyFieldDirective], encapsulation: 2, changeDetection: 0 }); }
401
+ }
402
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NetworkPolicyFormComponent, [{
403
+ type: Component,
404
+ args: [{ standalone: true, selector: 'acl-network-policy-form', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
405
+ EffectDirectiveModule,
406
+ CommonModule,
407
+ ReactiveFormsModule,
408
+ FormModule,
409
+ KeyValueFormTableComponent,
410
+ PodPreviewComponent,
411
+ TabsModule,
412
+ ButtonModule,
413
+ IconModule,
414
+ InputModule,
415
+ CheckboxModule,
416
+ TRANSLATE_MODULE,
417
+ ERRORS_MAPPER_MODULE,
418
+ DeclareDirective,
419
+ NetworkPolicyRuleFormComponent,
420
+ ReadonlyFieldDirective,
421
+ ], template: "<form\n [formGroup]=\"form\"\n auiForm\n aclScrollToFirstInvalid\n>\n <ng-container formGroupName=\"metadata\">\n <aui-form-item width=\"large\">\n <label auiFormItemLabel>\n {{ 'name' | translate }}\n </label>\n <input\n type=\"text\"\n aui-input\n required\n auiFormItemControl\n [placeholder]=\"K8S_RESOURCE_NAME_START_WITH_CHARS_ONLY.tip | translate\"\n formControlName=\"name\"\n maxlength=\"63\"\n [aclReadonlyField]=\"isUpdate\"\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 <ng-container formGroupName=\"annotations\">\n <aui-form-item width=\"large\">\n <label auiFormItemLabel>{{ 'display_name' | translate }}</label>\n <input\n auiFormItemControl\n type=\"text\"\n aui-input\n [formControlName]=\"displayNameKey\"\n />\n </aui-form-item>\n </ng-container>\n </ng-container>\n\n <div class=\"rc-secondary-title\">\n {{ 'network.target_pod' | translate }}\n </div>\n <ng-container formGroupName=\"spec\">\n <aui-form-item formGroupName=\"podSelector\">\n <label auiFormItemLabel>\n {{ 'network.pod_selector' | translate }}\n </label>\n <acl-key-value-form-table\n auiFormItemControl\n [zeroStateTemplate]=\"zeroStateTemplate\"\n formControlName=\"matchLabels\"\n [validator]=\"labelValidator\"\n [errorMapper]=\"labelErrorMapper$ | async\"\n ></acl-key-value-form-table>\n <div auiFormItemHint>\n <acl-pod-preview\n [hint]=\"'network.target_pod_affected_by_strategy_hint' | translate\"\n [baseParams]=\"baseParams\"\n [podLabelSelector]=\"\n form.get(['spec', 'podSelector', 'matchLabels']).value\n \"\n ></acl-pod-preview>\n </div>\n <ng-template #zeroStateTemplate>\n <span\n class=\"empty-placeholder !tw-border-0 !tw-min-h-[48px] !tw-py-14\"\n >{{ 'network.target_pod_selector_no_data_tip' | translate }}</span\n >\n </ng-template>\n </aui-form-item>\n </ng-container>\n\n <ng-container *ngFor=\"let policyType of PolicyTypes; let i = index\">\n <div\n class=\"tw-flex tw-w-full tw-items-center\"\n [class]=\"i === 1 ? 'tw-mt-16' : ''\"\n >\n <div class=\"rc-secondary-title\">\n {{ 'network.direction_' + policyType | translate }}\n </div>\n <div class=\"tw-flex tw-mb-16 tw-ml-16 tw-justify-between tw-flex-1\">\n <button\n aui-button=\"primary\"\n [plain]=\"true\"\n type=\"button\"\n [disabled]=\"ruleDisabledStateMap[policyType]\"\n (click)=\"addRule(policyType)\"\n >\n <aui-icon icon=\"plus_circle_s\"></aui-icon>\n {{ 'add_xxx' | translate: { xxx: (policyType | translate) } }}\n </button>\n <aui-checkbox\n [value]=\"ruleDisabledStateMap[policyType]\"\n (valueChange)=\"ruleDisabledChanged($event, policyType)\"\n >{{\n 'network.block_all_' + policyType + '_traffic' | translate\n }}</aui-checkbox\n >\n </div>\n </div>\n <ng-container\n *declare=\"\n $any(this.form.get(['spec', policyType])).controls as ruleControls\n \"\n >\n <ng-container\n *ngIf=\"!ruleDisabledStateMap[policyType] && ruleControls.length\"\n >\n <aui-tab-group\n formGroupName=\"spec\"\n type=\"card\"\n >\n <aui-tab\n *ngFor=\"let item of ruleControls; index as index\"\n [closeable]=\"true\"\n (close)=\"removeRule(index, policyType)\"\n >\n <ng-container *ngIf=\"item as control\">\n <ng-container *auiTabLabel>\n <aui-icon\n *ngIf=\"control.invalid && control.dirty\"\n class=\"icon--error\"\n icon=\"xmark_circle_s\"\n size=\"16\"\n ></aui-icon>\n <span>\n {{ policyType | translate }}\n </span>\n </ng-container>\n\n <acl-network-policy-rule-form\n [formControl]=\"$any(control)\"\n [baseParams]=\"baseParams\"\n [policyType]=\"policyType\"\n ></acl-network-policy-rule-form>\n </ng-container>\n </aui-tab>\n </aui-tab-group>\n </ng-container>\n <ng-container\n *ngIf=\"!ruleControls.length || ruleDisabledStateMap[policyType]\"\n >\n <ng-container\n [ngTemplateOutlet]=\"emptyTemplate\"\n [ngTemplateOutletContext]=\"{\n policyType: policyType,\n ruleDisabled: ruleDisabledStateMap[policyType]\n }\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template\n #emptyTemplate\n let-policyType=\"policyType\"\n let-ruleDisabled=\"ruleDisabled\"\n >\n <div class=\"tw-pt-[40px] tw-text-center tw-pb-[40px] tw-bg-n-9\">\n <span\n class=\"tw-text-n-4\"\n *ngIf=\"!ruleDisabled\"\n >\n {{ 'network.' + policyType + '_rule_no_data_tip' | translate }}\n </span>\n <span *ngIf=\"ruleDisabled\">{{\n 'network.block_all_' + policyType + '_tip' | translate\n }}</span>\n </div>\n </ng-template>\n</form>\n" }]
422
+ }], () => [{ type: i0.Injector }, { type: i1.K8sUtilService }, { type: i1.TranslateService }, { type: i2.DialogService }], { baseParams: [{
423
+ type: Input,
424
+ args: [{ required: true }]
425
+ }], isUpdate: [{
426
+ type: Input
427
+ }] }); })();
428
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NetworkPolicyFormComponent, { className: "NetworkPolicyFormComponent", filePath: "lib/features/network-policy/form/network-policy/component.ts", lineNumber: 68 }); })();
429
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvZmVhdHVyZXMvbmV0d29yay1wb2xpY3kvZm9ybS9uZXR3b3JrLXBvbGljeS9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9mZWF0dXJlcy9uZXR3b3JrLXBvbGljeS9mb3JtL25ldHdvcmstcG9saWN5L3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixjQUFjLEVBQ2QsV0FBVyxFQUNYLGFBQWEsRUFDYixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxVQUFVLEdBQ1gsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUNMLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQix1Q0FBdUMsRUFDdkMsY0FBYyxFQUNkLDBCQUEwQixFQUMxQixzQkFBc0IsRUFDdEIsSUFBSSxFQUNKLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFFaEIsK0JBQStCLEVBQy9CLHlCQUF5QixHQUMxQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUd2RSxPQUFPLEVBQUUsbUJBQW1C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ICBCdXR0b25Nb2R1bGUsXG4gIENoZWNrYm94TW9kdWxlLFxuICBDb25maXJtVHlwZSxcbiAgRGlhbG9nU2VydmljZSxcbiAgRm9ybU1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSW5wdXRNb2R1bGUsXG4gIFRhYnNNb2R1bGUsXG59IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHtcbiAgRElTUExBWV9OQU1FLFxuICBEZWNsYXJlRGlyZWN0aXZlLFxuICBFUlJPUlNfTUFQUEVSX01PRFVMRSxcbiAgRWZmZWN0RGlyZWN0aXZlTW9kdWxlLFxuICBLOFNfUkVTT1VSQ0VfTkFNRV9TVEFSVF9XSVRIX0NIQVJTX09OTFksXG4gIEs4c1V0aWxTZXJ2aWNlLFxuICBLZXlWYWx1ZUZvcm1UYWJsZUNvbXBvbmVudCxcbiAgUmVhZG9ubHlGaWVsZERpcmVjdGl2ZSxcbiAgU1BFQyxcbiAgVFJBTlNMQVRFX01PRFVMRSxcbiAgVHJhbnNsYXRlU2VydmljZSxcbiAgV29ya3NwYWNlLFxuICBnZXRLOHNSZXNvdXJjZUxhYmVsRXJyb3JNYXBwZXIkLFxuICBrOHNSZXNvdXJjZUxhYmVsVmFsaWRhdG9yLFxufSBmcm9tICdAYWxhdWRhLWZlL2NvbW1vbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgVmFsaWRhdG9ycywgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGhhcywgdW5pcSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCYXNlUmVzb3VyY2VGb3JtR3JvdXBDb21wb25lbnQgfSBmcm9tICduZy1yZXNvdXJjZS1mb3JtLXV0aWwnO1xuXG5pbXBvcnQgeyBOZXR3b3JrUG9saWN5LCBQb2xpY3lUeXBlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdHlwZXMvazhzLWV4cG9ydHMnO1xuaW1wb3J0IHsgUG9kUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcG9kLXJldmlldy9jb21wb25lbnQnO1xuaW1wb3J0IHsgTmV0d29ya1BvbGljeVJ1bGVGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmV0d29yay1wb2xpY3ktcnVsZS9jb21wb25lbnQnO1xuXG5jb25zdCBQb2xpY3lUeXBlcyA9IFsnaW5ncmVzcycsICdlZ3Jlc3MnXSBhcyBjb25zdDtcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLW5ldHdvcmstcG9saWN5LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ3RlbXBsYXRlLmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIEVmZmVjdERpcmVjdGl2ZU1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3JtTW9kdWxlLFxuICAgIEtleVZhbHVlRm9ybVRhYmxlQ29tcG9uZW50LFxuICAgIFBvZFByZXZpZXdDb21wb25lbnQsXG4gICAgVGFic01vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBJbnB1dE1vZHVsZSxcbiAgICBDaGVja2JveE1vZHVsZSxcbiAgICBUUkFOU0xBVEVfTU9EVUxFLFxuICAgIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICAgIERlY2xhcmVEaXJlY3RpdmUsXG4gICAgTmV0d29ya1BvbGljeVJ1bGVGb3JtQ29tcG9uZW50LFxuICAgIFJlYWRvbmx5RmllbGREaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ldHdvcmtQb2xpY3lGb3JtQ29tcG9uZW50IGV4dGVuZHMgQmFzZVJlc291cmNlRm9ybUdyb3VwQ29tcG9uZW50PE5ldHdvcmtQb2xpY3k+IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgYmFzZVBhcmFtczogV29ya3NwYWNlO1xuXG4gIEBJbnB1dCgpXG4gIGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgZ2V0IGluZ3Jlc3NSdWxlRm9ybUFycmF5KCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFtTUEVDLCAnaW5ncmVzcyddKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBnZXQgaW5ncmVzc1J1bGVDb250cm9scygpIHtcbiAgICByZXR1cm4gdGhpcy5pbmdyZXNzUnVsZUZvcm1BcnJheS5jb250cm9scyA/PyBbXTtcbiAgfVxuXG4gIGdldCBlZ3Jlc3NSdWxlRm9ybUFycmF5KCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFtTUEVDLCAnZWdyZXNzJ10pIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldCBlZ3Jlc3NSdWxlQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuIFsuLi4odGhpcy5lZ3Jlc3NSdWxlRm9ybUFycmF5LmNvbnRyb2xzID8/IFtdKV07XG4gIH1cblxuICBLOFNfUkVTT1VSQ0VfTkFNRV9TVEFSVF9XSVRIX0NIQVJTX09OTFkgPVxuICAgIEs4U19SRVNPVVJDRV9OQU1FX1NUQVJUX1dJVEhfQ0hBUlNfT05MWTtcblxuICBsYWJlbFZhbGlkYXRvciA9IGs4c1Jlc291cmNlTGFiZWxWYWxpZGF0b3I7XG4gIGxhYmVsRXJyb3JNYXBwZXIkID0gZ2V0SzhzUmVzb3VyY2VMYWJlbEVycm9yTWFwcGVyJCh0aGlzLnRyYW5zbGF0ZSk7XG4gIFBvbGljeVR5cGVzID0gUG9saWN5VHlwZXM7XG4gIGRpc3BsYXlOYW1lS2V5ID0gdGhpcy5rOHNVdGlsLm5vcm1hbGl6ZVR5cGUoRElTUExBWV9OQU1FKTtcbiAgcnVsZURpc2FibGVkU3RhdGVNYXA6IFJlY29yZDwnaW5ncmVzcycgfCAnZWdyZXNzJywgYm9vbGVhbj4gPSB7XG4gICAgaW5ncmVzczogZmFsc2UsXG4gICAgZWdyZXNzOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNVdGlsOiBLOHNVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZzogRGlhbG9nU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY3JlYXRlRm9ybSgpIHtcbiAgICBjb25zdCBtZXRhZGF0YUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IHRoaXMuZmIuY29udHJvbCgnJywgW1xuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oSzhTX1JFU09VUkNFX05BTUVfU1RBUlRfV0lUSF9DSEFSU19PTkxZLnBhdHRlcm4pLFxuICAgICAgXSksXG4gICAgICBuYW1lc3BhY2U6IHRoaXMuZmIuY29udHJvbCgnJyksXG4gICAgICBhbm5vdGF0aW9uczogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIFt0aGlzLmRpc3BsYXlOYW1lS2V5XTogdGhpcy5mYi5jb250cm9sKCcnKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IHNwZWNGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBwb2RTZWxlY3RvcjogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG1hdGNoTGFiZWxzOiB0aGlzLmZiLmNvbnRyb2wobnVsbCksXG4gICAgICB9KSxcbiAgICAgIGluZ3Jlc3M6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgZWdyZXNzOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIHBvbGljeVR5cGVzOiB0aGlzLmZiLmNvbnRyb2woW10pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhRm9ybSxcbiAgICAgIHNwZWM6IHNwZWNGb3JtLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0T25Gb3JtQXJyYXlSZXNpemVGbigpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZmIuY29udHJvbCh7fSk7XG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFkYXB0UmVzb3VyY2VNb2RlbChyZXNvdXJjZTogTmV0d29ya1BvbGljeSk6IE5ldHdvcmtQb2xpY3kge1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVJ1bGVEaXNhYmxlZFN0YXRlTWFwKHJlc291cmNlKTtcblxuICAgIGlmICh0aGlzLnJ1bGVEaXNhYmxlZFN0YXRlTWFwLmluZ3Jlc3MpIHtcbiAgICAgIHJlc291cmNlLnNwZWMucG9saWN5VHlwZXMgPSBbJ0luZ3Jlc3MnXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ydWxlRGlzYWJsZWRTdGF0ZU1hcC5lZ3Jlc3MpIHtcbiAgICAgIHJlc291cmNlLnNwZWMucG9saWN5VHlwZXMgPSB1bmlxKFtcbiAgICAgICAgLi4uKHJlc291cmNlLnNwZWMucG9saWN5VHlwZXMgPz8gW10pLFxuICAgICAgICAnRWdyZXNzJyxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIGFzeW5jIHJ1bGVEaXNhYmxlZENoYW5nZWQoXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4sXG4gICAgcG9saWN5VHlwZTogTG93ZXJjYXNlPFBvbGljeVR5cGU+LFxuICApIHtcbiAgICBjb25zdCBydWxlRm9ybUFycmF5ID0gdGhpcy5mb3JtLmdldChbU1BFQywgcG9saWN5VHlwZV0pIGFzIEZvcm1BcnJheTtcblxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgaWYgKHJ1bGVGb3JtQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bGVEaXNhYmxlZENvbmZpcm0ocG9saWN5VHlwZSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09ICdvaycpIHtcbiAgICAgICAgICB0aGlzLnJ1bGVEaXNhYmxlZFN0YXRlTWFwW3BvbGljeVR5cGVdID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJ1bGVGb3JtQXJyYXkuY2xlYXIoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hZGRQb2xpY3lUeXBlKHBvbGljeVR5cGUpO1xuICAgICAgdGhpcy5ydWxlRGlzYWJsZWRTdGF0ZU1hcFtwb2xpY3lUeXBlXSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlUG9saWN5VHlwZShwb2xpY3lUeXBlKTtcbiAgICAgIHRoaXMucnVsZURpc2FibGVkU3RhdGVNYXBbcG9saWN5VHlwZV0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhZGRSdWxlKHBvbGljeVR5cGU6IExvd2VyY2FzZTxQb2xpY3lUeXBlPikge1xuICAgICh0aGlzLmZvcm0uZ2V0KFtTUEVDLCBwb2xpY3lUeXBlXSkgYXMgRm9ybUFycmF5KS5wdXNoKFxuICAgICAgdGhpcy5mYi5jb250cm9sKHtcbiAgICAgICAgcG9ydHM6IFtdLFxuICAgICAgICBbcG9saWN5VHlwZSA9PT0gJ2luZ3Jlc3MnID8gJ2Zyb20nIDogJ3RvJ106IFtdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuYWRkUG9saWN5VHlwZShwb2xpY3lUeXBlKTtcbiAgfVxuXG4gIHJlbW92ZVJ1bGUoaW5kZXg6IG51bWJlciwgcG9saWN5VHlwZTogTG93ZXJjYXNlPFBvbGljeVR5cGU+KSB7XG4gICAgY29uc3QgcnVsZUZvcm1BcnJheSA9XG4gICAgICB0aGlzPy5bXG4gICAgICAgIHBvbGljeVR5cGUgPT09ICdpbmdyZXNzJ1xuICAgICAgICAgID8gJ2luZ3Jlc3NSdWxlRm9ybUFycmF5J1xuICAgICAgICAgIDogJ2VncmVzc1J1bGVGb3JtQXJyYXknXG4gICAgICBdO1xuXG4gICAgcnVsZUZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG5cbiAgICB0aGlzLnJlbW92ZVBvbGljeVR5cGUocG9saWN5VHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bGVEaXNhYmxlZENvbmZpcm0ocG9saWN5VHlwZTogTG93ZXJjYXNlPFBvbGljeVR5cGU+KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZGlhbG9nXG4gICAgICAuY29uZmlybSh7XG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ25ldHdvcmsuZGlzYWJsZWRfcnVsZV9jb25maXJtJywge1xuICAgICAgICAgIGRpcmVjdGlvbjogdGhpcy50cmFuc2xhdGUuZ2V0KGBuZXR3b3JrLmRpcmVjdGlvbl8ke3BvbGljeVR5cGV9YCksXG4gICAgICAgIH0pLFxuICAgICAgICBjb25maXJtVHlwZTogQ29uZmlybVR5cGUuV2FybmluZyxcbiAgICAgICAgY29uZmlybVRleHQ6IHRoaXMudHJhbnNsYXRlLmdldCgnbmV0d29yay5ibG9jaycpLFxuICAgICAgICBjYW5jZWxUZXh0OiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2NhbmNlbCcpLFxuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+ICdvaycpXG4gICAgICAuY2F0Y2goKCkgPT4gJ2NhbmNlbCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQb2xpY3lUeXBlKHBvbGljeVR5cGU6IExvd2VyY2FzZTxQb2xpY3lUeXBlPikge1xuICAgIGNvbnN0IHBvbGljeVR5cGVzQ3RybCA9IHRoaXMuZm9ybS5nZXQoW1NQRUMsICdwb2xpY3lUeXBlcyddKTtcblxuICAgIGNvbnN0IHVwZGF0ZWRQb2xpY3lUeXBlcyA9IHVuaXEoW1xuICAgICAgLi4ucG9saWN5VHlwZXNDdHJsLnZhbHVlLFxuICAgICAgcG9saWN5VHlwZSA9PT0gJ2luZ3Jlc3MnID8gJ0luZ3Jlc3MnIDogJ0VncmVzcycsXG4gICAgXSk7XG5cbiAgICBwb2xpY3lUeXBlc0N0cmwuc2V0VmFsdWUodXBkYXRlZFBvbGljeVR5cGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUG9saWN5VHlwZShwb2xpY3lUeXBlOiBMb3dlcmNhc2U8UG9saWN5VHlwZT4pIHtcbiAgICBjb25zdCBwb2xpY3lUeXBlc0N0cmwgPSB0aGlzLmZvcm0uZ2V0KFtTUEVDLCAncG9saWN5VHlwZXMnXSk7XG4gICAgY29uc3QgcG9saWN5VHlwZXMgPSBwb2xpY3lUeXBlc0N0cmwudmFsdWUgYXMgUG9saWN5VHlwZVtdO1xuICAgIGNvbnN0IHJ1bGVGb3JtQXJyYXkgPVxuICAgICAgdGhpcz8uW1xuICAgICAgICBwb2xpY3lUeXBlID09PSAnaW5ncmVzcydcbiAgICAgICAgICA/ICdpbmdyZXNzUnVsZUZvcm1BcnJheSdcbiAgICAgICAgICA6ICdlZ3Jlc3NSdWxlRm9ybUFycmF5J1xuICAgICAgXTtcblxuICAgIGlmIChydWxlRm9ybUFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcG9saWN5VHlwZVRvUmVtb3ZlID1cbiAgICAgICAgcG9saWN5VHlwZSA9PT0gJ2luZ3Jlc3MnID8gJ0luZ3Jlc3MnIDogJ0VncmVzcyc7XG4gICAgICBjb25zdCB1cGRhdGVkUG9saWN5VHlwZXMgPSBwb2xpY3lUeXBlcy5maWx0ZXIoXG4gICAgICAgIHR5cGUgPT4gdHlwZSAhPT0gcG9saWN5VHlwZVRvUmVtb3ZlLFxuICAgICAgKTtcbiAgICAgIHBvbGljeVR5cGVzQ3RybC5zZXRWYWx1ZSh1cGRhdGVkUG9saWN5VHlwZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUnVsZURpc2FibGVkU3RhdGVNYXAocmVzb3VyY2U6IE5ldHdvcmtQb2xpY3kpIHtcbiAgICBjb25zdCBwb2xpY3lUeXBlcyA9IHJlc291cmNlPy5zcGVjPy5wb2xpY3lUeXBlcztcbiAgICBjb25zdCBydWxlVHlwZXMgPSBbJ2luZ3Jlc3MnLCAnZWdyZXNzJ107XG5cbiAgICBpZiAoXG4gICAgICAhcG9saWN5VHlwZXM/Lmxlbmd0aCAmJlxuICAgICAgIXJ1bGVUeXBlcy5zb21lKHR5cGUgPT4gaGFzKHJlc291cmNlLnNwZWMsIHR5cGUpKVxuICAgICkge1xuICAgICAgdGhpcy5ydWxlRGlzYWJsZWRTdGF0ZU1hcC5pbmdyZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwb2xpY3lUeXBlcz8uZm9yRWFjaChwb2xpY3lUeXBlID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBwb2xpY3lUeXBlLnRvTG93ZXJDYXNlKCkgYXMgTG93ZXJjYXNlPFBvbGljeVR5cGU+O1xuICAgICAgdGhpcy5ydWxlRGlzYWJsZWRTdGF0ZU1hcFt0eXBlXSA9ICFyZXNvdXJjZS5zcGVjW3R5cGVdPy5sZW5ndGg7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxmb3JtXG4gIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gIGF1aUZvcm1cbiAgYWNsU2Nyb2xsVG9GaXJzdEludmFsaWRcbj5cbiAgPG5nLWNvbnRhaW5lciBmb3JtR3JvdXBOYW1lPVwibWV0YWRhdGFcIj5cbiAgICA8YXVpLWZvcm0taXRlbSB3aWR0aD1cImxhcmdlXCI+XG4gICAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD5cbiAgICAgICAge3sgJ25hbWUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgYXVpLWlucHV0XG4gICAgICAgIHJlcXVpcmVkXG4gICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiSzhTX1JFU09VUkNFX05BTUVfU1RBUlRfV0lUSF9DSEFSU19PTkxZLnRpcCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIlxuICAgICAgICBtYXhsZW5ndGg9XCI2M1wiXG4gICAgICAgIFthY2xSZWFkb25seUZpZWxkXT1cImlzVXBkYXRlXCJcbiAgICAgIC8+XG4gICAgICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICAgICAgYXVpRm9ybUl0ZW1FcnJvclxuICAgICAgICBbZXJyb3JzXT1cImZvcm0uZ2V0KCdtZXRhZGF0YS5uYW1lJykuZXJyb3JzXCJcbiAgICAgICAgW2Vycm9yc01hcHBlcl09XCJ7XG4gICAgICAgICAgcGF0dGVybjogSzhTX1JFU09VUkNFX05BTUVfU1RBUlRfV0lUSF9DSEFSU19PTkxZLnRpcCB8IHRyYW5zbGF0ZVxuICAgICAgICB9XCJcbiAgICAgID48L2FjbC1lcnJvcnMtbWFwcGVyPlxuICAgIDwvYXVpLWZvcm0taXRlbT5cblxuICAgIDxuZy1jb250YWluZXIgZm9ybUdyb3VwTmFtZT1cImFubm90YXRpb25zXCI+XG4gICAgICA8YXVpLWZvcm0taXRlbSB3aWR0aD1cImxhcmdlXCI+XG4gICAgICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdkaXNwbGF5X25hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIGF1aS1pbnB1dFxuICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGlzcGxheU5hbWVLZXlcIlxuICAgICAgICAvPlxuICAgICAgPC9hdWktZm9ybS1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2IGNsYXNzPVwicmMtc2Vjb25kYXJ5LXRpdGxlXCI+XG4gICAge3sgJ25ldHdvcmsudGFyZ2V0X3BvZCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgZm9ybUdyb3VwTmFtZT1cInNwZWNcIj5cbiAgICA8YXVpLWZvcm0taXRlbSBmb3JtR3JvdXBOYW1lPVwicG9kU2VsZWN0b3JcIj5cbiAgICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPlxuICAgICAgICB7eyAnbmV0d29yay5wb2Rfc2VsZWN0b3InIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2xhYmVsPlxuICAgICAgPGFjbC1rZXktdmFsdWUtZm9ybS10YWJsZVxuICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgW3plcm9TdGF0ZVRlbXBsYXRlXT1cInplcm9TdGF0ZVRlbXBsYXRlXCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWF0Y2hMYWJlbHNcIlxuICAgICAgICBbdmFsaWRhdG9yXT1cImxhYmVsVmFsaWRhdG9yXCJcbiAgICAgICAgW2Vycm9yTWFwcGVyXT1cImxhYmVsRXJyb3JNYXBwZXIkIHwgYXN5bmNcIlxuICAgICAgPjwvYWNsLWtleS12YWx1ZS1mb3JtLXRhYmxlPlxuICAgICAgPGRpdiBhdWlGb3JtSXRlbUhpbnQ+XG4gICAgICAgIDxhY2wtcG9kLXByZXZpZXdcbiAgICAgICAgICBbaGludF09XCInbmV0d29yay50YXJnZXRfcG9kX2FmZmVjdGVkX2J5X3N0cmF0ZWd5X2hpbnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYmFzZVBhcmFtc109XCJiYXNlUGFyYW1zXCJcbiAgICAgICAgICBbcG9kTGFiZWxTZWxlY3Rvcl09XCJcbiAgICAgICAgICAgIGZvcm0uZ2V0KFsnc3BlYycsICdwb2RTZWxlY3RvcicsICdtYXRjaExhYmVscyddKS52YWx1ZVxuICAgICAgICAgIFwiXG4gICAgICAgID48L2FjbC1wb2QtcHJldmlldz5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGVUZW1wbGF0ZT5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImVtcHR5LXBsYWNlaG9sZGVyICF0dy1ib3JkZXItMCAhdHctbWluLWgtWzQ4cHhdICF0dy1weS0xNFwiXG4gICAgICAgICAgPnt7ICduZXR3b3JrLnRhcmdldF9wb2Rfc2VsZWN0b3Jfbm9fZGF0YV90aXAnIHwgdHJhbnNsYXRlIH19PC9zcGFuXG4gICAgICAgID5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9hdWktZm9ybS1pdGVtPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwb2xpY3lUeXBlIG9mIFBvbGljeVR5cGVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ0dy1mbGV4IHR3LXctZnVsbCB0dy1pdGVtcy1jZW50ZXJcIlxuICAgICAgW2NsYXNzXT1cImkgPT09IDEgPyAndHctbXQtMTYnIDogJydcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJyYy1zZWNvbmRhcnktdGl0bGVcIj5cbiAgICAgICAge3sgJ25ldHdvcmsuZGlyZWN0aW9uXycgKyBwb2xpY3lUeXBlIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LW1iLTE2IHR3LW1sLTE2IHR3LWp1c3RpZnktYmV0d2VlbiB0dy1mbGV4LTFcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGF1aS1idXR0b249XCJwcmltYXJ5XCJcbiAgICAgICAgICBbcGxhaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInJ1bGVEaXNhYmxlZFN0YXRlTWFwW3BvbGljeVR5cGVdXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkUnVsZShwb2xpY3lUeXBlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YXVpLWljb24gaWNvbj1cInBsdXNfY2lyY2xlX3NcIj48L2F1aS1pY29uPlxuICAgICAgICAgIHt7ICdhZGRfeHh4JyB8IHRyYW5zbGF0ZTogeyB4eHg6IChwb2xpY3lUeXBlIHwgdHJhbnNsYXRlKSB9IH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YXVpLWNoZWNrYm94XG4gICAgICAgICAgW3ZhbHVlXT1cInJ1bGVEaXNhYmxlZFN0YXRlTWFwW3BvbGljeVR5cGVdXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicnVsZURpc2FibGVkQ2hhbmdlZCgkZXZlbnQsIHBvbGljeVR5cGUpXCJcbiAgICAgICAgICA+e3tcbiAgICAgICAgICAgICduZXR3b3JrLmJsb2NrX2FsbF8nICsgcG9saWN5VHlwZSArICdfdHJhZmZpYycgfCB0cmFuc2xhdGVcbiAgICAgICAgICB9fTwvYXVpLWNoZWNrYm94XG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpkZWNsYXJlPVwiXG4gICAgICAgICRhbnkodGhpcy5mb3JtLmdldChbJ3NwZWMnLCBwb2xpY3lUeXBlXSkpLmNvbnRyb2xzIGFzIHJ1bGVDb250cm9sc1xuICAgICAgXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiIXJ1bGVEaXNhYmxlZFN0YXRlTWFwW3BvbGljeVR5cGVdICYmIHJ1bGVDb250cm9scy5sZW5ndGhcIlxuICAgICAgPlxuICAgICAgICA8YXVpLXRhYi1ncm91cFxuICAgICAgICAgIGZvcm1Hcm91cE5hbWU9XCJzcGVjXCJcbiAgICAgICAgICB0eXBlPVwiY2FyZFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YXVpLXRhYlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcnVsZUNvbnRyb2xzOyBpbmRleCBhcyBpbmRleFwiXG4gICAgICAgICAgICBbY2xvc2VhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgKGNsb3NlKT1cInJlbW92ZVJ1bGUoaW5kZXgsIHBvbGljeVR5cGUpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbSBhcyBjb250cm9sXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmF1aVRhYkxhYmVsPlxuICAgICAgICAgICAgICAgIDxhdWktaWNvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250cm9sLmludmFsaWQgJiYgY29udHJvbC5kaXJ0eVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tLWVycm9yXCJcbiAgICAgICAgICAgICAgICAgIGljb249XCJ4bWFya19jaXJjbGVfc1wiXG4gICAgICAgICAgICAgICAgICBzaXplPVwiMTZcIlxuICAgICAgICAgICAgICAgID48L2F1aS1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAge3sgcG9saWN5VHlwZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPGFjbC1uZXR3b3JrLXBvbGljeS1ydWxlLWZvcm1cbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiJGFueShjb250cm9sKVwiXG4gICAgICAgICAgICAgICAgW2Jhc2VQYXJhbXNdPVwiYmFzZVBhcmFtc1wiXG4gICAgICAgICAgICAgICAgW3BvbGljeVR5cGVdPVwicG9saWN5VHlwZVwiXG4gICAgICAgICAgICAgID48L2FjbC1uZXR3b3JrLXBvbGljeS1ydWxlLWZvcm0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2F1aS10YWI+XG4gICAgICAgIDwvYXVpLXRhYi1ncm91cD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIiFydWxlQ29udHJvbHMubGVuZ3RoIHx8IHJ1bGVEaXNhYmxlZFN0YXRlTWFwW3BvbGljeVR5cGVdXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVtcHR5VGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICBwb2xpY3lUeXBlOiBwb2xpY3lUeXBlLFxuICAgICAgICAgICAgcnVsZURpc2FibGVkOiBydWxlRGlzYWJsZWRTdGF0ZU1hcFtwb2xpY3lUeXBlXVxuICAgICAgICAgIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2VtcHR5VGVtcGxhdGVcbiAgICBsZXQtcG9saWN5VHlwZT1cInBvbGljeVR5cGVcIlxuICAgIGxldC1ydWxlRGlzYWJsZWQ9XCJydWxlRGlzYWJsZWRcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInR3LXB0LVs0MHB4XSB0dy10ZXh0LWNlbnRlciB0dy1wYi1bNDBweF0gdHctYmctbi05XCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cInR3LXRleHQtbi00XCJcbiAgICAgICAgKm5nSWY9XCIhcnVsZURpc2FibGVkXCJcbiAgICAgID5cbiAgICAgICAge3sgJ25ldHdvcmsuJyArIHBvbGljeVR5cGUgKyAnX3J1bGVfbm9fZGF0YV90aXAnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cInJ1bGVEaXNhYmxlZFwiPnt7XG4gICAgICAgICduZXR3b3JrLmJsb2NrX2FsbF8nICsgcG9saWN5VHlwZSArICdfdGlwJyB8IHRyYW5zbGF0ZVxuICAgICAgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Zvcm0+XG4iXX0=
@@ -0,0 +1,102 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { FormModule, InputModule } from '@alauda/ui';
3
+ import { ERRORS_MAPPER_MODULE, EffectDirectiveModule, ObservableInput, TRANSLATE_MODULE, bind, publishRef, } from '@alauda-fe/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import { ChangeDetectionStrategy, Component, Injector, Input, } from '@angular/core';
6
+ import { AbstractControl, ReactiveFormsModule, Validators, } from '@angular/forms';
7
+ import { BaseResourceFormGroupComponent } from 'ng-resource-form-util';
8
+ import { Observable, first, map, switchMap, takeUntil } from 'rxjs';
9
+ import { NetworkUtilService } from '../../../../services/network-util.service';
10
+ import { adaptIpMode, isCidrAddressValid, } from '../../../../utils/cidr-exports';
11
+ import { NetworkPolicyExceptRemoteInputFormComponent } from '../network-policy-remote-except-input/component';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "../../../../services/network-util.service";
14
+ import * as i2 from "@alauda-fe/common";
15
+ import * as i3 from "@angular/common";
16
+ import * as i4 from "@angular/forms";
17
+ import * as i5 from "@alauda/ui";
18
+ const _c0 = a0 => ({ cidrPattern: a0 });
19
+ export class NetworkPolicyIpBlockFormComponent extends BaseResourceFormGroupComponent {
20
+ constructor(injector, networkUtil) {
21
+ super(injector);
22
+ this.networkUtil = networkUtil;
23
+ this.networkMode$ = this.cluster$.pipe(switchMap(cluster => this.networkUtil.getNetworkMode$(cluster)), publishRef());
24
+ }
25
+ createForm() {
26
+ return this.fb.group({
27
+ cidr: this.fb.control('', [Validators.required], [this.asyncValidateCidr]),
28
+ except: this.fb.control([]),
29
+ });
30
+ }
31
+ asyncValidateCidr(ctrl) {
32
+ return this.networkMode$.pipe(map(mode => {
33
+ const cidr = ctrl.value;
34
+ const ipMode = adaptIpMode(cidr, mode);
35
+ return cidr && !isCidrAddressValid(cidr, ipMode)
36
+ ? {
37
+ cidrPattern: true,
38
+ }
39
+ : null;
40
+ }), first(), takeUntil(this.destroy$));
41
+ }
42
+ static { this.ɵfac = function NetworkPolicyIpBlockFormComponent_Factory(t) { return new (t || NetworkPolicyIpBlockFormComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.NetworkUtilService)); }; }
43
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NetworkPolicyIpBlockFormComponent, selectors: [["acl-network-policy-ip-block-form"]], inputs: { cluster: "cluster" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 16, vars: 22, consts: [["auiForm", "", 1, "last-form-item-no-margin", 3, "formGroup"], ["width", "medium"], ["auiFormItemLabel", ""], ["aui-input", "", "required", "", "auiFormItemControl", "", "formControlName", "cidr", "type", "text", 3, "placeholder"], ["auiFormItemError", "", 3, "errorsMapper", "errors"], ["auiFormItemControl", "", "formControlName", "except", 1, "tw-w-full", 3, "remoteIpBlock", "networkMode"]], template: function NetworkPolicyIpBlockFormComponent_Template(rf, ctx) { if (rf & 1) {
44
+ i0.ɵɵelementStart(0, "form", 0)(1, "aui-form-item", 1)(2, "label", 2);
45
+ i0.ɵɵtext(3);
46
+ i0.ɵɵpipe(4, "translate");
47
+ i0.ɵɵelementEnd();
48
+ i0.ɵɵelement(5, "input", 3);
49
+ i0.ɵɵpipe(6, "translate");
50
+ i0.ɵɵelement(7, "acl-errors-mapper", 4);
51
+ i0.ɵɵpipe(8, "async");
52
+ i0.ɵɵpipe(9, "translate");
53
+ i0.ɵɵelementEnd();
54
+ i0.ɵɵelementStart(10, "aui-form-item")(11, "label", 2);
55
+ i0.ɵɵtext(12);
56
+ i0.ɵɵpipe(13, "translate");
57
+ i0.ɵɵelementEnd();
58
+ i0.ɵɵelement(14, "acl-network-policy-remote-ip-except-input", 5);
59
+ i0.ɵɵpipe(15, "async");
60
+ i0.ɵɵelementEnd()();
61
+ } if (rf & 2) {
62
+ i0.ɵɵproperty("formGroup", ctx.form);
63
+ i0.ɵɵadvance(3);
64
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 8, "network.cidr"), " ");
65
+ i0.ɵɵadvance(2);
66
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(6, 10, "network.please_input_correct_cidr"));
67
+ i0.ɵɵadvance(2);
68
+ i0.ɵɵproperty("errorsMapper", i0.ɵɵpureFunction1(20, _c0, i0.ɵɵpipeBind1(9, 14, i0.ɵɵpipeBind1(8, 12, ctx.networkMode$) === "v6" ? "network.please_input_correct_ipv6_cidr_with_demo" : "network.please_input_correct_cidr")))("errors", ctx.form.get("cidr").errors);
69
+ i0.ɵɵadvance(5);
70
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(13, 16, "network.except"), " ");
71
+ i0.ɵɵadvance(2);
72
+ i0.ɵɵproperty("remoteIpBlock", ctx.form.get("cidr").value)("networkMode", i0.ɵɵpipeBind1(15, 18, ctx.networkMode$));
73
+ } }, dependencies: [EffectDirectiveModule, i2.ValidatorsDirective, CommonModule, i3.AsyncPipe, ReactiveFormsModule, i4.ɵNgNoValidate, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgControlStatusGroup, i4.RequiredValidator, i4.FormGroupDirective, i4.FormControlName, FormModule, i5.FormDirective, i5.FormItemComponent, i5.FormItemErrorDirective, i5.FormItemLabelDirective, i5.FormItemControlDirective, InputModule, i5.InputComponent, i2.TranslatePipe, i2.ErrorsMapperComponent, NetworkPolicyExceptRemoteInputFormComponent], encapsulation: 2, changeDetection: 0 }); }
74
+ }
75
+ __decorate([
76
+ ObservableInput(),
77
+ __metadata("design:type", Observable)
78
+ ], NetworkPolicyIpBlockFormComponent.prototype, "cluster$", void 0);
79
+ __decorate([
80
+ bind,
81
+ __metadata("design:type", Function),
82
+ __metadata("design:paramtypes", [AbstractControl]),
83
+ __metadata("design:returntype", void 0)
84
+ ], NetworkPolicyIpBlockFormComponent.prototype, "asyncValidateCidr", null);
85
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NetworkPolicyIpBlockFormComponent, [{
86
+ type: Component,
87
+ args: [{ standalone: true, selector: 'acl-network-policy-ip-block-form', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
88
+ EffectDirectiveModule,
89
+ CommonModule,
90
+ ReactiveFormsModule,
91
+ FormModule,
92
+ InputModule,
93
+ TRANSLATE_MODULE,
94
+ ERRORS_MAPPER_MODULE,
95
+ NetworkPolicyExceptRemoteInputFormComponent,
96
+ ], template: "<form\n [formGroup]=\"form\"\n auiForm\n class=\"last-form-item-no-margin\"\n>\n <aui-form-item width=\"medium\">\n <label auiFormItemLabel>\n {{ 'network.cidr' | translate }}\n </label>\n <input\n aui-input\n required\n auiFormItemControl\n formControlName=\"cidr\"\n type=\"text\"\n [placeholder]=\"'network.please_input_correct_cidr' | translate\"\n />\n <acl-errors-mapper\n auiFormItemError\n [errorsMapper]=\"{\n cidrPattern:\n ((networkMode$ | async) === 'v6'\n ? 'network.please_input_correct_ipv6_cidr_with_demo'\n : 'network.please_input_correct_cidr'\n ) | translate\n }\"\n [errors]=\"form.get('cidr').errors\"\n ></acl-errors-mapper>\n </aui-form-item>\n <aui-form-item>\n <label auiFormItemLabel>\n {{ 'network.except' | translate }}\n </label>\n <acl-network-policy-remote-ip-except-input\n auiFormItemControl\n class=\"tw-w-full\"\n [remoteIpBlock]=\"form.get('cidr').value\"\n formControlName=\"except\"\n [networkMode]=\"networkMode$ | async\"\n ></acl-network-policy-remote-ip-except-input>\n </aui-form-item>\n</form>\n" }]
97
+ }], () => [{ type: i0.Injector }, { type: i1.NetworkUtilService }], { cluster: [{
98
+ type: Input,
99
+ args: [{ required: true }]
100
+ }], cluster$: [], asyncValidateCidr: [] }); })();
101
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NetworkPolicyIpBlockFormComponent, { className: "NetworkPolicyIpBlockFormComponent", filePath: "lib/features/network-policy/form/network-policy-ip-block/component.ts", lineNumber: 49 }); })();
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvZmVhdHVyZXMvbmV0d29yay1wb2xpY3kvZm9ybS9uZXR3b3JrLXBvbGljeS1pcC1ibG9jay9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9mZWF0dXJlcy9uZXR3b3JrLXBvbGljeS9mb3JtL25ldHdvcmstcG9saWN5LWlwLWJsb2NrL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsSUFBSSxFQUNKLFVBQVUsR0FDWCxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRS9FLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBQ25CLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxF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ZSwgSW5wdXRNb2R1bGUgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICBFZmZlY3REaXJlY3RpdmVNb2R1bGUsXG4gIE9ic2VydmFibGVJbnB1dCxcbiAgVFJBTlNMQVRFX01PRFVMRSxcbiAgYmluZCxcbiAgcHVibGlzaFJlZixcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJhc2VSZXNvdXJjZUZvcm1Hcm91cENvbXBvbmVudCB9IGZyb20gJ25nLXJlc291cmNlLWZvcm0tdXRpbCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmaXJzdCwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBOZXR3b3JrVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9uZXR3b3JrLXV0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBJUEJsb2NrIH0gZnJvbSAnLi4vLi4vLi4vLi4vdHlwZXMvazhzLWV4cG9ydHMnO1xuaW1wb3J0IHtcbiAgYWRhcHRJcE1vZGUsXG4gIGlzQ2lkckFkZHJlc3NWYWxpZCxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvY2lkci1leHBvcnRzJztcbmltcG9ydCB7IE5ldHdvcmtQb2xpY3lFeGNlcHRSZW1vdGVJbnB1dEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9uZXR3b3JrLXBvbGljeS1yZW1vdGUtZXhjZXB0LWlucHV0L2NvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2FjbC1uZXR3b3JrLXBvbGljeS1pcC1ibG9jay1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBFZmZlY3REaXJlY3RpdmVNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybU1vZHVsZSxcbiAgICBJbnB1dE1vZHVsZSxcbiAgICBUUkFOU0xBVEVfTU9EVUxFLFxuICAgIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICAgIE5ldHdvcmtQb2xpY3lFeGNlcHRSZW1vdGVJbnB1dEZvcm1Db21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ldHdvcmtQb2xpY3lJcEJsb2NrRm9ybUNvbXBvbmVudCBleHRlbmRzIEJhc2VSZXNvdXJjZUZvcm1Hcm91cENvbXBvbmVudDxJUEJsb2NrPiB7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIGNsdXN0ZXI6IHN0cmluZztcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgY2x1c3RlciQhOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgbmV0d29ya01vZGUkID0gdGhpcy5jbHVzdGVyJC5waXBlKFxuICAgIHN3aXRjaE1hcChjbHVzdGVyID0+IHRoaXMubmV0d29ya1V0aWwuZ2V0TmV0d29ya01vZGUkKGNsdXN0ZXIpKSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya1V0aWw6IE5ldHdvcmtVdGlsU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY3JlYXRlRm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjaWRyOiB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgICcnLFxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIFt0aGlzLmFzeW5jVmFsaWRhdGVDaWRyXSxcbiAgICAgICksXG4gICAgICBleGNlcHQ6IHRoaXMuZmIuY29udHJvbChbXSksXG4gICAgfSk7XG4gIH1cblxuICBAYmluZFxuICBhc3luY1ZhbGlkYXRlQ2lkcihjdHJsOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gdGhpcy5uZXR3b3JrTW9kZSQucGlwZShcbiAgICAgIG1hcChtb2RlID0+IHtcbiAgICAgICAgY29uc3QgY2lkciA9IGN0cmwudmFsdWUgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBpcE1vZGUgPSBhZGFwdElwTW9kZShjaWRyLCBtb2RlKTtcblxuICAgICAgICByZXR1cm4gY2lkciAmJiAhaXNDaWRyQWRkcmVzc1ZhbGlkKGNpZHIsIGlwTW9kZSlcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY2lkclBhdHRlcm46IHRydWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBudWxsO1xuICAgICAgfSksXG4gICAgICBmaXJzdCgpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICk7XG4gIH1cbn1cbiIsIjxmb3JtXG4gIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gIGF1aUZvcm1cbiAgY2xhc3M9XCJsYXN0LWZvcm0taXRlbS1uby1tYXJnaW5cIlxuPlxuICA8YXVpLWZvcm0taXRlbSB3aWR0aD1cIm1lZGl1bVwiPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPlxuICAgICAge3sgJ25ldHdvcmsuY2lkcicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2xhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgYXVpLWlucHV0XG4gICAgICByZXF1aXJlZFxuICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJjaWRyXCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCInbmV0d29yay5wbGVhc2VfaW5wdXRfY29ycmVjdF9jaWRyJyB8IHRyYW5zbGF0ZVwiXG4gICAgLz5cbiAgICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICAgIFtlcnJvcnNNYXBwZXJdPVwie1xuICAgICAgICBjaWRyUGF0dGVybjpcbiAgICAgICAgICAoKG5ldHdvcmtNb2RlJCB8IGFzeW5jKSA9PT0gJ3Y2J1xuICAgICAgICAgICAgPyAnbmV0d29yay5wbGVhc2VfaW5wdXRfY29ycmVjdF9pcHY2X2NpZHJfd2l0aF9kZW1vJ1xuICAgICAgICAgICAgOiAnbmV0d29yay5wbGVhc2VfaW5wdXRfY29ycmVjdF9jaWRyJ1xuICAgICAgICAgICkgfCB0cmFuc2xhdGVcbiAgICAgIH1cIlxuICAgICAgW2Vycm9yc109XCJmb3JtLmdldCgnY2lkcicpLmVycm9yc1wiXG4gICAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG4gIDwvYXVpLWZvcm0taXRlbT5cbiAgPGF1aS1mb3JtLWl0ZW0+XG4gICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+XG4gICAgICB7eyAnbmV0d29yay5leGNlcHQnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9sYWJlbD5cbiAgICA8YWNsLW5ldHdvcmstcG9saWN5LXJlbW90ZS1pcC1leGNlcHQtaW5wdXRcbiAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgY2xhc3M9XCJ0dy13LWZ1bGxcIlxuICAgICAgW3JlbW90ZUlwQmxvY2tdPVwiZm9ybS5nZXQoJ2NpZHInKS52YWx1ZVwiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJleGNlcHRcIlxuICAgICAgW25ldHdvcmtNb2RlXT1cIm5ldHdvcmtNb2RlJCB8IGFzeW5jXCJcbiAgICA+PC9hY2wtbmV0d29yay1wb2xpY3ktcmVtb3RlLWlwLWV4Y2VwdC1pbnB1dD5cbiAgPC9hdWktZm9ybS1pdGVtPlxuPC9mb3JtPlxuIl19