@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,681 @@
1
+ import { AutocompleteModule, ButtonModule, IconModule, InputModule, } from '@alauda/ui';
2
+ import { ArrayFormTableComponent, ArrayFormTableHeaderDirective, ArrayFormTableRowControlDirective, ArrayFormTableRowDirective, ArrayFormTableRowErrorDirective, BaseStringMapFormComponent, ErrorsMapperModule, FALSE, HelpDocumentModule, PurePipe, TOKEN_BASE_DOMAIN, TOKEN_BASE_HREF, TRUE, TranslateModule, TranslateService, getK8sResourceAnnotationErrorMapper$, k8sResourceAnnotationKeyValidator, } from '@alauda-fe/common';
3
+ import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
4
+ import { ChangeDetectionStrategy, Component, Inject, Injector, Input, inject, } from '@angular/core';
5
+ import { ReactiveFormsModule } from '@angular/forms';
6
+ import { sortBy } from 'lodash-es';
7
+ import { ClusterType } from '../../utils/cluster-exports';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ import * as i2 from "@alauda-fe/common";
11
+ import * as i3 from "@alauda/ui";
12
+ function ServiceAnnotationsFormComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {
13
+ i0.ɵɵelementContainerStart(0);
14
+ i0.ɵɵelementStart(1, "th", 6);
15
+ i0.ɵɵtext(2);
16
+ i0.ɵɵpipe(3, "translate");
17
+ i0.ɵɵelementEnd();
18
+ i0.ɵɵelementStart(4, "th", 6);
19
+ i0.ɵɵtext(5);
20
+ i0.ɵɵpipe(6, "translate");
21
+ i0.ɵɵelementEnd();
22
+ i0.ɵɵelementContainerEnd();
23
+ } if (rf & 2) {
24
+ i0.ɵɵadvance(2);
25
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "key"));
26
+ i0.ɵɵadvance(3);
27
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 4, "value"));
28
+ } }
29
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_aui_suggestion_5_div_2_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "div", 16);
31
+ i0.ɵɵtext(1);
32
+ i0.ɵɵelementEnd();
33
+ } if (rf & 2) {
34
+ const tip_r17 = ctx.ngIf;
35
+ i0.ɵɵadvance(1);
36
+ i0.ɵɵtextInterpolate1(" ", tip_r17, " ");
37
+ } }
38
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_aui_suggestion_5_Template(rf, ctx) { if (rf & 1) {
39
+ i0.ɵɵelementStart(0, "aui-suggestion", 15);
40
+ i0.ɵɵtext(1);
41
+ i0.ɵɵtemplate(2, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_aui_suggestion_5_div_2_Template, 2, 1, "div", 14);
42
+ i0.ɵɵpipe(3, "translate");
43
+ i0.ɵɵelementEnd();
44
+ } if (rf & 2) {
45
+ const option_r15 = ctx.$implicit;
46
+ i0.ɵɵproperty("value", option_r15.key);
47
+ i0.ɵɵadvance(1);
48
+ i0.ɵɵtextInterpolate1(" ", option_r15.key, " ");
49
+ i0.ɵɵadvance(1);
50
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(3, 3, option_r15.tip));
51
+ } }
52
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_ng_container_6_div_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵelementContainerStart(0);
54
+ i0.ɵɵtext(1);
55
+ i0.ɵɵpipe(2, "translate");
56
+ i0.ɵɵelementContainerEnd();
57
+ } if (rf & 2) {
58
+ const doc_r18 = i0.ɵɵnextContext(2).ngIf;
59
+ i0.ɵɵadvance(1);
60
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, doc_r18.tipPrefix), " ");
61
+ } }
62
+ const _c0 = function (a0, a1) { return { path: a0, rawUrl: a1, type: "page" }; };
63
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_ng_container_6_div_1_Template(rf, ctx) { if (rf & 1) {
64
+ i0.ɵɵelementStart(0, "div", 17);
65
+ i0.ɵɵtemplate(1, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_ng_container_6_div_1_ng_container_1_Template, 3, 3, "ng-container", 8);
66
+ i0.ɵɵelementStart(2, "a", 18);
67
+ i0.ɵɵtext(3);
68
+ i0.ɵɵpipe(4, "translate");
69
+ i0.ɵɵelement(5, "aui-icon", 19);
70
+ i0.ɵɵelementEnd()();
71
+ } if (rf & 2) {
72
+ const doc_r18 = i0.ɵɵnextContext().ngIf;
73
+ i0.ɵɵadvance(1);
74
+ i0.ɵɵproperty("ngIf", doc_r18.tipPrefix);
75
+ i0.ɵɵadvance(1);
76
+ i0.ɵɵproperty("aclDocs", i0.ɵɵpureFunction2(5, _c0, doc_r18.path, doc_r18.rawUrl));
77
+ i0.ɵɵadvance(1);
78
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 3, doc_r18.tip), " ");
79
+ } }
80
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_ng_container_6_Template(rf, ctx) { if (rf & 1) {
81
+ i0.ɵɵelementContainerStart(0);
82
+ i0.ɵɵtemplate(1, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_ng_container_6_div_1_Template, 6, 8, "div", 5);
83
+ i0.ɵɵpipe(2, "pure");
84
+ i0.ɵɵelementContainerEnd();
85
+ } if (rf & 2) {
86
+ const doc_r18 = ctx.ngIf;
87
+ const ctx_r11 = i0.ɵɵnextContext(3);
88
+ i0.ɵɵadvance(1);
89
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind3(2, 1, ctx_r11.baseHref, ctx_r11.showDocLink, doc_r18.product));
90
+ } }
91
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_aui_suggestion_12_div_2_Template(rf, ctx) { if (rf & 1) {
92
+ i0.ɵɵelementStart(0, "div", 16);
93
+ i0.ɵɵtext(1);
94
+ i0.ɵɵelementEnd();
95
+ } if (rf & 2) {
96
+ const tip_r25 = ctx.ngIf;
97
+ i0.ɵɵadvance(1);
98
+ i0.ɵɵtextInterpolate1(" ", tip_r25, " ");
99
+ } }
100
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_aui_suggestion_12_Template(rf, ctx) { if (rf & 1) {
101
+ i0.ɵɵelementStart(0, "aui-suggestion", 15);
102
+ i0.ɵɵtext(1);
103
+ i0.ɵɵtemplate(2, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_aui_suggestion_12_div_2_Template, 2, 1, "div", 14);
104
+ i0.ɵɵpipe(3, "translate");
105
+ i0.ɵɵelementEnd();
106
+ } if (rf & 2) {
107
+ const option_r23 = ctx.$implicit;
108
+ i0.ɵɵproperty("value", option_r23.value);
109
+ i0.ɵɵadvance(1);
110
+ i0.ɵɵtextInterpolate1(" ", option_r23.value, " ");
111
+ i0.ɵɵadvance(1);
112
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(3, 3, option_r23.tip));
113
+ } }
114
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_div_14_div_1_Template(rf, ctx) { if (rf & 1) {
115
+ i0.ɵɵelementStart(0, "div", 24);
116
+ i0.ɵɵtext(1);
117
+ i0.ɵɵpipe(2, "translate");
118
+ i0.ɵɵelementEnd();
119
+ } if (rf & 2) {
120
+ i0.ɵɵadvance(1);
121
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "read_filling_instructions_tip"), " ");
122
+ } }
123
+ const _c1 = function (a0) { return { example: a0 }; };
124
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_div_14_Template(rf, ctx) { if (rf & 1) {
125
+ const _r29 = i0.ɵɵgetCurrentView();
126
+ i0.ɵɵelementStart(0, "div", 16);
127
+ i0.ɵɵtemplate(1, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_div_14_div_1_Template, 3, 3, "div", 20);
128
+ i0.ɵɵelementStart(2, "div", 21);
129
+ i0.ɵɵtext(3);
130
+ i0.ɵɵpipe(4, "translate");
131
+ i0.ɵɵelementStart(5, "aui-icon", 22);
132
+ i0.ɵɵlistener("click", function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_div_14_Template_aui_icon_click_5_listener() { const restoredCtx = i0.ɵɵrestoreView(_r29); const valueConfig_r26 = restoredCtx.ngIf; const control_r5 = i0.ɵɵnextContext(2).$implicit; return i0.ɵɵresetView(control_r5.get("1").setValue(valueConfig_r26.example)); });
133
+ i0.ɵɵelementEnd()();
134
+ i0.ɵɵelementStart(6, "a", 23);
135
+ i0.ɵɵtext(7);
136
+ i0.ɵɵpipe(8, "translate");
137
+ i0.ɵɵelement(9, "aui-icon", 19);
138
+ i0.ɵɵelementEnd()();
139
+ } if (rf & 2) {
140
+ const valueConfig_r26 = ctx.ngIf;
141
+ const control_r5 = i0.ɵɵnextContext(2).$implicit;
142
+ i0.ɵɵadvance(1);
143
+ i0.ɵɵproperty("ngIf", control_r5.get("1").value === valueConfig_r26.example);
144
+ i0.ɵɵadvance(2);
145
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(4, 4, valueConfig_r26.tip, i0.ɵɵpureFunction1(9, _c1, valueConfig_r26.example)), " ");
146
+ i0.ɵɵadvance(3);
147
+ i0.ɵɵproperty("href", valueConfig_r26.docLink, i0.ɵɵsanitizeUrl);
148
+ i0.ɵɵadvance(1);
149
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 7, "filling_instructions"), " ");
150
+ } }
151
+ function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_Template(rf, ctx) { if (rf & 1) {
152
+ const _r33 = i0.ɵɵgetCurrentView();
153
+ i0.ɵɵelementContainerStart(0);
154
+ i0.ɵɵelementStart(1, "td", 6)(2, "input", 9);
155
+ i0.ɵɵlistener("blur", function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_Template_input_blur_2_listener() { i0.ɵɵrestoreView(_r33); const ctx_r32 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r32.onBlur()); })("auiAutocompleteSelected", function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_Template_input_auiAutocompleteSelected_2_listener() { i0.ɵɵrestoreView(_r33); const control_r5 = i0.ɵɵnextContext().$implicit; const ctx_r34 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r34.onKeySelected(control_r5)); });
156
+ i0.ɵɵelementEnd();
157
+ i0.ɵɵelementStart(3, "aui-autocomplete", null, 10);
158
+ i0.ɵɵtemplate(5, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_aui_suggestion_5_Template, 4, 5, "aui-suggestion", 11);
159
+ i0.ɵɵelementEnd();
160
+ i0.ɵɵtemplate(6, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_ng_container_6_Template, 3, 5, "ng-container", 8);
161
+ i0.ɵɵpipe(7, "pure");
162
+ i0.ɵɵelementEnd();
163
+ i0.ɵɵelementStart(8, "td", 6)(9, "input", 12);
164
+ i0.ɵɵlistener("blur", function ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_Template_input_blur_9_listener() { i0.ɵɵrestoreView(_r33); const ctx_r36 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r36.onBlur()); });
165
+ i0.ɵɵelementEnd();
166
+ i0.ɵɵelementStart(10, "aui-autocomplete", null, 13);
167
+ i0.ɵɵtemplate(12, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_aui_suggestion_12_Template, 4, 5, "aui-suggestion", 11);
168
+ i0.ɵɵpipe(13, "pure");
169
+ i0.ɵɵelementEnd();
170
+ i0.ɵɵtemplate(14, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_div_14_Template, 10, 11, "div", 14);
171
+ i0.ɵɵpipe(15, "pure");
172
+ i0.ɵɵelementEnd();
173
+ i0.ɵɵelementContainerEnd();
174
+ } if (rf & 2) {
175
+ const __r8 = ctx.ngIf;
176
+ const _r9 = i0.ɵɵreference(4);
177
+ const _r12 = i0.ɵɵreference(11);
178
+ const ctx_r37 = i0.ɵɵnextContext();
179
+ const index_r6 = ctx_r37.index;
180
+ const control_r5 = ctx_r37.$implicit;
181
+ const ctx_r7 = i0.ɵɵnextContext();
182
+ let tmp_3_0;
183
+ let tmp_6_0;
184
+ let tmp_7_0;
185
+ i0.ɵɵadvance(2);
186
+ i0.ɵɵproperty("readonly", __r8.readonly)("auiAutocomplete", _r9);
187
+ i0.ɵɵadvance(3);
188
+ i0.ɵɵproperty("ngForOf", __r8.readonly ? null : ctx_r7.filterOptions(__r8.config == null ? null : __r8.config.options, index_r6));
189
+ i0.ɵɵadvance(1);
190
+ i0.ɵɵproperty("ngIf", (tmp_3_0 = i0.ɵɵpipeBind3(7, 8, __r8.config == null ? null : __r8.config.options, ctx_r7.getActiveConfigOption, control_r5.get("0").value)) == null ? null : tmp_3_0.doc);
191
+ i0.ɵɵadvance(3);
192
+ i0.ɵɵproperty("readonly", __r8.readonly)("auiAutocomplete", _r12);
193
+ i0.ɵɵadvance(3);
194
+ i0.ɵɵproperty("ngForOf", __r8.readonly ? null : (tmp_6_0 = i0.ɵɵpipeBind3(13, 12, __r8.config == null ? null : __r8.config.options, ctx_r7.getConfigOption, control_r5.get("0").value)) == null ? null : tmp_6_0.values);
195
+ i0.ɵɵadvance(2);
196
+ i0.ɵɵproperty("ngIf", (tmp_7_0 = i0.ɵɵpipeBind3(15, 16, __r8.config == null ? null : __r8.config.options, ctx_r7.getActiveConfigOption, control_r5.get("0").value)) == null ? null : tmp_7_0.value);
197
+ } }
198
+ const _c2 = function (a0, a1) { return { config: a0, readonly: a1 }; };
199
+ function ServiceAnnotationsFormComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
200
+ i0.ɵɵelementContainerStart(0, 7);
201
+ i0.ɵɵtemplate(1, ServiceAnnotationsFormComponent_ng_container_2_ng_container_1_Template, 16, 20, "ng-container", 8);
202
+ i0.ɵɵelementContainerEnd();
203
+ } if (rf & 2) {
204
+ const control_r5 = ctx.$implicit;
205
+ const index_r6 = ctx.index;
206
+ const ctx_r1 = i0.ɵɵnextContext();
207
+ i0.ɵɵproperty("formGroupName", index_r6);
208
+ i0.ɵɵadvance(1);
209
+ i0.ɵɵproperty("ngIf", i0.ɵɵpureFunction2(2, _c2, ctx_r1.KNOWN_ANNOTATIONS[ctx_r1.clusterType], ctx_r1.isLabelReadonly(control_r5)));
210
+ } }
211
+ function ServiceAnnotationsFormComponent_ng_container_3_td_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {
212
+ i0.ɵɵelementContainerStart(0);
213
+ i0.ɵɵtext(1);
214
+ i0.ɵɵpipe(2, "translate");
215
+ i0.ɵɵelementContainerEnd();
216
+ } if (rf & 2) {
217
+ i0.ɵɵadvance(1);
218
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "k8s_resource_label_key_required"), " ");
219
+ } }
220
+ function ServiceAnnotationsFormComponent_ng_container_3_td_1_ng_container_2_Template(rf, ctx) { if (rf & 1) {
221
+ i0.ɵɵelementContainerStart(0);
222
+ i0.ɵɵtext(1);
223
+ i0.ɵɵpipe(2, "translate");
224
+ i0.ɵɵelementContainerEnd();
225
+ } if (rf & 2) {
226
+ i0.ɵɵadvance(1);
227
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "k8s_resource_label_key_duplicated"), " ");
228
+ } }
229
+ function ServiceAnnotationsFormComponent_ng_container_3_td_1_Template(rf, ctx) { if (rf & 1) {
230
+ i0.ɵɵelementStart(0, "td", 26);
231
+ i0.ɵɵtemplate(1, ServiceAnnotationsFormComponent_ng_container_3_td_1_ng_container_1_Template, 3, 3, "ng-container", 8);
232
+ i0.ɵɵtemplate(2, ServiceAnnotationsFormComponent_ng_container_3_td_1_ng_container_2_Template, 3, 3, "ng-container", 8);
233
+ i0.ɵɵelement(3, "acl-errors-mapper", 27);
234
+ i0.ɵɵpipe(4, "async");
235
+ i0.ɵɵelement(5, "acl-errors-mapper", 28);
236
+ i0.ɵɵelementEnd();
237
+ } if (rf & 2) {
238
+ const control_r38 = i0.ɵɵnextContext().$implicit;
239
+ const ctx_r39 = i0.ɵɵnextContext();
240
+ i0.ɵɵadvance(1);
241
+ i0.ɵɵproperty("ngIf", control_r38.errors == null ? null : control_r38.errors.keyIsMissing);
242
+ i0.ɵɵadvance(1);
243
+ i0.ɵɵproperty("ngIf", control_r38.errors == null ? null : control_r38.errors.duplicateError);
244
+ i0.ɵɵadvance(1);
245
+ i0.ɵɵproperty("errors", control_r38.get("0").errors)("errorsMapper", i0.ɵɵpipeBind1(4, 5, ctx_r39.annotationsErrorsMapper).key);
246
+ i0.ɵɵadvance(2);
247
+ i0.ɵɵproperty("errors", control_r38.get("1").errors);
248
+ } }
249
+ function ServiceAnnotationsFormComponent_ng_container_3_Template(rf, ctx) { if (rf & 1) {
250
+ i0.ɵɵelementContainerStart(0);
251
+ i0.ɵɵtemplate(1, ServiceAnnotationsFormComponent_ng_container_3_td_1_Template, 6, 7, "td", 25);
252
+ i0.ɵɵelementContainerEnd();
253
+ } if (rf & 2) {
254
+ const control_r38 = ctx.$implicit;
255
+ i0.ɵɵadvance(1);
256
+ i0.ɵɵproperty("ngIf", control_r38.invalid);
257
+ } }
258
+ function ServiceAnnotationsFormComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
259
+ const _r46 = i0.ɵɵgetCurrentView();
260
+ i0.ɵɵelementContainerStart(0);
261
+ i0.ɵɵelementStart(1, "button", 29);
262
+ i0.ɵɵlistener("click", function ServiceAnnotationsFormComponent_ng_container_4_Template_button_click_1_listener() { const restoredCtx = i0.ɵɵrestoreView(_r46); const index_r44 = restoredCtx.index; const ctx_r45 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r45.remove(index_r44)); });
263
+ i0.ɵɵelement(2, "aui-icon", 30);
264
+ i0.ɵɵelementEnd();
265
+ i0.ɵɵelementContainerEnd();
266
+ } if (rf & 2) {
267
+ const item_r43 = ctx.$implicit;
268
+ const ctx_r3 = i0.ɵɵnextContext();
269
+ i0.ɵɵadvance(1);
270
+ i0.ɵɵproperty("square", true)("plain", true)("disabled", ctx_r3.isLabelReadonly(item_r43));
271
+ } }
272
+ function ServiceAnnotationsFormComponent_div_6_ng_container_2_Template(rf, ctx) { if (rf & 1) {
273
+ i0.ɵɵelementContainerStart(0);
274
+ i0.ɵɵtext(1);
275
+ i0.ɵɵelementContainerEnd();
276
+ } if (rf & 2) {
277
+ const text_r51 = ctx.$implicit;
278
+ i0.ɵɵadvance(1);
279
+ i0.ɵɵtextInterpolate(text_r51);
280
+ } }
281
+ function ServiceAnnotationsFormComponent_div_6_ng_container_3_Template(rf, ctx) { if (rf & 1) {
282
+ i0.ɵɵelementContainerStart(0);
283
+ i0.ɵɵtext(1);
284
+ i0.ɵɵelementContainerEnd();
285
+ } if (rf & 2) {
286
+ const config_r47 = i0.ɵɵnextContext().ngIf;
287
+ i0.ɵɵadvance(1);
288
+ i0.ɵɵtextInterpolate(config_r47.label);
289
+ } }
290
+ function ServiceAnnotationsFormComponent_div_6_a_4_Template(rf, ctx) { if (rf & 1) {
291
+ i0.ɵɵelementStart(0, "a", 35);
292
+ i0.ɵɵtext(1);
293
+ i0.ɵɵpipe(2, "translate");
294
+ i0.ɵɵelement(3, "aui-icon", 19);
295
+ i0.ɵɵelementEnd();
296
+ } if (rf & 2) {
297
+ const config_r47 = i0.ɵɵnextContext().ngIf;
298
+ i0.ɵɵproperty("href", config_r47.docLink, i0.ɵɵsanitizeUrl);
299
+ i0.ɵɵadvance(1);
300
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, "documentation"), " ");
301
+ } }
302
+ function ServiceAnnotationsFormComponent_div_6_Template(rf, ctx) { if (rf & 1) {
303
+ i0.ɵɵelementStart(0, "div", 17);
304
+ i0.ɵɵelementContainerStart(1, 31);
305
+ i0.ɵɵtemplate(2, ServiceAnnotationsFormComponent_div_6_ng_container_2_Template, 2, 1, "ng-container", 32);
306
+ i0.ɵɵtemplate(3, ServiceAnnotationsFormComponent_div_6_ng_container_3_Template, 2, 1, "ng-container", 33);
307
+ i0.ɵɵtemplate(4, ServiceAnnotationsFormComponent_div_6_a_4_Template, 4, 4, "a", 34);
308
+ i0.ɵɵelementContainerEnd();
309
+ i0.ɵɵelementEnd();
310
+ } if (rf & 2) {
311
+ i0.ɵɵadvance(1);
312
+ i0.ɵɵproperty("aclTranslate", "documentation_for_lb_service_annotations");
313
+ i0.ɵɵadvance(2);
314
+ i0.ɵɵproperty("aclTranslateMatch", "type");
315
+ i0.ɵɵadvance(1);
316
+ i0.ɵɵproperty("aclTranslateMatch", "documentation");
317
+ } }
318
+ const _c3 = ["*"];
319
+ var PRODUCT_BASE_HREF_MAP;
320
+ (function (PRODUCT_BASE_HREF_MAP) {
321
+ PRODUCT_BASE_HREF_MAP["devops"] = "/console-devops/";
322
+ PRODUCT_BASE_HREF_MAP["acp"] = "/console-acp/";
323
+ PRODUCT_BASE_HREF_MAP["asm"] = "/console-asm/";
324
+ PRODUCT_BASE_HREF_MAP["dataservices"] = "/console-dataservices/";
325
+ PRODUCT_BASE_HREF_MAP["cec"] = "/console-cec/";
326
+ PRODUCT_BASE_HREF_MAP["platform"] = "/console-platform/";
327
+ })(PRODUCT_BASE_HREF_MAP || (PRODUCT_BASE_HREF_MAP = {}));
328
+ export const KNOWN_ANNOTATIONS = {
329
+ [ClusterType.AzureAKS]: {
330
+ label: 'AKS',
331
+ docLink: 'https://cloud-provider-azure.sigs.k8s.io/topics/loadbalancer/#loadbalancer-annotations',
332
+ options: [
333
+ {
334
+ key: 'service.beta.kubernetes.io/azure-load-balancer-internal',
335
+ tip: {
336
+ en: 'Specify the use of intranet/public network',
337
+ zh: '指定使用内网/公网',
338
+ },
339
+ values: [
340
+ {
341
+ value: TRUE,
342
+ tip: {
343
+ en: 'Intranet',
344
+ zh: '内网',
345
+ },
346
+ },
347
+ {
348
+ value: FALSE,
349
+ tip: {
350
+ en: 'Public network',
351
+ zh: '公网',
352
+ },
353
+ },
354
+ ],
355
+ },
356
+ ],
357
+ },
358
+ [ClusterType.AmazonEKS]: {
359
+ label: 'EKS',
360
+ docLink: 'https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.5/guide/service/annotations/',
361
+ options: [
362
+ {
363
+ key: 'service.beta.kubernetes.io/aws-load-balancer-type',
364
+ tip: {
365
+ en: 'Specify the LoadBalancer Service Controller in use',
366
+ zh: '指定所使用的 LoadBalancer 类型内部路由控制器',
367
+ },
368
+ doc: {
369
+ tip: {
370
+ en: 'Controller Installation',
371
+ zh: '控制器安装',
372
+ },
373
+ product: 'platform',
374
+ path: 'platform-usermanual/clusterall/1cluster/cloudinit/network1/eksingresscontroller/#2',
375
+ },
376
+ values: [
377
+ {
378
+ value: 'external',
379
+ tip: {
380
+ en: 'Using the official AWS LoadBalancer Controller',
381
+ zh: '使用 AWS 官方的 AWS LoadBalancer Controller',
382
+ },
383
+ },
384
+ ],
385
+ },
386
+ {
387
+ key: 'service.beta.kubernetes.io/aws-load-balancer-nlb-target-type',
388
+ tip: {
389
+ en: 'Specify the way traffic is delivered to the pods',
390
+ zh: '指定流量送达容器组的方式',
391
+ },
392
+ values: [
393
+ {
394
+ value: 'instance',
395
+ tip: {
396
+ en: 'Traffic will be sent to the pods via NodePort',
397
+ zh: '流量将通过 NodePort 送往容器组',
398
+ },
399
+ },
400
+ {
401
+ value: 'ip',
402
+ tip: {
403
+ en: 'Traffic is directly routed to the pods (Amazon VPC CNI is required for the cluster)',
404
+ zh: '流量直接路由到容器组(集群需使用 Amazon VPC CNI)',
405
+ },
406
+ },
407
+ ],
408
+ },
409
+ {
410
+ key: 'service.beta.kubernetes.io/aws-load-balancer-scheme',
411
+ tip: {
412
+ en: 'Specify the use of intranet/public network',
413
+ zh: '指定使用内网/公网',
414
+ },
415
+ values: [
416
+ {
417
+ value: 'internal',
418
+ tip: {
419
+ en: 'Intranet',
420
+ zh: '内网',
421
+ },
422
+ },
423
+ {
424
+ value: 'internet-facing',
425
+ tip: {
426
+ en: 'Public network',
427
+ zh: '公网',
428
+ },
429
+ },
430
+ ],
431
+ },
432
+ {
433
+ key: 'service.beta.kubernetes.io/aws-load-balancer-ip-address-type',
434
+ tip: {
435
+ en: 'Specify the supported IP protocol stack',
436
+ zh: '指定支持的 IP 协议栈',
437
+ },
438
+ values: [
439
+ {
440
+ value: 'ipv4',
441
+ },
442
+ {
443
+ value: 'dualstack',
444
+ },
445
+ ],
446
+ },
447
+ ],
448
+ },
449
+ [ClusterType.HuaweiCloudCCE]: {
450
+ label: 'CCE',
451
+ docLink: 'https://support.huaweicloud.com/intl/en-us/usermanual-cce/cce_10_0385.html',
452
+ options: [
453
+ {
454
+ key: 'kubernetes.io/elb.id',
455
+ tip: {
456
+ en: 'Please provide the ID of the cloud LoadBalancer, You should use an existing cloud LoadBalancer.',
457
+ zh: '填写云上负载均衡器的 ID,需使用已有云上负载均衡器',
458
+ },
459
+ },
460
+ {
461
+ key: 'kubernetes.io/elb.autocreate',
462
+ tip: {
463
+ en: 'Create a new cloud LoadBalancer',
464
+ zh: '新创建云上负载均衡器',
465
+ },
466
+ value: {
467
+ example: `{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","available_zone":["cn-north-4b"],"l4_flavor_name":"L4_flavor.elb.s1.small"}`,
468
+ tip: {
469
+ en: 'For example: {{ example }}',
470
+ zh: '例如:{{ example }}',
471
+ },
472
+ docLink: 'https://support.huaweicloud.com/intl/en-us/usermanual-cce/cce_10_0385.html#section8',
473
+ },
474
+ },
475
+ {
476
+ key: 'kubernetes.io/elb.subnet-id',
477
+ tip: {
478
+ en: 'Subnet ID of the cluster, which is required when creating a new cloud LoadBalancer and Kubernetes version is 1.11.7-r0 and below.',
479
+ zh: '集群所在子网的 ID,当 Kubernetes 版本为 1.11.7-r0 及以下,新创建云上负载均衡器时必须填写此项',
480
+ },
481
+ },
482
+ {
483
+ key: 'kubernetes.io/elb.class',
484
+ tip: {
485
+ en: 'Specify the type of the newly created cloud LoadBalancer',
486
+ zh: '指定新创建的云上负载均衡器的类型',
487
+ },
488
+ doc: {
489
+ tip: {
490
+ en: 'Differences Between Dedicated and Shared Load Balancers',
491
+ zh: '共享型弹性负载均衡与独享型负载均衡的功能区别',
492
+ },
493
+ rawUrl: 'https://support.huaweicloud.com/intl/zh-cn/productdesc-elb/elb_pro_0004.html',
494
+ tipPrefix: {
495
+ en: 'For more details, please refer to ',
496
+ zh: '详情请参见',
497
+ },
498
+ },
499
+ values: [
500
+ {
501
+ value: 'union',
502
+ tip: {
503
+ en: 'Shared LoadBalancer',
504
+ zh: '共享型负载均衡',
505
+ },
506
+ },
507
+ {
508
+ value: 'performance',
509
+ tip: {
510
+ en: 'Dedicated LoadBalancer, which can be used only in clusters of v1.17 and later',
511
+ zh: '独享型负载均衡,仅支持在 Kubernetes 版本为 1.17 及以上的集群中使用',
512
+ },
513
+ },
514
+ ],
515
+ },
516
+ {
517
+ key: 'kubernetes.io/elb.enterpriseID',
518
+ tip: {
519
+ en: 'Specify the enterprise project to which the newly created cloud LoadBalancer will belong',
520
+ zh: '指定新创建云上负载均衡器所属的企业项目',
521
+ },
522
+ },
523
+ ],
524
+ },
525
+ [ClusterType.GoogleCloudGKE]: {
526
+ label: 'GKE',
527
+ docLink: 'https://cloud.google.com/kubernetes-engine/docs/concepts/service-load-balancer-parameters',
528
+ options: [
529
+ {
530
+ key: 'networking.gke.io/load-balancer-type',
531
+ tip: {
532
+ en: 'Specify the use of Intranet',
533
+ zh: '指定使用内网',
534
+ },
535
+ values: [
536
+ {
537
+ value: 'Internal',
538
+ },
539
+ ],
540
+ },
541
+ {
542
+ key: 'cloud.google.com/l4-rbs',
543
+ tip: {
544
+ en: 'The default is public network, when this parameter is configured, traffic will be routed directly to the pods',
545
+ zh: '默认为公网,配置此参数时,流量将直接路由至容器组',
546
+ },
547
+ values: [
548
+ {
549
+ value: 'enabled',
550
+ },
551
+ ],
552
+ },
553
+ ],
554
+ },
555
+ };
556
+ export class ServiceAnnotationsFormComponent extends BaseStringMapFormComponent {
557
+ constructor(injector, baseDomain) {
558
+ super(injector);
559
+ this.baseDomain = baseDomain;
560
+ this.translate = inject(TranslateService);
561
+ this.baseHref = inject(TOKEN_BASE_HREF);
562
+ // 禁用掉包含 cpaas.io 及 ovn.kubernetes.io 的 key
563
+ this.readonlyPartialKeys = ['ovn.kubernetes.io', this.baseDomain];
564
+ this.annotationsErrorsMapper = getK8sResourceAnnotationErrorMapper$(this.translate);
565
+ this.KNOWN_ANNOTATIONS = KNOWN_ANNOTATIONS;
566
+ }
567
+ filterOptions(options, index) {
568
+ const keys = this.form.value.map(([key]) => key);
569
+ return options?.filter(o => {
570
+ const keyIndex = keys.indexOf(o.key);
571
+ return keyIndex === -1 || keyIndex === index;
572
+ });
573
+ }
574
+ getConfigOption(options, key) {
575
+ return options?.find(option => option.key === key);
576
+ }
577
+ isReadonly(key) {
578
+ return this.isUpdate && this.readonlyPartialKeys.some(k => key.includes(k));
579
+ }
580
+ getDefaultFormModel() {
581
+ return [['', '']];
582
+ }
583
+ adaptResourceModel(resource) {
584
+ let newFormModel = Object.entries(resource || {});
585
+ // 排序,先按字母排序,再把 readonly 的放前面
586
+ newFormModel = sortBy(newFormModel, (arr) => arr[0]);
587
+ newFormModel.sort((arr1, arr2) => {
588
+ const flag1 = this.isReadonly(arr1[0]);
589
+ const flag2 = this.isReadonly(arr2[0]);
590
+ if ((flag1 && flag2) || (!flag1 && !flag2)) {
591
+ return 0;
592
+ }
593
+ return flag1 ? -1 : 1;
594
+ });
595
+ if (newFormModel.length === 0) {
596
+ newFormModel = this.getDefaultFormModel();
597
+ }
598
+ return newFormModel;
599
+ }
600
+ getKeyValidators() {
601
+ return k8sResourceAnnotationKeyValidator;
602
+ }
603
+ isLabelReadonly(control) {
604
+ return control.valid && this.isReadonly(control.get('0').value);
605
+ }
606
+ getActiveConfigOption(options, key) {
607
+ return options?.find(o => o.key === key);
608
+ }
609
+ onKeySelected(control) {
610
+ const keyCtrl = control.get('0');
611
+ keyCtrl.markAsDirty();
612
+ keyCtrl.updateValueAndValidity();
613
+ }
614
+ // AnnotationConfigOption.doc 配置了产品 (product)属性之后需要当前视图隶属于该产品时才展示 doc 链接,未配置的话不受限制
615
+ showDocLink(baseHref, product) {
616
+ if (!product) {
617
+ return true;
618
+ }
619
+ return PRODUCT_BASE_HREF_MAP[product] === baseHref;
620
+ }
621
+ static { this.ɵfac = function ServiceAnnotationsFormComponent_Factory(t) { return new (t || ServiceAnnotationsFormComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(TOKEN_BASE_DOMAIN)); }; }
622
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ServiceAnnotationsFormComponent, selectors: [["acl-service-annotations-form"]], inputs: { isUpdate: "isUpdate", clusterType: "clusterType", resourceName: "resourceName" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], ngContentSelectors: _c3, decls: 7, vars: 4, consts: [[3, "formGroup", "rows", "resourceName", "add", "remove"], [4, "aclArrayFormTableHeader"], [3, "formGroupName", 4, "aclArrayFormTableRow"], [4, "aclArrayFormTableRowError"], [4, "aclArrayFormTableRowControl"], ["class", "tw-text-help-text tw-text-s tw-mt-4", 4, "ngIf"], [1, "column"], [3, "formGroupName"], [4, "ngIf"], ["aui-input", "", "formControlName", "0", 3, "readonly", "auiAutocomplete", "blur", "auiAutocompleteSelected"], ["keySuggestion", ""], [3, "value", 4, "ngFor", "ngForOf"], ["aui-input", "", "formControlName", "1", 3, "readonly", "auiAutocomplete", "blur"], ["valueSuggestion", ""], ["class", "tw-text-help-text tw-text-s", 4, "ngIf"], [3, "value"], [1, "tw-text-help-text", "tw-text-s"], [1, "tw-text-help-text", "tw-text-s", "tw-mt-4"], [3, "aclDocs"], ["icon", "jump"], ["class", "tw-text-yellow tw-mt-4", 4, "ngIf"], [1, "tw-break-all", "tw-my-4"], ["icon", "arrow_turn_up", 1, "tw-text-primary", "tw-cursor-pointer", 3, "click"], ["rel", "noopener noreferrer", "target", "_blank", 3, "href"], [1, "tw-text-yellow", "tw-mt-4"], ["colspan", "3", "class", "acl-table-form-error-hint", 4, "ngIf"], ["colspan", "3", 1, "acl-table-form-error-hint"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["auiFormItemError", "", 3, "errors"], ["aui-button", "text", "type", "button", 3, "square", "plain", "disabled", "click"], ["icon", "minus_circle"], [3, "aclTranslate"], [4, "aclTranslateText"], [4, "aclTranslateMatch"], ["target", "_blank", "rel", "noopener noreferrer", 3, "href", 4, "aclTranslateMatch"], ["target", "_blank", "rel", "noopener noreferrer", 3, "href"]], template: function ServiceAnnotationsFormComponent_Template(rf, ctx) { if (rf & 1) {
623
+ i0.ɵɵprojectionDef();
624
+ i0.ɵɵelementStart(0, "acl-array-form-table", 0);
625
+ i0.ɵɵlistener("add", function ServiceAnnotationsFormComponent_Template_acl_array_form_table_add_0_listener() { return ctx.form.push(ctx.createNewControl()); })("remove", function ServiceAnnotationsFormComponent_Template_acl_array_form_table_remove_0_listener($event) { return ctx.remove($event); });
626
+ i0.ɵɵtemplate(1, ServiceAnnotationsFormComponent_ng_container_1_Template, 7, 6, "ng-container", 1);
627
+ i0.ɵɵtemplate(2, ServiceAnnotationsFormComponent_ng_container_2_Template, 2, 5, "ng-container", 2);
628
+ i0.ɵɵtemplate(3, ServiceAnnotationsFormComponent_ng_container_3_Template, 2, 1, "ng-container", 3);
629
+ i0.ɵɵtemplate(4, ServiceAnnotationsFormComponent_ng_container_4_Template, 3, 3, "ng-container", 4);
630
+ i0.ɵɵelementEnd();
631
+ i0.ɵɵprojection(5);
632
+ i0.ɵɵtemplate(6, ServiceAnnotationsFormComponent_div_6_Template, 5, 3, "div", 5);
633
+ } if (rf & 2) {
634
+ i0.ɵɵproperty("formGroup", ctx.form)("rows", ctx.form.controls)("resourceName", ctx.resourceName);
635
+ i0.ɵɵadvance(6);
636
+ i0.ɵɵproperty("ngIf", ctx.KNOWN_ANNOTATIONS[ctx.clusterType]);
637
+ } }, dependencies: [AsyncPipe,
638
+ NgIf,
639
+ NgForOf,
640
+ ReactiveFormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.FormGroupDirective, i1.FormControlName, i1.FormGroupName, TranslateModule, i2.TranslateDirective, i2.TranslateMatchDirective, i2.TranslateTextDirective, i2.TranslatePipe, AutocompleteModule, i3.AutoCompleteDirective, i3.AutocompleteComponent, i3.SuggestionComponent, ButtonModule, i3.ButtonComponent, IconModule, i3.IconComponent, InputModule, i3.InputComponent, ArrayFormTableComponent,
641
+ ArrayFormTableHeaderDirective,
642
+ ArrayFormTableRowDirective,
643
+ ArrayFormTableRowControlDirective,
644
+ ArrayFormTableRowErrorDirective,
645
+ ErrorsMapperModule, i2.ErrorsMapperComponent, HelpDocumentModule, i2.DocsDirective, PurePipe], styles: ["[_nghost-%COMP%]{flex:1}.column[_ngcontent-%COMP%]{width:50%;vertical-align:top}"], changeDetection: 0 }); }
646
+ }
647
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ServiceAnnotationsFormComponent, [{
648
+ type: Component,
649
+ args: [{ selector: 'acl-service-annotations-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
650
+ AsyncPipe,
651
+ NgIf,
652
+ NgForOf,
653
+ ReactiveFormsModule,
654
+ TranslateModule,
655
+ AutocompleteModule,
656
+ ButtonModule,
657
+ IconModule,
658
+ InputModule,
659
+ ArrayFormTableComponent,
660
+ ArrayFormTableHeaderDirective,
661
+ ArrayFormTableRowDirective,
662
+ ArrayFormTableRowControlDirective,
663
+ ArrayFormTableRowErrorDirective,
664
+ ErrorsMapperModule,
665
+ HelpDocumentModule,
666
+ PurePipe,
667
+ ], template: "<acl-array-form-table\n [formGroup]=\"$any(form)\"\n [rows]=\"form.controls\"\n (add)=\"form.push(createNewControl())\"\n (remove)=\"remove($event)\"\n [resourceName]=\"resourceName\"\n>\n <ng-container *aclArrayFormTableHeader>\n <th class=\"column\">{{ 'key' | translate }}</th>\n <th class=\"column\">{{ 'value' | translate }}</th>\n </ng-container>\n\n <ng-container\n *aclArrayFormTableRow=\"let control; let index = index\"\n [formGroupName]=\"index\"\n >\n <ng-container\n *ngIf=\"{\n config: KNOWN_ANNOTATIONS[clusterType],\n readonly: isLabelReadonly(control)\n } as _\"\n >\n <td class=\"column\">\n <input\n aui-input\n [readonly]=\"_.readonly\"\n (blur)=\"onBlur()\"\n formControlName=\"0\"\n [auiAutocomplete]=\"keySuggestion\"\n (auiAutocompleteSelected)=\"onKeySelected(control)\"\n />\n <aui-autocomplete #keySuggestion>\n <aui-suggestion\n *ngFor=\"\n let option of _.readonly\n ? null\n : filterOptions(_.config?.options, index)\n \"\n [value]=\"option.key\"\n >\n {{ option.key }}\n <div\n *ngIf=\"option.tip | translate as tip\"\n class=\"tw-text-help-text tw-text-s\"\n >\n {{ tip }}\n </div>\n </aui-suggestion>\n </aui-autocomplete>\n <ng-container\n *ngIf=\"\n (\n _.config?.options\n | pure: getActiveConfigOption:control.get('0').value\n )?.doc as doc\n \"\n >\n <div\n *ngIf=\"baseHref | pure: showDocLink:doc.product\"\n class=\"tw-text-help-text tw-text-s tw-mt-4\"\n >\n <ng-container *ngIf=\"doc.tipPrefix\">\n {{ doc.tipPrefix | translate }}\n </ng-container>\n <a\n [aclDocs]=\"{\n path: doc.path,\n rawUrl: doc.rawUrl,\n type: 'page',\n }\"\n >\n {{ doc.tip | translate }}\n <aui-icon icon=\"jump\"></aui-icon>\n </a>\n </div>\n </ng-container>\n </td>\n <td class=\"column\">\n <input\n aui-input\n [readonly]=\"_.readonly\"\n (blur)=\"onBlur()\"\n formControlName=\"1\"\n [auiAutocomplete]=\"valueSuggestion\"\n />\n <aui-autocomplete #valueSuggestion>\n <aui-suggestion\n *ngFor=\"\n let option of _.readonly\n ? null\n : (\n _.config?.options\n | pure: getConfigOption:control.get('0').value\n )?.values\n \"\n [value]=\"option.value\"\n >\n {{ option.value }}\n <div\n *ngIf=\"option.tip | translate as tip\"\n class=\"tw-text-help-text tw-text-s\"\n >\n {{ tip }}\n </div>\n </aui-suggestion>\n </aui-autocomplete>\n <div\n *ngIf=\"\n (\n _.config?.options\n | pure: getActiveConfigOption:control.get('0').value\n )?.value as valueConfig\n \"\n class=\"tw-text-help-text tw-text-s\"\n >\n <div\n *ngIf=\"control.get('1').value === valueConfig.example\"\n class=\"tw-text-yellow tw-mt-4\"\n >\n {{ 'read_filling_instructions_tip' | translate }}\n </div>\n <div class=\"tw-break-all tw-my-4\">\n {{ valueConfig.tip | translate: { example: valueConfig.example } }}\n <aui-icon\n class=\"tw-text-primary tw-cursor-pointer\"\n icon=\"arrow_turn_up\"\n (click)=\"control.get('1').setValue(valueConfig.example)\"\n ></aui-icon>\n </div>\n <a\n [href]=\"valueConfig.docLink\"\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {{ 'filling_instructions' | translate }}\n <aui-icon icon=\"jump\"></aui-icon>\n </a>\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *aclArrayFormTableRowError=\"let control\">\n <td\n *ngIf=\"control.invalid\"\n colspan=\"3\"\n class=\"acl-table-form-error-hint\"\n >\n <ng-container *ngIf=\"control.errors?.keyIsMissing\">\n {{ 'k8s_resource_label_key_required' | translate }}\n </ng-container>\n\n <ng-container *ngIf=\"control.errors?.duplicateError\">\n {{ 'k8s_resource_label_key_duplicated' | translate }}\n </ng-container>\n\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"control.get('0').errors\"\n [errorsMapper]=\"(annotationsErrorsMapper | async).key\"\n ></acl-errors-mapper>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"control.get('1').errors\"\n ></acl-errors-mapper>\n </td>\n </ng-container>\n\n <ng-container *aclArrayFormTableRowControl=\"let item; let index = index\">\n <button\n aui-button=\"text\"\n type=\"button\"\n [square]=\"true\"\n [plain]=\"true\"\n [disabled]=\"isLabelReadonly(item)\"\n (click)=\"remove(index)\"\n >\n <aui-icon icon=\"minus_circle\"></aui-icon>\n </button>\n </ng-container>\n</acl-array-form-table>\n\n<ng-content></ng-content>\n\n<div\n *ngIf=\"KNOWN_ANNOTATIONS[clusterType] as config\"\n class=\"tw-text-help-text tw-text-s tw-mt-4\"\n>\n <ng-container [aclTranslate]=\"'documentation_for_lb_service_annotations'\">\n <ng-container *aclTranslateText=\"let text\">{{ text }}</ng-container>\n <ng-container *aclTranslateMatch=\"'type'\">{{ config.label }}</ng-container>\n <a\n *aclTranslateMatch=\"'documentation'\"\n [href]=\"config.docLink\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {{ 'documentation' | translate }}\n <aui-icon icon=\"jump\"></aui-icon> </a\n ></ng-container>\n</div>\n", styles: [":host{flex:1}.column{width:50%;vertical-align:top}\n"] }]
668
+ }], function () { return [{ type: i0.Injector }, { type: undefined, decorators: [{
669
+ type: Inject,
670
+ args: [TOKEN_BASE_DOMAIN]
671
+ }] }]; }, { isUpdate: [{
672
+ type: Input,
673
+ args: [{ required: true }]
674
+ }], clusterType: [{
675
+ type: Input,
676
+ args: [{ required: true }]
677
+ }], resourceName: [{
678
+ type: Input,
679
+ args: [{ required: true }]
680
+ }] }); })();
681
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0vYW5ub3RhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0vYW5ub3RhdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsR0FDWixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLDZCQUE2QixFQUM3QixpQ0FBaUMsRUFDakMsMEJBQTBCLEVBQzFCLCtCQUErQixFQUMvQiwwQkFBMEIsRUFFMUIsa0JBQWtCLEVBQ2xCLEtBQUssRUFDTCxrQkFBa0IsRUFFbEIsUUFBUSxFQUVSLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsSUFBSSxFQUVKLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsb0NBQW9DLEVBQ3BDLGlDQUFpQyxHQUNsQyxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVuQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1B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QUFNLGNBQ25DLElBQUksV0FDUDtvQkFDUCxTQUFTO29CQUNULElBQUk7b0JBQ0osT0FBTztvQkFDUCxtQkFBbUI7b0JBQ25CLGVBQWU7b0JBQ2Ysa0JBQWtCO29CQUNsQixZQUFZO29CQUNaLFVBQVU7b0JBQ1YsV0FBVztvQkFDWCx1QkFBdUI7b0JBQ3ZCLDZCQUE2QjtvQkFDN0IsMEJBQTBCO29CQUMxQixpQ0FBaUM7b0JBQ2pDLCtCQUErQjtvQkFDL0Isa0JBQWtCO29CQUNsQixrQkFBa0I7b0JBQ2xCLFFBQVE7aUJBQ1Q7O3NCQTJCRSxNQUFNO3VCQUFDLGlCQUFpQjt3QkF2QjNCLFFBQVE7a0JBRFAsS0FBSzttQkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFJekIsV0FBVztrQkFEVixLQUFLO21CQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUl6QixZQUFZO2tCQURYLEtBQUs7bUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICBCdXR0b25Nb2R1bGUsXG4gIEljb25Nb2R1bGUsXG4gIElucHV0TW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEFycmF5Rm9ybVRhYmxlQ29tcG9uZW50LFxuICBBcnJheUZvcm1UYWJsZUhlYWRlckRpcmVjdGl2ZSxcbiAgQXJyYXlGb3JtVGFibGVSb3dDb250cm9sRGlyZWN0aXZlLFxuICBBcnJheUZvcm1UYWJsZVJvd0RpcmVjdGl2ZSxcbiAgQXJyYXlGb3JtVGFibGVSb3dFcnJvckRpcmVjdGl2ZSxcbiAgQmFzZVN0cmluZ01hcEZvcm1Db21wb25lbnQsXG4gIEtleVZhbHVlVHVwbGUsXG4gIEVycm9yc01hcHBlck1vZHVsZSxcbiAgRkFMU0UsXG4gIEhlbHBEb2N1bWVudE1vZHVsZSxcbiAgTG9jYWxlLFxuICBQdXJlUGlwZSxcbiAgU3RyaW5nTWFwLFxuICBUT0tFTl9CQVNFX0RPTUFJTixcbiAgVE9LRU5fQkFTRV9IUkVGLFxuICBUUlVFLFxuICBUcmFuc2xhdGVLZXksXG4gIFRyYW5zbGF0ZU1vZHVsZSxcbiAgVHJhbnNsYXRlU2VydmljZSxcbiAgZ2V0SzhzUmVzb3VyY2VBbm5vdGF0aW9uRXJyb3JNYXBwZXIkLFxuICBrOHNSZXNvdXJjZUFubm90YXRpb25LZXlWYWxpZGF0b3IsXG59IGZyb20gJ0BhbGF1ZGEtZmUvY29tbW9uJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBDbHVzdGVyVHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NsdXN0ZXItZXhwb3J0cyc7XG5cbmVudW0gUFJPRFVDVF9CQVNFX0hSRUZfTUFQIHtcbiAgZGV2b3BzID0gJy9jb25zb2xlLWRldm9wcy8nLFxuICBhY3AgPSAnL2NvbnNvbGUtYWNwLycsXG4gIGFzbSA9ICcvY29uc29sZS1hc20vJyxcbiAgZGF0YXNlcnZpY2VzID0gJy9jb25zb2xlLWRhdGFzZXJ2aWNlcy8nLFxuICBjZWMgPSAnL2NvbnNvbGUtY2VjLycsXG4gIHBsYXRmb3JtID0gJy9jb25zb2xlLXBsYXRmb3JtLycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5ub3RhdGlvbkNvbmZpZ09wdGlvbiB7XG4gIGtleTogc3RyaW5nO1xuICB0aXA6IFRyYW5zbGF0ZUtleTxMb2NhbGU+O1xuICBkb2M/OiB7XG4gICAgdGlwOiBUcmFuc2xhdGVLZXk8TG9jYWxlPjtcbiAgICB0aXBQcmVmaXg/OiBUcmFuc2xhdGVLZXk8TG9jYWxlPjtcbiAgICBwYXRoPzogc3RyaW5nOyAvLyDmoIflh4bmlofmoaPpk77mjqUsIOWvueW6lCBEb2NzT3B0aW9uLnBhdGhcbiAgICByYXdVcmw/OiBzdHJpbmc7IC8vIOmdnuagh+WHhuaWh+aho+mTvuaOpSwg5a+55bqUIERvY3NPcHRpb24ucmF3VXJsXG4gICAgcHJvZHVjdD86IGtleW9mIHR5cGVvZiBQUk9EVUNUX0JBU0VfSFJFRl9NQVA7XG4gIH07XG4gIHZhbHVlPzoge1xuICAgIGV4YW1wbGU6IHN0cmluZztcbiAgICB0aXA6IFRyYW5zbGF0ZUtleTxMb2NhbGU+O1xuICAgIGRvY0xpbms6IHN0cmluZztcbiAgfTtcbiAgdmFsdWVzPzogQXJyYXk8e1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgdGlwPzogVHJhbnNsYXRlS2V5PExvY2FsZT47XG4gIH0+O1xufVxuXG5leHBvcnQgY29uc3QgS05PV05fQU5OT1RBVElPTlM6IFBhcnRpYWw8XG4gIFJlY29yZDxcbiAgICBDbHVzdGVyVHlwZSxcbiAgICB7XG4gICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgZG9jTGluazogc3RyaW5nO1xuICAgICAgb3B0aW9uczogQW5ub3RhdGlvbkNvbmZpZ09wdGlvbltdO1xuICAgIH1cbiAgPlxuPiA9IHtcbiAgW0NsdXN0ZXJUeXBlLkF6dXJlQUtTXToge1xuICAgIGxhYmVsOiAnQUtTJyxcbiAgICBkb2NMaW5rOlxuICAgICAgJ2h0dHBzOi8vY2xvdWQtcHJvdmlkZXItYXp1cmUuc2lncy5rOHMuaW8vdG9waWNzL2xvYWRiYWxhbmNlci8jbG9hZGJhbGFuY2VyLWFubm90YXRpb25zJyxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NlcnZpY2UuYmV0YS5rdWJlcm5ldGVzLmlvL2F6dXJlLWxvYWQtYmFsYW5jZXItaW50ZXJuYWwnLFxuICAgICAgICB0aXA6IHtcbiAgICAgICAgICBlbjogJ1NwZWNpZnkgdGhlIHVzZSBvZiBpbnRyYW5ldC9wdWJsaWMgbmV0d29yaycsXG4gICAgICAgICAgemg6ICfmjIflrprkvb/nlKjlhoXnvZEv5YWs572RJyxcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFRSVUUsXG4gICAgICAgICAgICB0aXA6IHtcbiAgICAgICAgICAgICAgZW46ICdJbnRyYW5ldCcsXG4gICAgICAgICAgICAgIHpoOiAn5YaF572RJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogRkFMU0UsXG4gICAgICAgICAgICB0aXA6IHtcbiAgICAgICAgICAgICAgZW46ICdQdWJsaWMgbmV0d29yaycsXG4gICAgICAgICAgICAgIHpoOiAn5YWs572RJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgW0NsdXN0ZXJUeXBlLkFtYXpvbkVLU106IHtcbiAgICBsYWJlbDogJ0VLUycsXG4gICAgZG9jTGluazpcbiAgICAgICdodHRwczovL2t1YmVybmV0ZXMtc2lncy5naXRodWIuaW8vYXdzLWxvYWQtYmFsYW5jZXItY29udHJvbGxlci92Mi41L2d1aWRlL3NlcnZpY2UvYW5ub3RhdGlvbnMvJyxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NlcnZpY2UuYmV0YS5rdWJlcm5ldGVzLmlvL2F3cy1sb2FkLWJhbGFuY2VyLXR5cGUnLFxuICAgICAgICB0aXA6IHtcbiAgICAgICAgICBlbjogJ1NwZWNpZnkgdGhlIExvYWRCYWxhbmNlciBTZXJ2aWNlIENvbnRyb2xsZXIgaW4gdXNlJyxcbiAgICAgICAgICB6aDogJ+aMh+WumuaJgOS9v+eUqOeahCBMb2FkQmFsYW5jZXIg57G75Z6L5YaF6YOo6Lev55Sx5o6n5Yi25ZmoJyxcbiAgICAgICAgfSxcbiAgICAgICAgZG9jOiB7XG4gICAgICAgICAgdGlwOiB7XG4gICAgICAgICAgICBlbjogJ0NvbnRyb2xsZXIgSW5zdGFsbGF0aW9uJyxcbiAgICAgICAgICAgIHpoOiAn5o6n5Yi25Zmo5a6J6KOFJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2R1Y3Q6ICdwbGF0Zm9ybScsXG4gICAgICAgICAgcGF0aDogJ3BsYXRmb3JtLXVzZXJtYW51YWwvY2x1c3RlcmFsbC8xY2x1c3Rlci9jbG91ZGluaXQvbmV0d29yazEvZWtzaW5ncmVzc2NvbnRyb2xsZXIvIzInLFxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2V4dGVybmFsJyxcbiAgICAgICAgICAgIHRpcDoge1xuICAgICAgICAgICAgICBlbjogJ1VzaW5nIHRoZSBvZmZpY2lhbCBBV1MgTG9hZEJhbGFuY2VyIENvbnRyb2xsZXInLFxuICAgICAgICAgICAgICB6aDogJ+S9v+eUqCBBV1Mg5a6Y5pa555qEIEFXUyBMb2FkQmFsYW5jZXIgQ29udHJvbGxlcicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzZXJ2aWNlLmJldGEua3ViZXJuZXRlcy5pby9hd3MtbG9hZC1iYWxhbmNlci1ubGItdGFyZ2V0LXR5cGUnLFxuICAgICAgICB0aXA6IHtcbiAgICAgICAgICBlbjogJ1NwZWNpZnkgdGhlIHdheSB0cmFmZmljIGlzIGRlbGl2ZXJlZCB0byB0aGUgcG9kcycsXG4gICAgICAgICAgemg6ICfmjIflrprmtYHph4/pgIHovr7lrrnlmajnu4TnmoTmlrnlvI8nLFxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2luc3RhbmNlJyxcbiAgICAgICAgICAgIHRpcDoge1xuICAgICAgICAgICAgICBlbjogJ1RyYWZmaWMgd2lsbCBiZSBzZW50IHRvIHRoZSBwb2RzIHZpYSBOb2RlUG9ydCcsXG4gICAgICAgICAgICAgIHpoOiAn5rWB6YeP5bCG6YCa6L+HIE5vZGVQb3J0IOmAgeW+gOWuueWZqOe7hCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICdpcCcsXG4gICAgICAgICAgICB0aXA6IHtcbiAgICAgICAgICAgICAgZW46ICdUcmFmZmljIGlzIGRpcmVjdGx5IHJvdXRlZCB0byB0aGUgcG9kcyAoQW1hem9uIFZQQyBDTkkgaXMgcmVxdWlyZWQgZm9yIHRoZSBjbHVzdGVyKScsXG4gICAgICAgICAgICAgIHpoOiAn5rWB6YeP55u05o6l6Lev55Sx5Yiw5a655Zmo57uE77yI6ZuG576k6ZyA5L2/55SoIEFtYXpvbiBWUEMgQ05J77yJJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NlcnZpY2UuYmV0YS5rdWJlcm5ldGVzLmlvL2F3cy1sb2FkLWJhbGFuY2VyLXNjaGVtZScsXG4gICAgICAgIHRpcDoge1xuICAgICAgICAgIGVuOiAnU3BlY2lmeSB0aGUgdXNlIG9mIGludHJhbmV0L3B1YmxpYyBuZXR3b3JrJyxcbiAgICAgICAgICB6aDogJ+aMh+WumuS9v+eUqOWGhee9kS/lhaznvZEnLFxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2ludGVybmFsJyxcbiAgICAgICAgICAgIHRpcDoge1xuICAgICAgICAgICAgICBlbjogJ0ludHJhbmV0JyxcbiAgICAgICAgICAgICAgemg6ICflhoXnvZEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnaW50ZXJuZXQtZmFjaW5nJyxcbiAgICAgICAgICAgIHRpcDoge1xuICAgICAgICAgICAgICBlbjogJ1B1YmxpYyBuZXR3b3JrJyxcbiAgICAgICAgICAgICAgemg6ICflhaznvZEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnc2VydmljZS5iZXRhLmt1YmVybmV0ZXMuaW8vYXdzLWxvYWQtYmFsYW5jZXItaXAtYWRkcmVzcy10eXBlJyxcbiAgICAgICAgdGlwOiB7XG4gICAgICAgICAgZW46ICdTcGVjaWZ5IHRoZSBzdXBwb3J0ZWQgSVAgcHJvdG9jb2wgc3RhY2snLFxuICAgICAgICAgIHpoOiAn5oyH5a6a5pSv5oyB55qEIElQIOWNj+iuruagiCcsXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnaXB2NCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2R1YWxzdGFjaycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgW0NsdXN0ZXJUeXBlLkh1YXdlaUNsb3VkQ0NFXToge1xuICAgIGxhYmVsOiAnQ0NFJyxcbiAgICBkb2NMaW5rOlxuICAgICAgJ2h0dHBzOi8vc3VwcG9ydC5odWF3ZWljbG91ZC5jb20vaW50bC9lbi11cy91c2VybWFudWFsLWNjZS9jY2VfMTBfMDM4NS5odG1sJyxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7XG4gICAgICAgIGtleTogJ2t1YmVybmV0ZXMuaW8vZWxiLmlkJyxcbiAgICAgICAgdGlwOiB7XG4gICAgICAgICAgZW46ICdQbGVhc2UgcHJvdmlkZSB0aGUgSUQgb2YgdGhlIGNsb3VkIExvYWRCYWxhbmNlciwgWW91IHNob3VsZCB1c2UgYW4gZXhpc3RpbmcgY2xvdWQgTG9hZEJhbGFuY2VyLicsXG4gICAgICAgICAgemg6ICfloavlhpnkupHkuIrotJ/ovb3lnYfooaHlmajnmoQgSUTvvIzpnIDkvb/nlKjlt7LmnInkupHkuIrotJ/ovb3lnYfooaHlmagnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAna3ViZXJuZXRlcy5pby9lbGIuYXV0b2NyZWF0ZScsXG4gICAgICAgIHRpcDoge1xuICAgICAgICAgIGVuOiAnQ3JlYXRlIGEgbmV3IGNsb3VkIExvYWRCYWxhbmNlcicsXG4gICAgICAgICAgemg6ICfmlrDliJvlu7rkupHkuIrotJ/ovb3lnYfooaHlmagnLFxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGV4YW1wbGU6IGB7XCJ0eXBlXCI6XCJwdWJsaWNcIixcImJhbmR3aWR0aF9uYW1lXCI6XCJjY2UtYmFuZHdpZHRoLTE1NTExNjMzNzk2MjdcIixcImJhbmR3aWR0aF9jaGFyZ2Vtb2RlXCI6XCJiYW5kd2lkdGhcIixcImJhbmR3aWR0aF9zaXplXCI6NSxcImJhbmR3aWR0aF9zaGFyZXR5cGVcIjpcIlBFUlwiLFwiZWlwX3R5cGVcIjpcIjVfYmdwXCIsXCJhdmFpbGFibGVfem9uZVwiOltcImNuLW5vcnRoLTRiXCJdLFwibDRfZmxhdm9yX25hbWVcIjpcIkw0X2ZsYXZvci5lbGIuczEuc21hbGxcIn1gLFxuICAgICAgICAgIHRpcDoge1xuICAgICAgICAgICAgZW46ICdGb3IgZXhhbXBsZToge3sgZXhhbXBsZSB9fScsXG4gICAgICAgICAgICB6aDogJ+S+i+Wmgu+8mnt7IGV4YW1wbGUgfX0nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZG9jTGluazpcbiAgICAgICAgICAgICdodHRwczovL3N1cHBvcnQuaHVhd2VpY2xvdWQuY29tL2ludGwvZW4tdXMvdXNlcm1hbnVhbC1jY2UvY2NlXzEwXzAzODUuaHRtbCNzZWN0aW9uOCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdrdWJlcm5ldGVzLmlvL2VsYi5zdWJuZXQtaWQnLFxuICAgICAgICB0aXA6IHtcbiAgICAgICAgICBlbjogJ1N1Ym5ldCBJRCBvZiB0aGUgY2x1c3Rlciwgd2hpY2ggaXMgcmVxdWlyZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBjbG91ZCBMb2FkQmFsYW5jZXIgYW5kIEt1YmVybmV0ZXMgdmVyc2lvbiBpcyAxLjExLjctcjAgYW5kIGJlbG93LicsXG4gICAgICAgICAgemg6ICfpm4bnvqTmiYDlnKjlrZDnvZHnmoQgSUTvvIzlvZMgS3ViZXJuZXRlcyDniYjmnKzkuLogMS4xMS43LXIwIOWPiuS7peS4i++8jOaWsOWIm+W7uuS6keS4iui0n+i9veWdh+ihoeWZqOaXtuW/hemhu+Whq+WGmeatpOmhuScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdrdWJlcm5ldGVzLmlvL2VsYi5jbGFzcycsXG4gICAgICAgIHRpcDoge1xuICAgICAgICAgIGVuOiAnU3BlY2lmeSB0aGUgdHlwZSBvZiB0aGUgbmV3bHkgY3JlYXRlZCBjbG91ZCBMb2FkQmFsYW5jZXInLFxuICAgICAgICAgIHpoOiAn5oyH5a6a5paw5Yib5bu655qE5LqR5LiK6LSf6L295Z2H6KGh5Zmo55qE57G75Z6LJyxcbiAgICAgICAgfSxcbiAgICAgICAgZG9jOiB7XG4gICAgICAgICAgdGlwOiB7XG4gICAgICAgICAgICBlbjogJ0RpZmZlcmVuY2VzIEJldHdlZW4gRGVkaWNhdGVkIGFuZCBTaGFyZWQgTG9hZCBCYWxhbmNlcnMnLFxuICAgICAgICAgICAgemg6ICflhbHkuqvlnovlvLnmgKfotJ/ovb3lnYfooaHkuI7ni6zkuqvlnovotJ/ovb3lnYfooaHnmoTlip/og73ljLrliKsnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmF3VXJsOlxuICAgICAgICAgICAgJ2h0dHBzOi8vc3VwcG9ydC5odWF3ZWljbG91ZC5jb20vaW50bC96aC1jbi9wcm9kdWN0ZGVzYy1lbGIvZWxiX3Byb18wMDA0Lmh0bWwnLFxuICAgICAgICAgIHRpcFByZWZpeDoge1xuICAgICAgICAgICAgZW46ICdGb3IgbW9yZSBkZXRhaWxzLCBwbGVhc2UgcmVmZXIgdG8gJyxcbiAgICAgICAgICAgIHpoOiAn6K+m5oOF6K+35Y+C6KeBJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ3VuaW9uJyxcbiAgICAgICAgICAgIHRpcDoge1xuICAgICAgICAgICAgICBlbjogJ1NoYXJlZCBMb2FkQmFsYW5jZXInLFxuICAgICAgICAgICAgICB6aDogJ+WFseS6q+Wei+i0n+i9veWdh+ihoScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICdwZXJmb3JtYW5jZScsXG4gICAgICAgICAgICB0aXA6IHtcbiAgICAgICAgICAgICAgZW46ICdEZWRpY2F0ZWQgTG9hZEJhbGFuY2VyLCB3aGljaCBjYW4gYmUgdXNlZCBvbmx5IGluIGNsdXN0ZXJzIG9mIHYxLjE3IGFuZCBsYXRlcicsXG4gICAgICAgICAgICAgIHpoOiAn54us5Lqr5Z6L6LSf6L295Z2H6KGh77yM5LuF5pSv5oyB5ZyoIEt1YmVybmV0ZXMg54mI5pys5Li6IDEuMTcg5Y+K5Lul5LiK55qE6ZuG576k5Lit5L2/55SoJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2t1YmVybmV0ZXMuaW8vZWxiLmVudGVycHJpc2VJRCcsXG4gICAgICAgIHRpcDoge1xuICAgICAgICAgIGVuOiAnU3BlY2lmeSB0aGUgZW50ZXJwcmlzZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBuZXdseSBjcmVhdGVkIGNsb3VkIExvYWRCYWxhbmNlciB3aWxsIGJlbG9uZycsXG4gICAgICAgICAgemg6ICfmjIflrprmlrDliJvlu7rkupHkuIrotJ/ovb3lnYfooaHlmajmiYDlsZ7nmoTkvIHkuJrpobnnm64nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBbQ2x1c3RlclR5cGUuR29vZ2xlQ2xvdWRHS0VdOiB7XG4gICAgbGFiZWw6ICdHS0UnLFxuICAgIGRvY0xpbms6XG4gICAgICAnaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2t1YmVybmV0ZXMtZW5naW5lL2RvY3MvY29uY2VwdHMvc2VydmljZS1sb2FkLWJhbGFuY2VyLXBhcmFtZXRlcnMnLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiAnbmV0d29ya2luZy5na2UuaW8vbG9hZC1iYWxhbmNlci10eXBlJyxcbiAgICAgICAgdGlwOiB7XG4gICAgICAgICAgZW46ICdTcGVjaWZ5IHRoZSB1c2Ugb2YgSW50cmFuZXQnLFxuICAgICAgICAgIHpoOiAn5oyH5a6a5L2/55So5YaF572RJyxcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICdJbnRlcm5hbCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2Nsb3VkLmdvb2dsZS5jb20vbDQtcmJzJyxcbiAgICAgICAgdGlwOiB7XG4gICAgICAgICAgZW46ICdUaGUgZGVmYXVsdCBpcyBwdWJsaWMgbmV0d29yaywgd2hlbiB0aGlzIHBhcmFtZXRlciBpcyBjb25maWd1cmVkLCB0cmFmZmljIHdpbGwgYmUgcm91dGVkIGRpcmVjdGx5IHRvIHRoZSBwb2RzJyxcbiAgICAgICAgICB6aDogJ+m7mOiupOS4uuWFrOe9ke+8jOmFjee9ruatpOWPguaVsOaXtu+8jOa1gemHj+WwhuebtOaOpei3r+eUseiHs+WuueWZqOe7hCcsXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnZW5hYmxlZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1zZXJ2aWNlLWFubm90YXRpb25zLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ2Fubm90YXRpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2Fubm90YXRpb25zLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQXN5bmNQaXBlLFxuICAgIE5nSWYsXG4gICAgTmdGb3JPZixcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIEljb25Nb2R1bGUsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgQXJyYXlGb3JtVGFibGVDb21wb25lbnQsXG4gICAgQXJyYXlGb3JtVGFibGVIZWFkZXJEaXJlY3RpdmUsXG4gICAgQXJyYXlGb3JtVGFibGVSb3dEaXJlY3RpdmUsXG4gICAgQXJyYXlGb3JtVGFibGVSb3dDb250cm9sRGlyZWN0aXZlLFxuICAgIEFycmF5Rm9ybVRhYmxlUm93RXJyb3JEaXJlY3RpdmUsXG4gICAgRXJyb3JzTWFwcGVyTW9kdWxlLFxuICAgIEhlbHBEb2N1bWVudE1vZHVsZSxcbiAgICBQdXJlUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VydmljZUFubm90YXRpb25zRm9ybUNvbXBvbmVudCBleHRlbmRzIEJhc2VTdHJpbmdNYXBGb3JtQ29tcG9uZW50IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgaXNVcGRhdGU6IGJvb2xlYW47XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgY2x1c3RlclR5cGU6IENsdXN0ZXJUeXBlO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHJlc291cmNlTmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBiYXNlSHJlZiA9IGluamVjdChUT0tFTl9CQVNFX0hSRUYpO1xuXG4gIC8vIOemgeeUqOaOieWMheWQqyBjcGFhcy5pbyDlj4ogb3ZuLmt1YmVybmV0ZXMuaW8g55qEIGtleVxuICByZWFkb25seSByZWFkb25seVBhcnRpYWxLZXlzID0gWydvdm4ua3ViZXJuZXRlcy5pbycsIHRoaXMuYmFzZURvbWFpbl07XG5cbiAgYW5ub3RhdGlvbnNFcnJvcnNNYXBwZXIgPSBnZXRLOHNSZXNvdXJjZUFubm90YXRpb25FcnJvck1hcHBlciQoXG4gICAgdGhpcy50cmFuc2xhdGUsXG4gICk7XG5cbiAgS05PV05fQU5OT1RBVElPTlMgPSBLTk9XTl9BTk5PVEFUSU9OUztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQEluamVjdChUT0tFTl9CQVNFX0RPTUFJTikgcHJpdmF0ZSByZWFkb25seSBiYXNlRG9tYWluOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgfVxuXG4gIGZpbHRlck9wdGlvbnMob3B0aW9uczogQW5ub3RhdGlvbkNvbmZpZ09wdGlvbltdIHwgdW5kZWZpbmVkLCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qga2V5cyA9ICh0aGlzLmZvcm0udmFsdWUgYXMgS2V5VmFsdWVUdXBsZVtdKS5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICAgIHJldHVybiBvcHRpb25zPy5maWx0ZXIobyA9PiB7XG4gICAgICBjb25zdCBrZXlJbmRleCA9IGtleXMuaW5kZXhPZihvLmtleSk7XG4gICAgICByZXR1cm4ga2V5SW5kZXggPT09IC0xIHx8IGtleUluZGV4ID09PSBpbmRleDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbmZpZ09wdGlvbihvcHRpb25zOiBBbm5vdGF0aW9uQ29uZmlnT3B0aW9uW10gfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM/LmZpbmQob3B0aW9uID0+IG9wdGlvbi5rZXkgPT09IGtleSk7XG4gIH1cblxuICBpc1JlYWRvbmx5KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNVcGRhdGUgJiYgdGhpcy5yZWFkb25seVBhcnRpYWxLZXlzLnNvbWUoayA9PiBrZXkuaW5jbHVkZXMoaykpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0RGVmYXVsdEZvcm1Nb2RlbCgpOiBLZXlWYWx1ZVR1cGxlW10ge1xuICAgIHJldHVybiBbWycnLCAnJ11dO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRhcHRSZXNvdXJjZU1vZGVsKHJlc291cmNlOiBTdHJpbmdNYXApIHtcbiAgICBsZXQgbmV3Rm9ybU1vZGVsID0gT2JqZWN0LmVudHJpZXMocmVzb3VyY2UgfHwge30pO1xuICAgIC8vIOaOkuW6j++8jOWFiOaMieWtl+avjeaOkuW6j++8jOWGjeaKiiByZWFkb25seSDnmoTmlL7liY3pnaJcbiAgICBuZXdGb3JtTW9kZWwgPSBzb3J0QnkobmV3Rm9ybU1vZGVsLCAoYXJyOiBbc3RyaW5nLCBzdHJpbmddKSA9PiBhcnJbMF0pO1xuICAgIG5ld0Zvcm1Nb2RlbC5zb3J0KChhcnIxOiBbc3RyaW5nLCBzdHJpbmddLCBhcnIyOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICBjb25zdCBmbGFnMSA9IHRoaXMuaXNSZWFkb25seShhcnIxWzBdKTtcbiAgICAgIGNvbnN0IGZsYWcyID0gdGhpcy5pc1JlYWRvbmx5KGFycjJbMF0pO1xuICAgICAgaWYgKChmbGFnMSAmJiBmbGFnMikgfHwgKCFmbGFnMSAmJiAhZmxhZzIpKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsYWcxID8gLTEgOiAxO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0Zvcm1Nb2RlbC5sZW5ndGggPT09IDApIHtcbiAgICAgIG5ld0Zvcm1Nb2RlbCA9IHRoaXMuZ2V0RGVmYXVsdEZvcm1Nb2RlbCgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGb3JtTW9kZWw7XG4gIH1cblxuICBvdmVycmlkZSBnZXRLZXlWYWxpZGF0b3JzKCkge1xuICAgIHJldHVybiBrOHNSZXNvdXJjZUFubm90YXRpb25LZXlWYWxpZGF0b3I7XG4gIH1cblxuICBpc0xhYmVsUmVhZG9ubHkoY29udHJvbDogRm9ybUFycmF5PEZvcm1Db250cm9sPHN0cmluZz4+KSB7XG4gICAgcmV0dXJuIGNvbnRyb2wudmFsaWQgJiYgdGhpcy5pc1JlYWRvbmx5KGNvbnRyb2wuZ2V0KCcwJykudmFsdWUpO1xuICB9XG5cbiAgZ2V0QWN0aXZlQ29uZmlnT3B0aW9uKFxuICAgIG9wdGlvbnM6IEFubm90YXRpb25Db25maWdPcHRpb25bXSB8IHVuZGVmaW5lZCxcbiAgICBrZXk6IHN0cmluZyxcbiAgKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM/LmZpbmQobyA9PiBvLmtleSA9PT0ga2V5KTtcbiAgfVxuXG4gIG9uS2V5U2VsZWN0ZWQoY29udHJvbDogRm9ybUFycmF5PEZvcm1Db250cm9sPHN0cmluZz4+KSB7XG4gICAgY29uc3Qga2V5Q3RybCA9IGNvbnRyb2wuZ2V0KCcwJyk7XG4gICAga2V5Q3RybC5tYXJrQXNEaXJ0eSgpO1xuICAgIGtleUN0cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgLy8gQW5ub3RhdGlvbkNvbmZpZ09wdGlvbi5kb2Mg6YWN572u5LqG5Lqn5ZOBIO+8iHByb2R1Y3TvvInlsZ7mgKfkuYvlkI7pnIDopoHlvZPliY3op4blm77pmrblsZ7kuo7or6Xkuqflk4Hml7bmiY3lsZXnpLogZG9jIOmTvuaOpe+8jOacqumFjee9rueahOivneS4jeWPl+mZkOWItlxuICBzaG93RG9jTGluayhiYXNlSHJlZjogc3RyaW5nLCBwcm9kdWN0Pzoga2V5b2YgdHlwZW9mIFBST0RVQ1RfQkFTRV9IUkVGX01BUCkge1xuICAgIGlmICghcHJvZHVjdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFBST0RVQ1RfQkFTRV9IUkVGX01BUFtwcm9kdWN0XSA9PT0gYmFzZUhyZWY7XG4gIH1cbn1cbiIsIjxhY2wtYXJyYXktZm9ybS10YWJsZVxuICBbZm9ybUdyb3VwXT1cIiRhbnkoZm9ybSlcIlxuICBbcm93c109XCJmb3JtLmNvbnRyb2xzXCJcbiAgKGFkZCk9XCJmb3JtLnB1c2goY3JlYXRlTmV3Q29udHJvbCgpKVwiXG4gIChyZW1vdmUpPVwicmVtb3ZlKCRldmVudClcIlxuICBbcmVzb3VyY2VOYW1lXT1cInJlc291cmNlTmFtZVwiXG4+XG4gIDxuZy1jb250YWluZXIgKmFjbEFycmF5Rm9ybVRhYmxlSGVhZGVyPlxuICAgIDx0aCBjbGFzcz1cImNvbHVtblwiPnt7ICdrZXknIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICA8dGggY2xhc3M9XCJjb2x1bW5cIj57eyAndmFsdWUnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lclxuICAgICphY2xBcnJheUZvcm1UYWJsZVJvdz1cImxldCBjb250cm9sOyBsZXQgaW5kZXggPSBpbmRleFwiXG4gICAgW2Zvcm1Hcm91cE5hbWVdPVwiaW5kZXhcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nSWY9XCJ7XG4gICAgICAgIGNvbmZpZzogS05PV05fQU5OT1RBVElPTlNbY2x1c3RlclR5cGVdLFxuICAgICAgICByZWFkb25seTogaXNMYWJlbFJlYWRvbmx5KGNvbnRyb2wpXG4gICAgICB9IGFzIF9cIlxuICAgID5cbiAgICAgIDx0ZCBjbGFzcz1cImNvbHVtblwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBhdWktaW5wdXRcbiAgICAgICAgICBbcmVhZG9ubHldPVwiXy5yZWFkb25seVwiXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIjBcIlxuICAgICAgICAgIFthdWlBdXRvY29tcGxldGVdPVwia2V5U3VnZ2VzdGlvblwiXG4gICAgICAgICAgKGF1aUF1dG9jb21wbGV0ZVNlbGVjdGVkKT1cIm9uS2V5U2VsZWN0ZWQoY29udHJvbClcIlxuICAgICAgICAvPlxuICAgICAgICA8YXVpLWF1dG9jb21wbGV0ZSAja2V5U3VnZ2VzdGlvbj5cbiAgICAgICAgICA8YXVpLXN1Z2dlc3Rpb25cbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgb3B0aW9uIG9mIF8ucmVhZG9ubHlcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IGZpbHRlck9wdGlvbnMoXy5jb25maWc/Lm9wdGlvbnMsIGluZGV4KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24ua2V5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBvcHRpb24ua2V5IH19XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnRpcCB8IHRyYW5zbGF0ZSBhcyB0aXBcIlxuICAgICAgICAgICAgICBjbGFzcz1cInR3LXRleHQtaGVscC10ZXh0IHR3LXRleHQtc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHRpcCB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9hdWktc3VnZ2VzdGlvbj5cbiAgICAgICAgPC9hdWktYXV0b2NvbXBsZXRlPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgXy5jb25maWc/Lm9wdGlvbnNcbiAgICAgICAgICAgICAgfCBwdXJlOiBnZXRBY3RpdmVDb25maWdPcHRpb246Y29udHJvbC5nZXQoJzAnKS52YWx1ZVxuICAgICAgICAgICAgKT8uZG9jIGFzIGRvY1xuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImJhc2VIcmVmIHwgcHVyZTogc2hvd0RvY0xpbms6ZG9jLnByb2R1Y3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0dy10ZXh0LWhlbHAtdGV4dCB0dy10ZXh0LXMgdHctbXQtNFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRvYy50aXBQcmVmaXhcIj5cbiAgICAgICAgICAgICAge3sgZG9jLnRpcFByZWZpeCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBbYWNsRG9jc109XCJ7XG4gICAgICAgICAgICAgICAgcGF0aDogZG9jLnBhdGgsXG4gICAgICAgICAgICAgICAgcmF3VXJsOiBkb2MucmF3VXJsLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGRvYy50aXAgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPGF1aS1pY29uIGljb249XCJqdW1wXCI+PC9hdWktaWNvbj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgICAgPHRkIGNsYXNzPVwiY29sdW1uXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGF1aS1pbnB1dFxuICAgICAgICAgIFtyZWFkb25seV09XCJfLnJlYWRvbmx5XCJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiMVwiXG4gICAgICAgICAgW2F1aUF1dG9jb21wbGV0ZV09XCJ2YWx1ZVN1Z2dlc3Rpb25cIlxuICAgICAgICAvPlxuICAgICAgICA8YXVpLWF1dG9jb21wbGV0ZSAjdmFsdWVTdWdnZXN0aW9uPlxuICAgICAgICAgIDxhdWktc3VnZ2VzdGlvblxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBvcHRpb24gb2YgXy5yZWFkb25seVxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogKFxuICAgICAgICAgICAgICAgICAgICBfLmNvbmZpZz8ub3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICB8IHB1cmU6IGdldENvbmZpZ09wdGlvbjpjb250cm9sLmdldCgnMCcpLnZhbHVlXG4gICAgICAgICAgICAgICAgICApPy52YWx1ZXNcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBvcHRpb24udmFsdWUgfX1cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udGlwIHwgdHJhbnNsYXRlIGFzIHRpcFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidHctdGV4dC1oZWxwLXRleHQgdHctdGV4dC1zXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdGlwIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2F1aS1zdWdnZXN0aW9uPlxuICAgICAgICA8L2F1aS1hdXRvY29tcGxldGU+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICBfLmNvbmZpZz8ub3B0aW9uc1xuICAgICAgICAgICAgICB8IHB1cmU6IGdldEFjdGl2ZUNvbmZpZ09wdGlvbjpjb250cm9sLmdldCgnMCcpLnZhbHVlXG4gICAgICAgICAgICApPy52YWx1ZSBhcyB2YWx1ZUNvbmZpZ1xuICAgICAgICAgIFwiXG4gICAgICAgICAgY2xhc3M9XCJ0dy10ZXh0LWhlbHAtdGV4dCB0dy10ZXh0LXNcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJjb250cm9sLmdldCgnMScpLnZhbHVlID09PSB2YWx1ZUNvbmZpZy5leGFtcGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctdGV4dC15ZWxsb3cgdHctbXQtNFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ3JlYWRfZmlsbGluZ19pbnN0cnVjdGlvbnNfdGlwJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1icmVhay1hbGwgdHctbXktNFwiPlxuICAgICAgICAgICAge3sgdmFsdWVDb25maWcudGlwIHwgdHJhbnNsYXRlOiB7IGV4YW1wbGU6IHZhbHVlQ29uZmlnLmV4YW1wbGUgfSB9fVxuICAgICAgICAgICAgPGF1aS1pY29uXG4gICAgICAgICAgICAgIGNsYXNzPVwidHctdGV4dC1wcmltYXJ5IHR3LWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgaWNvbj1cImFycm93X3R1cm5fdXBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY29udHJvbC5nZXQoJzEnKS5zZXRWYWx1ZSh2YWx1ZUNvbmZpZy5leGFtcGxlKVwiXG4gICAgICAgICAgICA+PC9hdWktaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgW2hyZWZdPVwidmFsdWVDb25maWcuZG9jTGlua1wiXG4gICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ2ZpbGxpbmdfaW5zdHJ1Y3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPGF1aS1pY29uIGljb249XCJqdW1wXCI+PC9hdWktaWNvbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqYWNsQXJyYXlGb3JtVGFibGVSb3dFcnJvcj1cImxldCBjb250cm9sXCI+XG4gICAgPHRkXG4gICAgICAqbmdJZj1cImNvbnRyb2wuaW52YWxpZFwiXG4gICAgICBjb2xzcGFuPVwiM1wiXG4gICAgICBjbGFzcz1cImFjbC10YWJsZS1mb3JtLWVycm9yLWhpbnRcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLmVycm9ycz8ua2V5SXNNaXNzaW5nXCI+XG4gICAgICAgIHt7ICdrOHNfcmVzb3VyY2VfbGFiZWxfa2V5X3JlcXVpcmVkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLmVycm9ycz8uZHVwbGljYXRlRXJyb3JcIj5cbiAgICAgICAge3sgJ2s4c19yZXNvdXJjZV9sYWJlbF9rZXlfZHVwbGljYXRlZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICAgICAgYXVpRm9ybUl0ZW1FcnJvclxuICAgICAgICBbZXJyb3JzXT1cImNvbnRyb2wuZ2V0KCcwJykuZXJyb3JzXCJcbiAgICAgICAgW2Vycm9yc01hcHBlcl09XCIoYW5ub3RhdGlvbnNFcnJvcnNNYXBwZXIgfCBhc3luYykua2V5XCJcbiAgICAgID48L2FjbC1lcnJvcnMtbWFwcGVyPlxuICAgICAgPGFjbC1lcnJvcnMtbWFwcGVyXG4gICAgICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICAgICAgW2Vycm9yc109XCJjb250cm9sLmdldCgnMScpLmVycm9yc1wiXG4gICAgICA+PC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgICA8L3RkPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICphY2xBcnJheUZvcm1UYWJsZVJvd0NvbnRyb2w9XCJsZXQgaXRlbTsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICA8YnV0dG9uXG4gICAgICBhdWktYnV0dG9uPVwidGV4dFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtzcXVhcmVdPVwidHJ1ZVwiXG4gICAgICBbcGxhaW5dPVwidHJ1ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiaXNMYWJlbFJlYWRvbmx5KGl0ZW0pXCJcbiAgICAgIChjbGljayk9XCJyZW1vdmUoaW5kZXgpXCJcbiAgICA+XG4gICAgICA8YXVpLWljb24gaWNvbj1cIm1pbnVzX2NpcmNsZVwiPjwvYXVpLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbmctY29udGFpbmVyPlxuPC9hY2wtYXJyYXktZm9ybS10YWJsZT5cblxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG48ZGl2XG4gICpuZ0lmPVwiS05PV05fQU5OT1RBVElPTlNbY2x1c3RlclR5cGVdIGFzIGNvbmZpZ1wiXG4gIGNsYXNzPVwidHctdGV4dC1oZWxwLXRleHQgdHctdGV4dC1zIHR3LW10LTRcIlxuPlxuICA8bmctY29udGFpbmVyIFthY2xUcmFuc2xhdGVdPVwiJ2RvY3VtZW50YXRpb25fZm9yX2xiX3NlcnZpY2VfYW5ub3RhdGlvbnMnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqYWNsVHJhbnNsYXRlVGV4dD1cImxldCB0ZXh0XCI+e3sgdGV4dCB9fTwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKmFjbFRyYW5zbGF0ZU1hdGNoPVwiJ3R5cGUnXCI+e3sgY29uZmlnLmxhYmVsIH19PC9uZy1jb250YWluZXI+XG4gICAgPGFcbiAgICAgICphY2xUcmFuc2xhdGVNYXRjaD1cIidkb2N1bWVudGF0aW9uJ1wiXG4gICAgICBbaHJlZl09XCJjb25maWcuZG9jTGlua1wiXG4gICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgPlxuICAgICAge3sgJ2RvY3VtZW50YXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICA8YXVpLWljb24gaWNvbj1cImp1bXBcIj48L2F1aS1pY29uPiA8L2FcbiAgPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=