@dollhousemcp/mcp-server 2.0.40 → 2.0.42
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/CHANGELOG.md +13 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +10 -7
- package/dist/elements/agents/AgentManager.d.ts +25 -6
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +127 -21
- package/dist/elements/base/BaseElementManager.d.ts +18 -2
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +36 -3
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ElementCRUDHandler.d.ts +36 -8
- package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
- package/dist/handlers/ElementCRUDHandler.js +227 -96
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +3 -3
- package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/AgentActivationStrategy.js +5 -2
- package/dist/handlers/strategies/ElementActivationStrategy.d.ts +2 -0
- package/dist/handlers/strategies/ElementActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/ElementActivationStrategy.js +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +5 -5
- package/dist/services/ActivationStore.d.ts +5 -4
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +35 -9
- package/dist/services/PolicyExportService.d.ts +8 -2
- package/dist/services/PolicyExportService.d.ts.map +1 -1
- package/dist/services/PolicyExportService.js +37 -6
- package/dist/storage/ElementStorageLayer.d.ts +3 -3
- package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
- package/dist/storage/ElementStorageLayer.js +33 -7
- package/dist/storage/IStorageLayer.d.ts +8 -1
- package/dist/storage/IStorageLayer.d.ts.map +1 -1
- package/dist/storage/IStorageLayer.js +1 -1
- package/dist/storage/MemoryStorageLayer.d.ts +4 -3
- package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
- package/dist/storage/MemoryStorageLayer.js +43 -13
- package/dist/storage/types.d.ts +7 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +17 -2
- package/oauth-helper.mjs +19 -26
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -33,6 +33,7 @@ import { ELEMENT_TYPE_MAP } from '../utils/elementTypeNormalization.js';
|
|
|
33
33
|
import { TemplateActivationStrategy, SkillActivationStrategy, AgentActivationStrategy, MemoryActivationStrategy, PersonaActivationStrategy, EnsembleActivationStrategy } from './strategies/index.js';
|
|
34
34
|
import { formatValidationFailedError } from './element-crud/responseFormatter.js';
|
|
35
35
|
import { findConfirmAdvisoryElements, findConfirmDenyingElement, getGatekeeperDiagnostics, } from './mcp-aql/policies/ElementPolicies.js';
|
|
36
|
+
const ACTIVE_POLICY_MEMBER_LOOKUP_CONCURRENCY = 8;
|
|
36
37
|
export class ElementCRUDHandler {
|
|
37
38
|
skillManager;
|
|
38
39
|
templateManager;
|
|
@@ -51,6 +52,8 @@ export class ElementCRUDHandler {
|
|
|
51
52
|
backupService;
|
|
52
53
|
policyExportService;
|
|
53
54
|
strategies;
|
|
55
|
+
activePolicySnapshotGeneration = 0;
|
|
56
|
+
activePolicySnapshotInFlight;
|
|
54
57
|
constructor(skillManager, templateManager, templateRenderer, agentManager, memoryManager, ensembleManager, personaManager, portfolioManager, initService, indicatorService, fileOperations, elementQueryService, validationRegistry, activationStore, backupService, policyExportService) {
|
|
55
58
|
this.skillManager = skillManager;
|
|
56
59
|
this.templateManager = templateManager;
|
|
@@ -131,6 +134,8 @@ export class ElementCRUDHandler {
|
|
|
131
134
|
return 'persona';
|
|
132
135
|
case 'skills':
|
|
133
136
|
return 'skill';
|
|
137
|
+
case 'templates':
|
|
138
|
+
return 'template';
|
|
134
139
|
case 'agents':
|
|
135
140
|
return 'agent';
|
|
136
141
|
case 'memories':
|
|
@@ -141,6 +146,12 @@ export class ElementCRUDHandler {
|
|
|
141
146
|
return normalizedType;
|
|
142
147
|
}
|
|
143
148
|
}
|
|
149
|
+
policyElementKey(type, name) {
|
|
150
|
+
return `${this.toPolicyElementType(this.normalizeElementType(type))}:${this.normalizeLookupValue(name)}`;
|
|
151
|
+
}
|
|
152
|
+
invalidateActivePolicySnapshot() {
|
|
153
|
+
this.activePolicySnapshotGeneration += 1;
|
|
154
|
+
}
|
|
144
155
|
/**
|
|
145
156
|
* Create a new element
|
|
146
157
|
* Extracted from index.ts:1492-1631 (140 lines - exact copy)
|
|
@@ -252,11 +263,10 @@ export class ElementCRUDHandler {
|
|
|
252
263
|
};
|
|
253
264
|
}
|
|
254
265
|
const result = await strategy.activate(name, context);
|
|
266
|
+
this.invalidateActivePolicySnapshot();
|
|
255
267
|
// Issue #598: Persist activation state for session restore
|
|
256
268
|
if (this.activationStore) {
|
|
257
|
-
const filename = normalizedType
|
|
258
|
-
? this.personaManager.findPersona(name)?.filename
|
|
259
|
-
: undefined;
|
|
269
|
+
const filename = await this.getStableActivationFilename(normalizedType, name);
|
|
260
270
|
this.activationStore.recordActivation(normalizedType, name, filename);
|
|
261
271
|
}
|
|
262
272
|
// Issue #762: Export policies to bridge after activation
|
|
@@ -308,106 +318,196 @@ export class ElementCRUDHandler {
|
|
|
308
318
|
*
|
|
309
319
|
* Issue #452: Provides active element context for enforce() policy checks.
|
|
310
320
|
*/
|
|
311
|
-
async getActiveElementsForPolicy() {
|
|
321
|
+
async getActiveElementsForPolicy(options = {}) {
|
|
322
|
+
// Security enforcement must not join a snapshot that may have started
|
|
323
|
+
// before an external policy-file edit. Dashboard/reporting callers may
|
|
324
|
+
// coalesce overlapping reads to bound polling work.
|
|
325
|
+
if (options.allowCoalescing === false) {
|
|
326
|
+
return this.collectActiveElementsForPolicy({ freshAfterInFlight: true });
|
|
327
|
+
}
|
|
328
|
+
const generation = this.activePolicySnapshotGeneration;
|
|
329
|
+
if (this.activePolicySnapshotInFlight?.generation === generation) {
|
|
330
|
+
return this.activePolicySnapshotInFlight.promise;
|
|
331
|
+
}
|
|
332
|
+
const snapshot = this.collectActiveElementsForPolicy();
|
|
333
|
+
const inFlight = { generation, promise: snapshot };
|
|
334
|
+
this.activePolicySnapshotInFlight = inFlight;
|
|
335
|
+
try {
|
|
336
|
+
return await snapshot;
|
|
337
|
+
}
|
|
338
|
+
finally {
|
|
339
|
+
if (this.activePolicySnapshotInFlight === inFlight) {
|
|
340
|
+
this.activePolicySnapshotInFlight = undefined;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async collectActiveElementsForPolicy(indexOptions = {}) {
|
|
345
|
+
await this.ensureInitialized();
|
|
312
346
|
const result = [];
|
|
313
347
|
const seen = new Set();
|
|
348
|
+
this.appendActivePersonas(result, seen);
|
|
349
|
+
await this.appendActiveSkills(result, seen);
|
|
350
|
+
await this.appendActiveAgents(result, seen, indexOptions);
|
|
351
|
+
await this.appendActiveEnsembles(result, seen, indexOptions);
|
|
352
|
+
return result;
|
|
353
|
+
}
|
|
354
|
+
appendActivePersonas(result, seen) {
|
|
314
355
|
try {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
for (const p of personas) {
|
|
318
|
-
const key = `persona:${p.metadata.name}`;
|
|
319
|
-
seen.add(key);
|
|
356
|
+
for (const persona of this.personaManager.getActivePersonas()) {
|
|
357
|
+
seen.add(this.policyElementKey('persona', persona.metadata.name));
|
|
320
358
|
result.push({
|
|
321
359
|
type: 'persona',
|
|
322
|
-
name:
|
|
323
|
-
metadata:
|
|
360
|
+
name: persona.metadata.name,
|
|
361
|
+
metadata: persona.metadata,
|
|
324
362
|
});
|
|
325
363
|
}
|
|
326
364
|
}
|
|
327
365
|
catch (error) {
|
|
328
366
|
logger.warn('Failed to gather active personas for policy evaluation', { error });
|
|
329
367
|
}
|
|
368
|
+
}
|
|
369
|
+
async appendActiveSkills(result, seen) {
|
|
330
370
|
try {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
for (const s of skills) {
|
|
334
|
-
const key = `skill:${s.metadata.name}`;
|
|
335
|
-
seen.add(key);
|
|
371
|
+
for (const skill of await this.skillManager.getActiveSkills()) {
|
|
372
|
+
seen.add(this.policyElementKey('skill', skill.metadata.name));
|
|
336
373
|
result.push({
|
|
337
374
|
type: 'skill',
|
|
338
|
-
name:
|
|
339
|
-
metadata:
|
|
375
|
+
name: skill.metadata.name,
|
|
376
|
+
metadata: skill.metadata,
|
|
340
377
|
});
|
|
341
378
|
}
|
|
342
379
|
}
|
|
343
380
|
catch (error) {
|
|
344
381
|
logger.warn('Failed to gather active skills for policy evaluation', { error });
|
|
345
382
|
}
|
|
383
|
+
}
|
|
384
|
+
async appendActiveAgents(result, seen, indexOptions) {
|
|
346
385
|
try {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
const key = `agent:${agent.metadata.name}`;
|
|
351
|
-
seen.add(key);
|
|
386
|
+
for (const agent of await this.agentManager.getActiveAgents(indexOptions)) {
|
|
387
|
+
seen.add(this.policyElementKey('agent', agent.metadata.name));
|
|
388
|
+
const filename = agent.filename;
|
|
352
389
|
result.push({
|
|
353
390
|
type: 'agent',
|
|
354
391
|
name: agent.metadata.name,
|
|
355
392
|
metadata: agent.metadata,
|
|
393
|
+
...(typeof filename === 'string' && filename.trim() !== ''
|
|
394
|
+
? { identity: filename }
|
|
395
|
+
: {}),
|
|
356
396
|
});
|
|
357
397
|
}
|
|
358
398
|
}
|
|
359
399
|
catch (error) {
|
|
360
400
|
logger.warn('Failed to gather active agents for policy evaluation', { error });
|
|
361
401
|
}
|
|
402
|
+
}
|
|
403
|
+
async appendActiveEnsembles(result, seen, indexOptions) {
|
|
362
404
|
try {
|
|
363
|
-
// Active ensembles (async)
|
|
364
405
|
const ensembles = await this.ensembleManager.getActiveEnsembles();
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
result.push({
|
|
369
|
-
type: 'ensemble',
|
|
370
|
-
name: e.metadata.name,
|
|
371
|
-
metadata: e.metadata,
|
|
372
|
-
});
|
|
373
|
-
// Issue #625 Phase 4: Resolve ensemble member gatekeeper policies
|
|
374
|
-
const members = e.metadata?.elements;
|
|
375
|
-
if (Array.isArray(members)) {
|
|
376
|
-
for (const member of members) {
|
|
377
|
-
const memberKey = `${member.element_type}:${member.element_name}`;
|
|
378
|
-
if (seen.has(memberKey))
|
|
379
|
-
continue; // Already active individually
|
|
380
|
-
try {
|
|
381
|
-
const memberElements = await this.getElements(member.element_type);
|
|
382
|
-
const found = memberElements.find(el => el?.metadata?.name === member.element_name);
|
|
383
|
-
if (found?.metadata && found.metadata?.gatekeeper) {
|
|
384
|
-
seen.add(memberKey);
|
|
385
|
-
result.push({
|
|
386
|
-
type: member.element_type,
|
|
387
|
-
name: member.element_name,
|
|
388
|
-
metadata: found.metadata,
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
catch {
|
|
393
|
-
// Non-fatal: skip member if element type lookup fails
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
406
|
+
const candidates = this.appendEnsemblesAndCollectMembers(ensembles, result, seen);
|
|
407
|
+
const resolvedMembers = await this.resolvePolicyMembers(candidates, indexOptions);
|
|
408
|
+
this.appendResolvedPolicyMembers(resolvedMembers, result, seen);
|
|
398
409
|
}
|
|
399
410
|
catch (error) {
|
|
400
411
|
logger.warn('Failed to gather active ensembles for policy evaluation', { error });
|
|
401
412
|
}
|
|
402
|
-
return result;
|
|
403
413
|
}
|
|
404
|
-
|
|
414
|
+
appendEnsemblesAndCollectMembers(ensembles, result, seen) {
|
|
415
|
+
const candidates = [];
|
|
416
|
+
const queuedMemberKeys = new Set();
|
|
417
|
+
for (const ensemble of ensembles) {
|
|
418
|
+
seen.add(this.policyElementKey('ensemble', ensemble.metadata.name));
|
|
419
|
+
result.push({
|
|
420
|
+
type: 'ensemble',
|
|
421
|
+
name: ensemble.metadata.name,
|
|
422
|
+
metadata: ensemble.metadata,
|
|
423
|
+
});
|
|
424
|
+
const members = ensemble.metadata?.elements;
|
|
425
|
+
if (!Array.isArray(members))
|
|
426
|
+
continue;
|
|
427
|
+
for (const member of members) {
|
|
428
|
+
const normalizedType = this.normalizeElementType(member.element_type);
|
|
429
|
+
const normalizedName = this.normalizeLookupValue(member.element_name);
|
|
430
|
+
if (normalizedType === '' || normalizedName === '')
|
|
431
|
+
continue;
|
|
432
|
+
const key = this.policyElementKey(normalizedType, normalizedName);
|
|
433
|
+
if (seen.has(key) || queuedMemberKeys.has(key))
|
|
434
|
+
continue;
|
|
435
|
+
queuedMemberKeys.add(key);
|
|
436
|
+
candidates.push({ type: normalizedType, name: normalizedName, key });
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return candidates;
|
|
440
|
+
}
|
|
441
|
+
async resolvePolicyMembers(candidates, indexOptions) {
|
|
442
|
+
const resolvedMembers = new Array(candidates.length);
|
|
443
|
+
const indexedManagers = new Map();
|
|
444
|
+
const memberLookups = new Map();
|
|
445
|
+
let nextCandidateIndex = 0;
|
|
446
|
+
const resolveNextMember = async () => {
|
|
447
|
+
// The increment is synchronous before the first await, so each worker
|
|
448
|
+
// claims a unique candidate while preserving deterministic result slots.
|
|
449
|
+
while (nextCandidateIndex < candidates.length) {
|
|
450
|
+
const candidateIndex = nextCandidateIndex++;
|
|
451
|
+
const candidate = candidates[candidateIndex];
|
|
452
|
+
try {
|
|
453
|
+
const found = await this.findPolicyMember(candidate, indexedManagers, memberLookups, indexOptions);
|
|
454
|
+
if (found?.metadata?.['gatekeeper']) {
|
|
455
|
+
resolvedMembers[candidateIndex] = {
|
|
456
|
+
type: this.toPolicyElementType(candidate.type),
|
|
457
|
+
name: candidate.name,
|
|
458
|
+
metadata: found.metadata,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
catch {
|
|
463
|
+
// Non-fatal: skip member if element type lookup fails.
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
const workerCount = Math.min(ACTIVE_POLICY_MEMBER_LOOKUP_CONCURRENCY, candidates.length);
|
|
468
|
+
await Promise.all(Array.from({ length: workerCount }, () => resolveNextMember()));
|
|
469
|
+
return resolvedMembers;
|
|
470
|
+
}
|
|
471
|
+
appendResolvedPolicyMembers(resolvedMembers, result, seen) {
|
|
472
|
+
for (const resolved of resolvedMembers) {
|
|
473
|
+
if (!resolved)
|
|
474
|
+
continue;
|
|
475
|
+
const key = this.policyElementKey(resolved.type, resolved.name);
|
|
476
|
+
if (seen.has(key))
|
|
477
|
+
continue;
|
|
478
|
+
seen.add(key);
|
|
479
|
+
result.push(resolved);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
findPolicyMember(candidate, indexedManagers, memberLookups, indexOptions) {
|
|
483
|
+
const existing = memberLookups.get(candidate.key);
|
|
484
|
+
if (existing)
|
|
485
|
+
return existing;
|
|
486
|
+
const lookup = this.getIndexedPolicyManager(candidate.type, indexedManagers, indexOptions).then(async (manager) => manager
|
|
487
|
+
? manager.findByName(candidate.name)
|
|
488
|
+
: undefined);
|
|
489
|
+
memberLookups.set(candidate.key, lookup);
|
|
490
|
+
return lookup;
|
|
491
|
+
}
|
|
492
|
+
getIndexedPolicyManager(type, indexedManagers, indexOptions) {
|
|
493
|
+
const normalizedType = this.normalizeElementType(type);
|
|
494
|
+
const existing = indexedManagers.get(normalizedType);
|
|
495
|
+
if (existing)
|
|
496
|
+
return existing;
|
|
497
|
+
const manager = this.getManagerForType(normalizedType);
|
|
498
|
+
const indexed = manager
|
|
499
|
+
? manager.refreshIndex(indexOptions).then(() => manager)
|
|
500
|
+
: Promise.resolve(undefined);
|
|
501
|
+
indexedManagers.set(normalizedType, indexed);
|
|
502
|
+
return indexed;
|
|
503
|
+
}
|
|
504
|
+
async getPolicyElementsForReport(sessionId, options = {}) {
|
|
405
505
|
const merged = new Map();
|
|
406
506
|
const addElement = (element, sessionIds = []) => {
|
|
407
507
|
if (!this.hasGatekeeperPolicy(element.metadata)) {
|
|
408
508
|
return;
|
|
409
509
|
}
|
|
410
|
-
const key = `${element.type}:${element.name}`;
|
|
510
|
+
const key = `${element.type}:${element.identity ?? element.name}`;
|
|
411
511
|
const existing = merged.get(key);
|
|
412
512
|
if (existing) {
|
|
413
513
|
sessionIds.forEach(id => existing.sessionIds.add(id));
|
|
@@ -422,39 +522,48 @@ export class ElementCRUDHandler {
|
|
|
422
522
|
};
|
|
423
523
|
const currentSessionId = this.activationStore?.getSessionId();
|
|
424
524
|
const includeCurrentSession = !sessionId || !currentSessionId || currentSessionId === sessionId;
|
|
525
|
+
const indexOptions = options.allowCoalescing === false
|
|
526
|
+
? { freshAfterInFlight: true }
|
|
527
|
+
: {};
|
|
425
528
|
if (includeCurrentSession) {
|
|
426
|
-
for (const activeElement of await this.getActiveElementsForPolicy()) {
|
|
529
|
+
for (const activeElement of await this.getActiveElementsForPolicy(options)) {
|
|
427
530
|
addElement(activeElement, currentSessionId ? [currentSessionId] : []);
|
|
428
531
|
}
|
|
429
532
|
}
|
|
430
533
|
if (this.activationStore?.isEnabled()) {
|
|
431
534
|
const persistedStates = await this.activationStore.listPersistedActivationStates(sessionId);
|
|
432
|
-
const
|
|
433
|
-
const
|
|
535
|
+
const indexedManagers = new Map();
|
|
536
|
+
const persistedLookups = new Map();
|
|
537
|
+
const findPersistedElement = (type, activation) => {
|
|
434
538
|
const normalizedType = this.normalizeElementType(type);
|
|
435
|
-
if (!catalogs.has(normalizedType)) {
|
|
436
|
-
catalogs.set(normalizedType, (await this.getElements(normalizedType)));
|
|
437
|
-
}
|
|
438
|
-
return catalogs.get(normalizedType) ?? [];
|
|
439
|
-
};
|
|
440
|
-
const findPersistedElement = async (type, activation) => {
|
|
441
|
-
const catalog = await getCatalog(type);
|
|
442
539
|
const normalizedName = this.normalizeLookupValue(activation.name);
|
|
443
540
|
const normalizedFilename = this.normalizeLookupValue(activation.filename);
|
|
444
|
-
const
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
return elementName === normalizedName || (normalizedFilename !== '' && elementFilename === normalizedFilename);
|
|
449
|
-
});
|
|
450
|
-
if (!found?.metadata || !this.hasGatekeeperPolicy(found.metadata)) {
|
|
451
|
-
return null;
|
|
541
|
+
const lookupKey = `${normalizedType}:${normalizedName}:${normalizedFilename}`;
|
|
542
|
+
const existing = persistedLookups.get(lookupKey);
|
|
543
|
+
if (existing) {
|
|
544
|
+
return existing;
|
|
452
545
|
}
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
546
|
+
const lookup = this.getIndexedPolicyManager(normalizedType, indexedManagers, indexOptions).then(async (manager) => {
|
|
547
|
+
if (!manager)
|
|
548
|
+
return null;
|
|
549
|
+
let found = normalizedFilename !== ''
|
|
550
|
+
? await manager.findByFilename(normalizedFilename)
|
|
551
|
+
: undefined;
|
|
552
|
+
if (!found && normalizedName !== '') {
|
|
553
|
+
found = await manager.findByName(normalizedName);
|
|
554
|
+
}
|
|
555
|
+
if (!found?.metadata || !this.hasGatekeeperPolicy(found.metadata)) {
|
|
556
|
+
return null;
|
|
557
|
+
}
|
|
558
|
+
return {
|
|
559
|
+
type: this.toPolicyElementType(normalizedType),
|
|
560
|
+
name: found.metadata['name'] ?? activation.name,
|
|
561
|
+
metadata: found.metadata,
|
|
562
|
+
...(normalizedFilename !== '' ? { identity: normalizedFilename } : {}),
|
|
563
|
+
};
|
|
564
|
+
});
|
|
565
|
+
persistedLookups.set(lookupKey, lookup);
|
|
566
|
+
return lookup;
|
|
458
567
|
};
|
|
459
568
|
for (const state of persistedStates) {
|
|
460
569
|
await this.mergePersistedPolicyState(state, addElement, findPersistedElement);
|
|
@@ -471,6 +580,7 @@ export class ElementCRUDHandler {
|
|
|
471
580
|
}
|
|
472
581
|
async releaseDeadlock() {
|
|
473
582
|
const activeElements = await this.collectActiveElementsForDeadlockRelief();
|
|
583
|
+
const activeBeforeReset = activeElements.map(({ type, name }) => ({ type, name }));
|
|
474
584
|
const activePolicyElements = await this.getActiveElementsForPolicy();
|
|
475
585
|
const sandboxingElement = findConfirmDenyingElement(activePolicyElements);
|
|
476
586
|
const advisoryElements = findConfirmAdvisoryElements(activePolicyElements);
|
|
@@ -487,8 +597,8 @@ export class ElementCRUDHandler {
|
|
|
487
597
|
continue;
|
|
488
598
|
}
|
|
489
599
|
try {
|
|
490
|
-
await strategy.deactivate(element.name);
|
|
491
|
-
deactivated.push(element);
|
|
600
|
+
await strategy.deactivate(element.deactivationIdentifier ?? element.name);
|
|
601
|
+
deactivated.push({ type: element.type, name: element.name });
|
|
492
602
|
}
|
|
493
603
|
catch (error) {
|
|
494
604
|
failed.push({
|
|
@@ -501,7 +611,7 @@ export class ElementCRUDHandler {
|
|
|
501
611
|
const persistedStateCleared = Boolean(this.activationStore?.isEnabled());
|
|
502
612
|
const snapshotFile = await this.writeDeadlockReliefSnapshot({
|
|
503
613
|
sessionId: this.activationStore?.getSessionId(),
|
|
504
|
-
activeBeforeReset
|
|
614
|
+
activeBeforeReset,
|
|
505
615
|
deactivated,
|
|
506
616
|
failed,
|
|
507
617
|
likelyDeadlockCause: {
|
|
@@ -511,6 +621,7 @@ export class ElementCRUDHandler {
|
|
|
511
621
|
persistedStateCleared,
|
|
512
622
|
});
|
|
513
623
|
this.activationStore?.clearAll();
|
|
624
|
+
this.invalidateActivePolicySnapshot();
|
|
514
625
|
this.policyExportService?.exportPolicies().catch(() => { });
|
|
515
626
|
const failureSummary = failed.length > 0 ? ` with ${failed.length} failure(s)` : '';
|
|
516
627
|
SecurityMonitor.logSecurityEvent({
|
|
@@ -520,7 +631,7 @@ export class ElementCRUDHandler {
|
|
|
520
631
|
details: `Deadlock relief deactivated ${deactivated.length} element(s)${failureSummary}`,
|
|
521
632
|
additionalData: {
|
|
522
633
|
sessionId: this.activationStore?.getSessionId(),
|
|
523
|
-
activeBeforeReset
|
|
634
|
+
activeBeforeReset,
|
|
524
635
|
deactivated,
|
|
525
636
|
failed,
|
|
526
637
|
persistedStateCleared,
|
|
@@ -535,7 +646,7 @@ export class ElementCRUDHandler {
|
|
|
535
646
|
...(this.activationStore?.getSessionId()
|
|
536
647
|
? { sessionId: this.activationStore.getSessionId() }
|
|
537
648
|
: {}),
|
|
538
|
-
activeBeforeReset
|
|
649
|
+
activeBeforeReset,
|
|
539
650
|
deactivated,
|
|
540
651
|
failed,
|
|
541
652
|
persistedStateCleared,
|
|
@@ -559,10 +670,16 @@ export class ElementCRUDHandler {
|
|
|
559
670
|
name: skill.metadata.name,
|
|
560
671
|
})));
|
|
561
672
|
const activeAgents = await this.agentManager.getActiveAgents();
|
|
562
|
-
activeElements.push(...activeAgents.map((agent) =>
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
673
|
+
activeElements.push(...activeAgents.map((agent) => {
|
|
674
|
+
const filename = agent.filename;
|
|
675
|
+
return {
|
|
676
|
+
type: ElementType.AGENT,
|
|
677
|
+
name: agent.metadata.name,
|
|
678
|
+
...(typeof filename === 'string' && filename.trim() !== ''
|
|
679
|
+
? { deactivationIdentifier: filename }
|
|
680
|
+
: {}),
|
|
681
|
+
};
|
|
682
|
+
}));
|
|
566
683
|
const activeMemories = await this.memoryManager.getActiveMemories();
|
|
567
684
|
activeElements.push(...activeMemories.map((memory) => ({
|
|
568
685
|
type: ElementType.MEMORY,
|
|
@@ -575,7 +692,7 @@ export class ElementCRUDHandler {
|
|
|
575
692
|
})));
|
|
576
693
|
const seen = new Set();
|
|
577
694
|
return activeElements.filter((element) => {
|
|
578
|
-
const key = `${element.type}:${element.name}`;
|
|
695
|
+
const key = `${element.type}:${element.deactivationIdentifier ?? element.name}`;
|
|
579
696
|
if (seen.has(key)) {
|
|
580
697
|
return false;
|
|
581
698
|
}
|
|
@@ -623,6 +740,15 @@ export class ElementCRUDHandler {
|
|
|
623
740
|
}
|
|
624
741
|
await Promise.allSettled(pending);
|
|
625
742
|
}
|
|
743
|
+
async getStableActivationFilename(type, name) {
|
|
744
|
+
if (type === ElementType.PERSONA) {
|
|
745
|
+
return this.personaManager.findPersona(name)?.filename;
|
|
746
|
+
}
|
|
747
|
+
if (type === ElementType.AGENT) {
|
|
748
|
+
return this.agentManager.getStableActivationFilename(name);
|
|
749
|
+
}
|
|
750
|
+
return undefined;
|
|
751
|
+
}
|
|
626
752
|
async deactivateElement(name, type) {
|
|
627
753
|
try {
|
|
628
754
|
SecurityMonitor.logSecurityEvent({
|
|
@@ -643,13 +769,18 @@ export class ElementCRUDHandler {
|
|
|
643
769
|
};
|
|
644
770
|
}
|
|
645
771
|
const result = await strategy.deactivate(name);
|
|
772
|
+
this.invalidateActivePolicySnapshot();
|
|
646
773
|
// Issue #598: Persist deactivation state for session restore
|
|
647
774
|
if (this.activationStore) {
|
|
648
|
-
|
|
775
|
+
// Agent deactivation returns the exact stable identity selected by its
|
|
776
|
+
// freshness scan. Other element types resolve from their live cache.
|
|
777
|
+
const filename = result.stableIdentity
|
|
778
|
+
?? await this.getStableActivationFilename(normalizedType, name);
|
|
779
|
+
this.activationStore.recordDeactivation(normalizedType, name, filename);
|
|
649
780
|
}
|
|
650
781
|
// Issue #762: Export policies to bridge after deactivation
|
|
651
782
|
this.policyExportService?.exportPolicies().catch(() => { });
|
|
652
|
-
return result;
|
|
783
|
+
return { content: result.content };
|
|
653
784
|
}
|
|
654
785
|
catch (error) {
|
|
655
786
|
// Re-throw ElementNotFoundError to propagate to MCP-AQL layer
|
|
@@ -999,4 +1130,4 @@ export class ElementCRUDHandler {
|
|
|
999
1130
|
};
|
|
1000
1131
|
}
|
|
1001
1132
|
}
|
|
1002
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudENSVURIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL0VsZW1lbnRDUlVESGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFPN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLElBQUksb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsYUFBYSxJQUFJLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEYsT0FBTyxFQUFFLFdBQVcsSUFBSSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxjQUFjLElBQUkscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxJQUFJLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixJQUFJLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGVBQWUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSzlGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUd4RSxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFDdkIs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QUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUNyQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLFdBQVcsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUN2QixDQUFDLENBQUMsMkJBQTJCO2lCQUNoQyxDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxlbWVudENSVURIYW5kbGVyIC0gSGFuZGxlcyBhbGwgZ2VuZXJpYyBlbGVtZW50IENSVUQgb3BlcmF0aW9uc1xuICpcbiAqIFByb3ZpZGVzIGNyZWF0ZSwgZWRpdCwgdmFsaWRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAqIChwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cywgbWVtb3JpZXMpLlxuICpcbiAqIFVzZXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gZm9yIGFsbCBzZXJ2aWNlczpcbiAqIC0gSW5pdGlhbGl6YXRpb25TZXJ2aWNlIGZvciBzZXR1cCB0YXNrc1xuICogLSBQZXJzb25hSW5kaWNhdG9yU2VydmljZSBmb3IgcGVyc29uYSBpbmRpY2F0b3IgZm9ybWF0dGluZ1xuICogLSBFbGVtZW50IG1hbmFnZXJzIChTa2lsbE1hbmFnZXIsIFRlbXBsYXRlTWFuYWdlciwgQWdlbnRNYW5hZ2VyLCBNZW1vcnlNYW5hZ2VyKVxuICogLSBQZXJzb25hTWFuYWdlciBmb3IgcGVyc29uYSBvcGVyYXRpb25zXG4gKiAtIFBvcnRmb2xpb01hbmFnZXIgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zXG4gKlxuICogRklYOiBETUNQLVNFQy0wMDYgLSBTZWN1cml0eSBhdWRpdCBzdXBwcmVzc2lvblxuICogVGhpcyBoYW5kbGVyIGRlbGVnYXRlcyBhbGwgb3BlcmF0aW9ucyB0byBzcGVjaWFsaXplZCBlbGVtZW50IG1hbmFnZXJzLlxuICogQXVkaXQgbG9nZ2luZyBoYXBwZW5zIGluIHRoZSBlbGVtZW50IG1hbmFnZXJzIHRoZW1zZWx2ZXMuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUsIFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgU2tpbGxNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvc2tpbGxzL2luZGV4LmpzJztcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgVGVtcGxhdGVSZW5kZXJlciB9IGZyb20gJy4uL3V0aWxzL1RlbXBsYXRlUmVuZGVyZXIuanMnO1xuaW1wb3J0IHsgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbnNlbWJsZU1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy9lbnNlbWJsZXMvRW5zZW1ibGVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IGFzIGNyZWF0ZUVsZW1lbnRDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvY3JlYXRlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBkZWxldGVFbGVtZW50IGFzIGRlbGV0ZUVsZW1lbnRDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvZGVsZXRlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBlZGl0RWxlbWVudCBhcyBlZGl0RWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9lZGl0RWxlbWVudC5qcyc7XG5pbXBvcnQgeyB1cGdyYWRlRWxlbWVudCBhcyB1cGdyYWRlRWxlbWVudENvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC91cGdyYWRlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBsaXN0RWxlbWVudHMgYXMgbGlzdEVsZW1lbnRzQ29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2xpc3RFbGVtZW50cy5qcyc7XG5pbXBvcnQgeyBmaW5kRWxlbWVudEZsZXhpYmx5LCBzYW5pdGl6ZU1ldGFkYXRhIGFzIHNhbml0aXplTWV0YWRhdGFSZWNvcmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlRWxlbWVudCBhcyB2YWxpZGF0ZUVsZW1lbnRDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvdmFsaWRhdGVFbGVtZW50LmpzJztcbmltcG9ydCB7IEVsZW1lbnRDcnVkQ29udGV4dCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL3R5cGVzLmpzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBQZXJzb25hSW5kaWNhdG9yU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL1BlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBlcnNvbmFNYW5hZ2VyIH0gZnJvbSAnLi4vcGVyc29uYS9QZXJzb25hTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRUxFTUVOVF9UWVBFX01BUCB9IGZyb20gJy4uL3V0aWxzL2VsZW1lbnRUeXBlTm9ybWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50QWN0aXZhdGlvblN0cmF0ZWd5LCBNQ1BSZXNwb25zZSB9IGZyb20gJy4vc3RyYXRlZ2llcy9pbmRleC5qcyc7XG5pbXBvcnQge1xuICBUZW1wbGF0ZUFjdGl2YXRpb25TdHJhdGVneSxcbiAgU2tpbGxBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIEFnZW50QWN0aXZhdGlvblN0cmF0ZWd5LFxuICBNZW1vcnlBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIEVuc2VtYmxlQWN0aXZhdGlvblN0cmF0ZWd5XG59IGZyb20gJy4vc3RyYXRlZ2llcy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50UXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcXVlcnkvRWxlbWVudFF1ZXJ5U2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGl2YXRpb25TdG9yZSwgUGVyc2lzdGVkQWN0aXZhdGlvbiwgUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlU25hcHNob3QgfSBmcm9tICcuLi9zZXJ2aWNlcy9BY3RpdmF0aW9uU3RvcmUuanMnO1xuaW1wb3J0IHR5cGUgeyBCYWNrdXBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFBvbGljeUV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9Qb2xpY3lFeHBvcnRTZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgZm9ybWF0VmFsaWRhdGlvbkZhaWxlZEVycm9yIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvcmVzcG9uc2VGb3JtYXR0ZXIuanMnO1xuaW1wb3J0IHtcbiAgZmluZENvbmZpcm1BZHZpc29yeUVsZW1lbnRzLFxuICBmaW5kQ29uZmlybURlbnlpbmdFbGVtZW50LFxuICBnZXRHYXRla2VlcGVyRGlhZ25vc3RpY3MsXG59IGZyb20gJy4vbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgRWxlbWVudENSVURIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJhdGVnaWVzOiBNYXA8c3RyaW5nLCBFbGVtZW50QWN0aXZhdGlvblN0cmF0ZWd5PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNraWxsTWFuYWdlcjogU2tpbGxNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVNYW5hZ2VyOiBUZW1wbGF0ZU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVJlbmRlcmVyOiBUZW1wbGF0ZVJlbmRlcmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWdlbnRNYW5hZ2VyOiBBZ2VudE1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlNYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW5zZW1ibGVNYW5hZ2VyOiBFbnNlbWJsZU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwZXJzb25hTWFuYWdlcjogUGVyc29uYU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5pdFNlcnZpY2U6IEluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvclNlcnZpY2U6IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UXVlcnlTZXJ2aWNlOiBFbGVtZW50UXVlcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmF0aW9uU3RvcmU/OiBBY3RpdmF0aW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBiYWNrdXBTZXJ2aWNlPzogQmFja3VwU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvbGljeUV4cG9ydFNlcnZpY2U/OiBQb2xpY3lFeHBvcnRTZXJ2aWNlXG4gICkge1xuICAgIC8vIEluaXRpYWxpemUgc3RyYXRlZ3kgbWFwIHdpdGggYWxsIGVsZW1lbnQgdHlwZSBzdHJhdGVnaWVzXG4gICAgdGhpcy5zdHJhdGVnaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3k+KFtcbiAgICAgIFtFbGVtZW50VHlwZS5QRVJTT05BLCBuZXcgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneShwZXJzb25hTWFuYWdlciwgaW5kaWNhdG9yU2VydmljZSldLFxuICAgICAgW0VsZW1lbnRUeXBlLlNLSUxMLCBuZXcgU2tpbGxBY3RpdmF0aW9uU3RyYXRlZ3koc2tpbGxNYW5hZ2VyKV0sXG4gICAgICBbRWxlbWVudFR5cGUuVEVNUExBVEUsIG5ldyBUZW1wbGF0ZUFjdGl2YXRpb25TdHJhdGVneSh0ZW1wbGF0ZU1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5BR0VOVCwgbmV3IEFnZW50QWN0aXZhdGlvblN0cmF0ZWd5KGFnZW50TWFuYWdlcildLFxuICAgICAgW0VsZW1lbnRUeXBlLk1FTU9SWSwgbmV3IE1lbW9yeUFjdGl2YXRpb25TdHJhdGVneShtZW1vcnlNYW5hZ2VyKV0sXG4gICAgICBbRWxlbWVudFR5cGUuRU5TRU1CTEUsIG5ldyBFbnNlbWJsZUFjdGl2YXRpb25TdHJhdGVneShcbiAgICAgICAgZW5zZW1ibGVNYW5hZ2VyLFxuICAgICAgICBwb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgICBza2lsbE1hbmFnZXIsXG4gICAgICAgIHRlbXBsYXRlTWFuYWdlcixcbiAgICAgICAgYWdlbnRNYW5hZ2VyLFxuICAgICAgICBtZW1vcnlNYW5hZ2VyLFxuICAgICAgICBwZXJzb25hTWFuYWdlclxuICAgICAgKV1cbiAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0U2VydmljZS5lbnN1cmVJbml0aWFsaXplZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJzb25hSW5kaWNhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yU2VydmljZS5nZXRQZXJzb25hSW5kaWNhdG9yKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRleHQoKTogRWxlbWVudENydWRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5zdXJlSW5pdGlhbGl6ZWQ6ICgpID0+IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKSxcbiAgICAgIGdldFBlcnNvbmFJbmRpY2F0b3I6ICgpID0+IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpLFxuICAgICAgc2tpbGxNYW5hZ2VyOiB0aGlzLnNraWxsTWFuYWdlcixcbiAgICAgIHRlbXBsYXRlTWFuYWdlcjogdGhpcy50ZW1wbGF0ZU1hbmFnZXIsXG4gICAgICB0ZW1wbGF0ZVJlbmRlcmVyOiB0aGlzLnRlbXBsYXRlUmVuZGVyZXIsXG4gICAgICBhZ2VudE1hbmFnZXI6IHRoaXMuYWdlbnRNYW5hZ2VyLFxuICAgICAgbWVtb3J5TWFuYWdlcjogdGhpcy5tZW1vcnlNYW5hZ2VyLFxuICAgICAgZW5zZW1ibGVNYW5hZ2VyOiB0aGlzLmVuc2VtYmxlTWFuYWdlcixcbiAgICAgIHBvcnRmb2xpb01hbmFnZXI6IHRoaXMucG9ydGZvbGlvTWFuYWdlcixcbiAgICAgIHBlcnNvbmFNYW5hZ2VyOiB0aGlzLnBlcnNvbmFNYW5hZ2VyLFxuICAgICAgZmlsZU9wZXJhdGlvbnM6IHRoaXMuZmlsZU9wZXJhdGlvbnMsXG4gICAgICBlbGVtZW50UXVlcnlTZXJ2aWNlOiB0aGlzLmVsZW1lbnRRdWVyeVNlcnZpY2UsXG4gICAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IHRoaXMudmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgICAgYmFja3VwU2VydmljZTogdGhpcy5iYWNrdXBTZXJ2aWNlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBlbGVtZW50IGJ5IG5hbWUsIHN1cHBvcnRpbmcgYm90aCBleGFjdCBkaXNwbGF5IG5hbWUgYW5kIGZpbGVuYW1lIChzbHVnKSBtYXRjaGluZ1xuICAgKiBIZWxwZXIgbWV0aG9kIGV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjM0Ni0zNzlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZEVsZW1lbnRGbGV4aWJseShuYW1lOiBzdHJpbmcsIGVsZW1lbnRMaXN0OiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGZpbmRFbGVtZW50RmxleGlibHkobmFtZSwgZWxlbWVudExpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplIG1ldGFkYXRhIG9iamVjdCB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICogSGVscGVyIG1ldGhvZCBleHRyYWN0ZWQgZnJvbSBpbmRleC50czozOTAtNDEwXG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplTWV0YWRhdGEobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gc2FuaXRpemVNZXRhZGF0YVJlY29yZChtZXRhZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUxvb2t1cFZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgPyB2YWx1ZS5ub3JtYWxpemUoJ05GQycpLnRyaW0oKVxuICAgICAgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgaGFzR2F0ZWtlZXBlclBvbGljeShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihtZXRhZGF0YT8uWydnYXRla2VlcGVyJ10gfHwgZ2V0R2F0ZWtlZXBlckRpYWdub3N0aWNzKG1ldGFkYXRhKSk7XG4gIH1cblxuICBwcml2YXRlIHRvUG9saWN5RWxlbWVudFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplTG9va3VwVmFsdWUodHlwZSkudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgIHJldHVybiAncGVyc29uYSc7XG4gICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICByZXR1cm4gJ3NraWxsJztcbiAgICAgIGNhc2UgJ2FnZW50cyc6XG4gICAgICAgIHJldHVybiAnYWdlbnQnO1xuICAgICAgY2FzZSAnbWVtb3JpZXMnOlxuICAgICAgICByZXR1cm4gJ21lbW9yeSc7XG4gICAgICBjYXNlICdlbnNlbWJsZXMnOlxuICAgICAgICByZXR1cm4gJ2Vuc2VtYmxlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkVHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTQ5Mi0xNjMxICgxNDAgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRWRpdCBhbiBleGlzdGluZyBlbGVtZW50IHVzaW5nIEdyYXBoUUwtYWxpZ25lZCBuZXN0ZWQgaW5wdXQgb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgaGFuZGxlci5lZGl0RWxlbWVudCh7XG4gICAqICAgbmFtZTogJ215LXNraWxsJyxcbiAgICogICB0eXBlOiAnc2tpbGxzJyxcbiAgICogICBpbnB1dDoge1xuICAgKiAgICAgZGVzY3JpcHRpb246ICdVcGRhdGVkJyxcbiAgICogICAgIG1ldGFkYXRhOiB7IHRyaWdnZXJzOiBbJ2NvZGUnXSB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGFzeW5jIGVkaXRFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSkge1xuICAgIHJldHVybiBlZGl0RWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgZWxlbWVudCBmcm9tIHYxIHNpbmdsZS1ib2R5IHRvIHYyIGR1YWwtZmllbGQgZm9ybWF0IChpbnN0cnVjdGlvbnMgKyBjb250ZW50KVxuICAgKi9cbiAgYXN5bmMgdXBncmFkZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkcnlfcnVuPzogYm9vbGVhbjsgaW5zdHJ1Y3Rpb25zX292ZXJyaWRlPzogc3RyaW5nOyBjb250ZW50X292ZXJyaWRlPzogc3RyaW5nfSkge1xuICAgIHJldHVybiB1cGdyYWRlRWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTk0MS0yMDU0ICgxMTQgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgc3RyaWN0PzogYm9vbGVhbn0pIHtcbiAgICByZXR1cm4gdmFsaWRhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MjA1Ni0yMzEwICgyNTUgbGluZXMgLSBleGFjdCBjb3B5LCBzcGxpdCBmb3IgcmVhZGFiaWxpdHkpXG4gICAqL1xuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgcmV0dXJuIGRlbGV0ZUVsZW1lbnRDb21tYW5kKHRoaXMuZ2V0Q29udGV4dCgpLCBhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcbiAgICAvLyBJc3N1ZSAjNTAxOiBHdWFyZCBhZ2FpbnN0IG51bGwvdW5kZWZpbmVkIHRvIG1hdGNoIHNoYXJlZCB1dGlsaXR5IHBhdHRlcm5cbiAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYSB2YWxpZCBFbGVtZW50VHlwZSB2YWx1ZSwgcmV0dXJuIGFzLWlzXG4gICAgaWYgKE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugc2hhcmVkIG5vcm1hbGl6YXRpb24gbWFwIChJc3N1ZSAjNDMzKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBFTEVNRU5UX1RZUEVfTUFQW3R5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICAvLyBVbmtub3duIHR5cGUgLSByZXR1cm4gYXMtaXMgYW5kIGxldCB2YWxpZGF0aW9uIGhhbmRsZSBpdFxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IHN0cmluZywgb3B0aW9ucz86IGltcG9ydCgnLi4vc2VydmljZXMvcXVlcnkvdHlwZXMuanMnKS5RdWVyeU9wdGlvbnMpIHtcbiAgICByZXR1cm4gbGlzdEVsZW1lbnRzQ29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgdHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBlbGVtZW50cyBhcnJheSBmb3IgYSBnaXZlbiB0eXBlLlxuICAgKiBVbmxpa2UgbGlzdEVsZW1lbnRzIHdoaWNoIHJldHVybnMgTUNQUmVzcG9uc2UgZm9ybWF0LCB0aGlzIHJldHVybnMgcmF3IGVsZW1lbnQgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBFbGVtZW50IHR5cGUgKHBlcnNvbmEsIHNraWxsLCB0ZW1wbGF0ZSwgYWdlbnQsIG1lbW9yeSwgZW5zZW1ibGUpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHJhdyBlbGVtZW50IG9iamVjdHNcbiAgICovXG4gIGFzeW5jIGdldEVsZW1lbnRzKHR5cGU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICByZXR1cm4gdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5hY3RpdmF0ZUVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRWxlbWVudCBhY3RpdmF0aW9uIHJlcXVlc3RlZDogJHt0eXBlfS8ke25hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGVsZW1lbnROYW1lOiBuYW1lLCBjb250ZXh0UHJvdmlkZWQ6ICEhY29udGV4dCB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmFjdGl2YXRlKG5hbWUsIGNvbnRleHQpO1xuXG4gICAgICAvLyBJc3N1ZSAjNTk4OiBQZXJzaXN0IGFjdGl2YXRpb24gc3RhdGUgZm9yIHNlc3Npb24gcmVzdG9yZVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvblN0b3JlKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gbm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLlBFUlNPTkFcbiAgICAgICAgICA/IHRoaXMucGVyc29uYU1hbmFnZXIuZmluZFBlcnNvbmEobmFtZSk/LmZpbGVuYW1lXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYWN0aXZhdGlvblN0b3JlLnJlY29yZEFjdGl2YXRpb24obm9ybWFsaXplZFR5cGUsIG5hbWUsIGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzc2MjogRXhwb3J0IHBvbGljaWVzIHRvIGJyaWRnZSBhZnRlciBhY3RpdmF0aW9uXG4gICAgICB0aGlzLnBvbGljeUV4cG9ydFNlcnZpY2U/LmV4cG9ydFBvbGljaWVzKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhY3RpdmF0ZSBlbGVtZW50OmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHModHlwZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBJc3N1ZSAjNTAxOiBXaGVuIHR5cGUgaXMgb21pdHRlZCwgYWdncmVnYXRlIGFjdGl2ZSBlbGVtZW50cyBhY3Jvc3MgYWxsIHR5cGVzXG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFnZ3JlZ2F0ZUFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChub3JtYWxpemVkVHlwZSk7XG5cbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgc3RyYXRlZ3kuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSBlbGVtZW50czpgLCB7IHR5cGUsIGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBnZXQgYWN0aXZlICR7dHlwZSB8fCAnYWxsJ306ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBhY3RpdmUgZWxlbWVudHMgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGV2YWx1YXRpb24uXG4gICAqIFJldHVybnMgYWN0aXZlIHBlcnNvbmFzLCBza2lsbHMsIGFuZCBlbnNlbWJsZXMgd2l0aCB0aGVpciBtZXRhZGF0YVxuICAgKiBtYXBwZWQgdG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IHRoZSBHYXRla2VlcGVyJ3MgQWN0aXZlRWxlbWVudCBpbnRlcmZhY2UuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IFByb3ZpZGVzIGFjdGl2ZSBlbGVtZW50IGNvbnRleHQgZm9yIGVuZm9yY2UoKSBwb2xpY3kgY2hlY2tzLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHNGb3JQb2xpY3koKTogUHJvbWlzZTxBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PiA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBY3RpdmUgcGVyc29uYXMgKHN5bmMpXG4gICAgICBjb25zdCBwZXJzb25hcyA9IHRoaXMucGVyc29uYU1hbmFnZXIuZ2V0QWN0aXZlUGVyc29uYXMoKTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwZXJzb25hcykge1xuICAgICAgICBjb25zdCBrZXkgPSBgcGVyc29uYToke3AubWV0YWRhdGEubmFtZX1gO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3BlcnNvbmEnLFxuICAgICAgICAgIG5hbWU6IHAubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogcC5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIHBlcnNvbmFzIGZvciBwb2xpY3kgZXZhbHVhdGlvbicsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFjdGl2ZSBza2lsbHMgKGFzeW5jKVxuICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZ2V0QWN0aXZlU2tpbGxzKCk7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2tpbGxzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGBza2lsbDoke3MubWV0YWRhdGEubmFtZX1gO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3NraWxsJyxcbiAgICAgICAgICBuYW1lOiBzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IHMubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBza2lsbHMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIGFnZW50cyAoYXN5bmMpXG4gICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBY3RpdmVBZ2VudHMoKTtcbiAgICAgIGZvciAoY29uc3QgYWdlbnQgb2YgYWdlbnRzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGBhZ2VudDoke2FnZW50Lm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhZ2VudCcsXG4gICAgICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogYWdlbnQubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBhZ2VudHMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0aXZlIGVuc2VtYmxlcyAoYXN5bmMpXG4gICAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmVuc2VtYmxlTWFuYWdlci5nZXRBY3RpdmVFbnNlbWJsZXMoKTtcbiAgICAgIGZvciAoY29uc3QgZSBvZiBlbnNlbWJsZXMpIHtcbiAgICAgICAgY29uc3QgZW5zZW1ibGVLZXkgPSBgZW5zZW1ibGU6JHtlLm1ldGFkYXRhLm5hbWV9YDtcbiAgICAgICAgc2Vlbi5hZGQoZW5zZW1ibGVLZXkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2Vuc2VtYmxlJyxcbiAgICAgICAgICBuYW1lOiBlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgbWV0YWRhdGE6IGUubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBSZXNvbHZlIGVuc2VtYmxlIG1lbWJlciBnYXRla2VlcGVyIHBvbGljaWVzXG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSAoZS5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZWxlbWVudHMgYXNcbiAgICAgICAgICBBcnJheTx7IGVsZW1lbnRfbmFtZTogc3RyaW5nOyBlbGVtZW50X3R5cGU6IHN0cmluZyB9PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVtYmVycykpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXJLZXkgPSBgJHttZW1iZXIuZWxlbWVudF90eXBlfToke21lbWJlci5lbGVtZW50X25hbWV9YDtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhtZW1iZXJLZXkpKSBjb250aW51ZTsgLy8gQWxyZWFkeSBhY3RpdmUgaW5kaXZpZHVhbGx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBtZW1iZXJFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudHMobWVtYmVyLmVsZW1lbnRfdHlwZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gKG1lbWJlckVsZW1lbnRzIGFzIEFycmF5PHsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KS5maW5kKFxuICAgICAgICAgICAgICAgIGVsID0+IChlbD8ubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5uYW1lID09PSBtZW1iZXIuZWxlbWVudF9uYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChmb3VuZD8ubWV0YWRhdGEgJiYgKGZvdW5kLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uZ2F0ZWtlZXBlcikge1xuICAgICAgICAgICAgICAgIHNlZW4uYWRkKG1lbWJlcktleSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG1lbWJlci5lbGVtZW50X25hbWUsXG4gICAgICAgICAgICAgICAgICBtZXRhZGF0YTogZm91bmQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvLyBOb24tZmF0YWw6IHNraXAgbWVtYmVyIGlmIGVsZW1lbnQgdHlwZSBsb29rdXAgZmFpbHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIGVuc2VtYmxlcyBmb3IgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBnZXRQb2xpY3lFbGVtZW50c0ZvclJlcG9ydChzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBzZXNzaW9uSWRzPzogc3RyaW5nW107XG4gIH0+PiB7XG4gICAgY29uc3QgbWVyZ2VkID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHNlc3Npb25JZHM6IFNldDxzdHJpbmc+O1xuICAgIH0+KCk7XG5cbiAgICBjb25zdCBhZGRFbGVtZW50ID0gKFxuICAgICAgZWxlbWVudDogeyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG4gICAgICBzZXNzaW9uSWRzOiBzdHJpbmdbXSA9IFtdLFxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmhhc0dhdGVrZWVwZXJQb2xpY3koZWxlbWVudC5tZXRhZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBgJHtlbGVtZW50LnR5cGV9OiR7ZWxlbWVudC5uYW1lfWA7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG1lcmdlZC5nZXQoa2V5KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICBzZXNzaW9uSWRzLmZvckVhY2goaWQgPT4gZXhpc3Rpbmcuc2Vzc2lvbklkcy5hZGQoaWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBtZXJnZWQuc2V0KGtleSwge1xuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICAgIHNlc3Npb25JZHM6IG5ldyBTZXQoc2Vzc2lvbklkcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudFNlc3Npb25JZCA9IHRoaXMuYWN0aXZhdGlvblN0b3JlPy5nZXRTZXNzaW9uSWQoKTtcbiAgICBjb25zdCBpbmNsdWRlQ3VycmVudFNlc3Npb24gPSAhc2Vzc2lvbklkIHx8ICFjdXJyZW50U2Vzc2lvbklkIHx8IGN1cnJlbnRTZXNzaW9uSWQgPT09IHNlc3Npb25JZDtcblxuICAgIGlmIChpbmNsdWRlQ3VycmVudFNlc3Npb24pIHtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlRWxlbWVudCBvZiBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCkpIHtcbiAgICAgICAgYWRkRWxlbWVudChhY3RpdmVFbGVtZW50LCBjdXJyZW50U2Vzc2lvbklkID8gW2N1cnJlbnRTZXNzaW9uSWRdIDogW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZT8uaXNFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IHBlcnNpc3RlZFN0YXRlcyA9IGF3YWl0IHRoaXMuYWN0aXZhdGlvblN0b3JlLmxpc3RQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGVzKHNlc3Npb25JZCk7XG4gICAgICBjb25zdCBjYXRhbG9ncyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTx7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGZpbGVuYW1lPzogc3RyaW5nIH0+PigpO1xuXG4gICAgICBjb25zdCBnZXRDYXRhbG9nID0gYXN5bmMgKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICAgIGlmICghY2F0YWxvZ3MuaGFzKG5vcm1hbGl6ZWRUeXBlKSkge1xuICAgICAgICAgIGNhdGFsb2dzLnNldChcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRUeXBlLFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuZ2V0RWxlbWVudHMobm9ybWFsaXplZFR5cGUpKSBhcyBBcnJheTx7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGZpbGVuYW1lPzogc3RyaW5nIH0+LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhdGFsb2dzLmdldChub3JtYWxpemVkVHlwZSkgPz8gW107XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5kUGVyc2lzdGVkRWxlbWVudCA9IGFzeW5jIChcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBhY3RpdmF0aW9uOiBQZXJzaXN0ZWRBY3RpdmF0aW9uLFxuICAgICAgKTogUHJvbWlzZTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IGdldENhdGFsb2codHlwZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShhY3RpdmF0aW9uLm5hbWUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKGFjdGl2YXRpb24uZmlsZW5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGZvdW5kID0gY2F0YWxvZy5maW5kKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50Lm1ldGFkYXRhID8/IHt9O1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShtZXRhZGF0YVsnbmFtZSddKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50RmlsZW5hbWUgPSB0aGlzLm5vcm1hbGl6ZUxvb2t1cFZhbHVlKFxuICAgICAgICAgICAgZWxlbWVudC5maWxlbmFtZSA/PyBtZXRhZGF0YVsnZmlsZW5hbWUnXSA/PyBtZXRhZGF0YVsnc291cmNlRmlsZSddLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gZWxlbWVudE5hbWUgPT09IG5vcm1hbGl6ZWROYW1lIHx8IChub3JtYWxpemVkRmlsZW5hbWUgIT09ICcnICYmIGVsZW1lbnRGaWxlbmFtZSA9PT0gbm9ybWFsaXplZEZpbGVuYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFmb3VuZD8ubWV0YWRhdGEgfHwgIXRoaXMuaGFzR2F0ZWtlZXBlclBvbGljeShmb3VuZC5tZXRhZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdGhpcy50b1BvbGljeUVsZW1lbnRUeXBlKHR5cGUpLFxuICAgICAgICAgIG5hbWU6IChmb3VuZC5tZXRhZGF0YVsnbmFtZSddIGFzIHN0cmluZykgPz8gYWN0aXZhdGlvbi5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBmb3VuZC5tZXRhZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgcGVyc2lzdGVkU3RhdGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShzdGF0ZSwgYWRkRWxlbWVudCwgZmluZFBlcnNpc3RlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZC52YWx1ZXMoKSkubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIHR5cGU6IGVudHJ5LnR5cGUsXG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgbWV0YWRhdGE6IGVudHJ5Lm1ldGFkYXRhLFxuICAgICAgLi4uKGVudHJ5LnNlc3Npb25JZHMuc2l6ZSA+IDBcbiAgICAgICAgPyB7IHNlc3Npb25JZHM6IEFycmF5LmZyb20oZW50cnkuc2Vzc2lvbklkcykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VEZWFkbG9jaygpOiBQcm9taXNlPHtcbiAgICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gICAgYWN0aXZlQmVmb3JlUmVzZXQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZGVhY3RpdmF0ZWQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZmFpbGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+O1xuICAgIHBlcnNpc3RlZFN0YXRlQ2xlYXJlZDogYm9vbGVhbjtcbiAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICBzYW5kYm94aW5nRWxlbWVudD86IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIGFkdmlzb3J5RWxlbWVudHM6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgfTtcbiAgICBzbmFwc2hvdEZpbGU/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50cyA9IGF3YWl0IHRoaXMuY29sbGVjdEFjdGl2ZUVsZW1lbnRzRm9yRGVhZGxvY2tSZWxpZWYoKTtcbiAgICBjb25zdCBhY3RpdmVQb2xpY3lFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHNGb3JQb2xpY3koKTtcbiAgICBjb25zdCBzYW5kYm94aW5nRWxlbWVudCA9IGZpbmRDb25maXJtRGVueWluZ0VsZW1lbnQoYWN0aXZlUG9saWN5RWxlbWVudHMpO1xuICAgIGNvbnN0IGFkdmlzb3J5RWxlbWVudHMgPSBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMoYWN0aXZlUG9saWN5RWxlbWVudHMpO1xuICAgIGNvbnN0IGRlYWN0aXZhdGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+ID0gW107XG4gICAgY29uc3QgZmFpbGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChlbGVtZW50LnR5cGUpO1xuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICBmYWlsZWQucHVzaCh7XG4gICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICBlcnJvcjogYE5vIGFjdGl2YXRpb24gc3RyYXRlZ3kgcmVnaXN0ZXJlZCBmb3IgdHlwZSAnJHtlbGVtZW50LnR5cGV9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RyYXRlZ3kuZGVhY3RpdmF0ZShlbGVtZW50Lm5hbWUpO1xuICAgICAgICBkZWFjdGl2YXRlZC5wdXNoKGVsZW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZmFpbGVkLnB1c2goe1xuICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGVyc2lzdGVkU3RhdGVDbGVhcmVkID0gQm9vbGVhbih0aGlzLmFjdGl2YXRpb25TdG9yZT8uaXNFbmFibGVkKCkpO1xuICAgIGNvbnN0IHNuYXBzaG90RmlsZSA9IGF3YWl0IHRoaXMud3JpdGVEZWFkbG9ja1JlbGllZlNuYXBzaG90KHtcbiAgICAgIHNlc3Npb25JZDogdGhpcy5hY3RpdmF0aW9uU3RvcmU/LmdldFNlc3Npb25JZCgpLFxuICAgICAgYWN0aXZlQmVmb3JlUmVzZXQ6IGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgZGVhY3RpdmF0ZWQsXG4gICAgICBmYWlsZWQsXG4gICAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICAgIC4uLihzYW5kYm94aW5nRWxlbWVudCA/IHsgc2FuZGJveGluZ0VsZW1lbnQgfSA6IHt9KSxcbiAgICAgICAgYWR2aXNvcnlFbGVtZW50cyxcbiAgICAgIH0sXG4gICAgICBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFjdGl2YXRpb25TdG9yZT8uY2xlYXJBbGwoKTtcbiAgICB0aGlzLnBvbGljeUV4cG9ydFNlcnZpY2U/LmV4cG9ydFBvbGljaWVzKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgY29uc3QgZmFpbHVyZVN1bW1hcnkgPSBmYWlsZWQubGVuZ3RoID4gMCA/IGAgd2l0aCAke2ZhaWxlZC5sZW5ndGh9IGZhaWx1cmUocylgIDogJyc7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9ERUFDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogZmFpbGVkLmxlbmd0aCA+IDAgPyAnTUVESVVNJyA6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRWxlbWVudENSVURIYW5kbGVyLnJlbGVhc2VEZWFkbG9jaycsXG4gICAgICBkZXRhaWxzOiBgRGVhZGxvY2sgcmVsaWVmIGRlYWN0aXZhdGVkICR7ZGVhY3RpdmF0ZWQubGVuZ3RofSBlbGVtZW50KHMpJHtmYWlsdXJlU3VtbWFyeX1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmFjdGl2YXRpb25TdG9yZT8uZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgIGFjdGl2ZUJlZm9yZVJlc2V0OiBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgZGVhY3RpdmF0ZWQsXG4gICAgICAgIGZhaWxlZCxcbiAgICAgICAgcGVyc2lzdGVkU3RhdGVDbGVhcmVkLFxuICAgICAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICAgICAgLi4uKHNhbmRib3hpbmdFbGVtZW50ID8geyBzYW5kYm94aW5nRWxlbWVudCB9IDoge30pLFxuICAgICAgICAgIGFkdmlzb3J5RWxlbWVudHMsXG4gICAgICAgIH0sXG4gICAgICAgIHNuYXBzaG90RmlsZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uKHRoaXMuYWN0aXZhdGlvblN0b3JlPy5nZXRTZXNzaW9uSWQoKVxuICAgICAgICA/IHsgc2Vzc2lvbklkOiB0aGlzLmFjdGl2YXRpb25TdG9yZS5nZXRTZXNzaW9uSWQoKSB9XG4gICAgICAgIDoge30pLFxuICAgICAgYWN0aXZlQmVmb3JlUmVzZXQ6IGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgZGVhY3RpdmF0ZWQsXG4gICAgICBmYWlsZWQsXG4gICAgICBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQsXG4gICAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICAgIC4uLihzYW5kYm94aW5nRWxlbWVudCA/IHsgc2FuZGJveGluZ0VsZW1lbnQgfSA6IHt9KSxcbiAgICAgICAgYWR2aXNvcnlFbGVtZW50cyxcbiAgICAgIH0sXG4gICAgICAuLi4oc25hcHNob3RGaWxlID8geyBzbmFwc2hvdEZpbGUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0QWN0aXZlRWxlbWVudHNGb3JEZWFkbG9ja1JlbGllZigpOiBQcm9taXNlPEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4+IHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50czogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgY29uc3QgYWN0aXZlUGVyc29uYXMgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmFzKCk7XG4gICAgYWN0aXZlRWxlbWVudHMucHVzaCguLi5hY3RpdmVQZXJzb25hcy5tYXAoKHBlcnNvbmEpID0+ICh7XG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgIH0pKSk7XG5cbiAgICBjb25zdCBhY3RpdmVTa2lsbHMgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5nZXRBY3RpdmVTa2lsbHMoKTtcbiAgICBhY3RpdmVFbGVtZW50cy5wdXNoKC4uLmFjdGl2ZVNraWxscy5tYXAoKHNraWxsKSA9PiAoe1xuICAgICAgdHlwZTogRWxlbWVudFR5cGUuU0tJTEwsXG4gICAgICBuYW1lOiBza2lsbC5tZXRhZGF0YS5uYW1lLFxuICAgIH0pKSk7XG5cbiAgICBjb25zdCBhY3RpdmVBZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBY3RpdmVBZ2VudHMoKTtcbiAgICBhY3RpdmVFbGVtZW50cy5wdXNoKC4uLmFjdGl2ZUFnZW50cy5tYXAoKGFnZW50KSA9PiAoe1xuICAgICAgdHlwZTogRWxlbWVudFR5cGUuQUdFTlQsXG4gICAgICBuYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgIH0pKSk7XG5cbiAgICBjb25zdCBhY3RpdmVNZW1vcmllcyA9IGF3YWl0IHRoaXMubWVtb3J5TWFuYWdlci5nZXRBY3RpdmVNZW1vcmllcygpO1xuICAgIGFjdGl2ZUVsZW1lbnRzLnB1c2goLi4uYWN0aXZlTWVtb3JpZXMubWFwKChtZW1vcnkpID0+ICh7XG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5NRU1PUlksXG4gICAgICBuYW1lOiBtZW1vcnkubWV0YWRhdGEubmFtZSxcbiAgICB9KSkpO1xuXG4gICAgY29uc3QgYWN0aXZlRW5zZW1ibGVzID0gYXdhaXQgdGhpcy5lbnNlbWJsZU1hbmFnZXIuZ2V0QWN0aXZlRW5zZW1ibGVzKCk7XG4gICAgYWN0aXZlRWxlbWVudHMucHVzaCguLi5hY3RpdmVFbnNlbWJsZXMubWFwKChlbnNlbWJsZSkgPT4gKHtcbiAgICAgIHR5cGU6IEVsZW1lbnRUeXBlLkVOU0VNQkxFLFxuICAgICAgbmFtZTogZW5zZW1ibGUubWV0YWRhdGEubmFtZSxcbiAgICB9KSkpO1xuXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHJldHVybiBhY3RpdmVFbGVtZW50cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke2VsZW1lbnQudHlwZX06JHtlbGVtZW50Lm5hbWV9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVEZWFkbG9ja1JlbGllZlNuYXBzaG90KHNuYXBzaG90OiB7XG4gICAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAgIGFjdGl2ZUJlZm9yZVJlc2V0OiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+O1xuICAgIGRlYWN0aXZhdGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+O1xuICAgIGZhaWxlZDogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjtcbiAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICBzYW5kYm94aW5nRWxlbWVudD86IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIGFkdmlzb3J5RWxlbWVudHM6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgfTtcbiAgICBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQ6IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHNuYXBzaG90RGlyID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnc3RhdGUnLCAnZGVhZGxvY2stcmVsaWVmJyk7XG4gICAgY29uc3Qgc2FmZVNlc3Npb25JZCA9IChzbmFwc2hvdC5zZXNzaW9uSWQgPz8gJ3Nlc3Npb24nKVxuICAgICAgLnJlcGxhY2VBbGwoL1teYS16QS1aMC05Xy1dL2csICctJylcbiAgICAgIC5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2VBbGwoL1s6Ll0vZywgJy0nKTtcbiAgICBjb25zdCBzbmFwc2hvdEZpbGUgPSBwYXRoLmpvaW4oc25hcHNob3REaXIsIGBkZWFkbG9jay1yZWxpZWYtJHtzYWZlU2Vzc2lvbklkfS0ke3RpbWVzdGFtcH0uanNvbmApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHNuYXBzaG90RGlyKTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKFxuICAgICAgICBzbmFwc2hvdEZpbGUsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAuLi5zbmFwc2hvdCxcbiAgICAgICAgfSwgbnVsbCwgMiksXG4gICAgICAgIHsgc291cmNlOiAnRWxlbWVudENSVURIYW5kbGVyLnJlbGVhc2VEZWFkbG9jaycgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc25hcHNob3RGaWxlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHdyaXRlIGRlYWRsb2NrIHJlbGllZiBzbmFwc2hvdCcsIHtcbiAgICAgICAgc25hcHNob3RGaWxlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShcbiAgICBzdGF0ZTogUGVyc2lzdGVkQWN0aXZhdGlvblN0YXRlU25hcHNob3QsXG4gICAgYWRkRWxlbWVudDogKGVsZW1lbnQ6IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LCBzZXNzaW9uSWRzPzogc3RyaW5nW10pID0+IHZvaWQsXG4gICAgZmluZFBlcnNpc3RlZEVsZW1lbnQ6ICh0eXBlOiBzdHJpbmcsIGFjdGl2YXRpb246IFBlcnNpc3RlZEFjdGl2YXRpb24pID0+IFByb21pc2U8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZzogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBhY3RpdmF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGUuYWN0aXZhdGlvbnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2YgYWN0aXZhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgcGVuZGluZy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kUGVyc2lzdGVkRWxlbWVudCh0eXBlLCBhY3RpdmF0aW9uKTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZm91bmQsIFtzdGF0ZS5zZXNzaW9uSWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwZW5kaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGRlYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVBQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5kZWFjdGl2YXRlRWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBFbGVtZW50IGRlYWN0aXZhdGlvbiByZXF1ZXN0ZWQ6ICR7dHlwZX0vJHtuYW1lfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVsZW1lbnRUeXBlOiB0eXBlLCBlbGVtZW50TmFtZTogbmFtZSB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmRlYWN0aXZhdGUobmFtZSk7XG5cbiAgICAgIC8vIElzc3VlICM1OTg6IFBlcnNpc3QgZGVhY3RpdmF0aW9uIHN0YXRlIGZvciBzZXNzaW9uIHJlc3RvcmVcbiAgICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZSkge1xuICAgICAgICB0aGlzLmFjdGl2YXRpb25TdG9yZS5yZWNvcmREZWFjdGl2YXRpb24obm9ybWFsaXplZFR5cGUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzYyOiBFeHBvcnQgcG9saWNpZXMgdG8gYnJpZGdlIGFmdGVyIGRlYWN0aXZhdGlvblxuICAgICAgdGhpcy5wb2xpY3lFeHBvcnRTZXJ2aWNlPy5leHBvcnRQb2xpY2llcygpLmNhdGNoKCgpID0+IHt9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgdG8gcHJvcGFnYXRlIHRvIE1DUC1BUUwgbGF5ZXJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBvcGVyYXRpb25zIHJldHVybiBzdWNjZXNzPWZhbHNlIGluc3RlYWQgb2Ygc3VjY2Vzcz10cnVlIHdpdGggZXJyb3IgdGV4dFxuICAgICAgLy8gSXNzdWUgIzI3NTogSGFuZGxlcnMgcmV0dXJuIHN1Y2Nlc3M9dHJ1ZSBmb3IgbWlzc2luZyBlbGVtZW50c1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gcmUtdGhyb3cgdmFsaWRhdGlvbiBlcnJvcnMgKGUuZy4sIG1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycylcbiAgICAgIC8vIHNvIHRoZXkgcmVzdWx0IGluIHN1Y2Nlc3M9ZmFsc2UgaW5zdGVhZCBvZiBzdWNjZXNzPXRydWUgd2l0aCBlcnJvciBjb250ZW50XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSBlbGVtZW50OmAsIHsgdHlwZSwgbmFtZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogR2V0IHRoZSBlbGVtZW50IG1hbmFnZXIgZm9yIGEgbm9ybWFsaXplZCB0eXBlLlxuICAgKiBVc2VkIHRvIGNoZWNrIGludmFsaWQgZWxlbWVudCByZWNvcmRzIHdoZW4gYW4gZWxlbWVudCBpcyBcIm5vdCBmb3VuZFwiLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZTogc3RyaW5nKTogQmFzZUVsZW1lbnRNYW5hZ2VyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTogcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIgYXMgdW5rbm93biBhcyBCYXNlRWxlbWVudE1hbmFnZXI8YW55PjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHJldHVybiB0aGlzLnNraWxsTWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHJldHVybiB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuTUVNT1JZOiByZXR1cm4gdGhpcy5tZW1vcnlNYW5hZ2VyO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTogcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRFbGVtZW50RGV0YWlscyhuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBjb25zdCBzdHJhdGVneSA9IHRoaXMuc3RyYXRlZ2llcy5nZXQobm9ybWFsaXplZFR5cGUpO1xuXG4gICAgICBpZiAoIXN0cmF0ZWd5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHN0cmF0ZWd5LmdldEVsZW1lbnREZXRhaWxzKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJc3N1ZSAjNzA4OiBXaGVuIGVsZW1lbnQgaXMgXCJub3QgZm91bmRcIiwgY2hlY2sgaWYgaXQgYWN0dWFsbHkgZXhpc3RzXG4gICAgICAvLyBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbi4gUmV0dXJuIGEgZGlzdGluY3QgZXJyb3IgaW4gdGhhdCBjYXNlLlxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yVHlwZShub3JtYWxpemVkVHlwZSk7XG4gICAgICAgIGlmIChtYW5hZ2VyICYmIHR5cGVvZiBtYW5hZ2VyLmdldEludmFsaWRFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgaW52YWxpZFJlY29yZCA9IG1hbmFnZXIuZ2V0SW52YWxpZEVsZW1lbnQobmFtZSk7XG4gICAgICAgICAgaWYgKGludmFsaWRSZWNvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRWYWxpZGF0aW9uRmFpbGVkRXJyb3IoXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRUeXBlIGFzIEVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBpbnZhbGlkUmVjb3JkLnJlYXNvbixcbiAgICAgICAgICAgICAgaW52YWxpZFJlY29yZC5maWxlUGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBlbGVtZW50IGRldGFpbHM6YCwgeyB0eXBlLCBuYW1lLCBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlscyBmb3IgJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGUgZnJvbSB0aGUgZmlsZXN5c3RlbVxuICAgKiBFeHRyYWN0ZWQgZnJvbSBpbmRleC50czo2MDktNjc5IChleGFjdCBjb3B5LCBhZGFwdGVkIGZvciBoYW5kbGVyIHBhdHRlcm4pXG4gICAqL1xuICBhc3luYyByZWxvYWRFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIHRvIGhhbmRsZSBib3RoIHBsdXJhbCBhbmQgc2luZ3VsYXIgZm9ybXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIucmVsb2FkUGVyc29uYXMoKTtcblxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgdGhpcy5za2lsbE1hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7c2tpbGxzLmxlbmd0aH0gc2tpbGxzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIC8vIFRlbXBsYXRlIG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7dGVtcGxhdGVzLmxlbmd0aH0gdGVtcGxhdGVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIC8vIEFnZW50IG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7YWdlbnRzLmxlbmd0aH0gYWdlbnRzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6IHtcbiAgICAgICAgICAvLyBNZW1vcnkgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHttZW1vcmllcy5sZW5ndGh9IG1lbW9yaWVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRToge1xuICAgICAgICAgIC8vIEVuc2VtYmxlIG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7ZW5zZW1ibGVzLmxlbmd0aH0gZW5zZW1ibGVzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWxvYWQgJHt0eXBlfTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIHRlbXBsYXRlIHdpdGggdmFyaWFibGVzXG4gICAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjY4Mi03MDEgKGV4YWN0IGNvcHkpXG4gICAqXG4gICAqIEB0aHJvd3Mge0VsZW1lbnROb3RGb3VuZEVycm9yfSBXaGVuIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0XG4gICAqIEBzZWUgSXNzdWUgIzI3NSAtIEhhbmRsZXJzIHJldHVybiBzdWNjZXNzPXRydWUgZm9yIG1pc3NpbmcgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlKG5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgLy8gVXNlIHRoZSBuZXcgVGVtcGxhdGVSZW5kZXJlciB1dGlsaXR5IGZvciBjbGVhbmVyIGNvZGUgYW5kIGJldHRlciB2YWxpZGF0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50ZW1wbGF0ZVJlbmRlcmVyLnJlbmRlcihuYW1lLCB2YXJpYWJsZXMpO1xuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5jb250ZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn5OEIFJlbmRlcmVkIHRlbXBsYXRlICcke25hbWV9JzpcXG5cXG4ke3Jlc3VsdC5jb250ZW50fWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzc3VlICMyNzU6IFRocm93IGVycm9yIGZvciBtaXNzaW5nIHRlbXBsYXRlcyBpbnN0ZWFkIG9mIHJldHVybmluZyBjb250ZW50XG4gICAgICBpZiAocmVzdWx0LmVycm9yPy5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdUZW1wbGF0ZScsIG5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MICR7cmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gcmVuZGVyIHRlbXBsYXRlJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3BcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZXhlY3V0ZUFnZW50KG5hbWUsIHBhcmFtZXRlcnMpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBzdGVwIGluIGFnZW50IGV4ZWN1dGlvblxuICAgKi9cbiAgYXN5bmMgcmVjb3JkQWdlbnRTdGVwKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBzdGVwRGVzY3JpcHRpb246IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICBuZXh0QWN0aW9uSGludD86IHN0cmluZztcbiAgICByaXNrU2NvcmU/OiBudW1iZXI7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIucmVjb3JkQWdlbnRTdGVwKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlY29yZCBhZ2VudCBzdGVwIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVjb3JkIHN0ZXA6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGUgYW4gYWdlbnQgZ29hbFxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwoYXJnczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIGdvYWxJZD86IHN0cmluZztcbiAgICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gICAgc3VtbWFyeTogc3RyaW5nO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmNvbXBsZXRlQWdlbnRHb2FsKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNvbXBsZXRlIGFnZW50IGdvYWwgZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjb21wbGV0ZSBnb2FsOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZ2VudCBzdGF0ZVxuICAgKi9cbiAgYXN5bmMgZ2V0QWdlbnRTdGF0ZShhcmdzOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgaW5jbHVkZURlY2lzaW9uSGlzdG9yeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xuICB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmdldEFnZW50U3RhdGUoYXJncyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFnZW50IHN0YXRlIGZvciAnJHthcmdzLmFnZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IHN0YXRlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqL1xuICBhc3luYyBjb250aW51ZUFnZW50RXhlY3V0aW9uKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwcmV2aW91c1N0ZXBSZXN1bHQ/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuY29udGludWVBZ2VudEV4ZWN1dGlvbihhcmdzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjb250aW51ZSBhZ2VudCBleGVjdXRpb24gZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjb250aW51ZSBleGVjdXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWdncmVnYXRlIGFjdGl2ZSBlbGVtZW50cyBhY3Jvc3MgYWxsIHJlZ2lzdGVyZWQgZWxlbWVudCB0eXBlcy5cbiAgICogSXNzdWUgIzUwMTogQ2FsbGVkIHdoZW4gZ2V0X2FjdGl2ZV9lbGVtZW50cyBpcyBpbnZva2VkIHdpdGhvdXQgZWxlbWVudF90eXBlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhZ2dyZWdhdGVBY3RpdmVFbGVtZW50cygpOiBQcm9taXNlPE1DUFJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgc3RyYXRlZ3ldIG9mIHRoaXMuc3RyYXRlZ2llcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyYXRlZ3kuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlc3VsdC5jb250ZW50WzBdPy50ZXh0O1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgIHNlY3Rpb25zLnB1c2goYFske2VsZW1lbnRUeXBlfV1cXG4ke3RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBnZXQgYWN0aXZlICR7ZWxlbWVudFR5cGV9IGVsZW1lbnRzYCwgeyBlcnJvcjogZXJyIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgID8gc2VjdGlvbnMuam9pbignXFxuXFxuJylcbiAgICAgICAgICA6ICdObyBhY3RpdmUgZWxlbWVudHMgZm91bmQuJ1xuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbn1cbiJdfQ==
|
|
1133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudENSVURIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL0VsZW1lbnRDUlVESGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFPN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLElBQUksb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsYUFBYSxJQUFJLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEYsT0FBTyxFQUFFLFdBQVcsSUFBSSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxjQUFjLElBQUkscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxJQUFJLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixJQUFJLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGVBQWUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSzlGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUd4RSxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFDdkIs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LEVBQUUsQ0FBQztvQkFDVCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzdDLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixXQUFXLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDO29CQUNSLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQ3ZCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzt3QkFDdkIsQ0FBQyxDQUFDLDJCQUEyQjtpQkFDaEMsQ0FBQztTQUNILENBQUM7SUFDSixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVsZW1lbnRDUlVESGFuZGxlciAtIEhhbmRsZXMgYWxsIGdlbmVyaWMgZWxlbWVudCBDUlVEIG9wZXJhdGlvbnNcbiAqXG4gKiBQcm92aWRlcyBjcmVhdGUsIGVkaXQsIHZhbGlkYXRlLCBhbmQgZGVsZXRlIG9wZXJhdGlvbnMgZm9yIGFsbCBlbGVtZW50IHR5cGVzXG4gKiAocGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMsIG1lbW9yaWVzKS5cbiAqXG4gKiBVc2VzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGZvciBhbGwgc2VydmljZXM6XG4gKiAtIEluaXRpYWxpemF0aW9uU2VydmljZSBmb3Igc2V0dXAgdGFza3NcbiAqIC0gUGVyc29uYUluZGljYXRvclNlcnZpY2UgZm9yIHBlcnNvbmEgaW5kaWNhdG9yIGZvcm1hdHRpbmdcbiAqIC0gRWxlbWVudCBtYW5hZ2VycyAoU2tpbGxNYW5hZ2VyLCBUZW1wbGF0ZU1hbmFnZXIsIEFnZW50TWFuYWdlciwgTWVtb3J5TWFuYWdlcilcbiAqIC0gUGVyc29uYU1hbmFnZXIgZm9yIHBlcnNvbmEgb3BlcmF0aW9uc1xuICogLSBQb3J0Zm9saW9NYW5hZ2VyIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9uc1xuICpcbiAqIEZJWDogRE1DUC1TRUMtMDA2IC0gU2VjdXJpdHkgYXVkaXQgc3VwcHJlc3Npb25cbiAqIFRoaXMgaGFuZGxlciBkZWxlZ2F0ZXMgYWxsIG9wZXJhdGlvbnMgdG8gc3BlY2lhbGl6ZWQgZWxlbWVudCBtYW5hZ2Vycy5cbiAqIEF1ZGl0IGxvZ2dpbmcgaGFwcGVucyBpbiB0aGUgZWxlbWVudCBtYW5hZ2VycyB0aGVtc2VsdmVzLlxuICogQHNlY3VyaXR5LWF1ZGl0LXN1cHByZXNzIERNQ1AtU0VDLTAwNlxuICovXG5cbmltcG9ydCB7IEVsZW1lbnRUeXBlLCBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IFNraWxsTWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL3NraWxscy9pbmRleC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuLi9lbGVtZW50cy90ZW1wbGF0ZXMvVGVtcGxhdGVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFRlbXBsYXRlUmVuZGVyZXIgfSBmcm9tICcuLi91dGlscy9UZW1wbGF0ZVJlbmRlcmVyLmpzJztcbmltcG9ydCB7IEFnZW50TWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgTWVtb3J5TWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRW5zZW1ibGVNYW5hZ2VyIH0gZnJvbSAnLi4vZWxlbWVudHMvZW5zZW1ibGVzL0Vuc2VtYmxlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCBhcyBjcmVhdGVFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2NyZWF0ZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgZGVsZXRlRWxlbWVudCBhcyBkZWxldGVFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL2RlbGV0ZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgZWRpdEVsZW1lbnQgYXMgZWRpdEVsZW1lbnRDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvZWRpdEVsZW1lbnQuanMnO1xuaW1wb3J0IHsgdXBncmFkZUVsZW1lbnQgYXMgdXBncmFkZUVsZW1lbnRDb21tYW5kIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvdXBncmFkZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgbGlzdEVsZW1lbnRzIGFzIGxpc3RFbGVtZW50c0NvbW1hbmQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC9saXN0RWxlbWVudHMuanMnO1xuaW1wb3J0IHsgZmluZEVsZW1lbnRGbGV4aWJseSwgc2FuaXRpemVNZXRhZGF0YSBhcyBzYW5pdGl6ZU1ldGFkYXRhUmVjb3JkIH0gZnJvbSAnLi9lbGVtZW50LWNydWQvaGVscGVycy5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUVsZW1lbnQgYXMgdmFsaWRhdGVFbGVtZW50Q29tbWFuZCB9IGZyb20gJy4vZWxlbWVudC1jcnVkL3ZhbGlkYXRlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Q3J1ZENvbnRleHQgfSBmcm9tICcuL2VsZW1lbnQtY3J1ZC90eXBlcy5qcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9Jbml0aWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgUGVyc29uYUluZGljYXRvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9QZXJzb25hSW5kaWNhdG9yU2VydmljZS5qcyc7XG5pbXBvcnQgeyBQZXJzb25hTWFuYWdlciB9IGZyb20gJy4uL3BlcnNvbmEvUGVyc29uYU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IEVMRU1FTlRfVFlQRV9NQVAgfSBmcm9tICcuLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudEFjdGl2YXRpb25TdHJhdGVneSwgTUNQUmVzcG9uc2UgfSBmcm9tICcuL3N0cmF0ZWdpZXMvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVBY3RpdmF0aW9uU3RyYXRlZ3ksXG4gIFNraWxsQWN0aXZhdGlvblN0cmF0ZWd5LFxuICBBZ2VudEFjdGl2YXRpb25TdHJhdGVneSxcbiAgTWVtb3J5QWN0aXZhdGlvblN0cmF0ZWd5LFxuICBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5LFxuICBFbnNlbWJsZUFjdGl2YXRpb25TdHJhdGVneVxufSBmcm9tICcuL3N0cmF0ZWdpZXMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1ZXJ5L0VsZW1lbnRRdWVyeVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmF0aW9uU3RvcmUsIFBlcnNpc3RlZEFjdGl2YXRpb24sIFBlcnNpc3RlZEFjdGl2YXRpb25TdGF0ZVNuYXBzaG90IH0gZnJvbSAnLi4vc2VydmljZXMvQWN0aXZhdGlvblN0b3JlLmpzJztcbmltcG9ydCB0eXBlIHsgQmFja3VwU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBQb2xpY3lFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvUG9saWN5RXhwb3J0U2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IGZvcm1hdFZhbGlkYXRpb25GYWlsZWRFcnJvciB9IGZyb20gJy4vZWxlbWVudC1jcnVkL3Jlc3BvbnNlRm9ybWF0dGVyLmpzJztcbmltcG9ydCB7XG4gIGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cyxcbiAgZmluZENvbmZpcm1EZW55aW5nRWxlbWVudCxcbiAgZ2V0R2F0ZWtlZXBlckRpYWdub3N0aWNzLFxufSBmcm9tICcuL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcblxudHlwZSBQb2xpY3lFbGVtZW50ID0ge1xuICB0eXBlOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU3RhYmxlIHN0b3JhZ2UgaWRlbnRpdHkgdXNlZCBvbmx5IHRvIGF2b2lkIHVuc2FmZSBkaXNwbGF5LW5hbWUgZGVkdXBsaWNhdGlvbi4gKi9cbiAgaWRlbnRpdHk/OiBzdHJpbmc7XG59O1xuXG50eXBlIFBvbGljeU1lbWJlckVsZW1lbnQgPSB7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG50eXBlIFBvbGljeUluZGV4T3B0aW9ucyA9IHsgZnJlc2hBZnRlckluRmxpZ2h0PzogYm9vbGVhbiB9O1xudHlwZSBJbmRleGVkUG9saWN5TWFuYWdlcnMgPSBNYXA8c3RyaW5nLCBQcm9taXNlPEJhc2VFbGVtZW50TWFuYWdlcjxhbnk+IHwgdW5kZWZpbmVkPj47XG50eXBlIFBvbGljeU1lbWJlckNhbmRpZGF0ZSA9IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGtleTogc3RyaW5nIH07XG5cbnR5cGUgRGVhZGxvY2tSZWxpZWZFbGVtZW50ID0ge1xuICB0eXBlOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVhY3RpdmF0aW9uSWRlbnRpZmllcj86IHN0cmluZztcbn07XG5cbmNvbnN0IEFDVElWRV9QT0xJQ1lfTUVNQkVSX0xPT0tVUF9DT05DVVJSRU5DWSA9IDg7XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50Q1JVREhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cmF0ZWdpZXM6IE1hcDxzdHJpbmcsIEVsZW1lbnRBY3RpdmF0aW9uU3RyYXRlZ3k+O1xuICBwcml2YXRlIGFjdGl2ZVBvbGljeVNuYXBzaG90R2VuZXJhdGlvbiA9IDA7XG4gIHByaXZhdGUgYWN0aXZlUG9saWN5U25hcHNob3RJbkZsaWdodD86IHtcbiAgICBnZW5lcmF0aW9uOiBudW1iZXI7XG4gICAgcHJvbWlzZTogUHJvbWlzZTxQb2xpY3lFbGVtZW50W10+O1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2tpbGxNYW5hZ2VyOiBTa2lsbE1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZU1hbmFnZXI6IFRlbXBsYXRlTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlUmVuZGVyZXI6IFRlbXBsYXRlUmVuZGVyZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZ2VudE1hbmFnZXI6IEFnZW50TWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnNlbWJsZU1hbmFnZXI6IEVuc2VtYmxlTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcnNvbmFNYW5hZ2VyOiBQZXJzb25hTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbml0U2VydmljZTogSW5pdGlhbGl6YXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yU2VydmljZTogUGVyc29uYUluZGljYXRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRRdWVyeVNlcnZpY2U6IEVsZW1lbnRRdWVyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRpb25TdG9yZT86IEFjdGl2YXRpb25TdG9yZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9saWN5RXhwb3J0U2VydmljZT86IFBvbGljeUV4cG9ydFNlcnZpY2VcbiAgKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBzdHJhdGVneSBtYXAgd2l0aCBhbGwgZWxlbWVudCB0eXBlIHN0cmF0ZWdpZXNcbiAgICB0aGlzLnN0cmF0ZWdpZXMgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudEFjdGl2YXRpb25TdHJhdGVneT4oW1xuICAgICAgW0VsZW1lbnRUeXBlLlBFUlNPTkEsIG5ldyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5KHBlcnNvbmFNYW5hZ2VyLCBpbmRpY2F0b3JTZXJ2aWNlKV0sXG4gICAgICBbRWxlbWVudFR5cGUuU0tJTEwsIG5ldyBTa2lsbEFjdGl2YXRpb25TdHJhdGVneShza2lsbE1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5URU1QTEFURSwgbmV3IFRlbXBsYXRlQWN0aXZhdGlvblN0cmF0ZWd5KHRlbXBsYXRlTWFuYWdlcildLFxuICAgICAgW0VsZW1lbnRUeXBlLkFHRU5ULCBuZXcgQWdlbnRBY3RpdmF0aW9uU3RyYXRlZ3koYWdlbnRNYW5hZ2VyKV0sXG4gICAgICBbRWxlbWVudFR5cGUuTUVNT1JZLCBuZXcgTWVtb3J5QWN0aXZhdGlvblN0cmF0ZWd5KG1lbW9yeU1hbmFnZXIpXSxcbiAgICAgIFtFbGVtZW50VHlwZS5FTlNFTUJMRSwgbmV3IEVuc2VtYmxlQWN0aXZhdGlvblN0cmF0ZWd5KFxuICAgICAgICBlbnNlbWJsZU1hbmFnZXIsXG4gICAgICAgIHBvcnRmb2xpb01hbmFnZXIsXG4gICAgICAgIHNraWxsTWFuYWdlcixcbiAgICAgICAgdGVtcGxhdGVNYW5hZ2VyLFxuICAgICAgICBhZ2VudE1hbmFnZXIsXG4gICAgICAgIG1lbW9yeU1hbmFnZXIsXG4gICAgICAgIHBlcnNvbmFNYW5hZ2VyXG4gICAgICApXVxuICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRTZXJ2aWNlLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcnNvbmFJbmRpY2F0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JTZXJ2aWNlLmdldFBlcnNvbmFJbmRpY2F0b3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGV4dCgpOiBFbGVtZW50Q3J1ZENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBlbnN1cmVJbml0aWFsaXplZDogKCkgPT4gdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpLFxuICAgICAgZ2V0UGVyc29uYUluZGljYXRvcjogKCkgPT4gdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCksXG4gICAgICBza2lsbE1hbmFnZXI6IHRoaXMuc2tpbGxNYW5hZ2VyLFxuICAgICAgdGVtcGxhdGVNYW5hZ2VyOiB0aGlzLnRlbXBsYXRlTWFuYWdlcixcbiAgICAgIHRlbXBsYXRlUmVuZGVyZXI6IHRoaXMudGVtcGxhdGVSZW5kZXJlcixcbiAgICAgIGFnZW50TWFuYWdlcjogdGhpcy5hZ2VudE1hbmFnZXIsXG4gICAgICBtZW1vcnlNYW5hZ2VyOiB0aGlzLm1lbW9yeU1hbmFnZXIsXG4gICAgICBlbnNlbWJsZU1hbmFnZXI6IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLFxuICAgICAgcG9ydGZvbGlvTWFuYWdlcjogdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLFxuICAgICAgcGVyc29uYU1hbmFnZXI6IHRoaXMucGVyc29uYU1hbmFnZXIsXG4gICAgICBmaWxlT3BlcmF0aW9uczogdGhpcy5maWxlT3BlcmF0aW9ucyxcbiAgICAgIGVsZW1lbnRRdWVyeVNlcnZpY2U6IHRoaXMuZWxlbWVudFF1ZXJ5U2VydmljZSxcbiAgICAgIHZhbGlkYXRpb25SZWdpc3RyeTogdGhpcy52YWxpZGF0aW9uUmVnaXN0cnksXG4gICAgICBiYWNrdXBTZXJ2aWNlOiB0aGlzLmJhY2t1cFNlcnZpY2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgbmFtZSwgc3VwcG9ydGluZyBib3RoIGV4YWN0IGRpc3BsYXkgbmFtZSBhbmQgZmlsZW5hbWUgKHNsdWcpIG1hdGNoaW5nXG4gICAqIEhlbHBlciBtZXRob2QgZXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MzQ2LTM3OVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRWxlbWVudEZsZXhpYmx5KG5hbWU6IHN0cmluZywgZWxlbWVudExpc3Q6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gZmluZEVsZW1lbnRGbGV4aWJseShuYW1lLCBlbGVtZW50TGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgbWV0YWRhdGEgb2JqZWN0IHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgKiBIZWxwZXIgbWV0aG9kIGV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjM5MC00MTBcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiBzYW5pdGl6ZU1ldGFkYXRhUmVjb3JkKG1ldGFkYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplTG9va3VwVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICA/IHZhbHVlLm5vcm1hbGl6ZSgnTkZDJykudHJpbSgpXG4gICAgICA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNHYXRla2VlcGVyUG9saWN5KG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKG1ldGFkYXRhPy5bJ2dhdGVrZWVwZXInXSB8fCBnZXRHYXRla2VlcGVyRGlhZ25vc3RpY3MobWV0YWRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9Qb2xpY3lFbGVtZW50VHlwZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZSh0eXBlKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgJ3BlcnNvbmFzJzpcbiAgICAgICAgcmV0dXJuICdwZXJzb25hJztcbiAgICAgIGNhc2UgJ3NraWxscyc6XG4gICAgICAgIHJldHVybiAnc2tpbGwnO1xuICAgICAgY2FzZSAndGVtcGxhdGVzJzpcbiAgICAgICAgcmV0dXJuICd0ZW1wbGF0ZSc7XG4gICAgICBjYXNlICdhZ2VudHMnOlxuICAgICAgICByZXR1cm4gJ2FnZW50JztcbiAgICAgIGNhc2UgJ21lbW9yaWVzJzpcbiAgICAgICAgcmV0dXJuICdtZW1vcnknO1xuICAgICAgY2FzZSAnZW5zZW1ibGVzJzpcbiAgICAgICAgcmV0dXJuICdlbnNlbWJsZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZFR5cGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb2xpY3lFbGVtZW50S2V5KHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy50b1BvbGljeUVsZW1lbnRUeXBlKHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSkpfToke3RoaXMubm9ybWFsaXplTG9va3VwVmFsdWUobmFtZSl9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZUFjdGl2ZVBvbGljeVNuYXBzaG90KCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUG9saWN5U25hcHNob3RHZW5lcmF0aW9uICs9IDE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTQ5Mi0xNjMxICgxNDAgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRWRpdCBhbiBleGlzdGluZyBlbGVtZW50IHVzaW5nIEdyYXBoUUwtYWxpZ25lZCBuZXN0ZWQgaW5wdXQgb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgaGFuZGxlci5lZGl0RWxlbWVudCh7XG4gICAqICAgbmFtZTogJ215LXNraWxsJyxcbiAgICogICB0eXBlOiAnc2tpbGxzJyxcbiAgICogICBpbnB1dDoge1xuICAgKiAgICAgZGVzY3JpcHRpb246ICdVcGRhdGVkJyxcbiAgICogICAgIG1ldGFkYXRhOiB7IHRyaWdnZXJzOiBbJ2NvZGUnXSB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICovXG4gIGFzeW5jIGVkaXRFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSkge1xuICAgIHJldHVybiBlZGl0RWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgZWxlbWVudCBmcm9tIHYxIHNpbmdsZS1ib2R5IHRvIHYyIGR1YWwtZmllbGQgZm9ybWF0IChpbnN0cnVjdGlvbnMgKyBjb250ZW50KVxuICAgKi9cbiAgYXN5bmMgdXBncmFkZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkcnlfcnVuPzogYm9vbGVhbjsgaW5zdHJ1Y3Rpb25zX292ZXJyaWRlPzogc3RyaW5nOyBjb250ZW50X292ZXJyaWRlPzogc3RyaW5nfSkge1xuICAgIHJldHVybiB1cGdyYWRlRWxlbWVudENvbW1hbmQodGhpcy5nZXRDb250ZXh0KCksIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MTk0MS0yMDU0ICgxMTQgbGluZXMgLSBleGFjdCBjb3B5KVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgc3RyaWN0PzogYm9vbGVhbn0pIHtcbiAgICByZXR1cm4gdmFsaWRhdGVFbGVtZW50Q29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVsZW1lbnRcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6MjA1Ni0yMzEwICgyNTUgbGluZXMgLSBleGFjdCBjb3B5LCBzcGxpdCBmb3IgcmVhZGFiaWxpdHkpXG4gICAqL1xuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgcmV0dXJuIGRlbGV0ZUVsZW1lbnRDb21tYW5kKHRoaXMuZ2V0Q29udGV4dCgpLCBhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcbiAgICAvLyBJc3N1ZSAjNTAxOiBHdWFyZCBhZ2FpbnN0IG51bGwvdW5kZWZpbmVkIHRvIG1hdGNoIHNoYXJlZCB1dGlsaXR5IHBhdHRlcm5cbiAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYSB2YWxpZCBFbGVtZW50VHlwZSB2YWx1ZSwgcmV0dXJuIGFzLWlzXG4gICAgaWYgKE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugc2hhcmVkIG5vcm1hbGl6YXRpb24gbWFwIChJc3N1ZSAjNDMzKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBFTEVNRU5UX1RZUEVfTUFQW3R5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICAvLyBVbmtub3duIHR5cGUgLSByZXR1cm4gYXMtaXMgYW5kIGxldCB2YWxpZGF0aW9uIGhhbmRsZSBpdFxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IHN0cmluZywgb3B0aW9ucz86IGltcG9ydCgnLi4vc2VydmljZXMvcXVlcnkvdHlwZXMuanMnKS5RdWVyeU9wdGlvbnMpIHtcbiAgICByZXR1cm4gbGlzdEVsZW1lbnRzQ29tbWFuZCh0aGlzLmdldENvbnRleHQoKSwgdHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBlbGVtZW50cyBhcnJheSBmb3IgYSBnaXZlbiB0eXBlLlxuICAgKiBVbmxpa2UgbGlzdEVsZW1lbnRzIHdoaWNoIHJldHVybnMgTUNQUmVzcG9uc2UgZm9ybWF0LCB0aGlzIHJldHVybnMgcmF3IGVsZW1lbnQgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBFbGVtZW50IHR5cGUgKHBlcnNvbmEsIHNraWxsLCB0ZW1wbGF0ZSwgYWdlbnQsIG1lbW9yeSwgZW5zZW1ibGUpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHJhdyBlbGVtZW50IG9iamVjdHNcbiAgICovXG4gIGFzeW5jIGdldEVsZW1lbnRzKHR5cGU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcblxuICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICByZXR1cm4gdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeU1hbmFnZXIubGlzdCgpO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5FTlNFTUJMRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9BQ1RJVkFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRDUlVESGFuZGxlci5hY3RpdmF0ZUVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRWxlbWVudCBhY3RpdmF0aW9uIHJlcXVlc3RlZDogJHt0eXBlfS8ke25hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGVsZW1lbnROYW1lOiBuYW1lLCBjb250ZXh0UHJvdmlkZWQ6ICEhY29udGV4dCB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmFjdGl2YXRlKG5hbWUsIGNvbnRleHQpO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlQWN0aXZlUG9saWN5U25hcHNob3QoKTtcblxuICAgICAgLy8gSXNzdWUgIzU5ODogUGVyc2lzdCBhY3RpdmF0aW9uIHN0YXRlIGZvciBzZXNzaW9uIHJlc3RvcmVcbiAgICAgIGlmICh0aGlzLmFjdGl2YXRpb25TdG9yZSkge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGF3YWl0IHRoaXMuZ2V0U3RhYmxlQWN0aXZhdGlvbkZpbGVuYW1lKG5vcm1hbGl6ZWRUeXBlLCBuYW1lKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uU3RvcmUucmVjb3JkQWN0aXZhdGlvbihub3JtYWxpemVkVHlwZSwgbmFtZSwgZmlsZW5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNzYyOiBFeHBvcnQgcG9saWNpZXMgdG8gYnJpZGdlIGFmdGVyIGFjdGl2YXRpb25cbiAgICAgIHRoaXMucG9saWN5RXhwb3J0U2VydmljZT8uZXhwb3J0UG9saWNpZXMoKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGFjdGl2YXRlIGVsZW1lbnQ6YCwgeyB0eXBlLCBuYW1lLCBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRBY3RpdmVFbGVtZW50cyh0eXBlPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIElzc3VlICM1MDE6IFdoZW4gdHlwZSBpcyBvbWl0dGVkLCBhZ2dyZWdhdGUgYWN0aXZlIGVsZW1lbnRzIGFjcm9zcyBhbGwgdHlwZXNcbiAgICAgIGlmICghdHlwZSB8fCB0eXBlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWdncmVnYXRlQWN0aXZlRWxlbWVudHMoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KG5vcm1hbGl6ZWRUeXBlKTtcblxuICAgICAgaWYgKCFzdHJhdGVneSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBzdHJhdGVneS5nZXRBY3RpdmVFbGVtZW50cygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBnZXQgYWN0aXZlIGVsZW1lbnRzOmAsIHsgdHlwZSwgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGdldCBhY3RpdmUgJHt0eXBlIHx8ICdhbGwnfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmF3IGFjdGl2ZSBlbGVtZW50cyBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZXZhbHVhdGlvbi5cbiAgICogUmV0dXJucyBhY3RpdmUgcGVyc29uYXMsIHNraWxscywgYW5kIGVuc2VtYmxlcyB3aXRoIHRoZWlyIG1ldGFkYXRhXG4gICAqIG1hcHBlZCB0byB0aGUgc2hhcGUgZXhwZWN0ZWQgYnkgdGhlIEdhdGVrZWVwZXIncyBBY3RpdmVFbGVtZW50IGludGVyZmFjZS5cbiAgICpcbiAgICogSXNzdWUgIzQ1MjogUHJvdmlkZXMgYWN0aXZlIGVsZW1lbnQgY29udGV4dCBmb3IgZW5mb3JjZSgpIHBvbGljeSBjaGVja3MuXG4gICAqL1xuICBhc3luYyBnZXRBY3RpdmVFbGVtZW50c0ZvclBvbGljeShvcHRpb25zOiB7IGFsbG93Q29hbGVzY2luZz86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTxQb2xpY3lFbGVtZW50W10+IHtcbiAgICAvLyBTZWN1cml0eSBlbmZvcmNlbWVudCBtdXN0IG5vdCBqb2luIGEgc25hcHNob3QgdGhhdCBtYXkgaGF2ZSBzdGFydGVkXG4gICAgLy8gYmVmb3JlIGFuIGV4dGVybmFsIHBvbGljeS1maWxlIGVkaXQuIERhc2hib2FyZC9yZXBvcnRpbmcgY2FsbGVycyBtYXlcbiAgICAvLyBjb2FsZXNjZSBvdmVybGFwcGluZyByZWFkcyB0byBib3VuZCBwb2xsaW5nIHdvcmsuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dDb2FsZXNjaW5nID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KHsgZnJlc2hBZnRlckluRmxpZ2h0OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLmFjdGl2ZVBvbGljeVNuYXBzaG90R2VuZXJhdGlvbjtcbiAgICBpZiAodGhpcy5hY3RpdmVQb2xpY3lTbmFwc2hvdEluRmxpZ2h0Py5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVQb2xpY3lTbmFwc2hvdEluRmxpZ2h0LnByb21pc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmNvbGxlY3RBY3RpdmVFbGVtZW50c0ZvclBvbGljeSgpO1xuICAgIGNvbnN0IGluRmxpZ2h0ID0geyBnZW5lcmF0aW9uLCBwcm9taXNlOiBzbmFwc2hvdCB9O1xuICAgIHRoaXMuYWN0aXZlUG9saWN5U25hcHNob3RJbkZsaWdodCA9IGluRmxpZ2h0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBzbmFwc2hvdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlUG9saWN5U25hcHNob3RJbkZsaWdodCA9PT0gaW5GbGlnaHQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQb2xpY3lTbmFwc2hvdEluRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29sbGVjdEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KFxuICAgIGluZGV4T3B0aW9uczogUG9saWN5SW5kZXhPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8UG9saWN5RWxlbWVudFtdPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBQb2xpY3lFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0aGlzLmFwcGVuZEFjdGl2ZVBlcnNvbmFzKHJlc3VsdCwgc2Vlbik7XG4gICAgYXdhaXQgdGhpcy5hcHBlbmRBY3RpdmVTa2lsbHMocmVzdWx0LCBzZWVuKTtcbiAgICBhd2FpdCB0aGlzLmFwcGVuZEFjdGl2ZUFnZW50cyhyZXN1bHQsIHNlZW4sIGluZGV4T3B0aW9ucyk7XG4gICAgYXdhaXQgdGhpcy5hcHBlbmRBY3RpdmVFbnNlbWJsZXMocmVzdWx0LCBzZWVuLCBpbmRleE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXBwZW5kQWN0aXZlUGVyc29uYXMocmVzdWx0OiBQb2xpY3lFbGVtZW50W10sIHNlZW46IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgcGVyc29uYSBvZiB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmFzKCkpIHtcbiAgICAgICAgc2Vlbi5hZGQodGhpcy5wb2xpY3lFbGVtZW50S2V5KCdwZXJzb25hJywgcGVyc29uYS5tZXRhZGF0YS5uYW1lKSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAncGVyc29uYScsXG4gICAgICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBwZXJzb25hLm1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdhdGhlciBhY3RpdmUgcGVyc29uYXMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFwcGVuZEFjdGl2ZVNraWxscyhyZXN1bHQ6IFBvbGljeUVsZW1lbnRbXSwgc2VlbjogU2V0PHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBza2lsbCBvZiBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5nZXRBY3RpdmVTa2lsbHMoKSkge1xuICAgICAgICBzZWVuLmFkZCh0aGlzLnBvbGljeUVsZW1lbnRLZXkoJ3NraWxsJywgc2tpbGwubWV0YWRhdGEubmFtZSkpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3NraWxsJyxcbiAgICAgICAgICBuYW1lOiBza2lsbC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBza2lsbC5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIHNraWxscyBmb3IgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXBwZW5kQWN0aXZlQWdlbnRzKFxuICAgIHJlc3VsdDogUG9saWN5RWxlbWVudFtdLFxuICAgIHNlZW46IFNldDxzdHJpbmc+LFxuICAgIGluZGV4T3B0aW9uczogUG9saWN5SW5kZXhPcHRpb25zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBhZ2VudCBvZiBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBY3RpdmVBZ2VudHMoaW5kZXhPcHRpb25zKSkge1xuICAgICAgICBzZWVuLmFkZCh0aGlzLnBvbGljeUVsZW1lbnRLZXkoJ2FnZW50JywgYWdlbnQubWV0YWRhdGEubmFtZSkpO1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IChhZ2VudCBhcyB0eXBlb2YgYWdlbnQgJiB7IGZpbGVuYW1lPzogdW5rbm93biB9KS5maWxlbmFtZTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhZ2VudCcsXG4gICAgICAgICAgbmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogYWdlbnQubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAuLi4odHlwZW9mIGZpbGVuYW1lID09PSAnc3RyaW5nJyAmJiBmaWxlbmFtZS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICA/IHsgaWRlbnRpdHk6IGZpbGVuYW1lIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnYXRoZXIgYWN0aXZlIGFnZW50cyBmb3IgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXBwZW5kQWN0aXZlRW5zZW1ibGVzKFxuICAgIHJlc3VsdDogUG9saWN5RWxlbWVudFtdLFxuICAgIHNlZW46IFNldDxzdHJpbmc+LFxuICAgIGluZGV4T3B0aW9uczogUG9saWN5SW5kZXhPcHRpb25zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW5zZW1ibGVzID0gYXdhaXQgdGhpcy5lbnNlbWJsZU1hbmFnZXIuZ2V0QWN0aXZlRW5zZW1ibGVzKCk7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5hcHBlbmRFbnNlbWJsZXNBbmRDb2xsZWN0TWVtYmVycyhlbnNlbWJsZXMsIHJlc3VsdCwgc2Vlbik7XG4gICAgICBjb25zdCByZXNvbHZlZE1lbWJlcnMgPSBhd2FpdCB0aGlzLnJlc29sdmVQb2xpY3lNZW1iZXJzKGNhbmRpZGF0ZXMsIGluZGV4T3B0aW9ucyk7XG4gICAgICB0aGlzLmFwcGVuZFJlc29sdmVkUG9saWN5TWVtYmVycyhyZXNvbHZlZE1lbWJlcnMsIHJlc3VsdCwgc2Vlbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIGFjdGl2ZSBlbnNlbWJsZXMgZm9yIHBvbGljeSBldmFsdWF0aW9uJywgeyBlcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZEVuc2VtYmxlc0FuZENvbGxlY3RNZW1iZXJzKFxuICAgIGVuc2VtYmxlczogQXdhaXRlZDxSZXR1cm5UeXBlPEVuc2VtYmxlTWFuYWdlclsnZ2V0QWN0aXZlRW5zZW1ibGVzJ10+PixcbiAgICByZXN1bHQ6IFBvbGljeUVsZW1lbnRbXSxcbiAgICBzZWVuOiBTZXQ8c3RyaW5nPixcbiAgKTogUG9saWN5TWVtYmVyQ2FuZGlkYXRlW10ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXM6IFBvbGljeU1lbWJlckNhbmRpZGF0ZVtdID0gW107XG4gICAgY29uc3QgcXVldWVkTWVtYmVyS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBlbnNlbWJsZSBvZiBlbnNlbWJsZXMpIHtcbiAgICAgIHNlZW4uYWRkKHRoaXMucG9saWN5RWxlbWVudEtleSgnZW5zZW1ibGUnLCBlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKSk7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIHR5cGU6ICdlbnNlbWJsZScsXG4gICAgICAgIG5hbWU6IGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiBlbnNlbWJsZS5tZXRhZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1lbWJlcnMgPSAoZW5zZW1ibGUubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LmVsZW1lbnRzIGFzXG4gICAgICAgIEFycmF5PHsgZWxlbWVudF9uYW1lOiBzdHJpbmc7IGVsZW1lbnRfdHlwZTogc3RyaW5nIH0+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1lbWJlcnMpKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUobWVtYmVyLmVsZW1lbnRfdHlwZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShtZW1iZXIuZWxlbWVudF9uYW1lKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSAnJyB8fCBub3JtYWxpemVkTmFtZSA9PT0gJycpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMucG9saWN5RWxlbWVudEtleShub3JtYWxpemVkVHlwZSwgbm9ybWFsaXplZE5hbWUpO1xuICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSB8fCBxdWV1ZWRNZW1iZXJLZXlzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgcXVldWVkTWVtYmVyS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHsgdHlwZTogbm9ybWFsaXplZFR5cGUsIG5hbWU6IG5vcm1hbGl6ZWROYW1lLCBrZXkgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVQb2xpY3lNZW1iZXJzKFxuICAgIGNhbmRpZGF0ZXM6IFBvbGljeU1lbWJlckNhbmRpZGF0ZVtdLFxuICAgIGluZGV4T3B0aW9uczogUG9saWN5SW5kZXhPcHRpb25zLFxuICApOiBQcm9taXNlPEFycmF5PFBvbGljeUVsZW1lbnQgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRNZW1iZXJzID0gbmV3IEFycmF5PFBvbGljeUVsZW1lbnQgfCB1bmRlZmluZWQ+KGNhbmRpZGF0ZXMubGVuZ3RoKTtcbiAgICBjb25zdCBpbmRleGVkTWFuYWdlcnM6IEluZGV4ZWRQb2xpY3lNYW5hZ2VycyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBtZW1iZXJMb29rdXBzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UG9saWN5TWVtYmVyRWxlbWVudCB8IHVuZGVmaW5lZD4+KCk7XG4gICAgbGV0IG5leHRDYW5kaWRhdGVJbmRleCA9IDA7XG5cbiAgICBjb25zdCByZXNvbHZlTmV4dE1lbWJlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIC8vIFRoZSBpbmNyZW1lbnQgaXMgc3luY2hyb25vdXMgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdCwgc28gZWFjaCB3b3JrZXJcbiAgICAgIC8vIGNsYWltcyBhIHVuaXF1ZSBjYW5kaWRhdGUgd2hpbGUgcHJlc2VydmluZyBkZXRlcm1pbmlzdGljIHJlc3VsdCBzbG90cy5cbiAgICAgIHdoaWxlIChuZXh0Q2FuZGlkYXRlSW5kZXggPCBjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVJbmRleCA9IG5leHRDYW5kaWRhdGVJbmRleCsrO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBjYW5kaWRhdGVzW2NhbmRpZGF0ZUluZGV4XTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMuZmluZFBvbGljeU1lbWJlcihcbiAgICAgICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgICAgIGluZGV4ZWRNYW5hZ2VycyxcbiAgICAgICAgICAgIG1lbWJlckxvb2t1cHMsXG4gICAgICAgICAgICBpbmRleE9wdGlvbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZm91bmQ/Lm1ldGFkYXRhPy5bJ2dhdGVrZWVwZXInXSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRNZW1iZXJzW2NhbmRpZGF0ZUluZGV4XSA9IHtcbiAgICAgICAgICAgICAgdHlwZTogdGhpcy50b1BvbGljeUVsZW1lbnRUeXBlKGNhbmRpZGF0ZS50eXBlKSxcbiAgICAgICAgICAgICAgbmFtZTogY2FuZGlkYXRlLm5hbWUsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiBmb3VuZC5tZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBOb24tZmF0YWw6IHNraXAgbWVtYmVyIGlmIGVsZW1lbnQgdHlwZSBsb29rdXAgZmFpbHMuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgd29ya2VyQ291bnQgPSBNYXRoLm1pbihBQ1RJVkVfUE9MSUNZX01FTUJFUl9MT09LVVBfQ09OQ1VSUkVOQ1ksIGNhbmRpZGF0ZXMubGVuZ3RoKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiB3b3JrZXJDb3VudCB9LCAoKSA9PiByZXNvbHZlTmV4dE1lbWJlcigpKSk7XG4gICAgcmV0dXJuIHJlc29sdmVkTWVtYmVycztcbiAgfVxuXG4gIHByaXZhdGUgYXBwZW5kUmVzb2x2ZWRQb2xpY3lNZW1iZXJzKFxuICAgIHJlc29sdmVkTWVtYmVyczogQXJyYXk8UG9saWN5RWxlbWVudCB8IHVuZGVmaW5lZD4sXG4gICAgcmVzdWx0OiBQb2xpY3lFbGVtZW50W10sXG4gICAgc2VlbjogU2V0PHN0cmluZz4sXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZWQgb2YgcmVzb2x2ZWRNZW1iZXJzKSB7XG4gICAgICBpZiAoIXJlc29sdmVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMucG9saWN5RWxlbWVudEtleShyZXNvbHZlZC50eXBlLCByZXNvbHZlZC5uYW1lKTtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXN1bHQucHVzaChyZXNvbHZlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUG9saWN5TWVtYmVyKFxuICAgIGNhbmRpZGF0ZTogUG9saWN5TWVtYmVyQ2FuZGlkYXRlLFxuICAgIGluZGV4ZWRNYW5hZ2VyczogSW5kZXhlZFBvbGljeU1hbmFnZXJzLFxuICAgIG1lbWJlckxvb2t1cHM6IE1hcDxzdHJpbmcsIFByb21pc2U8UG9saWN5TWVtYmVyRWxlbWVudCB8IHVuZGVmaW5lZD4+LFxuICAgIGluZGV4T3B0aW9uczogUG9saWN5SW5kZXhPcHRpb25zLFxuICApOiBQcm9taXNlPFBvbGljeU1lbWJlckVsZW1lbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IG1lbWJlckxvb2t1cHMuZ2V0KGNhbmRpZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXG4gICAgY29uc3QgbG9va3VwID0gdGhpcy5nZXRJbmRleGVkUG9saWN5TWFuYWdlcihcbiAgICAgIGNhbmRpZGF0ZS50eXBlLFxuICAgICAgaW5kZXhlZE1hbmFnZXJzLFxuICAgICAgaW5kZXhPcHRpb25zLFxuICAgICkudGhlbihhc3luYyAobWFuYWdlcikgPT4gbWFuYWdlclxuICAgICAgPyBtYW5hZ2VyLmZpbmRCeU5hbWUoY2FuZGlkYXRlLm5hbWUpIGFzIFByb21pc2U8UG9saWN5TWVtYmVyRWxlbWVudCB8IHVuZGVmaW5lZD5cbiAgICAgIDogdW5kZWZpbmVkKTtcbiAgICBtZW1iZXJMb29rdXBzLnNldChjYW5kaWRhdGUua2V5LCBsb29rdXApO1xuICAgIHJldHVybiBsb29rdXA7XG4gIH1cblxuICBwcml2YXRlIGdldEluZGV4ZWRQb2xpY3lNYW5hZ2VyKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBpbmRleGVkTWFuYWdlcnM6IEluZGV4ZWRQb2xpY3lNYW5hZ2VycyxcbiAgICBpbmRleE9wdGlvbnM6IFBvbGljeUluZGV4T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxCYXNlRWxlbWVudE1hbmFnZXI8YW55PiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGluZGV4ZWRNYW5hZ2Vycy5nZXQobm9ybWFsaXplZFR5cGUpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuZ2V0TWFuYWdlckZvclR5cGUobm9ybWFsaXplZFR5cGUpO1xuICAgIGNvbnN0IGluZGV4ZWQgPSBtYW5hZ2VyXG4gICAgICA/IG1hbmFnZXIucmVmcmVzaEluZGV4KGluZGV4T3B0aW9ucykudGhlbigoKSA9PiBtYW5hZ2VyKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBpbmRleGVkTWFuYWdlcnMuc2V0KG5vcm1hbGl6ZWRUeXBlLCBpbmRleGVkKTtcbiAgICByZXR1cm4gaW5kZXhlZDtcbiAgfVxuXG4gIGFzeW5jIGdldFBvbGljeUVsZW1lbnRzRm9yUmVwb3J0KFxuICAgIHNlc3Npb25JZD86IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGFsbG93Q29hbGVzY2luZz86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBQcm9taXNlPEFycmF5PHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBzZXNzaW9uSWRzPzogc3RyaW5nW107XG4gIH0+PiB7XG4gICAgY29uc3QgbWVyZ2VkID0gbmV3IE1hcDxzdHJpbmcsIHtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHNlc3Npb25JZHM6IFNldDxzdHJpbmc+O1xuICAgIH0+KCk7XG5cbiAgICBjb25zdCBhZGRFbGVtZW50ID0gKFxuICAgICAgZWxlbWVudDogUG9saWN5RWxlbWVudCxcbiAgICAgIHNlc3Npb25JZHM6IHN0cmluZ1tdID0gW10sXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuaGFzR2F0ZWtlZXBlclBvbGljeShlbGVtZW50Lm1ldGFkYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IGAke2VsZW1lbnQudHlwZX06JHtlbGVtZW50LmlkZW50aXR5ID8/IGVsZW1lbnQubmFtZX1gO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtZXJnZWQuZ2V0KGtleSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgc2Vzc2lvbklkcy5mb3JFYWNoKGlkID0+IGV4aXN0aW5nLnNlc3Npb25JZHMuYWRkKGlkKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbWVyZ2VkLnNldChrZXksIHtcbiAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgICBzZXNzaW9uSWRzOiBuZXcgU2V0KHNlc3Npb25JZHMpLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uSWQgPSB0aGlzLmFjdGl2YXRpb25TdG9yZT8uZ2V0U2Vzc2lvbklkKCk7XG4gICAgY29uc3QgaW5jbHVkZUN1cnJlbnRTZXNzaW9uID0gIXNlc3Npb25JZCB8fCAhY3VycmVudFNlc3Npb25JZCB8fCBjdXJyZW50U2Vzc2lvbklkID09PSBzZXNzaW9uSWQ7XG4gICAgY29uc3QgaW5kZXhPcHRpb25zID0gb3B0aW9ucy5hbGxvd0NvYWxlc2NpbmcgPT09IGZhbHNlXG4gICAgICA/IHsgZnJlc2hBZnRlckluRmxpZ2h0OiB0cnVlIH1cbiAgICAgIDoge307XG5cbiAgICBpZiAoaW5jbHVkZUN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZUVsZW1lbnQgb2YgYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50c0ZvclBvbGljeShvcHRpb25zKSkge1xuICAgICAgICBhZGRFbGVtZW50KGFjdGl2ZUVsZW1lbnQsIGN1cnJlbnRTZXNzaW9uSWQgPyBbY3VycmVudFNlc3Npb25JZF0gOiBbXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZhdGlvblN0b3JlPy5pc0VuYWJsZWQoKSkge1xuICAgICAgY29uc3QgcGVyc2lzdGVkU3RhdGVzID0gYXdhaXQgdGhpcy5hY3RpdmF0aW9uU3RvcmUubGlzdFBlcnNpc3RlZEFjdGl2YXRpb25TdGF0ZXMoc2Vzc2lvbklkKTtcbiAgICAgIGNvbnN0IGluZGV4ZWRNYW5hZ2VyczogSW5kZXhlZFBvbGljeU1hbmFnZXJzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgcGVyc2lzdGVkTG9va3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFBvbGljeUVsZW1lbnQgfCBudWxsPj4oKTtcblxuICAgICAgY29uc3QgZmluZFBlcnNpc3RlZEVsZW1lbnQgPSAoXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgYWN0aXZhdGlvbjogUGVyc2lzdGVkQWN0aXZhdGlvbixcbiAgICAgICk6IFByb21pc2U8UG9saWN5RWxlbWVudCB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplTG9va3VwVmFsdWUoYWN0aXZhdGlvbi5uYW1lKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gdGhpcy5ub3JtYWxpemVMb29rdXBWYWx1ZShhY3RpdmF0aW9uLmZpbGVuYW1lKTtcbiAgICAgICAgY29uc3QgbG9va3VwS2V5ID0gYCR7bm9ybWFsaXplZFR5cGV9OiR7bm9ybWFsaXplZE5hbWV9OiR7bm9ybWFsaXplZEZpbGVuYW1lfWA7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGVyc2lzdGVkTG9va3Vwcy5nZXQobG9va3VwS2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9va3VwID0gdGhpcy5nZXRJbmRleGVkUG9saWN5TWFuYWdlcihcbiAgICAgICAgICBub3JtYWxpemVkVHlwZSxcbiAgICAgICAgICBpbmRleGVkTWFuYWdlcnMsXG4gICAgICAgICAgaW5kZXhPcHRpb25zLFxuICAgICAgICApLnRoZW4oYXN5bmMgKG1hbmFnZXIpID0+IHtcbiAgICAgICAgICBpZiAoIW1hbmFnZXIpIHJldHVybiBudWxsO1xuICAgICAgICAgIGxldCBmb3VuZCA9IG5vcm1hbGl6ZWRGaWxlbmFtZSAhPT0gJydcbiAgICAgICAgICAgID8gYXdhaXQgbWFuYWdlci5maW5kQnlGaWxlbmFtZShub3JtYWxpemVkRmlsZW5hbWUpIGFzIFBvbGljeU1lbWJlckVsZW1lbnQgfCB1bmRlZmluZWRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICghZm91bmQgJiYgbm9ybWFsaXplZE5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGF3YWl0IG1hbmFnZXIuZmluZEJ5TmFtZShub3JtYWxpemVkTmFtZSkgYXMgUG9saWN5TWVtYmVyRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWZvdW5kPy5tZXRhZGF0YSB8fCAhdGhpcy5oYXNHYXRla2VlcGVyUG9saWN5KGZvdW5kLm1ldGFkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudG9Qb2xpY3lFbGVtZW50VHlwZShub3JtYWxpemVkVHlwZSksXG4gICAgICAgICAgICBuYW1lOiAoZm91bmQubWV0YWRhdGFbJ25hbWUnXSBhcyBzdHJpbmcpID8/IGFjdGl2YXRpb24ubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBmb3VuZC5tZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLihub3JtYWxpemVkRmlsZW5hbWUgIT09ICcnID8geyBpZGVudGl0eTogbm9ybWFsaXplZEZpbGVuYW1lIH0gOiB7fSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBlcnNpc3RlZExvb2t1cHMuc2V0KGxvb2t1cEtleSwgbG9va3VwKTtcbiAgICAgICAgcmV0dXJuIGxvb2t1cDtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgcGVyc2lzdGVkU3RhdGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWVyZ2VQZXJzaXN0ZWRQb2xpY3lTdGF0ZShzdGF0ZSwgYWRkRWxlbWVudCwgZmluZFBlcnNpc3RlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZC52YWx1ZXMoKSkubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIHR5cGU6IGVudHJ5LnR5cGUsXG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgbWV0YWRhdGE6IGVudHJ5Lm1ldGFkYXRhLFxuICAgICAgLi4uKGVudHJ5LnNlc3Npb25JZHMuc2l6ZSA+IDBcbiAgICAgICAgPyB7IHNlc3Npb25JZHM6IEFycmF5LmZyb20oZW50cnkuc2Vzc2lvbklkcykuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSB9XG4gICAgICAgIDoge30pLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VEZWFkbG9jaygpOiBQcm9taXNlPHtcbiAgICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gICAgYWN0aXZlQmVmb3JlUmVzZXQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZGVhY3RpdmF0ZWQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZmFpbGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+O1xuICAgIHBlcnNpc3RlZFN0YXRlQ2xlYXJlZDogYm9vbGVhbjtcbiAgICBsaWtlbHlEZWFkbG9ja0NhdXNlOiB7XG4gICAgICBzYW5kYm94aW5nRWxlbWVudD86IHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIGFkdmlzb3J5RWxlbWVudHM6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgfTtcbiAgICBzbmFwc2hvdEZpbGU/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50cyA9IGF3YWl0IHRoaXMuY29sbGVjdEFjdGl2ZUVsZW1lbnRzRm9yRGVhZGxvY2tSZWxpZWYoKTtcbiAgICBjb25zdCBhY3RpdmVCZWZvcmVSZXNldCA9IGFjdGl2ZUVsZW1lbnRzLm1hcCgoeyB0eXBlLCBuYW1lIH0pID0+ICh7IHR5cGUsIG5hbWUgfSkpO1xuICAgIGNvbnN0IGFjdGl2ZVBvbGljeUVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50c0ZvclBvbGljeSgpO1xuICAgIGNvbnN0IHNhbmRib3hpbmdFbGVtZW50ID0gZmluZENvbmZpcm1EZW55aW5nRWxlbWVudChhY3RpdmVQb2xpY3lFbGVtZW50cyk7XG4gICAgY29uc3QgYWR2aXNvcnlFbGVtZW50cyA9IGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cyhhY3RpdmVQb2xpY3lFbGVtZW50cyk7XG4gICAgY29uc3QgZGVhY3RpdmF0ZWQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBjb25zdCBmYWlsZWQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBhY3RpdmVFbGVtZW50cykge1xuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZ2V0KGVsZW1lbnQudHlwZSk7XG4gICAgICBpZiAoIXN0cmF0ZWd5KSB7XG4gICAgICAgIGZhaWxlZC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lLFxuICAgICAgICAgIGVycm9yOiBgTm8gYWN0aXZhdGlvbiBzdHJhdGVneSByZWdpc3RlcmVkIGZvciB0eXBlICcke2VsZW1lbnQudHlwZX0nYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdHJhdGVneS5kZWFjdGl2YXRlKGVsZW1lbnQuZGVhY3RpdmF0aW9uSWRlbnRpZmllciA/PyBlbGVtZW50Lm5hbWUpO1xuICAgICAgICBkZWFjdGl2YXRlZC5wdXNoKHsgdHlwZTogZWxlbWVudC50eXBlLCBuYW1lOiBlbGVtZW50Lm5hbWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBmYWlsZWQucHVzaCh7XG4gICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQgPSBCb29sZWFuKHRoaXMuYWN0aXZhdGlvblN0b3JlPy5pc0VuYWJsZWQoKSk7XG4gICAgY29uc3Qgc25hcHNob3RGaWxlID0gYXdhaXQgdGhpcy53cml0ZURlYWRsb2NrUmVsaWVmU25hcHNob3Qoe1xuICAgICAgc2Vzc2lvbklkOiB0aGlzLmFjdGl2YXRpb25TdG9yZT8uZ2V0U2Vzc2lvbklkKCksXG4gICAgICBhY3RpdmVCZWZvcmVSZXNldCxcbiAgICAgIGRlYWN0aXZhdGVkLFxuICAgICAgZmFpbGVkLFxuICAgICAgbGlrZWx5RGVhZGxvY2tDYXVzZToge1xuICAgICAgICAuLi4oc2FuZGJveGluZ0VsZW1lbnQgPyB7IHNhbmRib3hpbmdFbGVtZW50IH0gOiB7fSksXG4gICAgICAgIGFkdmlzb3J5RWxlbWVudHMsXG4gICAgICB9LFxuICAgICAgcGVyc2lzdGVkU3RhdGVDbGVhcmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hY3RpdmF0aW9uU3RvcmU/LmNsZWFyQWxsKCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlQWN0aXZlUG9saWN5U25hcHNob3QoKTtcbiAgICB0aGlzLnBvbGljeUV4cG9ydFNlcnZpY2U/LmV4cG9ydFBvbGljaWVzKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgY29uc3QgZmFpbHVyZVN1bW1hcnkgPSBmYWlsZWQubGVuZ3RoID4gMCA/IGAgd2l0aCAke2ZhaWxlZC5sZW5ndGh9IGZhaWx1cmUocylgIDogJyc7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9ERUFDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogZmFpbGVkLmxlbmd0aCA+IDAgPyAnTUVESVVNJyA6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRWxlbWVudENSVURIYW5kbGVyLnJlbGVhc2VEZWFkbG9jaycsXG4gICAgICBkZXRhaWxzOiBgRGVhZGxvY2sgcmVsaWVmIGRlYWN0aXZhdGVkICR7ZGVhY3RpdmF0ZWQubGVuZ3RofSBlbGVtZW50KHMpJHtmYWlsdXJlU3VtbWFyeX1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmFjdGl2YXRpb25TdG9yZT8uZ2V0U2Vzc2lvbklkKCksXG4gICAgICAgIGFjdGl2ZUJlZm9yZVJlc2V0LFxuICAgICAgICBkZWFjdGl2YXRlZCxcbiAgICAgICAgZmFpbGVkLFxuICAgICAgICBwZXJzaXN0ZWRTdGF0ZUNsZWFyZWQsXG4gICAgICAgIGxpa2VseURlYWRsb2NrQ2F1c2U6IHtcbiAgICAgICAgICAuLi4oc2FuZGJveGluZ0VsZW1lbnQgPyB7IHNhbmRib3hpbmdFbGVtZW50IH0gOiB7fSksXG4gICAgICAgICAgYWR2aXNvcnlFbGVtZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAgc25hcHNob3RGaWxlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5hY3RpdmF0aW9uU3RvcmU/LmdldFNlc3Npb25JZCgpXG4gICAgICAgID8geyBzZXNzaW9uSWQ6IHRoaXMuYWN0aXZhdGlvblN0b3JlLmdldFNlc3Npb25JZCgpIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBhY3RpdmVCZWZvcmVSZXNldCxcbiAgICAgIGRlYWN0aXZhdGVkLFxuICAgICAgZmFpbGVkLFxuICAgICAgcGVyc2lzdGVkU3RhdGVDbGVhcmVkLFxuICAgICAgbGlrZWx5RGVhZGxvY2tDYXVzZToge1xuICAgICAgICAuLi4oc2FuZGJveGluZ0VsZW1lbnQgPyB7IHNhbmRib3hpbmdFbGVtZW50IH0gOiB7fSksXG4gICAgICAgIGFkdmlzb3J5RWxlbWVudHMsXG4gICAgICB9LFxuICAgICAgLi4uKHNuYXBzaG90RmlsZSA/IHsgc25hcHNob3RGaWxlIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29sbGVjdEFjdGl2ZUVsZW1lbnRzRm9yRGVhZGxvY2tSZWxpZWYoKTogUHJvbWlzZTxEZWFkbG9ja1JlbGllZkVsZW1lbnRbXT4ge1xuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzOiBEZWFkbG9ja1JlbGllZkVsZW1lbnRbXSA9IFtdO1xuXG4gICAgY29uc3QgYWN0aXZlUGVyc29uYXMgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmFzKCk7XG4gICAgYWN0aXZlRWxlbWVudHMucHVzaCguLi5hY3RpdmVQZXJzb25hcy5tYXAoKHBlcnNvbmEpID0+ICh7XG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgIH0pKSk7XG5cbiAgICBjb25zdCBhY3RpdmVTa2lsbHMgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5nZXRBY3RpdmVTa2lsbHMoKTtcbiAgICBhY3RpdmVFbGVtZW50cy5wdXNoKC4uLmFjdGl2ZVNraWxscy5tYXAoKHNraWxsKSA9PiAoe1xuICAgICAgdHlwZTogRWxlbWVudFR5cGUuU0tJTEwsXG4gICAgICBuYW1lOiBza2lsbC5tZXRhZGF0YS5uYW1lLFxuICAgIH0pKSk7XG5cbiAgICBjb25zdCBhY3RpdmVBZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5nZXRBY3RpdmVBZ2VudHMoKTtcbiAgICBhY3RpdmVFbGVtZW50cy5wdXNoKC4uLmFjdGl2ZUFnZW50cy5tYXAoKGFnZW50KSA9PiB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IChhZ2VudCBhcyB0eXBlb2YgYWdlbnQgJiB7IGZpbGVuYW1lPzogdW5rbm93biB9KS5maWxlbmFtZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IEVsZW1lbnRUeXBlLkFHRU5ULFxuICAgICAgICBuYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAuLi4odHlwZW9mIGZpbGVuYW1lID09PSAnc3RyaW5nJyAmJiBmaWxlbmFtZS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyB7IGRlYWN0aXZhdGlvbklkZW50aWZpZXI6IGZpbGVuYW1lIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG4gICAgfSkpO1xuXG4gICAgY29uc3QgYWN0aXZlTWVtb3JpZXMgPSBhd2FpdCB0aGlzLm1lbW9yeU1hbmFnZXIuZ2V0QWN0aXZlTWVtb3JpZXMoKTtcbiAgICBhY3RpdmVFbGVtZW50cy5wdXNoKC4uLmFjdGl2ZU1lbW9yaWVzLm1hcCgobWVtb3J5KSA9PiAoe1xuICAgICAgdHlwZTogRWxlbWVudFR5cGUuTUVNT1JZLFxuICAgICAgbmFtZTogbWVtb3J5Lm1ldGFkYXRhLm5hbWUsXG4gICAgfSkpKTtcblxuICAgIGNvbnN0IGFjdGl2ZUVuc2VtYmxlcyA9IGF3YWl0IHRoaXMuZW5zZW1ibGVNYW5hZ2VyLmdldEFjdGl2ZUVuc2VtYmxlcygpO1xuICAgIGFjdGl2ZUVsZW1lbnRzLnB1c2goLi4uYWN0aXZlRW5zZW1ibGVzLm1hcCgoZW5zZW1ibGUpID0+ICh7XG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5FTlNFTUJMRSxcbiAgICAgIG5hbWU6IGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUsXG4gICAgfSkpKTtcblxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICByZXR1cm4gYWN0aXZlRWxlbWVudHMuZmlsdGVyKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtlbGVtZW50LnR5cGV9OiR7ZWxlbWVudC5kZWFjdGl2YXRpb25JZGVudGlmaWVyID8/IGVsZW1lbnQubmFtZX1gO1xuICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZURlYWRsb2NrUmVsaWVmU25hcHNob3Qoc25hcHNob3Q6IHtcbiAgICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gICAgYWN0aXZlQmVmb3JlUmVzZXQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZGVhY3RpdmF0ZWQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT47XG4gICAgZmFpbGVkOiBBcnJheTx7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+O1xuICAgIGxpa2VseURlYWRsb2NrQ2F1c2U6IHtcbiAgICAgIHNhbmRib3hpbmdFbGVtZW50PzogeyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9O1xuICAgICAgYWR2aXNvcnlFbGVtZW50czogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PjtcbiAgICB9O1xuICAgIHBlcnNpc3RlZFN0YXRlQ2xlYXJlZDogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc25hcHNob3REaXIgPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICdzdGF0ZScsICdkZWFkbG9jay1yZWxpZWYnKTtcbiAgICBjb25zdCBzYWZlU2Vzc2lvbklkID0gKHNuYXBzaG90LnNlc3Npb25JZCA/PyAnc2Vzc2lvbicpXG4gICAgICAucmVwbGFjZUFsbCgvW15hLXpBLVowLTlfLV0vZywgJy0nKVxuICAgICAgLnNsaWNlKDAsIDY0KTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZUFsbCgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IHNuYXBzaG90RmlsZSA9IHBhdGguam9pbihzbmFwc2hvdERpciwgYGRlYWRsb2NrLXJlbGllZi0ke3NhZmVTZXNzaW9uSWR9LSR7dGltZXN0YW1wfS5qc29uYCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3Rvcnkoc25hcHNob3REaXIpO1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoXG4gICAgICAgIHNuYXBzaG90RmlsZSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIC4uLnNuYXBzaG90LFxuICAgICAgICB9LCBudWxsLCAyKSxcbiAgICAgICAgeyBzb3VyY2U6ICdFbGVtZW50Q1JVREhhbmRsZXIucmVsZWFzZURlYWRsb2NrJyB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzbmFwc2hvdEZpbGU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gd3JpdGUgZGVhZGxvY2sgcmVsaWVmIHNuYXBzaG90Jywge1xuICAgICAgICBzbmFwc2hvdEZpbGUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBtZXJnZVBlcnNpc3RlZFBvbGljeVN0YXRlKFxuICAgIHN0YXRlOiBQZXJzaXN0ZWRBY3RpdmF0aW9uU3RhdGVTbmFwc2hvdCxcbiAgICBhZGRFbGVtZW50OiAoZWxlbWVudDogUG9saWN5RWxlbWVudCwgc2Vzc2lvbklkcz86IHN0cmluZ1tdKSA9PiB2b2lkLFxuICAgIGZpbmRQZXJzaXN0ZWRFbGVtZW50OiAodHlwZTogc3RyaW5nLCBhY3RpdmF0aW9uOiBQZXJzaXN0ZWRBY3RpdmF0aW9uKSA9PiBQcm9taXNlPFBvbGljeUVsZW1lbnQgfCBudWxsPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZzogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBhY3RpdmF0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGUuYWN0aXZhdGlvbnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2YXRpb24gb2YgYWN0aXZhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgcGVuZGluZy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kUGVyc2lzdGVkRWxlbWVudCh0eXBlLCBhY3RpdmF0aW9uKTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZm91bmQsIFtzdGF0ZS5zZXNzaW9uSWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwZW5kaW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U3RhYmxlQWN0aXZhdGlvbkZpbGVuYW1lKHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQSkge1xuICAgICAgcmV0dXJuIHRoaXMucGVyc29uYU1hbmFnZXIuZmluZFBlcnNvbmEobmFtZSk/LmZpbGVuYW1lO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFnZW50TWFuYWdlci5nZXRTdGFibGVBY3RpdmF0aW9uRmlsZW5hbWUobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBhc3luYyBkZWFjdGl2YXRlRWxlbWVudChuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFQUNUSVZBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdFbGVtZW50Q1JVREhhbmRsZXIuZGVhY3RpdmF0ZUVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRWxlbWVudCBkZWFjdGl2YXRpb24gcmVxdWVzdGVkOiAke3R5cGV9LyR7bmFtZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbGVtZW50VHlwZTogdHlwZSwgZWxlbWVudE5hbWU6IG5hbWUgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChub3JtYWxpemVkVHlwZSk7XG5cbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJhdGVneS5kZWFjdGl2YXRlKG5hbWUpO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlQWN0aXZlUG9saWN5U25hcHNob3QoKTtcblxuICAgICAgLy8gSXNzdWUgIzU5ODogUGVyc2lzdCBkZWFjdGl2YXRpb24gc3RhdGUgZm9yIHNlc3Npb24gcmVzdG9yZVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvblN0b3JlKSB7XG4gICAgICAgIC8vIEFnZW50IGRlYWN0aXZhdGlvbiByZXR1cm5zIHRoZSBleGFjdCBzdGFibGUgaWRlbnRpdHkgc2VsZWN0ZWQgYnkgaXRzXG4gICAgICAgIC8vIGZyZXNobmVzcyBzY2FuLiBPdGhlciBlbGVtZW50IHR5cGVzIHJlc29sdmUgZnJvbSB0aGVpciBsaXZlIGNhY2hlLlxuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHJlc3VsdC5zdGFibGVJZGVudGl0eVxuICAgICAgICAgID8/IGF3YWl0IHRoaXMuZ2V0U3RhYmxlQWN0aXZhdGlvbkZpbGVuYW1lKG5vcm1hbGl6ZWRUeXBlLCBuYW1lKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uU3RvcmUucmVjb3JkRGVhY3RpdmF0aW9uKG5vcm1hbGl6ZWRUeXBlLCBuYW1lLCBmaWxlbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM3NjI6IEV4cG9ydCBwb2xpY2llcyB0byBicmlkZ2UgYWZ0ZXIgZGVhY3RpdmF0aW9uXG4gICAgICB0aGlzLnBvbGljeUV4cG9ydFNlcnZpY2U/LmV4cG9ydFBvbGljaWVzKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICByZXR1cm4geyBjb250ZW50OiByZXN1bHQuY29udGVudCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciB0byBwcm9wYWdhdGUgdG8gTUNQLUFRTCBsYXllclxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG9wZXJhdGlvbnMgcmV0dXJuIHN1Y2Nlc3M9ZmFsc2UgaW5zdGVhZCBvZiBzdWNjZXNzPXRydWUgd2l0aCBlcnJvciB0ZXh0XG4gICAgICAvLyBJc3N1ZSAjMjc1OiBIYW5kbGVycyByZXR1cm4gc3VjY2Vzcz10cnVlIGZvciBtaXNzaW5nIGVsZW1lbnRzXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gQWxzbyByZS10aHJvdyB2YWxpZGF0aW9uIGVycm9ycyAoZS5nLiwgbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXJzKVxuICAgICAgLy8gc28gdGhleSByZXN1bHQgaW4gc3VjY2Vzcz1mYWxzZSBpbnN0ZWFkIG9mIHN1Y2Nlc3M9dHJ1ZSB3aXRoIGVycm9yIGNvbnRlbnRcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ3BhcmFtZXRlciBpcyByZXF1aXJlZCcpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZWFjdGl2YXRlIGVsZW1lbnQ6YCwgeyB0eXBlLCBuYW1lLCBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZGVhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBHZXQgdGhlIGVsZW1lbnQgbWFuYWdlciBmb3IgYSBub3JtYWxpemVkIHR5cGUuXG4gICAqIFVzZWQgdG8gY2hlY2sgaW52YWxpZCBlbGVtZW50IHJlY29yZHMgd2hlbiBhbiBlbGVtZW50IGlzIFwibm90IGZvdW5kXCIuXG4gICAqL1xuICBwcml2YXRlIGdldE1hbmFnZXJGb3JUeXBlKG5vcm1hbGl6ZWRUeXBlOiBzdHJpbmcpOiBCYXNlRWxlbWVudE1hbmFnZXI8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOiByZXR1cm4gdGhpcy5wZXJzb25hTWFuYWdlciBhcyB1bmtub3duIGFzIEJhc2VFbGVtZW50TWFuYWdlcjxhbnk+O1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDogcmV0dXJuIHRoaXMuc2tpbGxNYW5hZ2VyO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURTogcmV0dXJuIHRoaXMudGVtcGxhdGVNYW5hZ2VyO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDogcmV0dXJuIHRoaXMuYWdlbnRNYW5hZ2VyO1xuICAgICAgY2FzZSBFbGVtZW50VHlwZS5NRU1PUlk6IHJldHVybiB0aGlzLm1lbW9yeU1hbmFnZXI7XG4gICAgICBjYXNlIEVsZW1lbnRUeXBlLkVOU0VNQkxFOiByZXR1cm4gdGhpcy5lbnNlbWJsZU1hbmFnZXI7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEVsZW1lbnREZXRhaWxzKG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmdldChub3JtYWxpemVkVHlwZSk7XG5cbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgc3RyYXRlZ3kuZ2V0RWxlbWVudERldGFpbHMobmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElzc3VlICM3MDg6IFdoZW4gZWxlbWVudCBpcyBcIm5vdCBmb3VuZFwiLCBjaGVjayBpZiBpdCBhY3R1YWxseSBleGlzdHNcbiAgICAgIC8vIG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uLiBSZXR1cm4gYSBkaXN0aW5jdCBlcnJvciBpbiB0aGF0IGNhc2UuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmdldE1hbmFnZXJGb3JUeXBlKG5vcm1hbGl6ZWRUeXBlKTtcbiAgICAgICAgaWYgKG1hbmFnZXIgJiYgdHlwZW9mIG1hbmFnZXIuZ2V0SW52YWxpZEVsZW1lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zdCBpbnZhbGlkUmVjb3JkID0gbWFuYWdlci5nZXRJbnZhbGlkRWxlbWVudChuYW1lKTtcbiAgICAgICAgICBpZiAoaW52YWxpZFJlY29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFZhbGlkYXRpb25GYWlsZWRFcnJvcihcbiAgICAgICAgICAgICAgbm9ybWFsaXplZFR5cGUgYXMgRWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGludmFsaWRSZWNvcmQucmVhc29uLFxuICAgICAgICAgICAgICBpbnZhbGlkUmVjb3JkLmZpbGVQYXRoXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGVsZW1lbnQgZGV0YWlsczpgLCB7IHR5cGUsIG5hbWUsIGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBnZXQgJHt0eXBlfSBkZXRhaWxzIGZvciAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgdHlwZSBmcm9tIHRoZSBmaWxlc3lzdGVtXG4gICAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzOjYwOS02NzkgKGV4YWN0IGNvcHksIGFkYXB0ZWQgZm9yIGhhbmRsZXIgcGF0dGVybilcbiAgICovXG4gIGFzeW5jIHJlbG9hZEVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzb25hTWFuYWdlci5yZWxvYWRQZXJzb25hcygpO1xuXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHtcbiAgICAgICAgICB0aGlzLnNraWxsTWFuYWdlci5jbGVhckNhY2hlKCk7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHtza2lsbHMubGVuZ3RofSBza2lsbHMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgLy8gVGVtcGxhdGUgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHt0ZW1wbGF0ZXMubGVuZ3RofSB0ZW1wbGF0ZXMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgLy8gQWdlbnQgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHthZ2VudHMubGVuZ3RofSBhZ2VudHMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLk1FTU9SWToge1xuICAgICAgICAgIC8vIE1lbW9yeSBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCBtZW1vcmllcyA9IGF3YWl0IHRoaXMubWVtb3J5TWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke21lbW9yaWVzLmxlbmd0aH0gbWVtb3JpZXMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkVOU0VNQkxFOiB7XG4gICAgICAgICAgLy8gRW5zZW1ibGUgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgZW5zZW1ibGVzID0gYXdhaXQgdGhpcy5lbnNlbWJsZU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHtlbnNlbWJsZXMubGVuZ3RofSBlbnNlbWJsZXMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVsb2FkICR7dHlwZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGEgdGVtcGxhdGUgd2l0aCB2YXJpYWJsZXNcbiAgICogRXh0cmFjdGVkIGZyb20gaW5kZXgudHM6NjgyLTcwMSAoZXhhY3QgY29weSlcbiAgICpcbiAgICogQHRocm93cyB7RWxlbWVudE5vdEZvdW5kRXJyb3J9IFdoZW4gdGVtcGxhdGUgZG9lcyBub3QgZXhpc3RcbiAgICogQHNlZSBJc3N1ZSAjMjc1IC0gSGFuZGxlcnMgcmV0dXJuIHN1Y2Nlc3M9dHJ1ZSBmb3IgbWlzc2luZyBlbGVtZW50c1xuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGUobmFtZTogc3RyaW5nLCB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAvLyBVc2UgdGhlIG5ldyBUZW1wbGF0ZVJlbmRlcmVyIHV0aWxpdHkgZm9yIGNsZWFuZXIgY29kZSBhbmQgYmV0dGVyIHZhbGlkYXRpb25cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRlbXBsYXRlUmVuZGVyZXIucmVuZGVyKG5hbWUsIHZhcmlhYmxlcyk7XG5cbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYPCfk4QgUmVuZGVyZWQgdGVtcGxhdGUgJyR7bmFtZX0nOlxcblxcbiR7cmVzdWx0LmNvbnRlbnR9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSXNzdWUgIzI3NTogVGhyb3cgZXJyb3IgZm9yIG1pc3NpbmcgdGVtcGxhdGVzIGluc3RlYWQgb2YgcmV0dXJuaW5nIGNvbnRlbnRcbiAgICAgIGlmIChyZXN1bHQuZXJyb3I/LmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ1RlbXBsYXRlJywgbmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgJHtyZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byByZW5kZXIgdGVtcGxhdGUnfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYW4gYWdlbnQgd2l0aCBnb2FsIHBhcmFtZXRlcnNcbiAgICogUmV0dXJucyBjb250ZXh0IGZvciBMTE0gdG8gZHJpdmUgdGhlIGFnZW50aWMgbG9vcFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50KG5hbWU6IHN0cmluZywgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5leGVjdXRlQWdlbnQobmFtZSwgcGFyYW1ldGVycyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudCAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBleGVjdXRlIGFnZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHN0ZXAgaW4gYWdlbnQgZXhlY3V0aW9uXG4gICAqL1xuICBhc3luYyByZWNvcmRBZ2VudFN0ZXAoYXJnczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHN0ZXBEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBmaW5kaW5ncz86IHN0cmluZztcbiAgICBjb25maWRlbmNlPzogbnVtYmVyO1xuICAgIG5leHRBY3Rpb25IaW50Pzogc3RyaW5nO1xuICAgIHJpc2tTY29yZT86IG51bWJlcjtcbiAgfSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5yZWNvcmRBZ2VudFN0ZXAoYXJncyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVjb3JkIGFnZW50IHN0ZXAgZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byByZWNvcmQgc3RlcDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBhbiBhZ2VudCBnb2FsXG4gICAqL1xuICBhc3luYyBjb21wbGV0ZUFnZW50R29hbChhcmdzOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkPzogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBzdW1tYXJ5OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuY29tcGxldGVBZ2VudEdvYWwoYXJncyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gUmUtdGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY29tcGxldGUgYWdlbnQgZ29hbCBmb3IgJyR7YXJncy5hZ2VudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGNvbXBsZXRlIGdvYWw6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFnZW50IHN0YXRlXG4gICAqL1xuICBhc3luYyBnZXRBZ2VudFN0YXRlKGFyZ3M6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBpbmNsdWRlRGVjaXNpb25IaXN0b3J5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlQ29udGV4dD86IGJvb2xlYW47XG4gIH0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZ2V0QWdlbnRTdGF0ZShhcmdzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBSZS10aHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBnZXQgYWdlbnQgc3RhdGUgZm9yICcke2FyZ3MuYWdlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBnZXQgc3RhdGU6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udGludWUgYWdlbnQgZXhlY3V0aW9uIGZyb20gcHJldmlvdXMgc3RhdGVcbiAgICovXG4gIGFzeW5jIGNvbnRpbnVlQWdlbnRFeGVjdXRpb24oYXJnczoge1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHByZXZpb3VzU3RlcFJlc3VsdD86IHN0cmluZztcbiAgfSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5jb250aW51ZUFnZW50RXhlY3V0aW9uKGFyZ3MpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFJlLXRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmb3IgJyR7YXJncy5hZ2VudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGUgYWN0aXZlIGVsZW1lbnRzIGFjcm9zcyBhbGwgcmVnaXN0ZXJlZCBlbGVtZW50IHR5cGVzLlxuICAgKiBJc3N1ZSAjNTAxOiBDYWxsZWQgd2hlbiBnZXRfYWN0aXZlX2VsZW1lbnRzIGlzIGludm9rZWQgd2l0aG91dCBlbGVtZW50X3R5cGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFnZ3JlZ2F0ZUFjdGl2ZUVsZW1lbnRzKCk6IFByb21pc2U8TUNQUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzZWN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2VsZW1lbnRUeXBlLCBzdHJhdGVneV0gb2YgdGhpcy5zdHJhdGVnaWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJhdGVneS5nZXRBY3RpdmVFbGVtZW50cygpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gcmVzdWx0LmNvbnRlbnRbMF0/LnRleHQ7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgc2VjdGlvbnMucHVzaChgWyR7ZWxlbWVudFR5cGV9XVxcbiR7dGV4dH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGdldCBhY3RpdmUgJHtlbGVtZW50VHlwZX0gZWxlbWVudHNgLCB7IGVycm9yOiBlcnIgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICB0ZXh0OiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBzZWN0aW9ucy5qb2luKCdcXG5cXG4nKVxuICAgICAgICAgIDogJ05vIGFjdGl2ZSBlbGVtZW50cyBmb3VuZC4nXG4gICAgICB9XVxuICAgIH07XG4gIH1cblxufVxuIl19
|