@openziti/ziti-console-lib 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/html/index.htm +21 -3
- package/assets/images/Icon_Minus.png +0 -0
- package/assets/languages/en-us.json +3 -1
- package/assets/styles/global.scss +17 -0
- package/assets/styles/tables.css +28 -3
- package/assets/styles/ziti.css +29 -2
- package/assets/svgs/v8visualizer.svg +60 -0
- package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +1 -1
- package/esm2022/lib/features/multi-action-button/multi-action-button.component.mjs +31 -0
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +260 -0
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.mjs +177 -0
- package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +8 -5
- package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +10 -6
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +23 -1
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +3 -3
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +37 -3
- package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +3 -3
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.component.mjs +1508 -0
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.helper.mjs +578 -0
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs +695 -0
- package/esm2022/lib/features/visualizer/visualizer-service.class.mjs +33 -0
- package/esm2022/lib/features/wrappers/zac-wrapper.service.mjs +6 -1
- package/esm2022/lib/models/edge-router-policy.mjs +10 -0
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +7 -6
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +7 -7
- package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +3 -3
- package/esm2022/lib/pages/identities/identities-page.service.mjs +2 -2
- package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +7 -6
- package/esm2022/lib/pages/services/services-page.service.mjs +3 -3
- package/esm2022/lib/shared/list-page-service.class.mjs +11 -5
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/lib/ziti-console-lib.module.mjs +16 -3
- package/esm2022/public-api.mjs +6 -1
- package/fesm2022/openziti-ziti-console-lib.mjs +4344 -1040
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/lib/features/multi-action-button/multi-action-button.component.d.ts +13 -0
- package/lib/features/multi-action-button/multi-action-button.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +56 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts +32 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +3 -2
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts +6 -0
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +3 -0
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts +129 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts.map +1 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts +131 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts.map +1 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts +31 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts.map +1 -0
- package/lib/features/visualizer/visualizer-service.class.d.ts +10 -0
- package/lib/features/visualizer/visualizer-service.class.d.ts.map +1 -0
- package/lib/features/wrappers/zac-wrapper.service.d.ts.map +1 -1
- package/lib/models/edge-router-policy.d.ts +7 -0
- package/lib/models/edge-router-policy.d.ts.map +1 -0
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +1 -1
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +1 -1
- package/lib/shared/list-page-service.class.d.ts.map +1 -1
- package/lib/ziti-console-lib.module.d.ts +33 -30
- package/lib/ziti-console-lib.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
- package/public-api.d.ts.map +1 -1
|
@@ -0,0 +1,1508 @@
|
|
|
1
|
+
/* eslint prefer-const: 1 */
|
|
2
|
+
import { Component, Inject, ViewEncapsulation, } from '@angular/core';
|
|
3
|
+
import { SETTINGS_SERVICE, } from '../../../services/settings.service';
|
|
4
|
+
import { ZITI_DATA_SERVICE, } from '../../../services/ziti-data.service';
|
|
5
|
+
import { VisualizerServiceClass } from '../visualizer-service.class';
|
|
6
|
+
import * as d3 from 'd3';
|
|
7
|
+
import _ from 'lodash';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common/http";
|
|
10
|
+
import * as i2 from "../../messaging/logger.service";
|
|
11
|
+
import * as i3 from "./network-visualizer.treenodeprocessor";
|
|
12
|
+
import * as i4 from "./network-visualizer.helper";
|
|
13
|
+
import * as i5 from "@angular/common";
|
|
14
|
+
import * as i6 from "@angular/forms";
|
|
15
|
+
import * as i7 from "@angular/material/autocomplete";
|
|
16
|
+
import * as i8 from "@angular/material/core";
|
|
17
|
+
import * as i9 from "../../loading-indicator/loading-indicator.component";
|
|
18
|
+
import * as i10 from "../../../services/settings.service";
|
|
19
|
+
import * as i11 from "../../../services/ziti-data.service";
|
|
20
|
+
class NetworkVisualizerComponent extends VisualizerServiceClass {
|
|
21
|
+
constructor(settingsService, zitiService, httpClient, logger, treeNodeProcessor, topologyHelper) {
|
|
22
|
+
super();
|
|
23
|
+
this.settingsService = settingsService;
|
|
24
|
+
this.zitiService = zitiService;
|
|
25
|
+
this.httpClient = httpClient;
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
this.treeNodeProcessor = treeNodeProcessor;
|
|
28
|
+
this.topologyHelper = topologyHelper;
|
|
29
|
+
// export class NetworkVisualizerComponent implements OnInit {
|
|
30
|
+
this.title = 'Network Visualizer';
|
|
31
|
+
this.uniqId = 0;
|
|
32
|
+
this.fullScreen = false;
|
|
33
|
+
this.isLoading = true;
|
|
34
|
+
this.noSearchResults = false;
|
|
35
|
+
this.servicePoliciesTreeNodes = [];
|
|
36
|
+
this.servicesTreeNodes = [];
|
|
37
|
+
this.identitiesTreeNodes = [];
|
|
38
|
+
this.edgeroutersTreeNodes = [];
|
|
39
|
+
this.erPoliciesTreeNodes = [];
|
|
40
|
+
this.serviceEdgeRouterPolicyTreeNodes = [];
|
|
41
|
+
this.resourceTypeError = false;
|
|
42
|
+
this.filterText = '';
|
|
43
|
+
this.resourceType = '';
|
|
44
|
+
this.openNodes = [];
|
|
45
|
+
this.contextmenuNodeType = [];
|
|
46
|
+
// super(settingsService, zitiService);
|
|
47
|
+
}
|
|
48
|
+
ngOnInit() {
|
|
49
|
+
this.getNetworkObjects();
|
|
50
|
+
}
|
|
51
|
+
getPagingObject(pagesize) {
|
|
52
|
+
const paging = {
|
|
53
|
+
searchOn: 'name',
|
|
54
|
+
noSearch: false,
|
|
55
|
+
filter: '',
|
|
56
|
+
total: pagesize,
|
|
57
|
+
page: 1,
|
|
58
|
+
sort: 'name',
|
|
59
|
+
order: 'asc',
|
|
60
|
+
};
|
|
61
|
+
return paging;
|
|
62
|
+
}
|
|
63
|
+
async getNetworkObjects() {
|
|
64
|
+
this.isLoading = true;
|
|
65
|
+
await this.readAllObjects();
|
|
66
|
+
this.processFirstNetworkGraph();
|
|
67
|
+
}
|
|
68
|
+
async fetchIdentities(pagesize) {
|
|
69
|
+
const identities_paging = this.getPagingObject(pagesize);
|
|
70
|
+
return await this.zitiService
|
|
71
|
+
.get(`identities`, identities_paging, [])
|
|
72
|
+
.then(async (result) => {
|
|
73
|
+
this.identities = result.data;
|
|
74
|
+
if (!this.identities || this.identities.length === 0) {
|
|
75
|
+
this.identities = [];
|
|
76
|
+
this.isLoading = false;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
80
|
+
const promises = [];
|
|
81
|
+
for (let page = 2; page <= pages; page++) {
|
|
82
|
+
identities_paging.page = page;
|
|
83
|
+
const tmp_promise = await this.zitiService
|
|
84
|
+
.get(`identities`, identities_paging, []).then((pageResult) => {
|
|
85
|
+
pageResult.data.forEach((serv) => {
|
|
86
|
+
this.identities.push(serv);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
promises.push(tmp_promise);
|
|
90
|
+
}
|
|
91
|
+
Promise.all(promises).then(() => { });
|
|
92
|
+
}
|
|
93
|
+
}).catch(error => {
|
|
94
|
+
this.logger.error('Error in fetching Identities', error.message);
|
|
95
|
+
}); // identity promises
|
|
96
|
+
}
|
|
97
|
+
async fetchServices(pagesize) {
|
|
98
|
+
const services_paging = this.getPagingObject(pagesize);
|
|
99
|
+
return await this.zitiService
|
|
100
|
+
.get(`services`, services_paging, [])
|
|
101
|
+
.then(async (result) => {
|
|
102
|
+
this.services = result.data;
|
|
103
|
+
if (!this.services || this.services.length === 0) {
|
|
104
|
+
this.services = [];
|
|
105
|
+
this.isLoading = false;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
109
|
+
const s_promises = [];
|
|
110
|
+
for (let page = 2; page <= pages; page++) {
|
|
111
|
+
services_paging.page = page;
|
|
112
|
+
const tmp_promise = await this.zitiService
|
|
113
|
+
.get(`services`, services_paging, [])
|
|
114
|
+
.then((pageResult) => {
|
|
115
|
+
pageResult.data.forEach((serv) => {
|
|
116
|
+
this.services.push(serv);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
s_promises.push(tmp_promise);
|
|
120
|
+
}
|
|
121
|
+
Promise.all(s_promises).then(() => { });
|
|
122
|
+
}
|
|
123
|
+
}).catch(error => {
|
|
124
|
+
this.logger.error('Error in fetching services', error.message);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async fetchServicePolicies(pagesize) {
|
|
128
|
+
const servicesPolicies_paging = this.getPagingObject(pagesize);
|
|
129
|
+
return await this.zitiService
|
|
130
|
+
.get(`service-policies`, servicesPolicies_paging, [])
|
|
131
|
+
.then(async (result) => {
|
|
132
|
+
this.service_policies = result.data;
|
|
133
|
+
if (!this.service_policies || this.service_policies.length === 0) {
|
|
134
|
+
this.service_policies = [];
|
|
135
|
+
this.isLoading = false;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
139
|
+
const sp_promises = [];
|
|
140
|
+
for (let page = 2; page <= pages; page++) {
|
|
141
|
+
servicesPolicies_paging.page = page;
|
|
142
|
+
const tmp_promise = await this.zitiService
|
|
143
|
+
.get(`service-policies`, servicesPolicies_paging, [])
|
|
144
|
+
.then((pageResult) => {
|
|
145
|
+
pageResult.data.forEach((serv) => {
|
|
146
|
+
this.service_policies.push(serv);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
sp_promises.push(tmp_promise);
|
|
150
|
+
}
|
|
151
|
+
Promise.all(sp_promises).then(() => { });
|
|
152
|
+
}
|
|
153
|
+
}).catch(error => {
|
|
154
|
+
this.logger.error('Error in fetching service-policies', error.message);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async fetchEdgeRouters(pagesize) {
|
|
158
|
+
const routers_paging = this.getPagingObject(pagesize);
|
|
159
|
+
return await this.zitiService
|
|
160
|
+
.get(`edge-routers`, routers_paging, [])
|
|
161
|
+
.then(async (result) => {
|
|
162
|
+
this.edgerouters = result.data;
|
|
163
|
+
if (!this.edgerouters || this.edgerouters.length === 0) {
|
|
164
|
+
this.edgerouters = [];
|
|
165
|
+
this.isLoading = false;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
169
|
+
const r_promises = [];
|
|
170
|
+
for (let page = 2; page <= pages; page++) {
|
|
171
|
+
routers_paging.page = page;
|
|
172
|
+
const tmp_promise = await this.zitiService
|
|
173
|
+
.get(`edge-routers`, routers_paging, [])
|
|
174
|
+
.then((pageResult) => {
|
|
175
|
+
pageResult.data.forEach((serv) => {
|
|
176
|
+
this.edgerouters.push(serv);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
r_promises.push(tmp_promise);
|
|
180
|
+
}
|
|
181
|
+
Promise.all(r_promises).then(() => { });
|
|
182
|
+
}
|
|
183
|
+
}).catch(error => {
|
|
184
|
+
this.logger.error('Error in fetching edge-routers', error.message);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async findEdgeRouterPolicies(pagesize) {
|
|
188
|
+
this.router_policies = [];
|
|
189
|
+
const erpolicies_paging = this.getPagingObject(pagesize);
|
|
190
|
+
return await this.zitiService
|
|
191
|
+
.get(`edge-router-policies`, erpolicies_paging, [])
|
|
192
|
+
.then(async (result) => {
|
|
193
|
+
this.router_policies = result.data;
|
|
194
|
+
if (!this.router_policies || this.router_policies.length === 0) {
|
|
195
|
+
this.isLoading = false;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
199
|
+
const r_promises = [];
|
|
200
|
+
for (let page = 2; page <= pages; page++) {
|
|
201
|
+
erpolicies_paging.page = page;
|
|
202
|
+
const tmp_promise = await this.zitiService
|
|
203
|
+
.get(`edge-router-policies`, erpolicies_paging, [])
|
|
204
|
+
.then((pageResult) => {
|
|
205
|
+
pageResult.data.forEach((serv) => {
|
|
206
|
+
this.router_policies.push(serv);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
r_promises.push(tmp_promise);
|
|
210
|
+
}
|
|
211
|
+
Promise.all(r_promises).then(() => { });
|
|
212
|
+
}
|
|
213
|
+
}).catch(error => {
|
|
214
|
+
this.logger.error('Error in fetching edge-router-policies', error);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async fetchServiceEdgeRouterPolicies(pagesize) {
|
|
218
|
+
this.service_router_policies = [];
|
|
219
|
+
const serp_paging = this.getPagingObject(pagesize);
|
|
220
|
+
return await this.zitiService
|
|
221
|
+
.get(`service-edge-router-policies`, serp_paging, [])
|
|
222
|
+
.then(async (result) => {
|
|
223
|
+
this.service_router_policies = result.data;
|
|
224
|
+
if (!this.service_router_policies || this.service_router_policies.length === 0) {
|
|
225
|
+
this.isLoading = false;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
229
|
+
const r_promises = [];
|
|
230
|
+
for (let page = 2; page <= pages; page++) {
|
|
231
|
+
serp_paging.page = page;
|
|
232
|
+
const tmp_promise = await this.zitiService
|
|
233
|
+
.get(`service-edge-router-policies`, serp_paging, [])
|
|
234
|
+
.then((pageResult) => {
|
|
235
|
+
pageResult.data.forEach((serv) => {
|
|
236
|
+
this.service_router_policies.push(serv);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
r_promises.push(tmp_promise);
|
|
240
|
+
}
|
|
241
|
+
Promise.all(r_promises).then(() => { });
|
|
242
|
+
}
|
|
243
|
+
}).catch(error => {
|
|
244
|
+
this.logger.error('Error in fetching service-edge-router-policies', error);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
async fetchConfigs(pagesize) {
|
|
248
|
+
this.configs = [];
|
|
249
|
+
const configs_paging = this.getPagingObject(pagesize);
|
|
250
|
+
return await this.zitiService
|
|
251
|
+
.get(`configs`, configs_paging, [])
|
|
252
|
+
.then(async (result) => {
|
|
253
|
+
this.configs = result.data;
|
|
254
|
+
if (!this.configs || this.configs.length === 0) {
|
|
255
|
+
this.configs = [];
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
|
|
259
|
+
const r_promises = [];
|
|
260
|
+
for (let page = 2; page <= pages; page++) {
|
|
261
|
+
configs_paging.page = page;
|
|
262
|
+
const tmp_promise = await this.zitiService
|
|
263
|
+
.get(`configs`, configs_paging, [])
|
|
264
|
+
.then((pageResult) => {
|
|
265
|
+
pageResult.data.forEach((serv) => {
|
|
266
|
+
this.configs.push(serv);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
r_promises.push(tmp_promise);
|
|
270
|
+
}
|
|
271
|
+
Promise.all(r_promises).then(() => { });
|
|
272
|
+
}
|
|
273
|
+
}).catch(error => {
|
|
274
|
+
this.logger.error('Error in fetching configs', error);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
async readAllObjects() {
|
|
278
|
+
const myPromise = await new Promise((resolve, reject) => {
|
|
279
|
+
let networkVisPromises = [];
|
|
280
|
+
const pagesize = 500;
|
|
281
|
+
const eps = this.fetchIdentities(pagesize);
|
|
282
|
+
const ss = this.fetchServices(pagesize);
|
|
283
|
+
const sps = this.fetchServicePolicies(pagesize);
|
|
284
|
+
const ers = this.fetchEdgeRouters(pagesize);
|
|
285
|
+
const erps = this.findEdgeRouterPolicies(pagesize);
|
|
286
|
+
const serps = this.fetchServiceEdgeRouterPolicies(pagesize);
|
|
287
|
+
const cfg = this.fetchConfigs(pagesize);
|
|
288
|
+
Promise.all([eps, ss, sps, ers, erps, erps, serps, cfg]).then(() => {
|
|
289
|
+
resolve('end');
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
processFirstNetworkGraph() {
|
|
294
|
+
try {
|
|
295
|
+
const treeObj = this.topologyHelper.getResourceTreeObj('this.currentNetwork.name', 'this.currentNetwork.status', this.services, this.identities, this.service_policies, this.edgerouters, this.router_policies, this.service_router_policies, this.uniqId, this.logger);
|
|
296
|
+
this.uniqId = treeObj.lastId;
|
|
297
|
+
this.networkGraph = d3.hierarchy(treeObj, function (d) {
|
|
298
|
+
return d.children;
|
|
299
|
+
});
|
|
300
|
+
this.baseNetworkGraph = this.networkGraph;
|
|
301
|
+
this.servicePoliciesTreeNodes = [];
|
|
302
|
+
this.servicesTreeNodes = [];
|
|
303
|
+
this.identitiesTreeNodes = [];
|
|
304
|
+
this.edgeroutersTreeNodes = [];
|
|
305
|
+
this.erPoliciesTreeNodes = [];
|
|
306
|
+
this.serviceEdgeRouterPolicyTreeNodes = [];
|
|
307
|
+
this.servicePoliciesTreeNodes = this.fillAutoCompleteTreeNodes(this.networkGraph.children[0], this.servicePoliciesTreeNodes, 'ServicePolicy');
|
|
308
|
+
this.servicesTreeNodes = this.fillAutoCompleteTreeNodes(this.networkGraph.children[1], this.servicesTreeNodes, 'Service');
|
|
309
|
+
this.identitiesTreeNodes = this.fillAutoCompleteTreeNodes(this.networkGraph.children[2], this.identitiesTreeNodes, 'Identity');
|
|
310
|
+
this.edgeroutersTreeNodes = this.fillAutoCompleteTreeNodes(this.networkGraph.children[3], this.edgeroutersTreeNodes, 'Edge Router');
|
|
311
|
+
this.erPoliciesTreeNodes = this.fillAutoCompleteTreeNodes(this.networkGraph.children[4], this.erPoliciesTreeNodes, 'Router Policy');
|
|
312
|
+
this.serviceEdgeRouterPolicyTreeNodes = this.fillAutoCompleteTreeNodes(this.networkGraph.children[5], this.serviceEdgeRouterPolicyTreeNodes, 'Service Router Policy');
|
|
313
|
+
this.initTopoView();
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
this.logger.error(err.message);
|
|
317
|
+
}
|
|
318
|
+
this.isLoading = false;
|
|
319
|
+
}
|
|
320
|
+
fillAutoCompleteTreeNodes(nodeObj, arr, typeName) {
|
|
321
|
+
const name = nodeObj.data.name;
|
|
322
|
+
// const id = nodeObj.data.id;
|
|
323
|
+
if (!name) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
if (typeof nodeObj.data.type === 'undefined') {
|
|
327
|
+
// //
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
if (arr.indexOf(name) < 0 && nodeObj.data.type === typeName) {
|
|
331
|
+
arr.push(name);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
const childNodes = nodeObj.children ? nodeObj.children : nodeObj._children;
|
|
335
|
+
for (let i = 0; childNodes && i < childNodes.length; i++) {
|
|
336
|
+
this.fillAutoCompleteTreeNodes(childNodes[i], arr, typeName);
|
|
337
|
+
}
|
|
338
|
+
return arr;
|
|
339
|
+
}
|
|
340
|
+
autocompleteSearch(event) {
|
|
341
|
+
const str = event ? event.option.value : '';
|
|
342
|
+
this.searchResourceConditionCheck(str);
|
|
343
|
+
}
|
|
344
|
+
resourceTypeChanged() {
|
|
345
|
+
this.resetSearchNode();
|
|
346
|
+
this.clearSearchLinkColors();
|
|
347
|
+
if (_.isEmpty(this.resourceType)) {
|
|
348
|
+
this.autocompleteOptions = [];
|
|
349
|
+
this.clearSearchFilter();
|
|
350
|
+
this.resourceTypeError = !_.isEmpty(this.filterText);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
this.filterText = '';
|
|
354
|
+
this.resourceTypeError = false;
|
|
355
|
+
if (this.resourceType === 'service-policies') {
|
|
356
|
+
this.autocompleteOptions = this.servicePoliciesTreeNodes;
|
|
357
|
+
}
|
|
358
|
+
else if (this.resourceType === 'services') {
|
|
359
|
+
this.autocompleteOptions = this.servicesTreeNodes;
|
|
360
|
+
}
|
|
361
|
+
else if (this.resourceType === 'identities') {
|
|
362
|
+
this.autocompleteOptions = this.identitiesTreeNodes;
|
|
363
|
+
}
|
|
364
|
+
else if (this.resourceType === 'edge-routers') {
|
|
365
|
+
this.autocompleteOptions = this.edgeroutersTreeNodes;
|
|
366
|
+
}
|
|
367
|
+
else if (this.resourceType === 'edge-router-policies') {
|
|
368
|
+
this.autocompleteOptions = this.erPoliciesTreeNodes;
|
|
369
|
+
}
|
|
370
|
+
else if (this.resourceType === 'service-edge-router-policies') {
|
|
371
|
+
this.autocompleteOptions = this.serviceEdgeRouterPolicyTreeNodes;
|
|
372
|
+
}
|
|
373
|
+
if (!_.isEmpty(this.filterText)) {
|
|
374
|
+
this.searchResourceConditionCheck(this.filterText);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
searchResourceConditionCheck(searchTxt) {
|
|
378
|
+
if (this.resourceType === '' && searchTxt !== '') {
|
|
379
|
+
// if (searchTxt !== '') {
|
|
380
|
+
this.resourceTypeError = true;
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
this.searchResourceInTree(searchTxt);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
searchResourceInTree(searchTxt) {
|
|
388
|
+
// this.closeTable();
|
|
389
|
+
this.noSearchResults = false;
|
|
390
|
+
this.resourceTypeError = false;
|
|
391
|
+
this.resetTree(null);
|
|
392
|
+
if (searchTxt === '') {
|
|
393
|
+
this.clearSearchLinkColors();
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
this.resetSearchNode();
|
|
397
|
+
this.clearSearchLinkColors();
|
|
398
|
+
let paths = [];
|
|
399
|
+
let targetNodes = [];
|
|
400
|
+
const nodeIds = [];
|
|
401
|
+
if (this.resourceType === 'service-policies') {
|
|
402
|
+
targetNodes = this.processSearchInPreorder(this.nodes[1], searchTxt, paths, targetNodes);
|
|
403
|
+
}
|
|
404
|
+
else if (this.resourceType === 'edge-routers') {
|
|
405
|
+
targetNodes = this.processSearchInPreorder(this.nodes[4], searchTxt, paths, targetNodes);
|
|
406
|
+
}
|
|
407
|
+
else if (this.resourceType === 'services') {
|
|
408
|
+
targetNodes = this.processSearchInPreorder(this.nodes[2], searchTxt, paths, targetNodes);
|
|
409
|
+
}
|
|
410
|
+
else if (this.resourceType === 'identities') {
|
|
411
|
+
targetNodes = this.processSearchInPreorder(this.nodes[3], searchTxt, paths, targetNodes);
|
|
412
|
+
}
|
|
413
|
+
else if (this.resourceType === 'edge-router-policies') {
|
|
414
|
+
targetNodes = this.processSearchInPreorder(this.nodes[5], searchTxt, paths, targetNodes);
|
|
415
|
+
}
|
|
416
|
+
else if (this.resourceType === 'service-edge-router-policies') {
|
|
417
|
+
targetNodes = this.processSearchInPreorder(this.nodes[6], searchTxt, paths, targetNodes);
|
|
418
|
+
}
|
|
419
|
+
paths = this.explorePathsForSearchedNodes(targetNodes, paths, nodeIds);
|
|
420
|
+
if (targetNodes && targetNodes.length <= 0) {
|
|
421
|
+
this.noSearchResults = true;
|
|
422
|
+
this.clearSearchLinkColors();
|
|
423
|
+
// return false;
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
//if (targetNodes) {
|
|
427
|
+
this.openPaths(paths, true);
|
|
428
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
429
|
+
// @ts-ignore
|
|
430
|
+
d3.selectAll('circle').filter(function (d) {
|
|
431
|
+
const dataName = _.get(d, 'data.name', '');
|
|
432
|
+
// const dataId = _.get(d, 'data.id', '');
|
|
433
|
+
const nodeName = _.get(targetNodes[0], 'data.name', '');
|
|
434
|
+
if (dataName.toLowerCase() === searchTxt.toLowerCase() && nodeName === dataName) {
|
|
435
|
+
d3.select(this).style('fill', 'red');
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
// else {
|
|
440
|
+
// this.noSearchResults = true;
|
|
441
|
+
// this.clearSearchLinkColors();
|
|
442
|
+
// }
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
explorePathsForSearchedNodes(targetNodes, paths, nodeIds) {
|
|
446
|
+
for (let i = 0; targetNodes && i < targetNodes.length; i++) {
|
|
447
|
+
let nd = targetNodes[i];
|
|
448
|
+
paths.push(nd);
|
|
449
|
+
while (nd.parent) {
|
|
450
|
+
const nodeId = _.get(nd.parent, 'data.id');
|
|
451
|
+
if (nodeIds.indexOf(nodeId) < 0) {
|
|
452
|
+
nodeIds.push(nodeId);
|
|
453
|
+
paths.push(nd.parent);
|
|
454
|
+
}
|
|
455
|
+
nd = nd.parent;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return paths;
|
|
459
|
+
}
|
|
460
|
+
processSearchInPreorder(nodeObj, searchTxt, paths, targetNodes) {
|
|
461
|
+
const name = _.get(nodeObj, 'data.name');
|
|
462
|
+
// const nodeId = _.get(nodeObj, 'data.id');
|
|
463
|
+
const isRootNode = _.get(nodeObj, 'data.rootNode');
|
|
464
|
+
if (!name) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
if (isRootNode && isRootNode === 'Yes' && name.toLowerCase() === searchTxt.toLowerCase()) {
|
|
468
|
+
targetNodes.push(nodeObj);
|
|
469
|
+
}
|
|
470
|
+
const childNodes = nodeObj.children ? nodeObj.children : nodeObj._children;
|
|
471
|
+
for (let i = 0; childNodes && i < childNodes.length; i++) {
|
|
472
|
+
this.processSearchInPreorder(childNodes[i], searchTxt, paths, targetNodes);
|
|
473
|
+
}
|
|
474
|
+
return targetNodes;
|
|
475
|
+
}
|
|
476
|
+
clearSearchLinkColors() {
|
|
477
|
+
this.svg.selectAll('path.link').each(function (d) {
|
|
478
|
+
d3.select(this).style('stroke', 'white');
|
|
479
|
+
});
|
|
480
|
+
this.svg.selectAll('circle').style('fill', function (d) {
|
|
481
|
+
return d._children ? 'var(--tableText)' : '#fff';
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
openPaths(paths, doReset = false) {
|
|
485
|
+
const pathIds = [];
|
|
486
|
+
for (let i = paths.length - 1; i >= 0; i--) {
|
|
487
|
+
const l = paths[i];
|
|
488
|
+
if (this.openNodes.indexOf(l.data.id) < 0) {
|
|
489
|
+
this.openNodes.push(l.data.id);
|
|
490
|
+
}
|
|
491
|
+
this.expand(paths[i]);
|
|
492
|
+
if (i > 0) {
|
|
493
|
+
this.updateTree(l, doReset);
|
|
494
|
+
}
|
|
495
|
+
pathIds.push(l.data.id);
|
|
496
|
+
}
|
|
497
|
+
pathIds.push(paths[1].data.id);
|
|
498
|
+
pathIds.push(paths[0].data.id);
|
|
499
|
+
let childreng = null; // get 2nd level data nodes.
|
|
500
|
+
if (this.resourceType === 'service-policies') {
|
|
501
|
+
childreng = this.networkGraph.children[0];
|
|
502
|
+
}
|
|
503
|
+
else if (this.resourceType === 'services') {
|
|
504
|
+
childreng = this.networkGraph.children[1];
|
|
505
|
+
}
|
|
506
|
+
else if (this.resourceType === 'identities') {
|
|
507
|
+
childreng = this.networkGraph.children[2];
|
|
508
|
+
}
|
|
509
|
+
else if (this.resourceType === 'edge-routers') {
|
|
510
|
+
childreng = this.networkGraph.children[3];
|
|
511
|
+
}
|
|
512
|
+
else if (this.resourceType === 'edge-router-policies') {
|
|
513
|
+
childreng = this.networkGraph.children[4];
|
|
514
|
+
}
|
|
515
|
+
else if (this.resourceType === 'service-edge-router-policies') {
|
|
516
|
+
childreng = this.networkGraph.children[5];
|
|
517
|
+
}
|
|
518
|
+
const ndd_childs = childreng.children ? childreng.children : childreng._children; // 2nd level chailds. groups/childrens
|
|
519
|
+
for (let i = 0; i < ndd_childs.length; i++) {
|
|
520
|
+
// 2st level
|
|
521
|
+
// if (this.resourceType === 'endpoints' || this.resourceType === 'services') {
|
|
522
|
+
if (ndd_childs[i].data.type === 'Group') {
|
|
523
|
+
// process groups
|
|
524
|
+
const d1 = ndd_childs[i]; //get group
|
|
525
|
+
if (d1 && paths[1].data.id === d1.data.id) {
|
|
526
|
+
const children0 = d1.children ? d1.children : d1._children; // 3rd level childs
|
|
527
|
+
const arr = children0.filter(function (replOb) {
|
|
528
|
+
return replOb.data.id === paths[0].data.id;
|
|
529
|
+
});
|
|
530
|
+
d1.children = arr;
|
|
531
|
+
d1._children = null;
|
|
532
|
+
const arrgrp = ndd_childs.filter(function (replObj) {
|
|
533
|
+
return replObj.data.id === d1.data.id;
|
|
534
|
+
});
|
|
535
|
+
childreng.children = arrgrp;
|
|
536
|
+
this.updateTree(this.networkGraph, doReset);
|
|
537
|
+
break;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
if (childreng.data.id === paths[1].data.id) {
|
|
542
|
+
const arr = ndd_childs.filter(function (replOb) {
|
|
543
|
+
return replOb.data.id === paths[0].data.id;
|
|
544
|
+
});
|
|
545
|
+
childreng.children = arr;
|
|
546
|
+
childreng._children = null;
|
|
547
|
+
this.updateTree(this.networkGraph, doReset);
|
|
548
|
+
break;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
let datanodes = null; // get 2nd level data nodes.
|
|
553
|
+
if (this.resourceType === 'service-policies') {
|
|
554
|
+
datanodes = this.networkGraph.data.children[0];
|
|
555
|
+
}
|
|
556
|
+
else if (this.resourceType === 'services') {
|
|
557
|
+
datanodes = this.networkGraph.data.children[1];
|
|
558
|
+
}
|
|
559
|
+
else if (this.resourceType === 'identities') {
|
|
560
|
+
datanodes = this.networkGraph.data.children[2];
|
|
561
|
+
}
|
|
562
|
+
else if (this.resourceType === 'edge-routers') {
|
|
563
|
+
datanodes = this.networkGraph.data.children[3];
|
|
564
|
+
}
|
|
565
|
+
else if (this.resourceType === 'edge-router-policies') {
|
|
566
|
+
datanodes = this.networkGraph.data.children[4];
|
|
567
|
+
}
|
|
568
|
+
else if (this.resourceType === 'service-edge-router-policies') {
|
|
569
|
+
datanodes = this.networkGraph.data.children[5];
|
|
570
|
+
}
|
|
571
|
+
if (datanodes.id === paths[1].data.id) {
|
|
572
|
+
const arr = datanodes.children.filter(function (replOb) {
|
|
573
|
+
return replOb.id === paths[0].data.id;
|
|
574
|
+
});
|
|
575
|
+
datanodes.children = arr;
|
|
576
|
+
this.updateTree(this.networkGraph, doReset);
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
const groupNodes = datanodes.children;
|
|
580
|
+
for (let k = 0; k < groupNodes.length; k++) {
|
|
581
|
+
if (groupNodes[k].id === paths[1].data.id) {
|
|
582
|
+
// check searched group node
|
|
583
|
+
const arr = groupNodes[k].children.filter(function (replOb) {
|
|
584
|
+
return replOb.id === paths[0].data.id;
|
|
585
|
+
});
|
|
586
|
+
groupNodes[k].children = arr;
|
|
587
|
+
const arrgrp = groupNodes.filter(function (replObj) {
|
|
588
|
+
return replObj.id === paths[1].data.id;
|
|
589
|
+
});
|
|
590
|
+
datanodes.children = arrgrp;
|
|
591
|
+
this.updateTree(this.networkGraph, doReset);
|
|
592
|
+
break;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
this.updateTree(this.networkGraph, doReset);
|
|
597
|
+
this.searchRootNode = paths[1];
|
|
598
|
+
this.svg.selectAll('.link').each(function (d) {
|
|
599
|
+
if (pathIds.indexOf(d.data.id) >= 0) {
|
|
600
|
+
d3.select(this).style('stroke', 'red');
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
d3.select(this).style('stroke', 'white');
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
resetSearchNode() {
|
|
608
|
+
if (this.searchRootNode) {
|
|
609
|
+
this.networkGraph = _.cloneDeep(this.baseNetworkGraph);
|
|
610
|
+
this.updateTree(this.networkGraph);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
resetTree(clearSearch) {
|
|
614
|
+
this.resetSearchNode();
|
|
615
|
+
if (clearSearch) {
|
|
616
|
+
this.clearSearchFilter();
|
|
617
|
+
this.clearSearchType();
|
|
618
|
+
}
|
|
619
|
+
for (let i = this.openNodes.length - 1; i > 0; i--) {
|
|
620
|
+
const d = this.openNodes[i];
|
|
621
|
+
if (d && d.children) {
|
|
622
|
+
d._children = d.children;
|
|
623
|
+
d.children = null;
|
|
624
|
+
this.updateTree(d);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
for (let i = this.nodes.length - 1; i > 0; i--) {
|
|
628
|
+
const d = this.nodes[i];
|
|
629
|
+
if (d && d.children) {
|
|
630
|
+
d._children = d.children;
|
|
631
|
+
d.children = null;
|
|
632
|
+
this.updateTree(d);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
this.clearSearchLinkColors();
|
|
636
|
+
this.openNodes = [];
|
|
637
|
+
this.sizeToFit();
|
|
638
|
+
this.resetZoom();
|
|
639
|
+
}
|
|
640
|
+
expand(d) {
|
|
641
|
+
if (d._children) {
|
|
642
|
+
d.children = d._children;
|
|
643
|
+
d._children = null;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
collapse() {
|
|
647
|
+
for (let i = this.openNodes.length - 1; i > 0; i--) {
|
|
648
|
+
const d = this.nodes[i];
|
|
649
|
+
if (d.children) {
|
|
650
|
+
d._children = d.children;
|
|
651
|
+
d.children = null;
|
|
652
|
+
this.updateTree(d);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
filterSearchArray() {
|
|
657
|
+
if (_.isEmpty(this.resourceType)) {
|
|
658
|
+
this.autocompleteOptions = [];
|
|
659
|
+
this.resourceTypeError = !_.isEmpty(this.filterText);
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
this.autocompleteOptions = [];
|
|
663
|
+
if (this.resourceType === 'service-policies') {
|
|
664
|
+
this.autocompleteOptions = this.servicePoliciesTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
665
|
+
}
|
|
666
|
+
else if (this.resourceType === 'services') {
|
|
667
|
+
this.autocompleteOptions = this.servicesTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
668
|
+
}
|
|
669
|
+
else if (this.resourceType === 'identities') {
|
|
670
|
+
this.autocompleteOptions = this.identitiesTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
671
|
+
}
|
|
672
|
+
else if (this.resourceType === 'edge-routers') {
|
|
673
|
+
this.autocompleteOptions = this.edgeroutersTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
674
|
+
}
|
|
675
|
+
else if (this.resourceType === 'edge-router-policies') {
|
|
676
|
+
this.autocompleteOptions = this.erPoliciesTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
677
|
+
}
|
|
678
|
+
else if (this.resourceType === 'service-edge-router-policies') {
|
|
679
|
+
this.autocompleteOptions = this.serviceEdgeRouterPolicyTreeNodes.filter((option) => option.toLowerCase().includes(this.filterText.toLowerCase()));
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
zoomIn() {
|
|
683
|
+
}
|
|
684
|
+
zoomOut() {
|
|
685
|
+
}
|
|
686
|
+
clearSearchFilter() {
|
|
687
|
+
this.resourceTypeError = false;
|
|
688
|
+
this.filterText = '';
|
|
689
|
+
this.filterSearchArray();
|
|
690
|
+
this.resetSearchNode();
|
|
691
|
+
this.collapse();
|
|
692
|
+
this.clearSearchLinkColors();
|
|
693
|
+
}
|
|
694
|
+
clearSearchType() {
|
|
695
|
+
this.resourceType = '';
|
|
696
|
+
this.autocompleteOptions = [];
|
|
697
|
+
}
|
|
698
|
+
resetZoom() {
|
|
699
|
+
// const currentZoom = this.getZoomScale();
|
|
700
|
+
const transform = this.transform || _.cloneDeep(d3.zoomIdentity);
|
|
701
|
+
transform.k = 1;
|
|
702
|
+
this.svg.attr('transform', transform);
|
|
703
|
+
}
|
|
704
|
+
initTopoView() {
|
|
705
|
+
this.autocompleteOptions = [];
|
|
706
|
+
const margin = { top: 20, right: 190, bottom: 30, left: 0 };
|
|
707
|
+
// const width = 1600 - margin.left - margin.right;
|
|
708
|
+
const width = window.innerWidth - margin.right;
|
|
709
|
+
// const height = 1600 - margin.top - margin.bottom;
|
|
710
|
+
const height = window.innerHeight - margin.bottom;
|
|
711
|
+
this.treetooltip = d3.select('#tooltip');
|
|
712
|
+
this.resourceTypeError = false;
|
|
713
|
+
this.filterText = '';
|
|
714
|
+
this.resourceType = '';
|
|
715
|
+
const handleZoom = (e) => {
|
|
716
|
+
this.svg.attr('transform', e.transform);
|
|
717
|
+
};
|
|
718
|
+
this.zoom = d3.zoom().on('zoom', handleZoom);
|
|
719
|
+
this.svg = d3
|
|
720
|
+
.select('#NetworkVisualizerSVG')
|
|
721
|
+
.attr('width', '100%')
|
|
722
|
+
.attr('height', '100%')
|
|
723
|
+
.call(this.zoom)
|
|
724
|
+
.attr('viewBox', '-20 -450 ' + (width - margin.top * 2 - margin.bottom) + ' ' + +(height * 2 - margin.bottom))
|
|
725
|
+
.append('g')
|
|
726
|
+
.attr('transform', 'translate(' + -20 + ',' + 200 + ')');
|
|
727
|
+
d3.select('body').on('click', function () {
|
|
728
|
+
d3.select('#topocontextmenu').style('display', 'none');
|
|
729
|
+
});
|
|
730
|
+
d3.selectAll('g > *').remove();
|
|
731
|
+
this.treemap = d3.tree().nodeSize([100, 20]);
|
|
732
|
+
this.networkGraph.x = 100; // height / 4;
|
|
733
|
+
this.networkGraph.y = 100;
|
|
734
|
+
this.networkGraph.children.forEach(collapse);
|
|
735
|
+
this.updateTree(this.networkGraph);
|
|
736
|
+
_.delay(() => {
|
|
737
|
+
this.transform = d3.zoomIdentity;
|
|
738
|
+
this.transform.x = -200;
|
|
739
|
+
this.transform.y = 205;
|
|
740
|
+
this.transform.k = 1;
|
|
741
|
+
this.svg.transition().duration(750).attr('transform', this.transform);
|
|
742
|
+
}, 600);
|
|
743
|
+
function collapse(d) {
|
|
744
|
+
if (d.data.rootNode === 'Yes') {
|
|
745
|
+
d.data.clickProcess = 'Not Yet';
|
|
746
|
+
d._children = null;
|
|
747
|
+
}
|
|
748
|
+
if (d.children) {
|
|
749
|
+
d._children = d.children;
|
|
750
|
+
d._children.forEach(collapse);
|
|
751
|
+
d.children = null;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
updateTree(source, doReset = false) {
|
|
756
|
+
if (doReset) {
|
|
757
|
+
d3.selectAll('g > *').remove();
|
|
758
|
+
}
|
|
759
|
+
const duration = 750;
|
|
760
|
+
try {
|
|
761
|
+
this.treeData = this.treemap(this.networkGraph);
|
|
762
|
+
this.nodes = this.treeData.descendants();
|
|
763
|
+
this.links = this.treeData.descendants().slice(1);
|
|
764
|
+
}
|
|
765
|
+
catch (e) {
|
|
766
|
+
this.logger.error('Error in building tree object: ' + e.message);
|
|
767
|
+
}
|
|
768
|
+
const svgDefs = this.svg.append('defs');
|
|
769
|
+
const linearGradient = svgDefs.append('linearGradient').attr('id', 'NodeGradient');
|
|
770
|
+
linearGradient.append('stop').attr('class', 'stop1').attr('offset', '0%');
|
|
771
|
+
linearGradient.append('stop').attr('class', 'stop2').attr('offset', '50%');
|
|
772
|
+
linearGradient.append('stop').attr('class', 'stop3').attr('offset', '100%');
|
|
773
|
+
const linearGradient2 = svgDefs.append('linearGradient').attr('id', 'NodeHoverGradient');
|
|
774
|
+
linearGradient2.append('stop').attr('class', 'stop1a').attr('offset', '0%');
|
|
775
|
+
linearGradient2.append('stop').attr('class', 'stop2a').attr('offset', '50%');
|
|
776
|
+
linearGradient2.append('stop').attr('class', 'stop3a').attr('offset', '100%');
|
|
777
|
+
this.nodes.forEach(function (d) {
|
|
778
|
+
d.y = d.depth * 400;
|
|
779
|
+
});
|
|
780
|
+
this.node = this.svg.selectAll('g.node').data(this.nodes, function (d) {
|
|
781
|
+
return d.data.id;
|
|
782
|
+
});
|
|
783
|
+
this.nodeEnter = this.node
|
|
784
|
+
.enter()
|
|
785
|
+
.append('g')
|
|
786
|
+
.attr('class', (d) => {
|
|
787
|
+
let className = '';
|
|
788
|
+
if (_.startsWith(d.data.name, 'Edge Routers') || _.includes(d.data.type, 'Edge Router')) {
|
|
789
|
+
className = 'edge-router';
|
|
790
|
+
}
|
|
791
|
+
if (_.includes(d.data.name, 'Identities') || _.includes(d.data.type, 'Identity')) {
|
|
792
|
+
className = 'endpoint';
|
|
793
|
+
}
|
|
794
|
+
if (_.startsWith(d.data.name, 'Services') || _.startsWith(d.data.type, 'Service')) {
|
|
795
|
+
className = 'service';
|
|
796
|
+
}
|
|
797
|
+
if (_.startsWith(d.data.name, 'Bind-Services') || _.startsWith(d.data.name, 'Dial-Services')) {
|
|
798
|
+
className = 'service';
|
|
799
|
+
}
|
|
800
|
+
if (_.startsWith(d.data.name, 'BindPolicies') || _.startsWith(d.data.name, 'DialPolicies') || _.startsWith(d.data.name, 'BindPolicy')) {
|
|
801
|
+
className = 'service-policy';
|
|
802
|
+
}
|
|
803
|
+
if (_.includes(d.data.name, 'Service Policies') || _.includes(d.data.type, 'ServicePolicy')) {
|
|
804
|
+
className = 'service-policy';
|
|
805
|
+
}
|
|
806
|
+
if (_.startsWith(d.data.name, 'Edge Router Policies') || _.startsWith(d.data.type, 'Router Policy')) {
|
|
807
|
+
className = 'edge-router-policy';
|
|
808
|
+
}
|
|
809
|
+
if (_.startsWith(d.data.name, 'Service Edge Router Policies') ||
|
|
810
|
+
_.startsWith(d.data.type, 'Service Router Policy')) {
|
|
811
|
+
className = 'service-edge-router-policy';
|
|
812
|
+
}
|
|
813
|
+
className = d._children ? 'node ' + className : 'node terminate ' + className;
|
|
814
|
+
return className;
|
|
815
|
+
})
|
|
816
|
+
.attr('transform', function (d) {
|
|
817
|
+
if (source && source.x) {
|
|
818
|
+
return 'translate(' + source.y + ',' + source.x + ')';
|
|
819
|
+
}
|
|
820
|
+
else {
|
|
821
|
+
return 'translate(' + d.y + ',' + d.x + ')';
|
|
822
|
+
}
|
|
823
|
+
});
|
|
824
|
+
this.nodeEnter.on('contextmenu', (event, d) => {
|
|
825
|
+
event.preventDefault();
|
|
826
|
+
d3.select('#tooltip').style('display', 'none');
|
|
827
|
+
const nw = this.currentNetwork;
|
|
828
|
+
const rawEdgerouters = this.edgerouters;
|
|
829
|
+
const rawEndpoints = this.identities;
|
|
830
|
+
const rawAppwans = this.service_policies;
|
|
831
|
+
const edgeRouterPolicies = this.router_policies;
|
|
832
|
+
if (d && d.data && d.data.contextMenu === 'Yes') {
|
|
833
|
+
d3.select('#topocontextmenu')
|
|
834
|
+
.style('position', 'absolute')
|
|
835
|
+
.style('left', event.offsetX + 'px')
|
|
836
|
+
.style('top', event.offsetY + 'px')
|
|
837
|
+
.style('display', 'block');
|
|
838
|
+
}
|
|
839
|
+
else {
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
842
|
+
let obj = null;
|
|
843
|
+
if (d && d.data && d.data.type === 'Identity') {
|
|
844
|
+
if (d.data.status === "Registered") {
|
|
845
|
+
enableLi('#liSingleUT');
|
|
846
|
+
enableLi('#liFLSingleRouter');
|
|
847
|
+
enableLi('#liSingleLT');
|
|
848
|
+
}
|
|
849
|
+
else {
|
|
850
|
+
disableLi('#liSingleUT');
|
|
851
|
+
disableLi('#liFLSingleRouter');
|
|
852
|
+
disableLi('#liSingleLT');
|
|
853
|
+
}
|
|
854
|
+
enableLi('#liMet');
|
|
855
|
+
enableLi('#liVC');
|
|
856
|
+
enableLi('#liEV');
|
|
857
|
+
disableLi('#liIns');
|
|
858
|
+
disableLi('#liAL');
|
|
859
|
+
disableLi('#liEPs');
|
|
860
|
+
disableLi('#liFLAll');
|
|
861
|
+
disableLi('#liFLSingleRouter');
|
|
862
|
+
disableLi('#liSingleLT');
|
|
863
|
+
disableLi('#liCL');
|
|
864
|
+
disableLi('#liLT');
|
|
865
|
+
/*
|
|
866
|
+
obj = new Identity();
|
|
867
|
+
for (let i = 0; i < rawEndpoints.length; i++) {
|
|
868
|
+
if (rawEndpoints[i].id === d.data.uuid) {
|
|
869
|
+
obj = rawEndpoints[i];
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
*/
|
|
873
|
+
this.contextmenuNodeType = 'identity';
|
|
874
|
+
}
|
|
875
|
+
else if (d && d.data && d.data.type === 'Edge Router') {
|
|
876
|
+
if (d.data.status === "PROVISIONED") {
|
|
877
|
+
enableLi('#liSingleUT');
|
|
878
|
+
enableLi('#liFLSingleRouter');
|
|
879
|
+
enableLi('#liSingleLT');
|
|
880
|
+
}
|
|
881
|
+
else {
|
|
882
|
+
disableLi('#liSingleUT');
|
|
883
|
+
disableLi('#liFLSingleRouter');
|
|
884
|
+
disableLi('#liSingleLT');
|
|
885
|
+
}
|
|
886
|
+
enableLi('#liMet');
|
|
887
|
+
enableLi('#liVC');
|
|
888
|
+
disableLi('#liIns');
|
|
889
|
+
disableLi('#liEV');
|
|
890
|
+
enableLi('#liAL');
|
|
891
|
+
disableLi('#liEPs');
|
|
892
|
+
disableLi('#liFLAll');
|
|
893
|
+
disableLi('#liCL');
|
|
894
|
+
disableLi('#liLT');
|
|
895
|
+
this.contextmenuNodeType = 'edge-router';
|
|
896
|
+
/*
|
|
897
|
+
obj = new EdgeRouterV2();
|
|
898
|
+
for (let i = 0; i < rawEdgerouters.length; i++) {
|
|
899
|
+
if (rawEdgerouters[i].id === d.data.uuid) {
|
|
900
|
+
obj = rawEdgerouters[i];
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
*/
|
|
904
|
+
}
|
|
905
|
+
else if (d && d.data && d.data.type === 'Service') {
|
|
906
|
+
enableLi('#liMet');
|
|
907
|
+
enableLi('#liVC');
|
|
908
|
+
disableLi('#liIns');
|
|
909
|
+
disableLi('#liEV');
|
|
910
|
+
disableLi('#liAL');
|
|
911
|
+
enableLi('#liEPs');
|
|
912
|
+
disableLi('#liFLAll');
|
|
913
|
+
disableLi('#liFLSingleRouter');
|
|
914
|
+
disableLi('#liSingleLT');
|
|
915
|
+
disableLi('#liCL');
|
|
916
|
+
disableLi('#liLT');
|
|
917
|
+
enableLi('#liSingleUT');
|
|
918
|
+
this.contextmenuNodeType = 'service';
|
|
919
|
+
/*
|
|
920
|
+
obj = new PlatformService();
|
|
921
|
+
for (let i = 0; i < this.services.length; i++) {
|
|
922
|
+
if (this.services[i].id === d.data.uuid) {
|
|
923
|
+
obj = this.services[i];
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
*/
|
|
927
|
+
}
|
|
928
|
+
else if (d && d.data && d.data.type === 'AppWAN') {
|
|
929
|
+
disableLi('#liMet');
|
|
930
|
+
enableLi('#liVC');
|
|
931
|
+
disableLi('#liIns');
|
|
932
|
+
disableLi('#liEV');
|
|
933
|
+
disableLi('#liAL');
|
|
934
|
+
disableLi('#liEPs');
|
|
935
|
+
disableLi('#liFLAll');
|
|
936
|
+
disableLi('#liFLSingleRouter');
|
|
937
|
+
disableLi('#liSingleLT');
|
|
938
|
+
disableLi('#liCL');
|
|
939
|
+
disableLi('#liLT');
|
|
940
|
+
disableLi('#liSingleUT');
|
|
941
|
+
/*
|
|
942
|
+
obj = new ServicePolicy();
|
|
943
|
+
for (let i = 0; i < rawAppwans.length; i++) {
|
|
944
|
+
if (rawAppwans[i].id === d.data.uuid) {
|
|
945
|
+
obj = rawAppwans[i];
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
*/
|
|
949
|
+
this.contextmenuNodeType = 'appwan';
|
|
950
|
+
}
|
|
951
|
+
else if (d && d.data && d.data.type === 'Router Policy') {
|
|
952
|
+
disableLi('#liMet');
|
|
953
|
+
disableLi('#liIns');
|
|
954
|
+
enableLi('#liVC');
|
|
955
|
+
disableLi('#liEV');
|
|
956
|
+
disableLi('#liAL');
|
|
957
|
+
disableLi('#liEPs');
|
|
958
|
+
disableLi('#liFLSingleRouter');
|
|
959
|
+
disableLi('#liSingleLT');
|
|
960
|
+
disableLi('#liFLAll');
|
|
961
|
+
disableLi('#liCL');
|
|
962
|
+
disableLi('#liLT');
|
|
963
|
+
disableLi('#liSingleUT');
|
|
964
|
+
this.contextmenuNodeType = 'router-policy';
|
|
965
|
+
/*
|
|
966
|
+
obj = new EdgeRouterPolicyV2();
|
|
967
|
+
for (let i = 0; i < edgeRouterPolicies.length; i++) {
|
|
968
|
+
if (edgeRouterPolicies[i].id === d.data.uuid) {
|
|
969
|
+
obj = edgeRouterPolicies[i];
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
*/
|
|
973
|
+
}
|
|
974
|
+
else if (d && d.data && d.data.type === 'Network') {
|
|
975
|
+
enableLi('#liMet');
|
|
976
|
+
disableLi('#liIns');
|
|
977
|
+
enableLi('#liVC');
|
|
978
|
+
disableLi('#liEV');
|
|
979
|
+
enableLi('#liAL');
|
|
980
|
+
disableLi('#liEPs');
|
|
981
|
+
enableLi('#liFLAll');
|
|
982
|
+
disableLi('#liFLSingleRouter');
|
|
983
|
+
disableLi('#liSingleLT');
|
|
984
|
+
enableLi('#liCL');
|
|
985
|
+
enableLi('#liLT');
|
|
986
|
+
disableLi('#liSingleUT');
|
|
987
|
+
this.contextmenuNodeType = 'network';
|
|
988
|
+
obj = nw;
|
|
989
|
+
}
|
|
990
|
+
else if (d && d.data && d.data.type === 'Service Router Policy') {
|
|
991
|
+
disableLi('#liMet');
|
|
992
|
+
disableLi('#liIns');
|
|
993
|
+
enableLi('#liVC');
|
|
994
|
+
disableLi('#liEV');
|
|
995
|
+
disableLi('#liAL');
|
|
996
|
+
disableLi('#liEPs');
|
|
997
|
+
disableLi('#liFLAll');
|
|
998
|
+
disableLi('#liFLSingleRouter');
|
|
999
|
+
disableLi('#liSingleLT');
|
|
1000
|
+
disableLi('#liCL');
|
|
1001
|
+
disableLi('#liLT');
|
|
1002
|
+
disableLi('#liSingleUT');
|
|
1003
|
+
this.contextmenuNodeType = 'service-router-policy';
|
|
1004
|
+
/*
|
|
1005
|
+
obj = new ServiceEdgeRouterPolicy();
|
|
1006
|
+
for (let i = 0; i < this.service_router_policies.length; i++) {
|
|
1007
|
+
if (this.service_router_policies[i].id === d.data.uuid) {
|
|
1008
|
+
obj = this.service_router_policies[i];
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
*/
|
|
1012
|
+
}
|
|
1013
|
+
this.contextmenuNode = obj;
|
|
1014
|
+
d3.select('#tooltip').style('display', 'none');
|
|
1015
|
+
});
|
|
1016
|
+
this.circles = this.nodeEnter
|
|
1017
|
+
.append('circle')
|
|
1018
|
+
.attr('class', 'node')
|
|
1019
|
+
.attr('r', 10)
|
|
1020
|
+
.style('fill', function (d) {
|
|
1021
|
+
return d._children ? 'var(--tableText)' : '#fff';
|
|
1022
|
+
})
|
|
1023
|
+
.on('mousemove', (event, source) => {
|
|
1024
|
+
this.drawTreeTooltip(event, source);
|
|
1025
|
+
})
|
|
1026
|
+
.on('mouseout', this.removeTreeTooltip)
|
|
1027
|
+
.on('contextmenu', (event) => {
|
|
1028
|
+
event.preventDefault();
|
|
1029
|
+
})
|
|
1030
|
+
.on('click', async (event, d) => {
|
|
1031
|
+
if (d && d.data && d.data.contextMenu === 'Yes') {
|
|
1032
|
+
d3.select('#topocontextmenu').style('display', 'none');
|
|
1033
|
+
}
|
|
1034
|
+
d3.select('#tooltip').style('display', 'none');
|
|
1035
|
+
if (d.children && d.children.length > 0) {
|
|
1036
|
+
const index = this.openNodes.indexOf(d.data.id, 0);
|
|
1037
|
+
if (index > -1) {
|
|
1038
|
+
this.openNodes.splice(index, 1);
|
|
1039
|
+
}
|
|
1040
|
+
d._children = d.children;
|
|
1041
|
+
d.children = null;
|
|
1042
|
+
}
|
|
1043
|
+
else {
|
|
1044
|
+
if (this.openNodes.indexOf(d.data.id) < 0) {
|
|
1045
|
+
this.openNodes.push(d.data.id);
|
|
1046
|
+
}
|
|
1047
|
+
if (d.data.clickProcess === 'Not Yet') {
|
|
1048
|
+
d._children = null;
|
|
1049
|
+
if (d.data &&
|
|
1050
|
+
d.data.rootNode &&
|
|
1051
|
+
d.data.rootNode === 'Yes' &&
|
|
1052
|
+
d.data.type === 'Identity' &&
|
|
1053
|
+
!d.children &&
|
|
1054
|
+
!d._children) {
|
|
1055
|
+
const arr = await this.treeNodeProcessor.processIdentitiesForNodeClick(d, this.networkGraph, this.identities, this.uniqId, this.zitiService, this.configs);
|
|
1056
|
+
this.uniqId = arr[1];
|
|
1057
|
+
this.networkGraph = arr[0];
|
|
1058
|
+
d.data.clickProcess = 'Completed';
|
|
1059
|
+
this.networkGraph.children.find((nd) => {
|
|
1060
|
+
collapseFew(nd, this.openNodes);
|
|
1061
|
+
});
|
|
1062
|
+
this.updateTree(d);
|
|
1063
|
+
}
|
|
1064
|
+
else if (d.data &&
|
|
1065
|
+
d.data.rootNode &&
|
|
1066
|
+
d.data.rootNode === 'Yes' &&
|
|
1067
|
+
d.data.type === 'Service' &&
|
|
1068
|
+
!d.children &&
|
|
1069
|
+
!d._children) {
|
|
1070
|
+
const arr = await this.treeNodeProcessor.processServicesForNodeClick(d, this.networkGraph, this.services, this.uniqId, this.zitiService);
|
|
1071
|
+
this.uniqId = arr[1];
|
|
1072
|
+
this.networkGraph = arr[0];
|
|
1073
|
+
d.data.clickProcess = 'Completed';
|
|
1074
|
+
this.networkGraph.children.find((nd) => {
|
|
1075
|
+
collapseFew(nd, this.openNodes);
|
|
1076
|
+
});
|
|
1077
|
+
this.updateTree(d);
|
|
1078
|
+
}
|
|
1079
|
+
else if (d.data &&
|
|
1080
|
+
d.data.rootNode &&
|
|
1081
|
+
d.data.rootNode === 'Yes' &&
|
|
1082
|
+
d.data.type === 'ServicePolicy' &&
|
|
1083
|
+
!d.children &&
|
|
1084
|
+
!d._children) {
|
|
1085
|
+
const arr = await this.treeNodeProcessor.processServicePoliciesForNodeClick(d, this.networkGraph, this.service_policies, this.uniqId, this.zitiService);
|
|
1086
|
+
this.uniqId = arr[1];
|
|
1087
|
+
this.networkGraph = arr[0];
|
|
1088
|
+
d.data.clickProcess = 'Completed';
|
|
1089
|
+
this.networkGraph.children.find((nd) => {
|
|
1090
|
+
collapseFew(nd, this.openNodes);
|
|
1091
|
+
});
|
|
1092
|
+
this.updateTree(d);
|
|
1093
|
+
}
|
|
1094
|
+
else if (d.data &&
|
|
1095
|
+
d.data.rootNode &&
|
|
1096
|
+
d.data.rootNode === 'Yes' &&
|
|
1097
|
+
d.data.type === 'Edge Router' &&
|
|
1098
|
+
!d.children &&
|
|
1099
|
+
!d._children) {
|
|
1100
|
+
const arr = await this.treeNodeProcessor.processEdgeroutersForNodeClick(d, this.networkGraph, this.edgerouters, this.uniqId, this.zitiService);
|
|
1101
|
+
this.uniqId = arr[1];
|
|
1102
|
+
this.networkGraph = arr[0];
|
|
1103
|
+
d.data.clickProcess = 'Completed';
|
|
1104
|
+
this.networkGraph.children.find((nd) => {
|
|
1105
|
+
collapseFew(nd, this.openNodes);
|
|
1106
|
+
});
|
|
1107
|
+
this.updateTree(d);
|
|
1108
|
+
}
|
|
1109
|
+
else if (d.data &&
|
|
1110
|
+
d.data.rootNode &&
|
|
1111
|
+
d.data.rootNode === 'Yes' &&
|
|
1112
|
+
d.data.type === 'Router Policy' &&
|
|
1113
|
+
!d.children &&
|
|
1114
|
+
!d._children) {
|
|
1115
|
+
const arr = await this.treeNodeProcessor.processEdgeRouterPoliciesForNodeClick(d, this.networkGraph, this.router_policies, this.uniqId, this.zitiService);
|
|
1116
|
+
this.uniqId = arr[1];
|
|
1117
|
+
this.networkGraph = arr[0];
|
|
1118
|
+
d.data.clickProcess = 'Completed';
|
|
1119
|
+
this.networkGraph.children.find((nd) => {
|
|
1120
|
+
collapseFew(nd, this.openNodes);
|
|
1121
|
+
});
|
|
1122
|
+
this.updateTree(d);
|
|
1123
|
+
}
|
|
1124
|
+
else if (d.data &&
|
|
1125
|
+
d.data.rootNode &&
|
|
1126
|
+
d.data.rootNode === 'Yes' &&
|
|
1127
|
+
d.data.type === 'Service Router Policy' &&
|
|
1128
|
+
!d.children &&
|
|
1129
|
+
!d._children) {
|
|
1130
|
+
const arr = await this.treeNodeProcessor.processServiceEdgeRouterPoliciesForNodeClick(d, this.networkGraph, this.service_router_policies, this.uniqId, this.zitiService);
|
|
1131
|
+
this.uniqId = arr[1];
|
|
1132
|
+
this.networkGraph = arr[0];
|
|
1133
|
+
d.data.clickProcess = 'Completed';
|
|
1134
|
+
this.networkGraph.children.find((nd) => {
|
|
1135
|
+
collapseFew(nd, this.openNodes);
|
|
1136
|
+
});
|
|
1137
|
+
this.updateTree(d);
|
|
1138
|
+
}
|
|
1139
|
+
else {
|
|
1140
|
+
d.children = d._children;
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
else {
|
|
1144
|
+
d.children = d._children;
|
|
1145
|
+
}
|
|
1146
|
+
if (d._children) {
|
|
1147
|
+
d._children = null;
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
if (d.children || d._children) {
|
|
1151
|
+
this.updateTree(d);
|
|
1152
|
+
}
|
|
1153
|
+
const rootNode = _.get(d, 'data.children[0].rootNode', '');
|
|
1154
|
+
const subrootNode = _.get(d, 'data.rootNode', '');
|
|
1155
|
+
if (rootNode === 'Yes' || subrootNode === 'Yes') {
|
|
1156
|
+
rootNodeisYesColorChange();
|
|
1157
|
+
}
|
|
1158
|
+
});
|
|
1159
|
+
this.nodeEnter
|
|
1160
|
+
.append('foreignObject')
|
|
1161
|
+
.attr('height', '50')
|
|
1162
|
+
.attr('width', '330')
|
|
1163
|
+
.attr('x', '10')
|
|
1164
|
+
.attr('y', '-25')
|
|
1165
|
+
.append('xhtml:body')
|
|
1166
|
+
.style('background', 'transparent')
|
|
1167
|
+
.html(function (d) {
|
|
1168
|
+
return `<div class="text-container"<span>${d.data.name}</span>`;
|
|
1169
|
+
});
|
|
1170
|
+
this.nodeUpdate = this.nodeEnter.merge(this.node);
|
|
1171
|
+
this.nodeUpdate
|
|
1172
|
+
.transition()
|
|
1173
|
+
.duration(duration)
|
|
1174
|
+
.attr('transform', function (d) {
|
|
1175
|
+
return 'translate(' + d.y + ',' + d.x + ')';
|
|
1176
|
+
});
|
|
1177
|
+
this.nodeUpdate.select('circle.node').attr('r', 18).attr('cursor', 'pointer');
|
|
1178
|
+
this.nodeExit = this.node
|
|
1179
|
+
.exit()
|
|
1180
|
+
.transition()
|
|
1181
|
+
.duration(duration)
|
|
1182
|
+
.attr('transform', function (d) {
|
|
1183
|
+
if (source && source.x) {
|
|
1184
|
+
return 'translate(' + source.y + ',' + source.x + ')';
|
|
1185
|
+
}
|
|
1186
|
+
else {
|
|
1187
|
+
return 'translate(' + d.y + ',' + d.x + ')';
|
|
1188
|
+
}
|
|
1189
|
+
})
|
|
1190
|
+
.remove();
|
|
1191
|
+
this.nodeExit.select('circle').attr('r', 0);
|
|
1192
|
+
this.nodeExit.select('text').style('fill-opacity', 10);
|
|
1193
|
+
this.link = this.svg.selectAll('path.link').data(this.links, function (d) {
|
|
1194
|
+
return d.data.id;
|
|
1195
|
+
});
|
|
1196
|
+
this.linkUpdate = this.link
|
|
1197
|
+
.enter()
|
|
1198
|
+
.insert('path', 'g')
|
|
1199
|
+
.attr('class', 'link')
|
|
1200
|
+
.attr('d', function (d) {
|
|
1201
|
+
let o;
|
|
1202
|
+
if (source && source.x) {
|
|
1203
|
+
o = { x: source.x, y: source.y };
|
|
1204
|
+
}
|
|
1205
|
+
else {
|
|
1206
|
+
o = { x: d.x, y: d.y };
|
|
1207
|
+
}
|
|
1208
|
+
return diagonal(o, o, '1');
|
|
1209
|
+
})
|
|
1210
|
+
.merge(this.link);
|
|
1211
|
+
this.linkUpdate
|
|
1212
|
+
.transition()
|
|
1213
|
+
.duration(duration)
|
|
1214
|
+
.attr('d', function (d) {
|
|
1215
|
+
return diagonal(d, d.parent, '2');
|
|
1216
|
+
});
|
|
1217
|
+
this.linkExit = this.link
|
|
1218
|
+
.exit()
|
|
1219
|
+
.transition()
|
|
1220
|
+
.duration(duration)
|
|
1221
|
+
.attr('d', function (d) {
|
|
1222
|
+
let o;
|
|
1223
|
+
if (source && source.x) {
|
|
1224
|
+
o = { x: source.x, y: source.y };
|
|
1225
|
+
}
|
|
1226
|
+
else {
|
|
1227
|
+
o = { x: d.x, y: d.y };
|
|
1228
|
+
}
|
|
1229
|
+
return diagonal(o, o, '3');
|
|
1230
|
+
})
|
|
1231
|
+
.remove();
|
|
1232
|
+
this.nodes.forEach(function (d) {
|
|
1233
|
+
d.x0 = d.x;
|
|
1234
|
+
d.y0 = d.y;
|
|
1235
|
+
});
|
|
1236
|
+
function disableLi(liId) {
|
|
1237
|
+
d3.select(liId).style('display', 'none');
|
|
1238
|
+
}
|
|
1239
|
+
function enableLi(liId) {
|
|
1240
|
+
d3.select(liId).style('display', 'block');
|
|
1241
|
+
}
|
|
1242
|
+
function diagonal(s, d, lg) {
|
|
1243
|
+
const path = `M ${s.y} ${s.x}
|
|
1244
|
+
C ${(s.y + d.y) / 2} ${s.x},
|
|
1245
|
+
${(s.y + d.y) / 2} ${d.x},
|
|
1246
|
+
${d.y} ${d.x}`;
|
|
1247
|
+
return path;
|
|
1248
|
+
}
|
|
1249
|
+
function rootNodeisYesColorChange() {
|
|
1250
|
+
d3.selectAll('circle').each(function (d) {
|
|
1251
|
+
const rootNode = _.get(d, 'data.rootNode', '');
|
|
1252
|
+
const clickProcess = _.get(d, 'data.clickProcess', '');
|
|
1253
|
+
if (rootNode === 'Yes' && clickProcess === 'Not Yet') {
|
|
1254
|
+
d3.select(this).style('fill', 'brown');
|
|
1255
|
+
}
|
|
1256
|
+
else if (rootNode === 'Yes' && clickProcess !== 'Not Yet') {
|
|
1257
|
+
const color = d._children ? 'var(--tableText)' : '#fff';
|
|
1258
|
+
d3.select(this).style('fill', color);
|
|
1259
|
+
}
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
function collapseDepth(d, id) {
|
|
1263
|
+
// unused
|
|
1264
|
+
if (d.children) {
|
|
1265
|
+
if (d.data.id !== id) {
|
|
1266
|
+
d._children = d.children;
|
|
1267
|
+
d._children.forEach(collapseDepth);
|
|
1268
|
+
d.children = null;
|
|
1269
|
+
}
|
|
1270
|
+
else {
|
|
1271
|
+
d.children.forEach(collapseDepth);
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
function collapseFew(_nd, openNodes) {
|
|
1276
|
+
if (_nd.data.id === '#all') {
|
|
1277
|
+
return;
|
|
1278
|
+
}
|
|
1279
|
+
if (_nd.data.rootNode === 'Yes' && _nd.data.clickProcess === 'Not Yet') {
|
|
1280
|
+
_nd._children = [];
|
|
1281
|
+
}
|
|
1282
|
+
if (_nd.children && openNodes.indexOf(_nd.data.id) < 0) {
|
|
1283
|
+
_nd._children = _nd.children;
|
|
1284
|
+
if (_nd._children)
|
|
1285
|
+
_nd._children.find((_nd) => {
|
|
1286
|
+
collapseFew(_nd, openNodes);
|
|
1287
|
+
});
|
|
1288
|
+
_nd.children = null;
|
|
1289
|
+
}
|
|
1290
|
+
if (_nd.children && openNodes.indexOf(_nd.data.id) >= 0) {
|
|
1291
|
+
if (_nd.children)
|
|
1292
|
+
_nd.children.find((_nd) => {
|
|
1293
|
+
collapseFew(_nd, openNodes);
|
|
1294
|
+
});
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
if (source.children === null) {
|
|
1298
|
+
_.delay(this.sizeToFit.bind(this), 650);
|
|
1299
|
+
}
|
|
1300
|
+
} // end of updateTree
|
|
1301
|
+
sizeToFit() {
|
|
1302
|
+
const boundingBox = this.svg._groups[0][0].getBoundingClientRect();
|
|
1303
|
+
const bottomDelta = boundingBox.height - 100 - -boundingBox.top;
|
|
1304
|
+
const topDelta = boundingBox.height + 500 - boundingBox.bottom;
|
|
1305
|
+
const topOutOfView = topDelta < 0;
|
|
1306
|
+
const bottomOutOfView = bottomDelta < 0;
|
|
1307
|
+
if (bottomOutOfView || topOutOfView) {
|
|
1308
|
+
const trans = this.transform;
|
|
1309
|
+
trans.y = topOutOfView ? 400 : 0;
|
|
1310
|
+
this.svg.transition().duration(750).attr('transform', trans);
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
removeGraphTooltip() {
|
|
1314
|
+
if (this.graphtooltip) {
|
|
1315
|
+
this.graphtooltip.style('display', 'none');
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
drawGraphTooltip(event, d) {
|
|
1319
|
+
document.getElementById('tooltip').innerHTML = this.readGraphKeyValues(d);
|
|
1320
|
+
this.graphtooltip.style('display', 'block');
|
|
1321
|
+
const x = event.pageX - 400 + 'px';
|
|
1322
|
+
const y = event.pageY + 10 + 'px';
|
|
1323
|
+
this.graphtooltip.style('left', x);
|
|
1324
|
+
this.graphtooltip.style('top', y);
|
|
1325
|
+
}
|
|
1326
|
+
readGraphKeyValues(d) {
|
|
1327
|
+
let info = '<span style="font-size:14px;font-family:Open Sans; font-weight: 600; font-color: var(--tableText);">';
|
|
1328
|
+
const keys = Object.keys(d.data);
|
|
1329
|
+
keys.forEach((k) => {
|
|
1330
|
+
if (k === 'value' ||
|
|
1331
|
+
k === 'group' ||
|
|
1332
|
+
k === 'index' ||
|
|
1333
|
+
k === 'parent' ||
|
|
1334
|
+
k === 'depth' ||
|
|
1335
|
+
k === 'x' ||
|
|
1336
|
+
k === 'y' ||
|
|
1337
|
+
k === 'id' ||
|
|
1338
|
+
k === 'x0' ||
|
|
1339
|
+
k === 'y0' ||
|
|
1340
|
+
k === 'vy' ||
|
|
1341
|
+
k === 'vx') {
|
|
1342
|
+
// continue;
|
|
1343
|
+
}
|
|
1344
|
+
else if (k === 'children') {
|
|
1345
|
+
const kVal = d.data[k];
|
|
1346
|
+
info = info + ' ' + k + ' : ' + kVal.length + '<br>';
|
|
1347
|
+
}
|
|
1348
|
+
else {
|
|
1349
|
+
if (this.isAnObject(d.data[k])) {
|
|
1350
|
+
const kVal = d.data[k];
|
|
1351
|
+
info = info + ' ' + k + ' : ' + kVal.name + '<br>';
|
|
1352
|
+
}
|
|
1353
|
+
else {
|
|
1354
|
+
const vo = d.data[k];
|
|
1355
|
+
info = info + ' ' + k + ' : ' + (vo !== null || vo !== '' ? d.data[k] : 'N/A') + '<br>';
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
});
|
|
1359
|
+
return info + '</span>';
|
|
1360
|
+
}
|
|
1361
|
+
setColor(d) {
|
|
1362
|
+
if (d.status === 'Error' && d.group === 3) {
|
|
1363
|
+
return 'red';
|
|
1364
|
+
}
|
|
1365
|
+
else if (d.status !== 'Error' && d.group === 3) {
|
|
1366
|
+
return 'var(--tableText)';
|
|
1367
|
+
}
|
|
1368
|
+
else {
|
|
1369
|
+
return 'var(--tableText)';
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
ticked() {
|
|
1373
|
+
this.links
|
|
1374
|
+
.attr('x1', function (d) {
|
|
1375
|
+
return d.source.x;
|
|
1376
|
+
})
|
|
1377
|
+
.attr('y1', function (d) {
|
|
1378
|
+
return d.source.y;
|
|
1379
|
+
})
|
|
1380
|
+
.attr('x2', function (d) {
|
|
1381
|
+
return d.target.x;
|
|
1382
|
+
})
|
|
1383
|
+
.attr('y2', function (d) {
|
|
1384
|
+
return d.target.y;
|
|
1385
|
+
});
|
|
1386
|
+
this.nodes.attr('transform', function (d) {
|
|
1387
|
+
return 'translate(' + d.x + ',' + d.y + ')';
|
|
1388
|
+
});
|
|
1389
|
+
}
|
|
1390
|
+
isAnObject(o) {
|
|
1391
|
+
return o instanceof Object && o.constructor === Object;
|
|
1392
|
+
}
|
|
1393
|
+
readObjectValues(linkObject) {
|
|
1394
|
+
let info = '<span style="font-size:12px;font-family: sans-serif">';
|
|
1395
|
+
const keys = Object.keys(linkObject.data);
|
|
1396
|
+
keys.forEach((k) => {
|
|
1397
|
+
if (this.isAnObject(linkObject.data[k])) {
|
|
1398
|
+
const kVal = linkObject.data[k];
|
|
1399
|
+
info = info + ' ' + k + ' : ' + kVal.id + '<br>';
|
|
1400
|
+
}
|
|
1401
|
+
else {
|
|
1402
|
+
info = info + ' ' + k + ' : ' + linkObject.data[k] + '<br>';
|
|
1403
|
+
}
|
|
1404
|
+
});
|
|
1405
|
+
return info + '</span>';
|
|
1406
|
+
}
|
|
1407
|
+
nodeColor(d) {
|
|
1408
|
+
if (d.status === 'Error') {
|
|
1409
|
+
return '#FF0000';
|
|
1410
|
+
}
|
|
1411
|
+
else {
|
|
1412
|
+
return 'blue';
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
nodeshape(d) {
|
|
1416
|
+
if (d.group === '3') {
|
|
1417
|
+
return 'rect';
|
|
1418
|
+
}
|
|
1419
|
+
else {
|
|
1420
|
+
return 'circle';
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
linkWidth(d) {
|
|
1424
|
+
if (d.group === 1) {
|
|
1425
|
+
return 10;
|
|
1426
|
+
}
|
|
1427
|
+
else {
|
|
1428
|
+
return 2;
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
dragstarted(event, d) {
|
|
1432
|
+
if (!event.active) {
|
|
1433
|
+
this.simulation.alphaTarget(0.3).restart();
|
|
1434
|
+
}
|
|
1435
|
+
d.fx = d.x;
|
|
1436
|
+
d.fy = d.y;
|
|
1437
|
+
}
|
|
1438
|
+
dragged(d) {
|
|
1439
|
+
d.fx = d.x;
|
|
1440
|
+
d.fy = d.y;
|
|
1441
|
+
}
|
|
1442
|
+
dragended(event, d) {
|
|
1443
|
+
if (!event.active) {
|
|
1444
|
+
this.simulation.alphaTarget(0);
|
|
1445
|
+
}
|
|
1446
|
+
d.fx = null;
|
|
1447
|
+
d.fy = null;
|
|
1448
|
+
}
|
|
1449
|
+
removeTreeTooltip() {
|
|
1450
|
+
this.treetooltip = d3.select('#tooltip');
|
|
1451
|
+
if (this.treetooltip) {
|
|
1452
|
+
this.treetooltip.style('display', 'none');
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
drawTreeTooltip(event, s) {
|
|
1456
|
+
this.treetooltip = d3.select('#tooltip');
|
|
1457
|
+
this.treetooltip.style('display', 'block');
|
|
1458
|
+
const x = event.pageX + 'px';
|
|
1459
|
+
const y = event.pageY + 15 + 'px';
|
|
1460
|
+
this.treetooltip.style('left', x);
|
|
1461
|
+
this.treetooltip.style('top', y);
|
|
1462
|
+
document.getElementById('tooltip').innerHTML = this.readTreeKeyValues(event, s);
|
|
1463
|
+
}
|
|
1464
|
+
readTreeKeyValues(event, d) {
|
|
1465
|
+
let info = '<span>';
|
|
1466
|
+
const keys = Object.keys(d.data); // mp.keys();
|
|
1467
|
+
keys.forEach(function (k) {
|
|
1468
|
+
if (k === 'protocol' ||
|
|
1469
|
+
k === 'contextMenu' ||
|
|
1470
|
+
k === 'uuid' ||
|
|
1471
|
+
k === 'lastId' ||
|
|
1472
|
+
k === 'clickProcess' ||
|
|
1473
|
+
k === 'rootNode' ||
|
|
1474
|
+
k === 'id' ||
|
|
1475
|
+
k === 'children' ||
|
|
1476
|
+
k === 'parent' ||
|
|
1477
|
+
k === 'depth' ||
|
|
1478
|
+
k === 'x' ||
|
|
1479
|
+
k === 'y' ||
|
|
1480
|
+
k === 'rootNode' ||
|
|
1481
|
+
k === 'x0' ||
|
|
1482
|
+
k === 'y0') {
|
|
1483
|
+
// continue;
|
|
1484
|
+
}
|
|
1485
|
+
else {
|
|
1486
|
+
info = info + ' ' + k + ' : ' + d.data[k] + '<br>';
|
|
1487
|
+
}
|
|
1488
|
+
});
|
|
1489
|
+
return info + '</span>';
|
|
1490
|
+
}
|
|
1491
|
+
hide() { }
|
|
1492
|
+
toggleModalSize() { }
|
|
1493
|
+
;
|
|
1494
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerComponent, deps: [{ token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i1.HttpClient }, { token: i2.LoggerService }, { token: i3.TreeNodeProcessor }, { token: i4.NetworkVisualizerHelper }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1495
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NetworkVisualizerComponent, selector: "app-network-visualizer", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container ziti-identities-container\">\n\n <div class=\"nf-network-topology-container\" >\n\n <div class=\"css-header\">{{title}} </div><br>\n\n <div class=\"nf-net-vis-controls-header\">\n <div class=\"nf-topology-zoom-container\">\n <!--button (click)=\"zoomOut()\" class=\"nf-topology-zoom-button minus\"></button>\n <button (click)=\"zoomIn()\" class=\"nf-topology-zoom-button plus\"></button-->\n <div (click)=\"resetTree('Yes')\" class=\"reset-button\" title=\"Reset\"></div>\n </div>\n <select\n (change)=\"resourceTypeChanged()\"\n [(ngModel)]=\"resourceType\"\n [ngClass]=\"{ 'resource-type-error': resourceTypeError }\"\n class=\"resource-type-select\"\n id=\"ResourceTypeSelect\"\n >\n <option value=\"\">Select Resource Type</option>\n <option value=\"service-policies\">Service Policies</option>\n <option value=\"services\">Services</option>\n <option value=\"identities\">Identities</option>\n <option value=\"edge-routers\">Edge Routers</option>\n <option value=\"edge-router-policies\">Edge Router Policies</option>\n <option value=\"service-edge-router-policies\">Service Edge Router Policies</option>\n </select>\n <div class=\"nf-net-vis-filter-container listBox row\">\n <input\n (keyup)=\"filterSearchArray()\"\n [(ngModel)]=\"filterText\"\n [matAutocomplete]=\"auto\"\n class=\"nf-topology-filter-input\"\n id=\"filterText\"\n matInput\n placeholder=\"Type to Filter\"\n />\n\n <div\n (click)=\"clearSearchFilter()\"\n *ngIf=\"filterText !== ''\"\n class=\"buttonBall close\"\n id=\"ClearSearchFilter\"\n ></div>\n <div [hidden]=\"!noSearchResults\" class=\"no-results-warning\">No Results Found</div>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"autocompleteSearch($event)\">\n <mat-option *ngFor=\"let option of autocompleteOptions\" [value]=\"option\">\n {{ option }}\n </mat-option>\n </mat-autocomplete>\n </div>\n </div>\n\n <div class=\"nf-topology-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-circle servicepolicies\"></div>\n <div class=\"legend-text\">Service Policies</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle services\"></div>\n <div class=\"legend-text\">Services</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle endpoints\"></div>\n <div class=\"legend-text\">Identities</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle edgerouters\"></div>\n <div class=\"legend-text\">Edge Routers</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle erpolicies\"></div>\n <div class=\"legend-text\">Edge Router Policies</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle serviceerpolicies\"></div>\n <div class=\"legend-text\">Service Router Policies</div>\n </div>\n </div>\n\n <div class=\"topotip\" id=\"tooltip\"></div>\n <svg style='pointer-events:all' id=\"NetworkVisualizerSVG\"></svg>\n <lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n </div>\n\n</div>\n", styles: [".ziti-page-container{height:100%;width:100%;left:0;display:flex;flex-direction:column;position:absolute;padding-top:1px;padding-left:3px;padding-right:3px;top:0}.nf-network-topology-container{overflow:hidden;width:100%;height:100%;background-color:var(--background);z-index:1001;margin:auto;inset:0;padding-top:1px;padding-left:3px;padding-right:3px;background:#f5e9f2;background-image:linear-gradient(#ecd3e6 2px,transparent 0),linear-gradient(90deg,#ecd3e6 2px,transparent 0),linear-gradient(#ecd3e6 1px,transparent 0),linear-gradient(90deg,#ecd3e6 1px,transparent 0);background-size:40px 40px,40px 40px,10px 10px,10px 10px}.css-header{height:50px;font-size:25px;font-weight:600;margin:8px 0 0 2px;font-family:Russo One;color:#0027ab;font-size:30px;text-transform:uppercase;font-weight:400;background-color:transparent}.resource-type-select{width:230px;flex-shrink:0;border-radius:27px;height:51px;margin-top:20px;margin-left:20px;-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px);background-color:#ffffff80!important;border-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);color:var(--tableText);padding-left:20px}select{background-image:url(/assets/svgs/ArrowDown.svg);background-position:center right 18px;background-repeat:no-repeat;background-size:18px;padding-right:38px}.no-results-warning{bottom:-20px;left:20px;font-size:15px;color:var(--tableText);padding-left:20px;padding-top:5px}.resource-type-error{border-width:3px;border-color:var(--red)!important}.nf-links{stroke:#fff;stroke-opacity:1.6}.nf-net-vis-controls-header{display:flex;flex-direction:row;position:absolute;z-index:99999;flex:1 0 auto;top:50px}.nf-net-vis-filter-container{max-width:300px;margin-top:20px;margin-left:10px;flex:1 0 auto}.table-filter-container{max-width:300px;margin-top:0;margin-left:1px;flex:1 0 auto}#ClearSearchFilter{position:absolute;right:2px;top:2px;width:20px;height:20px;font-size:25px;color:var(--tableText);z-index:99999999}#popupTableTitle{width:100%;font-weight:900;display:inline-block;background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);border:2px #d3d3d3!important;text-align:center;border:2px;border-color:#d3d3d3;height:25px;top:2px;color:#fff;padding-right:5px;background:#000;cursor:move}#tra:hover{text-decoration:underline}#CloseDataTable{position:absolute;right:5px;top:-33px;width:25px;height:25px;font-size:15px;color:#fff;z-index:99999999}.copydatatable{width:135px;height:17px;font-size:10pt;font-family:tahoma;top:95%;right:0%;border-radius:5px;background:#fff;border:0px solid gray!important;position:absolute!important;text-transform:uppercase;cursor:pointer;z-index:999}.copydatatable:hover{text-decoration:underline}.nf-topology-filter-input{height:50px;border-radius:25px;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding-left:20px;padding-right:35px}.nf-topology-select-container{max-width:400px;margin-top:20px;margin-left:20px;flex:1 0 auto}.nf-topology-select-input{height:45px;border-radius:25px;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding-left:20px}input:focus,textarea:focus,select:focus{box-shadow:0 20px 23px 0 var(--shadow)}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.nf-topology-filter-input{background:var(--glass)!important;-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.nf-topology-zoom-container{display:flex;margin-left:20px;margin-top:20px;flex:1 0 auto}.nf-topology-zoom-button.minus{height:50px;width:50px;margin-right:10px;border-radius:55px;border:unset;font-size:40px;font-family:icomoon!important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--primaryColor);line-height:49px;background-color:var(--navigation);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .5s;background-image:url(/assets/images/Icon_Minus.png);background-size:40%;background-color:var(--red);box-shadow:0 6px 10px 0 var(--redShadow)}.nf-topology-zoom-label{padding-right:10px}.nf-topology-zoom-button{height:50px;width:50px;margin-right:10px;border-radius:55px;border:unset;font-size:40px;font-family:icomoon!important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--primaryColor);line-height:49px;background-color:var(--navigation);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .5s}.nf-topology-zoom-button.plus:before{content:\"\\e937\"}.nf-topology-zoom-button.minus:before{content:\"\\e943\"}.nf-topology-zoom-button:hover{color:var(--white);background-color:var(--primaryColor);filter:brightness(90%);transition:background-color 1s;transition:.3s}.nf-topology-zoom-button:active{background-color:var(--icon);transform:scale(.97);transition:background-color 1s;transition:.3s}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.nf-topology-zoom-button{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.placeholder{display:flex;align-items:center;justify-content:center;height:800px}.topotip{display:none;position:fixed;background:var(--navigation);border:0px;border-radius:12px;pointer-events:none;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .3s;padding:10px;font-size:17px;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:400px}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.topotip{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.nodes{cursor:pointer;box-shadow:0 30px 43px 0 var(--shadow)}.nf-links{cursor:pointer}.linkWidth{color:#fff}.nf-network-topology-container .loader{margin-left:-150px}.loader .bar1{background-color:var(--inputBorder)!important}.loader .bar2{background-color:var(--inputBorder)!important;animation-delay:-.7s}.loader .bar3{background-color:var(--inputBorder)!important;animation-delay:-.6s}.loader .bar4{background-color:var(--inputBorder)!important;animation-delay:-.5s}.loader .bar5{background-color:var(--inputBorder)!important;animation-delay:-.4s}.loader .bar6{background-color:var(--inputBorder)!important;animation-delay:-.3s}.changeView{display:flex;margin-top:32px;margin-left:10px;flex:1 0 auto}.changeView .changeViewLabel{margin-top:3px;margin-left:5px}.node circle{fill:#fff;stroke:#07397d;stroke-width:14px;box-shadow:0 20px 23px 0 var(--shadow)}.node text{font:27px sans-serif;cursor:pointer}.text-container{cursor:pointer}.link{fill:none;stroke:var(--table);stroke-width:5px;color:#fff}.nf-topology-legend{width:210px;border-radius:12px;margin-top:10px;margin-right:20px;position:fixed;top:0;right:0;background:var(--navigation);display:inline-block;box-shadow:0 20px 23px 0 var(--shadow);padding:5px 12px 7px}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.nf-topology-legend{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.legend-item{width:100%;height:100%;display:inline-block}.legend-circle{height:12px;width:12px;border-radius:15px;display:inline-block;margin-top:7px}.legend-circle.servicepolicies{background-color:#ff0d49}.legend-circle.services{background-color:#08dc5a}.legend-circle.endpoints{background-color:#0273fb}.legend-circle.edgerouters{background-color:#ffc000}.legend-circle.erpolicies{background-color:#ff8400}.legend-circle.serviceerpolicies{background-color:#ff5900}.legend-text{display:inline-block;font-size:15px;font-weight:600;color:var(--tableText);padding-left:7px;padding-bottom:4px}.reset-button{height:50px;width:50px;border-radius:50px;margin-right:10px;background-size:contain;background-image:url(/assets/svgs/refresh.svg);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:.3s}.reset-button:hover{filter:brightness(90%);transform:scale(.97);transition:.3s}.reset-button:active{transform:scale(.9);transition:.3s}.sign_out_button{background-color:#2fa4e7;padding:16px 10px;color:#fff;float:left;text-decoration:none}.sign_out_button:hover{background-color:#1892d7}.sign_out_button a{color:#fff;text-decoration:none}.contextmenu_mouseout{fill:#f4f4f4;stroke:#fff;stroke-width:1px}.contextmenu_mouseover{fill:#c8c8c8}.menu2{position:fixed;background:#fff;color:#000;cursor:pointer;border:1px black solid}.contextmenu_text{position:fixed;background:var(--navigation);border:1px;border-radius:5px;pointer-events:none;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .3s;padding:5px;font-size:10px;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:400px}.contextmenu{z-index:2000;opacity:1;position:fixed;background:#fff;color:#000;font-family:sans-serif;font-size:11px;box-shadow:2px 2px 2px #90908d;padding:2px;border-radius:12px;border:1px solid #c6c6c6;max-width:400px}.menuItems{display:block;color:#555;text-decoration:none;padding:6px 8px 6px 30px;position:relative}.context-menu{display:none;position:absolute;z-index:10}.context-menu__items{list-style:none;margin:0;padding:0}.context-menu__item{display:block;margin-bottom:4px}.container{margin:0 auto;padding:0 24px;max-width:960px}.context-menu__link{display:block;padding:4px 12px;color:#06a;text-decoration:none}.contextmenu_text:hover .divItemsHover{color:#fff;background-color:#06a}.context-menu--active{display:block}#topoDataTableHeader{float:left;min-width:250px;width:auto;height:360px;top:100px;border-bottom-left-radius:13px;border-bottom-right-radius:13px;display:none;background:#fff;border:2px solid gray!important;position:absolute!important}.table-filter-input{height:30px;width:100%;top:40px;border-radius:1px;border-color:#d3d3d3;background-color:#d3d3d3;box-shadow:0 20px 23px 0 var(--shadow);padding-top:3px;padding-left:2px;padding-right:2px}#topoDataTable{float:down;min-width:250px;width:auto;height:300px;top:55px;border-radius:10px;position:absolute!important;overflow:auto;background:#fff;font-family:sans-serif;font-size:16px;color:#06a;overflow-x:scroll}table{width:auto;height:auto;max-height:300px}tr{width:auto;padding:5px}th{width:auto;font-family:sans-serif;font-size:16px;color:#06a;font-weight:700;background-color:#06a}td{width:auto}th{width:auto;font-weight:700;padding:2px;border:1px solid #ccc;text-align:center}.context-menu{border-radius:12px;background:var(--navigation);width:200px;box-shadow:0 20px 23px 0 var(--shadow);position:relative;display:none}.context-menu .menu-options{list-style:none;padding:0}.context-menu .menu-options .menu-option{font-weight:700;font-size:16px;line-height:36px;color:var(--tableText);padding:1px 4px 1px 20px;cursor:pointer}.context-menu .menu-options .menu-option:hover{background:var(--primaryColor);color:var(--navigation)}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.context-menu{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.spinner{position:absolute;right:1em;top:1em;display:inline-block;width:32px;height:32px;border-radius:50%;background:transparent;border-top:5px solid var(--placeholder);border-right:5px solid var(--placeholder);border-bottom:5px solid transparent;border-left:5px solid transparent;animation:loading .5s infinite linear}.disabled{-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;pointer-events:none;cursor:pointer;opacity:.6}path:not(.loader path,.highcharts-root path){fill:none;stroke:var(--navigation);stroke-width:5px;color:#fff}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rotating{animation:rotating 2s linear infinite}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__outer-circle{background-color:var(--icon);border-width:4px}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__inner-circle{border-color:var(--icon)}.mdc-radio__native-control:disabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-width:4px}#mat-radio-2>div>div>div.mdc-radio__background>div.mdc-radio__inner-circle .node.edge-router circle{stroke:#ffc000!important;stroke-width:12px}.node.endpoint circle{stroke:#0273fb!important;stroke-width:12px}.node.service circle{stroke:#08dc5a!important;stroke-width:12px}.node.service-policy circle{stroke:#ff0d49!important;stroke-width:12px}.node.edge-router-policy circle{stroke:#ff8400!important;stroke-width:12px}.node.service-edge-router-policy circle{stroke:#ff5900!important;stroke-width:12px}.text-container{color:var(--tableText);font-size:24px;font-weight:700;margin-left:20px;margin-top:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}svg>g>g.node:first-of-type.terminate{cursor:pointer}svg>g>g.node:first-of-type.terminate .text-container{cursor:pointer}svg>g>g.node:first-of-type.terminate circle{cursor:pointer}svg>g>g.node:first-of-type.terminate:hover>rect{fill:url(#NodeHoverGradient)}.node>rect{fill:url(#NodeGradient)}.node.terminate{cursor:default;stroke-width:14px}.node.terminate .text-container{cursor:default}.node.terminate circle{cursor:default;stroke-width:14px}.node.terminate:hover>rect{fill:url(#NodeGradient)}.node:hover>rect{fill:url(#NodeHoverGradient)}p-chips.error .p-chips.p-component .p-chips-multiple-container{border-color:var(--red);border-width:2px}.checkboxes.error .mat-checkbox-frame{border-color:var(--red)}.checkboxes.error .mat-checkbox-label{color:var(--red)}.stop1{stop-color:var(--table);stop-opacity:.9}.stop2{stop-color:var(--table);stop-opacity:.65}.stop3{stop-color:var(--table);stop-opacity:0}.stop1a{stop-color:var(--background);stop-opacity:1}.stop2a{stop-color:var(--background);stop-opacity:.7}.stop3a{stop-color:var(--background);stop-opacity:0}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i9.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
1496
|
+
}
|
|
1497
|
+
export { NetworkVisualizerComponent };
|
|
1498
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerComponent, decorators: [{
|
|
1499
|
+
type: Component,
|
|
1500
|
+
args: [{ selector: 'app-network-visualizer', encapsulation: ViewEncapsulation.None, template: "<div class=\"ziti-page-container ziti-identities-container\">\n\n <div class=\"nf-network-topology-container\" >\n\n <div class=\"css-header\">{{title}} </div><br>\n\n <div class=\"nf-net-vis-controls-header\">\n <div class=\"nf-topology-zoom-container\">\n <!--button (click)=\"zoomOut()\" class=\"nf-topology-zoom-button minus\"></button>\n <button (click)=\"zoomIn()\" class=\"nf-topology-zoom-button plus\"></button-->\n <div (click)=\"resetTree('Yes')\" class=\"reset-button\" title=\"Reset\"></div>\n </div>\n <select\n (change)=\"resourceTypeChanged()\"\n [(ngModel)]=\"resourceType\"\n [ngClass]=\"{ 'resource-type-error': resourceTypeError }\"\n class=\"resource-type-select\"\n id=\"ResourceTypeSelect\"\n >\n <option value=\"\">Select Resource Type</option>\n <option value=\"service-policies\">Service Policies</option>\n <option value=\"services\">Services</option>\n <option value=\"identities\">Identities</option>\n <option value=\"edge-routers\">Edge Routers</option>\n <option value=\"edge-router-policies\">Edge Router Policies</option>\n <option value=\"service-edge-router-policies\">Service Edge Router Policies</option>\n </select>\n <div class=\"nf-net-vis-filter-container listBox row\">\n <input\n (keyup)=\"filterSearchArray()\"\n [(ngModel)]=\"filterText\"\n [matAutocomplete]=\"auto\"\n class=\"nf-topology-filter-input\"\n id=\"filterText\"\n matInput\n placeholder=\"Type to Filter\"\n />\n\n <div\n (click)=\"clearSearchFilter()\"\n *ngIf=\"filterText !== ''\"\n class=\"buttonBall close\"\n id=\"ClearSearchFilter\"\n ></div>\n <div [hidden]=\"!noSearchResults\" class=\"no-results-warning\">No Results Found</div>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"autocompleteSearch($event)\">\n <mat-option *ngFor=\"let option of autocompleteOptions\" [value]=\"option\">\n {{ option }}\n </mat-option>\n </mat-autocomplete>\n </div>\n </div>\n\n <div class=\"nf-topology-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-circle servicepolicies\"></div>\n <div class=\"legend-text\">Service Policies</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle services\"></div>\n <div class=\"legend-text\">Services</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle endpoints\"></div>\n <div class=\"legend-text\">Identities</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle edgerouters\"></div>\n <div class=\"legend-text\">Edge Routers</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle erpolicies\"></div>\n <div class=\"legend-text\">Edge Router Policies</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle serviceerpolicies\"></div>\n <div class=\"legend-text\">Service Router Policies</div>\n </div>\n </div>\n\n <div class=\"topotip\" id=\"tooltip\"></div>\n <svg style='pointer-events:all' id=\"NetworkVisualizerSVG\"></svg>\n <lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n </div>\n\n</div>\n", styles: [".ziti-page-container{height:100%;width:100%;left:0;display:flex;flex-direction:column;position:absolute;padding-top:1px;padding-left:3px;padding-right:3px;top:0}.nf-network-topology-container{overflow:hidden;width:100%;height:100%;background-color:var(--background);z-index:1001;margin:auto;inset:0;padding-top:1px;padding-left:3px;padding-right:3px;background:#f5e9f2;background-image:linear-gradient(#ecd3e6 2px,transparent 0),linear-gradient(90deg,#ecd3e6 2px,transparent 0),linear-gradient(#ecd3e6 1px,transparent 0),linear-gradient(90deg,#ecd3e6 1px,transparent 0);background-size:40px 40px,40px 40px,10px 10px,10px 10px}.css-header{height:50px;font-size:25px;font-weight:600;margin:8px 0 0 2px;font-family:Russo One;color:#0027ab;font-size:30px;text-transform:uppercase;font-weight:400;background-color:transparent}.resource-type-select{width:230px;flex-shrink:0;border-radius:27px;height:51px;margin-top:20px;margin-left:20px;-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px);background-color:#ffffff80!important;border-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);color:var(--tableText);padding-left:20px}select{background-image:url(/assets/svgs/ArrowDown.svg);background-position:center right 18px;background-repeat:no-repeat;background-size:18px;padding-right:38px}.no-results-warning{bottom:-20px;left:20px;font-size:15px;color:var(--tableText);padding-left:20px;padding-top:5px}.resource-type-error{border-width:3px;border-color:var(--red)!important}.nf-links{stroke:#fff;stroke-opacity:1.6}.nf-net-vis-controls-header{display:flex;flex-direction:row;position:absolute;z-index:99999;flex:1 0 auto;top:50px}.nf-net-vis-filter-container{max-width:300px;margin-top:20px;margin-left:10px;flex:1 0 auto}.table-filter-container{max-width:300px;margin-top:0;margin-left:1px;flex:1 0 auto}#ClearSearchFilter{position:absolute;right:2px;top:2px;width:20px;height:20px;font-size:25px;color:var(--tableText);z-index:99999999}#popupTableTitle{width:100%;font-weight:900;display:inline-block;background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);border:2px #d3d3d3!important;text-align:center;border:2px;border-color:#d3d3d3;height:25px;top:2px;color:#fff;padding-right:5px;background:#000;cursor:move}#tra:hover{text-decoration:underline}#CloseDataTable{position:absolute;right:5px;top:-33px;width:25px;height:25px;font-size:15px;color:#fff;z-index:99999999}.copydatatable{width:135px;height:17px;font-size:10pt;font-family:tahoma;top:95%;right:0%;border-radius:5px;background:#fff;border:0px solid gray!important;position:absolute!important;text-transform:uppercase;cursor:pointer;z-index:999}.copydatatable:hover{text-decoration:underline}.nf-topology-filter-input{height:50px;border-radius:25px;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding-left:20px;padding-right:35px}.nf-topology-select-container{max-width:400px;margin-top:20px;margin-left:20px;flex:1 0 auto}.nf-topology-select-input{height:45px;border-radius:25px;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding-left:20px}input:focus,textarea:focus,select:focus{box-shadow:0 20px 23px 0 var(--shadow)}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.nf-topology-filter-input{background:var(--glass)!important;-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.nf-topology-zoom-container{display:flex;margin-left:20px;margin-top:20px;flex:1 0 auto}.nf-topology-zoom-button.minus{height:50px;width:50px;margin-right:10px;border-radius:55px;border:unset;font-size:40px;font-family:icomoon!important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--primaryColor);line-height:49px;background-color:var(--navigation);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .5s;background-image:url(/assets/images/Icon_Minus.png);background-size:40%;background-color:var(--red);box-shadow:0 6px 10px 0 var(--redShadow)}.nf-topology-zoom-label{padding-right:10px}.nf-topology-zoom-button{height:50px;width:50px;margin-right:10px;border-radius:55px;border:unset;font-size:40px;font-family:icomoon!important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--primaryColor);line-height:49px;background-color:var(--navigation);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .5s}.nf-topology-zoom-button.plus:before{content:\"\\e937\"}.nf-topology-zoom-button.minus:before{content:\"\\e943\"}.nf-topology-zoom-button:hover{color:var(--white);background-color:var(--primaryColor);filter:brightness(90%);transition:background-color 1s;transition:.3s}.nf-topology-zoom-button:active{background-color:var(--icon);transform:scale(.97);transition:background-color 1s;transition:.3s}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.nf-topology-zoom-button{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.placeholder{display:flex;align-items:center;justify-content:center;height:800px}.topotip{display:none;position:fixed;background:var(--navigation);border:0px;border-radius:12px;pointer-events:none;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .3s;padding:10px;font-size:17px;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:400px}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.topotip{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.nodes{cursor:pointer;box-shadow:0 30px 43px 0 var(--shadow)}.nf-links{cursor:pointer}.linkWidth{color:#fff}.nf-network-topology-container .loader{margin-left:-150px}.loader .bar1{background-color:var(--inputBorder)!important}.loader .bar2{background-color:var(--inputBorder)!important;animation-delay:-.7s}.loader .bar3{background-color:var(--inputBorder)!important;animation-delay:-.6s}.loader .bar4{background-color:var(--inputBorder)!important;animation-delay:-.5s}.loader .bar5{background-color:var(--inputBorder)!important;animation-delay:-.4s}.loader .bar6{background-color:var(--inputBorder)!important;animation-delay:-.3s}.changeView{display:flex;margin-top:32px;margin-left:10px;flex:1 0 auto}.changeView .changeViewLabel{margin-top:3px;margin-left:5px}.node circle{fill:#fff;stroke:#07397d;stroke-width:14px;box-shadow:0 20px 23px 0 var(--shadow)}.node text{font:27px sans-serif;cursor:pointer}.text-container{cursor:pointer}.link{fill:none;stroke:var(--table);stroke-width:5px;color:#fff}.nf-topology-legend{width:210px;border-radius:12px;margin-top:10px;margin-right:20px;position:fixed;top:0;right:0;background:var(--navigation);display:inline-block;box-shadow:0 20px 23px 0 var(--shadow);padding:5px 12px 7px}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.nf-topology-legend{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.legend-item{width:100%;height:100%;display:inline-block}.legend-circle{height:12px;width:12px;border-radius:15px;display:inline-block;margin-top:7px}.legend-circle.servicepolicies{background-color:#ff0d49}.legend-circle.services{background-color:#08dc5a}.legend-circle.endpoints{background-color:#0273fb}.legend-circle.edgerouters{background-color:#ffc000}.legend-circle.erpolicies{background-color:#ff8400}.legend-circle.serviceerpolicies{background-color:#ff5900}.legend-text{display:inline-block;font-size:15px;font-weight:600;color:var(--tableText);padding-left:7px;padding-bottom:4px}.reset-button{height:50px;width:50px;border-radius:50px;margin-right:10px;background-size:contain;background-image:url(/assets/svgs/refresh.svg);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:.3s}.reset-button:hover{filter:brightness(90%);transform:scale(.97);transition:.3s}.reset-button:active{transform:scale(.9);transition:.3s}.sign_out_button{background-color:#2fa4e7;padding:16px 10px;color:#fff;float:left;text-decoration:none}.sign_out_button:hover{background-color:#1892d7}.sign_out_button a{color:#fff;text-decoration:none}.contextmenu_mouseout{fill:#f4f4f4;stroke:#fff;stroke-width:1px}.contextmenu_mouseover{fill:#c8c8c8}.menu2{position:fixed;background:#fff;color:#000;cursor:pointer;border:1px black solid}.contextmenu_text{position:fixed;background:var(--navigation);border:1px;border-radius:5px;pointer-events:none;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .3s;padding:5px;font-size:10px;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:400px}.contextmenu{z-index:2000;opacity:1;position:fixed;background:#fff;color:#000;font-family:sans-serif;font-size:11px;box-shadow:2px 2px 2px #90908d;padding:2px;border-radius:12px;border:1px solid #c6c6c6;max-width:400px}.menuItems{display:block;color:#555;text-decoration:none;padding:6px 8px 6px 30px;position:relative}.context-menu{display:none;position:absolute;z-index:10}.context-menu__items{list-style:none;margin:0;padding:0}.context-menu__item{display:block;margin-bottom:4px}.container{margin:0 auto;padding:0 24px;max-width:960px}.context-menu__link{display:block;padding:4px 12px;color:#06a;text-decoration:none}.contextmenu_text:hover .divItemsHover{color:#fff;background-color:#06a}.context-menu--active{display:block}#topoDataTableHeader{float:left;min-width:250px;width:auto;height:360px;top:100px;border-bottom-left-radius:13px;border-bottom-right-radius:13px;display:none;background:#fff;border:2px solid gray!important;position:absolute!important}.table-filter-input{height:30px;width:100%;top:40px;border-radius:1px;border-color:#d3d3d3;background-color:#d3d3d3;box-shadow:0 20px 23px 0 var(--shadow);padding-top:3px;padding-left:2px;padding-right:2px}#topoDataTable{float:down;min-width:250px;width:auto;height:300px;top:55px;border-radius:10px;position:absolute!important;overflow:auto;background:#fff;font-family:sans-serif;font-size:16px;color:#06a;overflow-x:scroll}table{width:auto;height:auto;max-height:300px}tr{width:auto;padding:5px}th{width:auto;font-family:sans-serif;font-size:16px;color:#06a;font-weight:700;background-color:#06a}td{width:auto}th{width:auto;font-weight:700;padding:2px;border:1px solid #ccc;text-align:center}.context-menu{border-radius:12px;background:var(--navigation);width:200px;box-shadow:0 20px 23px 0 var(--shadow);position:relative;display:none}.context-menu .menu-options{list-style:none;padding:0}.context-menu .menu-options .menu-option{font-weight:700;font-size:16px;line-height:36px;color:var(--tableText);padding:1px 4px 1px 20px;cursor:pointer}.context-menu .menu-options .menu-option:hover{background:var(--primaryColor);color:var(--navigation)}@supports ((-webkit-backdrop-filter: saturate(110%) blur(15px)) or (backdrop-filter: saturate(110%) blur(15px))){.context-menu{background:var(--glass);-webkit-backdrop-filter:saturate(110%) blur(15px);backdrop-filter:saturate(110%) blur(15px)}}.spinner{position:absolute;right:1em;top:1em;display:inline-block;width:32px;height:32px;border-radius:50%;background:transparent;border-top:5px solid var(--placeholder);border-right:5px solid var(--placeholder);border-bottom:5px solid transparent;border-left:5px solid transparent;animation:loading .5s infinite linear}.disabled{-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;pointer-events:none;cursor:pointer;opacity:.6}path:not(.loader path,.highcharts-root path){fill:none;stroke:var(--navigation);stroke-width:5px;color:#fff}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rotating{animation:rotating 2s linear infinite}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__outer-circle{background-color:var(--icon);border-width:4px}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:disabled:checked+.mdc-radio__background .mdc-radio__inner-circle{border-color:var(--icon)}.mdc-radio__native-control:disabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-width:4px}#mat-radio-2>div>div>div.mdc-radio__background>div.mdc-radio__inner-circle .node.edge-router circle{stroke:#ffc000!important;stroke-width:12px}.node.endpoint circle{stroke:#0273fb!important;stroke-width:12px}.node.service circle{stroke:#08dc5a!important;stroke-width:12px}.node.service-policy circle{stroke:#ff0d49!important;stroke-width:12px}.node.edge-router-policy circle{stroke:#ff8400!important;stroke-width:12px}.node.service-edge-router-policy circle{stroke:#ff5900!important;stroke-width:12px}.text-container{color:var(--tableText);font-size:24px;font-weight:700;margin-left:20px;margin-top:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}svg>g>g.node:first-of-type.terminate{cursor:pointer}svg>g>g.node:first-of-type.terminate .text-container{cursor:pointer}svg>g>g.node:first-of-type.terminate circle{cursor:pointer}svg>g>g.node:first-of-type.terminate:hover>rect{fill:url(#NodeHoverGradient)}.node>rect{fill:url(#NodeGradient)}.node.terminate{cursor:default;stroke-width:14px}.node.terminate .text-container{cursor:default}.node.terminate circle{cursor:default;stroke-width:14px}.node.terminate:hover>rect{fill:url(#NodeGradient)}.node:hover>rect{fill:url(#NodeHoverGradient)}p-chips.error .p-chips.p-component .p-chips-multiple-container{border-color:var(--red);border-width:2px}.checkboxes.error .mat-checkbox-frame{border-color:var(--red)}.checkboxes.error .mat-checkbox-label{color:var(--red)}.stop1{stop-color:var(--table);stop-opacity:.9}.stop2{stop-color:var(--table);stop-opacity:.65}.stop3{stop-color:var(--table);stop-opacity:0}.stop1a{stop-color:var(--background);stop-opacity:1}.stop2a{stop-color:var(--background);stop-opacity:.7}.stop3a{stop-color:var(--background);stop-opacity:0}\n"] }]
|
|
1501
|
+
}], ctorParameters: function () { return [{ type: i10.SettingsService, decorators: [{
|
|
1502
|
+
type: Inject,
|
|
1503
|
+
args: [SETTINGS_SERVICE]
|
|
1504
|
+
}] }, { type: i11.ZitiDataService, decorators: [{
|
|
1505
|
+
type: Inject,
|
|
1506
|
+
args: [ZITI_DATA_SERVICE]
|
|
1507
|
+
}] }, { type: i1.HttpClient }, { type: i2.LoggerService }, { type: i3.TreeNodeProcessor }, { type: i4.NetworkVisualizerHelper }]; } });
|
|
1508
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy92aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci9uZXR3b3JrLXZpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvbmV0d29yay12aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBRU4saUJBQWlCLEdBRWxCLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFDTCxnQkFBZ0IsR0FFakIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsaUJBQWlCLEdBRWxCLE1BQU0scUNBQXFDLENBQUM7QUFHN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFHLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBVXZCLE1BT2EsMEJBQTJCLFNBQVEsc0JBQXNCO0lBcURwRSxZQUNvQyxlQUFnQyxFQUM5QixXQUE0QixFQUN2RCxVQUFzQixFQUN0QixNQUFxQixFQUN0QixpQkFBb0MsRUFDcEMsY0FBdUM7UUFFOUMsS0FBSyxFQUFFLENBQUM7UUFQeUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUN2RCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDdEIs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ZXNsaW50IHByZWZlci1jb25zdDogMSAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIEluamVjdCxcbiAgT25Jbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5qZWN0YWJsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgU0VUVElOR1NfU0VSVklDRSxcbiAgU2V0dGluZ3NTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFpJVElfREFUQV9TRVJWSUNFLFxuICBaaXRpRGF0YVNlcnZpY2UsXG59IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ppdGktZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7Y2F0Y2hFcnJvcn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQge2ZpcnN0VmFsdWVGcm9tLCBtYXAsIE9ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBWaXN1YWxpemVyU2VydmljZUNsYXNzICB9IGZyb20gJy4uL3Zpc3VhbGl6ZXItc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgVHJlZU5vZGVQcm9jZXNzb3IgfSBmcm9tICcuL25ldHdvcmstdmlzdWFsaXplci50cmVlbm9kZXByb2Nlc3Nvcic7XG5pbXBvcnQgeyBOZXR3b3JrVmlzdWFsaXplckhlbHBlciB9IGZyb20gJy4vbmV0d29yay12aXN1YWxpemVyLmhlbHBlcic7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gXCIuLi8uLi9tZXNzYWdpbmcvbG9nZ2VyLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW5ldHdvcmstdmlzdWFsaXplcicsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXR3b3JrLXZpc3VhbGl6ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZXR3b3JrLXZpc3VhbGl6ZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrVmlzdWFsaXplckNvbXBvbmVudCBleHRlbmRzIFZpc3VhbGl6ZXJTZXJ2aWNlQ2xhc3MgaW1wbGVtZW50cyBPbkluaXQge1xuLy8gZXhwb3J0IGNsYXNzIE5ldHdvcmtWaXN1YWxpemVyQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHRpdGxlID0gJ05ldHdvcmsgVmlzdWFsaXplcidcbiAgcHVibGljIGQzO1xuICB1bmlxSWQgPSAwO1xuICB0cmVldG9vbHRpcDtcbiAgZnVsbFNjcmVlbiA9IGZhbHNlO1xuICBpc0xvYWRpbmcgPSB0cnVlO1xuICBub1NlYXJjaFJlc3VsdHMgPSBmYWxzZTtcbiAgc2VydmljZXM7XG4gIGlkZW50aXRpZXM7XG4gIGVkZ2Vyb3V0ZXJzO1xuICBzZXJ2aWNlX3BvbGljaWVzO1xuICByb3V0ZXJfcG9saWNpZXM7XG4gIHNlcnZpY2Vfcm91dGVyX3BvbGljaWVzO1xuICBjb25maWdzO1xuICBiYXNlTmV0d29ya0dyYXBoO1xuICBuZXR3b3JrR3JhcGg7XG4gIGN1cnJlbnROZXR3b3JrO1xuICBzZWFyY2hSb290Tm9kZTtcblxuICBzZXJ2aWNlUG9saWNpZXNUcmVlTm9kZXMgPSBbXTtcbiAgc2VydmljZXNUcmVlTm9kZXMgPSBbXTtcbiAgaWRlbnRpdGllc1RyZWVOb2RlcyA9IFtdO1xuICBlZGdlcm91dGVyc1RyZWVOb2RlcyA9IFtdO1xuICBlclBvbGljaWVzVHJlZU5vZGVzID0gW107XG4gIHNlcnZpY2VFZGdlUm91dGVyUG9saWN5VHJlZU5vZGVzID0gW107XG5cbiAgYXV0b2NvbXBsZXRlT3B0aW9ucztcbiAgcmVzb3VyY2VUeXBlRXJyb3IgPSBmYWxzZTtcbiAgZmlsdGVyVGV4dCA9ICcnO1xuICByZXNvdXJjZVR5cGUgPSAnJztcbiAgem9vbTtcbiAgc3ZnO1xuICB0cmVlbWFwO1xuICBub2RlcztcbiAgbm9kZTtcbiAgbGluaztcbiAgbGlua3M7XG4gIGxpbmtFeGl0O1xuICBsaW5rVXBkYXRlO1xuICBvcGVuTm9kZXMgPSBbXTtcbiAgdHJhbnNmb3JtO1xuICBub2RlVXBkYXRlO1xuICBub2RlRXhpdDtcbiAgbm9kZUVudGVyO1xuICBjb250ZXh0bWVudU5vZGU7XG4gIGNpcmNsZXM7XG4gIGNvbnRleHRtZW51Tm9kZVR5cGU6YW55ID0gW107XG4gIHNpbXVsYXRpb247XG4gIHRyZWVEYXRhO1xuICBncmFwaHRvb2x0aXA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgIEBJbmplY3QoU0VUVElOR1NfU0VSVklDRSkgcHVibGljIHNldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxuICAgICBASW5qZWN0KFpJVElfREFUQV9TRVJWSUNFKSBwcml2YXRlIHppdGlTZXJ2aWNlOiBaaXRpRGF0YVNlcnZpY2UsXG4gICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgIHB1YmxpYyB0cmVlTm9kZVByb2Nlc3NvcjogVHJlZU5vZGVQcm9jZXNzb3IsXG4gICAgIHB1YmxpYyB0b3BvbG9neUhlbHBlcjogTmV0d29ya1Zpc3VhbGl6ZXJIZWxwZXIsXG4gICkge1xuICAgICBzdXBlcigpO1xuICAgIC8vIHN1cGVyKHNldHRpbmdzU2VydmljZSwgeml0aVNlcnZpY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgIHRoaXMuZ2V0TmV0d29ya09iamVjdHMoKTtcbiAgfVxuXG4gICAgZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKSB7XG4gICAgICBjb25zdCBwYWdpbmcgPSB7XG4gICAgICAgIHNlYXJjaE9uOiAnbmFtZScsXG4gICAgICAgIG5vU2VhcmNoOiBmYWxzZSxcbiAgICAgICAgZmlsdGVyOiAnJyxcbiAgICAgICAgdG90YWw6IHBhZ2VzaXplLFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBzb3J0OiAnbmFtZScsXG4gICAgICAgIG9yZGVyOiAnYXNjJyxcbiAgICAgIH07XG4gICAgICByZXR1cm4gIHBhZ2luZztcbiAgICB9XG5cbiAgYXN5bmMgZ2V0TmV0d29ya09iamVjdHMoKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICBhd2FpdCB0aGlzLnJlYWRBbGxPYmplY3RzKCk7XG4gICAgIHRoaXMucHJvY2Vzc0ZpcnN0TmV0d29ya0dyYXBoKCk7XG4gIH1cblxuICAgYXN5bmMgZmV0Y2hJZGVudGl0aWVzIChwYWdlc2l6ZSkge1xuICAgICAgY29uc3QgaWRlbnRpdGllc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy56aXRpU2VydmljZVxuICAgICAgLmdldChgaWRlbnRpdGllc2AsIGlkZW50aXRpZXNfcGFnaW5nLCBbXSlcbiAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgIHRoaXMuaWRlbnRpdGllcyA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAgaWYgKCF0aGlzLmlkZW50aXRpZXMgfHwgdGhpcy5pZGVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5pZGVudGl0aWVzID0gW107XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgaWRlbnRpdGllc19wYWdpbmcucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgIC5nZXQoXG4gICAgICAgICAgICAgICAgYGlkZW50aXRpZXNgLFxuICAgICAgICAgICAgICAgICBpZGVudGl0aWVzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICApLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5pZGVudGl0aWVzLnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgIHByb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICB9XG4gICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGZldGNoaW5nIElkZW50aXRpZXMnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgfSk7ICAvLyBpZGVudGl0eSBwcm9taXNlc1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hTZXJ2aWNlcyhwYWdlc2l6ZSkge1xuICAgY29uc3Qgc2VydmljZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgLmdldChgc2VydmljZXNgLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKCBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VzID0gcmVzdWx0LmRhdGE7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2aWNlcyB8fCB0aGlzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzID0gW107XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHNfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gcGFnZXM7IHBhZ2UrKykge1xuICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5nZXQoXG4gICAgICAgICAgICAgICAgICAgIGBzZXJ2aWNlc2AsXG4gICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAudGhlbigocGFnZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZXMucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzX3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFByb21pc2UuYWxsKHNfcHJvbWlzZXMpLnRoZW4oKCkgPT4geyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgc2VydmljZXMnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmZXRjaFNlcnZpY2VQb2xpY2llcyhwYWdlc2l6ZSkge1xuICAgICAgIGNvbnN0IHNlcnZpY2VzUG9saWNpZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAuZ2V0KGBzZXJ2aWNlLXBvbGljaWVzYCwgc2VydmljZXNQb2xpY2llc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKCBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VfcG9saWNpZXMgPSByZXN1bHQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2VfcG9saWNpZXMgfHwgdGhpcy5zZXJ2aWNlX3BvbGljaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VfcG9saWNpZXMgPSBbXTtcbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgICAgY29uc3Qgc3BfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gcGFnZXM7IHBhZ2UrKykge1xuICAgICAgICAgICAgICAgIHNlcnZpY2VzUG9saWNpZXNfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0gYXdhaXQgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICAgICAgYHNlcnZpY2UtcG9saWNpZXNgLFxuICAgICAgICAgICAgICAgICAgICAgc2VydmljZXNQb2xpY2llc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAudGhlbigocGFnZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZV9wb2xpY2llcy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNwX3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoc3BfcHJvbWlzZXMpLnRoZW4oKCkgPT4geyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGZldGNoaW5nIHNlcnZpY2UtcG9saWNpZXMnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBmZXRjaEVkZ2VSb3V0ZXJzKHBhZ2VzaXplKSB7XG4gICAgICAgY29uc3Qgcm91dGVyc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgcmV0dXJuIGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAuZ2V0KGBlZGdlLXJvdXRlcnNgLCByb3V0ZXJzX3BhZ2luZywgW10pXG4gICAgICAgICAgLnRoZW4oIGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWRnZXJvdXRlcnMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGdlcm91dGVycyB8fCB0aGlzLmVkZ2Vyb3V0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzID0gW107XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gcGFnZXM7IHBhZ2UrKykge1xuICAgICAgICAgICAgICAgIHJvdXRlcnNfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0gYXdhaXQgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICAgICAgYGVkZ2Utcm91dGVyc2AsXG4gICAgICAgICAgICAgICAgICAgICByb3V0ZXJzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGdlcm91dGVycy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJfcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocl9wcm9taXNlcykudGhlbigoKSA9PiB7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbiBmZXRjaGluZyBlZGdlLXJvdXRlcnMnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICB9KTtcbiAgfVxuXG4gYXN5bmMgZmluZEVkZ2VSb3V0ZXJQb2xpY2llcyhwYWdlc2l6ZSkge1xuICAgICAgdGhpcy5yb3V0ZXJfcG9saWNpZXMgPSBbXTtcbiAgICAgIGNvbnN0IGVycG9saWNpZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAuZ2V0KGBlZGdlLXJvdXRlci1wb2xpY2llc2AsIGVycG9saWNpZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlcl9wb2xpY2llcyA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJvdXRlcl9wb2xpY2llcyB8fCB0aGlzLnJvdXRlcl9wb2xpY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgICAgY29uc3Qgcl9wcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgZXJwb2xpY2llc19wYWdpbmcucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAuZ2V0KFxuICAgICAgICAgICAgICAgICAgICBgZWRnZS1yb3V0ZXItcG9saWNpZXNgLFxuICAgICAgICAgICAgICAgICAgICAgZXJwb2xpY2llc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAudGhlbigocGFnZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyX3BvbGljaWVzLnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcl9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIFByb21pc2UuYWxsKHJfcHJvbWlzZXMpLnRoZW4oKCkgPT4geyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbiBmZXRjaGluZyBlZGdlLXJvdXRlci1wb2xpY2llcycsIGVycm9yKTtcbiAgICAgICB9KTtcbiB9XG4gYXN5bmMgZmV0Y2hTZXJ2aWNlRWRnZVJvdXRlclBvbGljaWVzKHBhZ2VzaXplKSB7XG4gICAgIHRoaXMuc2VydmljZV9yb3V0ZXJfcG9saWNpZXMgPSBbXTtcbiAgICAgY29uc3Qgc2VycF9wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgIHJldHVybiBhd2FpdCB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgLmdldChgc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llc2AsIHNlcnBfcGFnaW5nLCBbXSlcbiAgICAgICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzID0gcmVzdWx0LmRhdGE7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llcyB8fCB0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgICAgICBjb25zdCByX3Byb21pc2VzID0gW107XG4gICAgICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgICBzZXJwX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5nZXQoXG4gICAgICAgICAgICAgICAgICAgIGBzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzYCxcbiAgICAgICAgICAgICAgICAgICAgIHNlcnBfcGFnaW5nLFxuICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZVJlc3VsdC5kYXRhLmZvckVhY2goKHNlcnYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzLnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcl9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBQcm9taXNlLmFsbChyX3Byb21pc2VzKS50aGVuKCgpID0+IHsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llcycsIGVycm9yKTtcbiAgICAgICB9KTtcbiB9XG4gYXN5bmMgZmV0Y2hDb25maWdzKHBhZ2VzaXplKSB7XG4gICAgdGhpcy5jb25maWdzID0gW107XG4gICAgY29uc3QgY29uZmlnc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAuZ2V0KGBjb25maWdzYCwgY29uZmlnc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlncyA9IHJlc3VsdC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlncyB8fCB0aGlzLmNvbmZpZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29uZmlncyA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgICAgICBjb25zdCByX3Byb21pc2VzID0gW107XG4gICAgICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgICBjb25maWdzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5nZXQoXG4gICAgICAgICAgICAgICAgICAgIGBjb25maWdzYCxcbiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3NfcGFnaW5nLFxuICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZVJlc3VsdC5kYXRhLmZvckVhY2goKHNlcnYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3MucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByX3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFByb21pc2UuYWxsKHJfcHJvbWlzZXMpLnRoZW4oKCkgPT4geyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgY29uZmlncycsIGVycm9yKTtcbiAgICAgICAgICB9KTtcblxuIH1cblxuIGFzeW5jIHJlYWRBbGxPYmplY3RzKCkge1xuICAgY29uc3QgbXlQcm9taXNlID0gIGF3YWl0IG5ldyBQcm9taXNlKCAgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICBsZXQgbmV0d29ya1Zpc1Byb21pc2VzID1bXTtcbiAgICAgY29uc3QgcGFnZXNpemUgPSA1MDA7XG4gICAgIGNvbnN0IGVwcyA9IHRoaXMuZmV0Y2hJZGVudGl0aWVzKHBhZ2VzaXplKTtcbiAgICAgY29uc3Qgc3MgPSB0aGlzLmZldGNoU2VydmljZXMocGFnZXNpemUpO1xuICAgICBjb25zdCBzcHMgPSB0aGlzLmZldGNoU2VydmljZVBvbGljaWVzKHBhZ2VzaXplKTtcbiAgICAgY29uc3QgZXJzID0gdGhpcy5mZXRjaEVkZ2VSb3V0ZXJzKHBhZ2VzaXplKTtcbiAgICAgY29uc3QgZXJwcyA9IHRoaXMuZmluZEVkZ2VSb3V0ZXJQb2xpY2llcyhwYWdlc2l6ZSk7XG4gICAgIGNvbnN0IHNlcnBzID0gdGhpcy5mZXRjaFNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXMocGFnZXNpemUpO1xuICAgICBjb25zdCBjZmcgPSB0aGlzLmZldGNoQ29uZmlncyhwYWdlc2l6ZSk7XG4gICAgIFByb21pc2UuYWxsKFtlcHMsIHNzLCBzcHMsIGVycywgZXJwcywgZXJwcywgc2VycHMsIGNmZ10pLnRoZW4oKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgnZW5kJyk7XG4gICAgIH0pO1xuICAgfSk7XG5cbiB9XG5cbiAgcHJvY2Vzc0ZpcnN0TmV0d29ya0dyYXBoKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdHJlZU9iaiA9IHRoaXMudG9wb2xvZ3lIZWxwZXIuZ2V0UmVzb3VyY2VUcmVlT2JqKFxuICAgICAgICAgICAgICAgICd0aGlzLmN1cnJlbnROZXR3b3JrLm5hbWUnLFxuICAgICAgICAgICAgICAgICd0aGlzLmN1cnJlbnROZXR3b3JrLnN0YXR1cycsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlcyxcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXRpZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlX3BvbGljaWVzLFxuICAgICAgICAgICAgICAgIHRoaXMuZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJfcG9saWNpZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llcyxcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCxcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlclxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy51bmlxSWQgPSB0cmVlT2JqLmxhc3RJZDtcbiAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoID0gZDMuaGllcmFyY2h5KHRyZWVPYmosIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQuY2hpbGRyZW47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYmFzZU5ldHdvcmtHcmFwaCA9IHRoaXMubmV0d29ya0dyYXBoO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlUG9saWNpZXNUcmVlTm9kZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZXNUcmVlTm9kZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpdGllc1RyZWVOb2RlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5lZGdlcm91dGVyc1RyZWVOb2RlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5lclBvbGljaWVzVHJlZU5vZGVzID0gW107XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VFZGdlUm91dGVyUG9saWN5VHJlZU5vZGVzID0gW107XG5cbiAgICAgICAgICAgIHRoaXMuc2VydmljZVBvbGljaWVzVHJlZU5vZGVzID0gdGhpcy5maWxsQXV0b0NvbXBsZXRlVHJlZU5vZGVzKFxuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZVBvbGljaWVzVHJlZU5vZGVzLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlUG9saWN5J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZXNUcmVlTm9kZXMgPSB0aGlzLmZpbGxBdXRvQ29tcGxldGVUcmVlTm9kZXMoXG4gICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bMV0sXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1RyZWVOb2RlcyxcbiAgICAgICAgICAgICAgICAnU2VydmljZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmlkZW50aXRpZXNUcmVlTm9kZXMgPSB0aGlzLmZpbGxBdXRvQ29tcGxldGVUcmVlTm9kZXMoXG4gICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bMl0sXG4gICAgICAgICAgICAgICAgdGhpcy5pZGVudGl0aWVzVHJlZU5vZGVzLFxuICAgICAgICAgICAgICAgICdJZGVudGl0eSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzVHJlZU5vZGVzID0gdGhpcy5maWxsQXV0b0NvbXBsZXRlVHJlZU5vZGVzKFxuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuWzNdLFxuICAgICAgICAgICAgICAgIHRoaXMuZWRnZXJvdXRlcnNUcmVlTm9kZXMsXG4gICAgICAgICAgICAgICAgJ0VkZ2UgUm91dGVyJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZXJQb2xpY2llc1RyZWVOb2RlcyA9IHRoaXMuZmlsbEF1dG9Db21wbGV0ZVRyZWVOb2RlcyhcbiAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbls0XSxcbiAgICAgICAgICAgICAgICB0aGlzLmVyUG9saWNpZXNUcmVlTm9kZXMsXG4gICAgICAgICAgICAgICAgJ1JvdXRlciBQb2xpY3knXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VFZGdlUm91dGVyUG9saWN5VHJlZU5vZGVzID0gdGhpcy5maWxsQXV0b0NvbXBsZXRlVHJlZU5vZGVzKFxuICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuWzVdLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZUVkZ2VSb3V0ZXJQb2xpY3lUcmVlTm9kZXMsXG4gICAgICAgICAgICAgICAgJ1NlcnZpY2UgUm91dGVyIFBvbGljeSdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5pdFRvcG9WaWV3KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjphbnkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gIH1cbiAgICBmaWxsQXV0b0NvbXBsZXRlVHJlZU5vZGVzKG5vZGVPYmosIGFyciwgdHlwZU5hbWUpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG5vZGVPYmouZGF0YS5uYW1lO1xuICAgICAgICAvLyBjb25zdCBpZCA9IG5vZGVPYmouZGF0YS5pZDtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBub2RlT2JqLmRhdGEudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vICAgICAgLy9cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhcnIuaW5kZXhPZihuYW1lKSA8IDAgJiYgbm9kZU9iai5kYXRhLnR5cGUgPT09IHR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gbm9kZU9iai5jaGlsZHJlbiA/IG5vZGVPYmouY2hpbGRyZW4gOiBub2RlT2JqLl9jaGlsZHJlbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGNoaWxkTm9kZXMgJiYgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZmlsbEF1dG9Db21wbGV0ZVRyZWVOb2RlcyhjaGlsZE5vZGVzW2ldLCBhcnIsIHR5cGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgYXV0b2NvbXBsZXRlU2VhcmNoKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IGV2ZW50ID8gZXZlbnQub3B0aW9uLnZhbHVlIDogJyc7XG4gICAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VDb25kaXRpb25DaGVjayhzdHIpO1xuICAgIH1cblxuICAgIHJlc291cmNlVHlwZUNoYW5nZWQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRTZWFyY2hOb2RlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2hMaW5rQ29sb3JzKCk7XG4gICAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5yZXNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2hGaWx0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlRXJyb3IgPSAhXy5pc0VtcHR5KHRoaXMuZmlsdGVyVGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMucmVzb3VyY2VUeXBlRXJyb3IgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLXBvbGljaWVzJykge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5zZXJ2aWNlUG9saWNpZXNUcmVlTm9kZXM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlcycpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuc2VydmljZXNUcmVlTm9kZXM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdpZGVudGl0aWVzJykge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5pZGVudGl0aWVzVHJlZU5vZGVzO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXJzJykge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5lZGdlcm91dGVyc1RyZWVOb2RlcztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVyLXBvbGljaWVzJykge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5lclBvbGljaWVzVHJlZU5vZGVzO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llcycpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuc2VydmljZUVkZ2VSb3V0ZXJQb2xpY3lUcmVlTm9kZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmZpbHRlclRleHQpKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc291cmNlQ29uZGl0aW9uQ2hlY2sodGhpcy5maWx0ZXJUZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWFyY2hSZXNvdXJjZUNvbmRpdGlvbkNoZWNrKHNlYXJjaFR4dCkge1xuICAgICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnJyAmJiBzZWFyY2hUeHQgIT09ICcnKSB7XG4gICAgICAgICAgLy8gaWYgKHNlYXJjaFR4dCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgICB0aGlzLnNlYXJjaFJlc291cmNlSW5UcmVlKHNlYXJjaFR4dCk7XG4gICAgICB9XG5cbiAgICB9XG4gICAgc2VhcmNoUmVzb3VyY2VJblRyZWUoc2VhcmNoVHh0KSB7XG4gICAgICAvLyAgdGhpcy5jbG9zZVRhYmxlKCk7XG4gICAgICAgIHRoaXMubm9TZWFyY2hSZXN1bHRzID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGVFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0VHJlZShudWxsKTtcbiAgICAgICAgaWYgKHNlYXJjaFR4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2hMaW5rQ29sb3JzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VhcmNoTm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaExpbmtDb2xvcnMoKTtcbiAgICAgICAgICAgIGxldCBwYXRocyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRhcmdldE5vZGVzID0gW107XG4gICAgICAgICAgICBjb25zdCBub2RlSWRzID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLXBvbGljaWVzJykge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzFdLCBzZWFyY2hUeHQsIHBhdGhzLCB0YXJnZXROb2Rlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXJzJykge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzRdLCBzZWFyY2hUeHQsIHBhdGhzLCB0YXJnZXROb2Rlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZXMnKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZXMgPSB0aGlzLnByb2Nlc3NTZWFyY2hJblByZW9yZGVyKHRoaXMubm9kZXNbMl0sIHNlYXJjaFR4dCwgcGF0aHMsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdpZGVudGl0aWVzJykge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzNdLCBzZWFyY2hUeHQsIHBhdGhzLCB0YXJnZXROb2Rlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXItcG9saWNpZXMnKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZXMgPSB0aGlzLnByb2Nlc3NTZWFyY2hJblByZW9yZGVyKHRoaXMubm9kZXNbNV0sIHNlYXJjaFR4dCwgcGF0aHMsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJykge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVzID0gdGhpcy5wcm9jZXNzU2VhcmNoSW5QcmVvcmRlcih0aGlzLm5vZGVzWzZdLCBzZWFyY2hUeHQsIHBhdGhzLCB0YXJnZXROb2Rlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRocyA9IHRoaXMuZXhwbG9yZVBhdGhzRm9yU2VhcmNoZWROb2Rlcyh0YXJnZXROb2RlcywgcGF0aHMsIG5vZGVJZHMpO1xuICAgICAgICAgICAgaWYgKHRhcmdldE5vZGVzICYmIHRhcmdldE5vZGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub1NlYXJjaFJlc3VsdHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2hMaW5rQ29sb3JzKCk7XG4gICAgICAgICAgICAgICAvLyByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9pZiAodGFyZ2V0Tm9kZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5QYXRocyhwYXRocywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBkMy5zZWxlY3RBbGwoJ2NpcmNsZScpLmZpbHRlcihmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOYW1lID0gXy5nZXQoZCwgJ2RhdGEubmFtZScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgZGF0YUlkID0gXy5nZXQoZCwgJ2RhdGEuaWQnLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVOYW1lID0gXy5nZXQodGFyZ2V0Tm9kZXNbMF0sICdkYXRhLm5hbWUnLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhTmFtZS50b0xvd2VyQ2FzZSgpID09PSBzZWFyY2hUeHQudG9Mb3dlckNhc2UoKSAmJiBub2RlTmFtZSA9PT0gZGF0YU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnZmlsbCcsICdyZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSB7XG4gICAgICAgICAgICAgLy8gICB0aGlzLm5vU2VhcmNoUmVzdWx0cyA9IHRydWU7XG4gICAgICAgICAgICAgIC8vICB0aGlzLmNsZWFyU2VhcmNoTGlua0NvbG9ycygpO1xuICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBleHBsb3JlUGF0aHNGb3JTZWFyY2hlZE5vZGVzKHRhcmdldE5vZGVzLCBwYXRocywgbm9kZUlkcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgdGFyZ2V0Tm9kZXMgJiYgaSA8IHRhcmdldE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbmQgPSB0YXJnZXROb2Rlc1tpXTtcbiAgICAgICAgICAgIHBhdGhzLnB1c2gobmQpO1xuICAgICAgICAgICAgd2hpbGUgKG5kLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IF8uZ2V0KG5kLnBhcmVudCwgJ2RhdGEuaWQnKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUlkcy5pbmRleE9mKG5vZGVJZCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJZHMucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKG5kLnBhcmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5kID0gbmQucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRocztcbiAgICB9XG4gICAgcHJvY2Vzc1NlYXJjaEluUHJlb3JkZXIobm9kZU9iaiwgc2VhcmNoVHh0LCBwYXRocywgdGFyZ2V0Tm9kZXMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IF8uZ2V0KG5vZGVPYmosICdkYXRhLm5hbWUnKTtcbiAgICAgICAgLy8gY29uc3Qgbm9kZUlkID0gXy5nZXQobm9kZU9iaiwgJ2RhdGEuaWQnKTtcbiAgICAgICAgY29uc3QgaXNSb290Tm9kZSA9IF8uZ2V0KG5vZGVPYmosICdkYXRhLnJvb3ROb2RlJyk7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Jvb3ROb2RlICYmIGlzUm9vdE5vZGUgPT09ICdZZXMnICYmIG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoVHh0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHRhcmdldE5vZGVzLnB1c2gobm9kZU9iaik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IG5vZGVPYmouY2hpbGRyZW4gPyBub2RlT2JqLmNoaWxkcmVuIDogbm9kZU9iai5fY2hpbGRyZW47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBjaGlsZE5vZGVzICYmIGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTZWFyY2hJblByZW9yZGVyKGNoaWxkTm9kZXNbaV0sIHNlYXJjaFR4dCwgcGF0aHMsIHRhcmdldE5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0Tm9kZXM7XG4gICAgfVxuICAgIGNsZWFyU2VhcmNoTGlua0NvbG9ycygpIHtcbiAgICAgICAgdGhpcy5zdmcuc2VsZWN0QWxsKCdwYXRoLmxpbmsnKS5lYWNoKCBmdW5jdGlvbiAodGhpczogYW55LCAgZDphbnkpIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnc3Ryb2tlJywgJ3doaXRlJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN2Zy5zZWxlY3RBbGwoJ2NpcmNsZScpLnN0eWxlKCdmaWxsJywgZnVuY3Rpb24gKGQ6YW55KSB7XG4gICAgICAgICAgICByZXR1cm4gZC5fY2hpbGRyZW4gPyAndmFyKC0tdGFibGVUZXh0KScgOiAnI2ZmZic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9wZW5QYXRocyhwYXRocywgZG9SZXNldCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHBhdGhJZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBhdGhzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBsID0gcGF0aHNbaV07XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuTm9kZXMuaW5kZXhPZihsLmRhdGEuaWQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbk5vZGVzLnB1c2gobC5kYXRhLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXhwYW5kKHBhdGhzW2ldKTtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShsLCBkb1Jlc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGhJZHMucHVzaChsLmRhdGEuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHBhdGhJZHMucHVzaChwYXRoc1sxXS5kYXRhLmlkKTtcbiAgICAgICAgcGF0aElkcy5wdXNoKHBhdGhzWzBdLmRhdGEuaWQpO1xuXG4gICAgICAgIGxldCBjaGlsZHJlbmcgPSBudWxsOyAvLyBnZXQgMm5kIGxldmVsIGRhdGEgbm9kZXMuXG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnKSB7XG4gICAgICAgICAgICBjaGlsZHJlbmcgPSB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlblswXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2VzJykge1xuICAgICAgICAgICAgY2hpbGRyZW5nID0gdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bMV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdpZGVudGl0aWVzJykge1xuICAgICAgICAgICAgY2hpbGRyZW5nID0gdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bMl07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdlZGdlLXJvdXRlcnMnKSB7XG4gICAgICAgICAgICBjaGlsZHJlbmcgPSB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlblszXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVyLXBvbGljaWVzJykge1xuICAgICAgICAgICAgY2hpbGRyZW5nID0gdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bNF07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJykge1xuICAgICAgICAgICAgY2hpbGRyZW5nID0gdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW5bNV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmRkX2NoaWxkcyA9IGNoaWxkcmVuZy5jaGlsZHJlbiA/IGNoaWxkcmVuZy5jaGlsZHJlbiA6IGNoaWxkcmVuZy5fY2hpbGRyZW47IC8vIDJuZCBsZXZlbCBjaGFpbGRzLiBncm91cHMvY2hpbGRyZW5zXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmRkX2NoaWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gMnN0IGxldmVsXG4gICAgICAgICAgICAvLyAgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZW5kcG9pbnRzJyB8fCB0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2VzJykge1xuICAgICAgICAgICAgaWYgKG5kZF9jaGlsZHNbaV0uZGF0YS50eXBlID09PSAnR3JvdXAnKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBncm91cHNcbiAgICAgICAgICAgICAgICBjb25zdCBkMSA9IG5kZF9jaGlsZHNbaV07IC8vZ2V0IGdyb3VwXG4gICAgICAgICAgICAgICAgaWYgKGQxICYmIHBhdGhzWzFdLmRhdGEuaWQgPT09IGQxLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4wID0gZDEuY2hpbGRyZW4gPyBkMS5jaGlsZHJlbiA6IGQxLl9jaGlsZHJlbjsgLy8gM3JkIGxldmVsIGNoaWxkc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBjaGlsZHJlbjAuZmlsdGVyKGZ1bmN0aW9uIChyZXBsT2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsT2IuZGF0YS5pZCA9PT0gcGF0aHNbMF0uZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGQxLmNoaWxkcmVuID0gYXJyO1xuICAgICAgICAgICAgICAgICAgICBkMS5fY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJncnAgPSBuZGRfY2hpbGRzLmZpbHRlcihmdW5jdGlvbiAocmVwbE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxPYmouZGF0YS5pZCA9PT0gZDEuZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuZy5jaGlsZHJlbiA9IGFycmdycDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubmV0d29ya0dyYXBoLCBkb1Jlc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5nLmRhdGEuaWQgPT09IHBhdGhzWzFdLmRhdGEuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyID0gbmRkX2NoaWxkcy5maWx0ZXIoZnVuY3Rpb24gKHJlcGxPYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxPYi5kYXRhLmlkID09PSBwYXRoc1swXS5kYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5nLmNoaWxkcmVuID0gYXJyO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbmcuX2NoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubmV0d29ya0dyYXBoLCBkb1Jlc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRhbm9kZXMgPSBudWxsOyAvLyBnZXQgMm5kIGxldmVsIGRhdGEgbm9kZXMuXG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnKSB7XG4gICAgICAgICAgICBkYXRhbm9kZXMgPSB0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLmNoaWxkcmVuWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZXMnKSB7XG4gICAgICAgICAgICBkYXRhbm9kZXMgPSB0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLmNoaWxkcmVuWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnaWRlbnRpdGllcycpIHtcbiAgICAgICAgICAgIGRhdGFub2RlcyA9IHRoaXMubmV0d29ya0dyYXBoLmRhdGEuY2hpbGRyZW5bMl07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdlZGdlLXJvdXRlcnMnKSB7XG4gICAgICAgICAgICBkYXRhbm9kZXMgPSB0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLmNoaWxkcmVuWzNdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnZWRnZS1yb3V0ZXItcG9saWNpZXMnKSB7XG4gICAgICAgICAgICBkYXRhbm9kZXMgPSB0aGlzLm5ldHdvcmtHcmFwaC5kYXRhLmNoaWxkcmVuWzRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llcycpIHtcbiAgICAgICAgICAgIGRhdGFub2RlcyA9IHRoaXMubmV0d29ya0dyYXBoLmRhdGEuY2hpbGRyZW5bNV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGFub2Rlcy5pZCA9PT0gcGF0aHNbMV0uZGF0YS5pZCkge1xuICAgICAgICAgICAgY29uc3QgYXJyID0gZGF0YW5vZGVzLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAocmVwbE9iKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxPYi5pZCA9PT0gcGF0aHNbMF0uZGF0YS5pZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YW5vZGVzLmNoaWxkcmVuID0gYXJyO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubmV0d29ya0dyYXBoLCBkb1Jlc2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwTm9kZXMgPSBkYXRhbm9kZXMuY2hpbGRyZW47XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGdyb3VwTm9kZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBOb2Rlc1trXS5pZCA9PT0gcGF0aHNbMV0uZGF0YS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBzZWFyY2hlZCBncm91cCBub2RlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IGdyb3VwTm9kZXNba10uY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChyZXBsT2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsT2IuaWQgPT09IHBhdGhzWzBdLmRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBncm91cE5vZGVzW2tdLmNoaWxkcmVuID0gYXJyO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJncnAgPSBncm91cE5vZGVzLmZpbHRlcihmdW5jdGlvbiAocmVwbE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxPYmouaWQgPT09IHBhdGhzWzFdLmRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBkYXRhbm9kZXMuY2hpbGRyZW4gPSBhcnJncnA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZSh0aGlzLm5ldHdvcmtHcmFwaCwgZG9SZXNldCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVHJlZSh0aGlzLm5ldHdvcmtHcmFwaCwgZG9SZXNldCk7XG4gICAgICAgIHRoaXMuc2VhcmNoUm9vdE5vZGUgPSBwYXRoc1sxXTtcblxuICAgICAgICB0aGlzLnN2Zy5zZWxlY3RBbGwoJy5saW5rJykuZWFjaChmdW5jdGlvbiAodGhpczphbnksIGQ6YW55KSB7XG4gICAgICAgICAgICBpZiAocGF0aElkcy5pbmRleE9mKGQuZGF0YS5pZCkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnc3Ryb2tlJywgJ3JlZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ3N0cm9rZScsICd3aGl0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldFNlYXJjaE5vZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFJvb3ROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IF8uY2xvbmVEZWVwKHRoaXMuYmFzZU5ldHdvcmtHcmFwaCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUodGhpcy5uZXR3b3JrR3JhcGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRUcmVlKGNsZWFyU2VhcmNoKSB7XG4gICAgICAgIHRoaXMucmVzZXRTZWFyY2hOb2RlKCk7XG4gICAgICAgIGlmIChjbGVhclNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaEZpbHRlcigpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaFR5cGUoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5vcGVuTm9kZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMub3Blbk5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKGQgJiYgZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gZC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBkLmNoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMubm9kZXNbaV07XG4gICAgICAgICAgICBpZiAoZCAmJiBkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2hMaW5rQ29sb3JzKCk7XG4gICAgICAgIHRoaXMub3Blbk5vZGVzID0gW107XG4gICAgICAgIHRoaXMuc2l6ZVRvRml0KCk7XG4gICAgICAgIHRoaXMucmVzZXRab29tKCk7XG4gICAgfVxuICAgIGV4cGFuZChkKSB7XG4gICAgICAgIGlmIChkLl9jaGlsZHJlbikge1xuICAgICAgICAgICAgZC5jaGlsZHJlbiA9IGQuX2NoaWxkcmVuO1xuICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29sbGFwc2UoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW5Ob2Rlcy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gdGhpcy5ub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgZmlsdGVyU2VhcmNoQXJyYXkoKSB7XG4gICAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5yZXNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlRXJyb3IgPSAhXy5pc0VtcHR5KHRoaXMuZmlsdGVyVGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gW107XG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtcG9saWNpZXMnKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLnNlcnZpY2VQb2xpY2llc1RyZWVOb2Rlcy5maWx0ZXIoKG9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdzZXJ2aWNlcycpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuc2VydmljZXNUcmVlTm9kZXMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgICAgICAgICAgICAgb3B0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb3VyY2VUeXBlID09PSAnaWRlbnRpdGllcycpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuaWRlbnRpdGllc1RyZWVOb2Rlcy5maWx0ZXIoKG9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICBvcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvdXJjZVR5cGUgPT09ICdlZGdlLXJvdXRlcnMnKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLmVkZ2Vyb3V0ZXJzVHJlZU5vZGVzLmZpbHRlcigob3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgIG9wdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ2VkZ2Utcm91dGVyLXBvbGljaWVzJykge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5lclBvbGljaWVzVHJlZU5vZGVzLmZpbHRlcigob3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgIG9wdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc291cmNlVHlwZSA9PT0gJ3NlcnZpY2UtZWRnZS1yb3V0ZXItcG9saWNpZXMnKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLnNlcnZpY2VFZGdlUm91dGVyUG9saWN5VHJlZU5vZGVzLmZpbHRlcigob3B0aW9uKSA9PlxuICAgICAgICAgICAgICAgIG9wdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgfVxuICAgem9vbUluKCkge1xuXG4gICB9XG4gICB6b29tT3V0KCkge1xuXG4gICB9XG4gICAgY2xlYXJTZWFyY2hGaWx0ZXIoKSB7XG4gICAgICAgIHRoaXMucmVzb3VyY2VUeXBlRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuZmlsdGVyU2VhcmNoQXJyYXkoKTtcbiAgICAgICAgdGhpcy5yZXNldFNlYXJjaE5vZGUoKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZSgpO1xuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoTGlua0NvbG9ycygpO1xuICAgIH1cblxuICAgIGNsZWFyU2VhcmNoVHlwZSgpIHtcbiAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGUgPSAnJztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gW107XG4gICAgfVxuXG4gICByZXNldFpvb20oKSB7XG4gICAgICAgLy8gY29uc3QgY3VycmVudFpvb20gPSB0aGlzLmdldFpvb21TY2FsZSgpO1xuICAgICAgIGNvbnN0IHRyYW5zZm9ybTogYW55ID0gdGhpcy50cmFuc2Zvcm0gfHwgXy5jbG9uZURlZXAoZDMuem9vbUlkZW50aXR5KTtcbiAgICAgICB0cmFuc2Zvcm0uayA9IDE7XG4gICAgICAgdGhpcy5zdmcuYXR0cigndHJhbnNmb3JtJywgdHJhbnNmb3JtKTtcbiAgIH1cblxuICBpbml0VG9wb1ZpZXcoKSB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBtYXJnaW4gPSB7IHRvcDogMjAsIHJpZ2h0OiAxOTAsIGJvdHRvbTogMzAsIGxlZnQ6IDAgfTtcbiAgICAgICAgLy8gY29uc3Qgd2lkdGggPSAxNjAwIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSAgbWFyZ2luLnJpZ2h0O1xuICAgICAgICAvLyBjb25zdCBoZWlnaHQgPSAxNjAwIC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b207XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIG1hcmdpbi5ib3R0b207XG5cbiAgICAgICAgdGhpcy50cmVldG9vbHRpcCA9IGQzLnNlbGVjdCgnI3Rvb2x0aXAnKTtcblxuICAgICAgICB0aGlzLnJlc291cmNlVHlwZUVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnJlc291cmNlVHlwZSA9ICcnO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZVpvb20gPSAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdmcuYXR0cigndHJhbnNmb3JtJywgZS50cmFuc2Zvcm0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnpvb20gPSBkMy56b29tKCkub24oJ3pvb20nLCBoYW5kbGVab29tKTtcblxuICAgICAgICB0aGlzLnN2ZyA9IGQzXG4gICAgICAgICAgICAuc2VsZWN0KCcjTmV0d29ya1Zpc3VhbGl6ZXJTVkcnKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgICAgICAgIC5jYWxsKHRoaXMuem9vbSlcbiAgICAgICAgICAgIC5hdHRyKCd2aWV3Qm94JywgJy0yMCAtNDUwICcgKyAod2lkdGggLSBtYXJnaW4udG9wKjIgLSBtYXJnaW4uYm90dG9tKSArICcgJyArICsoaGVpZ2h0KjIgLW1hcmdpbi5ib3R0b20pKVxuICAgICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgLTIwICsgJywnICsgMjAwICsgJyknKTtcblxuICAgICAgICBkMy5zZWxlY3QoJ2JvZHknKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkMy5zZWxlY3QoJyN0b3BvY29udGV4dG1lbnUnKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGQzLnNlbGVjdEFsbCgnZyA+IConKS5yZW1vdmUoKTtcblxuICAgICAgICB0aGlzLnRyZWVtYXAgPSBkMy50cmVlKCkubm9kZVNpemUoWzEwMCwgMjBdKTtcblxuICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC54ID0gMTAwOyAvLyBoZWlnaHQgLyA0O1xuICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC55ID0gMTAwO1xuICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5mb3JFYWNoKGNvbGxhcHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVUcmVlKHRoaXMubmV0d29ya0dyYXBoKTtcblxuICAgICAgICBfLmRlbGF5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtID0gZDMuem9vbUlkZW50aXR5O1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ueCA9IC0yMDA7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS55ID0gMjA1O1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uayA9IDE7XG4gICAgICAgICAgICB0aGlzLnN2Zy50cmFuc2l0aW9uKCkuZHVyYXRpb24oNzUwKS5hdHRyKCd0cmFuc2Zvcm0nLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIH0sIDYwMCk7XG5cbiAgICAgICAgZnVuY3Rpb24gY29sbGFwc2UoZCkge1xuICAgICAgICAgICAgaWYgKGQuZGF0YS5yb290Tm9kZSA9PT0gJ1llcycpIHtcbiAgICAgICAgICAgICAgICBkLmRhdGEuY2xpY2tQcm9jZXNzID0gJ05vdCBZZXQnO1xuICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuLmZvckVhY2goY29sbGFwc2UpO1xuICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gIH1cblxuICAgIHVwZGF0ZVRyZWUoc291cmNlLCBkb1Jlc2V0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGRvUmVzZXQpIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdEFsbCgnZyA+IConKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IDc1MDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudHJlZURhdGEgPSB0aGlzLnRyZWVtYXAodGhpcy5uZXR3b3JrR3JhcGgpO1xuICAgICAgICAgICAgdGhpcy5ub2RlcyA9IHRoaXMudHJlZURhdGEuZGVzY2VuZGFudHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlua3MgPSB0aGlzLnRyZWVEYXRhLmRlc2NlbmRhbnRzKCkuc2xpY2UoMSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6YW55KSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGJ1aWxkaW5nIHRyZWUgb2JqZWN0OiAnKyBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN2Z0RlZnMgPSB0aGlzLnN2Zy5hcHBlbmQoJ2RlZnMnKTtcbiAgICAgICAgY29uc3QgbGluZWFyR3JhZGllbnQgPSBzdmdEZWZzLmFwcGVuZCgnbGluZWFyR3JhZGllbnQnKS5hdHRyKCdpZCcsICdOb2RlR3JhZGllbnQnKTtcbiAgICAgICAgbGluZWFyR3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignY2xhc3MnLCAnc3RvcDEnKS5hdHRyKCdvZmZzZXQnLCAnMCUnKTtcbiAgICAgICAgbGluZWFyR3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignY2xhc3MnLCAnc3RvcDInKS5hdHRyKCdvZmZzZXQnLCAnNTAlJyk7XG4gICAgICAgIGxpbmVhckdyYWRpZW50LmFwcGVuZCgnc3RvcCcpLmF0dHIoJ2NsYXNzJywgJ3N0b3AzJykuYXR0cignb2Zmc2V0JywgJzEwMCUnKTtcblxuICAgICAgICBjb25zdCBsaW5lYXJHcmFkaWVudDIgPSBzdmdEZWZzLmFwcGVuZCgnbGluZWFyR3JhZGllbnQnKS5hdHRyKCdpZCcsICdOb2RlSG92ZXJHcmFkaWVudCcpO1xuICAgICAgICBsaW5lYXJHcmFkaWVudDIuYXBwZW5kKCdzdG9wJykuYXR0cignY2xhc3MnLCAnc3RvcDFhJykuYXR0cignb2Zmc2V0JywgJzAlJyk7XG4gICAgICAgIGxpbmVhckdyYWRpZW50Mi5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdjbGFzcycsICdzdG9wMmEnKS5hdHRyKCdvZmZzZXQnLCAnNTAlJyk7XG4gICAgICAgIGxpbmVhckdyYWRpZW50Mi5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdjbGFzcycsICdzdG9wM2EnKS5hdHRyKCdvZmZzZXQnLCAnMTAwJScpO1xuXG4gICAgICAgIHRoaXMubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgZC55ID0gZC5kZXB0aCAqIDQwMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubm9kZSA9IHRoaXMuc3ZnLnNlbGVjdEFsbCgnZy5ub2RlJykuZGF0YSh0aGlzLm5vZGVzLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuZGF0YS5pZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ub2RlRW50ZXIgPSB0aGlzLm5vZGVcbiAgICAgICAgICAgIC5lbnRlcigpXG4gICAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIChkKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ0VkZ2UgUm91dGVycycpIHx8IF8uaW5jbHVkZXMoZC5kYXRhLnR5cGUsICdFZGdlIFJvdXRlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdlZGdlLXJvdXRlcic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKGQuZGF0YS5uYW1lLCAnSWRlbnRpdGllcycpIHx8IF8uaW5jbHVkZXMoZC5kYXRhLnR5cGUsICdJZGVudGl0eScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdlbmRwb2ludCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfLnN0YXJ0c1dpdGgoZC5kYXRhLm5hbWUsICdTZXJ2aWNlcycpIHx8IF8uc3RhcnRzV2l0aChkLmRhdGEudHlwZSwgJ1NlcnZpY2UnKSkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAnc2VydmljZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfLnN0YXJ0c1dpdGgoZC5kYXRhLm5hbWUsICdCaW5kLVNlcnZpY2VzJykgfHwgXy5zdGFydHNXaXRoKGQuZGF0YS5uYW1lLCAnRGlhbC1TZXJ2aWNlcycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdzZXJ2aWNlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ0JpbmRQb2xpY2llcycpIHx8IF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ0RpYWxQb2xpY2llcycpIHx8IF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ0JpbmRQb2xpY3knKSApIHtcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdzZXJ2aWNlLXBvbGljeSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKGQuZGF0YS5uYW1lLCAnU2VydmljZSBQb2xpY2llcycpIHx8IF8uaW5jbHVkZXMoZC5kYXRhLnR5cGUsICdTZXJ2aWNlUG9saWN5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJ3NlcnZpY2UtcG9saWN5JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ0VkZ2UgUm91dGVyIFBvbGljaWVzJykgfHwgXy5zdGFydHNXaXRoKGQuZGF0YS50eXBlLCAnUm91dGVyIFBvbGljeScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICdlZGdlLXJvdXRlci1wb2xpY3knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uc3RhcnRzV2l0aChkLmRhdGEubmFtZSwgJ1NlcnZpY2UgRWRnZSBSb3V0ZXIgUG9saWNpZXMnKSB8fFxuICAgICAgICAgICAgICAgICAgICBfLnN0YXJ0c1dpdGgoZC5kYXRhLnR5cGUsICdTZXJ2aWNlIFJvdXRlciBQb2xpY3knKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAnc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY3knO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGQuX2NoaWxkcmVuID8gJ25vZGUgJyArIGNsYXNzTmFtZSA6ICdub2RlIHRlcm1pbmF0ZSAnICsgY2xhc3NOYW1lO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlICYmIHNvdXJjZS54KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBzb3VyY2UueSArICcsJyArIHNvdXJjZS54ICsgJyknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnkgKyAnLCcgKyBkLnggKyAnKSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ub2RlRW50ZXIub24oJ2NvbnRleHRtZW51JywgKGV2ZW50LCBkKSA9PiB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZDMuc2VsZWN0KCcjdG9vbHRpcCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgIGNvbnN0IG53ID0gdGhpcy5jdXJyZW50TmV0d29yaztcbiAgICAgICAgICAgIGNvbnN0IHJhd0VkZ2Vyb3V0ZXJzID0gdGhpcy5lZGdlcm91dGVycztcbiAgICAgICAgICAgIGNvbnN0IHJhd0VuZHBvaW50cyA9IHRoaXMuaWRlbnRpdGllcztcbiAgICAgICAgICAgIGNvbnN0IHJhd0FwcHdhbnMgPSB0aGlzLnNlcnZpY2VfcG9saWNpZXM7XG4gICAgICAgICAgICBjb25zdCBlZGdlUm91dGVyUG9saWNpZXMgPSB0aGlzLnJvdXRlcl9wb2xpY2llcztcblxuICAgICAgICAgICAgaWYgKGQgJiYgZC5kYXRhICYmIGQuZGF0YS5jb250ZXh0TWVudSA9PT0gJ1llcycpIHtcbiAgICAgICAgICAgICAgICBkMy5zZWxlY3QoJyN0b3BvY29udGV4dG1lbnUnKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdsZWZ0JywgZXZlbnQub2Zmc2V0WCArICdweCcpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgndG9wJywgZXZlbnQub2Zmc2V0WSArICdweCcpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgb2JqID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEudHlwZSA9PT0gJ0lkZW50aXR5Jykge1xuICAgICAgICAgICAgICAgaWYoZC5kYXRhLnN0YXR1cyA9PT0gXCJSZWdpc3RlcmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlTaW5nbGVVVCcpO1xuICAgICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaUZMU2luZ2xlUm91dGVyJyk7XG4gICAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpU2luZ2xlTFQnKTtcbiAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZVVUJyk7XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUZMU2luZ2xlUm91dGVyJyk7XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZUxUJyk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaU1ldCcpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlWQycpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlFVicpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpSW5zJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlBTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVBzJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTEFsbCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRkxTaW5nbGVSb3V0ZXInKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZUxUJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlDTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpTFQnKTtcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIG9iaiA9IG5ldyBJZGVudGl0eSgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3RW5kcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXdFbmRwb2ludHNbaV0uaWQgPT09IGQuZGF0YS51dWlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSByYXdFbmRwb2ludHNbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRtZW51Tm9kZVR5cGUgPSAnaWRlbnRpdHknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEudHlwZSA9PT0gJ0VkZ2UgUm91dGVyJykge1xuICAgICAgICAgICAgICBpZihkLmRhdGEuc3RhdHVzID09PSBcIlBST1ZJU0lPTkVEXCIpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpU2luZ2xlVVQnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpRkxTaW5nbGVSb3V0ZXInKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpU2luZ2xlTFQnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZVVUJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTFNpbmdsZVJvdXRlcicpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpU2luZ2xlTFQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaU1ldCcpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlWQycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpSW5zJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlFVicpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlBTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVBzJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTEFsbCcpO1xuXG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlDTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpTFQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRtZW51Tm9kZVR5cGUgPSAnZWRnZS1yb3V0ZXInO1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgb2JqID0gbmV3IEVkZ2VSb3V0ZXJWMigpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3RWRnZXJvdXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhd0VkZ2Vyb3V0ZXJzW2ldLmlkID09PSBkLmRhdGEudXVpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gcmF3RWRnZXJvdXRlcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZCAmJiBkLmRhdGEgJiYgZC5kYXRhLnR5cGUgPT09ICdTZXJ2aWNlJykge1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlNZXQnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpVkMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUlucycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVYnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUFMJyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaUVQcycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRkxBbGwnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUZMU2luZ2xlUm91dGVyJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVMVCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpQ0wnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUxUJyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaVNpbmdsZVVUJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0bWVudU5vZGVUeXBlID0gJ3NlcnZpY2UnO1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgb2JqID0gbmV3IFBsYXRmb3JtU2VydmljZSgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXJ2aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlc1tpXS5pZCA9PT0gZC5kYXRhLnV1aWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IHRoaXMuc2VydmljZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZCAmJiBkLmRhdGEgJiYgZC5kYXRhLnR5cGUgPT09ICdBcHBXQU4nKSB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlNZXQnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpVkMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUlucycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVYnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUFMJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlFUHMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUZMQWxsJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTFNpbmdsZVJvdXRlcicpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpU2luZ2xlTFQnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUNMJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlMVCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpU2luZ2xlVVQnKTtcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIG9iaiA9IG5ldyBTZXJ2aWNlUG9saWN5KCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdBcHB3YW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXdBcHB3YW5zW2ldLmlkID09PSBkLmRhdGEudXVpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gcmF3QXBwd2Fuc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dG1lbnVOb2RlVHlwZSA9ICdhcHB3YW4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEudHlwZSA9PT0gJ1JvdXRlciBQb2xpY3knKSB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlNZXQnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUlucycpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlWQycpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVYnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUFMJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlFUHMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUZMU2luZ2xlUm91dGVyJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVMVCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRkxBbGwnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUNMJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlMVCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpU2luZ2xlVVQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRtZW51Tm9kZVR5cGUgPSAncm91dGVyLXBvbGljeSc7XG4gICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgb2JqID0gbmV3IEVkZ2VSb3V0ZXJQb2xpY3lWMigpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZVJvdXRlclBvbGljaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGdlUm91dGVyUG9saWNpZXNbaV0uaWQgPT09IGQuZGF0YS51dWlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBlZGdlUm91dGVyUG9saWNpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICovXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGQgJiYgZC5kYXRhICYmIGQuZGF0YS50eXBlID09PSAnTmV0d29yaycpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpTWV0Jyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlJbnMnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpVkMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUVWJyk7XG4gICAgICAgICAgICAgICAgZW5hYmxlTGkoJyNsaUFMJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlFUHMnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpRkxBbGwnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUZMU2luZ2xlUm91dGVyJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlTaW5nbGVMVCcpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlDTCcpO1xuICAgICAgICAgICAgICAgIGVuYWJsZUxpKCcjbGlMVCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpU2luZ2xlVVQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRtZW51Tm9kZVR5cGUgPSAnbmV0d29yayc7XG4gICAgICAgICAgICAgICAgb2JqID0gbnc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGQgJiYgZC5kYXRhICYmIGQuZGF0YS50eXBlID09PSAnU2VydmljZSBSb3V0ZXIgUG9saWN5Jykge1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpTWV0Jyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlJbnMnKTtcbiAgICAgICAgICAgICAgICBlbmFibGVMaSgnI2xpVkMnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaUVWJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlBTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRVBzJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlGTEFsbCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpRkxTaW5nbGVSb3V0ZXInKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZUxUJyk7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUxpKCcjbGlDTCcpO1xuICAgICAgICAgICAgICAgIGRpc2FibGVMaSgnI2xpTFQnKTtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTGkoJyNsaVNpbmdsZVVUJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0bWVudU5vZGVUeXBlID0gJ3NlcnZpY2Utcm91dGVyLXBvbGljeSc7XG4gICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIG9iaiA9IG5ldyBTZXJ2aWNlRWRnZVJvdXRlclBvbGljeSgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlX3JvdXRlcl9wb2xpY2llc1tpXS5pZCA9PT0gZC5kYXRhLnV1aWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IHRoaXMuc2VydmljZV9yb3V0ZXJfcG9saWNpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGV4dG1lbnVOb2RlID0gb2JqO1xuICAgICAgICAgICAgZDMuc2VsZWN0KCcjdG9vbHRpcCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jaXJjbGVzID0gdGhpcy5ub2RlRW50ZXJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbm9kZScpXG4gICAgICAgICAgICAuYXR0cigncicsIDEwKVxuICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC5fY2hpbGRyZW4gPyAndmFyKC0tdGFibGVUZXh0KScgOiAnI2ZmZic7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQsIHNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1RyZWVUb29sdGlwKGV2ZW50LCBzb3VyY2UpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCB0aGlzLnJlbW92ZVRyZWVUb29sdGlwKVxuICAgICAgICAgICAgLm9uKCdjb250ZXh0bWVudScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdjbGljaycsIGFzeW5jIChldmVudCwgZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkICYmIGQuZGF0YSAmJiBkLmRhdGEuY29udGV4dE1lbnUgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGQzLnNlbGVjdCgnI3RvcG9jb250ZXh0bWVudScpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZDMuc2VsZWN0KCcjdG9vbHRpcCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICBpZiAoZC5jaGlsZHJlbiAmJiBkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm9wZW5Ob2Rlcy5pbmRleE9mKGQuZGF0YS5pZCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5Ob2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gZC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgZC5jaGlsZHJlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3Blbk5vZGVzLmluZGV4T2YoZC5kYXRhLmlkKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3Blbk5vZGVzLnB1c2goZC5kYXRhLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZC5kYXRhLmNsaWNrUHJvY2VzcyA9PT0gJ05vdCBZZXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkLl9jaGlsZHJlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlID09PSAnWWVzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS50eXBlID09PSAnSWRlbnRpdHknICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5fY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9ICBhd2FpdCB0aGlzLnRyZWVOb2RlUHJvY2Vzc29yLnByb2Nlc3NJZGVudGl0aWVzRm9yTm9kZUNsaWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZGVudGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56aXRpU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCA9IGFyclsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGFyclswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5jbGlja1Byb2Nlc3MgPSAnQ29tcGxldGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaC5jaGlsZHJlbi5maW5kKChuZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUZldyhuZCwgdGhpcy5vcGVuTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnJvb3ROb2RlID09PSAnWWVzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS50eXBlID09PSAnU2VydmljZScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5jaGlsZHJlbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkLl9jaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyID0gYXdhaXQgdGhpcy50cmVlTm9kZVByb2Nlc3Nvci5wcm9jZXNzU2VydmljZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlxSWQgPSBhcnJbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGggPSBhcnJbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLmNsaWNrUHJvY2VzcyA9ICdDb21wbGV0ZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuLmZpbmQoKG5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlRmV3KG5kLCB0aGlzLm9wZW5Ob2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEucm9vdE5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEucm9vdE5vZGUgPT09ICdZZXMnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnR5cGUgPT09ICdTZXJ2aWNlUG9saWN5JyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkLmNoaWxkcmVuICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuX2NoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBhd2FpdCB0aGlzLnRyZWVOb2RlUHJvY2Vzc29yLnByb2Nlc3NTZXJ2aWNlUG9saWNpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VfcG9saWNpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCA9IGFyclsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGFyclswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEuY2xpY2tQcm9jZXNzID0gJ0NvbXBsZXRlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW4uZmluZCgobmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VGZXcobmQsIHRoaXMub3Blbk5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUoZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5yb290Tm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5yb290Tm9kZSA9PT0gJ1llcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEudHlwZSA9PT0gJ0VkZ2UgUm91dGVyJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkLmNoaWxkcmVuICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuX2NoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBhd2FpdCB0aGlzLnRyZWVOb2RlUHJvY2Vzc29yLnByb2Nlc3NFZGdlcm91dGVyc0Zvck5vZGVDbGljayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCA9IGFyclsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGFyclswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEuY2xpY2tQcm9jZXNzID0gJ0NvbXBsZXRlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW4uZmluZCgobmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VGZXcobmQsIHRoaXMub3Blbk5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUoZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5yb290Tm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZGF0YS5yb290Tm9kZSA9PT0gJ1llcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEudHlwZSA9PT0gJ1JvdXRlciBQb2xpY3knICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5fY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IGF3YWl0IHRoaXMudHJlZU5vZGVQcm9jZXNzb3IucHJvY2Vzc0VkZ2VSb3V0ZXJQb2xpY2llc0Zvck5vZGVDbGljayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyX3BvbGljaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmlxSWQgPSBhcnJbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGggPSBhcnJbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLmNsaWNrUHJvY2VzcyA9ICdDb21wbGV0ZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLmNoaWxkcmVuLmZpbmQoKG5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlRmV3KG5kLCB0aGlzLm9wZW5Ob2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlKGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEucm9vdE5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEucm9vdE5vZGUgPT09ICdZZXMnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kYXRhLnR5cGUgPT09ICdTZXJ2aWNlIFJvdXRlciBQb2xpY3knICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWQuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5fY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IGF3YWl0IHRoaXMudHJlZU5vZGVQcm9jZXNzb3IucHJvY2Vzc1NlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV0d29ya0dyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Vfcm91dGVyX3BvbGljaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXFJZCA9IGFyclsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ldHdvcmtHcmFwaCA9IGFyclswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRhdGEuY2xpY2tQcm9jZXNzID0gJ0NvbXBsZXRlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXR3b3JrR3JhcGguY2hpbGRyZW4uZmluZCgobmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VGZXcobmQsIHRoaXMub3Blbk5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyZWUoZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBkLl9jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBkLl9jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZC5fY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkLmNoaWxkcmVuIHx8IGQuX2NoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJlZShkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb290Tm9kZSA9IF8uZ2V0KGQsICdkYXRhLmNoaWxkcmVuWzBdLnJvb3ROb2RlJywgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnJvb3ROb2RlID0gXy5nZXQoZCwgJ2RhdGEucm9vdE5vZGUnLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKHJvb3ROb2RlID09PSAnWWVzJyB8fCBzdWJyb290Tm9kZSA9PT0gJ1llcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9vdE5vZGVpc1llc0NvbG9yQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ub2RlRW50ZXJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsICc1MCcpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCAnMzMwJylcbiAgICAgICAgICAgIC5hdHRyKCd4JywgJzEwJylcbiAgICAgICAgICAgIC5hdHRyKCd5JywgJy0yNScpXG4gICAgICAgICAgICAuYXBwZW5kKCd4aHRtbDpib2R5JylcbiAgICAgICAgICAgIC5zdHlsZSgnYmFja2dyb3VuZCcsICd0cmFuc3BhcmVudCcpXG4gICAgICAgICAgICAuaHRtbChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cInRleHQtY29udGFpbmVyXCI8c3Bhbj4ke2QuZGF0YS5uYW1lfTwvc3Bhbj5gO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ub2RlVXBkYXRlID0gdGhpcy5ub2RlRW50ZXIubWVyZ2UodGhpcy5ub2RlKTtcblxuICAgICAgICB0aGlzLm5vZGVVcGRhdGVcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgICAgIC5kdXJhdGlvbihkdXJhdGlvbilcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnkgKyAnLCcgKyBkLnggKyAnKSc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm5vZGVVcGRhdGUuc2VsZWN0KCdjaXJjbGUubm9kZScpLmF0dHIoJ3InLCAxOCkuYXR0cignY3Vyc29yJywgJ3BvaW50ZXInKTtcblxuICAgICAgICB0aGlzLm5vZGVFeGl0ID0gdGhpcy5ub2RlXG4gICAgICAgICAgICAuZXhpdCgpXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlICYmIHNvdXJjZS54KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBzb3VyY2UueSArICcsJyArIHNvdXJjZS54ICsgJyknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnkgKyAnLCcgKyBkLnggKyAnKSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcblxuICAgICAgICB0aGlzLm5vZGVFeGl0LnNlbGVjdCgnY2lyY2xlJykuYXR0cigncicsIDApO1xuXG4gICAgICAgIHRoaXMubm9kZUV4aXQuc2VsZWN0KCd0ZXh0Jykuc3R5bGUoJ2ZpbGwtb3BhY2l0eScsIDEwKTtcblxuICAgICAgICB0aGlzLmxpbmsgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJ3BhdGgubGluaycpLmRhdGEodGhpcy5saW5rcywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmRhdGEuaWQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmxpbmtVcGRhdGUgPSB0aGlzLmxpbmtcbiAgICAgICAgICAgIC5lbnRlcigpXG4gICAgICAgICAgICAuaW5zZXJ0KCdwYXRoJywgJ2cnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpbmsnKVxuICAgICAgICAgICAgLmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIGxldCBvO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgJiYgc291cmNlLngpIHtcbiAgICAgICAgICAgICAgICAgICAgbyA9IHsgeDogc291cmNlLngsIHk6IHNvdXJjZS55IH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbyA9IHsgeDogZC54LCB5OiBkLnkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpYWdvbmFsKG8sIG8sICcxJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm1lcmdlKHRoaXMubGluayk7XG5cbiAgICAgICAgdGhpcy5saW5rVXBkYXRlXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pXG4gICAgICAgICAgICAuYXR0cignZCcsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpYWdvbmFsKGQsIGQucGFyZW50LCAnMicpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5saW5rRXhpdCA9IHRoaXMubGlua1xuICAgICAgICAgICAgLmV4aXQoKVxuICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKVxuICAgICAgICAgICAgLmF0dHIoJ2QnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIGxldCBvO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgJiYgc291cmNlLngpIHtcbiAgICAgICAgICAgICAgICAgICAgbyA9IHsgeDogc291cmNlLngsIHk6IHNvdXJjZS55IH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbyA9IHsgeDogZC54LCB5OiBkLnkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpYWdvbmFsKG8sIG8sICczJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlbW92ZSgpO1xuXG4gICAgICAgIHRoaXMubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICBkLngwID0gZC54O1xuICAgICAgICAgICAgZC55MCA9IGQueTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gZGlzYWJsZUxpKGxpSWQpIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdChsaUlkKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBlbmFibGVMaShsaUlkKSB7XG4gICAgICAgICAgICBkMy5zZWxlY3QobGlJZCkuc3R5bGUoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRpYWdvbmFsKHMsIGQsIGxnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gYE0gJHtzLnl9ICR7cy54fVxuICAgICAgICAgICAgIEMgJHsocy55ICsgZC55KSAvIDJ9ICR7cy54fSxcbiAgICAgICAgICAgICAgICR7KHMueSArIGQueSkgLyAyfSAke2QueH0sXG4gICAgICAgICAgICAgICAke2QueX0gJHtkLnh9YDtcblxuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByb290Tm9kZWlzWWVzQ29sb3JDaGFuZ2UoKSB7XG4gICAgICAgICAgICBkMy5zZWxlY3RBbGwoJ2NpcmNsZScpLmVhY2goZnVuY3Rpb24gKGQ6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gXy5nZXQoZCwgJ2RhdGEucm9vdE5vZGUnLCAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xpY2tQcm9jZXNzID0gXy5nZXQoZCwgJ2RhdGEuY2xpY2tQcm9jZXNzJywgJycpO1xuICAgICAgICAgICAgICAgIGlmIChyb290Tm9kZSA9PT0gJ1llcycgJiYgY2xpY2tQcm9jZXNzID09PSAnTm90IFlldCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCdmaWxsJywgJ2Jyb3duJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb290Tm9kZSA9PT0gJ1llcycgJiYgY2xpY2tQcm9jZXNzICE9PSAnTm90IFlldCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPSBkLl9jaGlsZHJlbiA/ICd2YXIoLS10YWJsZVRleHQpJyA6ICcjZmZmJztcbiAgICAgICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY29sbGFwc2VEZXB0aChkLCBpZCkge1xuICAgICAgICAgICAgLy8gdW51c2VkXG4gICAgICAgICAgICBpZiAoZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChkLmRhdGEuaWQgIT09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gZC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4uZm9yRWFjaChjb2xsYXBzZURlcHRoKTtcbiAgICAgICAgICAgICAgICAgICAgZC5jaGlsZHJlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZC5jaGlsZHJlbi5mb3JFYWNoKGNvbGxhcHNlRGVwdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNvbGxhcHNlRmV3KF9uZCwgb3Blbk5vZGVzKSB7XG4gICAgICAgICAgICBpZiAoX25kLmRhdGEuaWQgPT09ICcjYWxsJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfbmQuZGF0YS5yb290Tm9kZSA9PT0gJ1llcycgJiYgX25kLmRhdGEuY2xpY2tQcm9jZXNzID09PSAnTm90IFlldCcpIHtcbiAgICAgICAgICAgICAgICBfbmQuX2NoaWxkcmVuID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX25kLmNoaWxkcmVuICYmIG9wZW5Ob2Rlcy5pbmRleE9mKF9uZC5kYXRhLmlkKSA8IDApIHtcbiAgICAgICAgICAgICAgICBfbmQuX2NoaWxkcmVuID0gX25kLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGlmIChfbmQuX2NoaWxkcmVuKVxuICAgICAgICAgICAgICAgICAgICBfbmQuX2NoaWxkcmVuLmZpbmQoKF9uZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VGZXcoX25kLCBvcGVuTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBfbmQuY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoX25kLmNoaWxkcmVuICYmIG9wZW5Ob2Rlcy5pbmRleE9mKF9uZC5kYXRhLmlkKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9uZC5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgX25kLmNoaWxkcmVuLmZpbmQoKF9uZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VGZXcoX25kLCBvcGVuTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3VyY2UuY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgIF8uZGVsYXkodGhpcy5zaXplVG9GaXQuYmluZCh0aGlzKSwgNjUwKTtcbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIG9mIHVwZGF0ZVRyZWVcblxuICAgIHNpemVUb0ZpdCgpIHtcbiAgICAgICAgY29uc3QgYm91bmRpbmdCb3ggPSB0aGlzLnN2Zy5fZ3JvdXBzWzBdWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBib3R0b21EZWx0YSA9IGJvdW5kaW5nQm94LmhlaWdodCAtIDEwMCAtIC1ib3VuZGluZ0JveC50b3A7XG4gICAgICAgIGNvbnN0IHRvcERlbHRhID0gYm91bmRpbmdCb3guaGVpZ2h0ICsgNTAwIC0gYm91bmRpbmdCb3guYm90dG9tO1xuICAgICAgICBjb25zdCB0b3BPdXRPZlZpZXcgPSB0b3BEZWx0YSA8IDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbU91dE9mVmlldyA9IGJvdHRvbURlbHRhIDwgMDtcblxuICAgICAgICBpZiAoYm90dG9tT3V0T2ZWaWV3IHx8IHRvcE91dE9mVmlldykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnMgPSB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgICAgIHRyYW5zLnkgPSB0b3BPdXRPZlZpZXcgPyA0MDAgOiAwO1xuICAgICAgICAgICAgdGhpcy5zdmcudHJhbnNpdGlvbigpLmR1cmF0aW9uKDc1MCkuYXR0cigndHJhbnNmb3JtJywgdHJhbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZUdyYXBoVG9vbHRpcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JhcGh0b29sdGlwKSB7XG4gICAgICAgICAgICB0aGlzLmdyYXBodG9vbHRpcC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcmF3R3JhcGhUb29sdGlwKGV2ZW50LCBkKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sdGlwJykuaW5uZXJIVE1MID0gdGhpcy5yZWFkR3JhcGhLZXlWYWx1ZXMoZCk7XG4gICAgICAgIHRoaXMuZ3JhcGh0b29sdGlwLnN0eWxlKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgIGNvbnN0IHggPSBldmVudC5wYWdlWCAtIDQwMCArICdweCc7XG4gICAgICAgIGNvbnN0IHkgPSBldmVudC5wYWdlWSArIDEwICsgJ3B4JztcbiAgICAgICAgdGhpcy5ncmFwaHRvb2x0aXAuc3R5bGUoJ2xlZnQnLCB4KTtcbiAgICAgICAgdGhpcy5ncmFwaHRvb2x0aXAuc3R5bGUoJ3RvcCcsIHkpO1xuICAgIH1cblxuICAgIHJlYWRHcmFwaEtleVZhbHVlcyhkKSB7XG4gICAgICAgIGxldCBpbmZvID1cbiAgICAgICAgICAgICc8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxNHB4O2ZvbnQtZmFtaWx5Ok9wZW4gU2FuczsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1jb2xvcjogdmFyKC0tdGFibGVUZXh0KTtcIj4nO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZC5kYXRhKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKCAoaykgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGsgPT09ICd2YWx1ZScgfHxcbiAgICAgICAgICAgICAgICBrID09PSAnZ3JvdXAnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ2luZGV4JyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICdwYXJlbnQnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ2RlcHRoJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICd4JyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICd5JyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICdpZCcgfHxcbiAgICAgICAgICAgICAgICBrID09PSAneDAnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ3kwJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICd2eScgfHxcbiAgICAgICAgICAgICAgICBrID09PSAndngnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ2NoaWxkcmVuJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtWYWw6IGFueSA9IGQuZGF0YVtrXTtcbiAgICAgICAgICAgICAgICBpbmZvID0gaW5mbyArICcgICcgKyBrICsgJyAgOiAgJyArIGtWYWwubGVuZ3RoICsgJzxicj4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FuT2JqZWN0KGQuZGF0YVtrXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga1ZhbDogYW55ID0gZC5kYXRhW2tdO1xuICAgICAgICAgICAgICAgICAgICBpbmZvID0gaW5mbyArICcgICAnICsgayArICcgIDogICcgKyBrVmFsLm5hbWUgKyAnPGJyPic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm8gPSBkLmRhdGFba107XG4gICAgICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJyAgICcgKyBrICsgJyAgOiAgJyArICh2byAhPT0gbnVsbCB8fCB2byAhPT0gJycgPyBkLmRhdGFba10gOiAnTi9BJykgKyAnPGJyPic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluZm8gKyAnPC9zcGFuPic7XG4gICAgfVxuXG4gICAgc2V0Q29sb3IoZCkge1xuICAgICAgICBpZiAoZC5zdGF0dXMgPT09ICdFcnJvcicgJiYgZC5ncm91cCA9PT0gMykge1xuICAgICAgICAgICAgcmV0dXJuICdyZWQnO1xuICAgICAgICB9IGVsc2UgaWYgKGQuc3RhdHVzICE9PSAnRXJyb3InICYmIGQuZ3JvdXAgPT09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiAndmFyKC0tdGFibGVUZXh0KSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ3ZhcigtLXRhYmxlVGV4dCknO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGlja2VkKCkge1xuICAgICAgICB0aGlzLmxpbmtzXG4gICAgICAgICAgICAuYXR0cigneDEnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkLnNvdXJjZS54O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hdHRyKCd5MScsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQuc291cmNlLnk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50YXJnZXQueDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYXR0cigneTInLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkLnRhcmdldC55O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ub2Rlcy5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGQueCArICcsJyArIGQueSArICcpJztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNBbk9iamVjdChvKSB7XG4gICAgICAgIHJldHVybiBvIGluc3RhbmNlb2YgT2JqZWN0ICYmIG8uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICB9XG5cbiAgICByZWFkT2JqZWN0VmFsdWVzKGxpbmtPYmplY3QpIHtcbiAgICAgICAgbGV0IGluZm8gPSAnPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTJweDtmb250LWZhbWlseTogc2Fucy1zZXJpZlwiPic7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhsaW5rT2JqZWN0LmRhdGEpO1xuICAgICAgICBrZXlzLmZvckVhY2goIChrKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0FuT2JqZWN0KGxpbmtPYmplY3QuZGF0YVtrXSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrVmFsOiBhbnkgPSBsaW5rT2JqZWN0LmRhdGFba107XG4gICAgICAgICAgICAgICAgaW5mbyA9IGluZm8gKyAnICAgJyArIGsgKyAnICA6ICAnICsga1ZhbC5pZCArICc8YnI+JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5mbyA9IGluZm8gKyAnICAgJyArIGsgKyAnICA6ICAnICsgbGlua09iamVjdC5kYXRhW2tdICsgJzxicj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluZm8gKyAnPC9zcGFuPic7XG4gICAgfVxuXG4gICAgbm9kZUNvbG9yKGQpIHtcbiAgICAgICAgaWYgKGQuc3RhdHVzID09PSAnRXJyb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gJyNGRjAwMDAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdibHVlJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5vZGVzaGFwZShkKSB7XG4gICAgICAgIGlmIChkLmdyb3VwID09PSAnMycpIHtcbiAgICAgICAgICAgIHJldHVybiAncmVjdCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ2NpcmNsZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsaW5rV2lkdGgoZCkge1xuICAgICAgICBpZiAoZC5ncm91cCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIDEwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcmFnc3RhcnRlZChldmVudCwgZCkge1xuICAgICAgICBpZiAoIWV2ZW50LmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5zaW11bGF0aW9uLmFscGhhVGFyZ2V0KDAuMykucmVzdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIGQuZnggPSBkLng7XG4gICAgICAgIGQuZnkgPSBkLnk7XG4gICAgfVxuXG4gICAgZHJhZ2dlZChkKSB7XG4gICAgICAgIGQuZnggPSBkLng7XG4gICAgICAgIGQuZnkgPSBkLnk7XG4gICAgfVxuXG4gICAgZHJhZ2VuZGVkKGV2ZW50LCBkKSB7XG4gICAgICAgIGlmICghZXZlbnQuYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLnNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBkLmZ4ID0gbnVsbDtcbiAgICAgICAgZC5meSA9IG51bGw7XG4gICAgfVxuICAgIHJlbW92ZVRyZWVUb29sdGlwKCkge1xuICAgICAgICB0aGlzLnRyZWV0b29sdGlwID0gZDMuc2VsZWN0KCcjdG9vbHRpcCcpO1xuICAgICAgICBpZiAodGhpcy50cmVldG9vbHRpcCkge1xuICAgICAgICAgICAgdGhpcy50cmVldG9vbHRpcC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhd1RyZWVUb29sdGlwKGV2ZW50LCBzKSB7XG4gICAgICAgIHRoaXMudHJlZXRvb2x0aXAgPSBkMy5zZWxlY3QoJyN0b29sdGlwJyk7XG4gICAgICAgIHRoaXMudHJlZXRvb2x0aXAuc3R5bGUoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgY29uc3QgeCA9IGV2ZW50LnBhZ2VYICsgJ3B4JztcbiAgICAgICAgY29uc3QgeSA9IGV2ZW50LnBhZ2VZICsgMTUgKyAncHgnO1xuICAgICAgICB0aGlzLnRyZWV0b29sdGlwLnN0eWxlKCdsZWZ0JywgeCk7XG4gICAgICAgIHRoaXMudHJlZXRvb2x0aXAuc3R5bGUoJ3RvcCcsIHkpO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbHRpcCcpLmlubmVySFRNTCA9IHRoaXMucmVhZFRyZWVLZXlWYWx1ZXMoZXZlbnQsIHMpO1xuICAgIH1cbiAgICByZWFkVHJlZUtleVZhbHVlcyhldmVudCwgZCkge1xuICAgICAgICBsZXQgaW5mbyA9ICc8c3Bhbj4nO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZC5kYXRhKTsgLy8gbXAua2V5cygpO1xuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBrID09PSAncHJvdG9jb2wnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ2NvbnRleHRNZW51JyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICd1dWlkJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICdsYXN0SWQnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ2NsaWNrUHJvY2VzcycgfHxcbiAgICAgICAgICAgICAgICBrID09PSAncm9vdE5vZGUnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ2lkJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICdjaGlsZHJlbicgfHxcbiAgICAgICAgICAgICAgICBrID09PSAncGFyZW50JyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICdkZXB0aCcgfHxcbiAgICAgICAgICAgICAgICBrID09PSAneCcgfHxcbiAgICAgICAgICAgICAgICBrID09PSAneScgfHxcbiAgICAgICAgICAgICAgICBrID09PSAncm9vdE5vZGUnIHx8XG4gICAgICAgICAgICAgICAgayA9PT0gJ3gwJyB8fFxuICAgICAgICAgICAgICAgIGsgPT09ICd5MCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvID0gaW5mbyArICcgICAnICsgayArICcgIDogICcgKyBkLmRhdGFba10gKyAnPGJyPic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5mbyArICc8L3NwYW4+JztcbiAgICB9XG5cbiAgaGlkZSgpIHt9XG4gIHRvZ2dsZU1vZGFsU2l6ZSgpIHt9O1xufVxuXG4iLCI8ZGl2IGNsYXNzPVwieml0aS1wYWdlLWNvbnRhaW5lciB6aXRpLWlkZW50aXRpZXMtY29udGFpbmVyXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibmYtbmV0d29yay10b3BvbG9neS1jb250YWluZXJcIiA+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjc3MtaGVhZGVyXCI+e3t0aXRsZX19IDwvZGl2Pjxicj5cblxuICAgICAgPGRpdiAgY2xhc3M9XCJuZi1uZXQtdmlzLWNvbnRyb2xzLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibmYtdG9wb2xvZ3ktem9vbS1jb250YWluZXJcIj5cbiAgICAgICAgICA8IS0tYnV0dG9uIChjbGljayk9XCJ6b29tT3V0KClcIiBjbGFzcz1cIm5mLXRvcG9sb2d5LXpvb20tYnV0dG9uIG1pbnVzXCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiem9vbUluKClcIiBjbGFzcz1cIm5mLXRvcG9sb2d5LXpvb20tYnV0dG9uIHBsdXNcIj48L2J1dHRvbi0tPlxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInJlc2V0VHJlZSgnWWVzJylcIiBjbGFzcz1cInJlc2V0LWJ1dHRvblwiIHRpdGxlPVwiUmVzZXRcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIChjaGFuZ2UpPVwicmVzb3VyY2VUeXBlQ2hhbmdlZCgpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVzb3VyY2VUeXBlXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Jlc291cmNlLXR5cGUtZXJyb3InOiByZXNvdXJjZVR5cGVFcnJvciB9XCJcbiAgICAgICAgICAgIGNsYXNzPVwicmVzb3VyY2UtdHlwZS1zZWxlY3RcIlxuICAgICAgICAgICAgaWQ9XCJSZXNvdXJjZVR5cGVTZWxlY3RcIlxuICAgICAgICA+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBSZXNvdXJjZSBUeXBlPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlcnZpY2UtcG9saWNpZXNcIj5TZXJ2aWNlIFBvbGljaWVzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlcnZpY2VzXCI+U2VydmljZXM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaWRlbnRpdGllc1wiPklkZW50aXRpZXM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZWRnZS1yb3V0ZXJzXCI+RWRnZSBSb3V0ZXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVkZ2Utcm91dGVyLXBvbGljaWVzXCI+RWRnZSBSb3V0ZXIgUG9saWNpZXM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llc1wiPlNlcnZpY2UgRWRnZSBSb3V0ZXIgUG9saWNpZXM8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZi1uZXQtdmlzLWZpbHRlci1jb250YWluZXIgbGlzdEJveCByb3dcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlclNlYXJjaEFycmF5KClcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclRleHRcIlxuICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgICAgICBjbGFzcz1cIm5mLXRvcG9sb2d5LWZpbHRlci1pbnB1dFwiXG4gICAgICAgICAgICAgIGlkPVwiZmlsdGVyVGV4dFwiXG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSB0byBGaWx0ZXJcIlxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaEZpbHRlcigpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJUZXh0ICE9PSAnJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uQmFsbCBjbG9zZVwiXG4gICAgICAgICAgICAgIGlkPVwiQ2xlYXJTZWFyY2hGaWx0ZXJcIlxuICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiIW5vU2VhcmNoUmVzdWx0c1wiIGNsYXNzPVwibm8tcmVzdWx0cy13YXJuaW5nXCI+Tm8gUmVzdWx0cyBGb3VuZDwvZGl2PlxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCIgKG9wdGlvblNlbGVjdGVkKT1cImF1dG9jb21wbGV0ZVNlYXJjaCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGF1dG9jb21wbGV0ZU9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgIHt7IG9wdGlvbiB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm5mLXRvcG9sb2d5LWxlZ2VuZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSBzZXJ2aWNlcG9saWNpZXNcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5TZXJ2aWNlIFBvbGljaWVzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSBzZXJ2aWNlc1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGV4dFwiPlNlcnZpY2VzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSBlbmRwb2ludHNcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5JZGVudGl0aWVzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSBlZGdlcm91dGVyc1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGV4dFwiPkVkZ2UgUm91dGVyczwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1jaXJjbGUgZXJwb2xpY2llc1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGV4dFwiPkVkZ2UgUm91dGVyIFBvbGljaWVzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSBzZXJ2aWNlZXJwb2xpY2llc1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGV4dFwiPlNlcnZpY2UgUm91dGVyIFBvbGljaWVzPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b3BvdGlwXCIgaWQ9XCJ0b29sdGlwXCI+PC9kaXY+XG4gICAgICA8c3ZnIHN0eWxlPSdwb2ludGVyLWV2ZW50czphbGwnIGlkPVwiTmV0d29ya1Zpc3VhbGl6ZXJTVkdcIj48L3N2Zz5cbiAgICAgIDxsaWItbG9hZGluZy1pbmRpY2F0b3IgKm5nSWY9XCJpc0xvYWRpbmdcIiBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvbGliLWxvYWRpbmctaW5kaWNhdG9yPlxuICAgIDwvZGl2PlxuXG48L2Rpdj5cbiJdfQ==
|