@alauda-fe/network 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +10 -2
- package/esm2022/lib/components/certificate-status/component.mjs +7 -6
- package/esm2022/lib/components/fixed-ip/component.mjs +135 -91
- package/esm2022/lib/components/loadbalancer-spec-form/component.mjs +57 -57
- package/esm2022/lib/components/service-annotations-form/annotations.component.mjs +136 -142
- package/esm2022/lib/components/service-annotations-form-item/annotations.component.mjs +24 -25
- package/esm2022/lib/components/service-form/component.mjs +34 -33
- package/esm2022/lib/components/service-form/fieldset/component.mjs +92 -95
- package/esm2022/lib/directives/subnet-validator.directive.mjs +5 -5
- package/esm2022/lib/features/network-policy/components/add-peer-rule-handler/component.mjs +69 -0
- package/esm2022/lib/features/network-policy/components/ip-block-display/component.mjs +54 -0
- package/esm2022/lib/features/network-policy/components/label-selector-display/component.mjs +117 -0
- package/esm2022/lib/features/network-policy/components/peer-container/component.mjs +81 -0
- package/esm2022/lib/features/network-policy/components/pod-review/component.mjs +250 -0
- package/esm2022/lib/features/network-policy/components/rule-table/component.mjs +269 -0
- package/esm2022/lib/features/network-policy/form/network-policy/component.mjs +429 -0
- package/esm2022/lib/features/network-policy/form/network-policy-ip-block/component.mjs +102 -0
- package/esm2022/lib/features/network-policy/form/network-policy-peer/component.mjs +247 -0
- package/esm2022/lib/features/network-policy/form/network-policy-ports/component.mjs +161 -0
- package/esm2022/lib/features/network-policy/form/network-policy-remote-except-input/component.mjs +128 -0
- package/esm2022/lib/features/network-policy/form/network-policy-rule/component.mjs +142 -0
- package/esm2022/lib/services/alb-api.service.mjs +26 -6
- package/esm2022/lib/services/certificate-api.service.mjs +4 -4
- package/esm2022/lib/services/network-util.service.mjs +22 -13
- package/esm2022/lib/services/subnet-util.service.mjs +118 -0
- package/esm2022/lib/types/alb-exports.mjs +1 -1
- package/esm2022/lib/types/k8s-exports.mjs +2 -1
- package/esm2022/lib/types/metallb-exports.mjs +2 -0
- package/esm2022/lib/types/resource-definition.mjs +28 -2
- package/esm2022/lib/utils/alb-exports.mjs +1 -1
- package/esm2022/lib/utils/cidr-exports.mjs +3 -3
- package/esm2022/lib/utils/common-exports.mjs +22 -0
- package/esm2022/lib/utils/service-exports.mjs +1 -1
- package/esm2022/lib/utils/validators-exports.mjs +44 -0
- package/index.d.ts +9 -1
- package/lib/components/fixed-ip/component.d.ts +10 -3
- package/lib/components/service-annotations-form/annotations.component.d.ts +6 -6
- package/lib/components/service-annotations-form-item/annotations.component.d.ts +1 -1
- package/lib/components/service-form/component.d.ts +1 -1
- package/lib/features/network-policy/components/add-peer-rule-handler/component.d.ts +8 -0
- package/lib/features/network-policy/components/ip-block-display/component.d.ts +7 -0
- package/lib/features/network-policy/components/label-selector-display/component.d.ts +13 -0
- package/lib/features/network-policy/components/peer-container/component.d.ts +18 -0
- package/lib/features/network-policy/components/pod-review/component.d.ts +37 -0
- package/lib/features/network-policy/components/rule-table/component.d.ts +21 -0
- package/lib/features/network-policy/form/network-policy/component.d.ts +70 -0
- package/lib/features/network-policy/form/network-policy-ip-block/component.d.ts +23 -0
- package/lib/features/network-policy/form/network-policy-peer/component.d.ts +43 -0
- package/lib/features/network-policy/form/network-policy-ports/component.d.ts +17 -0
- package/lib/features/network-policy/form/network-policy-remote-except-input/component.d.ts +23 -0
- package/lib/features/network-policy/form/network-policy-rule/component.d.ts +28 -0
- package/lib/services/alb-api.service.d.ts +4 -2
- package/lib/services/network-util.service.d.ts +4 -2
- package/lib/services/subnet-util.service.d.ts +26 -0
- package/lib/types/alb-exports.d.ts +23 -0
- package/lib/types/k8s-exports.d.ts +51 -1
- package/lib/types/metallb-exports.d.ts +65 -0
- package/lib/types/resource-definition.d.ts +154 -0
- package/lib/utils/common-exports.d.ts +5 -0
- package/lib/utils/validators-exports.d.ts +16 -0
- package/package.json +9 -4
- package/styles.css +1 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import { K8sApiService, K8sUtilService, ObservableInput, publishRef, skipError, matchExpressionsToString, bind, TranslateModule, ErrorsMapperModule, RESOURCE_TYPES, E2eAttributeBindingDirective, TranslateService, } from '@alauda-fe/common';
|
|
2
|
+
import { AutocompleteModule, CommonFormControl, FormItemWidth, FormModule, IconModule, InputModule, TagModule, TagsInputComponent, TooltipModule, } from '@alauda/ui';
|
|
3
|
+
import { K8sApiService, K8sUtilService, ObservableInput, publishRef, skipError, matchExpressionsToString, bind, TRANSLATE_MODULE, RESOURCE_TYPES, E2eAttributeBindingDirective, TranslateService, ERRORS_MAPPER_MODULE, PurePipe, } from '@alauda-fe/common';
|
|
5
4
|
import { AsyncPipe, NgFor, NgIf } from '@angular/common';
|
|
6
5
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, forwardRef, } from '@angular/core';
|
|
7
6
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
@@ -10,7 +9,7 @@ import { uniq, values } from 'lodash-es';
|
|
|
10
9
|
import { Observable, combineLatest, filter, first, fromEvent, map, merge, of, switchMap, forkJoin, startWith, tap, } from 'rxjs';
|
|
11
10
|
import { NetworkUtilService } from '../../services/network-util.service';
|
|
12
11
|
import { NETWORK_RESOURCE_TYPES } from '../../types/resource-definition';
|
|
13
|
-
import { IPMode, NetworkMode, adaptIpMode, adaptSubnetCidrs, getIpAddressSuggestionsByCidrs, ipAddressEqual, isBelongCidr, isBroadcastAddr, isIpAddressValid, isNetworkAddr, } from '../../utils/cidr-exports';
|
|
12
|
+
import { IPMode, NetworkMode, adaptIpMode, adaptSubnetCidrs, getIpAddressSuggestionsByCidrs, ipAddressEqual, isBelongCidr, isBroadcastAddr, isIpAddressValid, isNetworkAddr, getAddressBuilder, } from '../../utils/cidr-exports';
|
|
14
13
|
import { ClusterNetworkType, KUBE_OVN_ANNOTATION_PREFIX, } from '../../utils/subnet-exports';
|
|
15
14
|
import * as i0 from "@angular/core";
|
|
16
15
|
import * as i1 from "@alauda-fe/common";
|
|
@@ -19,64 +18,79 @@ import * as i3 from "@alauda/ui";
|
|
|
19
18
|
import * as i4 from "@angular/forms";
|
|
20
19
|
const _c0 = ["ipAddress"];
|
|
21
20
|
const _c1 = ["tagsInput"];
|
|
21
|
+
const _c2 = a0 => ({ cidr: a0 });
|
|
22
22
|
function FixedIpInputComponent_input_4_Template(rf, ctx) { if (rf & 1) {
|
|
23
|
-
const
|
|
24
|
-
i0.ɵɵelementStart(0, "input",
|
|
25
|
-
i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_input_4_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r7.emitValue($event)); });
|
|
23
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
24
|
+
i0.ɵɵelementStart(0, "input", 11, 1);
|
|
26
25
|
i0.ɵɵpipe(2, "translate");
|
|
26
|
+
i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_input_4_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.emitValue($event)); });
|
|
27
27
|
i0.ɵɵelementEnd();
|
|
28
28
|
} if (rf & 2) {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
i0.ɵɵproperty("ngModel",
|
|
29
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
30
|
+
const suggestions_r3 = i0.ɵɵreference(7);
|
|
31
|
+
i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(2, 3, "dhcp_placeholder"))("auiAutocomplete", suggestions_r3);
|
|
32
32
|
} }
|
|
33
33
|
function FixedIpInputComponent_aui_tags_input_5_Template(rf, ctx) { if (rf & 1) {
|
|
34
|
-
const
|
|
35
|
-
i0.ɵɵelementStart(0, "aui-tags-input",
|
|
36
|
-
i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_aui_tags_input_5_Template_aui_tags_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.emitValue(ctx_r11.uniq($event))); });
|
|
34
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
35
|
+
i0.ɵɵelementStart(0, "aui-tags-input", 12, 2);
|
|
37
36
|
i0.ɵɵpipe(3, "translate");
|
|
37
|
+
i0.ɵɵlistener("ngModelChange", function FixedIpInputComponent_aui_tags_input_5_Template_aui_tags_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.emitValue(ctx_r1.uniq($event))); });
|
|
38
38
|
i0.ɵɵelementEnd();
|
|
39
39
|
} if (rf & 2) {
|
|
40
40
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
41
|
-
const
|
|
42
|
-
i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(3, 4, "dhcp_placeholder"))("auiAutocomplete",
|
|
41
|
+
const suggestions_r3 = i0.ɵɵreference(7);
|
|
42
|
+
i0.ɵɵproperty("ngModel", ctx_r1.model)("placeholder", ctx_r1.placeholder || i0.ɵɵpipeBind1(3, 4, "dhcp_placeholder"))("auiAutocomplete", suggestions_r3)("inputAsyncValidator", ctx_r1.validate);
|
|
43
|
+
} }
|
|
44
|
+
function FixedIpInputComponent_aui_suggestion_8_aui_tag_2_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
+
i0.ɵɵelementStart(0, "aui-tag", 15);
|
|
46
|
+
i0.ɵɵtext(1);
|
|
47
|
+
i0.ɵɵpipe(2, "translate");
|
|
48
|
+
i0.ɵɵelementEnd();
|
|
49
|
+
} if (rf & 2) {
|
|
50
|
+
i0.ɵɵproperty("border", true)("size", "mini");
|
|
51
|
+
i0.ɵɵadvance();
|
|
52
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 3, "network.reserved_ip"), " ");
|
|
43
53
|
} }
|
|
44
54
|
function FixedIpInputComponent_aui_suggestion_8_Template(rf, ctx) { if (rf & 1) {
|
|
45
55
|
i0.ɵɵelementStart(0, "aui-suggestion", 13);
|
|
46
56
|
i0.ɵɵtext(1);
|
|
57
|
+
i0.ɵɵtemplate(2, FixedIpInputComponent_aui_suggestion_8_aui_tag_2_Template, 3, 5, "aui-tag", 14);
|
|
58
|
+
i0.ɵɵpipe(3, "pure");
|
|
47
59
|
i0.ɵɵelementEnd();
|
|
48
60
|
} if (rf & 2) {
|
|
49
|
-
const
|
|
50
|
-
i0.ɵɵ
|
|
51
|
-
i0.ɵɵ
|
|
52
|
-
i0.ɵɵ
|
|
61
|
+
const ipAddressSuggestion_r5 = ctx.$implicit;
|
|
62
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
63
|
+
i0.ɵɵproperty("value", ipAddressSuggestion_r5);
|
|
64
|
+
i0.ɵɵadvance();
|
|
65
|
+
i0.ɵɵtextInterpolate1(" ", ipAddressSuggestion_r5, " ");
|
|
66
|
+
i0.ɵɵadvance();
|
|
67
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind3(3, 3, ipAddressSuggestion_r5, ctx_r1.isReservedIp, ctx_r1.$subnetInfo().excludeIps));
|
|
53
68
|
} }
|
|
54
69
|
function FixedIpInputComponent_ng_container_14_aui_icon_1_Template(rf, ctx) { if (rf & 1) {
|
|
55
|
-
i0.ɵɵelement(0, "aui-icon",
|
|
70
|
+
i0.ɵɵelement(0, "aui-icon", 18);
|
|
56
71
|
} if (rf & 2) {
|
|
57
|
-
const
|
|
58
|
-
i0.ɵɵproperty("auiTooltip",
|
|
72
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
73
|
+
i0.ɵɵproperty("auiTooltip", ctx_r1.addonTip);
|
|
59
74
|
} }
|
|
60
75
|
function FixedIpInputComponent_ng_container_14_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
-
i0.ɵɵelementContainerStart(0,
|
|
62
|
-
i0.ɵɵtemplate(1, FixedIpInputComponent_ng_container_14_aui_icon_1_Template, 1, 1, "aui-icon",
|
|
76
|
+
i0.ɵɵelementContainerStart(0, 16);
|
|
77
|
+
i0.ɵɵtemplate(1, FixedIpInputComponent_ng_container_14_aui_icon_1_Template, 1, 1, "aui-icon", 17);
|
|
63
78
|
i0.ɵɵelementContainerEnd();
|
|
64
79
|
} if (rf & 2) {
|
|
65
|
-
const
|
|
66
|
-
i0.ɵɵadvance(
|
|
67
|
-
i0.ɵɵproperty("ngIf",
|
|
80
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
81
|
+
i0.ɵɵadvance();
|
|
82
|
+
i0.ɵɵproperty("ngIf", ctx_r1.addonTip);
|
|
68
83
|
} }
|
|
69
|
-
const _c2 = function (a0) { return { cidr: a0 }; };
|
|
70
84
|
function FixedIpInputComponent_div_18_Template(rf, ctx) { if (rf & 1) {
|
|
71
|
-
i0.ɵɵelementStart(0, "div",
|
|
85
|
+
i0.ɵɵelementStart(0, "div", 19);
|
|
72
86
|
i0.ɵɵtext(1);
|
|
73
|
-
i0.ɵɵpipe(2, "
|
|
74
|
-
i0.ɵɵpipe(3, "
|
|
87
|
+
i0.ɵɵpipe(2, "async");
|
|
88
|
+
i0.ɵɵpipe(3, "translate");
|
|
75
89
|
i0.ɵɵelementEnd();
|
|
76
90
|
} if (rf & 2) {
|
|
77
|
-
const
|
|
78
|
-
i0.ɵɵadvance(
|
|
79
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
91
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
92
|
+
i0.ɵɵadvance();
|
|
93
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.hint || i0.ɵɵpipeBind2(3, 3, "network.fix_ip_should_belong_tip", i0.ɵɵpureFunction1(6, _c2, i0.ɵɵpipeBind1(2, 1, ctx_r1.cidr$))), " ");
|
|
80
94
|
} }
|
|
81
95
|
export class FixedIpInputComponent extends CommonFormControl {
|
|
82
96
|
get isCalico() {
|
|
@@ -115,6 +129,7 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
115
129
|
subnets: [subnet],
|
|
116
130
|
subnet,
|
|
117
131
|
gateway: subnet.spec?.gateway,
|
|
132
|
+
excludeIps: subnet.spec?.excludeIps,
|
|
118
133
|
})
|
|
119
134
|
: this.isCalico
|
|
120
135
|
? this.k8sApi
|
|
@@ -127,18 +142,20 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
127
142
|
subnets,
|
|
128
143
|
subnet: null,
|
|
129
144
|
gateway: '',
|
|
145
|
+
excludeIps: [],
|
|
130
146
|
})))
|
|
131
147
|
: of({
|
|
132
148
|
cluster,
|
|
133
149
|
subnets: [],
|
|
134
150
|
subnet: null,
|
|
135
151
|
gateway: '',
|
|
152
|
+
excludeIps: [],
|
|
136
153
|
})));
|
|
137
154
|
this.subnetInfo$ = combineLatest([
|
|
138
155
|
this.networkMode$,
|
|
139
156
|
this.namespaceResource$.pipe(filter(Boolean)),
|
|
140
157
|
this.subnetDetails$,
|
|
141
|
-
]).pipe(map(([networkMode, namespace, { cluster, subnets, subnet, gateway }]) => {
|
|
158
|
+
]).pipe(map(([networkMode, namespace, { cluster, subnets, subnet, gateway, excludeIps },]) => {
|
|
142
159
|
return {
|
|
143
160
|
cluster,
|
|
144
161
|
subnetCidrs: this.isCalico
|
|
@@ -148,14 +165,19 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
148
165
|
type: 'cidr',
|
|
149
166
|
baseDomain: KUBE_OVN_ANNOTATION_PREFIX,
|
|
150
167
|
})
|
|
151
|
-
: subnet.spec?.cidrBlock ?? '', this.$networkMode(), this.enableFixIpV6ForDual),
|
|
168
|
+
: (subnet.spec?.cidrBlock ?? ''), this.$networkMode(), this.enableFixIpV6ForDual),
|
|
152
169
|
subnetName: subnet == null
|
|
153
|
-
? this.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
170
|
+
? this.isCalico
|
|
171
|
+
? this.networkUtilService
|
|
172
|
+
.getCalicoSubnetNames(namespace, this.$networkMode())
|
|
173
|
+
.join(',')
|
|
174
|
+
: this.k8sUtil.getAnnotation(namespace, {
|
|
175
|
+
type: 'logical_switch',
|
|
176
|
+
baseDomain: KUBE_OVN_ANNOTATION_PREFIX,
|
|
177
|
+
})
|
|
157
178
|
: this.k8sUtil.getName(subnet),
|
|
158
179
|
gateway,
|
|
180
|
+
excludeIps: excludeIps || [],
|
|
159
181
|
};
|
|
160
182
|
}), switchMap(subnetInfo => {
|
|
161
183
|
if (this.networkType === ClusterNetworkType.KUBE_OVN &&
|
|
@@ -173,6 +195,7 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
173
195
|
.map(item => item.spec?.gateway)
|
|
174
196
|
.filter(Boolean)
|
|
175
197
|
.join(','),
|
|
198
|
+
excludeIps: uniq(subnetList.flatMap(item => item.spec?.excludeIps)),
|
|
176
199
|
}
|
|
177
200
|
: subnetInfo));
|
|
178
201
|
}
|
|
@@ -195,10 +218,11 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
195
218
|
subnetCidrs: adaptSubnetCidrs(subnet.spec.cidrBlock, this.$networkMode(), this.enableFixIpV6ForDual),
|
|
196
219
|
subnetName: this.k8sUtil.getName(subnet),
|
|
197
220
|
gateway: subnet.spec.gateway,
|
|
221
|
+
excludeIps: subnet.spec.excludeIps,
|
|
198
222
|
})));
|
|
199
223
|
}), publishRef());
|
|
200
224
|
this.$subnetInfo = toSignal(this.subnetInfo$);
|
|
201
|
-
this.cidr$ = this.subnetInfo$.pipe(map(subnetInfo => subnetInfo?.subnetCidrs.join('、')));
|
|
225
|
+
this.cidr$ = this.subnetInfo$.pipe(map(subnetInfo => uniq(subnetInfo?.subnetCidrs).join('、')));
|
|
202
226
|
this.innerErrorsMapper$ = combineLatest([
|
|
203
227
|
this.cidr$,
|
|
204
228
|
this.translate.locale$,
|
|
@@ -229,30 +253,28 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
229
253
|
this.cluster$,
|
|
230
254
|
this.subnetInfo$,
|
|
231
255
|
this.model$.pipe(first()),
|
|
232
|
-
]).pipe(switchMap(([cluster, { subnetName, gateway }, ip]) => this.
|
|
233
|
-
|
|
234
|
-
:
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
return usedIps;
|
|
255
|
-
}, gateway.split(','))))), publishRef());
|
|
256
|
+
]).pipe(switchMap(([cluster, { subnetName, gateway }, ip]) => this.k8sApi
|
|
257
|
+
.getResourceList({
|
|
258
|
+
type: NETWORK_RESOURCE_TYPES.SUBNET_KUBE_OVN_IP,
|
|
259
|
+
cluster,
|
|
260
|
+
queryParams: {
|
|
261
|
+
labelSelector: matchExpressionsToString([
|
|
262
|
+
{
|
|
263
|
+
key: `${KUBE_OVN_ANNOTATION_PREFIX}/subnet`,
|
|
264
|
+
operator: 'in',
|
|
265
|
+
values: subnetName.split(','),
|
|
266
|
+
},
|
|
267
|
+
]),
|
|
268
|
+
},
|
|
269
|
+
})
|
|
270
|
+
.pipe(map(res => res.items), skipError([]), map(subnetIps => subnetIps.reduce((usedIps, { spec: { ipAddress } }) => {
|
|
271
|
+
ipAddress.split(',').forEach(item => {
|
|
272
|
+
if (ip !== item) {
|
|
273
|
+
usedIps.push(item);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
return usedIps;
|
|
277
|
+
}, gateway.split(','))))), publishRef());
|
|
256
278
|
this.$usedIps = toSignal(this.usedIps$);
|
|
257
279
|
this.ipAddressSuggestions$ = combineLatest([
|
|
258
280
|
this.subnetInfo$,
|
|
@@ -267,6 +289,20 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
267
289
|
...(Array.isArray(addedIps) ? addedIps : [addedIps].filter(Boolean)),
|
|
268
290
|
], inputValue, this.isCalico)), startWith([]), skipError([]), publishRef());
|
|
269
291
|
}
|
|
292
|
+
isReservedIp(ip, excludeIps) {
|
|
293
|
+
const Builder = getAddressBuilder(this.adaptIpMode(ip));
|
|
294
|
+
return excludeIps.some(excludeIp => {
|
|
295
|
+
if (excludeIp.includes('..')) {
|
|
296
|
+
const [start, end] = excludeIp?.split('..');
|
|
297
|
+
const _Builder = getAddressBuilder(this.adaptIpMode(start));
|
|
298
|
+
const _startAddress = new _Builder(start).bigInteger();
|
|
299
|
+
const _endAddress = new _Builder(end).bigInteger();
|
|
300
|
+
const _ip = new Builder(ip).bigInteger();
|
|
301
|
+
return (_startAddress.compareTo(_ip) <= 0 && _ip.compareTo(_endAddress) <= 0);
|
|
302
|
+
}
|
|
303
|
+
return excludeIp === ip;
|
|
304
|
+
});
|
|
305
|
+
}
|
|
270
306
|
registerOnValidatorChange(fn) {
|
|
271
307
|
this.onValidatorChange = fn;
|
|
272
308
|
}
|
|
@@ -278,7 +314,7 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
278
314
|
}
|
|
279
315
|
setErrors(errors) {
|
|
280
316
|
const combinedErrors = this.multiple
|
|
281
|
-
? { ...this.
|
|
317
|
+
? { ...this.errors, ...errors } // 可能存在传入的 errors
|
|
282
318
|
: errors;
|
|
283
319
|
const validationErrors = values(combinedErrors).length
|
|
284
320
|
? combinedErrors
|
|
@@ -355,51 +391,50 @@ export class FixedIpInputComponent extends CommonFormControl {
|
|
|
355
391
|
useExisting: forwardRef(() => FixedIpInputComponent),
|
|
356
392
|
multi: true,
|
|
357
393
|
},
|
|
358
|
-
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 20, vars: 24, consts: [[3, "width"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "ngModelChange", 4, "ngIf"], ["class", "flex-1", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator", "ngModelChange", 4, "ngIf"], [
|
|
359
|
-
i0.ɵɵelementStart(0, "aui-form-item",
|
|
394
|
+
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 20, vars: 24, consts: [["suggestions", ""], ["ipAddress", "ngModel"], ["tagsInput", "", "ipAddress", "ngModel"], [3, "width"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "ngModelChange", 4, "ngIf"], ["class", "flex-1", "auiFormItemControl", "", 3, "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator", "ngModelChange", 4, "ngIf"], [3, "value", 4, "ngFor", "ngForOf"], ["auiFormItemAddon", "", 4, "ngIf"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["auiFormItemHint", "", 4, "ngIf"], ["aui-input", "", "auiFormItemControl", "", 3, "ngModelChange", "ngModel", "placeholder", "auiAutocomplete"], ["auiFormItemControl", "", 1, "flex-1", 3, "ngModelChange", "ngModel", "placeholder", "auiAutocomplete", "inputAsyncValidator"], [3, "value"], ["type", "info", 3, "border", "size", 4, "ngIf"], ["type", "info", 3, "border", "size"], ["auiFormItemAddon", ""], ["icon", "question_circle", "class", "icon--help", "auiTooltipPosition", "end", 3, "auiTooltip", 4, "ngIf"], ["icon", "question_circle", "auiTooltipPosition", "end", 1, "icon--help", 3, "auiTooltip"], ["auiFormItemHint", ""]], template: function FixedIpInputComponent_Template(rf, ctx) { if (rf & 1) {
|
|
395
|
+
i0.ɵɵelementStart(0, "aui-form-item", 3)(1, "label", 4);
|
|
360
396
|
i0.ɵɵtext(2);
|
|
361
397
|
i0.ɵɵpipe(3, "translate");
|
|
362
398
|
i0.ɵɵelementEnd();
|
|
363
|
-
i0.ɵɵtemplate(4, FixedIpInputComponent_input_4_Template, 3, 5, "input",
|
|
364
|
-
i0.ɵɵ
|
|
365
|
-
i0.ɵɵ
|
|
366
|
-
i0.ɵɵtemplate(8, FixedIpInputComponent_aui_suggestion_8_Template, 2, 2, "aui-suggestion", 5);
|
|
399
|
+
i0.ɵɵtemplate(4, FixedIpInputComponent_input_4_Template, 3, 5, "input", 5)(5, FixedIpInputComponent_aui_tags_input_5_Template, 4, 6, "aui-tags-input", 6);
|
|
400
|
+
i0.ɵɵelementStart(6, "aui-autocomplete", null, 0);
|
|
401
|
+
i0.ɵɵtemplate(8, FixedIpInputComponent_aui_suggestion_8_Template, 4, 7, "aui-suggestion", 7);
|
|
367
402
|
i0.ɵɵpipe(9, "async");
|
|
368
403
|
i0.ɵɵelementStart(10, "aui-autocomplete-placeholder");
|
|
369
404
|
i0.ɵɵtext(11);
|
|
370
|
-
i0.ɵɵpipe(12, "
|
|
371
|
-
i0.ɵɵpipe(13, "
|
|
405
|
+
i0.ɵɵpipe(12, "async");
|
|
406
|
+
i0.ɵɵpipe(13, "translate");
|
|
372
407
|
i0.ɵɵelementEnd()();
|
|
373
|
-
i0.ɵɵtemplate(14, FixedIpInputComponent_ng_container_14_Template, 2, 1, "ng-container",
|
|
374
|
-
i0.ɵɵelement(15, "acl-errors-mapper",
|
|
408
|
+
i0.ɵɵtemplate(14, FixedIpInputComponent_ng_container_14_Template, 2, 1, "ng-container", 8);
|
|
409
|
+
i0.ɵɵelement(15, "acl-errors-mapper", 9);
|
|
375
410
|
i0.ɵɵpipe(16, "async");
|
|
376
411
|
i0.ɵɵpipe(17, "async");
|
|
377
|
-
i0.ɵɵtemplate(18, FixedIpInputComponent_div_18_Template, 4, 8, "div",
|
|
412
|
+
i0.ɵɵtemplate(18, FixedIpInputComponent_div_18_Template, 4, 8, "div", 10);
|
|
378
413
|
i0.ɵɵpipe(19, "async");
|
|
379
414
|
i0.ɵɵelementEnd();
|
|
380
415
|
} if (rf & 2) {
|
|
381
416
|
i0.ɵɵproperty("width", ctx.formItemWidth);
|
|
382
417
|
i0.ɵɵadvance(2);
|
|
383
|
-
i0.ɵɵtextInterpolate(ctx.label || i0.ɵɵpipeBind1(3, 10, "ip_address"));
|
|
418
|
+
i0.ɵɵtextInterpolate(ctx.label || i0.ɵɵpipeBind1(3, 10, "network.ip_address"));
|
|
384
419
|
i0.ɵɵadvance(2);
|
|
385
420
|
i0.ɵɵproperty("ngIf", !ctx.multiple);
|
|
386
|
-
i0.ɵɵadvance(
|
|
421
|
+
i0.ɵɵadvance();
|
|
387
422
|
i0.ɵɵproperty("ngIf", ctx.multiple);
|
|
388
423
|
i0.ɵɵadvance(3);
|
|
389
424
|
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(9, 12, ctx.ipAddressSuggestions$));
|
|
390
425
|
i0.ɵɵadvance(3);
|
|
391
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(
|
|
426
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(13, 16, i0.ɵɵpipeBind1(12, 14, ctx.ipAddressSuggestions$) ? "network.no_available_suggestion" : "loading"), " ");
|
|
392
427
|
i0.ɵɵadvance(3);
|
|
393
428
|
i0.ɵɵproperty("ngIf", ctx.addonTip != null);
|
|
394
|
-
i0.ɵɵadvance(
|
|
429
|
+
i0.ɵɵadvance();
|
|
395
430
|
i0.ɵɵproperty("errors", (ctx.ipAddress == null ? null : ctx.ipAddress.errors == null ? null : ctx.ipAddress.errors.input_data_error) || (ctx.ipAddress == null ? null : ctx.ipAddress.errors) || i0.ɵɵpipeBind1(16, 18, ctx.inputErrors$))("errorsMapper", i0.ɵɵpipeBind1(17, 20, ctx.combinedErrorsMapper$));
|
|
396
431
|
i0.ɵɵadvance(3);
|
|
397
432
|
i0.ɵɵproperty("ngIf", ctx.hint !== null && (ctx.hint || i0.ɵɵpipeBind1(19, 22, ctx.cidr$)));
|
|
398
433
|
} }, dependencies: [AutocompleteModule, i3.AutoCompleteDirective, i3.CustomAutoCompleteDirective, i3.AutocompleteComponent, i3.SuggestionComponent, i3.AutocompletePlaceholderComponent, AsyncPipe,
|
|
399
|
-
|
|
400
|
-
|
|
434
|
+
PurePipe,
|
|
435
|
+
E2eAttributeBindingDirective, i1.ErrorsMapperComponent, FormModule, i3.FormItemComponent, i3.FormItemAddonDirective, i3.FormItemErrorDirective, i3.FormItemHintDirective, i3.FormItemLabelDirective, i3.FormItemControlDirective, NgIf,
|
|
401
436
|
NgFor,
|
|
402
|
-
InputModule, i3.InputComponent, i3.TagsInputComponent, IconModule, i3.IconComponent, TooltipModule, i3.TooltipDirective, FormsModule, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel,
|
|
437
|
+
InputModule, i3.InputComponent, i3.TagsInputComponent, IconModule, i3.IconComponent, TooltipModule, i3.TooltipDirective, FormsModule, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel, TagModule, i3.TagComponent, i1.TranslatePipe], styles: ["[_nghost-%COMP%]:not(:last-child) aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:16px}"], changeDetection: 0 }); }
|
|
403
438
|
}
|
|
404
439
|
__decorate([
|
|
405
440
|
ObservableInput(),
|
|
@@ -429,13 +464,19 @@ __decorate([
|
|
|
429
464
|
ObservableInput(),
|
|
430
465
|
__metadata("design:type", Observable)
|
|
431
466
|
], FixedIpInputComponent.prototype, "errorsMapper$", void 0);
|
|
467
|
+
__decorate([
|
|
468
|
+
bind,
|
|
469
|
+
__metadata("design:type", Function),
|
|
470
|
+
__metadata("design:paramtypes", [String, Array]),
|
|
471
|
+
__metadata("design:returntype", void 0)
|
|
472
|
+
], FixedIpInputComponent.prototype, "isReservedIp", null);
|
|
432
473
|
__decorate([
|
|
433
474
|
bind,
|
|
434
475
|
__metadata("design:type", Function),
|
|
435
476
|
__metadata("design:paramtypes", [AbstractControl]),
|
|
436
477
|
__metadata("design:returntype", void 0)
|
|
437
478
|
], FixedIpInputComponent.prototype, "validate", null);
|
|
438
|
-
(
|
|
479
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixedIpInputComponent, [{
|
|
439
480
|
type: Component,
|
|
440
481
|
args: [{ standalone: true, selector: 'acl-fixed-ip-input', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
441
482
|
{
|
|
@@ -451,8 +492,9 @@ __decorate([
|
|
|
451
492
|
], imports: [
|
|
452
493
|
AutocompleteModule,
|
|
453
494
|
AsyncPipe,
|
|
495
|
+
PurePipe,
|
|
454
496
|
E2eAttributeBindingDirective,
|
|
455
|
-
|
|
497
|
+
ERRORS_MAPPER_MODULE,
|
|
456
498
|
FormModule,
|
|
457
499
|
NgIf,
|
|
458
500
|
NgFor,
|
|
@@ -460,9 +502,10 @@ __decorate([
|
|
|
460
502
|
IconModule,
|
|
461
503
|
TooltipModule,
|
|
462
504
|
FormsModule,
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
}]
|
|
505
|
+
TagModule,
|
|
506
|
+
TRANSLATE_MODULE,
|
|
507
|
+
], template: "<aui-form-item [width]=\"formItemWidth\">\n <label auiFormItemLabel>{{\n label || ('network.ip_address' | translate)\n }}</label>\n <input\n *ngIf=\"!multiple\"\n aui-input\n auiFormItemControl\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue($event)\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n />\n <aui-tags-input\n *ngIf=\"multiple\"\n class=\"flex-1\"\n auiFormItemControl\n #tagsInput\n [ngModel]=\"model\"\n (ngModelChange)=\"emitValue(uniq($event))\"\n #ipAddress=\"ngModel\"\n [placeholder]=\"placeholder || ('dhcp_placeholder' | translate)\"\n [auiAutocomplete]=\"suggestions\"\n [inputAsyncValidator]=\"validate\"\n ></aui-tags-input>\n <aui-autocomplete #suggestions>\n <aui-suggestion\n *ngFor=\"let ipAddressSuggestion of ipAddressSuggestions$ | async\"\n [value]=\"ipAddressSuggestion\"\n >\n {{ ipAddressSuggestion }}\n <aui-tag\n *ngIf=\"\n ipAddressSuggestion | pure: isReservedIp : $subnetInfo().excludeIps\n \"\n [border]=\"true\"\n [size]=\"'mini'\"\n type=\"info\"\n >\n {{ 'network.reserved_ip' | translate }}\n </aui-tag>\n </aui-suggestion>\n <aui-autocomplete-placeholder>\n {{\n ((ipAddressSuggestions$ | async)\n ? 'network.no_available_suggestion'\n : 'loading'\n ) | translate\n }}\n </aui-autocomplete-placeholder>\n </aui-autocomplete>\n <ng-container\n *ngIf=\"addonTip != null\"\n auiFormItemAddon\n >\n <aui-icon\n *ngIf=\"addonTip\"\n icon=\"question_circle\"\n class=\"icon--help\"\n [auiTooltip]=\"addonTip\"\n auiTooltipPosition=\"end\"\n ></aui-icon>\n </ng-container>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"\n ipAddress?.errors?.input_data_error ||\n ipAddress?.errors ||\n (inputErrors$ | async)\n \"\n [errorsMapper]=\"combinedErrorsMapper$ | async\"\n ></acl-errors-mapper>\n <div\n auiFormItemHint\n *ngIf=\"hint !== null && (hint || (cidr$ | async))\"\n >\n {{\n hint ||\n ('network.fix_ip_should_belong_tip'\n | translate: { cidr: (cidr$ | async) })\n }}\n </div>\n</aui-form-item>\n", styles: [":host:not(:last-child) aui-form-item ::ng-deep .aui-form-item{margin-bottom:16px}\n"] }]
|
|
508
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.K8sUtilService }, { type: i1.K8sApiService }, { type: i2.NetworkUtilService }, { type: i1.TranslateService }], { cluster: [{
|
|
466
509
|
type: Input,
|
|
467
510
|
args: [{ required: true }]
|
|
468
511
|
}], cluster$: [], namespace: [{
|
|
@@ -499,5 +542,6 @@ __decorate([
|
|
|
499
542
|
type: Input
|
|
500
543
|
}], errors$: [], errorsMapper: [{
|
|
501
544
|
type: Input
|
|
502
|
-
}], errorsMapper$: [], validate: [] }); })();
|
|
503
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9maXhlZC1pcC9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2ZpeGVkLWlwL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGlEQUFpRDtBQUNqRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsSUFBSSxFQUNKLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLDRCQUE0QixFQUM1QixnQkFBZ0IsR0FFakIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFDTCxlQUFlLEVBRWYsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsT0FBTyxHQUVSLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxF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RSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBSXpCLFlBQVksTUFHWixNQUFNO2tCQURMLEtBQUs7WUFJTixPQUFPLE1BR1AsS0FBSztrQkFESixLQUFLO1lBSU4sV0FBVztrQkFEVixLQUFLO1lBSU4sSUFBSTtrQkFESCxLQUFLO1lBSU4sUUFBUTtrQkFEUCxLQUFLO1lBSU4sUUFBUTtrQkFEUCxLQUFLO1lBSU4sU0FBUztrQkFEUixTQUFTO21CQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFJekMsU0FBUztrQkFEUixTQUFTO21CQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFJekMsYUFBYTtrQkFEWixLQUFLO1lBSU4sVUFBVSxNQUlWLFlBQVk7a0JBRFgsS0FBSztZQUtOLG9CQUFvQjtrQkFEbkIsS0FBSztZQUdHLE1BQU07a0JBQWQsS0FBSztZQUVOLE9BQU8sTUFFRSxZQUFZO2tCQUFwQixLQUFLO1lBRU4sYUFBYSxNQWlUYixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICBDb21tb25Gb3JtQ29udHJvbCxcbiAgRm9ybUl0ZW1XaWR0aCxcbiAgRm9ybU1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSW5wdXRNb2R1bGUsXG4gIFRhZ3NJbnB1dENvbXBvbmVudCxcbiAgVG9vbHRpcE1vZHVsZSxcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQge1xuICBLOHNBcGlTZXJ2aWNlLFxuICBLOHNVdGlsU2VydmljZSxcbiAgT2JzZXJ2YWJsZUlucHV0LFxuICBwdWJsaXNoUmVmLFxuICBza2lwRXJyb3IsXG4gIG1hdGNoRXhwcmVzc2lvbnNUb1N0cmluZyxcbiAgTmFtZXNwYWNlLFxuICBiaW5kLFxuICBUcmFuc2xhdGVNb2R1bGUsXG4gIEVycm9yc01hcHBlck1vZHVsZSxcbiAgUkVTT1VSQ0VfVFlQRVMsXG4gIEUyZUF0dHJpYnV0ZUJpbmRpbmdEaXJlY3RpdmUsXG4gIFRyYW5zbGF0ZVNlcnZpY2UsXG4gIFN0cmluZ01hcCxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19BU1lOQ19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdNb2RlbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdW5pcSwgdmFsdWVzIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBtZXJnZSxcbiAgb2YsXG4gIHN3aXRjaE1hcCxcbiAgZm9ya0pvaW4sXG4gIHN0YXJ0V2l0aCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTmV0d29ya1V0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmV0d29yay11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VibmV0LCBTdWJuZXRJcCB9IGZyb20gJy4uLy4uL3R5cGVzL2s4cy1leHBvcnRzJztcbmltcG9ydCB7IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMgfSBmcm9tICcuLi8uLi90eXBlcy9yZXNvdXJjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7XG4gIElQTW9kZSxcbiAgTmV0d29ya01vZGUsXG4gIGFkYXB0SXBNb2RlLFxuICBhZGFwdFN1Ym5ldENpZHJzLFxuICBnZXRJcEFkZHJlc3NTdWdnZXN0aW9uc0J5Q2lkcnMsXG4gIGlwQWRkcmVzc0VxdWFsLFxuICBpc0JlbG9uZ0NpZHIsXG4gIGlzQnJvYWRjYXN0QWRkcixcbiAgaXNJcEFkZHJlc3NWYWxpZCxcbiAgaXNOZXR3b3JrQWRkcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvY2lkci1leHBvcnRzJztcbmltcG9ydCB7XG4gIENsdXN0ZXJOZXR3b3JrVHlwZSxcbiAgS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3N1Ym5ldC1leHBvcnRzJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLWZpeGVkLWlwLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Q6bm90KDpsYXN0LWNoaWxkKSBhdWktZm9ybS1pdGVtIDo6bmctZGVlcCAuYXVpLWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRml4ZWRJcElucHV0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZpeGVkSXBJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBFMmVBdHRyaWJ1dGVCaW5kaW5nRGlyZWN0aXZlLFxuICAgIEVycm9yc01hcHBlck1vZHVsZSxcbiAgICBGb3JtTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdGb3IsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRml4ZWRJcElucHV0Q29tcG9uZW50XG4gIGV4dGVuZHMgQ29tbW9uRm9ybUNvbnRyb2w8c3RyaW5nIHwgc3RyaW5nW10+XG4gIGltcGxlbWVudHMgQXN5bmNWYWxpZGF0b3JcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgY2x1c3Rlcjogc3RyaW5nO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBjbHVzdGVyJCE6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBuYW1lc3BhY2U6IHN0cmluZztcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgbmFtZXNwYWNlJCE6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBuZXR3b3JrVHlwZTogQ2x1c3Rlck5ldHdvcmtUeXBlO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBuZXR3b3JrVHlwZSQhOiBPYnNlcnZhYmxlPENsdXN0ZXJOZXR3b3JrVHlwZT47XG5cbiAgQElucHV0KClcbiAgc3VibmV0OiBTdWJuZXQ7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHN1Ym5ldCQhOiBPYnNlcnZhYmxlPFN1Ym5ldD47XG5cbiAgQElucHV0KClcbiAgbGFiZWw6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGhpbnQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBhZGRvblRpcDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIG11bHRpcGxlOiBib29sZWFuO1xuXG4gIEBWaWV3Q2hpbGQoJ2lwQWRkcmVzcycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpcEFkZHJlc3M6IE5nTW9kZWw7XG5cbiAgQFZpZXdDaGlsZCgndGFnc0lucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhZ3NJbnB1dDogVGFnc0lucHV0Q29tcG9uZW50O1xuXG4gIEBJbnB1dCgpXG4gIGZvcm1JdGVtV2lkdGg6IEZvcm1JdGVtV2lkdGggPSBGb3JtSXRlbVdpZHRoLk1lZGl1bTtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgdGFnc0lucHV0JCE6IE9ic2VydmFibGU8VGFnc0lucHV0Q29tcG9uZW50PjtcblxuICAvLyDomZrmi5/mnLrmm7TmlrDml7bmjpLpmaTmjonoh6rouqtcbiAgQElucHV0KClcbiAgc2tpcE9jY3VwaWVkID0gZmFsc2U7XG5cbiAgLy8g55uu5YmN5Y+M5qCI5Zu65a6aIElQIOWPquaUr+aMgSBJUHY0XG4gIEBJbnB1dCgpXG4gIGVuYWJsZUZpeElwVjZGb3JEdWFsID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzO1xuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgZXJyb3JzJCE6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycz47XG5cbiAgQElucHV0KCkgZXJyb3JzTWFwcGVyOiBTdHJpbmdNYXA7XG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBlcnJvcnNNYXBwZXIkITogT2JzZXJ2YWJsZTxTdHJpbmdNYXA+O1xuXG4gIHVuaXEgPSB1bmlxO1xuICBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZDtcblxuICBnZXQgaXNDYWxpY28oKSB7XG4gICAgcmV0dXJuIHRoaXMubmV0d29ya1R5cGUgPT09IENsdXN0ZXJOZXR3b3JrVHlwZS5DQUxJQ087XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWVzcGFjZVJlc291cmNlJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2x1c3RlciQsXG4gICAgdGhpcy5uYW1lc3BhY2UkLFxuICBdKS5waXBlKFxuICAgIGZpbHRlcigoW2NsdXN0ZXIsIG5hbWVzcGFjZV0pID0+ICEhY2x1c3RlciAmJiAhIW5hbWVzcGFjZSksXG4gICAgc3dpdGNoTWFwKChbY2x1c3RlciwgbmFtZXNwYWNlXSkgPT5cbiAgICAgIHRoaXMuazhzQXBpLmdldFJlc291cmNlPE5hbWVzcGFjZT4oe1xuICAgICAgICB0eXBlOiBSRVNPVVJDRV9UWVBFUy5OQU1FU1BBQ0UsXG4gICAgICAgIGNsdXN0ZXIsXG4gICAgICAgIG5hbWU6IG5hbWVzcGFjZSxcbiAgICAgIH0pLFxuICAgICksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya01vZGUkID0gdGhpcy5jbHVzdGVyJC5waXBlKFxuICAgIHN3aXRjaE1hcChjbHVzdGVyID0+IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlLmdldE5ldHdvcmtNb2RlJChjbHVzdGVyKSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgJG5ldHdvcmtNb2RlID0gdG9TaWduYWwodGhpcy5uZXR3b3JrTW9kZSQpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0RGV0YWlscyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNsdXN0ZXIkLFxuICAgIHRoaXMubmV0d29ya1R5cGUkLFxuICAgIHRoaXMuc3VibmV0JCxcbiAgXSkucGlwZShcbiAgICBmaWx0ZXIoKFtjbHVzdGVyLCBuZXR3b3JrVHlwZV0pID0+ICEhY2x1c3RlciAmJiAhIW5ldHdvcmtUeXBlKSxcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCBfbmV0d29ya1R5cGUsIHN1Ym5ldF0pID0+XG4gICAgICBzdWJuZXRcbiAgICAgICAgPyBvZih7XG4gICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgc3VibmV0czogW3N1Ym5ldF0sXG4gICAgICAgICAgICBzdWJuZXQsXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYz8uZ2F0ZXdheSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHRoaXMuaXNDYWxpY29cbiAgICAgICAgPyB0aGlzLms4c0FwaVxuICAgICAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgdHlwZTogTkVUV09SS19SRVNPVVJDRV9UWVBFUy5TVUJORVRfS1VCRV9PVk4sXG4gICAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcChyZXMgPT4gcmVzLml0ZW1zKSxcbiAgICAgICAgICAgICAgc2tpcEVycm9yKFtdIGFzIFN1Ym5ldFtdKSxcbiAgICAgICAgICAgICAgbWFwKHN1Ym5ldHMgPT4gKHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICAgIHN1Ym5ldHMsXG4gICAgICAgICAgICAgICAgc3VibmV0OiBudWxsIGFzIFN1Ym5ldCxcbiAgICAgICAgICAgICAgICBnYXRld2F5OiAnJyxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICA6IG9mKHtcbiAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICBzdWJuZXRzOiBbXSBhcyBTdWJuZXRbXSxcbiAgICAgICAgICAgIHN1Ym5ldDogbnVsbCBhcyBTdWJuZXQsXG4gICAgICAgICAgICBnYXRld2F5OiAnJyxcbiAgICAgICAgICB9KSxcbiAgICApLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0SW5mbyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLm5ldHdvcmtNb2RlJCxcbiAgICB0aGlzLm5hbWVzcGFjZVJlc291cmNlJC5waXBlKGZpbHRlcihCb29sZWFuKSksXG4gICAgdGhpcy5zdWJuZXREZXRhaWxzJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtuZXR3b3JrTW9kZSwgbmFtZXNwYWNlLCB7IGNsdXN0ZXIsIHN1Ym5ldHMsIHN1Ym5ldCwgZ2F0ZXdheSB9XSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2x1c3RlcixcbiAgICAgICAgc3VibmV0Q2lkcnM6IHRoaXMuaXNDYWxpY29cbiAgICAgICAgICA/IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlLmdldENhbGljb0NpZHJzKFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHN1Ym5ldHMsXG4gICAgICAgICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgc3VibmV0ID09IG51bGxcbiAgICAgICAgICAgICAgICA/IHRoaXMuazhzVXRpbC5nZXRBbm5vdGF0aW9uKG5hbWVzcGFjZSwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2lkcicsXG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW46IEtVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IHN1Ym5ldC5zcGVjPy5jaWRyQmxvY2sgPz8gJycsXG4gICAgICAgICAgICAgIHRoaXMuJG5ldHdvcmtNb2RlKCksXG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlRml4SXBWNkZvckR1YWwsXG4gICAgICAgICAgICApLFxuICAgICAgICBzdWJuZXROYW1lOlxuICAgICAgICAgIHN1Ym5ldCA9PSBudWxsXG4gICAgICAgICAgICA/IHRoaXMuazhzVXRpbC5nZXRBbm5vdGF0aW9uKG5hbWVzcGFjZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsb2dpY2FsX3N3aXRjaCcsXG4gICAgICAgICAgICAgICAgYmFzZURvbWFpbjogS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHRoaXMuazhzVXRpbC5nZXROYW1lKHN1Ym5ldCksXG4gICAgICAgIGdhdGV3YXksXG4gICAgICB9O1xuICAgIH0pLFxuICAgIHN3aXRjaE1hcChzdWJuZXRJbmZvID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5uZXR3b3JrVHlwZSA9PT0gQ2x1c3Rlck5ldHdvcmtUeXBlLktVQkVfT1ZOICYmXG4gICAgICAgICFzdWJuZXRJbmZvLmdhdGV3YXlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4oXG4gICAgICAgICAgc3VibmV0SW5mby5zdWJuZXROYW1lLnNwbGl0KCcsJykubWFwKHN1Ym5ldE5hbWUgPT5cbiAgICAgICAgICAgIHRoaXMuazhzQXBpXG4gICAgICAgICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgICAgICAgbmFtZTogc3VibmV0TmFtZSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnBpcGUoc2tpcEVycm9yKG51bGwgYXMgU3VibmV0KSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIG1hcChsaXN0ID0+IGxpc3QuZmlsdGVyKEJvb2xlYW4pKSxcbiAgICAgICAgICBtYXAoc3VibmV0TGlzdCA9PlxuICAgICAgICAgICAgc3VibmV0TGlzdC5sZW5ndGhcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAuLi5zdWJuZXRJbmZvLFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheTogc3VibmV0TGlzdFxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gaXRlbS5zcGVjPy5nYXRld2F5KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJyksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHN1Ym5ldEluZm8sXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZihzdWJuZXRJbmZvKTtcbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoc3VibmV0SW5mbyA9PiB7XG4gICAgICBpZiAoc3VibmV0SW5mby5zdWJuZXRDaWRycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG9mKHN1Ym5ldEluZm8pO1xuICAgICAgfVxuXG4gICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IHN1Ym5ldFxuICAgICAgcmV0dXJuIHRoaXMuazhzQXBpXG4gICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgbmFtZTogdGhpcy5pc0NhbGljb1xuICAgICAgICAgICAgPyBgZGVmYXVsdC1pcCR7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV0d29ya01vZGUoKSA9PT0gJ2R1YWwnID8gJ3Y0JyA6IHRoaXMuJG5ldHdvcmtNb2RlKClcbiAgICAgICAgICAgICAgfS1pcHBvb2xgXG4gICAgICAgICAgICA6ICdvdm4tZGVmYXVsdCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChzdWJuZXQgPT4gKHtcbiAgICAgICAgICAgIC4uLnN1Ym5ldEluZm8sXG4gICAgICAgICAgICBzdWJuZXRDaWRyczogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgc3VibmV0LnNwZWMuY2lkckJsb2NrLFxuICAgICAgICAgICAgICB0aGlzLiRuZXR3b3JrTW9kZSgpLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN1Ym5ldE5hbWU6IHRoaXMuazhzVXRpbC5nZXROYW1lKHN1Ym5ldCksXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYy5nYXRld2F5LFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSAkc3VibmV0SW5mbyA9IHRvU2lnbmFsKHRoaXMuc3VibmV0SW5mbyQpO1xuXG4gIGNpZHIkID0gdGhpcy5zdWJuZXRJbmZvJC5waXBlKFxuICAgIG1hcChzdWJuZXRJbmZvID0+IHN1Ym5ldEluZm8/LnN1Ym5ldENpZHJzLmpvaW4oJ+OAgScpKSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlubmVyRXJyb3JzTWFwcGVyJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2lkciQsXG4gICAgdGhpcy50cmFuc2xhdGUubG9jYWxlJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtjaWRyXSkgPT4gKHtcbiAgICAgIHBhdHRlcm46IHRoaXMudHJhbnNsYXRlLmdldCgnZml4ZWRfaXBfcGF0dGVybl90aXBzJywge1xuICAgICAgICBpcE1vZGU6IFsnZHVhbCcsICd2NCddLmluY2x1ZGVzKHRoaXMuJG5ldHdvcmtNb2RlKCkpID8gJ0lQdjQnIDogJ0lQdjYnLFxuICAgICAgfSksXG4gICAgICBvY2N1cGllZDogdGhpcy50cmFuc2xhdGUuZ2V0KCdmaXhlZF9pcF9vY2N1cGllZF90aXBzJywge1xuICAgICAgICBjaWRyLFxuICAgICAgfSksXG4gICAgICBvdXRfb2ZfcmFuZ2U6IHRoaXMudHJhbnNsYXRlLmdldCgnZml4ZWRfaXBfb3V0X29mX3JhbmdlX3RpcHMnLCB7XG4gICAgICAgIGNpZHIsXG4gICAgICB9KSxcbiAgICB9KSksXG4gICk7XG5cbiAgY29tYmluZWRFcnJvcnNNYXBwZXIkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbm5lckVycm9yc01hcHBlciQsXG4gICAgdGhpcy5lcnJvcnNNYXBwZXIkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lubmVyRXJyb3JzTWFwcGVyLCBlcnJvcnNNYXBwZXJdKSA9PiAoe1xuICAgICAgLi4uaW5uZXJFcnJvcnNNYXBwZXIsXG4gICAgICAuLi5lcnJvcnNNYXBwZXIsXG4gICAgfSkpLFxuICApO1xuXG4gIGlucHV0RXJyb3JzJCA9IHRoaXMuZXJyb3JzJC5waXBlKFxuICAgIHRhcChlcnJvcnMgPT4ge1xuICAgICAgdGhpcy5zZXRFcnJvcnMoZXJyb3JzKTtcbiAgICAgIHRoaXMuaXBBZGRyZXNzPy5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlPy4oKTtcbiAgICB9KSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHVzZWRJcHMkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jbHVzdGVyJCxcbiAgICB0aGlzLnN1Ym5ldEluZm8kLFxuICAgIHRoaXMubW9kZWwkLnBpcGUoZmlyc3QoKSksXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbY2x1c3RlciwgeyBzdWJuZXROYW1lLCBnYXRld2F5IH0sIGlwXSkgPT5cbiAgICAgIHRoaXMuaXNDYWxpY29cbiAgICAgICAgPyBvZihbXSBhcyBzdHJpbmdbXSlcbiAgICAgICAgOiB0aGlzLms4c0FwaVxuICAgICAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXRJcD4oe1xuICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTl9JUCxcbiAgICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBsYWJlbFNlbGVjdG9yOiBtYXRjaEV4cHJlc3Npb25zVG9TdHJpbmcoW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke0tVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYfS9zdWJuZXRgLFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogJ2luJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBzdWJuZXROYW1lLnNwbGl0KCcsJyksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAocmVzID0+IHJlcy5pdGVtcyksXG4gICAgICAgICAgICAgIHNraXBFcnJvcihbXSBhcyBTdWJuZXRJcFtdKSxcbiAgICAgICAgICAgICAgbWFwKHN1Ym5ldElwcyA9PlxuICAgICAgICAgICAgICAgIHN1Ym5ldElwcy5yZWR1Y2U8c3RyaW5nW10+KFxuICAgICAgICAgICAgICAgICAgKHVzZWRJcHMsIHsgc3BlYzogeyBpcEFkZHJlc3MgfSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcy5zcGxpdCgnLCcpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlwICE9PSBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VkSXBzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZWRJcHM7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheS5zcGxpdCgnLCcpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgJHVzZWRJcHMgPSB0b1NpZ25hbCh0aGlzLnVzZWRJcHMkKTtcblxuICBpcEFkZHJlc3NTdWdnZXN0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnN1Ym5ldEluZm8kLFxuICAgIHRoaXMudXNlZElwcyQsXG4gICAgdGhpcy5uZXR3b3JrTW9kZSQsXG4gICAgdGhpcy5tb2RlbCQsXG4gICAgdGhpcy50YWdzSW5wdXQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAodGFnc0lucHV0ID0+XG4gICAgICAgIHRhZ3NJbnB1dFxuICAgICAgICAgID8gbWVyZ2UoXG4gICAgICAgICAgICAgIGZyb21FdmVudCh0YWdzSW5wdXQuaW5wdXRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0JykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoZXYgPT4gKGV2LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHRhZ3NJbnB1dC5pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzIGFzIE9ic2VydmFibGU8c3RyaW5nPixcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6ICh0aGlzLm1vZGVsJCBhcyBPYnNlcnZhYmxlPHN0cmluZz4pLFxuICAgICAgKSxcbiAgICApLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3sgc3VibmV0Q2lkcnMgfSwgdXNlZElwcywgbmV0d29ya01vZGUsIGFkZGVkSXBzLCBpbnB1dFZhbHVlXSkgPT5cbiAgICAgIGdldElwQWRkcmVzc1N1Z2dlc3Rpb25zQnlDaWRycyhcbiAgICAgICAgc3VibmV0Q2lkcnMsXG4gICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICBbXG4gICAgICAgICAgLi4udXNlZElwcyxcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShhZGRlZElwcykgPyBhZGRlZElwcyA6IFthZGRlZElwc10uZmlsdGVyKEJvb2xlYW4pKSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5wdXRWYWx1ZSxcbiAgICAgICAgdGhpcy5pc0NhbGljbyxcbiAgICAgICksXG4gICAgKSxcbiAgICBzdGFydFdpdGgoW10gYXMgc3RyaW5nW10pLFxuICAgIHNraXBFcnJvcihbXSBhcyBzdHJpbmdbXSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzVXRpbDogSzhzVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGk6IEs4c0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrVXRpbFNlcnZpY2U6IE5ldHdvcmtVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoY2RyKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICBAYmluZFxuICB2YWxpZGF0ZShjdHJsOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBjb25zdCBpcEFkZHJlc3M6IHN0cmluZyB8IHN0cmluZ1tdID0gY3RybC52YWx1ZTtcbiAgICByZXR1cm4gaXBBZGRyZXNzICYmICFBcnJheS5pc0FycmF5KGlwQWRkcmVzcylcbiAgICAgID8gdGhpcy51c2VkSXBzJC5waXBlKFxuICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgbWFwKCgpID0+IHRoaXMuc2V0RXJyb3JzKHRoaXMudmFsaWRhdGVGaXhlZElwKGlwQWRkcmVzcykpKSxcbiAgICAgICAgKVxuICAgICAgOiBvZih0aGlzLnNldEVycm9ycyhudWxsKSk7XG4gIH1cblxuICBwcml2YXRlIHNldEVycm9ycyhlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICBjb25zdCBjb21iaW5lZEVycm9ycyA9IHRoaXMubXVsdGlwbGVcbiAgICAgID8geyAuLi50aGlzLmlwQWRkcmVzcz8uY29udHJvbC5lcnJvcnMsIC4uLmVycm9ycyB9IC8vIOWPr+iDveWtmOWcqOS8oOWFpeeahCBlcnJvcnNcbiAgICAgIDogZXJyb3JzO1xuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWx1ZXMoY29tYmluZWRFcnJvcnMpLmxlbmd0aFxuICAgICAgPyBjb21iaW5lZEVycm9yc1xuICAgICAgOiBudWxsO1xuICAgIHRoaXMuaXBBZGRyZXNzPy5jb250cm9sLnNldEVycm9ycyh2YWxpZGF0aW9uRXJyb3JzKTtcbiAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9ycztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVGaXhlZElwKGlwQWRkcmVzczogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBzdWJuZXRDaWRycywgZ2F0ZXdheSB9ID0gdGhpcy4kc3VibmV0SW5mbygpO1xuXG4gICAgY29uc3QgaXBNb2RlID0gdGhpcy5hZGFwdElwTW9kZShpcEFkZHJlc3MpO1xuICAgIGNvbnN0IGlzSXBWNCA9IGlwTW9kZSA9PT0gSVBNb2RlLklQVjQ7XG5cbiAgICBjb25zdCBqdWRnZUNpZHJzID0gc3VibmV0Q2lkcnMuZmlsdGVyKGNpZHIgPT4ge1xuICAgICAgY29uc3QgaXNJcFY2ID0gY2lkci5pbmNsdWRlcygnOicpO1xuICAgICAgcmV0dXJuIGlzSXBWNCA/ICFpc0lwVjYgOiBpc0lwVjY7XG4gICAgfSk7XG5cbiAgICBpZiAoc3VibmV0Q2lkcnMubGVuZ3RoICYmICFqdWRnZUNpZHJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0dGVybjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gaW52YWxpZCBpcCBwYXR0ZXJuLCBub3QgYnJvYWRjYXN0IGlwLCBub3QgbmV0d29yayBpcFxuICAgIGlmIChcbiAgICAgICFpc0lwQWRkcmVzc1ZhbGlkKGlwQWRkcmVzcywgaXBNb2RlKSB8fFxuICAgICAganVkZ2VDaWRycy5zb21lKFxuICAgICAgICBjYWxpY29DaWRyID0+XG4gICAgICAgICAgaXNCcm9hZGNhc3RBZGRyKGlwQWRkcmVzcywgY2FsaWNvQ2lkciwgaXBNb2RlKSB8fFxuICAgICAgICAgIGlzTmV0d29ya0FkZHIoaXBBZGRyZXNzLCBjYWxpY29DaWRyLCBpcE1vZGUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0dGVybjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHY0R2F0ZXdheTogc3RyaW5nO1xuICAgIGxldCB2NkdhdGV3YXk6IHN0cmluZztcblxuICAgIGlmIChnYXRld2F5KSB7XG4gICAgICBjb25zdCBnYXRld2F5UGFydHMgPSBnYXRld2F5LnNwbGl0KCcsJyk7XG4gICAgICB2NEdhdGV3YXkgPSBnYXRld2F5UGFydHNbMF07XG4gICAgICB2NkdhdGV3YXkgPSBnYXRld2F5UGFydHNbMV07XG4gICAgfVxuXG4gICAgY29uc3QgaXBHYXRld2F5ID0gaXNJcFY0ID8gdjRHYXRld2F5IDogdjZHYXRld2F5O1xuXG4gICAgaWYgKFxuICAgICAgLy8gaHR0cHM6Ly9qaXJhLmFsYXVkYS5jbi9icm93c2UvQUNQLTEyMTM2P2ZvY3VzZWRDb21tZW50SWQ9MjE1NDYwJnBhZ2U9Y29tLmF0bGFzc2lhbi5qaXJhLnBsdWdpbi5zeXN0ZW0uaXNzdWV0YWJwYW5lbHMlM0Fjb21tZW50LXRhYnBhbmVsI2NvbW1lbnQtMjE1NDYwXG4gICAgICAoaXBHYXRld2F5ICYmIGlwQWRkcmVzc0VxdWFsKGlwR2F0ZXdheSwgaXBBZGRyZXNzLCBpcE1vZGUpKSB8fFxuICAgICAgKCF0aGlzLnNraXBPY2N1cGllZCAmJlxuICAgICAgICB0aGlzLiR1c2VkSXBzKCkuc29tZSh1c2VkSXAgPT5cbiAgICAgICAgICBpcEFkZHJlc3NFcXVhbCh1c2VkSXAsIGlwQWRkcmVzcywgaXBNb2RlKSxcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9jY3VwaWVkOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBqdWRnZUNpZHJzLmxlbmd0aCAmJlxuICAgICAgIWp1ZGdlQ2lkcnMuc29tZShjaWRyID0+IGNpZHIgJiYgaXNCZWxvbmdDaWRyKGNpZHIsIGlwQWRkcmVzcywgaXBNb2RlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG91dF9vZl9yYW5nZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGFwdElwTW9kZShpcEFkZHJlc3M6IHN0cmluZykge1xuICAgIHJldHVybiBhZGFwdElwTW9kZShcbiAgICAgIGlwQWRkcmVzcyxcbiAgICAgICF0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsICYmIHRoaXMuJG5ldHdvcmtNb2RlKCkgPT09IE5ldHdvcmtNb2RlLkRVQUxcbiAgICAgICAgPyBOZXR3b3JrTW9kZS5JUFY0XG4gICAgICAgIDogdGhpcy4kbmV0d29ya01vZGUoKSxcbiAgICApO1xuICB9XG59XG4iLCI8YXVpLWZvcm0taXRlbSBbd2lkdGhdPVwiZm9ybUl0ZW1XaWR0aFwiPlxuICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyBsYWJlbCB8fCAoJ2lwX2FkZHJlc3MnIHwgdHJhbnNsYXRlKSB9fTwvbGFiZWw+XG4gIDxpbnB1dFxuICAgICpuZ0lmPVwiIW11bHRpcGxlXCJcbiAgICBhdWktaW5wdXRcbiAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICBbbmdNb2RlbF09XCJtb2RlbFwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwiZW1pdFZhbHVlKCRldmVudClcIlxuICAgICNpcEFkZHJlc3M9XCJuZ01vZGVsXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgKCdkaGNwX3BsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZSlcIlxuICAgIFthdWlBdXRvY29tcGxldGVdPVwic3VnZ2VzdGlvbnNcIlxuICAvPlxuICA8YXVpLXRhZ3MtaW5wdXRcbiAgICAqbmdJZj1cIm11bHRpcGxlXCJcbiAgICBjbGFzcz1cImZsZXgtMVwiXG4gICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgI3RhZ3NJbnB1dFxuICAgIFtuZ01vZGVsXT1cIm1vZGVsXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJlbWl0VmFsdWUodW5pcSgkZXZlbnQpKVwiXG4gICAgI2lwQWRkcmVzcz1cIm5nTW9kZWxcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAoJ2RoY3BfcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlKVwiXG4gICAgW2F1aUF1dG9jb21wbGV0ZV09XCJzdWdnZXN0aW9uc1wiXG4gICAgW2lucHV0QXN5bmNWYWxpZGF0b3JdPVwidmFsaWRhdGVcIlxuICA+PC9hdWktdGFncy1pbnB1dD5cbiAgPGF1aS1hdXRvY29tcGxldGUgI3N1Z2dlc3Rpb25zPlxuICAgIDxhdWktc3VnZ2VzdGlvblxuICAgICAgKm5nRm9yPVwibGV0IGlwQWRkcmVzc1N1Z2dlc3Rpb24gb2YgaXBBZGRyZXNzU3VnZ2VzdGlvbnMkIHwgYXN5bmNcIlxuICAgICAgW3ZhbHVlXT1cImlwQWRkcmVzc1N1Z2dlc3Rpb25cIlxuICAgID5cbiAgICAgIHt7IGlwQWRkcmVzc1N1Z2dlc3Rpb24gfX1cbiAgICA8L2F1aS1zdWdnZXN0aW9uPlxuICAgIDxhdWktYXV0b2NvbXBsZXRlLXBsYWNlaG9sZGVyPlxuICAgICAge3tcbiAgICAgICAgKChpcEFkZHJlc3NTdWdnZXN0aW9ucyQgfCBhc3luYylcbiAgICAgICAgICA/ICdub19hdmFpbGFibGVfc3VnZ2VzdGlvbidcbiAgICAgICAgICA6ICdsb2FkaW5nJ1xuICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICB9fVxuICAgIDwvYXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgPC9hdWktYXV0b2NvbXBsZXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhZGRvblRpcCAhPSBudWxsXCJcbiAgICBhdWlGb3JtSXRlbUFkZG9uXG4gID5cbiAgICA8YXVpLWljb25cbiAgICAgICpuZ0lmPVwiYWRkb25UaXBcIlxuICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICBjbGFzcz1cImljb24tLWhlbHBcIlxuICAgICAgW2F1aVRvb2x0aXBdPVwiYWRkb25UaXBcIlxuICAgICAgYXVpVG9vbHRpcFBvc2l0aW9uPVwiZW5kXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICBbZXJyb3JzXT1cIlxuICAgICAgaXBBZGRyZXNzPy5lcnJvcnM/LmlucHV0X2RhdGFfZXJyb3IgfHxcbiAgICAgIGlwQWRkcmVzcz8uZXJyb3JzIHx8XG4gICAgICAoaW5wdXRFcnJvcnMkIHwgYXN5bmMpXG4gICAgXCJcbiAgICBbZXJyb3JzTWFwcGVyXT1cImNvbWJpbmVkRXJyb3JzTWFwcGVyJCB8IGFzeW5jXCJcbiAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG4gIDxkaXZcbiAgICBhdWlGb3JtSXRlbUhpbnRcbiAgICAqbmdJZj1cImhpbnQgIT09IG51bGwgJiYgKGhpbnQgfHwgKGNpZHIkIHwgYXN5bmMpKVwiXG4gID5cbiAgICB7e1xuICAgICAgaGludCB8fFxuICAgICAgICAoJ2ZpeF9pcF9zaG91bGRfYmVsb25nX3RpcCcgfCB0cmFuc2xhdGU6IHsgY2lkcjogKGNpZHIkIHwgYXN5bmMpIH0pXG4gICAgfX1cbiAgPC9kaXY+XG48L2F1aS1mb3JtLWl0ZW0+XG4iXX0=
|
|
545
|
+
}], errorsMapper$: [], isReservedIp: [], validate: [] }); })();
|
|
546
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FixedIpInputComponent, { className: "FixedIpInputComponent", filePath: "lib/components/fixed-ip/component.ts", lineNumber: 126 }); })();
|
|
547
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9uZXR3b3JrL3NyYy9saWIvY29tcG9uZW50cy9maXhlZC1pcC9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL25ldHdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2ZpeGVkLWlwL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsSUFBSSxFQUNKLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUVoQixvQkFBb0IsRUFDcEIsUUFBUSxHQUNULE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsZUFBZSxFQUVmLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLE9BQU8sR0FFUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FB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QVksTUFzQlosUUFBUTtrRkFyWkcscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlTW9kdWxlLFxuICBDb21tb25Gb3JtQ29udHJvbCxcbiAgRm9ybUl0ZW1XaWR0aCxcbiAgRm9ybU1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSW5wdXRNb2R1bGUsXG4gIFRhZ01vZHVsZSxcbiAgVGFnc0lucHV0Q29tcG9uZW50LFxuICBUb29sdGlwTW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEs4c0FwaVNlcnZpY2UsXG4gIEs4c1V0aWxTZXJ2aWNlLFxuICBPYnNlcnZhYmxlSW5wdXQsXG4gIHB1Ymxpc2hSZWYsXG4gIHNraXBFcnJvcixcbiAgbWF0Y2hFeHByZXNzaW9uc1RvU3RyaW5nLFxuICBOYW1lc3BhY2UsXG4gIGJpbmQsXG4gIFRSQU5TTEFURV9NT0RVTEUsXG4gIFJFU09VUkNFX1RZUEVTLFxuICBFMmVBdHRyaWJ1dGVCaW5kaW5nRGlyZWN0aXZlLFxuICBUcmFuc2xhdGVTZXJ2aWNlLFxuICBTdHJpbmdNYXAsXG4gIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICBQdXJlUGlwZSxcbn0gZnJvbSAnQGFsYXVkYS1mZS9jb21tb24nO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIEZvcm1zTW9kdWxlLFxuICBOR19BU1lOQ19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdNb2RlbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdW5pcSwgdmFsdWVzIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBtZXJnZSxcbiAgb2YsXG4gIHN3aXRjaE1hcCxcbiAgZm9ya0pvaW4sXG4gIHN0YXJ0V2l0aCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTmV0d29ya1V0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmV0d29yay11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VibmV0LCBTdWJuZXRJcCB9IGZyb20gJy4uLy4uL3R5cGVzL2s4cy1leHBvcnRzJztcbmltcG9ydCB7IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMgfSBmcm9tICcuLi8uLi90eXBlcy9yZXNvdXJjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7XG4gIElQTW9kZSxcbiAgTmV0d29ya01vZGUsXG4gIGFkYXB0SXBNb2RlLFxuICBhZGFwdFN1Ym5ldENpZHJzLFxuICBnZXRJcEFkZHJlc3NTdWdnZXN0aW9uc0J5Q2lkcnMsXG4gIGlwQWRkcmVzc0VxdWFsLFxuICBpc0JlbG9uZ0NpZHIsXG4gIGlzQnJvYWRjYXN0QWRkcixcbiAgaXNJcEFkZHJlc3NWYWxpZCxcbiAgaXNOZXR3b3JrQWRkcixcbiAgZ2V0QWRkcmVzc0J1aWxkZXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL2NpZHItZXhwb3J0cyc7XG5pbXBvcnQge1xuICBDbHVzdGVyTmV0d29ya1R5cGUsXG4gIEtVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYLFxufSBmcm9tICcuLi8uLi91dGlscy9zdWJuZXQtZXhwb3J0cyc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2FjbC1maXhlZC1pcC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAndGVtcGxhdGUuaHRtbCcsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0Om5vdCg6bGFzdC1jaGlsZCkgYXVpLWZvcm0taXRlbSA6Om5nLWRlZXAgLmF1aS1mb3JtLWl0ZW0ge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZpeGVkSXBJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGaXhlZElwSW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIEF1dG9jb21wbGV0ZU1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgUHVyZVBpcGUsXG4gICAgRTJlQXR0cmlidXRlQmluZGluZ0RpcmVjdGl2ZSxcbiAgICBFUlJPUlNfTUFQUEVSX01PRFVMRSxcbiAgICBGb3JtTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTmdGb3IsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFRhZ01vZHVsZSxcbiAgICBUUkFOU0xBVEVfTU9EVUxFLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGaXhlZElwSW5wdXRDb21wb25lbnRcbiAgZXh0ZW5kcyBDb21tb25Gb3JtQ29udHJvbDxzdHJpbmcgfCBzdHJpbmdbXT5cbiAgaW1wbGVtZW50cyBBc3luY1ZhbGlkYXRvclxue1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBjbHVzdGVyOiBzdHJpbmc7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGNsdXN0ZXIkITogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBuYW1lc3BhY2UkITogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG5ldHdvcmtUeXBlOiBDbHVzdGVyTmV0d29ya1R5cGU7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIG5ldHdvcmtUeXBlJCE6IE9ic2VydmFibGU8Q2x1c3Rlck5ldHdvcmtUeXBlPjtcblxuICBASW5wdXQoKVxuICBzdWJuZXQ6IFN1Ym5ldDtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgc3VibmV0JCE6IE9ic2VydmFibGU8U3VibmV0PjtcblxuICBASW5wdXQoKVxuICBsYWJlbDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgaGludDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGFkZG9uVGlwOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgbXVsdGlwbGU6IGJvb2xlYW47XG5cbiAgQFZpZXdDaGlsZCgnaXBBZGRyZXNzJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlwQWRkcmVzczogTmdNb2RlbDtcblxuICBAVmlld0NoaWxkKCd0YWdzSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFnc0lucHV0OiBUYWdzSW5wdXRDb21wb25lbnQ7XG5cbiAgQElucHV0KClcbiAgZm9ybUl0ZW1XaWR0aDogRm9ybUl0ZW1XaWR0aCA9IEZvcm1JdGVtV2lkdGguTWVkaXVtO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICB0YWdzSW5wdXQkITogT2JzZXJ2YWJsZTxUYWdzSW5wdXRDb21wb25lbnQ+O1xuXG4gIC8vIOiZmuaLn+acuuabtOaWsOaXtuaOkumZpOaOieiHqui6q1xuICBASW5wdXQoKVxuICBza2lwT2NjdXBpZWQgPSBmYWxzZTtcblxuICAvLyDnm67liY3lj4zmoIjlm7rlrpogSVAg5Y+q5pSv5oyBIElQdjRcbiAgQElucHV0KClcbiAgZW5hYmxlRml4SXBWNkZvckR1YWwgPSBmYWxzZTtcblxuICBASW5wdXQoKSBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnM7XG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBlcnJvcnMkITogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzPjtcblxuICBASW5wdXQoKSBlcnJvcnNNYXBwZXI6IFN0cmluZ01hcDtcbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGVycm9yc01hcHBlciQhOiBPYnNlcnZhYmxlPFN0cmluZ01hcD47XG5cbiAgdW5pcSA9IHVuaXE7XG4gIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkO1xuXG4gIGdldCBpc0NhbGljbygpIHtcbiAgICByZXR1cm4gdGhpcy5uZXR3b3JrVHlwZSA9PT0gQ2x1c3Rlck5ldHdvcmtUeXBlLkNBTElDTztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZXNwYWNlUmVzb3VyY2UkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jbHVzdGVyJCxcbiAgICB0aGlzLm5hbWVzcGFjZSQsXG4gIF0pLnBpcGUoXG4gICAgZmlsdGVyKChbY2x1c3RlciwgbmFtZXNwYWNlXSkgPT4gISFjbHVzdGVyICYmICEhbmFtZXNwYWNlKSxcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCBuYW1lc3BhY2VdKSA9PlxuICAgICAgdGhpcy5rOHNBcGkuZ2V0UmVzb3VyY2U8TmFtZXNwYWNlPih7XG4gICAgICAgIHR5cGU6IFJFU09VUkNFX1RZUEVTLk5BTUVTUEFDRSxcbiAgICAgICAgY2x1c3RlcixcbiAgICAgICAgbmFtZTogbmFtZXNwYWNlLFxuICAgICAgfSksXG4gICAgKSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrTW9kZSQgPSB0aGlzLmNsdXN0ZXIkLnBpcGUoXG4gICAgc3dpdGNoTWFwKGNsdXN0ZXIgPT4gdGhpcy5uZXR3b3JrVXRpbFNlcnZpY2UuZ2V0TmV0d29ya01vZGUkKGNsdXN0ZXIpKSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgcmVhZG9ubHkgJG5ldHdvcmtNb2RlID0gdG9TaWduYWwodGhpcy5uZXR3b3JrTW9kZSQpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VibmV0RGV0YWlscyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNsdXN0ZXIkLFxuICAgIHRoaXMubmV0d29ya1R5cGUkLFxuICAgIHRoaXMuc3VibmV0JCxcbiAgXSkucGlwZShcbiAgICBmaWx0ZXIoKFtjbHVzdGVyLCBuZXR3b3JrVHlwZV0pID0+ICEhY2x1c3RlciAmJiAhIW5ldHdvcmtUeXBlKSxcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCBfbmV0d29ya1R5cGUsIHN1Ym5ldF0pID0+XG4gICAgICBzdWJuZXRcbiAgICAgICAgPyBvZih7XG4gICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgc3VibmV0czogW3N1Ym5ldF0sXG4gICAgICAgICAgICBzdWJuZXQsXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYz8uZ2F0ZXdheSxcbiAgICAgICAgICAgIGV4Y2x1ZGVJcHM6IHN1Ym5ldC5zcGVjPy5leGNsdWRlSXBzLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdGhpcy5pc0NhbGljb1xuICAgICAgICAgID8gdGhpcy5rOHNBcGlcbiAgICAgICAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXQ+KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzID0+IHJlcy5pdGVtcyksXG4gICAgICAgICAgICAgICAgc2tpcEVycm9yKFtdIGFzIFN1Ym5ldFtdKSxcbiAgICAgICAgICAgICAgICBtYXAoc3VibmV0cyA9PiAoe1xuICAgICAgICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgICAgICAgIHN1Ym5ldHMsXG4gICAgICAgICAgICAgICAgICBzdWJuZXQ6IG51bGwgYXMgU3VibmV0LFxuICAgICAgICAgICAgICAgICAgZ2F0ZXdheTogJycsXG4gICAgICAgICAgICAgICAgICBleGNsdWRlSXBzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICA6IG9mKHtcbiAgICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgICAgc3VibmV0czogW10gYXMgU3VibmV0W10sXG4gICAgICAgICAgICAgIHN1Ym5ldDogbnVsbCBhcyBTdWJuZXQsXG4gICAgICAgICAgICAgIGdhdGV3YXk6ICcnLFxuICAgICAgICAgICAgICBleGNsdWRlSXBzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgIH0pLFxuICAgICksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJuZXRJbmZvJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMubmV0d29ya01vZGUkLFxuICAgIHRoaXMubmFtZXNwYWNlUmVzb3VyY2UkLnBpcGUoZmlsdGVyKEJvb2xlYW4pKSxcbiAgICB0aGlzLnN1Ym5ldERldGFpbHMkLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbXG4gICAgICAgIG5ldHdvcmtNb2RlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHsgY2x1c3Rlciwgc3VibmV0cywgc3VibmV0LCBnYXRld2F5LCBleGNsdWRlSXBzIH0sXG4gICAgICBdKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICBzdWJuZXRDaWRyczogdGhpcy5pc0NhbGljb1xuICAgICAgICAgICAgPyB0aGlzLm5ldHdvcmtVdGlsU2VydmljZS5nZXRDYWxpY29DaWRycyhcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgc3VibmV0cyxcbiAgICAgICAgICAgICAgICBuZXR3b3JrTW9kZSxcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGFkYXB0U3VibmV0Q2lkcnMoXG4gICAgICAgICAgICAgICAgc3VibmV0ID09IG51bGxcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5rOHNVdGlsLmdldEFubm90YXRpb24obmFtZXNwYWNlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NpZHInLFxuICAgICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW46IEtVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgOiAoc3VibmV0LnNwZWM/LmNpZHJCbG9jayA/PyAnJyksXG4gICAgICAgICAgICAgICAgdGhpcy4kbmV0d29ya01vZGUoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIHN1Ym5ldE5hbWU6XG4gICAgICAgICAgICBzdWJuZXQgPT0gbnVsbFxuICAgICAgICAgICAgICA/IHRoaXMuaXNDYWxpY29cbiAgICAgICAgICAgICAgICA/IHRoaXMubmV0d29ya1V0aWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRDYWxpY29TdWJuZXROYW1lcyhuYW1lc3BhY2UsIHRoaXMuJG5ldHdvcmtNb2RlKCkpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJylcbiAgICAgICAgICAgICAgICA6IHRoaXMuazhzVXRpbC5nZXRBbm5vdGF0aW9uKG5hbWVzcGFjZSwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbG9naWNhbF9zd2l0Y2gnLFxuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluOiBLVUJFX09WTl9BTk5PVEFUSU9OX1BSRUZJWCxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogdGhpcy5rOHNVdGlsLmdldE5hbWUoc3VibmV0KSxcbiAgICAgICAgICBnYXRld2F5LFxuICAgICAgICAgIGV4Y2x1ZGVJcHM6IGV4Y2x1ZGVJcHMgfHwgKFtdIGFzIHN0cmluZ1tdKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgKSxcbiAgICBzd2l0Y2hNYXAoc3VibmV0SW5mbyA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubmV0d29ya1R5cGUgPT09IENsdXN0ZXJOZXR3b3JrVHlwZS5LVUJFX09WTiAmJlxuICAgICAgICAhc3VibmV0SW5mby5nYXRld2F5XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxuICAgICAgICAgIHN1Ym5ldEluZm8uc3VibmV0TmFtZS5zcGxpdCgnLCcpLm1hcChzdWJuZXROYW1lID0+XG4gICAgICAgICAgICB0aGlzLms4c0FwaVxuICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2U8U3VibmV0Pih7XG4gICAgICAgICAgICAgICAgdHlwZTogTkVUV09SS19SRVNPVVJDRV9UWVBFUy5TVUJORVRfS1VCRV9PVk4sXG4gICAgICAgICAgICAgICAgY2x1c3Rlcjogc3VibmV0SW5mby5jbHVzdGVyLFxuICAgICAgICAgICAgICAgIG5hbWU6IHN1Ym5ldE5hbWUsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5waXBlKHNraXBFcnJvcihudWxsIGFzIFN1Ym5ldCkpLFxuICAgICAgICAgICksXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBtYXAobGlzdCA9PiBsaXN0LmZpbHRlcihCb29sZWFuKSksXG4gICAgICAgICAgbWFwKHN1Ym5ldExpc3QgPT5cbiAgICAgICAgICAgIHN1Ym5ldExpc3QubGVuZ3RoXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgLi4uc3VibmV0SW5mbyxcbiAgICAgICAgICAgICAgICAgIGdhdGV3YXk6IHN1Ym5ldExpc3RcbiAgICAgICAgICAgICAgICAgICAgLm1hcChpdGVtID0+IGl0ZW0uc3BlYz8uZ2F0ZXdheSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpLFxuICAgICAgICAgICAgICAgICAgZXhjbHVkZUlwczogdW5pcShcbiAgICAgICAgICAgICAgICAgICAgc3VibmV0TGlzdC5mbGF0TWFwKGl0ZW0gPT4gaXRlbS5zcGVjPy5leGNsdWRlSXBzKSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHN1Ym5ldEluZm8sXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZihzdWJuZXRJbmZvKTtcbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoc3VibmV0SW5mbyA9PiB7XG4gICAgICBpZiAoc3VibmV0SW5mby5zdWJuZXRDaWRycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG9mKHN1Ym5ldEluZm8pO1xuICAgICAgfVxuXG4gICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IHN1Ym5ldFxuICAgICAgcmV0dXJuIHRoaXMuazhzQXBpXG4gICAgICAgIC5nZXRSZXNvdXJjZTxTdWJuZXQ+KHtcbiAgICAgICAgICB0eXBlOiBORVRXT1JLX1JFU09VUkNFX1RZUEVTLlNVQk5FVF9LVUJFX09WTixcbiAgICAgICAgICBjbHVzdGVyOiBzdWJuZXRJbmZvLmNsdXN0ZXIsXG4gICAgICAgICAgbmFtZTogdGhpcy5pc0NhbGljb1xuICAgICAgICAgICAgPyBgZGVmYXVsdC1pcCR7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV0d29ya01vZGUoKSA9PT0gJ2R1YWwnID8gJ3Y0JyA6IHRoaXMuJG5ldHdvcmtNb2RlKClcbiAgICAgICAgICAgICAgfS1pcHBvb2xgXG4gICAgICAgICAgICA6ICdvdm4tZGVmYXVsdCcsXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChzdWJuZXQgPT4gKHtcbiAgICAgICAgICAgIC4uLnN1Ym5ldEluZm8sXG4gICAgICAgICAgICBzdWJuZXRDaWRyczogYWRhcHRTdWJuZXRDaWRycyhcbiAgICAgICAgICAgICAgc3VibmV0LnNwZWMuY2lkckJsb2NrLFxuICAgICAgICAgICAgICB0aGlzLiRuZXR3b3JrTW9kZSgpLFxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpeElwVjZGb3JEdWFsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN1Ym5ldE5hbWU6IHRoaXMuazhzVXRpbC5nZXROYW1lKHN1Ym5ldCksXG4gICAgICAgICAgICBnYXRld2F5OiBzdWJuZXQuc3BlYy5nYXRld2F5LFxuICAgICAgICAgICAgZXhjbHVkZUlwczogc3VibmV0LnNwZWMuZXhjbHVkZUlwcyxcbiAgICAgICAgICB9KSksXG4gICAgICAgICk7XG4gICAgfSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIHJlYWRvbmx5ICRzdWJuZXRJbmZvID0gdG9TaWduYWwodGhpcy5zdWJuZXRJbmZvJCk7XG5cbiAgY2lkciQgPSB0aGlzLnN1Ym5ldEluZm8kLnBpcGUoXG4gICAgbWFwKHN1Ym5ldEluZm8gPT4gdW5pcShzdWJuZXRJbmZvPy5zdWJuZXRDaWRycykuam9pbign44CBJykpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5uZXJFcnJvcnNNYXBwZXIkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jaWRyJCxcbiAgICB0aGlzLnRyYW5zbGF0ZS5sb2NhbGUkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2NpZHJdKSA9PiAoe1xuICAgICAgcGF0dGVybjogdGhpcy50cmFuc2xhdGUuZ2V0KCdmaXhlZF9pcF9wYXR0ZXJuX3RpcHMnLCB7XG4gICAgICAgIGlwTW9kZTogWydkdWFsJywgJ3Y0J10uaW5jbHVkZXModGhpcy4kbmV0d29ya01vZGUoKSkgPyAnSVB2NCcgOiAnSVB2NicsXG4gICAgICB9KSxcbiAgICAgIG9jY3VwaWVkOiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2ZpeGVkX2lwX29jY3VwaWVkX3RpcHMnLCB7XG4gICAgICAgIGNpZHIsXG4gICAgICB9KSxcbiAgICAgIG91dF9vZl9yYW5nZTogdGhpcy50cmFuc2xhdGUuZ2V0KCdmaXhlZF9pcF9vdXRfb2ZfcmFuZ2VfdGlwcycsIHtcbiAgICAgICAgY2lkcixcbiAgICAgIH0pLFxuICAgIH0pKSxcbiAgKTtcblxuICBjb21iaW5lZEVycm9yc01hcHBlciQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlubmVyRXJyb3JzTWFwcGVyJCxcbiAgICB0aGlzLmVycm9yc01hcHBlciQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5uZXJFcnJvcnNNYXBwZXIsIGVycm9yc01hcHBlcl0pID0+ICh7XG4gICAgICAuLi5pbm5lckVycm9yc01hcHBlcixcbiAgICAgIC4uLmVycm9yc01hcHBlcixcbiAgICB9KSksXG4gICk7XG5cbiAgaW5wdXRFcnJvcnMkID0gdGhpcy5lcnJvcnMkLnBpcGUoXG4gICAgdGFwKGVycm9ycyA9PiB7XG4gICAgICB0aGlzLnNldEVycm9ycyhlcnJvcnMpO1xuICAgICAgdGhpcy5pcEFkZHJlc3M/LmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2U/LigpO1xuICAgIH0pLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlZElwcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNsdXN0ZXIkLFxuICAgIHRoaXMuc3VibmV0SW5mbyQsXG4gICAgdGhpcy5tb2RlbCQucGlwZShmaXJzdCgpKSxcbiAgXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFtjbHVzdGVyLCB7IHN1Ym5ldE5hbWUsIGdhdGV3YXkgfSwgaXBdKSA9PlxuICAgICAgdGhpcy5rOHNBcGlcbiAgICAgICAgLmdldFJlc291cmNlTGlzdDxTdWJuZXRJcD4oe1xuICAgICAgICAgIHR5cGU6IE5FVFdPUktfUkVTT1VSQ0VfVFlQRVMuU1VCTkVUX0tVQkVfT1ZOX0lQLFxuICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgIGxhYmVsU2VsZWN0b3I6IG1hdGNoRXhwcmVzc2lvbnNUb1N0cmluZyhbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke0tVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYfS9zdWJuZXRgLFxuICAgICAgICAgICAgICAgIG9wZXJhdG9yOiAnaW4nLFxuICAgICAgICAgICAgICAgIHZhbHVlczogc3VibmV0TmFtZS5zcGxpdCgnLCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKHJlcyA9PiByZXMuaXRlbXMpLFxuICAgICAgICAgIHNraXBFcnJvcihbXSBhcyBTdWJuZXRJcFtdKSxcbiAgICAgICAgICBtYXAoc3VibmV0SXBzID0+XG4gICAgICAgICAgICBzdWJuZXRJcHMucmVkdWNlPHN0cmluZ1tdPigodXNlZElwcywgeyBzcGVjOiB7IGlwQWRkcmVzcyB9IH0pID0+IHtcbiAgICAgICAgICAgICAgaXBBZGRyZXNzLnNwbGl0KCcsJykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXAgIT09IGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHVzZWRJcHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gdXNlZElwcztcbiAgICAgICAgICAgIH0sIGdhdGV3YXkuc3BsaXQoJywnKSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICApLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5ICR1c2VkSXBzID0gdG9TaWduYWwodGhpcy51c2VkSXBzJCk7XG5cbiAgaXBBZGRyZXNzU3VnZ2VzdGlvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zdWJuZXRJbmZvJCxcbiAgICB0aGlzLnVzZWRJcHMkLFxuICAgIHRoaXMubmV0d29ya01vZGUkLFxuICAgIHRoaXMubW9kZWwkLFxuICAgIHRoaXMudGFnc0lucHV0JC5waXBlKFxuICAgICAgc3dpdGNoTWFwKHRhZ3NJbnB1dCA9PlxuICAgICAgICB0YWdzSW5wdXRcbiAgICAgICAgICA/IG1lcmdlKFxuICAgICAgICAgICAgICBmcm9tRXZlbnQodGFnc0lucHV0LmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQsICdpbnB1dCcpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKGV2ID0+IChldi50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB0YWdzSW5wdXQuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcyBhcyBPYnNlcnZhYmxlPHN0cmluZz4sXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAodGhpcy5tb2RlbCQgYXMgT2JzZXJ2YWJsZTxzdHJpbmc+KSxcbiAgICAgICksXG4gICAgKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFt7IHN1Ym5ldENpZHJzIH0sIHVzZWRJcHMsIG5ldHdvcmtNb2RlLCBhZGRlZElwcywgaW5wdXRWYWx1ZV0pID0+XG4gICAgICBnZXRJcEFkZHJlc3NTdWdnZXN0aW9uc0J5Q2lkcnMoXG4gICAgICAgIHN1Ym5ldENpZHJzLFxuICAgICAgICBuZXR3b3JrTW9kZSxcbiAgICAgICAgW1xuICAgICAgICAgIC4uLnVzZWRJcHMsXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoYWRkZWRJcHMpID8gYWRkZWRJcHMgOiBbYWRkZWRJcHNdLmZpbHRlcihCb29sZWFuKSksXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0VmFsdWUsXG4gICAgICAgIHRoaXMuaXNDYWxpY28sXG4gICAgICApLFxuICAgICksXG4gICAgc3RhcnRXaXRoKFtdIGFzIHN0cmluZ1tdKSxcbiAgICBza2lwRXJyb3IoW10gYXMgc3RyaW5nW10pLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGs4c1V0aWw6IEs4c1V0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzQXBpOiBLOHNBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya1V0aWxTZXJ2aWNlOiBOZXR3b3JrVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICkge1xuICAgIHN1cGVyKGNkcik7XG4gIH1cblxuICBAYmluZFxuICBpc1Jlc2VydmVkSXAoaXA6IHN0cmluZywgZXhjbHVkZUlwczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBCdWlsZGVyID0gZ2V0QWRkcmVzc0J1aWxkZXIodGhpcy5hZGFwdElwTW9kZShpcCkpO1xuICAgIHJldHVybiBleGNsdWRlSXBzLnNvbWUoZXhjbHVkZUlwID0+IHtcbiAgICAgIGlmIChleGNsdWRlSXAuaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gZXhjbHVkZUlwPy5zcGxpdCgnLi4nKTtcbiAgICAgICAgY29uc3QgX0J1aWxkZXIgPSBnZXRBZGRyZXNzQnVpbGRlcih0aGlzLmFkYXB0SXBNb2RlKHN0YXJ0KSk7XG4gICAgICAgIGNvbnN0IF9zdGFydEFkZHJlc3MgPSBuZXcgX0J1aWxkZXIoc3RhcnQpLmJpZ0ludGVnZXIoKTtcbiAgICAgICAgY29uc3QgX2VuZEFkZHJlc3MgPSBuZXcgX0J1aWxkZXIoZW5kKS5iaWdJbnRlZ2VyKCk7XG4gICAgICAgIGNvbnN0IF9pcCA9IG5ldyBCdWlsZGVyKGlwKS5iaWdJbnRlZ2VyKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgX3N0YXJ0QWRkcmVzcy5jb21wYXJlVG8oX2lwKSA8PSAwICYmIF9pcC5jb21wYXJlVG8oX2VuZEFkZHJlc3MpIDw9IDBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleGNsdWRlSXAgPT09IGlwO1xuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIEBiaW5kXG4gIHZhbGlkYXRlKGN0cmw6IEFic3RyYWN0Q29udHJvbCkge1xuICAgIGNvbnN0IGlwQWRkcmVzczogc3RyaW5nIHwgc3RyaW5nW10gPSBjdHJsLnZhbHVlO1xuICAgIHJldHVybiBpcEFkZHJlc3MgJiYgIUFycmF5LmlzQXJyYXkoaXBBZGRyZXNzKVxuICAgICAgPyB0aGlzLnVzZWRJcHMkLnBpcGUoXG4gICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5zZXRFcnJvcnModGhpcy52YWxpZGF0ZUZpeGVkSXAoaXBBZGRyZXNzKSkpLFxuICAgICAgICApXG4gICAgICA6IG9mKHRoaXMuc2V0RXJyb3JzKG51bGwpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RXJyb3JzKGVycm9yczogVmFsaWRhdGlvbkVycm9ycykge1xuICAgIGNvbnN0IGNvbWJpbmVkRXJyb3JzID0gdGhpcy5tdWx0aXBsZVxuICAgICAgPyB7IC4uLnRoaXMuZXJyb3JzLCAuLi5lcnJvcnMgfSAvLyDlj6/og73lrZjlnKjkvKDlhaXnmoQgZXJyb3JzXG4gICAgICA6IGVycm9ycztcbiAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsdWVzKGNvbWJpbmVkRXJyb3JzKS5sZW5ndGhcbiAgICAgID8gY29tYmluZWRFcnJvcnNcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmlwQWRkcmVzcz8uY29udHJvbC5zZXRFcnJvcnModmFsaWRhdGlvbkVycm9ycyk7XG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcnM7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRml4ZWRJcChpcEFkZHJlc3M6IHN0cmluZykge1xuICAgIGNvbnN0IHsgc3VibmV0Q2lkcnMsIGdhdGV3YXkgfSA9IHRoaXMuJHN1Ym5ldEluZm8oKTtcblxuICAgIGNvbnN0IGlwTW9kZSA9IHRoaXMuYWRhcHRJcE1vZGUoaXBBZGRyZXNzKTtcbiAgICBjb25zdCBpc0lwVjQgPSBpcE1vZGUgPT09IElQTW9kZS5JUFY0O1xuXG4gICAgY29uc3QganVkZ2VDaWRycyA9IHN1Ym5ldENpZHJzLmZpbHRlcihjaWRyID0+IHtcbiAgICAgIGNvbnN0IGlzSXBWNiA9IGNpZHIuaW5jbHVkZXMoJzonKTtcbiAgICAgIHJldHVybiBpc0lwVjQgPyAhaXNJcFY2IDogaXNJcFY2O1xuICAgIH0pO1xuXG4gICAgaWYgKHN1Ym5ldENpZHJzLmxlbmd0aCAmJiAhanVkZ2VDaWRycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdHRlcm46IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGludmFsaWQgaXAgcGF0dGVybiwgbm90IGJyb2FkY2FzdCBpcCwgbm90IG5ldHdvcmsgaXBcbiAgICBpZiAoXG4gICAgICAhaXNJcEFkZHJlc3NWYWxpZChpcEFkZHJlc3MsIGlwTW9kZSkgfHxcbiAgICAgIGp1ZGdlQ2lkcnMuc29tZShcbiAgICAgICAgY2FsaWNvQ2lkciA9PlxuICAgICAgICAgIGlzQnJvYWRjYXN0QWRkcihpcEFkZHJlc3MsIGNhbGljb0NpZHIsIGlwTW9kZSkgfHxcbiAgICAgICAgICBpc05ldHdvcmtBZGRyKGlwQWRkcmVzcywgY2FsaWNvQ2lkciwgaXBNb2RlKSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdHRlcm46IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCB2NEdhdGV3YXk6IHN0cmluZztcbiAgICBsZXQgdjZHYXRld2F5OiBzdHJpbmc7XG5cbiAgICBpZiAoZ2F0ZXdheSkge1xuICAgICAgY29uc3QgZ2F0ZXdheVBhcnRzID0gZ2F0ZXdheS5zcGxpdCgnLCcpO1xuICAgICAgdjRHYXRld2F5ID0gZ2F0ZXdheVBhcnRzWzBdO1xuICAgICAgdjZHYXRld2F5ID0gZ2F0ZXdheVBhcnRzWzFdO1xuICAgIH1cblxuICAgIGNvbnN0IGlwR2F0ZXdheSA9IGlzSXBWNCA/IHY0R2F0ZXdheSA6IHY2R2F0ZXdheTtcblxuICAgIGlmIChcbiAgICAgIC8vIGh0dHBzOi8vamlyYS5hbGF1ZGEuY24vYnJvd3NlL0FDUC0xMjEzNj9mb2N1c2VkQ29tbWVudElkPTIxNTQ2MCZwYWdlPWNvbS5hdGxhc3NpYW4uamlyYS5wbHVnaW4uc3lzdGVtLmlzc3VldGFicGFuZWxzJTNBY29tbWVudC10YWJwYW5lbCNjb21tZW50LTIxNTQ2MFxuICAgICAgKGlwR2F0ZXdheSAmJiBpcEFkZHJlc3NFcXVhbChpcEdhdGV3YXksIGlwQWRkcmVzcywgaXBNb2RlKSkgfHxcbiAgICAgICghdGhpcy5za2lwT2NjdXBpZWQgJiZcbiAgICAgICAgdGhpcy4kdXNlZElwcygpLnNvbWUodXNlZElwID0+XG4gICAgICAgICAgaXBBZGRyZXNzRXF1YWwodXNlZElwLCBpcEFkZHJlc3MsIGlwTW9kZSksXG4gICAgICAgICkpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvY2N1cGllZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAganVkZ2VDaWRycy5sZW5ndGggJiZcbiAgICAgICFqdWRnZUNpZHJzLnNvbWUoY2lkciA9PiBjaWRyICYmIGlzQmVsb25nQ2lkcihjaWRyLCBpcEFkZHJlc3MsIGlwTW9kZSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvdXRfb2ZfcmFuZ2U6IHRydWUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRhcHRJcE1vZGUoaXBBZGRyZXNzOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYWRhcHRJcE1vZGUoXG4gICAgICBpcEFkZHJlc3MsXG4gICAgICAhdGhpcy5lbmFibGVGaXhJcFY2Rm9yRHVhbCAmJiB0aGlzLiRuZXR3b3JrTW9kZSgpID09PSBOZXR3b3JrTW9kZS5EVUFMXG4gICAgICAgID8gTmV0d29ya01vZGUuSVBWNFxuICAgICAgICA6IHRoaXMuJG5ldHdvcmtNb2RlKCksXG4gICAgKTtcbiAgfVxufVxuIiwiPGF1aS1mb3JtLWl0ZW0gW3dpZHRoXT1cImZvcm1JdGVtV2lkdGhcIj5cbiAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3tcbiAgICBsYWJlbCB8fCAoJ25ldHdvcmsuaXBfYWRkcmVzcycgfCB0cmFuc2xhdGUpXG4gIH19PC9sYWJlbD5cbiAgPGlucHV0XG4gICAgKm5nSWY9XCIhbXVsdGlwbGVcIlxuICAgIGF1aS1pbnB1dFxuICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgIFtuZ01vZGVsXT1cIm1vZGVsXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJlbWl0VmFsdWUoJGV2ZW50KVwiXG4gICAgI2lwQWRkcmVzcz1cIm5nTW9kZWxcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAoJ2RoY3BfcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlKVwiXG4gICAgW2F1aUF1dG9jb21wbGV0ZV09XCJzdWdnZXN0aW9uc1wiXG4gIC8+XG4gIDxhdWktdGFncy1pbnB1dFxuICAgICpuZ0lmPVwibXVsdGlwbGVcIlxuICAgIGNsYXNzPVwiZmxleC0xXCJcbiAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAjdGFnc0lucHV0XG4gICAgW25nTW9kZWxdPVwibW9kZWxcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cImVtaXRWYWx1ZSh1bmlxKCRldmVudCkpXCJcbiAgICAjaXBBZGRyZXNzPVwibmdNb2RlbFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8ICgnZGhjcF9wbGFjZWhvbGRlcicgfCB0cmFuc2xhdGUpXCJcbiAgICBbYXVpQXV0b2NvbXBsZXRlXT1cInN1Z2dlc3Rpb25zXCJcbiAgICBbaW5wdXRBc3luY1ZhbGlkYXRvcl09XCJ2YWxpZGF0ZVwiXG4gID48L2F1aS10YWdzLWlucHV0PlxuICA8YXVpLWF1dG9jb21wbGV0ZSAjc3VnZ2VzdGlvbnM+XG4gICAgPGF1aS1zdWdnZXN0aW9uXG4gICAgICAqbmdGb3I9XCJsZXQgaXBBZGRyZXNzU3VnZ2VzdGlvbiBvZiBpcEFkZHJlc3NTdWdnZXN0aW9ucyQgfCBhc3luY1wiXG4gICAgICBbdmFsdWVdPVwiaXBBZGRyZXNzU3VnZ2VzdGlvblwiXG4gICAgPlxuICAgICAge3sgaXBBZGRyZXNzU3VnZ2VzdGlvbiB9fVxuICAgICAgPGF1aS10YWdcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpcEFkZHJlc3NTdWdnZXN0aW9uIHwgcHVyZTogaXNSZXNlcnZlZElwIDogJHN1Ym5ldEluZm8oKS5leGNsdWRlSXBzXG4gICAgICAgIFwiXG4gICAgICAgIFtib3JkZXJdPVwidHJ1ZVwiXG4gICAgICAgIFtzaXplXT1cIidtaW5pJ1wiXG4gICAgICAgIHR5cGU9XCJpbmZvXCJcbiAgICAgID5cbiAgICAgICAge3sgJ25ldHdvcmsucmVzZXJ2ZWRfaXAnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2F1aS10YWc+XG4gICAgPC9hdWktc3VnZ2VzdGlvbj5cbiAgICA8YXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgICAgIHt7XG4gICAgICAgICgoaXBBZGRyZXNzU3VnZ2VzdGlvbnMkIHwgYXN5bmMpXG4gICAgICAgICAgPyAnbmV0d29yay5ub19hdmFpbGFibGVfc3VnZ2VzdGlvbidcbiAgICAgICAgICA6ICdsb2FkaW5nJ1xuICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICB9fVxuICAgIDwvYXVpLWF1dG9jb21wbGV0ZS1wbGFjZWhvbGRlcj5cbiAgPC9hdWktYXV0b2NvbXBsZXRlPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJhZGRvblRpcCAhPSBudWxsXCJcbiAgICBhdWlGb3JtSXRlbUFkZG9uXG4gID5cbiAgICA8YXVpLWljb25cbiAgICAgICpuZ0lmPVwiYWRkb25UaXBcIlxuICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICBjbGFzcz1cImljb24tLWhlbHBcIlxuICAgICAgW2F1aVRvb2x0aXBdPVwiYWRkb25UaXBcIlxuICAgICAgYXVpVG9vbHRpcFBvc2l0aW9uPVwiZW5kXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICBbZXJyb3JzXT1cIlxuICAgICAgaXBBZGRyZXNzPy5lcnJvcnM/LmlucHV0X2RhdGFfZXJyb3IgfHxcbiAgICAgIGlwQWRkcmVzcz8uZXJyb3JzIHx8XG4gICAgICAoaW5wdXRFcnJvcnMkIHwgYXN5bmMpXG4gICAgXCJcbiAgICBbZXJyb3JzTWFwcGVyXT1cImNvbWJpbmVkRXJyb3JzTWFwcGVyJCB8IGFzeW5jXCJcbiAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG4gIDxkaXZcbiAgICBhdWlGb3JtSXRlbUhpbnRcbiAgICAqbmdJZj1cImhpbnQgIT09IG51bGwgJiYgKGhpbnQgfHwgKGNpZHIkIHwgYXN5bmMpKVwiXG4gID5cbiAgICB7e1xuICAgICAgaGludCB8fFxuICAgICAgICAoJ25ldHdvcmsuZml4X2lwX3Nob3VsZF9iZWxvbmdfdGlwJ1xuICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IGNpZHI6IChjaWRyJCB8IGFzeW5jKSB9KVxuICAgIH19XG4gIDwvZGl2PlxuPC9hdWktZm9ybS1pdGVtPlxuIl19
|