@alauda-fe/common 1.4.6 → 1.4.7
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/business/resource-select/{internals → exports}/icon/component.d.ts +1 -1
- package/business/resource-select/module.d.ts +16 -16
- package/business/resource-select/public-api.d.ts +4 -0
- package/esm2022/business/resource-select/exports/cluster-list/component.mjs +75 -0
- package/esm2022/business/resource-select/{internals → exports}/icon/component.mjs +2 -2
- package/esm2022/business/resource-select/exports/namespace-list/component.mjs +477 -0
- package/esm2022/business/resource-select/exports/project-list/component.mjs +76 -0
- package/esm2022/business/resource-select/module.mjs +40 -39
- package/esm2022/business/resource-select/public-api.mjs +5 -1
- package/package.json +1 -1
- package/esm2022/business/resource-select/internals/cluster-list/component.mjs +0 -75
- package/esm2022/business/resource-select/internals/namespace-list/component.mjs +0 -477
- package/esm2022/business/resource-select/internals/project-list/component.mjs +0 -76
- /package/business/resource-select/{internals → exports}/cluster-list/component.d.ts +0 -0
- /package/business/resource-select/{internals → exports}/namespace-list/component.d.ts +0 -0
- /package/business/resource-select/{internals → exports}/project-list/component.d.ts +0 -0
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
|
|
3
|
+
import { memoize, partition, uniq } from 'lodash-es';
|
|
4
|
+
import { ReplaySubject, combineLatest, forkJoin, of, catchError, finalize, map, startWith, switchMap, takeUntil, tap, } from 'rxjs';
|
|
5
|
+
import { API_GATEWAY, K8sUtilService, publishRef, getDomainAnnotation, DISPLAY_NAME, } from '../../../../core/public-api';
|
|
6
|
+
import { CommonLayoutContextService } from '../../../../page-scaffold/public-api';
|
|
7
|
+
import { ResourceListBase } from '../../base-list';
|
|
8
|
+
import { ResourceSelectContextService } from '../../context.service';
|
|
9
|
+
import { getDisplayArch, getWorkspaceParams } from '../../utils';
|
|
10
|
+
import { K8sApiService } from './../../../../api/public-api';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "../../../../page-scaffold/public-api";
|
|
13
|
+
import * as i2 from "./../../../../api/public-api";
|
|
14
|
+
import * as i3 from "@angular/common/http";
|
|
15
|
+
import * as i4 from "../../context.service";
|
|
16
|
+
import * as i5 from "../../../../core/public-api";
|
|
17
|
+
const _c0 = ["*"];
|
|
18
|
+
const _c1 = () => [];
|
|
19
|
+
const _c2 = (a0, a1) => ({ name: a0, displayName: a1 });
|
|
20
|
+
function NamespaceListComponent_aui_option_6_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelementStart(0, "aui-option", 7);
|
|
22
|
+
i0.ɵɵpipe(1, "aclUnionDisplayName");
|
|
23
|
+
i0.ɵɵtext(2);
|
|
24
|
+
i0.ɵɵpipe(3, "aclUnionDisplayName");
|
|
25
|
+
i0.ɵɵelementEnd();
|
|
26
|
+
} if (rf & 2) {
|
|
27
|
+
const project_r2 = ctx.$implicit;
|
|
28
|
+
i0.ɵɵproperty("value", project_r2)("label", i0.ɵɵpipeBind1(1, 3, project_r2));
|
|
29
|
+
i0.ɵɵadvance(2);
|
|
30
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, project_r2), " ");
|
|
31
|
+
} }
|
|
32
|
+
function NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
+
i0.ɵɵelementContainerStart(0);
|
|
34
|
+
i0.ɵɵtext(1);
|
|
35
|
+
i0.ɵɵelementContainerEnd();
|
|
36
|
+
} if (rf & 2) {
|
|
37
|
+
const mesh_r5 = i0.ɵɵnextContext().$implicit;
|
|
38
|
+
i0.ɵɵadvance();
|
|
39
|
+
i0.ɵɵtextInterpolate1(" (Istio ", mesh_r5.spec.istioVersion, ") ");
|
|
40
|
+
} }
|
|
41
|
+
function NamespaceListComponent_aui_form_item_10_aui_option_5_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
+
i0.ɵɵelementStart(0, "aui-option", 7);
|
|
43
|
+
i0.ɵɵpipe(1, "aclName");
|
|
44
|
+
i0.ɵɵtext(2);
|
|
45
|
+
i0.ɵɵpipe(3, "aclName");
|
|
46
|
+
i0.ɵɵtemplate(4, NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template, 2, 1, "ng-container", 5);
|
|
47
|
+
i0.ɵɵelementEnd();
|
|
48
|
+
} if (rf & 2) {
|
|
49
|
+
const mesh_r5 = ctx.$implicit;
|
|
50
|
+
i0.ɵɵproperty("value", mesh_r5)("label", i0.ɵɵpipeBind1(1, 4, mesh_r5) + ((mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion) ? " (Istio " + mesh_r5.spec.istioVersion + ")" : ""));
|
|
51
|
+
i0.ɵɵadvance(2);
|
|
52
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 6, mesh_r5), " ");
|
|
53
|
+
i0.ɵɵadvance(2);
|
|
54
|
+
i0.ɵɵproperty("ngIf", mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion);
|
|
55
|
+
} }
|
|
56
|
+
function NamespaceListComponent_aui_form_item_10_Template(rf, ctx) { if (rf & 1) {
|
|
57
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
58
|
+
i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 2);
|
|
59
|
+
i0.ɵɵtext(2);
|
|
60
|
+
i0.ɵɵpipe(3, "translate");
|
|
61
|
+
i0.ɵɵelementEnd();
|
|
62
|
+
i0.ɵɵelementStart(4, "aui-select", 11);
|
|
63
|
+
i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r3.selectedServiceMesh, $event) || (ctx_r3.selectedServiceMesh = $event); return i0.ɵɵresetView($event); });
|
|
64
|
+
i0.ɵɵlistener("valueChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_valueChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.selectServiceMesh($event)); });
|
|
65
|
+
i0.ɵɵtemplate(5, NamespaceListComponent_aui_form_item_10_aui_option_5_Template, 5, 8, "aui-option", 4);
|
|
66
|
+
i0.ɵɵelementStart(6, "aui-option-placeholder");
|
|
67
|
+
i0.ɵɵtext(7);
|
|
68
|
+
i0.ɵɵpipe(8, "translate");
|
|
69
|
+
i0.ɵɵelementEnd()()();
|
|
70
|
+
} if (rf & 2) {
|
|
71
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
72
|
+
i0.ɵɵadvance(2);
|
|
73
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "service_mesh"));
|
|
74
|
+
i0.ɵɵadvance(2);
|
|
75
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r3.selectedServiceMesh);
|
|
76
|
+
i0.ɵɵproperty("trackFn", ctx_r3.serviceMeshTrackFn)("loading", !ctx_r3.projects.length && ctx_r3.projectsLoading);
|
|
77
|
+
i0.ɵɵadvance();
|
|
78
|
+
i0.ɵɵproperty("ngForOf", ctx_r3.projectServiceMeshes);
|
|
79
|
+
i0.ɵɵadvance(2);
|
|
80
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 8, "no_data"), " ");
|
|
81
|
+
} }
|
|
82
|
+
function NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
+
i0.ɵɵelementContainer(0);
|
|
84
|
+
} }
|
|
85
|
+
function NamespaceListComponent_ng_container_20_aui_option_1_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
+
i0.ɵɵelementStart(0, "aui-option", 13);
|
|
87
|
+
i0.ɵɵpipe(1, "pure");
|
|
88
|
+
i0.ɵɵpipe(2, "async");
|
|
89
|
+
i0.ɵɵpipe(3, "translate");
|
|
90
|
+
i0.ɵɵpipe(4, "pure");
|
|
91
|
+
i0.ɵɵpipe(5, "async");
|
|
92
|
+
i0.ɵɵtemplate(6, NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template, 1, 0, "ng-container", 14);
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
} if (rf & 2) {
|
|
95
|
+
const cluster_r6 = ctx.declare;
|
|
96
|
+
const clusterName_r7 = i0.ɵɵnextContext().$implicit;
|
|
97
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
98
|
+
const clusterLabel_r8 = i0.ɵɵreference(25);
|
|
99
|
+
i0.ɵɵproperty("value", clusterName_r7)("label", clusterLabel_r8)("labelContext", cluster_r6)("disabled", i0.ɵɵpipeBind1(2, 11, i0.ɵɵpipeBind2(1, 8, clusterName_r7, ctx_r3.checkClusterError$)))("auiTooltip", i0.ɵɵpipeBind1(3, 13, "current_cluster_status_abnormal"))("auiTooltipDisabled", !i0.ɵɵpipeBind1(5, 18, i0.ɵɵpipeBind2(4, 15, clusterName_r7, ctx_r3.checkClusterError$)));
|
|
100
|
+
i0.ɵɵadvance(6);
|
|
101
|
+
i0.ɵɵproperty("ngTemplateOutlet", clusterLabel_r8)("ngTemplateOutletContext", cluster_r6);
|
|
102
|
+
} }
|
|
103
|
+
function NamespaceListComponent_ng_container_20_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelementContainerStart(0);
|
|
105
|
+
i0.ɵɵtemplate(1, NamespaceListComponent_ng_container_20_aui_option_1_Template, 7, 20, "aui-option", 12);
|
|
106
|
+
i0.ɵɵpipe(2, "pure");
|
|
107
|
+
i0.ɵɵpipe(3, "async");
|
|
108
|
+
i0.ɵɵelementContainerEnd();
|
|
109
|
+
} if (rf & 2) {
|
|
110
|
+
const clusterName_r7 = ctx.$implicit;
|
|
111
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
112
|
+
i0.ɵɵadvance();
|
|
113
|
+
i0.ɵɵproperty("declare", i0.ɵɵpureFunction2(6, _c2, clusterName_r7, i0.ɵɵpipeBind1(3, 4, i0.ɵɵpipeBind2(2, 1, clusterName_r7, ctx_r3.getClusterDisplayName$))));
|
|
114
|
+
} }
|
|
115
|
+
function NamespaceListComponent_ng_template_24_ng_container_1_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
+
i0.ɵɵelementContainerStart(0);
|
|
117
|
+
i0.ɵɵtext(1);
|
|
118
|
+
i0.ɵɵelementContainerEnd();
|
|
119
|
+
} if (rf & 2) {
|
|
120
|
+
const displayName_r9 = i0.ɵɵnextContext().displayName;
|
|
121
|
+
i0.ɵɵadvance();
|
|
122
|
+
i0.ɵɵtextInterpolate1("(", displayName_r9, ")");
|
|
123
|
+
} }
|
|
124
|
+
function NamespaceListComponent_ng_template_24_Template(rf, ctx) { if (rf & 1) {
|
|
125
|
+
i0.ɵɵtext(0);
|
|
126
|
+
i0.ɵɵtemplate(1, NamespaceListComponent_ng_template_24_ng_container_1_Template, 2, 1, "ng-container", 5);
|
|
127
|
+
} if (rf & 2) {
|
|
128
|
+
const name_r10 = ctx.name;
|
|
129
|
+
const displayName_r9 = ctx.displayName;
|
|
130
|
+
i0.ɵɵtextInterpolate1(" ", name_r10, " ");
|
|
131
|
+
i0.ɵɵadvance();
|
|
132
|
+
i0.ɵɵproperty("ngIf", displayName_r9);
|
|
133
|
+
} }
|
|
134
|
+
export class NamespaceListComponent extends ResourceListBase {
|
|
135
|
+
constructor(commonLayoutService, k8sService, http, contextService, cdr, k8sUtil) {
|
|
136
|
+
super(cdr, k8sUtil, contextService);
|
|
137
|
+
this.commonLayoutService = commonLayoutService;
|
|
138
|
+
this.k8sService = k8sService;
|
|
139
|
+
this.http = http;
|
|
140
|
+
this.displayServiceMesh = false;
|
|
141
|
+
this.clusterChange = new EventEmitter();
|
|
142
|
+
this.projectChange = new EventEmitter();
|
|
143
|
+
this.projects = [];
|
|
144
|
+
this.clusters = [];
|
|
145
|
+
this.projectsLoading = true;
|
|
146
|
+
this.serviceMeshes = [];
|
|
147
|
+
this.projectServiceMeshes = [];
|
|
148
|
+
this.type = 'namespace';
|
|
149
|
+
this.displayedData = [];
|
|
150
|
+
this.namespaceClusterMap = {};
|
|
151
|
+
this.gridStateMap = {};
|
|
152
|
+
this.load$$ = new ReplaySubject(1);
|
|
153
|
+
this.serviceMeshes$ = this.k8sService
|
|
154
|
+
.getGlobalResourceList({
|
|
155
|
+
definition: {
|
|
156
|
+
apiGroup: 'asm.alauda.io',
|
|
157
|
+
apiVersion: 'v1alpha1',
|
|
158
|
+
type: 'servicemeshgroups',
|
|
159
|
+
},
|
|
160
|
+
namespaced: true,
|
|
161
|
+
})
|
|
162
|
+
.pipe(map(res => res.items));
|
|
163
|
+
this.clusters$ = this.http
|
|
164
|
+
.get(`${API_GATEWAY}/auth/v1/clusters?availableClusters=false`)
|
|
165
|
+
.pipe(map(res => res?.items), catchError(() => of([])), publishRef());
|
|
166
|
+
this.getClusterDisplayName$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.k8sUtil.getDisplayName(clusters.find(i => this.k8sUtil.getName(i) === cluster)))));
|
|
167
|
+
this.checkClusterError$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.checkClusterError(clusters, cluster))));
|
|
168
|
+
this.namespaces$ = combineLatest([
|
|
169
|
+
this.load$$,
|
|
170
|
+
this.reload$$.pipe(startWith(null)),
|
|
171
|
+
]).pipe(switchMap(([{ project, cluster }]) => {
|
|
172
|
+
if (!project || !cluster) {
|
|
173
|
+
return of([]);
|
|
174
|
+
}
|
|
175
|
+
const clusters = cluster === '__all' ? this.clusters : [cluster];
|
|
176
|
+
return clusters.length
|
|
177
|
+
? forkJoin(clusters.map(cluster => this.commonLayoutService
|
|
178
|
+
.getClusterNamespaces(project.metadata.name, cluster)
|
|
179
|
+
.pipe(catchError(() => of([]))))).pipe(tap(lists => {
|
|
180
|
+
this.namespaceClusterMap = lists.reduce((acc, cur, i) => ({
|
|
181
|
+
...acc,
|
|
182
|
+
...cur.reduce((subAcc, subCurr) => ({
|
|
183
|
+
...subAcc,
|
|
184
|
+
[subCurr.metadata.uid]: clusters[i],
|
|
185
|
+
}), {}),
|
|
186
|
+
}), {});
|
|
187
|
+
}), map((lists) => lists.flat()))
|
|
188
|
+
: of([]);
|
|
189
|
+
}), takeUntil(this.destroy$$), publishRef());
|
|
190
|
+
this.projectFilterFn = (keyword = '', option) => {
|
|
191
|
+
const k = keyword.toLowerCase();
|
|
192
|
+
return (option.value.metadata.name.includes(k) ||
|
|
193
|
+
getDomainAnnotation(DISPLAY_NAME, option.value)
|
|
194
|
+
?.toLowerCase()
|
|
195
|
+
?.includes(k));
|
|
196
|
+
};
|
|
197
|
+
this.clusterFilterFn = (keyword = '', option) => {
|
|
198
|
+
const k = keyword.toLowerCase();
|
|
199
|
+
if (option.value === '__all') {
|
|
200
|
+
return option.label.toLowerCase().includes(k);
|
|
201
|
+
}
|
|
202
|
+
const { name, displayName } = option.labelContext;
|
|
203
|
+
return name.includes(k) || displayName?.toLowerCase()?.includes(k);
|
|
204
|
+
};
|
|
205
|
+
this.serviceMeshFilterFn = (keyword = '', option) => {
|
|
206
|
+
const k = keyword.toLowerCase();
|
|
207
|
+
const version = option.value.spec?.istioVersion
|
|
208
|
+
? `Istio ${option.value.spec.istioVersion}`
|
|
209
|
+
: '';
|
|
210
|
+
return (option.value.metadata.name.includes(k) ||
|
|
211
|
+
version.toLowerCase()?.includes(k));
|
|
212
|
+
};
|
|
213
|
+
this.projectTrackFn = (project) => project?.metadata.name;
|
|
214
|
+
this.serviceMeshTrackFn = (mesh) => mesh?.metadata.name;
|
|
215
|
+
this.mapResource = (list, { isMultiArch, clusters, }) => list.map(item => {
|
|
216
|
+
const cluster = this.namespaceClusterMap[item.metadata.uid];
|
|
217
|
+
const itemDisabled = this.disableFn ? this.disableFn(item) : null;
|
|
218
|
+
const cachedItem = this.displayedData.find(ns => ns.__origin.metadata.uid === item.metadata.uid);
|
|
219
|
+
const servicemesh = this.serviceMeshes.find(item => item.spec.clusters.includes(cachedItem?.cluster || cluster));
|
|
220
|
+
return {
|
|
221
|
+
name: this.k8sUtil.getName(item),
|
|
222
|
+
displayName: this.k8sUtil.getDisplayName(item),
|
|
223
|
+
cluster: cachedItem?.cluster || cluster,
|
|
224
|
+
clusterDisplayName: cachedItem?.clusterDisplayName ||
|
|
225
|
+
this.k8sUtil.getDisplayName(clusters.find(c => c.metadata.name === cluster)),
|
|
226
|
+
clusterArch: cachedItem?.clusterArch || isMultiArch
|
|
227
|
+
? this.getClusterArch(clusters.find(c => c.metadata.name === cluster))
|
|
228
|
+
: null,
|
|
229
|
+
serviceMeshName: servicemesh ? this.k8sUtil.getName(servicemesh) : '',
|
|
230
|
+
serviceMeshClusters: servicemesh ? servicemesh.spec.clusters : [],
|
|
231
|
+
serviceMeshIstioVersion: servicemesh
|
|
232
|
+
? servicemesh.spec.istioVersion
|
|
233
|
+
: '',
|
|
234
|
+
admin: cachedItem?.admin || '-',
|
|
235
|
+
timestamp: this.k8sUtil.getCreationTimestamp(item),
|
|
236
|
+
state: {
|
|
237
|
+
disabled: this.gridStateMap[cluster]?.disabled ||
|
|
238
|
+
itemDisabled?.disabled ||
|
|
239
|
+
this.checkClusterError(clusters, cachedItem?.cluster || cluster) ||
|
|
240
|
+
false,
|
|
241
|
+
tooltip: this.gridStateMap[cluster]?.disabled
|
|
242
|
+
? this.gridStateMap[cluster]?.tooltip || ''
|
|
243
|
+
: itemDisabled?.tooltip,
|
|
244
|
+
},
|
|
245
|
+
__origin: item,
|
|
246
|
+
};
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
ngOnInit() {
|
|
250
|
+
// From cache
|
|
251
|
+
this.projects = this.contextService.cachedProjectResources;
|
|
252
|
+
this.serviceMeshes = this.contextService.cachedServiceMeshGroupResources;
|
|
253
|
+
if (this.projects.length) {
|
|
254
|
+
this.initProject(this.projects);
|
|
255
|
+
}
|
|
256
|
+
// Get latest data in the background
|
|
257
|
+
forkJoin([
|
|
258
|
+
this.commonLayoutService
|
|
259
|
+
.getProjects()
|
|
260
|
+
.pipe(catchError(() => of([]))),
|
|
261
|
+
this.displayServiceMesh
|
|
262
|
+
? this.serviceMeshes$
|
|
263
|
+
: of([]),
|
|
264
|
+
])
|
|
265
|
+
.pipe(finalize(() => {
|
|
266
|
+
this.projectsLoading = false;
|
|
267
|
+
this.cdr.markForCheck();
|
|
268
|
+
}), takeUntil(this.destroy$$))
|
|
269
|
+
.subscribe(([projects, serviceMeshes]) => {
|
|
270
|
+
if (this.displayServiceMesh) {
|
|
271
|
+
this.serviceMeshes = serviceMeshes;
|
|
272
|
+
this.contextService.cachedServiceMeshGroupResources = serviceMeshes;
|
|
273
|
+
}
|
|
274
|
+
this.projects = projects;
|
|
275
|
+
if (!this.contextService.cachedProjectResources?.length) {
|
|
276
|
+
this.initProject(projects);
|
|
277
|
+
}
|
|
278
|
+
this.contextService.cachedProjectResources = this.projects;
|
|
279
|
+
});
|
|
280
|
+
combineLatest([this.clusters$, this.namespaces$]).subscribe(([clusters, data]) => {
|
|
281
|
+
const isMultiArch = uniq(clusters.map(c => this.k8sUtil.getLabel(c, 'arch'))).length > 1;
|
|
282
|
+
this.displayedData = this.mapResource(data, {
|
|
283
|
+
clusters,
|
|
284
|
+
isMultiArch,
|
|
285
|
+
}).filter(ns => this.context === 'page' || !ns.state?.disabled);
|
|
286
|
+
this.setSelectedNamespace(this.displayedData);
|
|
287
|
+
if (this.selectedUid) {
|
|
288
|
+
this.displayedData = this.getSortedNamespace(this.displayedData, this.value.name);
|
|
289
|
+
}
|
|
290
|
+
this.loading = false;
|
|
291
|
+
this.forceLoading = false;
|
|
292
|
+
this.storeNamespaces();
|
|
293
|
+
this.cdr.markForCheck();
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
getSortedNamespace(rawData, namespace) {
|
|
297
|
+
if (!namespace) {
|
|
298
|
+
return rawData;
|
|
299
|
+
}
|
|
300
|
+
const [selected, others] = partition(this.displayedData, item => item.name === namespace);
|
|
301
|
+
return [...selected, ...others];
|
|
302
|
+
}
|
|
303
|
+
storeNamespaces() {
|
|
304
|
+
if (!this.selectedProject) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
if (this.selectedCluster === '__all') {
|
|
308
|
+
for (const cluster of this.clusters) {
|
|
309
|
+
this.contextService.storeNamespaces(this.selectedProject.metadata.name, cluster, this.displayedData.filter(item => item.cluster === cluster));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
this.contextService.storeNamespaces(this.selectedProject.metadata.name, this.selectedCluster, this.displayedData);
|
|
313
|
+
}
|
|
314
|
+
initProject(projects) {
|
|
315
|
+
this.selectProject((projects || []).length
|
|
316
|
+
? projects.find(item => item.metadata.name === this.value?.project) ||
|
|
317
|
+
projects[0]
|
|
318
|
+
: null, true);
|
|
319
|
+
this.load.emit({
|
|
320
|
+
project: projects.length,
|
|
321
|
+
cluster: uniq(projects.reduce((acc, cur) => [...acc, ...(cur.spec.clusters || []).map(c => c.name)], [])).length,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
selectServiceMesh(serviceMesh) {
|
|
325
|
+
this.selectedServiceMesh = serviceMesh;
|
|
326
|
+
this.clusters = (this.selectedProject.spec.clusters || [])
|
|
327
|
+
.map(c => c.name)
|
|
328
|
+
.filter(cluster => this.serviceMeshes
|
|
329
|
+
.find(mesh => this.k8sUtil.getName(mesh) === this.k8sUtil.getName(serviceMesh))
|
|
330
|
+
.spec.clusters.includes(cluster));
|
|
331
|
+
this.selectCluster('__all');
|
|
332
|
+
}
|
|
333
|
+
selectProject(project, initial = false) {
|
|
334
|
+
this.projectChange.emit(project?.metadata.name);
|
|
335
|
+
this.selectedProject = project;
|
|
336
|
+
this.clusters = project
|
|
337
|
+
? (project.spec.clusters || []).map(c => c.name)
|
|
338
|
+
: [];
|
|
339
|
+
if (this.displayServiceMesh) {
|
|
340
|
+
this.projectServiceMeshes = this.serviceMeshes.filter(mesh => mesh.spec.clusters.some(cluster => this.clusters.includes(cluster)));
|
|
341
|
+
if (this.projectServiceMeshes?.length) {
|
|
342
|
+
let meshName = this.value?.servicemesh;
|
|
343
|
+
if (!meshName) {
|
|
344
|
+
this.auth.getAccountInfo().subscribe(({ email }) => {
|
|
345
|
+
meshName = getWorkspaceParams(email)?.servicemesh;
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
const selectedServiceMesh = this.projectServiceMeshes.find(mesh => this.k8sUtil.getName(mesh) === meshName) || this.projectServiceMeshes[0];
|
|
349
|
+
this.selectServiceMesh(selectedServiceMesh);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
this.selectedServiceMesh = null;
|
|
353
|
+
this.clusters = [];
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
this.selectCluster('__all', initial);
|
|
357
|
+
}
|
|
358
|
+
selectCluster(clusterName, initial = false) {
|
|
359
|
+
this.selectedCluster = clusterName;
|
|
360
|
+
const displayedData = this.contextService.getCachedNamespaces(this.selectedProject?.metadata.name, this.selectedCluster) || [];
|
|
361
|
+
this.displayedData = this.getSortedNamespace(displayedData, initial ? this.value?.name : null);
|
|
362
|
+
this.setSelectedNamespace(this.displayedData);
|
|
363
|
+
this.clusterChange.emit(this.selectedCluster === '__all' ? null : clusterName);
|
|
364
|
+
this.loading = true;
|
|
365
|
+
this.load$$.next({
|
|
366
|
+
project: this.selectedProject,
|
|
367
|
+
cluster: clusterName,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
setSelectedNamespace(data) {
|
|
371
|
+
const selectedNamespace = this.value
|
|
372
|
+
? data.find(item => item.name === this.value.name &&
|
|
373
|
+
this.value.cluster === item.cluster)
|
|
374
|
+
: null;
|
|
375
|
+
this.selectedUid = selectedNamespace
|
|
376
|
+
? selectedNamespace.__origin.metadata.uid
|
|
377
|
+
: null;
|
|
378
|
+
}
|
|
379
|
+
getClusterArch(cluster) {
|
|
380
|
+
return getDisplayArch(this.k8sUtil.getLabel(cluster, 'arch'));
|
|
381
|
+
}
|
|
382
|
+
checkClusterError(clusters, cluster) {
|
|
383
|
+
return (clusters
|
|
384
|
+
.find(i => this.k8sUtil.getName(i) === cluster)
|
|
385
|
+
?.status.conditions.find(c => c.type === 'NodeNotReady')?.status !==
|
|
386
|
+
'False');
|
|
387
|
+
}
|
|
388
|
+
static { this.ɵfac = function NamespaceListComponent_Factory(t) { return new (t || NamespaceListComponent)(i0.ɵɵdirectiveInject(i1.CommonLayoutContextService), i0.ɵɵdirectiveInject(i2.K8sApiService), i0.ɵɵdirectiveInject(i3.HttpClient), i0.ɵɵdirectiveInject(i4.ResourceSelectContextService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i5.K8sUtilService)); }; }
|
|
389
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NamespaceListComponent, selectors: [["acl-namespace-list"]], inputs: { actionTemplateRef: "actionTemplateRef", disableFn: "disableFn", value: "value", displayServiceMesh: "displayServiceMesh" }, outputs: { clusterChange: "clusterChange", projectChange: "projectChange" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 29, vars: 38, consts: [["clusterLabel", ""], [1, "filter"], ["auiFormItemLabel", ""], ["auiFormItemControl", "", "name", "project", 3, "ngModelChange", "valueChange", "ngClass", "ngModel", "filterFn", "trackFn", "loading"], [3, "value", "label", 4, "ngFor", "ngForOf"], [4, "ngIf"], ["auiFormItemControl", "", "name", "cluster", 3, "ngModelChange", "valueChange", "ngClass", "filterFn", "loading", "ngModel"], [3, "value", "label"], [4, "ngFor", "ngForOf"], [3, "selectItem", "reload", "data", "fields", "context", "actionTemplateRef", "selectedUid", "loading"], ["aclResourceGridHeader", ""], ["auiFormItemControl", "", "name", "serviceMeshProject", 1, "lang-not-zh:!tw-w-[230px]", 3, "ngModelChange", "valueChange", "ngModel", "trackFn", "loading"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled", 4, "declare"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function NamespaceListComponent_Template(rf, ctx) { if (rf & 1) {
|
|
390
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
391
|
+
i0.ɵɵprojectionDef();
|
|
392
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "aui-form-item")(2, "label", 2);
|
|
393
|
+
i0.ɵɵtext(3);
|
|
394
|
+
i0.ɵɵpipe(4, "translate");
|
|
395
|
+
i0.ɵɵelementEnd();
|
|
396
|
+
i0.ɵɵelementStart(5, "aui-select", 3);
|
|
397
|
+
i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedProject, $event) || (ctx.selectedProject = $event); return i0.ɵɵresetView($event); });
|
|
398
|
+
i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_5_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectProject($event)); });
|
|
399
|
+
i0.ɵɵtemplate(6, NamespaceListComponent_aui_option_6_Template, 4, 7, "aui-option", 4);
|
|
400
|
+
i0.ɵɵelementStart(7, "aui-option-placeholder");
|
|
401
|
+
i0.ɵɵtext(8);
|
|
402
|
+
i0.ɵɵpipe(9, "translate");
|
|
403
|
+
i0.ɵɵelementEnd()()();
|
|
404
|
+
i0.ɵɵtemplate(10, NamespaceListComponent_aui_form_item_10_Template, 9, 10, "aui-form-item", 5);
|
|
405
|
+
i0.ɵɵelementStart(11, "aui-form-item")(12, "label", 2);
|
|
406
|
+
i0.ɵɵtext(13);
|
|
407
|
+
i0.ɵɵpipe(14, "translate");
|
|
408
|
+
i0.ɵɵelementEnd();
|
|
409
|
+
i0.ɵɵelementStart(15, "aui-select", 6);
|
|
410
|
+
i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedCluster, $event) || (ctx.selectedCluster = $event); return i0.ɵɵresetView($event); });
|
|
411
|
+
i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_15_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectCluster($event)); });
|
|
412
|
+
i0.ɵɵelementStart(16, "aui-option", 7);
|
|
413
|
+
i0.ɵɵpipe(17, "translate");
|
|
414
|
+
i0.ɵɵtext(18);
|
|
415
|
+
i0.ɵɵpipe(19, "translate");
|
|
416
|
+
i0.ɵɵelementEnd();
|
|
417
|
+
i0.ɵɵtemplate(20, NamespaceListComponent_ng_container_20_Template, 4, 9, "ng-container", 8);
|
|
418
|
+
i0.ɵɵelementStart(21, "aui-option-placeholder");
|
|
419
|
+
i0.ɵɵtext(22);
|
|
420
|
+
i0.ɵɵpipe(23, "translate");
|
|
421
|
+
i0.ɵɵelementEnd();
|
|
422
|
+
i0.ɵɵtemplate(24, NamespaceListComponent_ng_template_24_Template, 2, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
423
|
+
i0.ɵɵelementEnd()()();
|
|
424
|
+
i0.ɵɵelementStart(26, "acl-resource-data-grid", 9);
|
|
425
|
+
i0.ɵɵlistener("selectItem", function NamespaceListComponent_Template_acl_resource_data_grid_selectItem_26_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSelect($event)); })("reload", function NamespaceListComponent_Template_acl_resource_data_grid_reload_26_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.reload()); });
|
|
426
|
+
i0.ɵɵelementContainerStart(27, 10);
|
|
427
|
+
i0.ɵɵprojection(28);
|
|
428
|
+
i0.ɵɵelementContainerEnd();
|
|
429
|
+
i0.ɵɵelementEnd();
|
|
430
|
+
} if (rf & 2) {
|
|
431
|
+
i0.ɵɵadvance(3);
|
|
432
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 25, "project"));
|
|
433
|
+
i0.ɵɵadvance(2);
|
|
434
|
+
i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "");
|
|
435
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.selectedProject);
|
|
436
|
+
i0.ɵɵproperty("filterFn", ctx.projectFilterFn)("trackFn", ctx.projectTrackFn)("loading", !ctx.projects.length && ctx.projectsLoading);
|
|
437
|
+
i0.ɵɵadvance();
|
|
438
|
+
i0.ɵɵproperty("ngForOf", ctx.projects);
|
|
439
|
+
i0.ɵɵadvance(2);
|
|
440
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(9, 27, "no_data"), " ");
|
|
441
|
+
i0.ɵɵadvance(2);
|
|
442
|
+
i0.ɵɵproperty("ngIf", ctx.displayServiceMesh);
|
|
443
|
+
i0.ɵɵadvance(3);
|
|
444
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 29, "cluster"));
|
|
445
|
+
i0.ɵɵadvance(2);
|
|
446
|
+
i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "")("filterFn", ctx.clusterFilterFn)("loading", !ctx.projects.length && ctx.projectsLoading);
|
|
447
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.selectedCluster);
|
|
448
|
+
i0.ɵɵadvance();
|
|
449
|
+
i0.ɵɵproperty("value", "__all")("label", i0.ɵɵpipeBind1(17, 31, "all"));
|
|
450
|
+
i0.ɵɵadvance(2);
|
|
451
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(19, 33, "all"), " ");
|
|
452
|
+
i0.ɵɵadvance(2);
|
|
453
|
+
i0.ɵɵproperty("ngForOf", ctx.clusters);
|
|
454
|
+
i0.ɵɵadvance(2);
|
|
455
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(23, 35, "no_data"), " ");
|
|
456
|
+
i0.ɵɵadvance(4);
|
|
457
|
+
i0.ɵɵproperty("data", ctx.displayedData || i0.ɵɵpureFunction0(37, _c1))("fields", ctx.fields)("context", ctx.context)("actionTemplateRef", ctx.actionTemplateRef)("selectedUid", ctx.selectedUid)("loading", ctx.forceLoading || !(ctx.displayedData == null ? null : ctx.displayedData.length) && ctx.loading);
|
|
458
|
+
} }, styles: ["[_nghost-%COMP%]{display:flex;flex:1;flex-direction:column}.filter[_ngcontent-%COMP%]{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%]{margin-right:20px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:0}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item__label-wrapper{width:auto!important}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-input{color:rgb(var(--aui-color-n-2))}.filter[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-weight:500}.filter[_ngcontent-%COMP%] aui-select[_ngcontent-%COMP%]{width:260px}"], changeDetection: 0 }); }
|
|
459
|
+
}
|
|
460
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NamespaceListComponent, [{
|
|
461
|
+
type: Component,
|
|
462
|
+
args: [{ selector: 'acl-namespace-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"filter\">\n <aui-form-item>\n <label auiFormItemLabel>{{ 'project' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"project\"\n [(ngModel)]=\"selectedProject\"\n [filterFn]=\"projectFilterFn\"\n [trackFn]=\"projectTrackFn\"\n (valueChange)=\"selectProject($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let project of projects\"\n [value]=\"project\"\n [label]=\"project | aclUnionDisplayName\"\n >\n {{ project | aclUnionDisplayName }}\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <!-- ASM \u9009\u62E9\u7F51\u683C\u8FC7\u6EE4\u96C6\u7FA4\u9009\u9879 -->\n <aui-form-item *ngIf=\"displayServiceMesh\">\n <label auiFormItemLabel>{{ 'service_mesh' | translate }}</label>\n <aui-select\n class=\"lang-not-zh:!tw-w-[230px]\"\n auiFormItemControl\n name=\"serviceMeshProject\"\n [(ngModel)]=\"selectedServiceMesh\"\n [trackFn]=\"serviceMeshTrackFn\"\n (valueChange)=\"selectServiceMesh($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let mesh of projectServiceMeshes\"\n [value]=\"mesh\"\n [label]=\"\n (mesh | aclName) +\n (mesh.spec?.istioVersion\n ? ' (Istio ' + mesh.spec.istioVersion + ')'\n : '')\n \"\n >\n {{ mesh | aclName }}\n <ng-container *ngIf=\"mesh.spec?.istioVersion\">\n (Istio {{ mesh.spec.istioVersion }})\n </ng-container>\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <aui-form-item>\n <label auiFormItemLabel>{{ 'cluster' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"cluster\"\n [filterFn]=\"clusterFilterFn\"\n [loading]=\"!projects.length && projectsLoading\"\n [(ngModel)]=\"selectedCluster\"\n (valueChange)=\"selectCluster($event)\"\n >\n <aui-option\n [value]=\"'__all'\"\n [label]=\"'all' | translate\"\n >\n {{ 'all' | translate }}\n </aui-option>\n <ng-container *ngFor=\"let clusterName of clusters\">\n <aui-option\n *declare=\"{\n name: clusterName,\n displayName: clusterName | pure: getClusterDisplayName$ | async,\n } as cluster\"\n [value]=\"clusterName\"\n [label]=\"clusterLabel\"\n [labelContext]=\"cluster\"\n [disabled]=\"clusterName | pure: checkClusterError$ | async\"\n [auiTooltip]=\"'current_cluster_status_abnormal' | translate\"\n [auiTooltipDisabled]=\"\n !(clusterName | pure: checkClusterError$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"clusterLabel; context: cluster\"\n ></ng-container>\n </aui-option>\n </ng-container>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n <ng-template\n #clusterLabel\n let-name=\"name\"\n let-displayName=\"displayName\"\n >\n {{ name }}\n <ng-container *ngIf=\"displayName\">({{ displayName }})</ng-container>\n </ng-template>\n </aui-select>\n </aui-form-item>\n</div>\n<acl-resource-data-grid\n [data]=\"displayedData || []\"\n [fields]=\"fields\"\n [context]=\"context\"\n (selectItem)=\"onSelect($event)\"\n [actionTemplateRef]=\"actionTemplateRef\"\n [selectedUid]=\"selectedUid\"\n [loading]=\"forceLoading || (!displayedData?.length && loading)\"\n (reload)=\"reload()\"\n>\n <ng-container aclResourceGridHeader>\n <ng-content></ng-content>\n </ng-container>\n</acl-resource-data-grid>\n", styles: [":host{display:flex;flex:1;flex-direction:column}.filter{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter aui-form-item{margin-right:20px}.filter aui-form-item ::ng-deep .aui-form-item{margin-bottom:0}.filter aui-form-item ::ng-deep .aui-form-item__label-wrapper{width:auto!important}.filter aui-form-item ::ng-deep .aui-input{color:rgb(var(--aui-color-n-2))}.filter label{font-weight:500}.filter aui-select{width:260px}\n"] }]
|
|
463
|
+
}], () => [{ type: i1.CommonLayoutContextService }, { type: i2.K8sApiService }, { type: i3.HttpClient }, { type: i4.ResourceSelectContextService }, { type: i0.ChangeDetectorRef }, { type: i5.K8sUtilService }], { actionTemplateRef: [{
|
|
464
|
+
type: Input
|
|
465
|
+
}], disableFn: [{
|
|
466
|
+
type: Input
|
|
467
|
+
}], value: [{
|
|
468
|
+
type: Input
|
|
469
|
+
}], displayServiceMesh: [{
|
|
470
|
+
type: Input
|
|
471
|
+
}], clusterChange: [{
|
|
472
|
+
type: Output
|
|
473
|
+
}], projectChange: [{
|
|
474
|
+
type: Output
|
|
475
|
+
}] }); })();
|
|
476
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NamespaceListComponent, { className: "NamespaceListComponent", filePath: "business/resource-select/exports/namespace-list/component.ts", lineNumber: 60 }); })();
|
|
477
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2J1c2luZXNzL3Jlc291cmNlLXNlbGVjdC9leHBvcnRzL25hbWVzcGFjZS1saXN0L2NvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9idXNpbmVzcy9yZXNvdXJjZS1zZWxlY3QvZXhwb3J0cy9uYW1lc3BhY2UtbGlzdC90ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixRQUFRLEVBQ1IsRUFBRSxFQUNGLFVBQVUsRUFDVixRQUFRLEVBQ1IsR0FBRyxFQUNILFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxXQUFXLEVBRVgsY0FBYyxFQUVkLFVBQVUsRUFJVixtQkFBbUIsRUFDbkIsWUFBWSxHQUNiLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFB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QUFLO1lBSU4sS0FBSztrQkFESixLQUFLO1lBSU4sa0JBQWtCO2tCQURqQixLQUFLO1lBSU4sYUFBYTtrQkFEWixNQUFNO1lBSVAsYUFBYTtrQkFEWixNQUFNOztrRkFuQkksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0RmlsdGVyT3B0aW9uIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1lbW9pemUsIHBhcnRpdGlvbiwgdW5pcSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge1xuICBSZXBsYXlTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBmb3JrSm9pbixcbiAgb2YsXG4gIGNhdGNoRXJyb3IsXG4gIGZpbmFsaXplLFxuICBtYXAsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIEFQSV9HQVRFV0FZLFxuICBDbHVzdGVyLFxuICBLOHNVdGlsU2VydmljZSxcbiAgUHJvamVjdCxcbiAgcHVibGlzaFJlZixcbiAgU2VydmljZU1lc2hHcm91cCxcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBLdWJlcm5ldGVzUmVzb3VyY2VMaXN0LFxuICBnZXREb21haW5Bbm5vdGF0aW9uLFxuICBESVNQTEFZX05BTUUsXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBDb21tb25MYXlvdXRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3BhZ2Utc2NhZmZvbGQvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBSZXNvdXJjZUxpc3RCYXNlIH0gZnJvbSAnLi4vLi4vYmFzZS1saXN0JztcbmltcG9ydCB7IFJlc291cmNlU2VsZWN0Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0RGlzcGxheUFyY2gsIGdldFdvcmtzcGFjZVBhcmFtcyB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgSzhzQXBpU2VydmljZSB9IGZyb20gJy4vLi4vLi4vLi4vLi4vYXBpL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtcbiAgQ2x1c3RlckFyY2gsXG4gIERpc2FibGVGbixcbiAgTmFtZXNwYWNlRGF0YUl0ZW0sXG4gIFNlbGVjdGVkTmFtZXNwYWNlVmFsdWUsXG59IGZyb20gJy4vLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wtbmFtZXNwYWNlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0eWxlLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5hbWVzcGFjZUxpc3RDb21wb25lbnRcbiAgZXh0ZW5kcyBSZXNvdXJjZUxpc3RCYXNlXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KClcbiAgYWN0aW9uVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KClcbiAgZGlzYWJsZUZuOiBEaXNhYmxlRm47XG5cbiAgQElucHV0KClcbiAgdmFsdWU6IFNlbGVjdGVkTmFtZXNwYWNlVmFsdWU7XG5cbiAgQElucHV0KClcbiAgZGlzcGxheVNlcnZpY2VNZXNoID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpXG4gIGNsdXN0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT3V0cHV0KClcbiAgcHJvamVjdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcblxuICBzZWxlY3RlZFByb2plY3Q6IFByb2plY3Q7XG4gIHNlbGVjdGVkQ2x1c3Rlcjogc3RyaW5nO1xuICBjbHVzdGVyczogc3RyaW5nW10gPSBbXTtcbiAgcHJvamVjdHNMb2FkaW5nID0gdHJ1ZTtcblxuICBzZXJ2aWNlTWVzaGVzOiBTZXJ2aWNlTWVzaEdyb3VwW10gPSBbXTtcbiAgcHJvamVjdFNlcnZpY2VNZXNoZXM6IFNlcnZpY2VNZXNoR3JvdXBbXSA9IFtdO1xuICBzZWxlY3RlZFNlcnZpY2VNZXNoOiBTZXJ2aWNlTWVzaEdyb3VwO1xuXG4gIHR5cGUgPSAnbmFtZXNwYWNlJztcblxuICBkaXNwbGF5ZWREYXRhOiBOYW1lc3BhY2VEYXRhSXRlbVtdID0gW107XG5cbiAgbmFtZXNwYWNlQ2x1c3Rlck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGdyaWRTdGF0ZU1hcDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTxEaXNhYmxlRm4+PiA9IHt9O1xuXG4gIHNlbGVjdGVkVWlkOiBzdHJpbmc7XG5cbiAgbG9hZCQkID0gbmV3IFJlcGxheVN1YmplY3Q8eyBwcm9qZWN0OiBQcm9qZWN0OyBjbHVzdGVyOiBzdHJpbmcgfT4oMSk7XG5cbiAgc2VydmljZU1lc2hlcyQgPSB0aGlzLms4c1NlcnZpY2VcbiAgICAuZ2V0R2xvYmFsUmVzb3VyY2VMaXN0PFNlcnZpY2VNZXNoR3JvdXA+KHtcbiAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgYXBpR3JvdXA6ICdhc20uYWxhdWRhLmlvJyxcbiAgICAgICAgYXBpVmVyc2lvbjogJ3YxYWxwaGExJyxcbiAgICAgICAgdHlwZTogJ3NlcnZpY2VtZXNoZ3JvdXBzJyxcbiAgICAgIH0sXG4gICAgICBuYW1lc3BhY2VkOiB0cnVlLFxuICAgIH0pXG4gICAgLnBpcGUobWFwKHJlcyA9PiByZXMuaXRlbXMpKTtcblxuICBjbHVzdGVycyQgPSB0aGlzLmh0dHBcbiAgICAuZ2V0PFxuICAgICAgS3ViZXJuZXRlc1Jlc291cmNlTGlzdDxDbHVzdGVyPlxuICAgID4oYCR7QVBJX0dBVEVXQVl9L2F1dGgvdjEvY2x1c3RlcnM/YXZhaWxhYmxlQ2x1c3RlcnM9ZmFsc2VgKVxuICAgIC5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXM/Lml0ZW1zKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgQ2x1c3RlcltdKSksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcblxuICBnZXRDbHVzdGVyRGlzcGxheU5hbWUkID0gbWVtb2l6ZSgoY2x1c3Rlcjogc3RyaW5nKSA9PlxuICAgIHRoaXMuY2x1c3RlcnMkLnBpcGUoXG4gICAgICBtYXAoY2x1c3RlcnMgPT5cbiAgICAgICAgdGhpcy5rOHNVdGlsLmdldERpc3BsYXlOYW1lKFxuICAgICAgICAgIGNsdXN0ZXJzLmZpbmQoaSA9PiB0aGlzLms4c1V0aWwuZ2V0TmFtZShpKSA9PT0gY2x1c3RlciksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgY2hlY2tDbHVzdGVyRXJyb3IkID0gbWVtb2l6ZSgoY2x1c3Rlcjogc3RyaW5nKSA9PlxuICAgIHRoaXMuY2x1c3RlcnMkLnBpcGUoXG4gICAgICBtYXAoY2x1c3RlcnMgPT4gdGhpcy5jaGVja0NsdXN0ZXJFcnJvcihjbHVzdGVycywgY2x1c3RlcikpLFxuICAgICksXG4gICk7XG5cbiAgbmFtZXNwYWNlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmxvYWQkJCxcbiAgICB0aGlzLnJlbG9hZCQkLnBpcGUoc3RhcnRXaXRoKG51bGwgYXMgdm9pZCkpLFxuICBdKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoW3sgcHJvamVjdCwgY2x1c3RlciB9XSkgPT4ge1xuICAgICAgaWYgKCFwcm9qZWN0IHx8ICFjbHVzdGVyKSB7XG4gICAgICAgIHJldHVybiBvZihbXSBhcyBLdWJlcm5ldGVzUmVzb3VyY2VbXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbHVzdGVycyA9IGNsdXN0ZXIgPT09ICdfX2FsbCcgPyB0aGlzLmNsdXN0ZXJzIDogW2NsdXN0ZXJdO1xuICAgICAgcmV0dXJuIGNsdXN0ZXJzLmxlbmd0aFxuICAgICAgICA/IGZvcmtKb2luKFxuICAgICAgICAgICAgY2x1c3RlcnMubWFwKGNsdXN0ZXIgPT5cbiAgICAgICAgICAgICAgdGhpcy5jb21tb25MYXlvdXRTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldENsdXN0ZXJOYW1lc3BhY2VzKHByb2plY3QubWV0YWRhdGEubmFtZSwgY2x1c3RlcilcbiAgICAgICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdKSkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICB0YXAobGlzdHMgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm5hbWVzcGFjZUNsdXN0ZXJNYXAgPSBsaXN0cy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGFjYywgY3VyLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgICAgICAgLi4uY3VyLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKHN1YkFjYywgc3ViQ3VycikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5zdWJBY2MsXG4gICAgICAgICAgICAgICAgICAgICAgW3N1YkN1cnIubWV0YWRhdGEudWlkXTogY2x1c3RlcnNbaV0sXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgobGlzdHM6IEt1YmVybmV0ZXNSZXNvdXJjZVtdW10pID0+IGxpc3RzLmZsYXQoKSksXG4gICAgICAgICAgKVxuICAgICAgICA6IG9mKFtdIGFzIEt1YmVybmV0ZXNSZXNvdXJjZVtdKTtcbiAgICB9KSxcbiAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1vbkxheW91dFNlcnZpY2U6IENvbW1vbkxheW91dENvbnRleHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgazhzU2VydmljZTogSzhzQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgY29udGV4dFNlcnZpY2U6IFJlc291cmNlU2VsZWN0Q29udGV4dFNlcnZpY2UsXG4gICAgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBrOHNVdGlsOiBLOHNVdGlsU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoY2RyLCBrOHNVdGlsLCBjb250ZXh0U2VydmljZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBGcm9tIGNhY2hlXG4gICAgdGhpcy5wcm9qZWN0cyA9IHRoaXMuY29udGV4dFNlcnZpY2UuY2FjaGVkUHJvamVjdFJlc291cmNlcztcbiAgICB0aGlzLnNlcnZpY2VNZXNoZXMgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLmNhY2hlZFNlcnZpY2VNZXNoR3JvdXBSZXNvdXJjZXM7XG4gICAgaWYgKHRoaXMucHJvamVjdHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmluaXRQcm9qZWN0KHRoaXMucHJvamVjdHMpO1xuICAgIH1cblxuICAgIC8vIEdldCBsYXRlc3QgZGF0YSBpbiB0aGUgYmFja2dyb3VuZFxuICAgIGZvcmtKb2luKFtcbiAgICAgIHRoaXMuY29tbW9uTGF5b3V0U2VydmljZVxuICAgICAgICAuZ2V0UHJvamVjdHMoKVxuICAgICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdIGFzIFByb2plY3RbXSkpKSxcbiAgICAgIHRoaXMuZGlzcGxheVNlcnZpY2VNZXNoXG4gICAgICAgID8gdGhpcy5zZXJ2aWNlTWVzaGVzJFxuICAgICAgICA6IG9mKFtdIGFzIFNlcnZpY2VNZXNoR3JvdXBbXSksXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9qZWN0c0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbcHJvamVjdHMsIHNlcnZpY2VNZXNoZXNdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlTZXJ2aWNlTWVzaCkge1xuICAgICAgICAgIHRoaXMuc2VydmljZU1lc2hlcyA9IHNlcnZpY2VNZXNoZXM7XG4gICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jYWNoZWRTZXJ2aWNlTWVzaEdyb3VwUmVzb3VyY2VzID0gc2VydmljZU1lc2hlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2plY3RzID0gcHJvamVjdHM7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0U2VydmljZS5jYWNoZWRQcm9qZWN0UmVzb3VyY2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmluaXRQcm9qZWN0KHByb2plY3RzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNhY2hlZFByb2plY3RSZXNvdXJjZXMgPSB0aGlzLnByb2plY3RzO1xuICAgICAgfSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmNsdXN0ZXJzJCwgdGhpcy5uYW1lc3BhY2VzJF0pLnN1YnNjcmliZShcbiAgICAgIChbY2x1c3RlcnMsIGRhdGFdKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzTXVsdGlBcmNoID1cbiAgICAgICAgICB1bmlxKGNsdXN0ZXJzLm1hcChjID0+IHRoaXMuazhzVXRpbC5nZXRMYWJlbChjLCAnYXJjaCcpKSkubGVuZ3RoID4gMTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhID0gdGhpcy5tYXBSZXNvdXJjZShkYXRhLCB7XG4gICAgICAgICAgY2x1c3RlcnMsXG4gICAgICAgICAgaXNNdWx0aUFyY2gsXG4gICAgICAgIH0pLmZpbHRlcihucyA9PiB0aGlzLmNvbnRleHQgPT09ICdwYWdlJyB8fCAhbnMuc3RhdGU/LmRpc2FibGVkKTtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE5hbWVzcGFjZSh0aGlzLmRpc3BsYXllZERhdGEpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVpZCkge1xuICAgICAgICAgIHRoaXMuZGlzcGxheWVkRGF0YSA9IHRoaXMuZ2V0U29ydGVkTmFtZXNwYWNlKFxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLFxuICAgICAgICAgICAgdGhpcy52YWx1ZS5uYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9yY2VMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RvcmVOYW1lc3BhY2VzKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZ2V0U29ydGVkTmFtZXNwYWNlKHJhd0RhdGE6IE5hbWVzcGFjZURhdGFJdGVtW10sIG5hbWVzcGFjZT86IHN0cmluZykge1xuICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICByZXR1cm4gcmF3RGF0YTtcbiAgICB9XG4gICAgY29uc3QgW3NlbGVjdGVkLCBvdGhlcnNdID0gcGFydGl0aW9uKFxuICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLFxuICAgICAgaXRlbSA9PiBpdGVtLm5hbWUgPT09IG5hbWVzcGFjZSxcbiAgICApO1xuICAgIHJldHVybiBbLi4uc2VsZWN0ZWQsIC4uLm90aGVyc107XG4gIH1cblxuICBzdG9yZU5hbWVzcGFjZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUHJvamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZENsdXN0ZXIgPT09ICdfX2FsbCcpIHtcbiAgICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiB0aGlzLmNsdXN0ZXJzKSB7XG4gICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2Uuc3RvcmVOYW1lc3BhY2VzKFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcm9qZWN0Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICB0aGlzLmRpc3BsYXllZERhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5jbHVzdGVyID09PSBjbHVzdGVyKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb250ZXh0U2VydmljZS5zdG9yZU5hbWVzcGFjZXMoXG4gICAgICB0aGlzLnNlbGVjdGVkUHJvamVjdC5tZXRhZGF0YS5uYW1lLFxuICAgICAgdGhpcy5zZWxlY3RlZENsdXN0ZXIsXG4gICAgICB0aGlzLmRpc3BsYXllZERhdGEsXG4gICAgKTtcbiAgfVxuXG4gIHByb2plY3RGaWx0ZXJGbiA9IChrZXl3b3JkID0gJycsIG9wdGlvbjogU2VsZWN0RmlsdGVyT3B0aW9uPFByb2plY3Q+KSA9PiB7XG4gICAgY29uc3QgayA9IGtleXdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKFxuICAgICAgb3B0aW9uLnZhbHVlLm1ldGFkYXRhLm5hbWUuaW5jbHVkZXMoaykgfHxcbiAgICAgIGdldERvbWFpbkFubm90YXRpb24oRElTUExBWV9OQU1FLCBvcHRpb24udmFsdWUpXG4gICAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgICA/LmluY2x1ZGVzKGspXG4gICAgKTtcbiAgfTtcblxuICBjbHVzdGVyRmlsdGVyRm4gPSAoa2V5d29yZCA9ICcnLCBvcHRpb246IFNlbGVjdEZpbHRlck9wdGlvbjxzdHJpbmc+KSA9PiB7XG4gICAgY29uc3QgayA9IGtleXdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3B0aW9uLnZhbHVlID09PSAnX19hbGwnKSB7XG4gICAgICByZXR1cm4gKG9wdGlvbi5sYWJlbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoayk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBuYW1lLCBkaXNwbGF5TmFtZSB9ID0gb3B0aW9uLmxhYmVsQ29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgcmV0dXJuIG5hbWUuaW5jbHVkZXMoaykgfHwgZGlzcGxheU5hbWU/LnRvTG93ZXJDYXNlKCk/LmluY2x1ZGVzKGspO1xuICB9O1xuXG4gIHNlcnZpY2VNZXNoRmlsdGVyRm4gPSAoXG4gICAga2V5d29yZCA9ICcnLFxuICAgIG9wdGlvbjogU2VsZWN0RmlsdGVyT3B0aW9uPFNlcnZpY2VNZXNoR3JvdXA+LFxuICApID0+IHtcbiAgICBjb25zdCBrID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHZlcnNpb24gPSBvcHRpb24udmFsdWUuc3BlYz8uaXN0aW9WZXJzaW9uXG4gICAgICA/IGBJc3RpbyAke29wdGlvbi52YWx1ZS5zcGVjLmlzdGlvVmVyc2lvbn1gXG4gICAgICA6ICcnO1xuICAgIHJldHVybiAoXG4gICAgICBvcHRpb24udmFsdWUubWV0YWRhdGEubmFtZS5pbmNsdWRlcyhrKSB8fFxuICAgICAgdmVyc2lvbi50b0xvd2VyQ2FzZSgpPy5pbmNsdWRlcyhrKVxuICAgICk7XG4gIH07XG5cbiAgcHJvamVjdFRyYWNrRm4gPSAocHJvamVjdDogUHJvamVjdCkgPT4gcHJvamVjdD8ubWV0YWRhdGEubmFtZTtcblxuICBzZXJ2aWNlTWVzaFRyYWNrRm4gPSAobWVzaDogU2VydmljZU1lc2hHcm91cCkgPT4gbWVzaD8ubWV0YWRhdGEubmFtZTtcblxuICBwcml2YXRlIGluaXRQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10pIHtcbiAgICB0aGlzLnNlbGVjdFByb2plY3QoXG4gICAgICAocHJvamVjdHMgfHwgW10pLmxlbmd0aFxuICAgICAgICA/IHByb2plY3RzLmZpbmQoaXRlbSA9PiBpdGVtLm1ldGFkYXRhLm5hbWUgPT09IHRoaXMudmFsdWU/LnByb2plY3QpIHx8XG4gICAgICAgICAgICBwcm9qZWN0c1swXVxuICAgICAgICA6IG51bGwsXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgdGhpcy5sb2FkLmVtaXQoe1xuICAgICAgcHJvamVjdDogcHJvamVjdHMubGVuZ3RoLFxuICAgICAgY2x1c3RlcjogdW5pcShcbiAgICAgICAgcHJvamVjdHMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGN1cikgPT4gWy4uLmFjYywgLi4uKGN1ci5zcGVjLmNsdXN0ZXJzIHx8IFtdKS5tYXAoYyA9PiBjLm5hbWUpXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKSxcbiAgICAgICkubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0U2VydmljZU1lc2goc2VydmljZU1lc2g6IFNlcnZpY2VNZXNoR3JvdXApIHtcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZU1lc2ggPSBzZXJ2aWNlTWVzaDtcbiAgICB0aGlzLmNsdXN0ZXJzID0gKHRoaXMuc2VsZWN0ZWRQcm9qZWN0LnNwZWMuY2x1c3RlcnMgfHwgW10pXG4gICAgICAubWFwKGMgPT4gYy5uYW1lKVxuICAgICAgLmZpbHRlcihjbHVzdGVyID0+XG4gICAgICAgIHRoaXMuc2VydmljZU1lc2hlc1xuICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgbWVzaCA9PlxuICAgICAgICAgICAgICB0aGlzLms4c1V0aWwuZ2V0TmFtZShtZXNoKSA9PT0gdGhpcy5rOHNVdGlsLmdldE5hbWUoc2VydmljZU1lc2gpLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3BlYy5jbHVzdGVycy5pbmNsdWRlcyhjbHVzdGVyKSxcbiAgICAgICk7XG4gICAgdGhpcy5zZWxlY3RDbHVzdGVyKCdfX2FsbCcpO1xuICB9XG5cbiAgc2VsZWN0UHJvamVjdChwcm9qZWN0OiBQcm9qZWN0LCBpbml0aWFsID0gZmFsc2UpIHtcbiAgICB0aGlzLnByb2plY3RDaGFuZ2UuZW1pdChwcm9qZWN0Py5tZXRhZGF0YS5uYW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkUHJvamVjdCA9IHByb2plY3Q7XG4gICAgdGhpcy5jbHVzdGVycyA9IHByb2plY3RcbiAgICAgID8gKHByb2plY3Quc3BlYy5jbHVzdGVycyB8fCBbXSkubWFwKGMgPT4gYy5uYW1lKVxuICAgICAgOiBbXTtcbiAgICBpZiAodGhpcy5kaXNwbGF5U2VydmljZU1lc2gpIHtcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2VNZXNoZXMgPSB0aGlzLnNlcnZpY2VNZXNoZXMuZmlsdGVyKG1lc2ggPT5cbiAgICAgICAgbWVzaC5zcGVjLmNsdXN0ZXJzLnNvbWUoY2x1c3RlciA9PiB0aGlzLmNsdXN0ZXJzLmluY2x1ZGVzKGNsdXN0ZXIpKSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wcm9qZWN0U2VydmljZU1lc2hlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxldCBtZXNoTmFtZSA9IHRoaXMudmFsdWU/LnNlcnZpY2VtZXNoO1xuXG4gICAgICAgIGlmICghbWVzaE5hbWUpIHtcbiAgICAgICAgICB0aGlzLmF1dGguZ2V0QWNjb3VudEluZm8oKS5zdWJzY3JpYmUoKHsgZW1haWwgfSkgPT4ge1xuICAgICAgICAgICAgbWVzaE5hbWUgPSBnZXRXb3Jrc3BhY2VQYXJhbXMoZW1haWwpPy5zZXJ2aWNlbWVzaDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU2VydmljZU1lc2ggPVxuICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2VNZXNoZXMuZmluZChcbiAgICAgICAgICAgIG1lc2ggPT4gdGhpcy5rOHNVdGlsLmdldE5hbWUobWVzaCkgPT09IG1lc2hOYW1lLFxuICAgICAgICAgICkgfHwgdGhpcy5wcm9qZWN0U2VydmljZU1lc2hlc1swXTtcbiAgICAgICAgdGhpcy5zZWxlY3RTZXJ2aWNlTWVzaChzZWxlY3RlZFNlcnZpY2VNZXNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTWVzaCA9IG51bGw7XG4gICAgICAgIHRoaXMuY2x1c3RlcnMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3RDbHVzdGVyKCdfX2FsbCcsIGluaXRpYWwpO1xuICB9XG5cbiAgc2VsZWN0Q2x1c3RlcihjbHVzdGVyTmFtZTogc3RyaW5nLCBpbml0aWFsID0gZmFsc2UpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ2x1c3RlciA9IGNsdXN0ZXJOYW1lO1xuICAgIGNvbnN0IGRpc3BsYXllZERhdGEgPVxuICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5nZXRDYWNoZWROYW1lc3BhY2VzKFxuICAgICAgICB0aGlzLnNlbGVjdGVkUHJvamVjdD8ubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZENsdXN0ZXIsXG4gICAgICApIHx8IFtdO1xuICAgIHRoaXMuZGlzcGxheWVkRGF0YSA9IHRoaXMuZ2V0U29ydGVkTmFtZXNwYWNlKFxuICAgICAgZGlzcGxheWVkRGF0YSxcbiAgICAgIGluaXRpYWwgPyB0aGlzLnZhbHVlPy5uYW1lIDogbnVsbCxcbiAgICApO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWROYW1lc3BhY2UodGhpcy5kaXNwbGF5ZWREYXRhKTtcblxuICAgIHRoaXMuY2x1c3RlckNoYW5nZS5lbWl0KFxuICAgICAgdGhpcy5zZWxlY3RlZENsdXN0ZXIgPT09ICdfX2FsbCcgPyBudWxsIDogY2x1c3Rlck5hbWUsXG4gICAgKTtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMubG9hZCQkLm5leHQoe1xuICAgICAgcHJvamVjdDogdGhpcy5zZWxlY3RlZFByb2plY3QsXG4gICAgICBjbHVzdGVyOiBjbHVzdGVyTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2VsZWN0ZWROYW1lc3BhY2UoZGF0YTogTmFtZXNwYWNlRGF0YUl0ZW1bXSkge1xuICAgIGNvbnN0IHNlbGVjdGVkTmFtZXNwYWNlID0gdGhpcy52YWx1ZVxuICAgICAgPyBkYXRhLmZpbmQoXG4gICAgICAgICAgaXRlbSA9PlxuICAgICAgICAgICAgaXRlbS5uYW1lID09PSB0aGlzLnZhbHVlLm5hbWUgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWUuY2x1c3RlciA9PT0gaXRlbS5jbHVzdGVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZFVpZCA9IHNlbGVjdGVkTmFtZXNwYWNlXG4gICAgICA/IHNlbGVjdGVkTmFtZXNwYWNlLl9fb3JpZ2luLm1ldGFkYXRhLnVpZFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgbWFwUmVzb3VyY2UgPSAoXG4gICAgbGlzdDogS3ViZXJuZXRlc1Jlc291cmNlW10sXG4gICAge1xuICAgICAgaXNNdWx0aUFyY2gsXG4gICAgICBjbHVzdGVycyxcbiAgICB9OiB7XG4gICAgICBpc011bHRpQXJjaDogYm9vbGVhbjtcbiAgICAgIGNsdXN0ZXJzOiBDbHVzdGVyW107XG4gICAgfSxcbiAgKTogTmFtZXNwYWNlRGF0YUl0ZW1bXSA9PlxuICAgIGxpc3QubWFwKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgY2x1c3RlciA9IHRoaXMubmFtZXNwYWNlQ2x1c3Rlck1hcFtpdGVtLm1ldGFkYXRhLnVpZF07XG4gICAgICBjb25zdCBpdGVtRGlzYWJsZWQgPSB0aGlzLmRpc2FibGVGbiA/IHRoaXMuZGlzYWJsZUZuKGl0ZW0pIDogbnVsbDtcbiAgICAgIGNvbnN0IGNhY2hlZEl0ZW0gPSB0aGlzLmRpc3BsYXllZERhdGEuZmluZChcbiAgICAgICAgbnMgPT4gbnMuX19vcmlnaW4ubWV0YWRhdGEudWlkID09PSBpdGVtLm1ldGFkYXRhLnVpZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2aWNlbWVzaCA9IHRoaXMuc2VydmljZU1lc2hlcy5maW5kKGl0ZW0gPT5cbiAgICAgICAgaXRlbS5zcGVjLmNsdXN0ZXJzLmluY2x1ZGVzKGNhY2hlZEl0ZW0/LmNsdXN0ZXIgfHwgY2x1c3RlciksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogdGhpcy5rOHNVdGlsLmdldE5hbWUoaXRlbSksXG4gICAgICAgIGRpc3BsYXlOYW1lOiB0aGlzLms4c1V0aWwuZ2V0RGlzcGxheU5hbWUoaXRlbSksXG4gICAgICAgIGNsdXN0ZXI6IGNhY2hlZEl0ZW0/LmNsdXN0ZXIgfHwgY2x1c3RlcixcbiAgICAgICAgY2x1c3RlckRpc3BsYXlOYW1lOlxuICAgICAgICAgIGNhY2hlZEl0ZW0/LmNsdXN0ZXJEaXNwbGF5TmFtZSB8fFxuICAgICAgICAgIHRoaXMuazhzVXRpbC5nZXREaXNwbGF5TmFtZShcbiAgICAgICAgICAgIGNsdXN0ZXJzLmZpbmQoYyA9PiBjLm1ldGFkYXRhLm5hbWUgPT09IGNsdXN0ZXIpLFxuICAgICAgICAgICksXG4gICAgICAgIGNsdXN0ZXJBcmNoOlxuICAgICAgICAgIGNhY2hlZEl0ZW0/LmNsdXN0ZXJBcmNoIHx8IGlzTXVsdGlBcmNoXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q2x1c3RlckFyY2goXG4gICAgICAgICAgICAgICAgY2x1c3RlcnMuZmluZChjID0+IGMubWV0YWRhdGEubmFtZSA9PT0gY2x1c3RlciksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgc2VydmljZU1lc2hOYW1lOiBzZXJ2aWNlbWVzaCA/IHRoaXMuazhzVXRpbC5nZXROYW1lKHNlcnZpY2VtZXNoKSA6ICcnLFxuICAgICAgICBzZXJ2aWNlTWVzaENsdXN0ZXJzOiBzZXJ2aWNlbWVzaCA/IHNlcnZpY2VtZXNoLnNwZWMuY2x1c3RlcnMgOiBbXSxcbiAgICAgICAgc2VydmljZU1lc2hJc3Rpb1ZlcnNpb246IHNlcnZpY2VtZXNoXG4gICAgICAgICAgPyBzZXJ2aWNlbWVzaC5zcGVjLmlzdGlvVmVyc2lvblxuICAgICAgICAgIDogJycsXG4gICAgICAgIGFkbWluOiBjYWNoZWRJdGVtPy5hZG1pbiB8fCAnLScsXG4gICAgICAgIHRpbWVzdGFtcDogdGhpcy5rOHNVdGlsLmdldENyZWF0aW9uVGltZXN0YW1wKGl0ZW0pLFxuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIGRpc2FibGVkOlxuICAgICAgICAgICAgdGhpcy5ncmlkU3RhdGVNYXBbY2x1c3Rlcl0/LmRpc2FibGVkIHx8XG4gICAgICAgICAgICBpdGVtRGlzYWJsZWQ/LmRpc2FibGVkIHx8XG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2x1c3RlckVycm9yKGNsdXN0ZXJzLCBjYWNoZWRJdGVtPy5jbHVzdGVyIHx8IGNsdXN0ZXIpIHx8XG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0b29sdGlwOiB0aGlzLmdyaWRTdGF0ZU1hcFtjbHVzdGVyXT8uZGlzYWJsZWRcbiAgICAgICAgICAgID8gdGhpcy5ncmlkU3RhdGVNYXBbY2x1c3Rlcl0/LnRvb2x0aXAgfHwgJydcbiAgICAgICAgICAgIDogaXRlbURpc2FibGVkPy50b29sdGlwLFxuICAgICAgICB9LFxuICAgICAgICBfX29yaWdpbjogaXRlbSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgcHJpdmF0ZSBnZXRDbHVzdGVyQXJjaChjbHVzdGVyOiBDbHVzdGVyKSB7XG4gICAgcmV0dXJuIGdldERpc3BsYXlBcmNoKFxuICAgICAgdGhpcy5rOHNVdGlsLmdldExhYmVsKGNsdXN0ZXIsICdhcmNoJyksXG4gICAgKSBhcyBDbHVzdGVyQXJjaDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tDbHVzdGVyRXJyb3IoY2x1c3RlcnM6IENsdXN0ZXJbXSwgY2x1c3Rlcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNsdXN0ZXJzXG4gICAgICAgIC5maW5kKGkgPT4gdGhpcy5rOHNVdGlsLmdldE5hbWUoaSkgPT09IGNsdXN0ZXIpXG4gICAgICAgID8uc3RhdHVzLmNvbmRpdGlvbnMuZmluZChjID0+IGMudHlwZSA9PT0gJ05vZGVOb3RSZWFkeScpPy5zdGF0dXMgIT09XG4gICAgICAnRmFsc2UnXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZpbHRlclwiPlxuICA8YXVpLWZvcm0taXRlbT5cbiAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAncHJvamVjdCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgIDxhdWktc2VsZWN0XG4gICAgICBbbmdDbGFzc109XCJkaXNwbGF5U2VydmljZU1lc2ggPyAnbGFuZy1ub3Qtemg6IXR3LXctWzIzMHB4XScgOiAnJ1wiXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIG5hbWU9XCJwcm9qZWN0XCJcbiAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRQcm9qZWN0XCJcbiAgICAgIFtmaWx0ZXJGbl09XCJwcm9qZWN0RmlsdGVyRm5cIlxuICAgICAgW3RyYWNrRm5dPVwicHJvamVjdFRyYWNrRm5cIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlbGVjdFByb2plY3QoJGV2ZW50KVwiXG4gICAgICBbbG9hZGluZ109XCIhcHJvamVjdHMubGVuZ3RoICYmIHByb2plY3RzTG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IHByb2plY3Qgb2YgcHJvamVjdHNcIlxuICAgICAgICBbdmFsdWVdPVwicHJvamVjdFwiXG4gICAgICAgIFtsYWJlbF09XCJwcm9qZWN0IHwgYWNsVW5pb25EaXNwbGF5TmFtZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHByb2plY3QgfCBhY2xVbmlvbkRpc3BsYXlOYW1lIH19XG4gICAgICA8L2F1aS1vcHRpb24+XG4gICAgICA8YXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAge3sgJ25vX2RhdGEnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2F1aS1vcHRpb24tcGxhY2Vob2xkZXI+XG4gICAgPC9hdWktc2VsZWN0PlxuICA8L2F1aS1mb3JtLWl0ZW0+XG4gIDwhLS0gQVNNIOmAieaLqee9keagvOi/h+a7pOmbhue+pOmAiemhuSAtLT5cbiAgPGF1aS1mb3JtLWl0ZW0gKm5nSWY9XCJkaXNwbGF5U2VydmljZU1lc2hcIj5cbiAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAnc2VydmljZV9tZXNoJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGF1aS1zZWxlY3RcbiAgICAgIGNsYXNzPVwibGFuZy1ub3Qtemg6IXR3LXctWzIzMHB4XVwiXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIG5hbWU9XCJzZXJ2aWNlTWVzaFByb2plY3RcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFNlcnZpY2VNZXNoXCJcbiAgICAgIFt0cmFja0ZuXT1cInNlcnZpY2VNZXNoVHJhY2tGblwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwic2VsZWN0U2VydmljZU1lc2goJGV2ZW50KVwiXG4gICAgICBbbG9hZGluZ109XCIhcHJvamVjdHMubGVuZ3RoICYmIHByb2plY3RzTG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IG1lc2ggb2YgcHJvamVjdFNlcnZpY2VNZXNoZXNcIlxuICAgICAgICBbdmFsdWVdPVwibWVzaFwiXG4gICAgICAgIFtsYWJlbF09XCJcbiAgICAgICAgICAobWVzaCB8IGFjbE5hbWUpICtcbiAgICAgICAgICAobWVzaC5zcGVjPy5pc3Rpb1ZlcnNpb25cbiAgICAgICAgICAgID8gJyAoSXN0aW8gJyArIG1lc2guc3BlYy5pc3Rpb1ZlcnNpb24gKyAnKSdcbiAgICAgICAgICAgIDogJycpXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHt7IG1lc2ggfCBhY2xOYW1lIH19XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNoLnNwZWM/LmlzdGlvVmVyc2lvblwiPlxuICAgICAgICAgIChJc3RpbyB7eyBtZXNoLnNwZWMuaXN0aW9WZXJzaW9uIH19KVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvYXVpLW9wdGlvbj5cbiAgICAgIDxhdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgICAgICB7eyAnbm9fZGF0YScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICA8L2F1aS1zZWxlY3Q+XG4gIDwvYXVpLWZvcm0taXRlbT5cbiAgPGF1aS1mb3JtLWl0ZW0+XG4gICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ2NsdXN0ZXInIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8YXVpLXNlbGVjdFxuICAgICAgW25nQ2xhc3NdPVwiZGlzcGxheVNlcnZpY2VNZXNoID8gJ2xhbmctbm90LXpoOiF0dy13LVsyMzBweF0nIDogJydcIlxuICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICBuYW1lPVwiY2x1c3RlclwiXG4gICAgICBbZmlsdGVyRm5dPVwiY2x1c3RlckZpbHRlckZuXCJcbiAgICAgIFtsb2FkaW5nXT1cIiFwcm9qZWN0cy5sZW5ndGggJiYgcHJvamVjdHNMb2FkaW5nXCJcbiAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDbHVzdGVyXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZWxlY3RDbHVzdGVyKCRldmVudClcIlxuICAgID5cbiAgICAgIDxhdWktb3B0aW9uXG4gICAgICAgIFt2YWx1ZV09XCInX19hbGwnXCJcbiAgICAgICAgW2xhYmVsXT1cIidhbGwnIHwgdHJhbnNsYXRlXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2FsbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNsdXN0ZXJOYW1lIG9mIGNsdXN0ZXJzXCI+XG4gICAgICAgIDxhdWktb3B0aW9uXG4gICAgICAgICAgKmRlY2xhcmU9XCJ7XG4gICAgICAgICAgICBuYW1lOiBjbHVzdGVyTmFtZSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBjbHVzdGVyTmFtZSB8IHB1cmU6IGdldENsdXN0ZXJEaXNwbGF5TmFtZSQgfCBhc3luYyxcbiAgICAgICAgICB9IGFzIGNsdXN0ZXJcIlxuICAgICAgICAgIFt2YWx1ZV09XCJjbHVzdGVyTmFtZVwiXG4gICAgICAgICAgW2xhYmVsXT1cImNsdXN0ZXJMYWJlbFwiXG4gICAgICAgICAgW2xhYmVsQ29udGV4dF09XCJjbHVzdGVyXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiY2x1c3Rlck5hbWUgfCBwdXJlOiBjaGVja0NsdXN0ZXJFcnJvciQgfCBhc3luY1wiXG4gICAgICAgICAgW2F1aVRvb2x0aXBdPVwiJ2N1cnJlbnRfY2x1c3Rlcl9zdGF0dXNfYWJub3JtYWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXVpVG9vbHRpcERpc2FibGVkXT1cIlxuICAgICAgICAgICAgIShjbHVzdGVyTmFtZSB8IHB1cmU6IGNoZWNrQ2x1c3RlckVycm9yJCB8IGFzeW5jKVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNsdXN0ZXJMYWJlbDsgY29udGV4dDogY2x1c3RlclwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2F1aS1vcHRpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxhdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgICAgICB7eyAnbm9fZGF0YScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjY2x1c3RlckxhYmVsXG4gICAgICAgIGxldC1uYW1lPVwibmFtZVwiXG4gICAgICAgIGxldC1kaXNwbGF5TmFtZT1cImRpc3BsYXlOYW1lXCJcbiAgICAgID5cbiAgICAgICAge3sgbmFtZSB9fVxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheU5hbWVcIj4oe3sgZGlzcGxheU5hbWUgfX0pPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvYXVpLXNlbGVjdD5cbiAgPC9hdWktZm9ybS1pdGVtPlxuPC9kaXY+XG48YWNsLXJlc291cmNlLWRhdGEtZ3JpZFxuICBbZGF0YV09XCJkaXNwbGF5ZWREYXRhIHx8IFtdXCJcbiAgW2ZpZWxkc109XCJmaWVsZHNcIlxuICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgKHNlbGVjdEl0ZW0pPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gIFthY3Rpb25UZW1wbGF0ZVJlZl09XCJhY3Rpb25UZW1wbGF0ZVJlZlwiXG4gIFtzZWxlY3RlZFVpZF09XCJzZWxlY3RlZFVpZFwiXG4gIFtsb2FkaW5nXT1cImZvcmNlTG9hZGluZyB8fCAoIWRpc3BsYXllZERhdGE/Lmxlbmd0aCAmJiBsb2FkaW5nKVwiXG4gIChyZWxvYWQpPVwicmVsb2FkKClcIlxuPlxuICA8bmctY29udGFpbmVyIGFjbFJlc291cmNlR3JpZEhlYWRlcj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9hY2wtcmVzb3VyY2UtZGF0YS1ncmlkPlxuIl19
|