@openziti/ziti-console-lib 0.4.6 → 0.4.8
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/images/visualizer/node-click.png +0 -0
- package/assets/styles/ziti.css +1 -0
- package/assets/svgs/cursor-pointer.svg +1 -0
- package/esm2022/lib/features/confirm/confirm.component.mjs +6 -4
- package/esm2022/lib/features/data-table/data-table-filter.service.mjs +2 -2
- package/esm2022/lib/features/data-table/data-table.component.mjs +13 -1
- package/esm2022/lib/features/data-table/table-filter-bar/filter-bar.component.mjs +4 -2
- package/esm2022/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.mjs +3 -3
- package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.mjs +4 -4
- package/esm2022/lib/features/extendable/extensions-noop.service.mjs +3 -1
- package/esm2022/lib/features/preview-list/preview-list.component.mjs +48 -26
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +7 -5
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +6 -6
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +11 -10
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +6 -6
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +35 -9
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +8 -8
- package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +37 -31
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +89 -2
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.mjs +12 -11
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +7 -6
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.component.mjs +441 -259
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.helper.mjs +180 -63
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs +307 -118
- package/esm2022/lib/pages/configurations/configurations-page.service.mjs +2 -1
- package/esm2022/lib/pages/identities/identities-page.component.mjs +4 -4
- package/esm2022/lib/pages/identities/identities-page.service.mjs +11 -1
- package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +3 -3
- package/esm2022/lib/services/ziti-controller-data.service.mjs +8 -4
- package/esm2022/lib/shared/list-page-component.class.mjs +6 -4
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/openziti-ziti-console-lib.mjs +1228 -565
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/lib/features/confirm/confirm.component.d.ts +2 -0
- package/lib/features/confirm/confirm.component.d.ts.map +1 -1
- package/lib/features/data-table/data-table-filter.service.d.ts +2 -0
- package/lib/features/data-table/data-table-filter.service.d.ts.map +1 -1
- package/lib/features/data-table/data-table.component.d.ts.map +1 -1
- package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts.map +1 -1
- package/lib/features/extendable/extensions-noop.service.d.ts +2 -0
- package/lib/features/extendable/extensions-noop.service.d.ts.map +1 -1
- package/lib/features/preview-list/preview-list.component.d.ts +10 -5
- package/lib/features/preview-list/preview-list.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +2 -1
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +2 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +2 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts +2 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts +6 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/service-form.component.d.ts +2 -1
- package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/service-form.service.d.ts +6 -3
- package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +2 -0
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts +2 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +2 -1
- 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 +36 -20
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts.map +1 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts +42 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts.map +1 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts +6 -2
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts.map +1 -1
- package/lib/pages/configurations/configurations-page.service.d.ts.map +1 -1
- package/lib/pages/identities/identities-page.component.d.ts +1 -1
- package/lib/pages/identities/identities-page.component.d.ts.map +1 -1
- package/lib/pages/identities/identities-page.service.d.ts.map +1 -1
- package/lib/services/ziti-controller-data.service.d.ts.map +1 -1
- package/lib/shared/list-page-component.class.d.ts +3 -1
- package/lib/shared/list-page-component.class.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/public-api.d.ts.map +1 -1
package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import * as d3 from 'd3';
|
|
3
|
-
import
|
|
3
|
+
import _ from 'lodash';
|
|
4
|
+
import { ServicePolicy, Attribute, Children, Identity, ERouter, ERPolicy, Group, Service, Config } from './network-visualizer.helper';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
class TreeNodeProcessor {
|
|
6
7
|
constructor() {
|
|
@@ -28,7 +29,6 @@ class TreeNodeProcessor {
|
|
|
28
29
|
rawEpAttributes = rawEp.roleAttributes;
|
|
29
30
|
}
|
|
30
31
|
;
|
|
31
|
-
rawEpAttributes.push('@' + rawEp.name);
|
|
32
32
|
for (let i = 0; i < rawEpAttributes.length; i++) {
|
|
33
33
|
const attribute = new Attribute();
|
|
34
34
|
attribute.id = this.createId();
|
|
@@ -41,67 +41,60 @@ class TreeNodeProcessor {
|
|
|
41
41
|
bindServices.id = this.createId();
|
|
42
42
|
dialServices.id = this.createId();
|
|
43
43
|
let identityServicePolicies = [];
|
|
44
|
-
const services_url = this.getLinkForResource(rawEp, 'service-policies').replace('./', '');
|
|
45
44
|
const pagesize = 500;
|
|
46
|
-
|
|
45
|
+
// fetch associated routers
|
|
46
|
+
const url = this.getLinkForResource(rawEp, 'edge-routers').replace('./', '');
|
|
47
|
+
let associatedRouters = [];
|
|
48
|
+
const paging = this.getPagingObject(pagesize);
|
|
49
|
+
const erChailds = new Children();
|
|
50
|
+
erChailds.id = this.createId();
|
|
51
|
+
erChailds.name = 'Associated Routers';
|
|
52
|
+
erChailds.type = 'Associated Routers';
|
|
53
|
+
const associatedRoutersPromise = await zitiService.get(url, paging, [])
|
|
54
|
+
.then((result) => {
|
|
55
|
+
result.data.forEach((re) => {
|
|
56
|
+
const tmp = new ERouter();
|
|
57
|
+
tmp.id = this.createId();
|
|
58
|
+
tmp.name = re.name;
|
|
59
|
+
tmp.type = 'Router';
|
|
60
|
+
erChailds.children.push(tmp);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
const policies_url = this.getLinkForResource(rawEp, 'service-policies').replace('./', '');
|
|
64
|
+
const policies_paging = this.getPagingObject(pagesize);
|
|
47
65
|
const firstPromise = await zitiService
|
|
48
|
-
.get(
|
|
49
|
-
.then(
|
|
66
|
+
.get(policies_url, policies_paging, [])
|
|
67
|
+
.then((result) => {
|
|
50
68
|
identityServicePolicies = result.data;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
Promise.all(promises).then(() => {
|
|
66
|
-
const sub_promises = [];
|
|
67
|
-
identityServicePolicies.find(async (isp) => {
|
|
68
|
-
const pagingOb = this.getPagingObject(pagesize);
|
|
69
|
-
const ser_url = this.getLinkForResource(isp, 'services').replace('./', '');
|
|
70
|
-
const tmpPromise = await zitiService
|
|
71
|
-
.get(ser_url, pagingOb, [])
|
|
72
|
-
.then((result) => {
|
|
73
|
-
const tmp_services = [];
|
|
74
|
-
result.data.find((re) => {
|
|
75
|
-
const serv = new Service();
|
|
76
|
-
serv.id = this.createId();
|
|
77
|
-
serv.name = re.name;
|
|
78
|
-
serv.type = 'Service';
|
|
79
|
-
// tmp_services.push(serv);
|
|
80
|
-
if (isp.type === 'Dial') {
|
|
81
|
-
dialServices.children.push(serv);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
bindServices.children.push(serv);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
sub_promises.push(tmpPromise);
|
|
89
|
-
wait_promises.push(tmpPromise);
|
|
90
|
-
}); // loop
|
|
91
|
-
Promise.all(sub_promises).then(() => {
|
|
92
|
-
if (bindServices.children.length > 0) {
|
|
93
|
-
bindServices.name = 'Bind-Services(' + bindServices.children.length + ')';
|
|
94
|
-
identityNode.data.children.push(bindServices);
|
|
95
|
-
}
|
|
96
|
-
if (dialServices.children.length > 0) {
|
|
97
|
-
dialServices.name = 'Dial-Services(' + dialServices.children.length + ')';
|
|
98
|
-
identityNode.data.children.push(dialServices);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
69
|
+
});
|
|
70
|
+
const promises = [];
|
|
71
|
+
identityServicePolicies.forEach((sp) => {
|
|
72
|
+
const nodeArray = this.getServicesForAServicePolicy(sp, zitiService, 500);
|
|
73
|
+
promises.push(nodeArray);
|
|
74
|
+
});
|
|
75
|
+
await Promise.all(promises).then((nodeArray) => {
|
|
76
|
+
nodeArray.forEach((arOb) => {
|
|
77
|
+
if (arOb[0] === 'Bind') {
|
|
78
|
+
bindServices.children = this.arrayObjectCopyRightToLeft(bindServices.children, arOb[1]);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
dialServices.children = this.arrayObjectCopyRightToLeft(dialServices.children, arOb[1]);
|
|
82
|
+
}
|
|
101
83
|
});
|
|
102
84
|
});
|
|
103
|
-
wait_promises.push(firstPromise);
|
|
104
85
|
Promise.all(wait_promises).then(() => {
|
|
86
|
+
if (erChailds.children.length > 0) {
|
|
87
|
+
erChailds.name = erChailds.name + '(' + erChailds.children.length + ')';
|
|
88
|
+
identityNode.data.children.push(erChailds);
|
|
89
|
+
}
|
|
90
|
+
if (bindServices.children.length > 0) {
|
|
91
|
+
bindServices.name = 'Bind-Services(' + bindServices.children.length + ')';
|
|
92
|
+
identityNode.data.children.push(bindServices);
|
|
93
|
+
}
|
|
94
|
+
if (dialServices.children.length > 0) {
|
|
95
|
+
dialServices.name = 'Dial-Services(' + dialServices.children.length + ')';
|
|
96
|
+
identityNode.data.children.push(dialServices);
|
|
97
|
+
}
|
|
105
98
|
resolve('this is a promise');
|
|
106
99
|
});
|
|
107
100
|
});
|
|
@@ -122,24 +115,46 @@ class TreeNodeProcessor {
|
|
|
122
115
|
serviceOb.type = 'Service';
|
|
123
116
|
return serviceOb;
|
|
124
117
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
118
|
+
arrayObjectCopyRightToLeft(leftArr, rightArr) {
|
|
119
|
+
const leftArrIds = [];
|
|
120
|
+
leftArr.forEach((ob) => {
|
|
121
|
+
leftArrIds.push(ob.id);
|
|
122
|
+
});
|
|
123
|
+
rightArr.forEach((ob) => {
|
|
124
|
+
if (!leftArr.includes(ob.id)) {
|
|
125
|
+
leftArr.push(ob);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return leftArr;
|
|
129
|
+
}
|
|
130
|
+
addItemToArray(Idnetities, ob) {
|
|
131
|
+
if (ob.name && !Idnetities.find((item) => item.uuid === ob.id)) {
|
|
132
|
+
Idnetities.push(this.createIdentity(ob));
|
|
136
133
|
}
|
|
137
|
-
return
|
|
134
|
+
return Idnetities;
|
|
135
|
+
}
|
|
136
|
+
createIdentity(ob) {
|
|
137
|
+
const endpoint = new Identity();
|
|
138
|
+
endpoint.id = this.createId();
|
|
139
|
+
endpoint.uuid = ob.id;
|
|
140
|
+
endpoint.name = ob.name;
|
|
141
|
+
endpoint.online = ob.hasApiSession === true ? 'Yes' : 'No';
|
|
142
|
+
endpoint.type = 'Identity';
|
|
143
|
+
endpoint.status = ob.sdkInfo !== null ? 'Registered' : 'Not Registered';
|
|
144
|
+
if (ob.sdkInfo) {
|
|
145
|
+
endpoint.os = ob.sdkInfo.type ? ob.sdkInfo.type : ob.sdkInfo.appId;
|
|
146
|
+
endpoint.osVersion = ob.sdkInfo.version;
|
|
147
|
+
}
|
|
148
|
+
if (ob.authPolicy && ob.authPolicy.name.includes("BrowZer")) {
|
|
149
|
+
endpoint.type = 'BrowZer Identity';
|
|
150
|
+
}
|
|
151
|
+
endpoint.createdAt = ob.createdAt;
|
|
152
|
+
endpoint.updatedAt = ob.updatedAt;
|
|
153
|
+
return endpoint;
|
|
138
154
|
}
|
|
139
155
|
getLinkForResource(ob, resource) {
|
|
140
156
|
return ob['_links'][resource]['href'];
|
|
141
157
|
}
|
|
142
|
-
//Bind Dial Services
|
|
143
158
|
findServicesHostedOnEndpoint(rawEp, services, servicePolicies, zitiService) {
|
|
144
159
|
const servicesArr = [];
|
|
145
160
|
const childrenNoGroups = [];
|
|
@@ -231,28 +246,55 @@ class TreeNodeProcessor {
|
|
|
231
246
|
findRawEndpoint(epName, endpoints) {
|
|
232
247
|
return endpoints.find((ep) => ep.name === epName);
|
|
233
248
|
}
|
|
249
|
+
serviceConfigAlias(configs) {
|
|
250
|
+
let intercept = [];
|
|
251
|
+
_.isArray(configs) && configs.forEach((conf) => {
|
|
252
|
+
let addresses = '';
|
|
253
|
+
let ports = '';
|
|
254
|
+
if (conf.data.addresses) {
|
|
255
|
+
addresses = conf.data.addresses.toString();
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
addresses = conf.data.address;
|
|
259
|
+
}
|
|
260
|
+
if (_.isArray(conf.data.portRanges)) {
|
|
261
|
+
conf.data.portRanges.forEach((portsJson) => {
|
|
262
|
+
for (const key in portsJson) {
|
|
263
|
+
ports = ports + key + ':' + portsJson[key] + ' ';
|
|
264
|
+
}
|
|
265
|
+
ports = ports + ';';
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
ports = conf.data.port;
|
|
270
|
+
}
|
|
271
|
+
intercept.push(addresses);
|
|
272
|
+
intercept.push(ports);
|
|
273
|
+
});
|
|
274
|
+
return intercept;
|
|
275
|
+
}
|
|
234
276
|
async processServicesForNodeClick(serviceNode, networkGraph, services, uniqId, zitiService) {
|
|
235
277
|
const myPromise = await new Promise(async (resolve, reject) => {
|
|
236
278
|
const wait_promises = [];
|
|
237
279
|
this.uniqId = uniqId;
|
|
238
280
|
const rawServiceObj = services.find((s) => s.name === serviceNode.data.name);
|
|
239
281
|
const attributeswithName = [];
|
|
240
|
-
attributeswithName.push('@' + rawServiceObj.name);
|
|
241
282
|
rawServiceObj.roleAttributes && rawServiceObj.roleAttributes.find((srattr) => {
|
|
242
283
|
attributeswithName.push(srattr);
|
|
243
284
|
});
|
|
244
285
|
const serviceAttributes = new Children();
|
|
245
|
-
serviceAttributes.
|
|
286
|
+
serviceAttributes.name = 'Attributes';
|
|
287
|
+
serviceAttributes.type = 'Attributes';
|
|
246
288
|
serviceAttributes.id = this.createId();
|
|
247
289
|
for (let k = 0; k < attributeswithName.length; k++) {
|
|
248
290
|
const attrOb = new Attribute();
|
|
249
291
|
attrOb.id = this.createId();
|
|
250
292
|
attrOb.name = attributeswithName[k];
|
|
251
|
-
attrOb.type = '
|
|
293
|
+
attrOb.type = 'Attribute';
|
|
252
294
|
serviceAttributes.children.push(attrOb);
|
|
253
295
|
} // end inner for loop
|
|
254
296
|
if (serviceAttributes.children.length > 0) {
|
|
255
|
-
serviceAttributes.name = '
|
|
297
|
+
serviceAttributes.name = serviceAttributes.name + '(' + serviceAttributes.children.length + ')';
|
|
256
298
|
serviceNode.data.children.push(serviceAttributes);
|
|
257
299
|
}
|
|
258
300
|
let service_configs = [];
|
|
@@ -263,48 +305,118 @@ class TreeNodeProcessor {
|
|
|
263
305
|
.get(configs_url, pagingOb, [])
|
|
264
306
|
.then((configs) => {
|
|
265
307
|
service_configs = configs && configs.data ? configs.data : [];
|
|
308
|
+
const childs = new Children();
|
|
309
|
+
childs.id = this.createId();
|
|
310
|
+
childs.name = 'Service Configs';
|
|
311
|
+
childs.type = 'Service Configs';
|
|
312
|
+
const service_configs_Arr = [];
|
|
313
|
+
service_configs.forEach((cfg) => {
|
|
314
|
+
const obj = new Config();
|
|
315
|
+
obj.id = this.createId();
|
|
316
|
+
obj.name = cfg.name;
|
|
317
|
+
obj.uuid = cfg.uuid;
|
|
318
|
+
obj.data = JSON.stringify(cfg.data);
|
|
319
|
+
service_configs_Arr.push(obj);
|
|
320
|
+
});
|
|
321
|
+
if (service_configs_Arr.length > 0) {
|
|
322
|
+
childs.children = service_configs_Arr;
|
|
323
|
+
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
324
|
+
serviceNode.data.children.push(childs);
|
|
325
|
+
serviceNode.data.intercept = this.serviceConfigAlias(service_configs);
|
|
326
|
+
}
|
|
266
327
|
});
|
|
267
328
|
wait_promises.push(configPromise);
|
|
268
329
|
const service_edge_router_policies_url = this.getLinkForResource(rawServiceObj, 'service-edge-router-policies');
|
|
330
|
+
let service_routers_urls = [];
|
|
331
|
+
const ser_promse = await zitiService
|
|
332
|
+
.get(service_edge_router_policies_url.replace('./', ''), pagingOb, [])
|
|
333
|
+
.then((result) => {
|
|
334
|
+
result.data.forEach((serp) => {
|
|
335
|
+
service_routers_urls.push(this.getLinkForResource(serp, 'edge-routers'));
|
|
336
|
+
});
|
|
337
|
+
;
|
|
338
|
+
});
|
|
339
|
+
wait_promises.push(ser_promse);
|
|
340
|
+
let serp_page_Promises = [];
|
|
341
|
+
service_routers_urls.forEach((er_url) => {
|
|
342
|
+
const promse = zitiService
|
|
343
|
+
.get(er_url.replace('./', ''), pagingOb, []);
|
|
344
|
+
// .then(result => [policy.type, result]);
|
|
345
|
+
serp_page_Promises.push(promse);
|
|
346
|
+
});
|
|
347
|
+
let associatedRouters = [];
|
|
348
|
+
await Promise.all(serp_page_Promises).then((values) => {
|
|
349
|
+
values && values.forEach((res) => {
|
|
350
|
+
if (res && res.data.length > 0) {
|
|
351
|
+
res.data.forEach((er) => {
|
|
352
|
+
const erOb = new ERouter();
|
|
353
|
+
erOb.id = this.createId();
|
|
354
|
+
erOb.name = er.name;
|
|
355
|
+
er.type = 'Router';
|
|
356
|
+
associatedRouters.push(erOb);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
const tmp = new Children();
|
|
361
|
+
tmp.name = "Associated Routers(" + associatedRouters.length + ')';
|
|
362
|
+
tmp.type = "Routers";
|
|
363
|
+
tmp.children = associatedRouters;
|
|
364
|
+
tmp.id = this.createId();
|
|
365
|
+
serviceNode.data.children.push(tmp);
|
|
366
|
+
});
|
|
269
367
|
const service_policies_url = this.getLinkForResource(rawServiceObj, 'service-policies').replace('./', ''); // dial, Bind info
|
|
270
368
|
let bindPolicies = [];
|
|
271
369
|
let bindIdnetities = [];
|
|
370
|
+
let dialIdnetities = [];
|
|
272
371
|
const promise2 = await zitiService
|
|
273
372
|
.get(service_policies_url, pagingOb, [])
|
|
274
373
|
.then((policies) => {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
374
|
+
bindPolicies = policies.data;
|
|
375
|
+
});
|
|
376
|
+
const pagePromises = [];
|
|
377
|
+
bindPolicies.forEach((policy) => {
|
|
378
|
+
const bindIdentitiesUrl = this.getLinkForResource(policy, 'identities');
|
|
379
|
+
const promse = zitiService
|
|
380
|
+
.get(bindIdentitiesUrl.replace('./', ''), pagingOb, [])
|
|
381
|
+
.then(result => [policy.type, result]);
|
|
382
|
+
pagePromises.push(promse);
|
|
383
|
+
});
|
|
384
|
+
await Promise.all(pagePromises).then((values) => {
|
|
385
|
+
values && values.forEach((res) => {
|
|
386
|
+
if (res && res[1].data.length > 0) {
|
|
387
|
+
res[1].data.forEach((rs) => {
|
|
388
|
+
if (res[0] === 'Bind') {
|
|
389
|
+
bindIdnetities = this.addItemToArray(bindIdnetities, rs);
|
|
286
390
|
}
|
|
287
|
-
else {
|
|
288
|
-
this.addItemToArray(
|
|
391
|
+
else if (res[0] === 'Dial') {
|
|
392
|
+
dialIdnetities = this.addItemToArray(dialIdnetities, rs);
|
|
289
393
|
}
|
|
290
394
|
});
|
|
291
|
-
|
|
292
|
-
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
if (res[0] === 'Bind') {
|
|
398
|
+
bindIdnetities = this.addItemToArray(bindIdnetities, res[1].data);
|
|
399
|
+
}
|
|
400
|
+
else if (res[0] === 'Dial') {
|
|
401
|
+
dialIdnetities = this.addItemToArray(dialIdnetities, res[1].data);
|
|
402
|
+
}
|
|
293
403
|
}
|
|
294
404
|
});
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
405
|
+
const tmp = new Children();
|
|
406
|
+
tmp.name = "Bind Identities(" + bindIdnetities.length + ')';
|
|
407
|
+
tmp.type = "Identities";
|
|
408
|
+
tmp.children = bindIdnetities;
|
|
409
|
+
tmp.id = this.createId();
|
|
410
|
+
serviceNode.data.children.push(tmp);
|
|
411
|
+
const tmpDial = new Children();
|
|
412
|
+
tmpDial.name = "Dial Identities(" + dialIdnetities.length + ')';
|
|
413
|
+
tmpDial.type = "Identities";
|
|
414
|
+
tmpDial.children = dialIdnetities;
|
|
415
|
+
tmpDial.id = this.createId();
|
|
416
|
+
serviceNode.data.children.push(tmpDial);
|
|
306
417
|
resolve('this is a promise');
|
|
307
418
|
});
|
|
419
|
+
Promise.all(wait_promises).then(() => { });
|
|
308
420
|
}); // end of mypromise
|
|
309
421
|
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
310
422
|
return nd.children;
|
|
@@ -316,25 +428,59 @@ class TreeNodeProcessor {
|
|
|
316
428
|
const wait_promises = [];
|
|
317
429
|
this.uniqId = uniqId;
|
|
318
430
|
const rawSPolicy = servicePolicies.find((s) => s.name === policyNode.data.name);
|
|
431
|
+
const childs = new Children();
|
|
432
|
+
childs.name = "Attributes";
|
|
433
|
+
childs.id = this.createId();
|
|
434
|
+
rawSPolicy.serviceRoles && rawSPolicy.serviceRoles.forEach((ob) => {
|
|
435
|
+
const attr = new Attribute();
|
|
436
|
+
attr.name = ob;
|
|
437
|
+
attr.id = this.createId();
|
|
438
|
+
attr.type = "Service Attribute";
|
|
439
|
+
childs.children.push(attr);
|
|
440
|
+
});
|
|
441
|
+
rawSPolicy.identityRoles && rawSPolicy.identityRoles.forEach((ob) => {
|
|
442
|
+
const attr = new Attribute();
|
|
443
|
+
attr.name = ob;
|
|
444
|
+
attr.id = this.createId();
|
|
445
|
+
attr.type = "Identity Attribute";
|
|
446
|
+
childs.children.push(attr);
|
|
447
|
+
});
|
|
448
|
+
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
449
|
+
policyNode.data.children.push(childs);
|
|
319
450
|
const pagesize = 500;
|
|
320
|
-
const
|
|
451
|
+
const identities_paging = this.getPagingObject(pagesize);
|
|
321
452
|
const bindIdentitiesUrl = this.getLinkForResource(rawSPolicy, 'identities');
|
|
322
|
-
|
|
453
|
+
// this.logger.info('bindIdentitiesUrl',bindIdentitiesUrl);
|
|
454
|
+
const sp_promise = await zitiService.get(bindIdentitiesUrl, identities_paging, [])
|
|
323
455
|
.then((ids) => {
|
|
324
456
|
const childs = new Children();
|
|
325
|
-
childs.name = rawSPolicy.type + 'Identities';
|
|
457
|
+
childs.name = rawSPolicy.type + '-Identities';
|
|
326
458
|
childs.id = this.createId();
|
|
327
459
|
ids.data.forEach((idOb) => {
|
|
328
|
-
|
|
329
|
-
ep.id = idOb.id;
|
|
330
|
-
ep.name = idOb.name;
|
|
331
|
-
ep.type = 'Identity';
|
|
332
|
-
childs.children.push(ep);
|
|
460
|
+
childs.children.push(this.createIdentity(idOb));
|
|
333
461
|
});
|
|
334
462
|
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
335
463
|
policyNode.data.children.push(childs);
|
|
336
464
|
});
|
|
337
465
|
wait_promises.push(sp_promise);
|
|
466
|
+
const services_paging = this.getPagingObject(pagesize);
|
|
467
|
+
const bindServicesUrl = this.getLinkForResource(rawSPolicy, 'services'); // pull services
|
|
468
|
+
const _promise = await zitiService.get(bindServicesUrl, services_paging, [])
|
|
469
|
+
.then((result) => {
|
|
470
|
+
const childs = new Children();
|
|
471
|
+
childs.name = rawSPolicy.type + '-Services';
|
|
472
|
+
childs.id = this.createId();
|
|
473
|
+
result.data.forEach((idOb) => {
|
|
474
|
+
const sp = new Service();
|
|
475
|
+
sp.id = idOb.id;
|
|
476
|
+
sp.name = idOb.name;
|
|
477
|
+
sp.type = 'Service';
|
|
478
|
+
childs.children.push(sp);
|
|
479
|
+
});
|
|
480
|
+
childs.name = childs.name + '(' + childs.children.length + ')';
|
|
481
|
+
policyNode.data.children.push(childs);
|
|
482
|
+
});
|
|
483
|
+
wait_promises.push(_promise);
|
|
338
484
|
Promise.all(wait_promises).then(() => {
|
|
339
485
|
resolve('resolve.');
|
|
340
486
|
});
|
|
@@ -344,6 +490,23 @@ class TreeNodeProcessor {
|
|
|
344
490
|
});
|
|
345
491
|
return [networkGraph, this.uniqId];
|
|
346
492
|
}
|
|
493
|
+
async getServicesForAServicePolicy(policyObject, zitiService, pagesize = 500) {
|
|
494
|
+
const childs = [];
|
|
495
|
+
const services_paging = this.getPagingObject(pagesize);
|
|
496
|
+
const bindServicesUrl = this.getLinkForResource(policyObject, 'services');
|
|
497
|
+
const _promise = await zitiService.get(bindServicesUrl, services_paging, [])
|
|
498
|
+
.then((result) => {
|
|
499
|
+
result.data.forEach((idOb) => {
|
|
500
|
+
const sp = new Service();
|
|
501
|
+
sp.id = this.createId();
|
|
502
|
+
sp.uuid = idOb.id;
|
|
503
|
+
sp.name = idOb.name;
|
|
504
|
+
sp.type = 'Service';
|
|
505
|
+
childs.push(sp);
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
return [policyObject.type, childs];
|
|
509
|
+
}
|
|
347
510
|
async processEdgeroutersForNodeClick(edgerouterNode, networkGraph, edgerouters, uniqId, zitiService) {
|
|
348
511
|
const mainPromise = await new Promise(async (resolve, reject) => {
|
|
349
512
|
const wait_promises = [];
|
|
@@ -385,6 +548,9 @@ class TreeNodeProcessor {
|
|
|
385
548
|
policy.uuid = pol.id;
|
|
386
549
|
policy.name = pol.name;
|
|
387
550
|
policy.type = 'Router Policy';
|
|
551
|
+
policy.isSystem = pol.isSystem;
|
|
552
|
+
policy.semantic = pol.semantic;
|
|
553
|
+
policy.rootNode = 'No';
|
|
388
554
|
erpolChilds.children.push(policy);
|
|
389
555
|
});
|
|
390
556
|
erpolChilds.name = "Edge Router Policies(" + erpolChilds.children.length + ')';
|
|
@@ -551,11 +717,39 @@ class TreeNodeProcessor {
|
|
|
551
717
|
return servicesChildren;
|
|
552
718
|
}
|
|
553
719
|
async processEdgeRouterPoliciesForNodeClick(erPolicyNode, networkGraph, edgeRouterPolicies, uniqId, zitiService) {
|
|
554
|
-
const myPromise = await new Promise((resolve, reject) => {
|
|
720
|
+
const myPromise = await new Promise(async (resolve, reject) => {
|
|
555
721
|
const wait_promises = [];
|
|
556
722
|
this.uniqId = uniqId;
|
|
557
723
|
const rawERPolicy = edgeRouterPolicies.find((s) => s.name === erPolicyNode.data.name);
|
|
558
724
|
const pagesize = 500;
|
|
725
|
+
const er_url = this.getLinkForResource(rawERPolicy, 'edge-routers').replace('./', '');
|
|
726
|
+
let associatedRouters = [];
|
|
727
|
+
const paging = this.getPagingObject(pagesize);
|
|
728
|
+
const erChailds = new Children();
|
|
729
|
+
erChailds.name = 'Associated Routers';
|
|
730
|
+
erChailds.type = 'Associated Routers';
|
|
731
|
+
erChailds.id = this.createId();
|
|
732
|
+
const associatedRoutersPromise = await zitiService.get(er_url, paging, [])
|
|
733
|
+
.then((result) => {
|
|
734
|
+
result.data.forEach((er) => {
|
|
735
|
+
const tmp = new ERouter();
|
|
736
|
+
tmp.id = this.createId();
|
|
737
|
+
tmp.name = er.name;
|
|
738
|
+
tmp.type = 'Router';
|
|
739
|
+
tmp.verified = er.isVerified ? 'Yes' : 'No';
|
|
740
|
+
tmp.online = er.isOnline ? 'Yes' : 'No';
|
|
741
|
+
tmp.disabled = er.disabled ? 'Yes' : 'No';
|
|
742
|
+
tmp.rootNode = 'Yes';
|
|
743
|
+
tmp.tunnelerEnabled = er.tunnelerEnabled ? er.tunnelerEnabled : 'No';
|
|
744
|
+
tmp.syncStatus = er.syncStatus ? er.syncStatus : 'No';
|
|
745
|
+
tmp.createdAt = er.createdAt;
|
|
746
|
+
tmp.updatedAt = er.updatedAt;
|
|
747
|
+
erChailds.children.push(tmp);
|
|
748
|
+
});
|
|
749
|
+
erChailds.name = erChailds.name + '(' + erChailds.children.length + ')';
|
|
750
|
+
erPolicyNode.data.children.push(erChailds);
|
|
751
|
+
});
|
|
752
|
+
wait_promises.push(associatedRoutersPromise);
|
|
559
753
|
const services_paging = this.getPagingObject(pagesize);
|
|
560
754
|
const url = this.getLinkForResource(rawERPolicy, 'identities');
|
|
561
755
|
let ids = [];
|
|
@@ -577,13 +771,8 @@ class TreeNodeProcessor {
|
|
|
577
771
|
Promise.all(promises).then(() => {
|
|
578
772
|
const idChilds = new Children();
|
|
579
773
|
idChilds.id = this.createId();
|
|
580
|
-
ids.forEach((
|
|
581
|
-
|
|
582
|
-
idOb.id = this.createId();
|
|
583
|
-
idOb.uuid = er.id;
|
|
584
|
-
idOb.name = er.name;
|
|
585
|
-
idOb.type = 'Identity';
|
|
586
|
-
idChilds.children.push(idOb);
|
|
774
|
+
ids.forEach((idOb) => {
|
|
775
|
+
idChilds.children.push(this.createIdentity(idOb));
|
|
587
776
|
});
|
|
588
777
|
idChilds.name = "Accessible Identities(" + idChilds.children.length + ')';
|
|
589
778
|
erPolicyNode.data.children.push(idChilds);
|
|
@@ -674,7 +863,7 @@ class TreeNodeProcessor {
|
|
|
674
863
|
});
|
|
675
864
|
wait_promises.push(serpromise);
|
|
676
865
|
Promise.all(wait_promises).then(() => {
|
|
677
|
-
resolve('
|
|
866
|
+
resolve('Done');
|
|
678
867
|
});
|
|
679
868
|
});
|
|
680
869
|
networkGraph = d3.hierarchy(networkGraph.data, function (nd) {
|
|
@@ -692,4 +881,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
692
881
|
providedIn: 'root',
|
|
693
882
|
}]
|
|
694
883
|
}] });
|
|
695
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLnRyZWVub2RlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvbmV0d29yay12aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci50cmVlbm9kZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBRTlILE1BR2EsaUJBQWlCO0lBSDlCO1FBSUksV0FBTSxHQUFHLENBQUMsQ0FBQztLQXd4QmQ7SUF2eEJHLGVBQWUsQ0FBQyxRQUFRO1FBQ3RCLE1BQU0sTUFBTSxHQUFHO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLEtBQUssRUFBRSxRQUFRO1lBQ2YsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQztRQUNGLE9BQVEsTUFBTSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMsNkJBQTZCLENBQy9CLFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixXQUFXLEVBQ1gsT0FBTztRQUVYLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxPQUFPLENBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1RCxNQUFNLGFBQWEsR0FBRyxF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QyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxFQUFFO2dCQUNuQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUUsQ0FBQztRQUVOLENBQUMsQ0FBQyxDQUFDO1FBRUYsWUFBWSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDdkQsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLE1BQU07K0dBeHhCQyxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZkLE1BQU07RUEyeEJwQixlQUFlO1NBenhCSixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgU2VydmljZVBvbGljeSwgQXR0cmlidXRlLCBDaGlsZHJlbiwgSWRlbnRpdHksIEVSb3V0ZXIsIEVSUG9saWN5LCBHcm91cCwgU2VydmljZSB9IGZyb20gJy4vbmV0d29yay12aXN1YWxpemVyLmhlbHBlcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVOb2RlUHJvY2Vzc29yIHtcbiAgICB1bmlxSWQgPSAwO1xuICAgIGdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSkge1xuICAgICAgY29uc3QgcGFnaW5nID0ge1xuICAgICAgICBzZWFyY2hPbjogJ25hbWUnLFxuICAgICAgICBub1NlYXJjaDogZmFsc2UsXG4gICAgICAgIGZpbHRlcjogJycsXG4gICAgICAgIHRvdGFsOiBwYWdlc2l6ZSxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgc29ydDogJ25hbWUnLFxuICAgICAgICBvcmRlcjogJ2FzYycsXG4gICAgICB9O1xuICAgICAgcmV0dXJuICBwYWdpbmc7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0lkZW50aXRpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgIGlkZW50aXR5Tm9kZSxcbiAgICAgICAgbmV0d29ya0dyYXBoLFxuICAgICAgICByYXdFbmRwb2ludHMsXG4gICAgICAgIHVuaXFJZCxcbiAgICAgICAgeml0aVNlcnZpY2UsXG4gICAgICAgIGNvbmZpZ3NcbiAgICApIHtcbiAgICBjb25zdCBteVByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgIGNvbnN0IHdhaXRfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgIGNvbnN0IHJhd0VwID0gdGhpcy5maW5kUmF3RW5kcG9pbnQoaWRlbnRpdHlOb2RlLmRhdGEubmFtZSwgcmF3RW5kcG9pbnRzKTtcbiAgICAgICAgbGV0IHJhd0VwQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAocmF3RXAucm9sZUF0dHJpYnV0ZXMpIHtyYXdFcEF0dHJpYnV0ZXMgPSByYXdFcC5yb2xlQXR0cmlidXRlc307XG4gICAgICAgIHJhd0VwQXR0cmlidXRlcy5wdXNoKCdAJyArIHJhd0VwLm5hbWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0VwQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLm5hbWUgPSByYXdFcEF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS50eXBlID0gJ0lkZW50aXR5IEF0dHJpYnV0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXR5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgIGNvbnN0IGJpbmRTZXJ2aWNlcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgY29uc3QgZGlhbFNlcnZpY2VzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICBiaW5kU2VydmljZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBkaWFsU2VydmljZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBsZXQgaWRlbnRpdHlTZXJ2aWNlUG9saWNpZXMgPSBbXTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd0VwLCAnc2VydmljZS1wb2xpY2llcycpLnJlcGxhY2UoJy4vJywgJycpO1xuXG4gICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcblxuICAgICAgIGNvbnN0IGZpcnN0UHJvbWlzZSA9ICBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KHNlcnZpY2VzX3VybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAgICAgLnRoZW4oIGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZGVudGl0eVNlcnZpY2VQb2xpY2llcyA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3VybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGl0eVNlcnZpY2VQb2xpY2llcy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX3Byb21pc2VzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXR5U2VydmljZVBvbGljaWVzLmZpbmQoIGFzeW5jIChpc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdpbmdPYiA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJfdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoaXNwLCAnc2VydmljZXMnKS5yZXBsYWNlKCcuLycsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG1wUHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHNlcl91cmwsIHBhZ2luZ09iLCBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0bXBfc2VydmljZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmZpbmQoIChyZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnYgPSBuZXcgU2VydmljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydi5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnYubmFtZSA9IHJlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2LnR5cGUgPSAnU2VydmljZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdG1wX3NlcnZpY2VzLnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3AudHlwZSA9PT0gJ0RpYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsU2VydmljZXMuY2hpbGRyZW4ucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kU2VydmljZXMuY2hpbGRyZW4ucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9wcm9taXNlcy5wdXNoKHRtcFByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaCh0bXBQcm9taXNlKTtcblxuICAgICAgICAgICAgICAgICAgICB9KTsgLy8gbG9vcFxuICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKHN1Yl9wcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihiaW5kU2VydmljZXMuY2hpbGRyZW4ubGVuZ3RoPjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRTZXJ2aWNlcy5uYW1lID0gJ0JpbmQtU2VydmljZXMoJytiaW5kU2VydmljZXMuY2hpbGRyZW4ubGVuZ3RoKycpJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goYmluZFNlcnZpY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRpYWxTZXJ2aWNlcy5jaGlsZHJlbi5sZW5ndGg+MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbFNlcnZpY2VzLm5hbWUgPSAnRGlhbC1TZXJ2aWNlcygnK2RpYWxTZXJ2aWNlcy5jaGlsZHJlbi5sZW5ndGgrJyknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHlOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChkaWFsU2VydmljZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKGZpcnN0UHJvbWlzZSk7XG4gICAgICBQcm9taXNlLmFsbCh3YWl0X3Byb21pc2VzKS50aGVuKCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgIG5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeShuZXR3b3JrR3JhcGguZGF0YSwgZnVuY3Rpb24gKG5kKSB7XG4gICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICB9KTtcbiAgICAgICAgIHJldHVybiBbbmV0d29ya0dyYXBoLCB0aGlzLnVuaXFJZF07XG4gICAgfSAvLyBlbmQgb2YgZnVuY3Rpb25cblxuICAgIGNyZWF0ZUlkKCkge1xuICAgICAgICArK3RoaXMudW5pcUlkO1xuICAgICAgICByZXR1cm4gdGhpcy51bmlxSWQ7XG4gICAgfVxuXG4gICBjcmVhdGVTZXJ2aWNlTm9kZSggc3IpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZU9iID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgIHNlcnZpY2VPYi5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgIHNlcnZpY2VPYi51dWlkID0gc3IuaWQ7XG4gICAgICAgICBzZXJ2aWNlT2IubmFtZSA9IHNyLm5hbWU7XG4gICAgICAgICBzZXJ2aWNlT2IudHlwZSA9ICdTZXJ2aWNlJztcbiAgICAgICByZXR1cm4gc2VydmljZU9iO1xuICAgfVxuXG4gIGFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCBvYikge1xuICAgIGlmICghYmluZElkbmV0aXRpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS51dWlkID09PSBvYi5pZCkpIHtcbiAgICAgICBjb25zdCBlcE9iID0gbmV3IElkZW50aXR5KCk7XG4gICAgICAgIGVwT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgIGVwT2IudXVpZCA9IG9iLmlkO1xuICAgICAgICBlcE9iLm5hbWUgPSBvYi5uYW1lO1xuICAgICAgICBlcE9iLm9ubGluZSA9IG9iLmhhc0FwaVNlc3Npb24gPT09IHRydWUgPyAnWWVzJyA6ICdObyc7XG4gICAgICAgIGVwT2IudHlwZSA9ICdJZGVudGl0eSc7XG4gICAgICAgIGVwT2Iuc3RhdHVzID0gb2Iub3MgIT09IG51bGwgPyAnUmVnaXN0ZXJlZCcgOiAnTm90IFJlZ2lzdGVyZWQnO1xuICAgICAgICBlcE9iLm9zID0gb2Iub3M7XG5cbiAgICAgIGJpbmRJZG5ldGl0aWVzLnB1c2goZXBPYik7XG4gICAgfVxuICAgIHJldHVybiBiaW5kSWRuZXRpdGllcztcbiAgfVxuXG4gIGdldExpbmtGb3JSZXNvdXJjZShvYiwgcmVzb3VyY2UpIHtcbiAgICByZXR1cm4gb2JbJ19saW5rcyddW3Jlc291cmNlXVsnaHJlZiddO1xuICB9XG5cbiAgIC8vQmluZCBEaWFsIFNlcnZpY2VzXG4gICAgZmluZFNlcnZpY2VzSG9zdGVkT25FbmRwb2ludChyYXdFcCwgc2VydmljZXMsIHNlcnZpY2VQb2xpY2llcywgeml0aVNlcnZpY2UpIHtcbiAgICAgICBjb25zdCBzZXJ2aWNlc0FyciA9IFtdO1xuICAgICAgICBjb25zdCBjaGlsZHJlbk5vR3JvdXBzID0gW107XG4gICAgICAgIGNvbnN0IGVuZHBvaW50QXR0ciA9IHJhd0VwLnJvbGVBdHRyaWJ1dGVzPyByYXdFcC5yb2xlQXR0cmlidXRlczogW107XG4gICAgICAgIGVuZHBvaW50QXR0ci5wdXNoKCdAJytyYXdFcC5pZCk7XG5cbiAgICAgICAgbGV0IGRpYWxTZXJ2aWNlQXR0cnMgPSBbXTtcbiAgICAgICAgbGV0IGJpbmRTZXJ2aWNlQXR0cnMgPSBbXTtcblxuICAgICAgICBjb25zdCBiaW5kUG9saWNpZXMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgYmluZFBvbGljaWVzLm5hbWUgPSAnQmluZC1Qb2xpY2llcyc7XG4gICAgICAgIGNvbnN0IGRpYWxQb2xpY2llcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgZGlhbFBvbGljaWVzLm5hbWUgPSAnRGlhbC1Qb2xpY2llcyc7XG5cbiAgICAgICAgYmluZFBvbGljaWVzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICBkaWFsUG9saWNpZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG5cbiAgICAgICAgc2VydmljZVBvbGljaWVzLmZpbmQoIChzcCkgPT4ge1xuICAgICAgICAgIHNwLmlkZW50aXR5Um9sZXMuZmluZCggKGF0dHIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVuZHBvaW50QXR0ci5pbmNsdWRlcyhhdHRyKSApIHtcbiAgICAgICAgICAgICAgIGlmIChzcC50eXBlID09PSAnQmluZCcpIHtcbiAgICAgICAgICAgICAgICAgICBjb25zdCBzUG9saWN5ID0gbmV3IFNlcnZpY2VQb2xpY3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBzUG9saWN5LmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kubmFtZSA9IHNwLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS50eXBlID0gc3AudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBzUG9saWN5LmNoaWxkcmVuID0gdGhpcy5nZXRTZXJ2aWNlc0ZvclBvbGljeShzZXJ2aWNlcywgc3ApO1xuICAgICAgICAgICAgICAgICAgIGJpbmRQb2xpY2llcy5jaGlsZHJlbi5wdXNoKHNwKTtcbiAgICAgICAgICAgICAgICAgICBiaW5kU2VydmljZUF0dHJzID0gZmlsbEFycmF5KGJpbmRTZXJ2aWNlQXR0cnMsIHNwLnNlcnZpY2VSb2xlcyk7XG4gICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICBjb25zdCBzUG9saWN5ID0gbmV3IFNlcnZpY2VQb2xpY3koKTtcbiAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgICBzUG9saWN5Lm5hbWUgPSBzcC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS50eXBlID0gc3AudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kuY2hpbGRyZW4gPSB0aGlzLmdldFNlcnZpY2VzRm9yUG9saWN5KHNlcnZpY2VzLCBzcCkgO1xuICAgICAgICAgICAgICAgICBkaWFsUG9saWNpZXMuY2hpbGRyZW4ucHVzaChzUG9saWN5KTtcbiAgICAgICAgICAgICAgICBkaWFsU2VydmljZUF0dHJzID0gZmlsbEFycmF5KGRpYWxTZXJ2aWNlQXR0cnMsIHNwLnNlcnZpY2VSb2xlcyk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSApO1xuXG4gICAgICAgIGZ1bmN0aW9uIGZpbGxBcnJheShhcnIxLCBhcnIyKSB7XG4gICAgICAgICAgYXJyMi5mb3JFYWNoKCAoaXRlbSkgPT4ge1xuICAgICAgICAgICBhcnIxLnB1c2goaXRlbSk7XG4gICAgICAgICAgfSApO1xuICAgICAgICAgIHJldHVybiBhcnIxO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmluZFNlcnZpY2VzID0gW107XG4gICAgICAgIGNvbnN0IGRpYWxTZXJ2aWNlcyA9IFtdO1xuXG4gICAgICAgIHNlcnZpY2VzICYmIHNlcnZpY2VzLmZvckVhY2goIChzcikgPT4ge1xuICAgICAgICAgIHNyLnJvbGVBdHRyaWJ1dGVzICYmIHNyLnJvbGVBdHRyaWJ1dGVzLmZvckVhY2goIChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgaWYgKGRpYWxTZXJ2aWNlQXR0cnMuaW5jbHVkZXMoYXR0cikgKSB7XG4gICAgICAgICAgICAgICBkaWFsU2VydmljZXMucHVzaCh0aGlzLmNyZWF0ZVNlcnZpY2VOb2RlKHNyKSApO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBpZiAoYmluZFNlcnZpY2VBdHRycy5pbmNsdWRlcyhhdHRyKSApIHtcbiAgICAgICAgICAgICAgICBiaW5kU2VydmljZXMucHVzaCggdGhpcy5jcmVhdGVTZXJ2aWNlTm9kZShzcikgKTtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgfSApO1xuICAgICAgICB9KTtcbiAgICAgICBpZiAoZGlhbFNlcnZpY2VzLmxlbmd0aCA+MCApIHtcbiAgICAgICAgICBjb25zdCBkaWFsR3JvdXAgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICBkaWFsR3JvdXAuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgZGlhbEdyb3VwLm5hbWUgPSAnU2VydmljZXMtRGlhbCc7XG4gICAgICAgICAgZGlhbEdyb3VwLmNoaWxkcmVuID0gZGlhbFNlcnZpY2VzO1xuICAgICAgICAgIHNlcnZpY2VzQXJyLnB1c2goZGlhbEdyb3VwKTtcbiAgICAgICB9XG4gICAgICAgaWYgKGJpbmRTZXJ2aWNlcy5sZW5ndGggPjAgKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kR3JvdXAgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgIGJpbmRHcm91cC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIGJpbmRHcm91cC5uYW1lID0gJ1NlcnZpY2VzLUJpbmQnO1xuICAgICAgICAgICAgYmluZEdyb3VwLmNoaWxkcmVuID0gYmluZFNlcnZpY2VzO1xuICAgICAgICAgICAgc2VydmljZXNBcnIucHVzaChiaW5kR3JvdXApO1xuICAgICAgIH1cbiAgICAgcmV0dXJuIHNlcnZpY2VzQXJyO1xuXG5cbiAgICB9IC8vIGVuZCBvZiBmaW5kIHNlcnZpY2VzSG9zdGVkT25FbmRwb2ludFxuXG4gICBnZXRTZXJ2aWNlc0ZvclBvbGljeShzZXJ2aWNlcywgc3BPYikge1xuICAgICBjb25zdCBzZXJ2aWNlc0ZvdFBvbGljeSA9IFtdO1xuICAgICBzZXJ2aWNlcyAmJiBzZXJ2aWNlcy5mb3JFYWNoKCAoc3IpID0+IHtcbiAgICAgICAgIGNvbnN0IGF0dHJzID0gc3Iucm9sZUF0dHJpYnV0ZXMgPyBzci5yb2xlQXR0cmlidXRlczogW107XG4gICAgICAgICBhdHRycy5wdXNoKCdAJytzcE9iLmlkKTtcbiAgICAgICAgIGF0dHJzLmZpbmQoIChhdHIpID0+IHtcbiAgICAgICAgICAgIGlmKHNwT2Iuc2VydmljZVJvbGVzLmluY2x1ZGVzKGF0cikgKXtcbiAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VOb2RlID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgICAgICAgIHNlcnZpY2VOb2RlLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgc2VydmljZU5vZGUubmFtZSA9IHNyLm5hbWU7XG4gICAgICAgICAgICAgICBzZXJ2aWNlTm9kZS50eXBlID0gJ1NlcnZpY2UnO1xuICAgICAgICAgICAgIHNlcnZpY2VzRm90UG9saWN5LnB1c2goc2VydmljZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfSk7XG4gICAgIH0pO1xuICAgIHJldHVybiBzZXJ2aWNlc0ZvdFBvbGljeTtcbiAgIH1cblxuICAgIGZpbmRSYXdFbmRwb2ludChlcE5hbWUsIGVuZHBvaW50cykge1xuICAgICAgIHJldHVybiBlbmRwb2ludHMuZmluZCgoZXApID0+IGVwLm5hbWUgPT09IGVwTmFtZSk7XG4gICAgfVxuXG4gIGFzeW5jIHByb2Nlc3NTZXJ2aWNlc0Zvck5vZGVDbGljayhzZXJ2aWNlTm9kZSwgbmV0d29ya0dyYXBoLCBzZXJ2aWNlcywgdW5pcUlkLCB6aXRpU2VydmljZSkge1xuICAgICBjb25zdCBteVByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgIHRoaXMudW5pcUlkID0gdW5pcUlkO1xuICAgICAgICBjb25zdCByYXdTZXJ2aWNlT2JqID0gc2VydmljZXMuZmluZCgocykgPT4gcy5uYW1lID09PSBzZXJ2aWNlTm9kZS5kYXRhLm5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXN3aXRoTmFtZSA9IFtdO1xuICAgICAgICBhdHRyaWJ1dGVzd2l0aE5hbWUucHVzaCgnQCcgKyByYXdTZXJ2aWNlT2JqLm5hbWUpO1xuICAgICAgICByYXdTZXJ2aWNlT2JqLnJvbGVBdHRyaWJ1dGVzICYmIHJhd1NlcnZpY2VPYmoucm9sZUF0dHJpYnV0ZXMuZmluZCgoc3JhdHRyKSA9PiB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzd2l0aE5hbWUucHVzaChzcmF0dHIpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2VydmljZUF0dHJpYnV0ZXMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgc2VydmljZUF0dHJpYnV0ZXMudHlwZSA9ICdTZXJ2aWNlQXR0cmlidXRlcyc7XG4gICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGF0dHJpYnV0ZXN3aXRoTmFtZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgYXR0ck9iID0gbmV3IEF0dHJpYnV0ZSgpO1xuICAgICAgICAgICAgYXR0ck9iLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgYXR0ck9iLm5hbWUgPSBhdHRyaWJ1dGVzd2l0aE5hbWVba107XG4gICAgICAgICAgICBhdHRyT2IudHlwZSA9ICdTZXJ2aWNlIEF0dHJpYnV0ZSc7XG5cbiAgICAgICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLmNoaWxkcmVuLnB1c2goYXR0ck9iKTtcbiAgICAgICAgfSAvLyBlbmQgaW5uZXIgZm9yIGxvb3BcbiAgICAgICAgaWYgKHNlcnZpY2VBdHRyaWJ1dGVzLmNoaWxkcmVuLmxlbmd0aCA+MCApIHtcbiAgICAgICAgICAgc2VydmljZUF0dHJpYnV0ZXMubmFtZSA9ICdTZXJ2aWNlIEF0dHJpYnV0ZXMoJysgc2VydmljZUF0dHJpYnV0ZXMuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICBzZXJ2aWNlTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goc2VydmljZUF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlcnZpY2VfY29uZmlncyA9IFtdO1xuICAgICAgICBjb25zdCBjb25maWdzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd1NlcnZpY2VPYmosICdjb25maWdzJyk7XG4gICAgICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgICAgICBjb25zdCBwYWdpbmdPYiA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICAgY29uc3QgY29uZmlnUHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgICAuZ2V0KGNvbmZpZ3NfdXJsLCBwYWdpbmdPYiwgW10pXG4gICAgICAgICAudGhlbigoY29uZmlncykgPT4ge1xuICAgICAgICAgICBzZXJ2aWNlX2NvbmZpZ3MgPSBjb25maWdzICYmIGNvbmZpZ3MuZGF0YSA/IGNvbmZpZ3MuZGF0YSA6IFtdO1xuICAgICAgICB9KTtcbiAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goY29uZmlnUHJvbWlzZSk7XG4gICAgICAgY29uc3Qgc2VydmljZV9lZGdlX3JvdXRlcl9wb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgIHJhd1NlcnZpY2VPYmosXG4gICAgICAgICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJ1xuICAgICAgICk7XG4gICAgICAgY29uc3Qgc2VydmljZV9wb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgcmF3U2VydmljZU9iaixcbiAgICAgICAgJ3NlcnZpY2UtcG9saWNpZXMnXG4gICAgICAgKS5yZXBsYWNlKCcuLycsICcnKTsgLy8gZGlhbCwgQmluZCBpbmZvXG5cbiAgICAgICBsZXQgYmluZFBvbGljaWVzID0gW107XG4gICAgICAgbGV0IGJpbmRJZG5ldGl0aWVzID0gW107XG4gICAgICAgY29uc3QgcHJvbWlzZTIgPSBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgIC5nZXQoc2VydmljZV9wb2xpY2llc191cmwsIHBhZ2luZ09iLCBbXSlcbiAgICAgICAudGhlbigocG9saWNpZXMpID0+IHtcbiAgICAgICAgIGNvbnN0IGlkZW50aXR5UHJvbWlzZXMgPSBbXTtcbiAgICAgICAgIHBvbGljaWVzLmRhdGEuZm9yRWFjaCggYXN5bmMgKHBvbGljeSkgPT4ge1xuICAgICAgICAgIGlmIChwb2xpY3kudHlwZSA9PT0gJ0JpbmQnKSAge1xuICAgICAgICAgICAgY29uc3QgYmluZElkZW50aXRpZXNVcmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgICAgICAgcG9saWN5LFxuICAgICAgICAgICAgICAnaWRlbnRpdGllcydcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICBjb25zdCBwcm9tc2UgPSBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KGJpbmRJZGVudGl0aWVzVXJsLnJlcGxhY2UoJy4vJywgJycpLCBwYWdpbmdPYiwgW10pXG4gICAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhLmZvckVhY2goKHJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbVRvQXJyYXkoYmluZElkbmV0aXRpZXMsIHJzKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCByZXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWRlbnRpdHlQcm9taXNlcy5wdXNoKHByb21zZSk7XG4gICAgICAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChwcm9tc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgUHJvbWlzZS5hbGwoaWRlbnRpdHlQcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0bXAgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICB0bXAubmFtZSA9IFwiQmluZCBJZGVudGl0aWVzKFwiICsgYmluZElkbmV0aXRpZXMubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgdG1wLnR5cGUgPSBcIklkZW50aXRpZXNcIjtcbiAgICAgICAgICAgICB0bXAuY2hpbGRyZW4gPSBiaW5kSWRuZXRpdGllcztcbiAgICAgICAgICAgICB0bXAuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgc2VydmljZU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKHRtcCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgICB3YWl0X3Byb21pc2VzLnB1c2gocHJvbWlzZTIpO1xuICAgICAgIFByb21pc2UuYWxsKHdhaXRfcHJvbWlzZXMpLnRoZW4oICgpID0+IHtcbiAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgfSk7XG4gICAgfSk7IC8vIGVuZCBvZiBteXByb21pc2VcblxuICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICByZXR1cm4gbmQuY2hpbGRyZW47XG4gICAgIH0pO1xuICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgfSAvLyBlbmQgb2YgcHJvY2Vzc1NlcnZpY2VzRm9yTm9kZUNsaWNrXG5cblxuICBhc3luYyBwcm9jZXNzU2VydmljZVBvbGljaWVzRm9yTm9kZUNsaWNrKHBvbGljeU5vZGUsIG5ldHdvcmtHcmFwaCwgIHNlcnZpY2VQb2xpY2llcywgdW5pcUlkLCB6aXRpU2VydmljZSkge1xuXG4gICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKCBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHdhaXRfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgIGNvbnN0IHJhd1NQb2xpY3kgPSBzZXJ2aWNlUG9saWNpZXMuZmluZCgocykgPT4gcy5uYW1lID09PSBwb2xpY3lOb2RlLmRhdGEubmFtZSk7XG4gICAgICAgICAgY29uc3QgcGFnZXNpemUgPSA1MDA7XG4gICAgICAgICAgY29uc3Qgc2VydmljZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgIGNvbnN0IGJpbmRJZGVudGl0aWVzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoIHJhd1NQb2xpY3ksICdpZGVudGl0aWVzJyApO1xuICAgICAgIGNvbnN0IHNwX3Byb21pc2UgPSBhd2FpdCB6aXRpU2VydmljZS5nZXQoYmluZElkZW50aXRpZXNVcmwsIHNlcnZpY2VzX3BhZ2luZywgW10pXG4gICAgICAgLnRoZW4oKGlkcykgPT4ge1xuICAgICAgICAgY29uc3QgY2hpbGRzID1uZXcgQ2hpbGRyZW4oKVxuICAgICAgICAgICAgIGNoaWxkcy5uYW1lID0gcmF3U1BvbGljeS50eXBlKyAnSWRlbnRpdGllcyc7XG4gICAgICAgICBjaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICBpZHMuZGF0YS5mb3JFYWNoKCAoaWRPYikgPT4ge1xuICAgICAgICAgICBjb25zdCBlcCA9IG5ldyBJZGVudGl0eSgpO1xuICAgICAgICAgICAgZXAuaWQgPSBpZE9iLmlkO1xuICAgICAgICAgICAgZXAubmFtZSA9IGlkT2IubmFtZTtcbiAgICAgICAgICAgIGVwLnR5cGUgPSAnSWRlbnRpdHknO1xuICAgICAgICAgICAgY2hpbGRzLmNoaWxkcmVuLnB1c2goZXApO1xuICAgICAgICAgfSk7XG4gICAgICAgICBjaGlsZHMubmFtZSA9IGNoaWxkcy5uYW1lICsgJygnICsgY2hpbGRzLmNoaWxkcmVuLmxlbmd0aCsnKSc7XG4gICAgICAgICBwb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChjaGlsZHMpO1xuICAgICAgIH0pO1xuICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChzcF9wcm9taXNlKTtcbiAgICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgICByZXNvbHZlKCdyZXNvbHZlLicpO1xuICAgICAgICB9KTtcblxuICAgICB9KTsgLy8gZW5kIG15cHJvbWlzZVxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgIH1cblxuICAgYXN5bmMgcHJvY2Vzc0VkZ2Vyb3V0ZXJzRm9yTm9kZUNsaWNrKFxuICAgICAgICBlZGdlcm91dGVyTm9kZSxcbiAgICAgICAgbmV0d29ya0dyYXBoLFxuICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgIClcbiAgICB7XG4gICAgIGNvbnN0IG1haW5Qcm9taXNlID0gYXdhaXQgbmV3IFByb21pc2UoIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd2FpdF9wcm9taXNlcyA9IFtdO1xuICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgY29uc3QgZXIgPSBlZGdlcm91dGVycy5maW5kKChzKSA9PiBzLm5hbWUgPT09IGVkZ2Vyb3V0ZXJOb2RlLmRhdGEubmFtZSk7XG4gICAgICAgIGNvbnN0IGVyQXR0cmlidXRlcyA9IGVyLnJvbGVBdHRyaWJ1dGVzPyBlci5yb2xlQXR0cmlidXRlczogW107XG5cbiAgICAgICAgIGVyQXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdHQgPSBuZXcgQXR0cmlidXRlKCk7XG4gICAgICAgICAgICBhdHQuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICBhdHQubmFtZSA9IGF0dHI7XG4gICAgICAgICAgICBhdHQudHlwZSA9ICdFZGdlIFJvdXRlciBBdHRyaWJ1dGUnO1xuICAgICAgICAgICAgZWRnZXJvdXRlck5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGF0dCk7XG4gICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgY29uc3QgZXJwb2xpY2llc1VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKGVyLCAnZWRnZS1yb3V0ZXItcG9saWNpZXMnKTtcbiAgICAgICBsZXQgZXJwb2xpY2llc0ZvckVSID0gW107XG4gICAgICAgY29uc3QgZXJwb2xpY2llc3Byb21pc2UgPSBhd2FpdCB6aXRpU2VydmljZS5nZXQoZXJwb2xpY2llc1VybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAudGhlbiggYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGVycG9saWNpZXNGb3JFUiA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSBhd2FpdCB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJwb2xpY2llc1VybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICApIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnBvbGljaWVzRm9yRVIucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgfSAvLyBlbmQgZm9yIGxvb3BcbiAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgIGNvbnN0IGVycG9sQ2hpbGRzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgICAgICAgZXJwb2xDaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgZXJwb2xpY2llc0ZvckVSLmZvckVhY2goIChwb2wpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2xpY3kgPSBuZXcgRVJQb2xpY3koKTtcbiAgICAgICAgICAgICAgICBwb2xpY3kuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgcG9saWN5LnV1aWQgPSBwb2wuaWQ7XG4gICAgICAgICAgICAgICAgcG9saWN5Lm5hbWUgPSBwb2wubmFtZTtcbiAgICAgICAgICAgICAgICBwb2xpY3kudHlwZSA9ICdSb3V0ZXIgUG9saWN5JztcbiAgICAgICAgICAgICAgICBlcnBvbENoaWxkcy5jaGlsZHJlbi5wdXNoKHBvbGljeSk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBlcnBvbENoaWxkcy5uYW1lID0gXCJFZGdlIFJvdXRlciBQb2xpY2llcyhcIisgZXJwb2xDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBlZGdlcm91dGVyTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goZXJwb2xDaGlsZHMpO1xuICAgICAgICAgICB9KTtcbiAgICAgICB9KTtcbiAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goZXJwb2xpY2llc3Byb21pc2UpO1xuXG4gICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgfSk7XG4gICAgIH0pO1xuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgIH1cblxuICAgIHNlcnZpY2VHcm91cGluZyhzZXJ2aWNlc0NoaWxkcmVuLCBzZXJ2aWNlc3RyZWUpIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xSRFBHcnAgPSBuZXcgR3JvdXAoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUlkKCksXG4gICAgICAgICAgICAnU2VydmljZXMgW3Byb3RvY29sLVJEUF0nLFxuICAgICAgICAgICAgJ1NlcnZpY2VzIGNyZWF0ZWQgZm9yIFJEUCBwcm90b2NvbCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xIVFRQU0dycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSWQoKSxcbiAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtSFRUUFNdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFBTIHByb3RvY29sJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBwcm90b2NvbEhUVFBHcnAgPSBuZXcgR3JvdXAoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUlkKCksXG4gICAgICAgICAgICAnU2VydmljZXMgW3Byb3RvY29sLUhUVFBdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFAgcHJvdG9jb2wnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByb3RvY29sRlRQR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVJZCgpLFxuICAgICAgICAgICAgJ1NlcnZpY2VzIFtwcm90b2NvbC1GVFBdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEZUUCBwcm90b2NvbCdcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBhYmNkR3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtBLURdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBBIHRvIEQnKTtcbiAgICAgICAgY29uc3QgZWZnaEdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbRS1IXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggRSB0byBIJyk7XG4gICAgICAgIGNvbnN0IGlqa2xHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgW0ktTF0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIEkgdG8gTCcpO1xuICAgICAgICBjb25zdCBtbm9wR3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtNLVBdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBNIHRvIFAnKTtcbiAgICAgICAgY29uc3QgcXJzdEdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbRy1UXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggUSB0byBUJyk7XG4gICAgICAgIGNvbnN0IHV2d3hHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgW1UtWF0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIFUgdG8gWCcpO1xuICAgICAgICBjb25zdCB5ekdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbWS1aXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggWSBhbmQgWicpO1xuICAgICAgICBjb25zdCBvbmVUbzlHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgWzEtOV0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIDAgdG8gOScpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VydmljZXN0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlb2JqID0gc2VydmljZXN0cmVlW2ldO1xuICAgICAgICAgICAgY29uc3QgY2hhID0gc2VydmljZW9iai5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoc2VydmljZW9iai5wcm90b2NvbCA9PT0gJ3JkcCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQU0dycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnaHR0cCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZW9iai5wcm90b2NvbCA9PT0gJ2Z0cCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEZUUEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdhJyB8fCBjaGEgPT09ICdiJyB8fCBjaGEgPT09ICdjJyB8fCBjaGEgPT09ICdkJykge1xuICAgICAgICAgICAgICAgIGFiY2RHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAnZScgfHwgY2hhID09PSAnZicgfHwgY2hhID09PSAnZycgfHwgY2hhID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ2knIHx8IGNoYSA9PT0gJ2onIHx8IGNoYSA9PT0gJ2snIHx8IGNoYSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICAgICAgaWprbEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdtJyB8fCBjaGEgPT09ICduJyB8fCBjaGEgPT09ICdvJyB8fCBjaGEgPT09ICdwJykge1xuICAgICAgICAgICAgICAgIG1ub3BHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAncScgfHwgY2hhID09PSAncicgfHwgY2hhID09PSAncycgfHwgY2hhID09PSAndCcpIHtcbiAgICAgICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ3UnIHx8IGNoYSA9PT0gJ3YnIHx8IGNoYSA9PT0gJ3cnIHx8IGNoYSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgdXZ3eEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd5JyB8fCBjaGEgPT09ICd6Jykge1xuICAgICAgICAgICAgICAgIHl6R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzAnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnMScgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICcyJyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzMnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnNCcgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICc1JyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzYnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnNycgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICc4JyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzknXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBlbmQgbWFpbiBmb3IgbG9vcFxuXG4gICAgICAgIGlmIChwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLm5hbWUgPSBwcm90b2NvbFJEUEdycC5uYW1lICsgJygnICsgcHJvdG9jb2xSRFBHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sUkRQR3JwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUFNHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcm90b2NvbEhUVFBTR3JwLm5hbWUgPSBwcm90b2NvbEhUVFBTR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChwcm90b2NvbEhUVFBTR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdG9jb2xIVFRQR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUEdycC5uYW1lID0gcHJvdG9jb2xIVFRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sSFRUUEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJvdG9jb2xGVFBHcnAubmFtZSA9IHByb3RvY29sRlRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEZUUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocHJvdG9jb2xGVFBHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhYmNkR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFiY2RHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhYmNkR3JwLm5hbWUgPSBhYmNkR3JwLm5hbWUgKyAnKCcgKyBhYmNkR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChhYmNkR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZnaEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWZnaEdycC5uYW1lID0gZWZnaEdycC5uYW1lICsgJygnICsgZWZnaEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goZWZnaEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWprbEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlqa2xHcnAubmFtZSA9IGlqa2xHcnAubmFtZSArICcoJyArIGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGlqa2xHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1ub3BHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtbm9wR3JwLm5hbWUgPSBtbm9wR3JwLm5hbWUgKyAnKCcgKyBtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChtbm9wR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXJzdEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcXJzdEdycC5uYW1lID0gcXJzdEdycC5uYW1lICsgJygnICsgcXJzdEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocXJzdEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdXZ3eEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHV2d3hHcnAubmFtZSA9IHV2d3hHcnAubmFtZSArICcoJyArIHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHV2d3hHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ekdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB5ekdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHl6R3JwLm5hbWUgPSB5ekdycC5uYW1lICsgJygnICsgeXpHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHl6R3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uZVRvOUdycC5uYW1lID0gb25lVG85R3JwLm5hbWUgKyAnKCcgKyBvbmVUbzlHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKG9uZVRvOUdycCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VydmljZXNDaGlsZHJlbi5uYW1lID0gc2VydmljZXNDaGlsZHJlbi5uYW1lICsgJygnICsgc2VydmljZXN0cmVlLmxlbmd0aCArICcpJztcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VzQ2hpbGRyZW47XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0VkZ2VSb3V0ZXJQb2xpY2llc0Zvck5vZGVDbGljayhcbiAgICAgICAgZXJQb2xpY3lOb2RlLFxuICAgICAgICBuZXR3b3JrR3JhcGgsXG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgICkge1xuICAgICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgICAgY29uc3QgcmF3RVJQb2xpY3kgPSBlZGdlUm91dGVyUG9saWNpZXMuZmluZCgocykgPT4gcy5uYW1lID09PSBlclBvbGljeU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3RVJQb2xpY3ksICdpZGVudGl0aWVzJyk7XG4gICAgICAgICAgbGV0IGlkcyA9IFtdO1xuICAgICAgICAgIGNvbnN0IGlkcHJvbWlzZSA9IHppdGlTZXJ2aWNlLmdldCh1cmwsIHNlcnZpY2VzX3BhZ2luZywgW10pXG4gICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWRzID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gcGFnZXM7IHBhZ2UrKykge1xuICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0geml0aVNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICApIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBsb29wXG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3QgaWRDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBpZENoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBpZHMuZm9yRWFjaCggKGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRPYiA9IG5ldyBJZGVudGl0eSgpO1xuICAgICAgICAgICAgICAgIGlkT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgaWRPYi51dWlkID0gZXIuaWQ7XG4gICAgICAgICAgICAgICAgaWRPYi5uYW1lID0gZXIubmFtZTtcbiAgICAgICAgICAgICAgICBpZE9iLnR5cGUgPSAnSWRlbnRpdHknO1xuICAgICAgICAgICAgICAgIGlkQ2hpbGRzLmNoaWxkcmVuLnB1c2goaWRPYik7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlkQ2hpbGRzLm5hbWUgPSBcIkFjY2Vzc2libGUgSWRlbnRpdGllcyhcIisgaWRDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBlclBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGlkQ2hpbGRzKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChpZHByb21pc2UpO1xuICAgICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgICB9ICk7XG5cbiAgICAgICB9KTtcblxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgIH0gLy8gZW5kXG5cbiAgYXN5bmMgcHJvY2Vzc1NlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgIHNlcnZpY2VFclBvbGljeU5vZGUsXG4gICAgICAgIG5ldHdvcmtHcmFwaCxcbiAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgICkge1xuICAgICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgICAgY29uc3QgcmF3U2VydmljZUVSUG9saWN5ID0gc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHNlcnZpY2VFclBvbGljeU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3U2VydmljZUVSUG9saWN5LCAnZWRnZS1yb3V0ZXJzJyk7XG4gICAgICAgICAgbGV0IHJvdXRlcnMgPSBbXTtcbiAgICAgICAgICBjb25zdCBlcnByb21pc2UgPSB6aXRpU2VydmljZS5nZXQodXJsLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJvdXRlcnMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlcnMucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBsb29wXG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3QgZXJDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBlckNoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICByb3V0ZXJzLmZvckVhY2goIChlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkT2IgPSBuZXcgRVJvdXRlcigpO1xuICAgICAgICAgICAgICAgIGlkT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgaWRPYi51dWlkID0gZXIuaWQ7XG4gICAgICAgICAgICAgICAgaWRPYi5uYW1lID0gZXIubmFtZTtcbiAgICAgICAgICAgICAgICBpZE9iLnR5cGUgPSAnRWRnZSBSb3V0ZXInO1xuICAgICAgICAgICAgICAgIGVyQ2hpbGRzLmNoaWxkcmVuLnB1c2goaWRPYik7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBlckNoaWxkcy5uYW1lID0gXCJFZGdlUm91dGVycyhcIisgZXJDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBzZXJ2aWNlRXJQb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChlckNoaWxkcyk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goZXJwcm9taXNlKTtcblxuICAgICAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZ0IgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG5cbiAgICAgICAgICBjb25zdCB1cmxCID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3U2VydmljZUVSUG9saWN5LCAnc2VydmljZXMnKTtcbiAgICAgICAgICBsZXQgc2VyQXJyYXkgPSBbXTtcbiAgICAgICAgICBjb25zdCBzZXJwcm9taXNlID0geml0aVNlcnZpY2UuZ2V0KHVybEIsIHNlcnZpY2VzX3BhZ2luZ0IsIFtdKVxuICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHNlckFycmF5ID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbChyZXN1bHQubWV0YS5wYWdpbmF0aW9uLnRvdGFsQ291bnQgLyBwYWdlc2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlc0IgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nQi5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2VCID0geml0aVNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nQixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlckFycmF5LnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcHJvbWlzZXNCLnB1c2godG1wX3Byb21pc2VCKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlQik7XG4gICAgICAgICAgICB9IC8vIGVuZCBmb3IgbG9vcFxuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXNCKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICBjb25zdCBzckNoaWxkcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgIHNyQ2hpbGRzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgIHNlckFycmF5LmZvckVhY2goIChzcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNyT2IgPSBuZXcgU2VydmljZSgpO1xuICAgICAgICAgICAgICAgIHNyT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgc3JPYi51dWlkID0gc3IuaWQ7XG4gICAgICAgICAgICAgICAgc3JPYi5uYW1lID0gc3IubmFtZTtcbiAgICAgICAgICAgICAgICBzck9iLnR5cGUgPSAnU2VydmljZSc7XG4gICAgICAgICAgICAgICAgc3JDaGlsZHMuY2hpbGRyZW4ucHVzaChzck9iKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgc3JDaGlsZHMubmFtZSA9IFwiU2VydmljZXMoXCIrIHNyQ2hpbGRzLmNoaWxkcmVuLmxlbmd0aCArJyknO1xuICAgICAgICAgICAgICBzZXJ2aWNlRXJQb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChzckNoaWxkcyk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goc2VycHJvbWlzZSk7XG5cbiAgICAgICAgIFByb21pc2UuYWxsKHdhaXRfcHJvbWlzZXMpLnRoZW4oICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgICB9ICk7XG5cbiAgICAgICB9KTtcblxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgICB9IC8vIGVuZFxufSAvLyBlbmQgb2YgY2xhc3NcbiJdfQ==
|
|
884
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLnRyZWVub2RlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvbmV0d29yay12aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci50cmVlbm9kZXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFdEksTUFHYSxpQkFBaUI7SUFIOUI7UUFJSSxXQUFNLEdBQUcsQ0FBQyxDQUFDO0tBeTlCZDtJQXg5QkcsZUFBZSxDQUFDLFFBQVE7UUFDdEIsTUFBTSxNQUFNLEdBQUc7WUFDYixRQUFRLEVBQUUsTUFBTTtZQUNoQixRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSxFQUFFO1lBQ1YsS0FBSyxFQUFFLFFBQVE7WUFDZixJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBQ0YsT0FBUSxNQUFNLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyw2QkFBNkIsQ0FDL0IsWUFBWSxFQUNaLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLFdBQVcsRUFDWCxPQUFPO1FBRVgsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBRSxLQUFLLEVBQUUsT0FBTyxF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QyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzQztRQUNELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxDQUFDLElB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LEVBQUUsVUFBVSxFQUFFO1lBQ3ZELE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxNQUFNOytHQXo5QkMsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGZCxNQUFNO0VBNDlCcEIsZUFBZTtTQTE5QkosaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFNlcnZpY2VQb2xpY3ksIEF0dHJpYnV0ZSwgQ2hpbGRyZW4sIElkZW50aXR5LCBFUm91dGVyLCBFUlBvbGljeSwgR3JvdXAsIFNlcnZpY2UsIENvbmZpZyB9IGZyb20gJy4vbmV0d29yay12aXN1YWxpemVyLmhlbHBlcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVOb2RlUHJvY2Vzc29yIHtcbiAgICB1bmlxSWQgPSAwO1xuICAgIGdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSkge1xuICAgICAgY29uc3QgcGFnaW5nID0ge1xuICAgICAgICBzZWFyY2hPbjogJ25hbWUnLFxuICAgICAgICBub1NlYXJjaDogZmFsc2UsXG4gICAgICAgIGZpbHRlcjogJycsXG4gICAgICAgIHRvdGFsOiBwYWdlc2l6ZSxcbiAgICAgICAgcGFnZTogMSxcbiAgICAgICAgc29ydDogJ25hbWUnLFxuICAgICAgICBvcmRlcjogJ2FzYycsXG4gICAgICB9O1xuICAgICAgcmV0dXJuICBwYWdpbmc7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0lkZW50aXRpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgIGlkZW50aXR5Tm9kZSxcbiAgICAgICAgbmV0d29ya0dyYXBoLFxuICAgICAgICByYXdFbmRwb2ludHMsXG4gICAgICAgIHVuaXFJZCxcbiAgICAgICAgeml0aVNlcnZpY2UsXG4gICAgICAgIGNvbmZpZ3NcbiAgICApIHtcbiAgICBjb25zdCBteVByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgIGNvbnN0IHdhaXRfcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgIGNvbnN0IHJhd0VwID0gdGhpcy5maW5kUmF3RW5kcG9pbnQoaWRlbnRpdHlOb2RlLmRhdGEubmFtZSwgcmF3RW5kcG9pbnRzKTtcbiAgICAgICAgbGV0IHJhd0VwQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAocmF3RXAucm9sZUF0dHJpYnV0ZXMpIHtyYXdFcEF0dHJpYnV0ZXMgPSByYXdFcC5yb2xlQXR0cmlidXRlc307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdFcEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5uYW1lID0gcmF3RXBBdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUudHlwZSA9ICdJZGVudGl0eSBBdHRyaWJ1dGUnO1xuICAgICAgICAgICAgICAgICAgICBpZGVudGl0eU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICBjb25zdCBiaW5kU2VydmljZXMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgIGNvbnN0IGRpYWxTZXJ2aWNlcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgYmluZFNlcnZpY2VzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgZGlhbFNlcnZpY2VzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgbGV0IGlkZW50aXR5U2VydmljZVBvbGljaWVzID0gW107XG4gICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAvLyBmZXRjaCBhc3NvY2lhdGVkIHJvdXRlcnNcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd0VwLCAnZWRnZS1yb3V0ZXJzJykucmVwbGFjZSgnLi8nLCAnJyk7XG4gICAgICBsZXQgYXNzb2NpYXRlZFJvdXRlcnMgPSBbXTtcbiAgICAgIGNvbnN0IHBhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgIGNvbnN0IGVyQ2hhaWxkcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICBlckNoYWlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgIGVyQ2hhaWxkcy5uYW1lPSAnQXNzb2NpYXRlZCBSb3V0ZXJzJztcbiAgICAgICAgZXJDaGFpbGRzLnR5cGU9ICdBc3NvY2lhdGVkIFJvdXRlcnMnO1xuICAgICAgY29uc3QgYXNzb2NpYXRlZFJvdXRlcnNQcm9taXNlID0gIGF3YWl0IHppdGlTZXJ2aWNlLmdldCh1cmwsIHBhZ2luZywgW10pXG4gICAgICAgICAgIC50aGVuKCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgcmVzdWx0LmRhdGEuZm9yRWFjaCggKHJlKSA9PiB7XG4gICAgICAgICAgICAgICBjb25zdCB0bXAgPSBuZXcgRVJvdXRlcigpO1xuICAgICAgICAgICAgICAgICAgIHRtcC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICB0bXAubmFtZSA9IHJlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgdG1wLnR5cGUgPSAnUm91dGVyJztcbiAgICAgICAgICAgICAgICAgICBlckNoYWlsZHMuY2hpbGRyZW4ucHVzaCh0bXApO1xuICAgICAgICAgICAgIH0gKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShyYXdFcCwgJ3NlcnZpY2UtcG9saWNpZXMnKS5yZXBsYWNlKCcuLycsICcnKTtcbiAgICAgIGNvbnN0IHBvbGljaWVzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgIGNvbnN0IGZpcnN0UHJvbWlzZSA9ICBhd2FpdCB6aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KHBvbGljaWVzX3VybCwgcG9saWNpZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5U2VydmljZVBvbGljaWVzID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBpZGVudGl0eVNlcnZpY2VQb2xpY2llcy5mb3JFYWNoKCAoc3ApID0+IHtcbiAgICAgICAgICAgICBjb25zdCBub2RlQXJyYXkgPSAgdGhpcy5nZXRTZXJ2aWNlc0ZvckFTZXJ2aWNlUG9saWN5KHNwLCB6aXRpU2VydmljZSwgNTAwKTtcbiAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5vZGVBcnJheSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCAobm9kZUFycmF5KSA9PiB7XG4gICAgICAgICAgICAgbm9kZUFycmF5LmZvckVhY2goIChhck9iKSA9PiB7XG4gICAgICAgICAgICAgIGlmKGFyT2JbMF0gPT09ICdCaW5kJyApIHtcbiAgICAgICAgICAgICAgICAgYmluZFNlcnZpY2VzLmNoaWxkcmVuID0gdGhpcy5hcnJheU9iamVjdENvcHlSaWdodFRvTGVmdChiaW5kU2VydmljZXMuY2hpbGRyZW4sIGFyT2JbMV0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICBkaWFsU2VydmljZXMuY2hpbGRyZW4gPSB0aGlzLmFycmF5T2JqZWN0Q29weVJpZ2h0VG9MZWZ0KGRpYWxTZXJ2aWNlcy5jaGlsZHJlbiwgYXJPYlsxXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9ICk7XG4gICAgICAgIH0pO1xuXG4gICAgICBQcm9taXNlLmFsbCh3YWl0X3Byb21pc2VzKS50aGVuKCAoKSA9PiB7XG4gICAgICAgIGlmIChlckNoYWlsZHMuY2hpbGRyZW4ubGVuZ3RoID4wICkge1xuICAgICAgICAgICAgIGVyQ2hhaWxkcy5uYW1lID0gZXJDaGFpbGRzLm5hbWUrJygnK2VyQ2hhaWxkcy5jaGlsZHJlbi5sZW5ndGgrJyknO1xuICAgICAgICAgICAgIGlkZW50aXR5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goZXJDaGFpbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZihiaW5kU2VydmljZXMuY2hpbGRyZW4ubGVuZ3RoPjApIHtcbiAgICAgICAgICAgICAgYmluZFNlcnZpY2VzLm5hbWUgPSAnQmluZC1TZXJ2aWNlcygnK2JpbmRTZXJ2aWNlcy5jaGlsZHJlbi5sZW5ndGgrJyknO1xuICAgICAgICAgICAgICBpZGVudGl0eU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGJpbmRTZXJ2aWNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZGlhbFNlcnZpY2VzLmNoaWxkcmVuLmxlbmd0aD4wKSB7XG4gICAgICAgICAgICAgIGRpYWxTZXJ2aWNlcy5uYW1lID0gJ0RpYWwtU2VydmljZXMoJytkaWFsU2VydmljZXMuY2hpbGRyZW4ubGVuZ3RoKycpJztcbiAgICAgICAgICAgICAgaWRlbnRpdHlOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChkaWFsU2VydmljZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgIG5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeShuZXR3b3JrR3JhcGguZGF0YSwgZnVuY3Rpb24gKG5kKSB7XG4gICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICB9KTtcbiAgICAgICAgIHJldHVybiBbbmV0d29ya0dyYXBoLCB0aGlzLnVuaXFJZF07XG4gICAgfSAvLyBlbmQgb2YgZnVuY3Rpb25cblxuICAgIGNyZWF0ZUlkKCkge1xuICAgICAgICArK3RoaXMudW5pcUlkO1xuICAgICAgICByZXR1cm4gdGhpcy51bmlxSWQ7XG4gICAgfVxuXG4gICBjcmVhdGVTZXJ2aWNlTm9kZSggc3IpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZU9iID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgIHNlcnZpY2VPYi5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgIHNlcnZpY2VPYi51dWlkID0gc3IuaWQ7XG4gICAgICAgICBzZXJ2aWNlT2IubmFtZSA9IHNyLm5hbWU7XG4gICAgICAgICBzZXJ2aWNlT2IudHlwZSA9ICdTZXJ2aWNlJztcbiAgICAgICByZXR1cm4gc2VydmljZU9iO1xuICAgfVxuXG4gICBhcnJheU9iamVjdENvcHlSaWdodFRvTGVmdChsZWZ0QXJyLHJpZ2h0QXJyKSB7XG4gICAgIGNvbnN0IGxlZnRBcnJJZHMgPSBbXTtcbiAgICAgbGVmdEFyci5mb3JFYWNoKCAob2IpID0+IHtcbiAgICAgICBsZWZ0QXJySWRzLnB1c2gob2IuaWQpO1xuICAgICB9ICk7XG5cbiAgICAgcmlnaHRBcnIuZm9yRWFjaCggKG9iKSA9PiB7XG4gICAgICBpZiAoIWxlZnRBcnIuaW5jbHVkZXMob2IuaWQpKSB7XG4gICAgICAgICAgIGxlZnRBcnIucHVzaChvYik7XG4gICAgICB9XG4gICAgIH0gKTtcblxuICAgIHJldHVybiBsZWZ0QXJyO1xuICAgfVxuXG4gIGFkZEl0ZW1Ub0FycmF5KElkbmV0aXRpZXMsIG9iKSB7XG4gICAgaWYgKCBvYi5uYW1lICYmICFJZG5ldGl0aWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXVpZCA9PT0gb2IuaWQpKSB7XG4gICAgICBJZG5ldGl0aWVzLnB1c2godGhpcy5jcmVhdGVJZGVudGl0eShvYikpO1xuICAgIH1cbiAgICByZXR1cm4gSWRuZXRpdGllcztcbiAgfVxuICBjcmVhdGVJZGVudGl0eShvYikge1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgSWRlbnRpdHkoKTtcbiAgICAgICBlbmRwb2ludC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICBlbmRwb2ludC51dWlkID0gb2IuaWQ7XG4gICAgICAgZW5kcG9pbnQubmFtZSA9IG9iLm5hbWU7XG4gICAgICAgZW5kcG9pbnQub25saW5lID0gb2IuaGFzQXBpU2Vzc2lvbiA9PT0gdHJ1ZSA/ICdZZXMnOiAnTm8nO1xuICAgICAgIGVuZHBvaW50LnR5cGUgPSAnSWRlbnRpdHknO1xuICAgICAgIGVuZHBvaW50LnN0YXR1cyA9IG9iLnNka0luZm8gIT09IG51bGwgPyAnUmVnaXN0ZXJlZCc6ICdOb3QgUmVnaXN0ZXJlZCc7XG4gICAgICAgaWYgKG9iLnNka0luZm8pIHtcbiAgICAgICAgICAgZW5kcG9pbnQub3MgPSBvYi5zZGtJbmZvLnR5cGU/IG9iLnNka0luZm8udHlwZTogb2Iuc2RrSW5mby5hcHBJZDtcbiAgICAgICAgICAgZW5kcG9pbnQub3NWZXJzaW9uID0gb2Iuc2RrSW5mby52ZXJzaW9uO1xuICAgICAgIH1cbiAgICAgICBpZiAob2IuYXV0aFBvbGljeSAmJiBvYi5hdXRoUG9saWN5Lm5hbWUuaW5jbHVkZXMoXCJCcm93WmVyXCIpKSB7XG4gICAgICAgICAgIGVuZHBvaW50LnR5cGUgPSAnQnJvd1plciBJZGVudGl0eSc7XG4gICAgICAgfVxuICAgICAgIGVuZHBvaW50LmNyZWF0ZWRBdCA9IG9iLmNyZWF0ZWRBdDtcbiAgICAgICBlbmRwb2ludC51cGRhdGVkQXQgPSBvYi51cGRhdGVkQXQ7XG5cbiAgICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG4gIGdldExpbmtGb3JSZXNvdXJjZShvYiwgcmVzb3VyY2UpIHtcbiAgICByZXR1cm4gb2JbJ19saW5rcyddW3Jlc291cmNlXVsnaHJlZiddO1xuICB9XG5cbiAgICBmaW5kU2VydmljZXNIb3N0ZWRPbkVuZHBvaW50KHJhd0VwLCBzZXJ2aWNlcywgc2VydmljZVBvbGljaWVzLCB6aXRpU2VydmljZSkge1xuICAgICAgIGNvbnN0IHNlcnZpY2VzQXJyID0gW107XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuTm9Hcm91cHMgPSBbXTtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRBdHRyID0gcmF3RXAucm9sZUF0dHJpYnV0ZXM/IHJhd0VwLnJvbGVBdHRyaWJ1dGVzOiBbXTtcbiAgICAgICAgZW5kcG9pbnRBdHRyLnB1c2goJ0AnK3Jhd0VwLmlkKTtcblxuICAgICAgICBsZXQgZGlhbFNlcnZpY2VBdHRycyA9IFtdO1xuICAgICAgICBsZXQgYmluZFNlcnZpY2VBdHRycyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGJpbmRQb2xpY2llcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICBiaW5kUG9saWNpZXMubmFtZSA9ICdCaW5kLVBvbGljaWVzJztcbiAgICAgICAgY29uc3QgZGlhbFBvbGljaWVzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgICAgICBkaWFsUG9saWNpZXMubmFtZSA9ICdEaWFsLVBvbGljaWVzJztcblxuICAgICAgICBiaW5kUG9saWNpZXMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgIGRpYWxQb2xpY2llcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcblxuICAgICAgICBzZXJ2aWNlUG9saWNpZXMuZmluZCggKHNwKSA9PiB7XG4gICAgICAgICAgc3AuaWRlbnRpdHlSb2xlcy5maW5kKCAoYXR0cikgPT4ge1xuICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRBdHRyLmluY2x1ZGVzKGF0dHIpICkge1xuICAgICAgICAgICAgICAgaWYgKHNwLnR5cGUgPT09ICdCaW5kJykge1xuICAgICAgICAgICAgICAgICAgIGNvbnN0IHNQb2xpY3kgPSBuZXcgU2VydmljZVBvbGljeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS5uYW1lID0gc3AubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBzUG9saWN5LnR5cGUgPSBzcC50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kuY2hpbGRyZW4gPSB0aGlzLmdldFNlcnZpY2VzRm9yUG9saWN5KHNlcnZpY2VzLCBzcCk7XG4gICAgICAgICAgICAgICAgICAgYmluZFBvbGljaWVzLmNoaWxkcmVuLnB1c2goc3ApO1xuICAgICAgICAgICAgICAgICAgIGJpbmRTZXJ2aWNlQXR0cnMgPSBmaWxsQXJyYXkoYmluZFNlcnZpY2VBdHRycywgc3Auc2VydmljZVJvbGVzKTtcbiAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgIGNvbnN0IHNQb2xpY3kgPSBuZXcgU2VydmljZVBvbGljeSgpO1xuICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgIHNQb2xpY3kubmFtZSA9IHNwLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICBzUG9saWN5LnR5cGUgPSBzcC50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgc1BvbGljeS5jaGlsZHJlbiA9IHRoaXMuZ2V0U2VydmljZXNGb3JQb2xpY3koc2VydmljZXMsIHNwKSA7XG4gICAgICAgICAgICAgICAgIGRpYWxQb2xpY2llcy5jaGlsZHJlbi5wdXNoKHNQb2xpY3kpO1xuICAgICAgICAgICAgICAgIGRpYWxTZXJ2aWNlQXR0cnMgPSBmaWxsQXJyYXkoZGlhbFNlcnZpY2VBdHRycywgc3Auc2VydmljZVJvbGVzKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9ICk7XG5cbiAgICAgICAgZnVuY3Rpb24gZmlsbEFycmF5KGFycjEsIGFycjIpIHtcbiAgICAgICAgICBhcnIyLmZvckVhY2goIChpdGVtKSA9PiB7XG4gICAgICAgICAgIGFycjEucHVzaChpdGVtKTtcbiAgICAgICAgICB9ICk7XG4gICAgICAgICAgcmV0dXJuIGFycjE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiaW5kU2VydmljZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZGlhbFNlcnZpY2VzID0gW107XG5cbiAgICAgICAgc2VydmljZXMgJiYgc2VydmljZXMuZm9yRWFjaCggKHNyKSA9PiB7XG4gICAgICAgICAgc3Iucm9sZUF0dHJpYnV0ZXMgJiYgc3Iucm9sZUF0dHJpYnV0ZXMuZm9yRWFjaCggKGF0dHIpID0+IHtcbiAgICAgICAgICAgICBpZiAoZGlhbFNlcnZpY2VBdHRycy5pbmNsdWRlcyhhdHRyKSApIHtcbiAgICAgICAgICAgICAgIGRpYWxTZXJ2aWNlcy5wdXNoKHRoaXMuY3JlYXRlU2VydmljZU5vZGUoc3IpICk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGlmIChiaW5kU2VydmljZUF0dHJzLmluY2x1ZGVzKGF0dHIpICkge1xuICAgICAgICAgICAgICAgIGJpbmRTZXJ2aWNlcy5wdXNoKCB0aGlzLmNyZWF0ZVNlcnZpY2VOb2RlKHNyKSApO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICB9ICk7XG4gICAgICAgIH0pO1xuICAgICAgIGlmIChkaWFsU2VydmljZXMubGVuZ3RoID4wICkge1xuICAgICAgICAgIGNvbnN0IGRpYWxHcm91cCA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgIGRpYWxHcm91cC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICBkaWFsR3JvdXAubmFtZSA9ICdTZXJ2aWNlcy1EaWFsJztcbiAgICAgICAgICBkaWFsR3JvdXAuY2hpbGRyZW4gPSBkaWFsU2VydmljZXM7XG4gICAgICAgICAgc2VydmljZXNBcnIucHVzaChkaWFsR3JvdXApO1xuICAgICAgIH1cbiAgICAgICBpZiAoYmluZFNlcnZpY2VzLmxlbmd0aCA+MCApIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRHcm91cCA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgYmluZEdyb3VwLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgYmluZEdyb3VwLm5hbWUgPSAnU2VydmljZXMtQmluZCc7XG4gICAgICAgICAgICBiaW5kR3JvdXAuY2hpbGRyZW4gPSBiaW5kU2VydmljZXM7XG4gICAgICAgICAgICBzZXJ2aWNlc0Fyci5wdXNoKGJpbmRHcm91cCk7XG4gICAgICAgfVxuICAgICByZXR1cm4gc2VydmljZXNBcnI7XG5cblxuICAgIH0gLy8gZW5kIG9mIGZpbmQgc2VydmljZXNIb3N0ZWRPbkVuZHBvaW50XG5cbiAgIGdldFNlcnZpY2VzRm9yUG9saWN5KHNlcnZpY2VzLCBzcE9iKSB7XG4gICAgIGNvbnN0IHNlcnZpY2VzRm90UG9saWN5ID0gW107XG4gICAgIHNlcnZpY2VzICYmIHNlcnZpY2VzLmZvckVhY2goIChzcikgPT4ge1xuICAgICAgICAgY29uc3QgYXR0cnMgPSBzci5yb2xlQXR0cmlidXRlcyA/IHNyLnJvbGVBdHRyaWJ1dGVzOiBbXTtcbiAgICAgICAgIGF0dHJzLnB1c2goJ0AnK3NwT2IuaWQpO1xuICAgICAgICAgYXR0cnMuZmluZCggKGF0cikgPT4ge1xuICAgICAgICAgICAgaWYoc3BPYi5zZXJ2aWNlUm9sZXMuaW5jbHVkZXMoYXRyKSApe1xuICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZU5vZGUgPSBuZXcgU2VydmljZSgpO1xuICAgICAgICAgICAgICAgc2VydmljZU5vZGUuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICBzZXJ2aWNlTm9kZS5uYW1lID0gc3IubmFtZTtcbiAgICAgICAgICAgICAgIHNlcnZpY2VOb2RlLnR5cGUgPSAnU2VydmljZSc7XG4gICAgICAgICAgICAgc2VydmljZXNGb3RQb2xpY3kucHVzaChzZXJ2aWNlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9KTtcbiAgICAgfSk7XG4gICAgcmV0dXJuIHNlcnZpY2VzRm90UG9saWN5O1xuICAgfVxuXG4gICAgZmluZFJhd0VuZHBvaW50KGVwTmFtZSwgZW5kcG9pbnRzKSB7XG4gICAgICAgcmV0dXJuIGVuZHBvaW50cy5maW5kKChlcCkgPT4gZXAubmFtZSA9PT0gZXBOYW1lKTtcbiAgICB9XG5cbiAgc2VydmljZUNvbmZpZ0FsaWFzKGNvbmZpZ3MpIHtcbiAgICAgbGV0IGludGVyY2VwdCA9IFtdO1xuICAgICBfLmlzQXJyYXkoY29uZmlncykgJiYgY29uZmlncy5mb3JFYWNoKCAoY29uZikgPT4ge1xuICAgICAgICAgICBsZXQgYWRkcmVzc2VzID0gJyc7XG4gICAgICAgICAgIGxldCBwb3J0cyA9ICcnO1xuICAgICAgICAgIGlmIChjb25mLmRhdGEuYWRkcmVzc2VzKSB7XG4gICAgICAgICAgICAgYWRkcmVzc2VzID0gY29uZi5kYXRhLmFkZHJlc3Nlcy50b1N0cmluZygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgYWRkcmVzc2VzID0gY29uZi5kYXRhLmFkZHJlc3M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF8uaXNBcnJheShjb25mLmRhdGEucG9ydFJhbmdlcykgKSB7XG4gICAgICAgICAgICAgIGNvbmYuZGF0YS5wb3J0UmFuZ2VzLmZvckVhY2goIChwb3J0c0pzb24pID0+IHtcbiAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHBvcnRzSnNvbikge1xuICAgICAgICAgICAgICAgICAgcG9ydHMgPSBwb3J0cyArIGtleSArJzonK3BvcnRzSnNvbltrZXldICsnICcgO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBwb3J0cyA9IHBvcnRzICsgJzsnO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBvcnRzID0gIGNvbmYuZGF0YS5wb3J0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnRlcmNlcHQucHVzaChhZGRyZXNzZXMpO1xuICAgICAgICAgIGludGVyY2VwdC5wdXNoKHBvcnRzKTtcbiAgICAgfSk7XG4gICAgIHJldHVybiBpbnRlcmNlcHQ7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzU2VydmljZXNGb3JOb2RlQ2xpY2soc2VydmljZU5vZGUsIG5ldHdvcmtHcmFwaCwgc2VydmljZXMsIHVuaXFJZCwgeml0aVNlcnZpY2UpIHtcbiAgICAgY29uc3QgbXlQcm9taXNlID0gYXdhaXQgbmV3IFByb21pc2UoIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd2FpdF9wcm9taXNlcyA9IFtdO1xuICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgY29uc3QgcmF3U2VydmljZU9iaiA9IHNlcnZpY2VzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gc2VydmljZU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc3dpdGhOYW1lID0gW107XG5cbiAgICAgICAgcmF3U2VydmljZU9iai5yb2xlQXR0cmlidXRlcyAmJiByYXdTZXJ2aWNlT2JqLnJvbGVBdHRyaWJ1dGVzLmZpbmQoKHNyYXR0cikgPT4ge1xuICAgICAgICAgICAgYXR0cmlidXRlc3dpdGhOYW1lLnB1c2goc3JhdHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VBdHRyaWJ1dGVzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLm5hbWUgPSAnQXR0cmlidXRlcyc7XG4gICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLnR5cGUgPSAnQXR0cmlidXRlcyc7XG4gICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGF0dHJpYnV0ZXN3aXRoTmFtZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgYXR0ck9iID0gbmV3IEF0dHJpYnV0ZSgpO1xuICAgICAgICAgICAgYXR0ck9iLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgYXR0ck9iLm5hbWUgPSBhdHRyaWJ1dGVzd2l0aE5hbWVba107XG4gICAgICAgICAgICBhdHRyT2IudHlwZSA9ICdBdHRyaWJ1dGUnO1xuXG4gICAgICAgICAgICBzZXJ2aWNlQXR0cmlidXRlcy5jaGlsZHJlbi5wdXNoKGF0dHJPYik7XG4gICAgICAgIH0gLy8gZW5kIGlubmVyIGZvciBsb29wXG4gICAgICAgIGlmIChzZXJ2aWNlQXR0cmlidXRlcy5jaGlsZHJlbi5sZW5ndGggPjAgKSB7XG4gICAgICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzLm5hbWUgPSBzZXJ2aWNlQXR0cmlidXRlcy5uYW1lKycoJysgc2VydmljZUF0dHJpYnV0ZXMuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICBzZXJ2aWNlTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goc2VydmljZUF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlcnZpY2VfY29uZmlncyA9IFtdO1xuICAgICAgICBjb25zdCBjb25maWdzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd1NlcnZpY2VPYmosICdjb25maWdzJyk7XG4gICAgICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgICAgICBjb25zdCBwYWdpbmdPYiA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICAgY29uc3QgY29uZmlnUHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgICAuZ2V0KGNvbmZpZ3NfdXJsLCBwYWdpbmdPYiwgW10pXG4gICAgICAgICAudGhlbigoY29uZmlncykgPT4ge1xuICAgICAgICAgICBzZXJ2aWNlX2NvbmZpZ3MgPSBjb25maWdzICYmIGNvbmZpZ3MuZGF0YSA/IGNvbmZpZ3MuZGF0YSA6IFtdO1xuICAgICAgICAgICBjb25zdCBjaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgY2hpbGRzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICBjaGlsZHMubmFtZSA9ICdTZXJ2aWNlIENvbmZpZ3MnO1xuICAgICAgICAgICBjaGlsZHMudHlwZSA9ICdTZXJ2aWNlIENvbmZpZ3MnO1xuICAgICAgICAgICBjb25zdCBzZXJ2aWNlX2NvbmZpZ3NfQXJyID0gW107XG4gICAgICAgICAgIHNlcnZpY2VfY29uZmlncy5mb3JFYWNoKCAoY2ZnKSA9PiB7XG4gICAgICAgICAgICAgY29uc3Qgb2JqID0gbmV3IENvbmZpZygpO1xuICAgICAgICAgICAgIG9iai5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBvYmoubmFtZSA9IGNmZy5uYW1lO1xuICAgICAgICAgICAgIG9iai51dWlkID0gY2ZnLnV1aWQ7XG4gICAgICAgICAgICAgb2JqLmRhdGEgPSBKU09OLnN0cmluZ2lmeShjZmcuZGF0YSk7XG4gICAgICAgICAgICAgc2VydmljZV9jb25maWdzX0Fyci5wdXNoKG9iaik7XG4gICAgICAgICAgIH0gKTtcblxuICAgICAgICAgICBpZiAoc2VydmljZV9jb25maWdzX0Fyci5sZW5ndGggPjAgKSB7XG4gICAgICAgICAgICAgIGNoaWxkcy5jaGlsZHJlbiA9IHNlcnZpY2VfY29uZmlnc19BcnI7XG4gICAgICAgICAgICAgIGNoaWxkcy5uYW1lID0gY2hpbGRzLm5hbWUgKycoJytjaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICBzZXJ2aWNlTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goY2hpbGRzKTtcbiAgICAgICAgICAgICAgc2VydmljZU5vZGUuZGF0YS5pbnRlcmNlcHQgPSB0aGlzLnNlcnZpY2VDb25maWdBbGlhcyhzZXJ2aWNlX2NvbmZpZ3MpO1xuICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKGNvbmZpZ1Byb21pc2UpO1xuICAgICAgIGNvbnN0IHNlcnZpY2VfZWRnZV9yb3V0ZXJfcG9saWNpZXNfdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoXG4gICAgICAgICByYXdTZXJ2aWNlT2JqLFxuICAgICAgICAnc2VydmljZS1lZGdlLXJvdXRlci1wb2xpY2llcydcbiAgICAgICApO1xuICAgICAgIGxldCBzZXJ2aWNlX3JvdXRlcnNfdXJscyA9IFtdO1xuICAgICAgIGNvbnN0IHNlcl9wcm9tc2UgPSAgYXdhaXQgeml0aVNlcnZpY2VcbiAgICAgICAgICAgICAuZ2V0KHNlcnZpY2VfZWRnZV9yb3V0ZXJfcG9saWNpZXNfdXJsLnJlcGxhY2UoJy4vJywgJycpLCBwYWdpbmdPYiwgW10pXG4gICAgICAgICAgICAgLnRoZW4oIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmZvckVhY2goIChzZXJwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Vfcm91dGVyc191cmxzLnB1c2goIHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHNlcnAsJ2VkZ2Utcm91dGVycycpICk7XG4gICAgICAgICAgICAgICAgICB9ICk7O1xuICAgICAgICAgICAgIH0pO1xuICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChzZXJfcHJvbXNlKTtcbiAgICAgICBsZXQgc2VycF9wYWdlX1Byb21pc2VzID0gW107XG4gICAgICAgc2VydmljZV9yb3V0ZXJzX3VybHMuZm9yRWFjaCgoZXJfdXJsKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvbXNlID0gIHppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldChlcl91cmwucmVwbGFjZSgnLi8nLCAnJyksIHBhZ2luZ09iLCBbXSk7XG4gICAgICAgICAgICAgICAgLy8gLnRoZW4ocmVzdWx0ID0+IFtwb2xpY3kudHlwZSwgcmVzdWx0XSk7XG4gICAgICAgICAgc2VycF9wYWdlX1Byb21pc2VzLnB1c2gocHJvbXNlKTtcbiAgICAgICB9KTtcbiAgICAgICBsZXQgYXNzb2NpYXRlZFJvdXRlcnMgPSBbXTtcbiAgICAgICBhd2FpdCBQcm9taXNlLmFsbChzZXJwX3BhZ2VfUHJvbWlzZXMpLnRoZW4oICh2YWx1ZXM6YW55KSA9PiB7XG4gICAgICAgICB2YWx1ZXMgJiYgdmFsdWVzLmZvckVhY2goKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKCAoZXIpPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXJPYiA9IG5ldyBFUm91dGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlck9iLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJPYi5uYW1lID0gICBlci5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXIudHlwZSA9ICdSb3V0ZXInO1xuICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZFJvdXRlcnMucHVzaChlck9iKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICB9XG4gICAgICAgICB9KVxuICAgICAgICAgY29uc3QgdG1wID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgICAgICAgdG1wLm5hbWUgPSBcIkFzc29jaWF0ZWQgUm91dGVycyhcIiArIGFzc29jaWF0ZWRSb3V0ZXJzLmxlbmd0aCArJyknO1xuICAgICAgICAgICAgIHRtcC50eXBlID0gXCJSb3V0ZXJzXCI7XG4gICAgICAgICAgICAgdG1wLmNoaWxkcmVuID0gYXNzb2NpYXRlZFJvdXRlcnM7XG4gICAgICAgICAgICAgdG1wLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgIHNlcnZpY2VOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaCh0bXApO1xuICAgICAgIH0pO1xuXG4gICAgICAgY29uc3Qgc2VydmljZV9wb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgcmF3U2VydmljZU9iaixcbiAgICAgICAgJ3NlcnZpY2UtcG9saWNpZXMnXG4gICAgICAgKS5yZXBsYWNlKCcuLycsICcnKTsgLy8gZGlhbCwgQmluZCBpbmZvXG5cbiAgICAgICBsZXQgYmluZFBvbGljaWVzID0gW107XG4gICAgICAgbGV0IGJpbmRJZG5ldGl0aWVzID0gW107XG4gICAgICAgbGV0IGRpYWxJZG5ldGl0aWVzID0gW107XG5cbiAgICAgICBjb25zdCBwcm9taXNlMiA9IGF3YWl0IHppdGlTZXJ2aWNlXG4gICAgICAgLmdldChzZXJ2aWNlX3BvbGljaWVzX3VybCwgcGFnaW5nT2IsIFtdKVxuICAgICAgIC50aGVuKChwb2xpY2llcykgPT4ge1xuICAgICAgICAgYmluZFBvbGljaWVzID0gcG9saWNpZXMuZGF0YTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwYWdlUHJvbWlzZXMgPSBbXTtcbiAgICAgIGJpbmRQb2xpY2llcy5mb3JFYWNoKCAgKHBvbGljeSkgPT4ge1xuICAgICAgICAgY29uc3QgYmluZElkZW50aXRpZXNVcmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICAgICdpZGVudGl0aWVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcHJvbXNlID0gIHppdGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldChiaW5kSWRlbnRpdGllc1VybC5yZXBsYWNlKCcuLycsICcnKSwgcGFnaW5nT2IsIFtdKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiBbcG9saWN5LnR5cGUsIHJlc3VsdF0pO1xuICAgICAgICAgIHBhZ2VQcm9taXNlcy5wdXNoKHByb21zZSk7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHBhZ2VQcm9taXNlcykudGhlbiggKHZhbHVlczphbnkpID0+IHtcbiAgICAgICAgICB2YWx1ZXMgJiYgdmFsdWVzLmZvckVhY2goKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgaWYgKHJlcyAmJiByZXNbMV0uZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJlc1sxXS5kYXRhLmZvckVhY2goKHJzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYocmVzWzBdID09PSAnQmluZCcpIHtcbiAgICAgICAgICAgICAgICAgYmluZElkbmV0aXRpZXMgPSB0aGlzLmFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCBycyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlc1swXSA9PT0gJ0RpYWwnKXtcbiAgICAgICAgICAgICAgICAgZGlhbElkbmV0aXRpZXMgPSB0aGlzLmFkZEl0ZW1Ub0FycmF5KGRpYWxJZG5ldGl0aWVzLCBycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgIGlmKHJlc1swXSA9PT0gJ0JpbmQnKSB7XG4gICAgICAgICAgICAgICAgIGJpbmRJZG5ldGl0aWVzID0gdGhpcy5hZGRJdGVtVG9BcnJheShiaW5kSWRuZXRpdGllcywgcmVzWzFdLmRhdGEpO1xuICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlc1swXSA9PT0gJ0RpYWwnKXtcbiAgICAgICAgICAgICAgICAgZGlhbElkbmV0aXRpZXMgPSB0aGlzLmFkZEl0ZW1Ub0FycmF5KGRpYWxJZG5ldGl0aWVzLCByZXNbMV0uZGF0YSk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgIH1cblxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgIGNvbnN0IHRtcCA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgIHRtcC5uYW1lID0gXCJCaW5kIElkZW50aXRpZXMoXCIgKyBiaW5kSWRuZXRpdGllcy5sZW5ndGggKycpJztcbiAgICAgICAgICAgICB0bXAudHlwZSA9IFwiSWRlbnRpdGllc1wiO1xuICAgICAgICAgICAgIHRtcC5jaGlsZHJlbiA9IGJpbmRJZG5ldGl0aWVzO1xuICAgICAgICAgICAgIHRtcC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBzZXJ2aWNlTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2godG1wKTtcbiAgICAgICAgICAgY29uc3QgdG1wRGlhbCA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgIHRtcERpYWwubmFtZSA9IFwiRGlhbCBJZGVudGl0aWVzKFwiICsgZGlhbElkbmV0aXRpZXMubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgdG1wRGlhbC50eXBlID0gXCJJZGVudGl0aWVzXCI7XG4gICAgICAgICAgICAgdG1wRGlhbC5jaGlsZHJlbiA9IGRpYWxJZG5ldGl0aWVzO1xuICAgICAgICAgICAgIHRtcERpYWwuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgc2VydmljZU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKHRtcERpYWwpO1xuICAgICAgICAgcmVzb2x2ZSgndGhpcyBpcyBhIHByb21pc2UnKTtcbiAgICAgIH0pO1xuICAgICAgIFByb21pc2UuYWxsKHdhaXRfcHJvbWlzZXMpLnRoZW4oICgpID0+IHsgfSk7XG4gICAgfSk7IC8vIGVuZCBvZiBteXByb21pc2VcblxuICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICByZXR1cm4gbmQuY2hpbGRyZW47XG4gICAgIH0pO1xuICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgfSAvLyBlbmQgb2YgcHJvY2Vzc1NlcnZpY2VzRm9yTm9kZUNsaWNrXG5cblxuICBhc3luYyBwcm9jZXNzU2VydmljZVBvbGljaWVzRm9yTm9kZUNsaWNrKHBvbGljeU5vZGUsIG5ldHdvcmtHcmFwaCwgIHNlcnZpY2VQb2xpY2llcywgdW5pcUlkLCB6aXRpU2VydmljZSkge1xuICAgICBjb25zdCBteVByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgIHRoaXMudW5pcUlkID0gdW5pcUlkO1xuICAgICAgICBjb25zdCByYXdTUG9saWN5ID0gc2VydmljZVBvbGljaWVzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gcG9saWN5Tm9kZS5kYXRhLm5hbWUpO1xuICAgICAgICBjb25zdCBjaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgIGNoaWxkcy5uYW1lID0gXCJBdHRyaWJ1dGVzXCI7XG4gICAgICAgICBjaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG5cbiAgICAgICAgcmF3U1BvbGljeS5zZXJ2aWNlUm9sZXMgJiYgcmF3U1BvbGljeS5zZXJ2aWNlUm9sZXMuZm9yRWFjaCggKG9iKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXR0ciA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgIGF0dHIubmFtZSA9IG9iO1xuICAgICAgICAgICAgYXR0ci5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIGF0dHIudHlwZSA9IFwiU2VydmljZSBBdHRyaWJ1dGVcIjtcbiAgICAgICAgICBjaGlsZHMuY2hpbGRyZW4ucHVzaChhdHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJhd1NQb2xpY3kuaWRlbnRpdHlSb2xlcyAmJiByYXdTUG9saWN5LmlkZW50aXR5Um9sZXMuZm9yRWFjaCggKG9iKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXR0ciA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgYXR0ci5uYW1lID0gb2I7XG4gICAgICAgICAgIGF0dHIuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgIGF0dHIudHlwZSA9IFwiSWRlbnRpdHkgQXR0cmlidXRlXCI7XG4gICAgICAgICAgY2hpbGRzLmNoaWxkcmVuLnB1c2goYXR0cik7XG4gICAgICAgIH0pO1xuICAgICAgICBjaGlsZHMubmFtZSA9IGNoaWxkcy5uYW1lICsgJygnKyBjaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgcG9saWN5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goY2hpbGRzKTtcblxuICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgY29uc3QgaWRlbnRpdGllc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgIGNvbnN0IGJpbmRJZGVudGl0aWVzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoIHJhd1NQb2xpY3ksICdpZGVudGl0aWVzJyApO1xuICAgICAgICAvLyB0aGlzLmxvZ2dlci5pbmZvKCdiaW5kSWRlbnRpdGllc1VybCcsYmluZElkZW50aXRpZXNVcmwpO1xuICAgICAgICBjb25zdCBzcF9wcm9taXNlID0gYXdhaXQgeml0aVNlcnZpY2UuZ2V0KGJpbmRJZGVudGl0aWVzVXJsLCBpZGVudGl0aWVzX3BhZ2luZywgW10pXG4gICAgICAgLnRoZW4oKGlkcykgPT4ge1xuICAgICAgICAgY29uc3QgY2hpbGRzID1uZXcgQ2hpbGRyZW4oKVxuICAgICAgICAgY2hpbGRzLm5hbWUgPSByYXdTUG9saWN5LnR5cGUrICctSWRlbnRpdGllcyc7XG4gICAgICAgICBjaGlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICBpZHMuZGF0YS5mb3JFYWNoKCAoaWRPYikgPT4ge1xuICAgICAgICAgICBjaGlsZHMuY2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZUlkZW50aXR5KGlkT2IpICk7XG4gICAgICAgICB9KTtcbiAgICAgICAgIGNoaWxkcy5uYW1lID0gY2hpbGRzLm5hbWUgKyAnKCcgKyBjaGlsZHMuY2hpbGRyZW4ubGVuZ3RoKycpJztcbiAgICAgICAgIHBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGNoaWxkcyk7XG4gICAgICAgfSk7XG4gICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHNwX3Byb21pc2UpO1xuXG4gICAgICAgY29uc3Qgc2VydmljZXNfcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgIGNvbnN0IGJpbmRTZXJ2aWNlc1VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKCByYXdTUG9saWN5LCAnc2VydmljZXMnICk7ICAvLyBwdWxsIHNlcnZpY2VzXG4gICAgICAgY29uc3QgX3Byb21pc2UgPSBhd2FpdCB6aXRpU2VydmljZS5nZXQoYmluZFNlcnZpY2VzVXJsLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgIGNvbnN0IGNoaWxkcyA9bmV3IENoaWxkcmVuKClcbiAgICAgICAgIGNoaWxkcy5uYW1lID0gcmF3U1BvbGljeS50eXBlKyAnLVNlcnZpY2VzJztcbiAgICAgICAgIGNoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgIHJlc3VsdC5kYXRhLmZvckVhY2goIChpZE9iKSA9PiB7XG4gICAgICAgICAgIGNvbnN0IHNwID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgICAgIHNwLmlkID0gaWRPYi5pZDtcbiAgICAgICAgICAgIHNwLm5hbWUgPSBpZE9iLm5hbWU7XG4gICAgICAgICAgICBzcC50eXBlID0gJ1NlcnZpY2UnO1xuICAgICAgICAgICAgY2hpbGRzLmNoaWxkcmVuLnB1c2goc3ApO1xuICAgICAgICAgfSk7XG4gICAgICAgICBjaGlsZHMubmFtZSA9IGNoaWxkcy5uYW1lICsgJygnICsgY2hpbGRzLmNoaWxkcmVuLmxlbmd0aCsnKSc7XG4gICAgICAgICBwb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChjaGlsZHMpO1xuICAgICAgIH0pO1xuXG4gICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKF9wcm9taXNlKTtcblxuICAgICAgICBQcm9taXNlLmFsbCh3YWl0X3Byb21pc2VzKS50aGVuKCAoKSA9PiB7XG4gICAgICAgICAgIHJlc29sdmUoJ3Jlc29sdmUuJyk7XG4gICAgICAgIH0pO1xuXG4gICAgIH0pOyAvLyBlbmQgbXlwcm9taXNlXG4gICAgICAgIG5ldHdvcmtHcmFwaCA9IGQzLmhpZXJhcmNoeShuZXR3b3JrR3JhcGguZGF0YSwgZnVuY3Rpb24gKG5kKSB7XG4gICAgICAgICAgICByZXR1cm4gbmQuY2hpbGRyZW47XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgIH1cblxuICAgYXN5bmMgZ2V0U2VydmljZXNGb3JBU2VydmljZVBvbGljeShwb2xpY3lPYmplY3QsIHppdGlTZXJ2aWNlLCBwYWdlc2l6ZT01MDApIHtcbiAgICAgICBjb25zdCBjaGlsZHMgPSBbXTtcbiAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgY29uc3QgYmluZFNlcnZpY2VzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoIHBvbGljeU9iamVjdCwgJ3NlcnZpY2VzJyApO1xuICAgICAgIGNvbnN0IF9wcm9taXNlID0gYXdhaXQgeml0aVNlcnZpY2UuZ2V0KGJpbmRTZXJ2aWNlc1VybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICByZXN1bHQuZGF0YS5mb3JFYWNoKCAoaWRPYikgPT4ge1xuICAgICAgICAgICBjb25zdCBzcCA9IG5ldyBTZXJ2aWNlKCk7XG4gICAgICAgICAgICBzcC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIHNwLnV1aWQgPSBpZE9iLmlkO1xuICAgICAgICAgICAgc3AubmFtZSA9IGlkT2IubmFtZTtcbiAgICAgICAgICAgIHNwLnR5cGUgPSAnU2VydmljZSc7XG4gICAgICAgICAgICBjaGlsZHMucHVzaChzcCk7XG4gICAgICAgICB9KTtcbiAgICAgICB9KTtcbiAgICAgICByZXR1cm4gW3BvbGljeU9iamVjdC50eXBlLCBjaGlsZHNdO1xuICAgfVxuXG4gICBhc3luYyBwcm9jZXNzRWRnZXJvdXRlcnNGb3JOb2RlQ2xpY2soXG4gICAgICAgIGVkZ2Vyb3V0ZXJOb2RlLFxuICAgICAgICBuZXR3b3JrR3JhcGgsXG4gICAgICAgIGVkZ2Vyb3V0ZXJzLFxuICAgICAgICB1bmlxSWQsXG4gICAgICAgIHppdGlTZXJ2aWNlXG4gICAgKVxuICAgIHtcbiAgICAgY29uc3QgbWFpblByb21pc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSggYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgIHRoaXMudW5pcUlkID0gdW5pcUlkO1xuICAgICAgICBjb25zdCBlciA9IGVkZ2Vyb3V0ZXJzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gZWRnZXJvdXRlck5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgY29uc3QgZXJBdHRyaWJ1dGVzID0gZXIucm9sZUF0dHJpYnV0ZXM/IGVyLnJvbGVBdHRyaWJ1dGVzOiBbXTtcblxuICAgICAgICAgZXJBdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGF0dCA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgIGF0dC5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIGF0dC5uYW1lID0gYXR0cjtcbiAgICAgICAgICAgIGF0dC50eXBlID0gJ0VkZ2UgUm91dGVyIEF0dHJpYnV0ZSc7XG4gICAgICAgICAgICBlZGdlcm91dGVyTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goYXR0KTtcbiAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgICAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICBjb25zdCBlcnBvbGljaWVzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoZXIsICdlZGdlLXJvdXRlci1wb2xpY2llcycpO1xuICAgICAgIGxldCBlcnBvbGljaWVzRm9yRVIgPSBbXTtcbiAgICAgICBjb25zdCBlcnBvbGljaWVzcHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlLmdldChlcnBvbGljaWVzVXJsLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgIC50aGVuKCBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXJwb2xpY2llc0ZvckVSID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgICAgc2VydmljZXNfcGFnaW5nLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgICBjb25zdCB0bXBfcHJvbWlzZSA9IGF3YWl0IHppdGlTZXJ2aWNlLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnBvbGljaWVzVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycG9saWNpZXNGb3JFUi5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHByb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICB9IC8vIGVuZCBmb3IgbG9vcFxuICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3QgZXJwb2xDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBlcnBvbENoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBlcnBvbGljaWVzRm9yRVIuZm9yRWFjaCggKHBvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvbGljeSA9IG5ldyBFUlBvbGljeSgpO1xuICAgICAgICAgICAgICAgIHBvbGljeS5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICBwb2xpY3kudXVpZCA9IHBvbC5pZDtcbiAgICAgICAgICAgICAgICBwb2xpY3kubmFtZSA9IHBvbC5uYW1lO1xuICAgICAgICAgICAgICAgIHBvbGljeS50eXBlID0gJ1JvdXRlciBQb2xpY3knO1xuICAgICAgICAgICAgICAgIHBvbGljeS5pc1N5c3RlbSA9IHBvbC5pc1N5c3RlbTtcbiAgICAgICAgICAgICAgICBwb2xpY3kuc2VtYW50aWMgPSBwb2wuc2VtYW50aWM7XG4gICAgICAgICAgICAgICAgcG9saWN5LnJvb3ROb2RlID0gJ05vJztcbiAgICAgICAgICAgICAgICBlcnBvbENoaWxkcy5jaGlsZHJlbi5wdXNoKHBvbGljeSk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBlcnBvbENoaWxkcy5uYW1lID0gXCJFZGdlIFJvdXRlciBQb2xpY2llcyhcIisgZXJwb2xDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBlZGdlcm91dGVyTm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goZXJwb2xDaGlsZHMpO1xuICAgICAgICAgICB9KTtcbiAgICAgICB9KTtcbiAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goZXJwb2xpY2llc3Byb21pc2UpO1xuXG4gICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgfSk7XG4gICAgIH0pO1xuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgIH1cblxuICAgIHNlcnZpY2VHcm91cGluZyhzZXJ2aWNlc0NoaWxkcmVuLCBzZXJ2aWNlc3RyZWUpIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xSRFBHcnAgPSBuZXcgR3JvdXAoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUlkKCksXG4gICAgICAgICAgICAnU2VydmljZXMgW3Byb3RvY29sLVJEUF0nLFxuICAgICAgICAgICAgJ1NlcnZpY2VzIGNyZWF0ZWQgZm9yIFJEUCBwcm90b2NvbCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJvdG9jb2xIVFRQU0dycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSWQoKSxcbiAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtSFRUUFNdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFBTIHByb3RvY29sJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBwcm90b2NvbEhUVFBHcnAgPSBuZXcgR3JvdXAoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUlkKCksXG4gICAgICAgICAgICAnU2VydmljZXMgW3Byb3RvY29sLUhUVFBdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFAgcHJvdG9jb2wnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByb3RvY29sRlRQR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVJZCgpLFxuICAgICAgICAgICAgJ1NlcnZpY2VzIFtwcm90b2NvbC1GVFBdJyxcbiAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEZUUCBwcm90b2NvbCdcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBhYmNkR3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtBLURdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBBIHRvIEQnKTtcbiAgICAgICAgY29uc3QgZWZnaEdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbRS1IXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggRSB0byBIJyk7XG4gICAgICAgIGNvbnN0IGlqa2xHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgW0ktTF0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIEkgdG8gTCcpO1xuICAgICAgICBjb25zdCBtbm9wR3JwID0gbmV3IEdyb3VwKHRoaXMuY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtNLVBdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBNIHRvIFAnKTtcbiAgICAgICAgY29uc3QgcXJzdEdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbRy1UXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggUSB0byBUJyk7XG4gICAgICAgIGNvbnN0IHV2d3hHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgW1UtWF0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIFUgdG8gWCcpO1xuICAgICAgICBjb25zdCB5ekdycCA9IG5ldyBHcm91cCh0aGlzLmNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbWS1aXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggWSBhbmQgWicpO1xuICAgICAgICBjb25zdCBvbmVUbzlHcnAgPSBuZXcgR3JvdXAodGhpcy5jcmVhdGVJZCgpLCAnU2VydmljZXMgWzEtOV0nLCAnU2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoIDAgdG8gOScpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VydmljZXN0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlb2JqID0gc2VydmljZXN0cmVlW2ldO1xuICAgICAgICAgICAgY29uc3QgY2hhID0gc2VydmljZW9iai5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoc2VydmljZW9iai5wcm90b2NvbCA9PT0gJ3JkcCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQU0dycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnaHR0cCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZW9iai5wcm90b2NvbCA9PT0gJ2Z0cCcpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEZUUEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdhJyB8fCBjaGEgPT09ICdiJyB8fCBjaGEgPT09ICdjJyB8fCBjaGEgPT09ICdkJykge1xuICAgICAgICAgICAgICAgIGFiY2RHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAnZScgfHwgY2hhID09PSAnZicgfHwgY2hhID09PSAnZycgfHwgY2hhID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ2knIHx8IGNoYSA9PT0gJ2onIHx8IGNoYSA9PT0gJ2snIHx8IGNoYSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICAgICAgaWprbEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdtJyB8fCBjaGEgPT09ICduJyB8fCBjaGEgPT09ICdvJyB8fCBjaGEgPT09ICdwJykge1xuICAgICAgICAgICAgICAgIG1ub3BHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAncScgfHwgY2hhID09PSAncicgfHwgY2hhID09PSAncycgfHwgY2hhID09PSAndCcpIHtcbiAgICAgICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ3UnIHx8IGNoYSA9PT0gJ3YnIHx8IGNoYSA9PT0gJ3cnIHx8IGNoYSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgdXZ3eEdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd5JyB8fCBjaGEgPT09ICd6Jykge1xuICAgICAgICAgICAgICAgIHl6R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzAnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnMScgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICcyJyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzMnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnNCcgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICc1JyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzYnIHx8XG4gICAgICAgICAgICAgICAgY2hhID09PSAnNycgfHxcbiAgICAgICAgICAgICAgICBjaGEgPT09ICc4JyB8fFxuICAgICAgICAgICAgICAgIGNoYSA9PT0gJzknXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBlbmQgbWFpbiBmb3IgbG9vcFxuXG4gICAgICAgIGlmIChwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLm5hbWUgPSBwcm90b2NvbFJEUEdycC5uYW1lICsgJygnICsgcHJvdG9jb2xSRFBHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sUkRQR3JwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUFNHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcm90b2NvbEhUVFBTR3JwLm5hbWUgPSBwcm90b2NvbEhUVFBTR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChwcm90b2NvbEhUVFBTR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdG9jb2xIVFRQR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3RvY29sSFRUUEdycC5uYW1lID0gcHJvdG9jb2xIVFRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sSFRUUEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJvdG9jb2xGVFBHcnAubmFtZSA9IHByb3RvY29sRlRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEZUUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocHJvdG9jb2xGVFBHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhYmNkR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFiY2RHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhYmNkR3JwLm5hbWUgPSBhYmNkR3JwLm5hbWUgKyAnKCcgKyBhYmNkR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChhYmNkR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZnaEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWZnaEdycC5uYW1lID0gZWZnaEdycC5uYW1lICsgJygnICsgZWZnaEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goZWZnaEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWprbEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlqa2xHcnAubmFtZSA9IGlqa2xHcnAubmFtZSArICcoJyArIGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGlqa2xHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1ub3BHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtbm9wR3JwLm5hbWUgPSBtbm9wR3JwLm5hbWUgKyAnKCcgKyBtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChtbm9wR3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXJzdEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcXJzdEdycC5uYW1lID0gcXJzdEdycC5uYW1lICsgJygnICsgcXJzdEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocXJzdEdycCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdXZ3eEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHV2d3hHcnAubmFtZSA9IHV2d3hHcnAubmFtZSArICcoJyArIHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHV2d3hHcnApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ekdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB5ekdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHl6R3JwLm5hbWUgPSB5ekdycC5uYW1lICsgJygnICsgeXpHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHl6R3JwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uZVRvOUdycC5uYW1lID0gb25lVG85R3JwLm5hbWUgKyAnKCcgKyBvbmVUbzlHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKG9uZVRvOUdycCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VydmljZXNDaGlsZHJlbi5uYW1lID0gc2VydmljZXNDaGlsZHJlbi5uYW1lICsgJygnICsgc2VydmljZXN0cmVlLmxlbmd0aCArICcpJztcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VzQ2hpbGRyZW47XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0VkZ2VSb3V0ZXJQb2xpY2llc0Zvck5vZGVDbGljayhcbiAgICAgICAgZXJQb2xpY3lOb2RlLFxuICAgICAgICBuZXR3b3JrR3JhcGgsXG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgICkge1xuICAgICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgICAgdGhpcy51bmlxSWQgPSB1bmlxSWQ7XG4gICAgICAgICAgY29uc3QgcmF3RVJQb2xpY3kgPSBlZGdlUm91dGVyUG9saWNpZXMuZmluZCgocykgPT4gcy5uYW1lID09PSBlclBvbGljeU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcblxuICAgICAgY29uc3QgZXJfdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3RVJQb2xpY3ksICdlZGdlLXJvdXRlcnMnKS5yZXBsYWNlKCcuLycsICcnKTtcbiAgICAgIGxldCBhc3NvY2lhdGVkUm91dGVycyA9IFtdO1xuICAgICAgY29uc3QgcGFnaW5nID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuICAgICAgY29uc3QgZXJDaGFpbGRzID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIGVyQ2hhaWxkcy5uYW1lPSAnQXNzb2NpYXRlZCBSb3V0ZXJzJztcbiAgICAgICAgZXJDaGFpbGRzLnR5cGU9ICdBc3NvY2lhdGVkIFJvdXRlcnMnO1xuICAgICAgICBlckNoYWlsZHMuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICBjb25zdCBhc3NvY2lhdGVkUm91dGVyc1Byb21pc2UgPSAgYXdhaXQgeml0aVNlcnZpY2UuZ2V0KGVyX3VybCwgcGFnaW5nLCBbXSlcbiAgICAgICAgICAgLnRoZW4oIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICByZXN1bHQuZGF0YS5mb3JFYWNoKCAoZXIpID0+IHtcbiAgICAgICAgICAgICAgIGNvbnN0IHRtcCA9IG5ldyBFUm91dGVyKCk7XG4gICAgICAgICAgICAgICAgICAgdG1wLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgICAgIHRtcC5uYW1lID0gZXIubmFtZTtcbiAgICAgICAgICAgICAgICAgICB0bXAudHlwZSA9ICdSb3V0ZXInO1xuICAgICAgICAgICAgICAgICAgIHRtcC52ZXJpZmllZCA9IGVyLmlzVmVyaWZpZWQ/ICdZZXMnOiAnTm8nO1xuICAgICAgICAgICAgICAgICAgIHRtcC5vbmxpbmUgPSBlci5pc09ubGluZT8gJ1llcyc6ICdObyc7XG4gICAgICAgICAgICAgICAgICAgdG1wLmRpc2FibGVkID0gZXIuZGlzYWJsZWQ/ICdZZXMnOiAnTm8nO1xuICAgICAgICAgICAgICAgICAgIHRtcC5yb290Tm9kZSA9ICdZZXMnO1xuICAgICAgICAgICAgICAgICAgIHRtcC50dW5uZWxlckVuYWJsZWQgPSBlci50dW5uZWxlckVuYWJsZWQ/IGVyLnR1bm5lbGVyRW5hYmxlZDonTm8nO1xuICAgICAgICAgICAgICAgICAgIHRtcC5zeW5jU3RhdHVzID0gZXIuc3luY1N0YXR1cz8gZXIuc3luY1N0YXR1czogJ05vJztcbiAgICAgICAgICAgICAgICAgICB0bXAuY3JlYXRlZEF0ID0gZXIuY3JlYXRlZEF0O1xuICAgICAgICAgICAgICAgICAgIHRtcC51cGRhdGVkQXQgPSBlci51cGRhdGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgZXJDaGFpbGRzLmNoaWxkcmVuLnB1c2godG1wKTtcbiAgICAgICAgICAgICB9ICk7XG4gICAgICAgICAgIGVyQ2hhaWxkcy5uYW1lID0gZXJDaGFpbGRzLm5hbWUgKycoJysgZXJDaGFpbGRzLmNoaWxkcmVuLmxlbmd0aCArJyknO1xuICAgICAgICAgICBlclBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGVyQ2hhaWxkcyk7XG4gICAgICB9KTtcbiAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2goYXNzb2NpYXRlZFJvdXRlcnNQcm9taXNlKTtcblxuICAgICAgICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHRoaXMuZ2V0UGFnaW5nT2JqZWN0KHBhZ2VzaXplKTtcbiAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShyYXdFUlBvbGljeSwgJ2lkZW50aXRpZXMnKTtcbiAgICAgICAgICBsZXQgaWRzID0gW107XG4gICAgICAgICAgY29uc3QgaWRwcm9taXNlID0geml0aVNlcnZpY2UuZ2V0KHVybCwgc2VydmljZXNfcGFnaW5nLCBbXSlcbiAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZHMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHByb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgICB3YWl0X3Byb21pc2VzLnB1c2godG1wX3Byb21pc2UpO1xuICAgICAgICAgICAgfSAvLyBlbmQgZm9yIGxvb3BcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICBjb25zdCBpZENoaWxkcyA9IG5ldyBDaGlsZHJlbigpO1xuICAgICAgICAgICAgIGlkQ2hpbGRzLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgIGlkcy5mb3JFYWNoKCAoaWRPYikgPT4ge1xuICAgICAgICAgICAgICAgIGlkQ2hpbGRzLmNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVJZGVudGl0eShpZE9iKSk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlkQ2hpbGRzLm5hbWUgPSBcIkFjY2Vzc2libGUgSWRlbnRpdGllcyhcIisgaWRDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBlclBvbGljeU5vZGUuZGF0YS5jaGlsZHJlbi5wdXNoKGlkQ2hpbGRzKTtcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaChpZHByb21pc2UpO1xuICAgICAgICAgUHJvbWlzZS5hbGwod2FpdF9wcm9taXNlcykudGhlbiggKCkgPT4ge1xuICAgICAgICAgICAgIHJlc29sdmUoJ3RoaXMgaXMgYSBwcm9taXNlJyk7XG4gICAgICAgICB9ICk7XG5cbiAgICAgICB9KTtcblxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW25ldHdvcmtHcmFwaCwgdGhpcy51bmlxSWRdO1xuICAgIH0gLy8gZW5kXG5cbiAgYXN5bmMgcHJvY2Vzc1NlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNGb3JOb2RlQ2xpY2soXG4gICAgICAgIHNlcnZpY2VFclBvbGljeU5vZGUsXG4gICAgICAgIG5ldHdvcmtHcmFwaCxcbiAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgdW5pcUlkLFxuICAgICAgICB6aXRpU2VydmljZVxuICAgICkge1xuICAgICAgIGNvbnN0IG15UHJvbWlzZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICB0aGlzLnVuaXFJZCA9IHVuaXFJZDtcbiAgICAgICAgICBjb25zdCB3YWl0X3Byb21pc2VzID0gW107XG4gICAgICAgICAgY29uc3QgcmF3U2VydmljZUVSUG9saWN5ID0gc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHNlcnZpY2VFclBvbGljeU5vZGUuZGF0YS5uYW1lKTtcbiAgICAgICAgICBjb25zdCBwYWdlc2l6ZSA9IDUwMDtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmcgPSB0aGlzLmdldFBhZ2luZ09iamVjdChwYWdlc2l6ZSk7XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UocmF3U2VydmljZUVSUG9saWN5LCAnZWRnZS1yb3V0ZXJzJyk7XG4gICAgICAgICAgbGV0IHJvdXRlcnMgPSBbXTtcbiAgICAgICAgICBjb25zdCBlcnByb21pc2UgPSB6aXRpU2VydmljZS5nZXQodXJsLCBzZXJ2aWNlc19wYWdpbmcsIFtdKVxuICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJvdXRlcnMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgICAgY29uc3QgdG1wX3Byb21pc2UgPSB6aXRpU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICkgLnRoZW4oKHBhZ2VSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlcnMucHVzaChzZXJ2KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHRtcF9wcm9taXNlKTtcbiAgICAgICAgICAgIH0gLy8gZW5kIGZvciBsb29wXG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3QgZXJDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBlckNoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICByb3V0ZXJzLmZvckVhY2goIChlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkT2IgPSBuZXcgRVJvdXRlcigpO1xuICAgICAgICAgICAgICAgIGlkT2IuaWQgPSB0aGlzLmNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgaWRPYi51dWlkID0gZXIuaWQ7XG4gICAgICAgICAgICAgICAgaWRPYi5uYW1lID0gZXIubmFtZTtcbiAgICAgICAgICAgICAgICBpZE9iLnR5cGUgPSAnRWRnZSBSb3V0ZXInO1xuICAgICAgICAgICAgICAgIGVyQ2hpbGRzLmNoaWxkcmVuLnB1c2goaWRPYik7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICBlckNoaWxkcy5uYW1lID0gXCJFZGdlUm91dGVycyhcIisgZXJDaGlsZHMuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgICAgICBzZXJ2aWNlRXJQb2xpY3lOb2RlLmRhdGEuY2hpbGRyZW4ucHVzaChlckNoaWxkcyk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKGVycHJvbWlzZSk7XG5cbiAgICAgICAgICBjb25zdCBzZXJ2aWNlc19wYWdpbmdCID0gdGhpcy5nZXRQYWdpbmdPYmplY3QocGFnZXNpemUpO1xuXG4gICAgICAgICAgY29uc3QgdXJsQiA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKHJhd1NlcnZpY2VFUlBvbGljeSwgJ3NlcnZpY2VzJyk7XG4gICAgICAgICAgbGV0IHNlckFycmF5ID0gW107XG4gICAgICAgICAgY29uc3Qgc2VycHJvbWlzZSA9IHppdGlTZXJ2aWNlLmdldCh1cmxCLCBzZXJ2aWNlc19wYWdpbmdCLCBbXSlcbiAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBzZXJBcnJheSA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAgICAgY29uc3QgcGFnZXMgPSBNYXRoLmNlaWwocmVzdWx0Lm1ldGEucGFnaW5hdGlvbi50b3RhbENvdW50IC8gcGFnZXNpemUpO1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZXNCID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBwYWdlczsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZ0IucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlQiA9IHppdGlTZXJ2aWNlLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxCLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZ0IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICApIC50aGVuKChwYWdlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBwYWdlUmVzdWx0LmRhdGEuZm9yRWFjaCgoc2VydikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXJBcnJheS5wdXNoKHNlcnYpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHByb21pc2VzQi5wdXNoKHRtcF9wcm9taXNlQik7XG4gICAgICAgICAgICAgIHdhaXRfcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZUIpO1xuICAgICAgICAgICAgfSAvLyBlbmQgZm9yIGxvb3BcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzQikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgY29uc3Qgc3JDaGlsZHMgPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgICAgICBzckNoaWxkcy5pZCA9IHRoaXMuY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICBzZXJBcnJheS5mb3JFYWNoKCAoc3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzck9iID0gbmV3IFNlcnZpY2UoKTtcbiAgICAgICAgICAgICAgICBzck9iLmlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIHNyT2IudXVpZCA9IHNyLmlkO1xuICAgICAgICAgICAgICAgIHNyT2IubmFtZSA9IHNyLm5hbWU7XG4gICAgICAgICAgICAgICAgc3JPYi50eXBlID0gJ1NlcnZpY2UnO1xuICAgICAgICAgICAgICAgIHNyQ2hpbGRzLmNoaWxkcmVuLnB1c2goc3JPYik7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHNyQ2hpbGRzLm5hbWUgPSBcIlNlcnZpY2VzKFwiKyBzckNoaWxkcy5jaGlsZHJlbi5sZW5ndGggKycpJztcbiAgICAgICAgICAgICAgc2VydmljZUVyUG9saWN5Tm9kZS5kYXRhLmNoaWxkcmVuLnB1c2goc3JDaGlsZHMpO1xuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgd2FpdF9wcm9taXNlcy5wdXNoKHNlcnByb21pc2UpO1xuXG4gICAgICAgICBQcm9taXNlLmFsbCh3YWl0X3Byb21pc2VzKS50aGVuKCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCdEb25lJyk7XG4gICAgICAgICB9ICk7XG5cbiAgICAgICB9KTtcblxuICAgICAgICBuZXR3b3JrR3JhcGggPSBkMy5oaWVyYXJjaHkobmV0d29ya0dyYXBoLmRhdGEsIGZ1bmN0aW9uIChuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5kLmNoaWxkcmVuO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtuZXR3b3JrR3JhcGgsIHRoaXMudW5pcUlkXTtcbiAgICB9IC8vIGVuZFxufSAvLyBlbmQgb2YgY2xhc3NcbiJdfQ==
|