@dollhousemcp/mcp-server 2.0.39 → 2.0.40
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 +8 -0
- package/dist/cache/CollectionCache.d.ts +1 -0
- package/dist/cache/CollectionCache.d.ts.map +1 -1
- package/dist/cache/CollectionCache.js +7 -16
- package/dist/cache/CollectionIndexCache.d.ts +1 -1
- package/dist/cache/CollectionIndexCache.d.ts.map +1 -1
- package/dist/cache/CollectionIndexCache.js +3 -2
- package/dist/cache/cachePaths.d.ts +7 -0
- package/dist/cache/cachePaths.d.ts.map +1 -0
- package/dist/cache/cachePaths.js +15 -0
- package/dist/di/Container.js +2 -2
- package/dist/elements/agents/AgentManager.d.ts +121 -1
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +203 -31
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +4 -18
- package/dist/elements/memories/Memory.d.ts +7 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +68 -34
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +10 -2
- package/dist/elements/memories/memoryYamlValidation.d.ts +6 -0
- package/dist/elements/memories/memoryYamlValidation.d.ts.map +1 -0
- package/dist/elements/memories/memoryYamlValidation.js +25 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/CollectionHandler.d.ts.map +1 -1
- package/dist/handlers/CollectionHandler.js +2 -3
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +135 -71
- package/dist/handlers/mcp-aql/OperationSchema.js +4 -4
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.js +7 -5
- package/dist/portfolio/PortfolioManager.d.ts +5 -1
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +9 -3
- package/dist/security/contentValidator.d.ts +9 -1
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +24 -3
- package/dist/security/secureYamlParser.d.ts +3 -1
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +3 -3
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
- package/dist/security/validation/BackgroundValidator.js +6 -4
- package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
- package/dist/storage/MemoryMetadataExtractor.js +7 -2
- package/dist/utils/filesystem.d.ts +6 -0
- package/dist/utils/filesystem.d.ts.map +1 -1
- package/dist/utils/filesystem.js +22 -1
- package/package.json +9 -9
- package/server.json +2 -2
|
@@ -27,6 +27,7 @@ import { logger } from '../../utils/logger.js';
|
|
|
27
27
|
import DOMPurify from 'dompurify';
|
|
28
28
|
import { JSDOM } from 'jsdom';
|
|
29
29
|
import { LRUCache } from '../../cache/LRUCache.js';
|
|
30
|
+
import { ContentValidator } from '../../security/contentValidator.js';
|
|
30
31
|
/**
|
|
31
32
|
* Maximum length for individual trigger words used in Enhanced Index
|
|
32
33
|
* @constant {number}
|
|
@@ -493,47 +494,80 @@ export class Memory extends BaseElement {
|
|
|
493
494
|
const bTime = this.ensureDateObject(b.timestamp).getTime();
|
|
494
495
|
return bTime - aTime;
|
|
495
496
|
});
|
|
496
|
-
return sortedEntries.map(entry =>
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
}
|
|
497
|
+
return sortedEntries.map(entry => this.formatEntryForDisplay(entry)).join('\n\n');
|
|
498
|
+
}
|
|
499
|
+
formatEntryForDisplay(entry) {
|
|
500
|
+
// FIX #1069: Ensure timestamp is a Date object before calling toISOString.
|
|
501
|
+
const timestamp = this.ensureDateObject(entry.timestamp).toISOString();
|
|
502
|
+
const tags = entry.tags && entry.tags.length > 0 ? ` [${entry.tags.join(', ')}]` : '';
|
|
503
|
+
const trustLevel = entry.trustLevel || TRUST_LEVELS.UNTRUSTED;
|
|
504
|
+
const display = this.prepareEntryForDisplay(entry, trustLevel);
|
|
505
|
+
const trustIndicator = this.getTrustIndicator(display.effectiveTrustLevel);
|
|
506
|
+
return `[${timestamp}]${tags} ${trustIndicator}: ${display.content}`;
|
|
507
|
+
}
|
|
508
|
+
prepareEntryForDisplay(entry, trustLevel) {
|
|
509
|
+
if (trustLevel === TRUST_LEVELS.VALIDATED || trustLevel === TRUST_LEVELS.TRUSTED) {
|
|
510
|
+
return this.revalidateTrustedEntry(entry, trustLevel);
|
|
511
|
+
}
|
|
512
|
+
if (trustLevel === TRUST_LEVELS.UNTRUSTED) {
|
|
513
|
+
return {
|
|
514
|
+
content: this.sandboxUntrustedContent(entry.content, entry.source || 'unknown'),
|
|
515
|
+
effectiveTrustLevel: trustLevel,
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
if (trustLevel === TRUST_LEVELS.FLAGGED) {
|
|
519
|
+
return {
|
|
520
|
+
content: this.sandboxUntrustedContent(this.getSafeSanitizedContent(entry.sanitizedContent, entry.content, '[FLAGGED CONTENT REDACTED: sanitized representation unavailable]'), entry.source || 'unknown', 'FLAGGED: dangerous patterns removed'),
|
|
521
|
+
effectiveTrustLevel: trustLevel,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
return {
|
|
525
|
+
content: '[CONTENT QUARANTINED: Security threat detected]',
|
|
526
|
+
effectiveTrustLevel: trustLevel,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
revalidateTrustedEntry(entry, trustLevel) {
|
|
530
|
+
// Trust decisions can outlive the scanner rules that produced them. Revalidate
|
|
531
|
+
// before direct rendering so stale or manually assigned trust cannot bypass
|
|
532
|
+
// the current output boundary. This intentionally does not mutate history or
|
|
533
|
+
// block later appends; unsafe legacy content is sandboxed when it is consumed.
|
|
534
|
+
const currentValidation = ContentValidator.validateAndSanitizeYamlAware(entry.content, {
|
|
535
|
+
skipSizeCheck: true,
|
|
536
|
+
});
|
|
537
|
+
if (currentValidation.isValid) {
|
|
538
|
+
return { content: entry.content, effectiveTrustLevel: trustLevel };
|
|
539
|
+
}
|
|
540
|
+
const sanitizedContent = this.getSafeSanitizedContent(currentValidation.sanitizedContent, entry.content, '[TRUSTED CONTENT REDACTED: current validation failed]');
|
|
541
|
+
return {
|
|
542
|
+
content: this.sandboxUntrustedContent(sanitizedContent, entry.source || 'unknown', 'REVALIDATION FAILED: current scanner rules rejected trusted content'),
|
|
543
|
+
effectiveTrustLevel: TRUST_LEVELS.FLAGGED,
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
getSafeSanitizedContent(sanitizedContent, originalContent, fallback) {
|
|
547
|
+
return typeof sanitizedContent === 'string' &&
|
|
548
|
+
sanitizedContent.trim().length > 0 &&
|
|
549
|
+
sanitizedContent !== originalContent
|
|
550
|
+
? sanitizedContent
|
|
551
|
+
: fallback;
|
|
552
|
+
}
|
|
553
|
+
getTrustIndicator(trustLevel) {
|
|
554
|
+
if (trustLevel === TRUST_LEVELS.VALIDATED)
|
|
555
|
+
return '✓';
|
|
556
|
+
if (trustLevel === TRUST_LEVELS.TRUSTED)
|
|
557
|
+
return '✓✓';
|
|
558
|
+
if (trustLevel === TRUST_LEVELS.QUARANTINED)
|
|
559
|
+
return '⚠️';
|
|
560
|
+
return '⚠';
|
|
527
561
|
}
|
|
528
562
|
/**
|
|
529
563
|
* Sandbox untrusted content with clear delimiters
|
|
530
564
|
* FIX #1269: Prevents AI from interpreting user content as instructions
|
|
531
565
|
*/
|
|
532
|
-
sandboxUntrustedContent(content, source) {
|
|
566
|
+
sandboxUntrustedContent(content, source, status = 'NOT VALIDATED') {
|
|
533
567
|
return [
|
|
534
568
|
'┌─── UNTRUSTED CONTENT START ───┐',
|
|
535
569
|
`│ Source: ${source}`,
|
|
536
|
-
`│ Status:
|
|
570
|
+
`│ Status: ${status}`,
|
|
537
571
|
'├────────────────────────────────┤',
|
|
538
572
|
content.split('\n').map(line => `│ ${line}`).join('\n'),
|
|
539
573
|
'└─── UNTRUSTED CONTENT END ─────┘'
|
|
@@ -1133,4 +1167,4 @@ export class Memory extends BaseElement {
|
|
|
1133
1167
|
return true;
|
|
1134
1168
|
}
|
|
1135
1169
|
}
|
|
1136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVqRSwwRkFBMEY7QUFDMUYsaURBQWlEO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBZ0MsWUFBWSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCOzs7O0dBSUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLHFCQUFxQixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMs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R0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFVLEVBQUUsQ0FBQztnQkFDekQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtb3J5IEVsZW1lbnQgLSBQZXJzaXN0ZW50IGNvbnRleHQgc3RvcmFnZSBmb3IgY29udGludWl0eSBhbmQgbGVhcm5pbmdcbiAqIFxuICogUHJvdmlkZXMgbXVsdGlwbGUgc3RvcmFnZSBiYWNrZW5kcywgcmV0ZW50aW9uIHBvbGljaWVzLCBhbmQgc2VhcmNoIGNhcGFiaWxpdGllc1xuICogZm9yIG1haW50YWluaW5nIGNvbnRleHQgYWNyb3NzIHNlc3Npb25zIGFuZCBpbnRlcmFjdGlvbnMuXG4gKiBcbiAqIFNFQ1VSSVRZIE1FQVNVUkVTIElNUExFTUVOVEVEOlxuICogMS4gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgbWVtb3J5IGNvbnRlbnRcbiAqIDIuIE1lbW9yeSBzaXplIGxpbWl0cyB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAqIDMuIFBhdGggdmFsaWRhdGlvbiBmb3IgZmlsZS1iYXNlZCBzdG9yYWdlXG4gKiA0LiBSZXRlbnRpb24gcG9saWN5IGVuZm9yY2VtZW50XG4gKiA1LiBQcml2YWN5IGxldmVsIGFjY2VzcyBjb250cm9sXG4gKiA2LiBBdWRpdCBsb2dnaW5nIGZvciBhbGwgb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IEJhc2VFbGVtZW50LCBub3JtYWxpemVWZXJzaW9uIH0gZnJvbSAnLi4vQmFzZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnQsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0LCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG4vLyBGSVggIzEzMTU6IENvbnRlbnRWYWxpZGF0b3Igbm8gbG9uZ2VyIHVzZWQgaW4gYWRkRW50cnkgKG1vdmVkIHRvIGJhY2tncm91bmQgdmFsaWRhdGlvbilcbi8vIEltcG9ydCByZW1vdmVkIHRvIGNsZWFuIHVwIHVudXNlZCBkZXBlbmRlbmNpZXNcbmltcG9ydCB7IE1FTU9SWV9DT05TVEFOVFMsIE1FTU9SWV9TRUNVUklUWV9FVkVOVFMsIFByaXZhY3lMZXZlbCwgU3RvcmFnZUJhY2tlbmQsIFRSVVNUX0xFVkVMUywgVHJ1c3RMZXZlbCB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1lbW9yeVR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWVtb3J5SWQgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IE1lbW9yeVNlYXJjaEluZGV4LCBTZWFyY2hRdWVyeSwgU2VhcmNoSW5kZXhDb25maWcgfSBmcm9tICcuL01lbW9yeVNlYXJjaEluZGV4LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5pbXBvcnQgeyBKU0RPTSB9IGZyb20gJ2pzZG9tJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuXG4vKipcbiAqIE1heGltdW0gbGVuZ3RoIGZvciBpbmRpdmlkdWFsIHRyaWdnZXIgd29yZHMgdXNlZCBpbiBFbmhhbmNlZCBJbmRleFxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmNvbnN0IE1BWF9UUklHR0VSX0xFTkdUSCA9IDUwO1xuXG4vKipcbiAqIFZhbGlkYXRpb24gcGF0dGVybiBmb3IgdHJpZ2dlciB3b3Jkc1xuICogQWxsb3dzIGFscGhhbnVtZXJpYywgaHlwaGVucywgdW5kZXJzY29yZXMsIEAgKG1lbnRpb25zL2VtYWlscyksIC4gKGRvbWFpbnMpXG4gKiBAY29uc3RhbnQge1JlZ0V4cH1cbiAqL1xuY29uc3QgVFJJR0dFUl9WQUxJREFUSU9OX1JFR0VYID0gL15bYS16QS1aMC05XFwtX0AuXSskLztcblxuLy8gSW5pdGlhbGl6ZSBET01QdXJpZnkgd2l0aCBKU0RPTVxuY29uc3Qgd2luZG93ID0gbmV3IEpTRE9NKCcnKS53aW5kb3c7XG5jb25zdCBwdXJpZnkgPSBET01QdXJpZnkod2luZG93IGFzIGFueSk7XG5cbi8vIENvbmZpZ3VyZSBET01QdXJpZnkgZm9yIG1lbW9yeSBjb250ZW50IC0gc3RyaXAgYWxsIEhUTUwgYnV0IGtlZXAgdGV4dFxucHVyaWZ5LnNldENvbmZpZyh7XG4gIEFMTE9XRURfVEFHUzogW10sICAvLyBObyBIVE1MIHRhZ3MgYWxsb3dlZFxuICBBTExPV0VEX0FUVFI6IFtdLCAgLy8gTm8gYXR0cmlidXRlcyBhbGxvd2VkXG4gIEtFRVBfQ09OVEVOVDogdHJ1ZSAvLyBLZWVwIHRleHQgY29udGVudFxufSk7XG5cbi8qKlxuICogU2FuaXRpemUgY29udGVudCBmb3IgbWVtb3J5IHN0b3JhZ2VcbiAqIE1vcmUgcGVybWlzc2l2ZSB0aGFuIHNhbml0aXplSW5wdXQgLSBhbGxvd3MgcHVuY3R1YXRpb24sIHF1b3RlcywgZXRjLlxuICogYnV0IHN0aWxsIHByZXZlbnRzIFhTUyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50IHx8IHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBcbiAgLy8gRmlyc3Qgbm9ybWFsaXplIFVuaWNvZGVcbiAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbnRlbnQpLm5vcm1hbGl6ZWRDb250ZW50O1xuICBcbiAgLy8gVXNlIERPTVB1cmlmeSB0byBzdHJpcCBhbnkgSFRNTC9YU1MgYXR0ZW1wdHMgYnV0IGtlZXAgdGV4dFxuICBjb25zdCBjbGVhbmVkID0gcHVyaWZ5LnNhbml0aXplKG5vcm1hbGl6ZWQpO1xuICBcbiAgLy8gUmVtb3ZlIG9ubHkgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBudWxsIGJ5dGVzXG4gIHJldHVybiBjbGVhbmVkXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gSW50ZW50aW9uYWxseSByZW1vdmluZyBjb250cm9sIGNoYXJzIGV4Y2VwdCBcXHQgXFxuIFxcciBmb3Igc2FuaXRpemF0aW9uXG4gICAgLnJlcGxhY2VBbGwoL1tcXHUwMDAwLVxcdTAwMDhcXHUwMDBCXFx1MDAwQ1xcdTAwMEUtXFx1MDAxRlxcdTAwN0ZdL2csICcnKSAvLyBOT1NPTkFSXG4gICAgLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpXG4gICAgLnRyaW0oKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlNZXRhZGF0YSBleHRlbmRzIElFbGVtZW50TWV0YWRhdGEge1xuICBzdG9yYWdlQmFja2VuZD86IFN0b3JhZ2VCYWNrZW5kO1xuICByZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICBlbmNyeXB0aW9uRW5hYmxlZD86IGJvb2xlYW47XG4gIC8vIFNlYXJjaCBpbmRleCBjb25maWd1cmF0aW9uIChJc3N1ZSAjOTg0KVxuICBpbmRleFRocmVzaG9sZD86IG51bWJlcjtcbiAgZW5hYmxlQ29udGVudEluZGV4PzogYm9vbGVhbjtcbiAgbWF4VGVybXNQZXJFbnRyeT86IG51bWJlcjtcbiAgbWluVGVybUxlbmd0aD86IG51bWJlcjtcbiAgLy8gVHJpZ2dlciB3b3JkcyBmb3IgRW5oYW5jZWQgSW5kZXggKElzc3VlICMxMTI0KVxuICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAvLyBBdXRvLWxvYWQgY29uZmlndXJhdGlvbiAoSXNzdWUgIzE0MzApXG4gIGF1dG9Mb2FkPzogYm9vbGVhbjtcbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIC8vIE1lbW9yeSB0eXBlIGNsYXNzaWZpY2F0aW9uIGZvciBmb2xkZXIgb3JnYW5pemF0aW9uXG4gIG1lbW9yeVR5cGU/OiBNZW1vcnlUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeUVudHJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBEYXRlO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG4gIC8vIEZJWCAjMTI2OTogVHJ1c3QgbGV2ZWwgZm9yIGNvbnRlbnQgc2VjdXJpdHlcbiAgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7XG4gIC8vIFNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdHJ1c3QgZGVjaXNpb25zXG4gIHNvdXJjZT86IHN0cmluZzsgIC8vIGUuZy4sICd1c2VyJywgJ3dlYi1zY3JhcGUnLCAnYWdlbnQnLCAnYXBpJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVNlYXJjaE9wdGlvbnMge1xuICBxdWVyeT86IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdO1xuICBzdGFydERhdGU/OiBEYXRlO1xuICBlbmREYXRlPzogRGF0ZTtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHByaXZhY3lMZXZlbD86IFByaXZhY3lMZXZlbDtcbn1cblxuLyoqXG4gKiBNZW1vcnkgRWxlbWVudCBJbXBsZW1lbnRhdGlvblxuICpcbiAqIFRPRE86IE1lbW9yeSBTaGFyZGluZyBTdHJhdGVneSAoSXNzdWUgIzk4MSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ3VycmVudDogU2luZ2xlIE1hcDxpZCwgZW50cnk+IGZvciBhbGwgbWVtb3JpZXNcbiAqIFByb2JsZW06IExhcmdlIG1lbW9yeSBzZXRzICg+MTBLIGVudHJpZXMpIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gKlxuICogUGxhbm5lZCBTaGFyZGluZyBBcmNoaXRlY3R1cmU6XG4gKiAxLiBTaGFyZCBtZW1vcmllcyBhY3Jvc3MgbXVsdGlwbGUgZmlsZXMgYmFzZWQgb24gaGFzaChtZW1vcnlJZCkgJSBzaGFyZENvdW50XG4gKiAyLiBFYWNoIHNoYXJkIGZpbGUgPDI1NktCIGZvciBvcHRpbWFsIFlBTUwgcGFyc2luZ1xuICogMy4gTWVtb3J5IHJlZmVyZW5jZXMgc3RvcmVkIHNlcGFyYXRlbHkgZnJvbSBjb250ZW50IChsaWtlIGdpdCBvYmplY3RzKVxuICogNC4gTGFyZ2UgYmluYXJ5IGNvbnRlbnQgKFBERnMsIGltYWdlcykgc3RvcmVkIGFzIGV4dGVybmFsIHJlZmVyZW5jZXNcbiAqXG4gKiBCZW5lZml0czpcbiAqIC0gUGFyYWxsZWwgbG9hZGluZyBvZiBtZW1vcnkgc2hhcmRzXG4gKiAtIFJlZHVjZWQgbWVtb3J5IGZvb3RwcmludCAobG9hZCBvbmx5IG5lZWRlZCBzaGFyZHMpXG4gKiAtIEJldHRlciBjb3JydXB0aW9uIHJlc2lzdGFuY2UgKG9uZSBzaGFyZCBmYWlsdXJlIGRvZXNuJ3QgYWZmZWN0IG90aGVycylcbiAqIC0gRWZmaWNpZW50IGluY3JlbWVudGFsIHVwZGF0ZXNcbiAqXG4gKiBUT0RPOiBDb250ZW50IEludGVncml0eSBWZXJpZmljYXRpb24gKElzc3VlICM5ODIpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQWRkIFNIQS0yNTYgaGFzaGVzIHRvIGRldGVjdDpcbiAqIC0gQWNjaWRlbnRhbCBjb3JydXB0aW9uIGZyb20gZGlzayBlcnJvcnNcbiAqIC0gSW50ZW50aW9uYWwgdGFtcGVyaW5nIHdpdGggbWVtb3J5IGZpbGVzXG4gKiAtIFZlcnNpb24gY29uZmxpY3RzIGR1cmluZyBjb25jdXJyZW50IGFjY2Vzc1xuICpcbiAqIEltcGxlbWVudGF0aW9uOlxuICogLSBTdG9yZSBoYXNoIGluIG1lbW9yeSBtZXRhZGF0YVxuICogLSBWZXJpZnkgb24gbG9hZCwgd2FybiBvbiBtaXNtYXRjaFxuICogLSBPcHRpb24gdG8gYXV0by1yZXN0b3JlIGZyb20gYmFja3VwIG9uIGNvcnJ1cHRpb25cbiAqXG4gKiBUT0RPOiBNZW1vcnkgQ2FwYWNpdHkgTWFuYWdlbWVudCAoSXNzdWUgIzk4MylcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ3VycmVudDogU3luY2hyb25vdXMgcmV0ZW50aW9uIGVuZm9yY2VtZW50IG9uIGVhY2ggYWRkXG4gKiBCZXR0ZXI6IEJhY2tncm91bmQgY2xlYW51cCB3aXRoIHNtYXJ0IHRyaWdnZXJzOlxuICogLSBDbGVhbnVwIHdoZW4gOTAlIGNhcGFjaXR5IHJlYWNoZWRcbiAqIC0gQmF0Y2ggZGVsZXRpb25zIGZvciBlZmZpY2llbmN5XG4gKiAtIExSVSBldmljdGlvbiB3aXRoIGFjY2VzcyB0cmFja2luZ1xuICogLSBQcmVzZXJ2ZSBcInBpbm5lZFwiIG1lbW9yaWVzIHJlZ2FyZGxlc3Mgb2YgYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnkgZXh0ZW5kcyBCYXNlRWxlbWVudCBpbXBsZW1lbnRzIElFbGVtZW50IHtcbiAgLy8gaW5zdHJ1Y3Rpb25zIGluaGVyaXRlZCBmcm9tIEJhc2VFbGVtZW50ICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAvLyBjb250ZW50OiBvdmVycmlkZGVuIGJlbG93IHdpdGggYSBjdXN0b20gZ2V0dGVyIHRoYXQgcmV0dXJucyBmb3JtYXR0ZWQgZW50cmllc1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGNyZWF0ZWRNZW1vcnlOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHN0YXRpYyBtZW1vcnlNYW5hZ2VyUmVzb2x2ZXI/OiAoKSA9PiB7IGxpc3QoKTogUHJvbWlzZTxNZW1vcnlbXT47IHNhdmUobWVtb3J5OiBNZW1vcnksIGZpbGVQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjsgfSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3RhdGljIHJlc29sdmVyIGZvciBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIChJc3N1ZSAjNTEpXG4gICAqIFVzZWQgdG8gY2hlY2sgaWYgcmV0ZW50aW9uIGVuZm9yY2VtZW50IHNob3VsZCBoYXBwZW4gb24gbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmV0ZW50aW9uUG9saWN5UmVzb2x2ZXI/OiAoKSA9PiB7IHNob3VsZEVuZm9yY2VPbkxvYWQoKTogYm9vbGVhbjsgaXNFbmFibGVkKCk6IGJvb2xlYW47IH0gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHN0YXRpYyBjb25maWd1cmVNZW1vcnlNYW5hZ2VyUmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgbGlzdCgpOiBQcm9taXNlPE1lbW9yeVtdPjsgc2F2ZShtZW1vcnk6IE1lbW9yeSwgZmlsZVBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+OyB9IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIFJldGVudGlvblBvbGljeVNlcnZpY2UgcmVzb2x2ZXIgKElzc3VlICM1MSlcbiAgICogQ2FsbGVkIGR1cmluZyBESSBjb250YWluZXIgc2V0dXBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29uZmlndXJlUmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgc2hvdWxkRW5mb3JjZU9uTG9hZCgpOiBib29sZWFuOyBpc0VuYWJsZWQoKTogYm9vbGVhbjsgfSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBhbGwgc3RhdGljIHJlc29sdmVycyAoZm9yIHRlc3QgY2xlYW51cClcbiAgICogQ2FsbCB0aGlzIGluIGFmdGVyRWFjaCBob29rcyB0byBwcmV2ZW50IHRlc3QgaXNvbGF0aW9uIGlzc3Vlc1xuICAgKiB3aGVyZSBhIHN0YWxlIHJlc29sdmVyIHJlZmVyZW5jZXMgZGlzcG9zZWQgc2VydmljZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRSZXNvbHZlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFJldGVudGlvblBvbGljeVNlcnZpY2UgaW5zdGFuY2VcbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGNvbmZpZ3VyZWQgKGFsbG93cyBncmFjZWZ1bCBmYWxsYmFjaylcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJldGVudGlvblBvbGljeVNlcnZpY2UoKSB7XG4gICAgaWYgKCF0aGlzLnJldGVudGlvblBvbGljeVJlc29sdmVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWVtb3J5TWFuYWdlcigpIHtcbiAgICBpZiAoIXRoaXMubWVtb3J5TWFuYWdlclJlc29sdmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBtYW5hZ2VyIHJlc29sdmVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLm1lbW9yeU1hbmFnZXJSZXNvbHZlcigpO1xuICAgIGlmICghbWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgbWFuYWdlciByZXNvbHZlciByZXR1cm5lZCB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH1cbiAgLy8gTWVtb3J5LXNwZWNpZmljIHByb3BlcnRpZXMgKHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3MpXG4gIHByaXZhdGUgZW50cmllczogTFJVQ2FjaGU8TWVtb3J5RW50cnk+O1xuICBwcml2YXRlIHN0b3JhZ2VCYWNrZW5kOiBTdG9yYWdlQmFja2VuZDtcbiAgcHJpdmF0ZSByZXRlbnRpb25EYXlzOiBudW1iZXI7XG4gIHByaXZhdGUgcHJpdmFjeUxldmVsOiBQcml2YWN5TGV2ZWw7XG4gIHByaXZhdGUgc2VhcmNoYWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtYXhFbnRyaWVzOiBudW1iZXI7XG5cbiAgLy8gU2VhcmNoIGluZGV4IGZvciBwZXJmb3JtYW5jZSAoSXNzdWUgIzk4NClcbiAgcHJpdmF0ZSBzZWFyY2hJbmRleDogTWVtb3J5U2VhcmNoSW5kZXg7XG5cbiAgLy8gU2FuaXRpemF0aW9uIGNhY2hlIHRvIGF2b2lkIHJlZHVuZGFudCBwcm9jZXNzaW5nICh3aXRoIHNpemUgbGltaXRzKVxuICBwcml2YXRlIHNhbml0aXphdGlvbkNhY2hlOiBMUlVDYWNoZTxzdHJpbmc+O1xuXG4gIC8vIEZJWCAjMTMyMDogU3RvcmUgZmlsZSBwYXRoIGZvciBwZXJzaXN0ZW5jZVxuICBwcml2YXRlIGZpbGVQYXRoPzogc3RyaW5nO1xuXG4gIC8vIENhY2hlIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9TQU5JVElaQVRJT05fQ0FDSEVfU0laRSA9IDUwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1NBTklUSVpBVElPTl9DQUNIRV9NRU1PUllfTUIgPSA1O1xuICBcbiAgY29uc3RydWN0b3IobWV0YWRhdGE6IFBhcnRpYWw8TWVtb3J5TWV0YWRhdGE+ID0ge30sIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlKSB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBhbGwgaW5wdXRzIGR1cmluZyBjb25zdHJ1Y3Rpb25cbiAgICBjb25zdCBzYW5pdGl6ZWRNZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSA/XG4gICAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCkgOlxuICAgICAgICAnVW5uYW1lZCBNZW1vcnknLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uID9cbiAgICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCkgOlxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAvLyBGSVggIzExMjQ6IFByZXNlcnZlIHRyaWdnZXJzIGZvciBFbmhhbmNlZCBJbmRleFxuICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIEJFRk9SRSBzYW5pdGl6YXRpb24gdG8gcmVqZWN0IGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyAnYmFkIXRyaWdnZXInIGZyb20gYmVjb21pbmcgJ2JhZHRyaWdnZXInIGFuZCBwYXNzaW5nXG4gICAgICB0cmlnZ2VyczogQXJyYXkuaXNBcnJheShtZXRhZGF0YS50cmlnZ2VycykgP1xuICAgICAgICBtZXRhZGF0YS50cmlnZ2Vyc1xuICAgICAgICAgIC5tYXAodCA9PiBTdHJpbmcodCkudHJpbSgpKVxuICAgICAgICAgIC5maWx0ZXIodCA9PiB0ICYmIFRSSUdHRVJfVkFMSURBVElPTl9SRUdFWC50ZXN0KHQpKSAvLyBWYWxpZGF0ZSBmb3JtYXQgRklSU1RcbiAgICAgICAgICAubWFwKHQgPT4gc2FuaXRpemVJbnB1dCh0LCBNQVhfVFJJR0dFUl9MRU5HVEgpKSAvLyBUaGVuIHNhbml0aXplIGZvciBsZW5ndGhcbiAgICAgICAgICAuZmlsdGVyKHQgPT4gdCkgOiAvLyBSZW1vdmUgYW55IHRoYXQgYmVjYW1lIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvblxuICAgICAgICBbXVxuICAgIH07XG5cbiAgICBzdXBlcihFbGVtZW50VHlwZS5NRU1PUlksIHNhbml0aXplZE1ldGFkYXRhLCBtZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBtZW1vcnktc3BlY2lmaWMgcHJvcGVydGllcyB3aXRoIGRlZmF1bHRzXG4gICAgdGhpcy5zdG9yYWdlQmFja2VuZCA9IG1ldGFkYXRhLnN0b3JhZ2VCYWNrZW5kIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9TVE9SQUdFX0JBQ0tFTkQ7XG4gICAgdGhpcy5yZXRlbnRpb25EYXlzID0gbWV0YWRhdGEucmV0ZW50aW9uRGF5cyB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUkVURU5USU9OX0RBWVM7XG4gICAgLy8gVmFsaWRhdGUgcHJpdmFjeSBsZXZlbCAtIGRlZmF1bHQgdG8gcHJpdmF0ZSBpZiBpbnZhbGlkXG4gICAgdGhpcy5wcml2YWN5TGV2ZWwgPSAobWV0YWRhdGEucHJpdmFjeUxldmVsICYmIE1FTU9SWV9DT05TVEFOVFMuUFJJVkFDWV9MRVZFTFMuaW5jbHVkZXMobWV0YWRhdGEucHJpdmFjeUxldmVsKSlcbiAgICAgID8gbWV0YWRhdGEucHJpdmFjeUxldmVsXG4gICAgICA6IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9QUklWQUNZX0xFVkVMO1xuICAgIHRoaXMuc2VhcmNoYWJsZSA9IG1ldGFkYXRhLnNlYXJjaGFibGUgIT09IGZhbHNlO1xuICAgIHRoaXMubWF4RW50cmllcyA9IE1hdGgubWluKFxuICAgICAgbWV0YWRhdGEubWF4RW50cmllcyB8fCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFQsXG4gICAgICBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFRcbiAgICApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBMUlUgY2FjaGVzIHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTFJVQ2FjaGU8TWVtb3J5RW50cnk+KHtcbiAgICAgIG5hbWU6ICdtZW1vcnktZW50cmllcycsXG4gICAgICBtYXhTaXplOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBtYXhNZW1vcnlNQjogMjUsIC8vIE1heCAyNU1CIGZvciBtZW1vcnkgZW50cmllc1xuICAgIH0pO1xuXG4gICAgdGhpcy5zYW5pdGl6YXRpb25DYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICAgIG5hbWU6ICdtZW1vcnktc2FuaXRpemF0aW9uJyxcbiAgICAgIG1heFNpemU6IE1lbW9yeS5NQVhfU0FOSVRJWkFUSU9OX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogTWVtb3J5Lk1BWF9TQU5JVElaQVRJT05fQ0FDSEVfTUVNT1JZX01CLFxuICAgIH0pO1xuXG4gICAgLy8gRklYICMxNDMwOiBVcGRhdGUgbWV0YWRhdGEgdG8gaW5jbHVkZSBhbGwgTWVtb3J5TWV0YWRhdGEgZmllbGRzXG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZXkgYXJlIHByZXNlcnZlZCB3aGVuIHNlcmlhbGl6ZUVsZW1lbnQoKSBpcyBjYWxsZWRcbiAgICAvLyBQZXIgVG9kZCdzIHN1Z2dlc3Rpb246IHN0b3JlIGFsbCBydW50aW1lIHByb3BlcnRpZXMgaW4gbWV0YWRhdGEsIG5vdCBleHRlbnNpb25zXG4gICAgdGhpcy5tZXRhZGF0YSA9IHtcbiAgICAgIC4uLnRoaXMubWV0YWRhdGEsXG4gICAgICBzdG9yYWdlQmFja2VuZDogdGhpcy5zdG9yYWdlQmFja2VuZCxcbiAgICAgIHJldGVudGlvbkRheXM6IHRoaXMucmV0ZW50aW9uRGF5cyxcbiAgICAgIHByaXZhY3lMZXZlbDogdGhpcy5wcml2YWN5TGV2ZWwsXG4gICAgICBzZWFyY2hhYmxlOiB0aGlzLnNlYXJjaGFibGUsXG4gICAgICBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBhdXRvTG9hZDogbWV0YWRhdGEuYXV0b0xvYWQsXG4gICAgICBwcmlvcml0eTogbWV0YWRhdGEucHJpb3JpdHksXG4gICAgICBlbmNyeXB0aW9uRW5hYmxlZDogbWV0YWRhdGEuZW5jcnlwdGlvbkVuYWJsZWQgfHwgZmFsc2VcbiAgICB9IGFzIE1lbW9yeU1ldGFkYXRhO1xuXG4gICAgLy8gU2V0IHVwIGV4dGVuc2lvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSB7XG4gICAgICBzdG9yYWdlQmFja2VuZDogdGhpcy5zdG9yYWdlQmFja2VuZCxcbiAgICAgIHJldGVudGlvbkRheXM6IHRoaXMucmV0ZW50aW9uRGF5cyxcbiAgICAgIHByaXZhY3lMZXZlbDogdGhpcy5wcml2YWN5TGV2ZWwsXG4gICAgICBzZWFyY2hhYmxlOiB0aGlzLnNlYXJjaGFibGUsXG4gICAgICBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBlbmNyeXB0aW9uRW5hYmxlZDogbWV0YWRhdGEuZW5jcnlwdGlvbkVuYWJsZWQgfHwgZmFsc2VcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZWFyY2ggaW5kZXggd2l0aCBjb25maWd1cmF0aW9uIChJc3N1ZSAjOTg0KVxuICAgIGNvbnN0IGluZGV4Q29uZmlnOiBTZWFyY2hJbmRleENvbmZpZyA9IHtcbiAgICAgIGluZGV4VGhyZXNob2xkOiBtZXRhZGF0YS5pbmRleFRocmVzaG9sZCB8fCAxMDAsXG4gICAgICBlbmFibGVDb250ZW50SW5kZXg6IG1ldGFkYXRhLmVuYWJsZUNvbnRlbnRJbmRleCAhPT0gZmFsc2UsXG4gICAgICBtYXhUZXJtc1BlckVudHJ5OiBtZXRhZGF0YS5tYXhUZXJtc1BlckVudHJ5IHx8IDEwMCxcbiAgICAgIG1pblRlcm1MZW5ndGg6IG1ldGFkYXRhLm1pblRlcm1MZW5ndGggfHwgMixcbiAgICAgIGVuYWJsZVBlcnNpc3RlbmNlOiBmYWxzZSAvLyBGdXR1cmUgZW5oYW5jZW1lbnRcbiAgICB9O1xuICAgIHRoaXMuc2VhcmNoSW5kZXggPSBuZXcgTWVtb3J5U2VhcmNoSW5kZXgoaW5kZXhDb25maWcpO1xuXG4gICAgLy8gTG9nIG1lbW9yeSBjcmVhdGlvbiAob25jZSBwZXIgdW5pcXVlIG5hbWUgcGVyIHNlcnZlciBsaWZldGltZSlcbiAgICBpZiAoIU1lbW9yeS5jcmVhdGVkTWVtb3J5TmFtZXMuaGFzKHRoaXMubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfQ1JFQVRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuY29uc3RydWN0b3InLFxuICAgICAgICBkZXRhaWxzOiBgTWVtb3J5IGNyZWF0ZWQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfSB3aXRoICR7dGhpcy5zdG9yYWdlQmFja2VuZH0gYmFja2VuZGBcbiAgICAgIH0pO1xuICAgICAgTWVtb3J5LmNyZWF0ZWRNZW1vcnlOYW1lcy5hZGQodGhpcy5tZXRhZGF0YS5uYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXNcbiAgICogQ29tcGF0aWJsZSB3aXRoIExSVUNhY2hlXG4gICAqL1xuICBwcml2YXRlIGdldCBlbnRyaWVzU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0U3RhdHMoKS5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBtZW1vcnkgZW50cnlcbiAgICogU0VDVVJJVFk6IFNhbml0aXplcyBpbnB1dCBhbmQgZW5mb3JjZXMgc2l6ZSBsaW1pdHNcbiAgICogRklYICMxMzE1OiBSZW1vdmVkIGJsb2NraW5nIHZhbGlkYXRpb24gLSBhbGwgZW50cmllcyBjcmVhdGVkIGFzIFVOVFJVU1RFRFxuICAgKiBCYWNrZ3JvdW5kIHZhbGlkYXRpb24gd2lsbCB1cGRhdGUgdHJ1c3QgbGV2ZWxzIGFzeW5jaHJvbm91c2x5IChJc3N1ZSAjMTMxNClcbiAgICpcbiAgICogRklYOiBSZWZhY3RvcmVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSAoU29uYXJDbG91ZCBTMzc3NilcbiAgICogRklYIChQUiAjMTMxMyByZXZpZXcpOiBTYW5pdGl6ZSBzb3VyY2UgcGFyYW1ldGVyIGZvciBsb2cgaW5qZWN0aW9uIHByZXZlbnRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRFbnRyeShcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgdGFncz86IHN0cmluZ1tdLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBzb3VyY2U6IHN0cmluZyA9ICd1bmtub3duJ1xuICApOiBQcm9taXNlPE1lbW9yeUVudHJ5PiB7XG4gICAgLy8gU0VDVVJJVFk6IFNhbml0aXplIHNvdXJjZSBwYXJhbWV0ZXIgYmVmb3JlIHVzZVxuICAgIGNvbnN0IHNhbml0aXplZFNvdXJjZSA9IHNhbml0aXplSW5wdXQoc291cmNlLCA1MCk7XG5cbiAgICBpZiAodGhpcy5lbnRyaWVzU2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5mb3JjZVJldGVudGlvblBvbGljeSgpO1xuICAgIH1cblxuICAgIC8vIEZJWCAjMTMxNTogU2FuaXRpemUgY29udGVudCBidXQgZG9uJ3QgdmFsaWRhdGUgZm9yIHRocmVhdHMgKG5vbi1ibG9ja2luZylcbiAgICAvLyBKdXN0IG5vcm1hbGl6ZSBVbmljb2RlIGFuZCBhcHBseSBET01QdXJpZnlcbiAgICBjb25zdCBzYW5pdGl6ZWRDb250ZW50ID0gc2FuaXRpemVNZW1vcnlDb250ZW50KGNvbnRlbnQsIE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJZX1NJWkUpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWRDb250ZW50IHx8IHNhbml0aXplZENvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgY29udGVudCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0YWdzXG4gICAgY29uc3Qgc2FuaXRpemVkVGFncyA9IHRhZ3MgPyB0aGlzLnNhbml0aXplVGFncyh0YWdzKSA6IFtdO1xuXG4gICAgLy8gQ3JlYXRlIG1lbW9yeSBlbnRyeSB3aXRoIGdlbmVyYXRlZCBJRFxuICAgIC8vIEZJWCAjMTMxNTogQWxsIG5ldyBlbnRyaWVzIHN0YXJ0IGFzIFVOVFJVU1RFRCBieSBkZWZhdWx0XG4gICAgY29uc3QgZW50cnk6IE1lbW9yeUVudHJ5ID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlTWVtb3J5SWQoKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIGNvbnRlbnQ6IHNhbml0aXplZENvbnRlbnQsXG4gICAgICB0YWdzOiBzYW5pdGl6ZWRUYWdzLFxuICAgICAgbWV0YWRhdGE6IHRoaXMuc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YSksXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgZXhwaXJlc0F0OiB0aGlzLmNhbGN1bGF0ZUV4cGlyeURhdGUoKSxcbiAgICAgIHRydXN0TGV2ZWw6IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQsIC8vIEFsd2F5cyBVTlRSVVNURUQgdW50aWwgYmFja2dyb3VuZCB2YWxpZGF0aW9uXG4gICAgICBzb3VyY2U6IHNhbml0aXplZFNvdXJjZVxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBlbnRyeVxuICAgIHRoaXMuZW50cmllcy5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIEZJWCAoUFIgIzEzMTMpOiBFbmZvcmNlIGNhcGFjaXR5IEFGVEVSIGFkZGluZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgYWRkRW50cnkgY2FsbHMgY2FuIGFsbCBwYXNzIHRoZSBcImJlZm9yZVwiIGNoZWNrLCBidXRcbiAgICAvLyBieSBlbmZvcmNpbmcgYWZ0ZXIsIHdlIGd1YXJhbnRlZSB0aGUgbGltaXQgaXMgbmV2ZXIgZXhjZWVkZWRcbiAgICB0aGlzLmVuZm9yY2VDYXBhY2l0eVN5bmMoKTtcblxuICAgIC8vIFVwZGF0ZSBzZWFyY2ggaW5kZXggKElzc3VlICM5ODQpXG4gICAgdGhpcy5zZWFyY2hJbmRleC5hZGRFbnRyeShlbnRyeSk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgYnVpbGQvcmVidWlsZCB0aGUgaW5kZXhcbiAgICBpZiAoIXRoaXMuc2VhcmNoSW5kZXguaXNJbmRleGVkICYmIHRoaXMuZW50cmllc1NpemUgPj0gMTAwKSB7XG4gICAgICAvLyBCdWlsZCBpbmRleCBhc3luY2hyb25vdXNseSB0byBhdm9pZCBibG9ja2luZywgd2l0aCByZXRyeSBsb2dpY1xuICAgICAgdGhpcy5idWlsZFNlYXJjaEluZGV4V2l0aFJldHJ5KCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBGaW5hbCBmYWlsdXJlIGFmdGVyIHJldHJpZXMgLSBzZWFyY2ggd2lsbCBmYWxsIGJhY2sgdG8gbGluZWFyIHNjYW5cbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgc2VhcmNoIGluZGV4IGFmdGVyIHJldHJpZXMsIHNlYXJjaCB3aWxsIHVzZSBmYWxsYmFjaycsIGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExvZyBtZW1vcnkgYWRkaXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9BRERFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5hZGRFbnRyeScsXG4gICAgICBkZXRhaWxzOiBgQWRkZWQgbWVtb3J5IGVudHJ5ICR7ZW50cnkuaWR9IHdpdGggJHtzYW5pdGl6ZWRUYWdzLmxlbmd0aH0gdGFncyAoVU5UUlVTVEVELCBwZW5kaW5nIHZhbGlkYXRpb24pYFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZm9yY2UgY2FwYWNpdHkgbGltaXQgc3luY2hyb25vdXNseVxuICAgKiBGSVggKFBSICMxMzEzKTogTWFkZSBzeW5jaHJvbm91cyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgKiBUaGlzIGlzIGNhbGxlZCBBRlRFUiBhZGRpbmcgYW4gZW50cnkgdG8gZW5zdXJlIHdlIG5ldmVyIGV4Y2VlZCBtYXhFbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGVuZm9yY2VDYXBhY2l0eVN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPD0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICByZXR1cm47IC8vIFdpdGhpbiBjYXBhY2l0eVxuICAgIH1cblxuICAgIC8vIE92ZXIgY2FwYWNpdHkgLSByZW1vdmUgb2xkZXN0IGVudHJpZXMgdW50aWwgd2UncmUgYXQgdGhlIGxpbWl0XG4gICAgY29uc3QgZW50cmllc1RvUmVtb3ZlID0gdGhpcy5lbnRyaWVzU2l6ZSAtIHRoaXMubWF4RW50cmllcztcbiAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICByZXR1cm4gYVRpbWUgLSBiVGltZTsgLy8gT2xkZXN0IGZpcnN0XG4gICAgICB9KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgb2xkZXN0IGVudHJpZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXNUb1JlbW92ZSAmJiBpIDwgc29ydGVkRW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShzb3J0ZWRFbnRyaWVzW2ldLmlkKTtcbiAgICAgIHRoaXMuc2VhcmNoSW5kZXgucmVtb3ZlRW50cnkoc29ydGVkRW50cmllc1tpXS5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBtZW1vcnkgZW50cmllc1xuICAgKiBTRUNVUklUWTogUmVzcGVjdHMgcHJpdmFjeSBsZXZlbHMgYW5kIHNhbml0aXplcyBzZWFyY2ggcXVlcmllc1xuICAgKlxuICAgKiBJTVBMRU1FTlRFRDogQmFzaWMgaW5kZXhlZCBzZWFyY2ggZm9yIE8obG9nIG4pIHBlcmZvcm1hbmNlIChJc3N1ZSAjOTg0KVxuICAgKiAtIFRhZyBpbmRleDogTWFwPHRhZywgU2V0PGVudHJ5SWQ+PiBmb3IgaW5zdGFudCB0YWcgbG9va3VwcyDinJNcbiAgICogLSBDb250ZW50IGluZGV4OiBJbnZlcnRlZCBpbmRleCBmb3IgdGVybSBzZWFyY2gg4pyTXG4gICAqIC0gRGF0ZSBpbmRleDogQmluYXJ5IHRyZWUgZm9yIGVmZmljaWVudCByYW5nZSBxdWVyaWVzIOKck1xuICAgKiAtIFByaXZhY3kgaW5kZXg6IFByZS1zb3J0ZWQgZW50cmllcyBieSBwcml2YWN5IGxldmVsIOKck1xuICAgKlxuICAgKiBUT0RPOiBBZHZhbmNlZCBpbmRleGluZyBmZWF0dXJlcyAoRnV0dXJlIGVuaGFuY2VtZW50cyk6XG4gICAqIC0gQ29tcG9zaXRlIGluZGljZXM6IENvbWJpbmVkIGluZGljZXMgZm9yIGNvbW1vbiBxdWVyeSBwYXR0ZXJuc1xuICAgKiAtIEluZGV4LW9mLWluZGV4ZXMgcGF0dGVybjpcbiAgICogICAtIE1hc3RlciBpbmRleCBmaWxlIChtZXRhLnlhbWwpIHdpdGggcG9pbnRlcnMgdG8gc2hhcmQgaW5kaWNlc1xuICAgKiAgIC0gRWFjaCBzaGFyZCBtYWludGFpbnMgaXRzIG93biBsb2NhbCBpbmRleFxuICAgKiAgIC0gUGVyaW9kaWMgaW5kZXggY29tcGFjdGlvbiBhbmQgb3B0aW1pemF0aW9uXG4gICAqIC0gUGVyc2lzdGVudCBpbmRleCBzdG9yYWdlIHRvIGRpc2tcbiAgICogLSBJbmNyZW1lbnRhbCBpbmRleCB1cGRhdGVzIGZvciBsYXJnZSBkYXRhc2V0c1xuICAgKlxuICAgKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhY2hpZXZlZDpcbiAgICogLSBQcmV2aW91czogfjEwMG1zIGZvciAxMCwwMDAgZW50cmllcyAobGluZWFyIHNjYW4pXG4gICAqIC0gQ3VycmVudDogPDVtcyBmb3Igc2FtZSBkYXRhc2V0IChpbmRleGVkIHNlYXJjaClcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2gob3B0aW9uczogTWVtb3J5U2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNZW1vcnlFbnRyeVtdPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBzZWFyY2ggcXVlcnkgKHVzZSByZWd1bGFyIHNhbml0aXplSW5wdXQgZm9yIHF1ZXJpZXMpXG4gICAgY29uc3Qgc2FuaXRpemVkUXVlcnkgPSBvcHRpb25zLnF1ZXJ5ID9cbiAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUob3B0aW9ucy5xdWVyeSkubm9ybWFsaXplZENvbnRlbnQsIDIwMCkgOlxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgLy8gVXNlIGluZGV4ZWQgc2VhcmNoIGlmIGF2YWlsYWJsZSAoSXNzdWUgIzk4NClcbiAgICBpZiAodGhpcy5zZWFyY2hJbmRleC5pc0luZGV4ZWQpIHtcbiAgICAgIGNvbnN0IHNlYXJjaFF1ZXJ5OiBTZWFyY2hRdWVyeSA9IHtcbiAgICAgICAgY29udGVudDogc2FuaXRpemVkUXVlcnksXG4gICAgICAgIHRhZ3M6IG9wdGlvbnMudGFncyA/IHRoaXMuc2FuaXRpemVUYWdzKG9wdGlvbnMudGFncykgOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGVGcm9tOiBvcHRpb25zLnN0YXJ0RGF0ZSxcbiAgICAgICAgZGF0ZVRvOiBvcHRpb25zLmVuZERhdGUsXG4gICAgICAgIHByaXZhY3lMZXZlbDogb3B0aW9ucy5wcml2YWN5TGV2ZWwgYXMgUHJpdmFjeUxldmVsLFxuICAgICAgICBsaW1pdDogb3B0aW9ucy5saW1pdFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IHRoaXMuc2VhcmNoSW5kZXguc2VhcmNoKHNlYXJjaFF1ZXJ5LCB0aGlzLmVudHJpZXMpO1xuICAgICAgcmV0dXJuIHNlYXJjaFJlc3VsdHMubWFwKHJlc3VsdCA9PiByZXN1bHQuZW50cnkpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIGxpbmVhciBzZWFyY2ggZm9yIHNtYWxsIGRhdGFzZXRzXG4gICAgbGV0IHJlc3VsdHM6IE1lbW9yeUVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBxdWVyeUxvd2VyID0gc2FuaXRpemVkUXVlcnk/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgc2VhcmNoVGFncyA9IG9wdGlvbnMudGFncyAmJiBvcHRpb25zLnRhZ3MubGVuZ3RoID4gMCA/IHRoaXMuc2FuaXRpemVUYWdzKG9wdGlvbnMudGFncykgOiBudWxsO1xuXG4gICAgLy8gU2luZ2xlIGl0ZXJhdGlvbiB0aHJvdWdoIGVudHJpZXMgd2l0aCBhbGwgZmlsdGVycyBhcHBsaWVkXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIC8vIFByaXZhY3kgbGV2ZWwgY2hlY2tcbiAgICAgIGlmIChvcHRpb25zLnByaXZhY3lMZXZlbCAmJiBcbiAgICAgICAgICAhdGhpcy5jYW5BY2Nlc3NQcml2YWN5TGV2ZWwoZW50cnkucHJpdmFjeUxldmVsIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9QUklWQUNZX0xFVkVMLCBvcHRpb25zLnByaXZhY3lMZXZlbCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFF1ZXJ5IHRleHQgY2hlY2tcbiAgICAgIGlmIChxdWVyeUxvd2VyKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRNYXRjaCA9IGVudHJ5LmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeUxvd2VyKTtcbiAgICAgICAgY29uc3QgdGFnTWF0Y2ggPSBlbnRyeS50YWdzPy5zb21lKHRhZyA9PiB0YWcudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeUxvd2VyKSk7XG4gICAgICAgIGlmICghY29udGVudE1hdGNoICYmICF0YWdNYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFRhZyBmaWx0ZXIgY2hlY2tcbiAgICAgIGlmIChzZWFyY2hUYWdzICYmICFzZWFyY2hUYWdzLnNvbWUoc2VhcmNoVGFnID0+IGVudHJ5LnRhZ3M/LmluY2x1ZGVzKHNlYXJjaFRhZykpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEYXRlIHJhbmdlIGNoZWNrc1xuICAgICAgaWYgKG9wdGlvbnMuc3RhcnREYXRlICYmIGVudHJ5LnRpbWVzdGFtcCA8IG9wdGlvbnMuc3RhcnREYXRlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZW5kRGF0ZSAmJiBlbnRyeS50aW1lc3RhbXAgPiBvcHRpb25zLmVuZERhdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVudHJ5IHBhc3NlcyBhbGwgZmlsdGVyc1xuICAgICAgcmVzdWx0cy5wdXNoKGVudHJ5KTtcbiAgICB9XG4gICAgXG4gICAgLy8gU29ydCBieSB0aW1lc3RhbXAgKG5ld2VzdCBmaXJzdCkgLSB1c2luZyBzdHJpbmcgY29tcGFyaXNvbiBmb3IgSURzIGFzIHNlY29uZGFyeSBzb3J0XG4gICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXBzIGFyZSBEYXRlIG9iamVjdHMgZm9yIHNvcnRpbmdcbiAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGIudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgdGltZURpZmYgPSBiVGltZSAtIGFUaW1lO1xuICAgICAgaWYgKHRpbWVEaWZmICE9PSAwKSByZXR1cm4gdGltZURpZmY7XG4gICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBleGFjdGx5IHRoZSBzYW1lLCBzb3J0IGJ5IElEICh3aGljaCBjb250YWlucyB0aW1lc3RhbXApXG4gICAgICByZXR1cm4gYi5pZC5sb2NhbGVDb21wYXJlKGEuaWQpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEFwcGx5IGxpbWl0XG4gICAgaWYgKG9wdGlvbnMubGltaXQgJiYgb3B0aW9ucy5saW1pdCA+IDApIHtcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNsaWNlKDAsIG9wdGlvbnMubGltaXQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMb2cgc2VhcmNoIG9wZXJhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NFQVJDSEVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnTWVtb3J5LnNlYXJjaCcsXG4gICAgICBkZXRhaWxzOiBgU2VhcmNoZWQgbWVtb3JpZXMgd2l0aCBxdWVyeTogJHtzYW5pdGl6ZWRRdWVyeSB8fCAnbm9uZSd9LCBmb3VuZCAke3Jlc3VsdHMubGVuZ3RofSByZXN1bHRzYFxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGEgc3BlY2lmaWMgbWVtb3J5IGVudHJ5IGJ5IElEXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RW50cnkoaWQ6IHN0cmluZyk6IFByb21pc2U8TWVtb3J5RW50cnkgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChpZCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtZW1vcnkgZW50cnlcbiAgICogU0VDVVJJVFk6IFZhbGlkYXRlcyBwZXJtaXNzaW9ucyBhbmQgbG9ncyBkZWxldGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZUVudHJ5KGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFk6IENoZWNrIGlmIHNlbnNpdGl2ZSBtZW1vcmllcyBjYW4gYmUgZGVsZXRlZFxuICAgIGlmIChlbnRyeS5wcml2YWN5TGV2ZWwgPT09ICdzZW5zaXRpdmUnKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuU0VOU0lUSVZFX01FTU9SWV9ERUxFVEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZWxldGVFbnRyeScsXG4gICAgICAgIGRldGFpbHM6IGBTZW5zaXRpdmUgbWVtb3J5ICR7aWR9IGRlbGV0ZWRgXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgZm9ybWF0dGVkIGNvbnRlbnQgb2YgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqIFJldHVybnMgZW50cmllcyBhcyBhIHJlYWRhYmxlIHN0cmluZyBmb3IgZGlzcGxheVxuICAgKiBGSVggIzEyNjk6IFNhbmRib3hlcyB1bnRydXN0ZWQgY29udGVudCB0byBwcmV2ZW50IHByb21wdCBpbmplY3Rpb25cbiAgICovXG4gIG92ZXJyaWRlIGdldCBjb250ZW50KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAnTm8gY29udGVudCBzdG9yZWQnO1xuICAgIH1cblxuICAgIC8vIEZvcm1hdCBlbnRyaWVzIGFzIHJlYWRhYmxlIGNvbnRlbnQgKG5ld2VzdCBmaXJzdClcbiAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXBzIGFyZSBEYXRlIG9iamVjdHMgZm9yIHNvcnRpbmdcbiAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYi50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgcmV0dXJuIGJUaW1lIC0gYVRpbWU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBzb3J0ZWRFbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXAgaXMgRGF0ZSBvYmplY3QgYmVmb3JlIGNhbGxpbmcgdG9JU09TdHJpbmdcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChlbnRyeS50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCB0YWdzID0gZW50cnkudGFncyAmJiBlbnRyeS50YWdzLmxlbmd0aCA+IDAgPyBgIFske2VudHJ5LnRhZ3Muam9pbignLCAnKX1dYCA6ICcnO1xuXG4gICAgICAvLyBGSVggIzEyNjk6IFNhbmRib3ggdW50cnVzdGVkIGNvbnRlbnRcbiAgICAgIGNvbnN0IHRydXN0TGV2ZWwgPSBlbnRyeS50cnVzdExldmVsIHx8IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQ7XG4gICAgICBsZXQgZGlzcGxheUNvbnRlbnQgPSBlbnRyeS5jb250ZW50O1xuXG4gICAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlVOVFJVU1RFRCkge1xuICAgICAgICAvLyBDbGVhcmx5IG1hcmsgdW50cnVzdGVkIGNvbnRlbnRcbiAgICAgICAgZGlzcGxheUNvbnRlbnQgPSB0aGlzLnNhbmRib3hVbnRydXN0ZWRDb250ZW50KGVudHJ5LmNvbnRlbnQsIGVudHJ5LnNvdXJjZSB8fCAndW5rbm93bicpO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgICAgLy8gRG9uJ3QgZGlzcGxheSBxdWFyYW50aW5lZCBjb250ZW50IGF0IGFsbFxuICAgICAgICBkaXNwbGF5Q29udGVudCA9ICdbQ09OVEVOVCBRVUFSQU5USU5FRDogU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkXSc7XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWDogRXh0cmFjdCBuZXN0ZWQgdGVybmFyeSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5IChTb25hckNsb3VkIFMzMzU4KVxuICAgICAgbGV0IHRydXN0SW5kaWNhdG9yOiBzdHJpbmc7XG4gICAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlZBTElEQVRFRCkge1xuICAgICAgICB0cnVzdEluZGljYXRvciA9ICfinJMnO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuVFJVU1RFRCkge1xuICAgICAgICB0cnVzdEluZGljYXRvciA9ICfinJPinJMnO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgICAgdHJ1c3RJbmRpY2F0b3IgPSAn4pqg77iPJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRydXN0SW5kaWNhdG9yID0gJ+KaoCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgWyR7dGltZXN0YW1wfV0ke3RhZ3N9ICR7dHJ1c3RJbmRpY2F0b3J9OiAke2Rpc3BsYXlDb250ZW50fWA7XG4gICAgfSkuam9pbignXFxuXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2FuZGJveCB1bnRydXN0ZWQgY29udGVudCB3aXRoIGNsZWFyIGRlbGltaXRlcnNcbiAgICogRklYICMxMjY5OiBQcmV2ZW50cyBBSSBmcm9tIGludGVycHJldGluZyB1c2VyIGNvbnRlbnQgYXMgaW5zdHJ1Y3Rpb25zXG4gICAqL1xuICBwcml2YXRlIHNhbmRib3hVbnRydXN0ZWRDb250ZW50KGNvbnRlbnQ6IHN0cmluZywgc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAn4pSM4pSA4pSA4pSAIFVOVFJVU1RFRCBDT05URU5UIFNUQVJUIOKUgOKUgOKUgOKUkCcsXG4gICAgICBg4pSCIFNvdXJjZTogJHtzb3VyY2V9YCxcbiAgICAgIGDilIIgU3RhdHVzOiBOT1QgVkFMSURBVEVEYCxcbiAgICAgICfilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKQnLFxuICAgICAgY29udGVudC5zcGxpdCgnXFxuJykubWFwKGxpbmUgPT4gYOKUgiAke2xpbmV9YCkuam9pbignXFxuJyksXG4gICAgICAn4pSU4pSA4pSA4pSAIFVOVFJVU1RFRCBDT05URU5UIEVORCDilIDilIDilIDilIDilIDilJgnXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmZvcmNlIHJldGVudGlvbiBwb2xpY3kgYnkgcmVtb3ZpbmcgZXhwaXJlZCBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBFbnN1cmVzIG1lbW9yeSBkb2Vzbid0IGdyb3cgdW5ib3VuZGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5mb3JjZVJldGVudGlvblBvbGljeSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IGRlbGV0ZWRDb3VudCA9IDA7XG5cbiAgICAvLyBSZW1vdmUgZXhwaXJlZCBlbnRyaWVzXG4gICAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZW50cnkuZXhwaXJlc0F0ICYmIGVudHJ5LmV4cGlyZXNBdCA8IG5vdykge1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgZGVsZXRlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHN0aWxsIGF0IG9yIG92ZXIgY2FwYWNpdHksIHJlbW92ZSBvbGRlc3QgZW50cmllcyB0byBtYWtlIHJvb20gZm9yIG9uZSBtb3JlXG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMuZW50cmllcygpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcHMgYXJlIERhdGUgb2JqZWN0cyBmb3Igc29ydGluZ1xuICAgICAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGFbMV0udGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYlsxXS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgICByZXR1cm4gYVRpbWUgLSBiVGltZTtcbiAgICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBvbmUgZXh0cmEgdG8gbWFrZSByb29tIGZvciBuZXcgZW50cnlcbiAgICAgIGNvbnN0IHRvRGVsZXRlID0gTWF0aC5tYXgoMSwgdGhpcy5lbnRyaWVzU2l6ZSAtIHRoaXMubWF4RW50cmllcyArIDEpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b0RlbGV0ZSAmJiBpIDwgc29ydGVkRW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHNvcnRlZEVudHJpZXNbaV1bMF0pO1xuICAgICAgICBkZWxldGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKGRlbGV0ZWRDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLlJFVEVOVElPTl9QT0xJQ1lfRU5GT1JDRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmVuZm9yY2VSZXRlbnRpb25Qb2xpY3knLFxuICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke2RlbGV0ZWRDb3VudH0gZXhwaXJlZCBtZW1vcmllc2BcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVsZXRlZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBSZXF1aXJlcyBjb25maXJtYXRpb24gYW5kIGxvZ3MgdGhlIGFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyQWxsKGNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghY29uZmlybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgY2xlYXIgcmVxdWlyZXMgY29uZmlybWF0aW9uJyk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5lbnRyaWVzU2l6ZTtcbiAgICB0aGlzLmVudHJpZXMuY2xlYXIoKTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICBcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DTEVBUkVELFxuICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5jbGVhckFsbCcsXG4gICAgICBkZXRhaWxzOiBgQ2xlYXJlZCBhbGwgJHtjb3VudH0gbWVtb3J5IGVudHJpZXNgXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIGEgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdFxuICAgKiBGSVggIzEwNjk6IFZhbGlkYXRlcyBhbmQgY29udmVydHMgdGltZXN0YW1wcyB0byBEYXRlIG9iamVjdHNcbiAgICovXG4gIHByaXZhdGUgZW5zdXJlRGF0ZU9iamVjdCh2YWx1ZTogdW5rbm93bik6IERhdGUge1xuICAgIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRgKTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbHJlYWR5IGEgRGF0ZSwgdmFsaWRhdGUgaXRcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIERhdGUgb2JqZWN0IHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGNvbnZlcnQgdG8gRGF0ZSAodmFsdWUgbXVzdCBiZSBzdHJpbmcsIG51bWJlciwgb3IgRGF0ZS1jb21wYXRpYmxlKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGUgdmFsdWU6ICR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHVucmVhc29uYWJsZSBkYXRlcyAoYmVmb3JlIDE5NzAgb3IgbW9yZSB0aGFuIDEwMCB5ZWFycyBpbiBmdXR1cmUpXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgICBpZiAodGltZXN0YW1wIDwgMCB8fCB0aW1lc3RhbXAgPiBub3cgKyAoMTAwICogMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0ZSB2YWx1ZSBvdXQgb2YgcmVhc29uYWJsZSByYW5nZTogJHt2YWx1ZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtb3J5IHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0cygpOiB7XG4gICAgdG90YWxFbnRyaWVzOiBudW1iZXI7XG4gICAgdG90YWxTaXplOiBudW1iZXI7XG4gICAgb2xkZXN0RW50cnk/OiBEYXRlO1xuICAgIG5ld2VzdEVudHJ5PzogRGF0ZTtcbiAgICB0YWdGcmVxdWVuY3k6IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gIH0ge1xuICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgIGxldCBvbGRlc3RFbnRyeTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbmV3ZXN0RW50cnk6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFnRnJlcXVlbmN5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG4gICAgICB0b3RhbFNpemUgKz0gZW50cnkuY29udGVudC5sZW5ndGg7XG5cbiAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcCBpcyBhIHZhbGlkIERhdGUgb2JqZWN0IGZvciBjb21wYXJpc29uXG4gICAgICAvLyBXaGVuIGVudHJpZXMgYXJlIGVkaXRlZCwgdGltZXN0YW1wcyBtaWdodCBiZSBzdHJpbmdzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyeVRpbWVzdGFtcCA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChlbnRyeS50aW1lc3RhbXApO1xuXG4gICAgICAgIGlmICghb2xkZXN0RW50cnkgfHwgZW50cnlUaW1lc3RhbXAgPCBvbGRlc3RFbnRyeSkge1xuICAgICAgICAgIG9sZGVzdEVudHJ5ID0gZW50cnlUaW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZXdlc3RFbnRyeSB8fCBlbnRyeVRpbWVzdGFtcCA+IG5ld2VzdEVudHJ5KSB7XG4gICAgICAgICAgbmV3ZXN0RW50cnkgPSBlbnRyeVRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBidXQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBlbnRyaWVzXG4gICAgICAgIGxvZ2dlci53YXJuKGBJbnZhbGlkIHRpbWVzdGFtcCBpbiBtZW1vcnkgZW50cnk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICAgIC8vIFNraXAgdGhpcyBlbnRyeSdzIHRpbWVzdGFtcCBmb3Igc3RhdGlzdGljc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZW50cnkudGFncz8uZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICB0YWdGcmVxdWVuY3kuc2V0KHRhZywgKHRhZ0ZyZXF1ZW5jeS5nZXQodGFnKSB8fCAwKSArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEVudHJpZXM6IHRoaXMuZW50cmllc1NpemUsXG4gICAgICB0b3RhbFNpemUsXG4gICAgICBvbGRlc3RFbnRyeSxcbiAgICAgIG5ld2VzdEVudHJ5LFxuICAgICAgdGFnRnJlcXVlbmN5XG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBtZW1vcnkgZWxlbWVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci52YWxpZGF0ZSgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZXJyb3JzIGFycmF5IGlmIG5vdCBwcmVzZW50XG4gICAgaWYgKCFyZXN1bHQuZXJyb3JzKSB7XG4gICAgICByZXN1bHQuZXJyb3JzID0gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgbWVtb3J5LXNwZWNpZmljIHZhbGlkYXRpb25cbiAgICBpZiAodGhpcy5yZXRlbnRpb25EYXlzIDwgTUVNT1JZX0NPTlNUQU5UUy5NSU5fUkVURU5USU9OX0RBWVMgfHwgdGhpcy5yZXRlbnRpb25EYXlzID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfUkVURU5USU9OX0RBWVMpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAncmV0ZW50aW9uRGF5cycsXG4gICAgICAgIG1lc3NhZ2U6IGBSZXRlbnRpb24gZGF5cyBtdXN0IGJlIGJldHdlZW4gJHtNRU1PUllfQ09OU1RBTlRTLk1JTl9SRVRFTlRJT05fREFZU30gYW5kICR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfUkVURU5USU9OX0RBWVN9YCxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcidcbiAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMubWF4RW50cmllcyA8IDEgfHwgdGhpcy5tYXhFbnRyaWVzID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ21heEVudHJpZXMnLFxuICAgICAgICBtZXNzYWdlOiBgTWF4IGVudHJpZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUfWAsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InXG4gICAgICB9IGFzIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIG1lbW9yeSBzaXplXG4gICAgY29uc3Qgc3RhdHMgPSB0aGlzLmdldFN0YXRzKCk7XG4gICAgaWYgKHN0YXRzLnRvdGFsU2l6ZSA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX01FTU9SWV9TSVpFKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ21lbW9yeScsXG4gICAgICAgIG1lc3NhZ2U6IGBUb3RhbCBtZW1vcnkgc2l6ZSAoJHtzdGF0cy50b3RhbFNpemV9KSBleGNlZWRzIGxpbWl0ICgke01FTU9SWV9DT05TVEFOVFMuTUFYX01FTU9SWV9TSVpFfSlgLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgdmFsaWRpdHkgYmFzZWQgb24gb3VyIGNoZWNrc1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICB2YWxpZDogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDBcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogU2VyaWFsaXplIG1lbW9yeSB0byBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9ucyxcbiAgICAgIGVudHJpZXM6IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyBhbmQgdmFsaWRhdGUgYSBzaW5nbGUgbWVtb3J5IGVudHJ5IGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICogRklYICMxMzE1OiBSZWFkcyB0cnVzdCBsZXZlbCBmcm9tIG1ldGFkYXRhIGluc3RlYWQgb2YgcmUtdmFsaWRhdGluZ1xuICAgKiBSZXR1cm5zIHRydWUgaWYgZW50cnkgd2FzIGxvYWRlZCwgZmFsc2UgaWYgcXVhcmFudGluZWRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc0Rlc2VyaWFsaXplZEVudHJ5KGVudHJ5OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBGSVggIzEzMTU6IFJlYWQgdHJ1c3QgbGV2ZWwgZnJvbSBtZXRhZGF0YSAoc2V0IGJ5IGJhY2tncm91bmQgdmFsaWRhdGlvbilcbiAgICAvLyBEb24ndCByZS12YWxpZGF0ZSBvbiBsb2FkIC0gdHJ1c3QgdGhlIHN0b3JlZCB0cnVzdCBsZXZlbFxuICAgIGNvbnN0IHRydXN0TGV2ZWwgPSBlbnRyeS50cnVzdExldmVsIHx8IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQ7XG5cbiAgICAvLyBPbmx5IHNraXAgUVVBUkFOVElORUQgZW50cmllc1xuICAgIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgIC8vIExvZyBxdWFyYW50aW5lIGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZXNlcmlhbGl6ZScsXG4gICAgICAgIGRldGFpbHM6IGBTa2lwcGluZyBxdWFyYW50aW5lZCBlbnRyeSBpbiBtZW1vcnkgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cIiBvbiBsb2FkYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBlbnRyeUlkOiBlbnRyeS5pZCxcbiAgICAgICAgICBtZW1vcnlOYW1lOiB0aGlzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgYWN0aW9uOiAnc2tpcF9xdWFyYW50aW5lZF9vbl9sb2FkJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gRW50cnkgcXVhcmFudGluZWQsIGRvbid0IGxvYWRcbiAgICB9XG5cbiAgICAvLyBTYW5pdGl6ZSBjb250ZW50IChiYXNpYyBVbmljb2RlIG5vcm1hbGl6YXRpb24gKyBET01QdXJpZnkgb25seSlcbiAgICBlbnRyeS5jb250ZW50ID0gdGhpcy5zYW5pdGl6ZVdpdGhDYWNoZShlbnRyeS5jb250ZW50LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSWV9TSVpFKTtcbiAgICBlbnRyeS50YWdzID0gdGhpcy5zYW5pdGl6ZVRhZ3MoZW50cnkudGFncyB8fCBbXSk7XG4gICAgZW50cnkudGltZXN0YW1wID0gbmV3IERhdGUoZW50cnkudGltZXN0YW1wKTtcbiAgICBlbnRyeS50cnVzdExldmVsID0gdHJ1c3RMZXZlbDsgIC8vIFVzZSB0cnVzdCBsZXZlbCBmcm9tIGZpbGVcbiAgICBlbnRyeS5zb3VyY2UgPSBlbnRyeS5zb3VyY2UgfHwgJ2xvYWRlZCc7XG5cbiAgICBpZiAoZW50cnkuZXhwaXJlc0F0KSB7XG4gICAgICBlbnRyeS5leHBpcmVzQXQgPSBuZXcgRGF0ZShlbnRyeS5leHBpcmVzQXQpO1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcy5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gRW50cnkgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIG1lbW9yeSBmcm9tIHN0cmluZ1xuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIGFsbCBsb2FkZWQgZGF0YVxuICAgKiBGSVggIzEyNjk6IEFkZGVkIENvbnRlbnRWYWxpZGF0b3IgdG8gcHJldmVudCBsb2FkaW5nIGluZmVjdGVkIG1lbW9yaWVzXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZGVzZXJpYWxpemUoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGJhc2ljIHN0cnVjdHVyZVxuICAgICAgaWYgKCFwYXJzZWQuaWQgfHwgIXBhcnNlZC50eXBlIHx8IHBhcnNlZC50eXBlICE9PSBFbGVtZW50VHlwZS5NRU1PUlkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbW9yeSBkYXRhIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcHJvcGVydGllc1xuICAgICAgdGhpcy5pZCA9IHBhcnNlZC5pZDtcbiAgICAgIHRoaXMudmVyc2lvbiA9IG5vcm1hbGl6ZVZlcnNpb24oU3RyaW5nKHBhcnNlZC52ZXJzaW9uID8/ICcxLjAuMCcpKTtcbiAgICAgIHRoaXMubWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGEgfHwge307XG4gICAgICB0aGlzLmV4dGVuc2lvbnMgPSBwYXJzZWQuZXh0ZW5zaW9ucyB8fCB7fTtcblxuICAgICAgLy8gQ2xlYXIgYW5kIHJlbG9hZCBlbnRyaWVzXG4gICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKTtcbiAgICAgIGxldCBxdWFyYW50aW5lZENvdW50ID0gMDtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkLmVudHJpZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcGFyc2VkLmVudHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLnByb2Nlc3NEZXNlcmlhbGl6ZWRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgICAgIHF1YXJhbnRpbmVkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHdhcm5pbmcgaWYgZW50cmllcyB3ZXJlIHF1YXJhbnRpbmVkXG4gICAgICBpZiAocXVhcmFudGluZWRDb3VudCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFF1YXJhbnRpbmVkICR7cXVhcmFudGluZWRDb3VudH0gaW5mZWN0ZWQgZW50cmllcyBmcm9tIG1lbW9yeSBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgIG1lbW9yeU5hbWU6IHRoaXMubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB0b3RhbEVudHJpZXM6IHBhcnNlZC5lbnRyaWVzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgICBxdWFyYW50aW5lZDogcXVhcmFudGluZWRDb3VudCxcbiAgICAgICAgICBsb2FkZWQ6IHRoaXMuZW50cmllc1NpemVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM1MTogQ2hlY2sgaWYgcmV0ZW50aW9uIGVuZm9yY2VtZW50IHNob3VsZCBoYXBwZW4gb24gbG9hZFxuICAgICAgLy8gSU1QT1JUQU5UOiBSZXRlbnRpb24gZW5mb3JjZW1lbnQgaXMgbm93IG9wdC1pbiwgbm90IGF1dG9tYXRpY1xuICAgICAgLy8gTk9URTogV3JhcHBlZCBpbiB0cnkvY2F0Y2ggdG8gaGFuZGxlIHRlc3QgZW52aXJvbm1lbnRzIHdoZXJlIENvbmZpZ01hbmFnZXIgbWF5IG5vdCBiZSBpbml0aWFsaXplZFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmV0ZW50aW9uU2VydmljZSA9IE1lbW9yeS5nZXRSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlKCk7XG4gICAgICAgIGlmIChyZXRlbnRpb25TZXJ2aWNlPy5zaG91bGRFbmZvcmNlT25Mb2FkKCkpIHtcbiAgICAgICAgICAvLyBVc2VyIGhhcyBleHBsaWNpdGx5IGVuYWJsZWQgb24tbG9hZCBlbmZvcmNlbWVudFxuICAgICAgICAgIHRoaXMuZW5mb3JjZVJldGVudGlvblBvbGljeSgpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeV0gUmV0ZW50aW9uIHBvbGljeSBlbmZvcmNlZCBvbiBsb2FkIGZvciBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgICAgZW5mb3JjZW1lbnRNb2RlOiAnb25fbG9hZCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXRlbnRpb25TZXJ2aWNlPy5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgIC8vIFJldGVudGlvbiBpcyBlbmFibGVkIGJ1dCBub3Qgc2V0IHRvIG9uX2xvYWQgbW9kZSAtIGxvZyBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeV0gUmV0ZW50aW9uIGlzIGVuYWJsZWQgYnV0IG5vdCBlbmZvcmNlZCBvbiBsb2FkIGZvciBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgICAgbm90ZTogJ1VzZSBleHBsaWNpdCBlbmZvcmNlbWVudCBjb21tYW5kIHRvIGNsZWFudXAgZXhwaXJlZCBlbnRyaWVzJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHJldGVudGlvblNlcnZpY2UgaXMgbm90IGNvbmZpZ3VyZWQgb3IgZGlzYWJsZWQsIG5vIGVuZm9yY2VtZW50IGhhcHBlbnNcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2FmZSBkZWZhdWx0IC0gbm90aGluZyBpcyBkZWxldGVkIHdpdGhvdXQgZXhwbGljaXQgY29uc2VudFxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSByZXRlbnRpb24gcG9saWN5IGVycm9ycyBkdXJpbmcgZGVzZXJpYWxpemF0aW9uXG4gICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpbiB0ZXN0IGVudmlyb25tZW50cyB3aGVyZSBDb25maWdNYW5hZ2VyIGlzIG5vdCBpbml0aWFsaXplZCxcbiAgICAgICAgLy8gb3Igd2hlbiBhIHN0YWxlIHJlc29sdmVyIHJlZmVyZW5jZXMgYSBkaXNwb3NlZCBzZXJ2aWNlIGluc3RhbmNlXG4gICAgICAgIC8vIEl0J3Mgc2FmZSB0byBza2lwIHJldGVudGlvbiBlbmZvcmNlbWVudCBpbiB0aGVzZSBjYXNlcyAtIHRoZSBkZWZhdWx0IGlzIG5vIGRlbGV0aW9uXG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9ERVNFUklBTElaRV9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZXNlcmlhbGl6ZScsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgbWVtb3J5OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBcbiAgcHJpdmF0ZSBjYWxjdWxhdGVFeHBpcnlEYXRlKCk6IERhdGUge1xuICAgIGNvbnN0IGV4cGlyeSA9IG5ldyBEYXRlKCk7XG4gICAgZXhwaXJ5LnNldERhdGUoZXhwaXJ5LmdldERhdGUoKSArIHRoaXMucmV0ZW50aW9uRGF5cyk7XG4gICAgcmV0dXJuIGV4cGlyeTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzYW5pdGl6ZVRhZ3ModGFnczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBMaW1pdCBudW1iZXIgb2YgdGFncyBhbmQgc2FuaXRpemUgZWFjaFxuICAgIGNvbnN0IGxpbWl0ZWRUYWdzID0gdGFncy5zbGljZSgwLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdTX1BFUl9FTlRSWSk7XG4gICAgXG4gICAgcmV0dXJuIGxpbWl0ZWRUYWdzXG4gICAgICAubWFwKHRhZyA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh0YWcpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgICAgICByZXR1cm4gc2FuaXRpemVJbnB1dChub3JtYWxpemVkLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdfTEVOR1RIKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHRhZyA9PiB0YWcgJiYgdGFnLmxlbmd0aCA+IDApO1xuICB9XG4gIFxuICBwcml2YXRlIHNhbml0aXplTWV0YWRhdGEobWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFtZXRhZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIG1ldGFkYXRhIHZhbHVlc1xuICAgIGNvbnN0IHNhbml0aXplZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IG1heEtleXMgPSBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9LRVlTO1xuICAgIGxldCBrZXlDb3VudCA9IDA7XG4gICAgXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpKSB7XG4gICAgICBpZiAoa2V5Q291bnQgPj0gbWF4S2V5cykgYnJlYWs7XG4gICAgICBcbiAgICAgIGNvbnN0IHNhbml0aXplZEtleSA9IHNhbml0aXplSW5wdXQoa2V5LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9LRVlfTEVOR1RIKTtcbiAgICAgIGlmIChzYW5pdGl6ZWRLZXkgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzYW5pdGl6ZWRbc2FuaXRpemVkS2V5XSA9IHNhbml0aXplSW5wdXQodmFsdWUsIE1FTU9SWV9DT05TVEFOVFMuTUFYX01FVEFEQVRBX1ZBTFVFX0xFTkdUSCk7XG4gICAgICAgIGtleUNvdW50Kys7XG4gICAgICB9IGVsc2UgaWYgKHNhbml0aXplZEtleSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNhbml0aXplZFtzYW5pdGl6ZWRLZXldID0gdmFsdWU7XG4gICAgICAgIGtleUNvdW50Kys7XG4gICAgICB9XG4gICAgICAvLyBTa2lwIG90aGVyIHR5cGVzIGZvciBzZWN1cml0eVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG4gIFxuICBwcml2YXRlIGNhbkFjY2Vzc1ByaXZhY3lMZXZlbChlbnRyeUxldmVsOiBzdHJpbmcsIHJlcXVlc3RlZExldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZXZlbHMgPSBNRU1PUllfQ09OU1RBTlRTLlBSSVZBQ1lfTEVWRUxTO1xuICAgIGNvbnN0IGVudHJ5SW5kZXggPSBsZXZlbHMuaW5kZXhPZihlbnRyeUxldmVsIGFzIFByaXZhY3lMZXZlbCk7XG4gICAgY29uc3QgcmVxdWVzdGVkSW5kZXggPSBsZXZlbHMuaW5kZXhPZihyZXF1ZXN0ZWRMZXZlbCBhcyBQcml2YWN5TGV2ZWwpO1xuICAgIFxuICAgIC8vIENhbiBvbmx5IGFjY2VzcyBlbnRyaWVzIGF0IG9yIGJlbG93IHRoZSByZXF1ZXN0ZWQgcHJpdmFjeSBsZXZlbFxuICAgIC8vIGUuZy4sIGlmIHJlcXVlc3RpbmcgJ3ByaXZhdGUnLCBjYW4gc2VlICdwdWJsaWMnIGFuZCAncHJpdmF0ZScgYnV0IG5vdCAnc2Vuc2l0aXZlJ1xuICAgIHJldHVybiBlbnRyeUluZGV4IDw9IHJlcXVlc3RlZEluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkRW50cnkoZW50cnk6IHVua25vd24pOiBlbnRyeSBpcyBNZW1vcnlFbnRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIGVudHJ5ICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgKGVudHJ5IGFzIGFueSkuaWQgPT09ICdzdHJpbmcnICYmXG4gICAgICB0eXBlb2YgKGVudHJ5IGFzIGFueSkuY29udGVudCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIChlbnRyeSBhcyBhbnkpLnRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoIShlbnRyeSBhcyBhbnkpLnRhZ3MgfHwgQXJyYXkuaXNBcnJheSgoZW50cnkgYXMgYW55KS50YWdzKSk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW1pemVkIHNhbml0aXphdGlvbiB3aXRoIGNoZWNrc3VtIGNhY2hpbmdcbiAgICogQXZvaWRzIHJlLXNhbml0aXppbmcgY29udGVudCB0aGF0IGhhc24ndCBjaGFuZ2VkXG4gICAqIEBwYXJhbSBjb250ZW50IENvbnRlbnQgdG8gc2FuaXRpemVcbiAgICogQHBhcmFtIG1heExlbmd0aCBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplV2l0aENhY2hlKGNvbnRlbnQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIC8vIEdlbmVyYXRlIGNoZWNrc3VtIGZvciB0aGUgaW5wdXRcbiAgICBjb25zdCBjaGVja3N1bSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoY29udGVudCkuZGlnZXN0KCdoZXgnKTtcblxuICAgIC8vIENoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgc2FuaXRpemVkIHRoaXMgZXhhY3QgY29udGVudFxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y2hlY2tzdW19OiR7bWF4TGVuZ3RofWA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBzYW5pdGl6YXRpb25cbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZU1lbW9yeUNvbnRlbnQoY29udGVudCwgbWF4TGVuZ3RoKTtcblxuICAgIC8vIENhY2hlIHRoZSByZXN1bHQgKGxpbWl0IGNhY2hlIHNpemUgdG8gcHJldmVudCBtZW1vcnkgaXNzdWVzKVxuICAgIGlmICh0aGlzLnNhbml0aXphdGlvbkNhY2hlLnNpemUgPiAxMDAwKSB7XG4gICAgICAvLyBSZW1vdmUgb2xkZXN0IGVudHJpZXMgKHNpbXBsZSBGSUZPKVxuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLnNhbml0aXphdGlvbkNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkpIHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICB9XG4gICAgdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5zZXQoY2FjaGVLZXksIHNhbml0aXplZCk7XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHNlYXJjaCBpbmRleCB3aXRoIHJldHJ5IGxvZ2ljXG4gICAqIEF0dGVtcHRzIHRvIGJ1aWxkIHRoZSBpbmRleCB1cCB0byAzIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICAgKiBUaGlzIGVuc3VyZXMgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgZXZlbiBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU2VhcmNoSW5kZXhXaXRoUmV0cnkocmV0cmllcyA9IDMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZWFyY2hJbmRleC5idWlsZEluZGV4KHRoaXMuZW50cmllcyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgU2VhcmNoIGluZGV4IGJ1aWx0IHN1Y2Nlc3NmdWxseSBvbiBhdHRlbXB0ICR7YXR0ZW1wdH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xuICAgICAgICBsb2dnZXIud2FybihgU2VhcmNoIGluZGV4IGJ1aWxkIGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWRgLCB7XG4gICAgICAgICAgZXJyb3I6IGxhc3RFcnJvci5tZXNzYWdlLFxuICAgICAgICAgIGVudHJpZXNDb3VudDogdGhpcy5lbnRyaWVzU2l6ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXR0ZW1wdCA8IHJldHJpZXMpIHtcbiAgICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmOiAxMDBtcywgMjAwbXMsIDQwMG1zXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSkgKiAxMDA7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIHJldHJpZXMgZmFpbGVkXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcignRmFpbGVkIHRvIGJ1aWxkIHNlYXJjaCBpbmRleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW50cmllcyB3aXRoIGEgc3BlY2lmaWMgdHJ1c3QgbGV2ZWxcbiAgICogRklYICMxMzIwOiBQdWJsaWMgQVBJIGZvciBhY2Nlc3NpbmcgZW50cmllcyBieSB0cnVzdCBsZXZlbFxuICAgKiBVc2VkIGJ5IEJhY2tncm91bmRWYWxpZGF0b3IgdG8gZmluZCB1bnRydXN0ZWQgZW50cmllc1xuICAgKlxuICAgKiBAcGFyYW0gdHJ1c3RMZXZlbCAtIFRoZSB0cnVzdCBsZXZlbCB0byBmaWx0ZXIgYnlcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbWVtb3J5IGVudHJpZXMgbWF0Y2hpbmcgdGhlIHRydXN0IGxldmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0RW50cmllc0J5VHJ1c3RMZXZlbCh0cnVzdExldmVsOiBUcnVzdExldmVsKTogTWVtb3J5RW50cnlbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50cnVzdExldmVsID09PSB0cnVzdExldmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVudHJpZXMgaW4gdGhpcyBtZW1vcnlcbiAgICogRklYICMxMzIwOiBQdWJsaWMgQVBJIGZvciBhY2Nlc3NpbmcgYWxsIGVudHJpZXNcbiAgICogUmVwbGFjZXMgdGhlIG5lZWQgZm9yIGAobWVtb3J5IGFzIGFueSkuZW50cmllc2AgaGFja3NcbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2YgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsRW50cmllcygpOiBNZW1vcnlFbnRyeVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZW50cmllcyBtYXAgZGlyZWN0bHlcbiAgICogVXNlZCBieSBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIGZvciByZXRlbnRpb24gZW5mb3JjZW1lbnQgKElzc3VlICM1MSlcbiAgICpcbiAgICogQHJldHVybnMgTWFwIG9mIGVudHJ5IElEIHRvIG1lbW9yeSBlbnRyeVxuICAgKi9cbiAgcHVibGljIGdldEVudHJpZXMoKTogTWFwPHN0cmluZywgTWVtb3J5RW50cnk+IHtcbiAgICAvLyBSZXR1cm4gYSBuZXcgTWFwIHRvIHByZXZlbnQgZXh0ZXJuYWwgbW9kaWZpY2F0aW9uIG9mIGludGVybmFsIHN0YXRlXG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5lbnRyaWVzLmVudHJpZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc3BlY2lmaWMgZW50cnkgYnkgSURcbiAgICogRklYICM1MTogUHVibGljIEFQSSBmb3IgcmV0ZW50aW9uIHBvbGljeSB0byByZW1vdmUgZXhwaXJlZCBlbnRyaWVzXG4gICAqIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBgKG1lbW9yeSBhcyBhbnkpLmVudHJpZXMuZGVsZXRlKClgIGhhY2tzXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeUlkIC0gVGhlIElEIG9mIHRoZSBlbnRyeSB0byByZW1vdmVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBlbnRyeSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGZvdW5kXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnlJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuZW50cmllcy5kZWxldGUoZW50cnlJZCk7XG4gICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgIC8vIElzc3VlICMyMzI5OiBrZWVwIHRoZSBzZWFyY2ggaW5kZXggY29uc2lzdGVudCB3aXRoIHRoZSBlbnRyaWVzIG1hcCDigJRcbiAgICAgIC8vIHByZXZpb3VzbHkgcmVtb3ZlZCBlbnRyaWVzIHN0YXllZCBzZWFyY2hhYmxlIHVudGlsIGEgZnVsbCBpbmRleCByZWJ1aWxkLlxuICAgICAgdGhpcy5zZWFyY2hJbmRleC5yZW1vdmVFbnRyeShlbnRyeUlkKTtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gaXRlcmF0b3Igb3ZlciBhbGwgZW50cmllc1xuICAgKiBGSVggIzEzMjA6IE1lbW9yeS1lZmZpY2llbnQgd2F5IHRvIGl0ZXJhdGUgZW50cmllc1xuICAgKlxuICAgKiBAcmV0dXJucyBJdGVyYXRvciBvdmVyIG1lbW9yeSBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgKmdldEVudHJpZXNJdGVyYXRvcigpOiBJdGVyYWJsZUl0ZXJhdG9yPE1lbW9yeUVudHJ5PiB7XG4gICAgeWllbGQqIHRoaXMuZW50cmllcy52YWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZpbGUgcGF0aCBmb3IgdGhpcyBtZW1vcnlcbiAgICogRklYICMxMzIwOiBVc2VkIGJ5IE1lbW9yeU1hbmFnZXIgYWZ0ZXIgbG9hZGluZ1xuICAgKiBGSVggKFNvbmFyQ2xvdWQpOiBBZGRlZCBpbnB1dCB2YWxpZGF0aW9uIHdpdGggcHJvcGVyIGVycm9yIHR5cGVzXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGZpbGUgcGF0aCB3aGVyZSB0aGlzIG1lbW9yeSBpcyBzdG9yZWRcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBwYXRoIGlzIG5vdCBhIHN0cmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgcGF0aCBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIHNldEZpbGVQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01lbW9yeSBmaWxlIHBhdGggbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAocGF0aC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBmaWxlIHBhdGggY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuICAgIHRoaXMuZmlsZVBhdGggPSBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZSBwYXRoIGZvciB0aGlzIG1lbW9yeVxuICAgKiBGSVggIzEzMjA6IFJldHVybnMgdGhlIHBhdGggd2hlcmUgdGhpcyBtZW1vcnkgaXMgc3RvcmVkXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCBpZiBub3QgeWV0IHBlcnNpc3RlZFxuICAgKi9cbiAgcHVibGljIGdldEZpbGVQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVBhdGg7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGlzIG1lbW9yeSB0byBkaXNrXG4gICAqIEZJWCAjMTMyMDogSW5zdGFuY2UgbWV0aG9kIGZvciBwZXJzaXN0aW5nIG1lbW9yeSBjaGFuZ2VzXG4gICAqIFVzZWQgYnkgQmFja2dyb3VuZFZhbGlkYXRvciB0byBzYXZlIHVwZGF0ZWQgdHJ1c3QgbGV2ZWxzXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNhdmUgaXMgY29tcGxldGVcbiAgICogQHRocm93cyB7RXJyb3J9IElmIG1lbW9yeSBoYXMgbm90IGJlZW4gbG9hZGVkIGZyb20gZmlsZSBhbmQgbm8gcGF0aCBpcyBzZXRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBNZW1vcnkuZ2V0TWVtb3J5TWFuYWdlcigpO1xuICAgIGF3YWl0IG1hbmFnZXIuc2F2ZSh0aGlzLCB0aGlzLmZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCBtZW1vcmllcyB0aGF0IGhhdmUgZW50cmllcyB3aXRoIGEgc3BlY2lmaWMgdHJ1c3QgbGV2ZWxcbiAgICogRklYICMxMzIwOiBTdGF0aWMgcXVlcnkgQVBJIGZvciBmaW5kaW5nIG1lbW9yaWVzIGJ5IHRydXN0IGxldmVsXG4gICAqIFVzZWQgYnkgQmFja2dyb3VuZFZhbGlkYXRvciB0byBkaXNjb3ZlciB1bnRydXN0ZWQgbWVtb3JpZXNcbiAgICpcbiAgICogQHBhcmFtIHRydXN0TGV2ZWwgLSBUaGUgdHJ1c3QgbGV2ZWwgdG8gZmlsdGVyIGJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcXVlcnkgb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucy5saW1pdCAtIE1heGltdW0gbnVtYmVyIG9mIG1lbW9yaWVzIHRvIHJldHVyblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhcnJheSBvZiBtZW1vcmllcyB3aXRoIG1hdGNoaW5nIGVudHJpZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZEJ5VHJ1c3RMZXZlbChcbiAgICB0cnVzdExldmVsOiBUcnVzdExldmVsLFxuICAgIG9wdGlvbnM/OiB7IGxpbWl0PzogbnVtYmVyIH1cbiAgKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBNZW1vcnkuZ2V0TWVtb3J5TWFuYWdlcigpO1xuXG4gICAgLy8gTG9hZCBhbGwgbWVtb3JpZXMgYW5kIGZpbHRlciBieSB0cnVzdCBsZXZlbFxuICAgIGNvbnN0IGFsbE1lbW9yaWVzID0gYXdhaXQgbWFuYWdlci5saXN0KCk7XG4gICAgY29uc3QgbWF0Y2hpbmdNZW1vcmllczogTWVtb3J5W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIGFsbE1lbW9yaWVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIG1lbW9yeSBoYXMgYW55IGVudHJpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHRydXN0IGxldmVsXG4gICAgICBjb25zdCBoYXNNYXRjaGluZ0VudHJpZXMgPSBtZW1vcnkuZ2V0RW50cmllc0J5VHJ1c3RMZXZlbCh0cnVzdExldmVsKS5sZW5ndGggPiAwO1xuXG4gICAgICBpZiAoaGFzTWF0Y2hpbmdFbnRyaWVzKSB7XG4gICAgICAgIG1hdGNoaW5nTWVtb3JpZXMucHVzaChtZW1vcnkpO1xuXG4gICAgICAgIC8vIEFwcGx5IGxpbWl0IGlmIHNwZWNpZmllZFxuICAgICAgICBpZiAob3B0aW9ucz8ubGltaXQgJiYgbWF0Y2hpbmdNZW1vcmllcy5sZW5ndGggPj0gb3B0aW9ucy5saW1pdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBtZW1vcmllcyB3aXRoIHRydXN0IGxldmVsJywge1xuICAgICAgdHJ1c3RMZXZlbCxcbiAgICAgIGNvdW50OiBtYXRjaGluZ01lbW9yaWVzLmxlbmd0aCxcbiAgICAgIGxpbWl0OiBvcHRpb25zPy5saW1pdFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hdGNoaW5nTWVtb3JpZXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBxdWVyeSBBUEkgZm9yIGZpbmRpbmcgbWVtb3JpZXNcbiAgICogRklYICMxMzIwOiBGbGV4aWJsZSBxdWVyeSBBUEkgZm9yIG11bHRpcGxlIGNyaXRlcmlhXG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IFJlZmFjdG9yZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IGZyb20gMjAgdG8gOFxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gUXVlcnkgZmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBmaWx0ZXIudHJ1c3RMZXZlbCAtIEZpbHRlciBieSB0cnVzdCBsZXZlbFxuICAgKiBAcGFyYW0gZmlsdGVyLnRhZ3MgLSBGaWx0ZXIgYnkgdGFnc1xuICAgKiBAcGFyYW0gZmlsdGVyLm1heEFnZSAtIEZpbHRlciBieSBhZ2UgaW4gZGF5c1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhcnJheSBvZiBtYXRjaGluZyBtZW1vcmllc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kKGZpbHRlcjoge1xuICAgIHRydXN0TGV2ZWw/OiBUcnVzdExldmVsO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBtYXhBZ2U/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1lbW9yeS5nZXRNZW1vcnlNYW5hZ2VyKCk7XG5cbiAgICAvLyBMb2FkIGFsbCBtZW1vcmllc1xuICAgIGNvbnN0IGFsbE1lbW9yaWVzID0gYXdhaXQgbWFuYWdlci5saXN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgY3V0b2ZmIGRhdGUgaWYgbWF4QWdlIGlzIHNwZWNpZmllZFxuICAgIGNvbnN0IGN1dG9mZkRhdGUgPSBmaWx0ZXIubWF4QWdlXG4gICAgICA/IG5ldyBEYXRlKERhdGUubm93KCkgLSBmaWx0ZXIubWF4QWdlICogMjQgKiA2MCAqIDYwICogMTAwMClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gRmlsdGVyIG1lbW9yaWVzIHVzaW5nIGhlbHBlciBtZXRob2RcbiAgICBjb25zdCByZXN1bHRzID0gYWxsTWVtb3JpZXMuZmlsdGVyKG1lbW9yeSA9PlxuICAgICAgdGhpcy5tYXRjaGVzRmlsdGVyKG1lbW9yeSwgZmlsdGVyLCBjdXRvZmZEYXRlKVxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoJ01lbW9yeSBxdWVyeSBjb21wbGV0ZScsIHtcbiAgICAgIGZpbHRlcixcbiAgICAgIHJlc3VsdENvdW50OiByZXN1bHRzLmxlbmd0aFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtZW1vcnkgbWF0Y2hlcyB0aGUgZ2l2ZW4gZmlsdGVyIGNyaXRlcmlhXG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG1hdGNoZXNGaWx0ZXIoXG4gICAgbWVtb3J5OiBNZW1vcnksXG4gICAgZmlsdGVyOiB7IHRydXN0TGV2ZWw/OiBUcnVzdExldmVsOyB0YWdzPzogc3RyaW5nW107IG1heEFnZT86IG51bWJlciB9LFxuICAgIGN1dG9mZkRhdGU/OiBEYXRlXG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIEZpbHRlciBieSB0cnVzdCBsZXZlbFxuICAgIGlmIChmaWx0ZXIudHJ1c3RMZXZlbCkge1xuICAgICAgY29uc3QgaGFzTWF0Y2hpbmdUcnVzdExldmVsID0gbWVtb3J5LmdldEVudHJpZXNCeVRydXN0TGV2ZWwoZmlsdGVyLnRydXN0TGV2ZWwpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoIWhhc01hdGNoaW5nVHJ1c3RMZXZlbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGJ5IHRhZ3NcbiAgICBpZiAoZmlsdGVyLnRhZ3MgJiYgZmlsdGVyLnRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWVtb3J5VGFncyA9IG1lbW9yeS5tZXRhZGF0YS50YWdzIHx8IFtdO1xuICAgICAgY29uc3QgaGFzTWF0Y2hpbmdUYWcgPSBmaWx0ZXIudGFncy5zb21lKHRhZyA9PiBtZW1vcnlUYWdzLmluY2x1ZGVzKHRhZykpO1xuICAgICAgaWYgKCFoYXNNYXRjaGluZ1RhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGJ5IGFnZVxuICAgIGlmIChjdXRvZmZEYXRlKSB7XG4gICAgICBjb25zdCBzdGF0cyA9IG1lbW9yeS5nZXRTdGF0cygpO1xuICAgICAgaWYgKCFzdGF0cy5uZXdlc3RFbnRyeSB8fCBzdGF0cy5uZXdlc3RFbnRyeSA8IGN1dG9mZkRhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|
|
1170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVqRSwwRkFBMEY7QUFDMUYsaURBQWlEO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBZ0MsWUFBWSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXRFOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCOzs7O0dBSUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLHFCQUFxQixDQUFDO0FBRXZELGtDQUFrQztB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O0lBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtb3J5IEVsZW1lbnQgLSBQZXJzaXN0ZW50IGNvbnRleHQgc3RvcmFnZSBmb3IgY29udGludWl0eSBhbmQgbGVhcm5pbmdcbiAqIFxuICogUHJvdmlkZXMgbXVsdGlwbGUgc3RvcmFnZSBiYWNrZW5kcywgcmV0ZW50aW9uIHBvbGljaWVzLCBhbmQgc2VhcmNoIGNhcGFiaWxpdGllc1xuICogZm9yIG1haW50YWluaW5nIGNvbnRleHQgYWNyb3NzIHNlc3Npb25zIGFuZCBpbnRlcmFjdGlvbnMuXG4gKiBcbiAqIFNFQ1VSSVRZIE1FQVNVUkVTIElNUExFTUVOVEVEOlxuICogMS4gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgbWVtb3J5IGNvbnRlbnRcbiAqIDIuIE1lbW9yeSBzaXplIGxpbWl0cyB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAqIDMuIFBhdGggdmFsaWRhdGlvbiBmb3IgZmlsZS1iYXNlZCBzdG9yYWdlXG4gKiA0LiBSZXRlbnRpb24gcG9saWN5IGVuZm9yY2VtZW50XG4gKiA1LiBQcml2YWN5IGxldmVsIGFjY2VzcyBjb250cm9sXG4gKiA2LiBBdWRpdCBsb2dnaW5nIGZvciBhbGwgb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IEJhc2VFbGVtZW50LCBub3JtYWxpemVWZXJzaW9uIH0gZnJvbSAnLi4vQmFzZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnQsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0LCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG4vLyBGSVggIzEzMTU6IENvbnRlbnRWYWxpZGF0b3Igbm8gbG9uZ2VyIHVzZWQgaW4gYWRkRW50cnkgKG1vdmVkIHRvIGJhY2tncm91bmQgdmFsaWRhdGlvbilcbi8vIEltcG9ydCByZW1vdmVkIHRvIGNsZWFuIHVwIHVudXNlZCBkZXBlbmRlbmNpZXNcbmltcG9ydCB7IE1FTU9SWV9DT05TVEFOVFMsIE1FTU9SWV9TRUNVUklUWV9FVkVOVFMsIFByaXZhY3lMZXZlbCwgU3RvcmFnZUJhY2tlbmQsIFRSVVNUX0xFVkVMUywgVHJ1c3RMZXZlbCB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1lbW9yeVR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWVtb3J5SWQgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IE1lbW9yeVNlYXJjaEluZGV4LCBTZWFyY2hRdWVyeSwgU2VhcmNoSW5kZXhDb25maWcgfSBmcm9tICcuL01lbW9yeVNlYXJjaEluZGV4LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5pbXBvcnQgeyBKU0RPTSB9IGZyb20gJ2pzZG9tJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuXG4vKipcbiAqIE1heGltdW0gbGVuZ3RoIGZvciBpbmRpdmlkdWFsIHRyaWdnZXIgd29yZHMgdXNlZCBpbiBFbmhhbmNlZCBJbmRleFxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmNvbnN0IE1BWF9UUklHR0VSX0xFTkdUSCA9IDUwO1xuXG4vKipcbiAqIFZhbGlkYXRpb24gcGF0dGVybiBmb3IgdHJpZ2dlciB3b3Jkc1xuICogQWxsb3dzIGFscGhhbnVtZXJpYywgaHlwaGVucywgdW5kZXJzY29yZXMsIEAgKG1lbnRpb25zL2VtYWlscyksIC4gKGRvbWFpbnMpXG4gKiBAY29uc3RhbnQge1JlZ0V4cH1cbiAqL1xuY29uc3QgVFJJR0dFUl9WQUxJREFUSU9OX1JFR0VYID0gL15bYS16QS1aMC05XFwtX0AuXSskLztcblxuLy8gSW5pdGlhbGl6ZSBET01QdXJpZnkgd2l0aCBKU0RPTVxuY29uc3Qgd2luZG93ID0gbmV3IEpTRE9NKCcnKS53aW5kb3c7XG5jb25zdCBwdXJpZnkgPSBET01QdXJpZnkod2luZG93IGFzIGFueSk7XG5cbi8vIENvbmZpZ3VyZSBET01QdXJpZnkgZm9yIG1lbW9yeSBjb250ZW50IC0gc3RyaXAgYWxsIEhUTUwgYnV0IGtlZXAgdGV4dFxucHVyaWZ5LnNldENvbmZpZyh7XG4gIEFMTE9XRURfVEFHUzogW10sICAvLyBObyBIVE1MIHRhZ3MgYWxsb3dlZFxuICBBTExPV0VEX0FUVFI6IFtdLCAgLy8gTm8gYXR0cmlidXRlcyBhbGxvd2VkXG4gIEtFRVBfQ09OVEVOVDogdHJ1ZSAvLyBLZWVwIHRleHQgY29udGVudFxufSk7XG5cbi8qKlxuICogU2FuaXRpemUgY29udGVudCBmb3IgbWVtb3J5IHN0b3JhZ2VcbiAqIE1vcmUgcGVybWlzc2l2ZSB0aGFuIHNhbml0aXplSW5wdXQgLSBhbGxvd3MgcHVuY3R1YXRpb24sIHF1b3RlcywgZXRjLlxuICogYnV0IHN0aWxsIHByZXZlbnRzIFhTUyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50IHx8IHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBcbiAgLy8gRmlyc3Qgbm9ybWFsaXplIFVuaWNvZGVcbiAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbnRlbnQpLm5vcm1hbGl6ZWRDb250ZW50O1xuICBcbiAgLy8gVXNlIERPTVB1cmlmeSB0byBzdHJpcCBhbnkgSFRNTC9YU1MgYXR0ZW1wdHMgYnV0IGtlZXAgdGV4dFxuICBjb25zdCBjbGVhbmVkID0gcHVyaWZ5LnNhbml0aXplKG5vcm1hbGl6ZWQpO1xuICBcbiAgLy8gUmVtb3ZlIG9ubHkgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBudWxsIGJ5dGVzXG4gIHJldHVybiBjbGVhbmVkXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gSW50ZW50aW9uYWxseSByZW1vdmluZyBjb250cm9sIGNoYXJzIGV4Y2VwdCBcXHQgXFxuIFxcciBmb3Igc2FuaXRpemF0aW9uXG4gICAgLnJlcGxhY2VBbGwoL1tcXHUwMDAwLVxcdTAwMDhcXHUwMDBCXFx1MDAwQ1xcdTAwMEUtXFx1MDAxRlxcdTAwN0ZdL2csICcnKSAvLyBOT1NPTkFSXG4gICAgLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpXG4gICAgLnRyaW0oKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlNZXRhZGF0YSBleHRlbmRzIElFbGVtZW50TWV0YWRhdGEge1xuICBzdG9yYWdlQmFja2VuZD86IFN0b3JhZ2VCYWNrZW5kO1xuICByZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICBlbmNyeXB0aW9uRW5hYmxlZD86IGJvb2xlYW47XG4gIC8vIFNlYXJjaCBpbmRleCBjb25maWd1cmF0aW9uIChJc3N1ZSAjOTg0KVxuICBpbmRleFRocmVzaG9sZD86IG51bWJlcjtcbiAgZW5hYmxlQ29udGVudEluZGV4PzogYm9vbGVhbjtcbiAgbWF4VGVybXNQZXJFbnRyeT86IG51bWJlcjtcbiAgbWluVGVybUxlbmd0aD86IG51bWJlcjtcbiAgLy8gVHJpZ2dlciB3b3JkcyBmb3IgRW5oYW5jZWQgSW5kZXggKElzc3VlICMxMTI0KVxuICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAvLyBBdXRvLWxvYWQgY29uZmlndXJhdGlvbiAoSXNzdWUgIzE0MzApXG4gIGF1dG9Mb2FkPzogYm9vbGVhbjtcbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIC8vIE1lbW9yeSB0eXBlIGNsYXNzaWZpY2F0aW9uIGZvciBmb2xkZXIgb3JnYW5pemF0aW9uXG4gIG1lbW9yeVR5cGU/OiBNZW1vcnlUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeUVudHJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBEYXRlO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG4gIC8vIEZJWCAjMTI2OTogVHJ1c3QgbGV2ZWwgZm9yIGNvbnRlbnQgc2VjdXJpdHlcbiAgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7XG4gIHNhbml0aXplZFBhdHRlcm5zPzogdW5rbm93bltdO1xuICBzYW5pdGl6ZWRDb250ZW50Pzogc3RyaW5nO1xuICAvLyBTb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRydXN0IGRlY2lzaW9uc1xuICBzb3VyY2U/OiBzdHJpbmc7ICAvLyBlLmcuLCAndXNlcicsICd3ZWItc2NyYXBlJywgJ2FnZW50JywgJ2FwaSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlTZWFyY2hPcHRpb25zIHtcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgc3RhcnREYXRlPzogRGF0ZTtcbiAgZW5kRGF0ZT86IERhdGU7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG59XG5cbi8qKlxuICogTWVtb3J5IEVsZW1lbnQgSW1wbGVtZW50YXRpb25cbiAqXG4gKiBUT0RPOiBNZW1vcnkgU2hhcmRpbmcgU3RyYXRlZ3kgKElzc3VlICM5ODEpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEN1cnJlbnQ6IFNpbmdsZSBNYXA8aWQsIGVudHJ5PiBmb3IgYWxsIG1lbW9yaWVzXG4gKiBQcm9ibGVtOiBMYXJnZSBtZW1vcnkgc2V0cyAoPjEwSyBlbnRyaWVzKSBjYXVzZSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICpcbiAqIFBsYW5uZWQgU2hhcmRpbmcgQXJjaGl0ZWN0dXJlOlxuICogMS4gU2hhcmQgbWVtb3JpZXMgYWNyb3NzIG11bHRpcGxlIGZpbGVzIGJhc2VkIG9uIGhhc2gobWVtb3J5SWQpICUgc2hhcmRDb3VudFxuICogMi4gRWFjaCBzaGFyZCBmaWxlIDwyNTZLQiBmb3Igb3B0aW1hbCBZQU1MIHBhcnNpbmdcbiAqIDMuIE1lbW9yeSByZWZlcmVuY2VzIHN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gY29udGVudCAobGlrZSBnaXQgb2JqZWN0cylcbiAqIDQuIExhcmdlIGJpbmFyeSBjb250ZW50IChQREZzLCBpbWFnZXMpIHN0b3JlZCBhcyBleHRlcm5hbCByZWZlcmVuY2VzXG4gKlxuICogQmVuZWZpdHM6XG4gKiAtIFBhcmFsbGVsIGxvYWRpbmcgb2YgbWVtb3J5IHNoYXJkc1xuICogLSBSZWR1Y2VkIG1lbW9yeSBmb290cHJpbnQgKGxvYWQgb25seSBuZWVkZWQgc2hhcmRzKVxuICogLSBCZXR0ZXIgY29ycnVwdGlvbiByZXNpc3RhbmNlIChvbmUgc2hhcmQgZmFpbHVyZSBkb2Vzbid0IGFmZmVjdCBvdGhlcnMpXG4gKiAtIEVmZmljaWVudCBpbmNyZW1lbnRhbCB1cGRhdGVzXG4gKlxuICogVE9ETzogQ29udGVudCBJbnRlZ3JpdHkgVmVyaWZpY2F0aW9uIChJc3N1ZSAjOTgyKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFkZCBTSEEtMjU2IGhhc2hlcyB0byBkZXRlY3Q6XG4gKiAtIEFjY2lkZW50YWwgY29ycnVwdGlvbiBmcm9tIGRpc2sgZXJyb3JzXG4gKiAtIEludGVudGlvbmFsIHRhbXBlcmluZyB3aXRoIG1lbW9yeSBmaWxlc1xuICogLSBWZXJzaW9uIGNvbmZsaWN0cyBkdXJpbmcgY29uY3VycmVudCBhY2Nlc3NcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbjpcbiAqIC0gU3RvcmUgaGFzaCBpbiBtZW1vcnkgbWV0YWRhdGFcbiAqIC0gVmVyaWZ5IG9uIGxvYWQsIHdhcm4gb24gbWlzbWF0Y2hcbiAqIC0gT3B0aW9uIHRvIGF1dG8tcmVzdG9yZSBmcm9tIGJhY2t1cCBvbiBjb3JydXB0aW9uXG4gKlxuICogVE9ETzogTWVtb3J5IENhcGFjaXR5IE1hbmFnZW1lbnQgKElzc3VlICM5ODMpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEN1cnJlbnQ6IFN5bmNocm9ub3VzIHJldGVudGlvbiBlbmZvcmNlbWVudCBvbiBlYWNoIGFkZFxuICogQmV0dGVyOiBCYWNrZ3JvdW5kIGNsZWFudXAgd2l0aCBzbWFydCB0cmlnZ2VyczpcbiAqIC0gQ2xlYW51cCB3aGVuIDkwJSBjYXBhY2l0eSByZWFjaGVkXG4gKiAtIEJhdGNoIGRlbGV0aW9ucyBmb3IgZWZmaWNpZW5jeVxuICogLSBMUlUgZXZpY3Rpb24gd2l0aCBhY2Nlc3MgdHJhY2tpbmdcbiAqIC0gUHJlc2VydmUgXCJwaW5uZWRcIiBtZW1vcmllcyByZWdhcmRsZXNzIG9mIGFnZVxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5IGV4dGVuZHMgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gIC8vIGluc3RydWN0aW9ucyBpbmhlcml0ZWQgZnJvbSBCYXNlRWxlbWVudCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgLy8gY29udGVudDogb3ZlcnJpZGRlbiBiZWxvdyB3aXRoIGEgY3VzdG9tIGdldHRlciB0aGF0IHJldHVybnMgZm9ybWF0dGVkIGVudHJpZXNcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjcmVhdGVkTWVtb3J5TmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgbWVtb3J5TWFuYWdlclJlc29sdmVyPzogKCkgPT4geyBsaXN0KCk6IFByb21pc2U8TWVtb3J5W10+OyBzYXZlKG1lbW9yeTogTWVtb3J5LCBmaWxlUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD47IH0gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyByZXNvbHZlciBmb3IgUmV0ZW50aW9uUG9saWN5U2VydmljZSAoSXNzdWUgIzUxKVxuICAgKiBVc2VkIHRvIGNoZWNrIGlmIHJldGVudGlvbiBlbmZvcmNlbWVudCBzaG91bGQgaGFwcGVuIG9uIGxvYWRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJldGVudGlvblBvbGljeVJlc29sdmVyPzogKCkgPT4geyBzaG91bGRFbmZvcmNlT25Mb2FkKCk6IGJvb2xlYW47IGlzRW5hYmxlZCgpOiBib29sZWFuOyB9IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29uZmlndXJlTWVtb3J5TWFuYWdlclJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IGxpc3QoKTogUHJvbWlzZTxNZW1vcnlbXT47IHNhdmUobWVtb3J5OiBNZW1vcnksIGZpbGVQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjsgfSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMubWVtb3J5TWFuYWdlclJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIHJlc29sdmVyIChJc3N1ZSAjNTEpXG4gICAqIENhbGxlZCBkdXJpbmcgREkgY29udGFpbmVyIHNldHVwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvbmZpZ3VyZVJldGVudGlvblBvbGljeVJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IHNob3VsZEVuZm9yY2VPbkxvYWQoKTogYm9vbGVhbjsgaXNFbmFibGVkKCk6IGJvb2xlYW47IH0gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnJldGVudGlvblBvbGljeVJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIHN0YXRpYyByZXNvbHZlcnMgKGZvciB0ZXN0IGNsZWFudXApXG4gICAqIENhbGwgdGhpcyBpbiBhZnRlckVhY2ggaG9va3MgdG8gcHJldmVudCB0ZXN0IGlzb2xhdGlvbiBpc3N1ZXNcbiAgICogd2hlcmUgYSBzdGFsZSByZXNvbHZlciByZWZlcmVuY2VzIGRpc3Bvc2VkIHNlcnZpY2VzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc2V0UmVzb2x2ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubWVtb3J5TWFuYWdlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIGluc3RhbmNlXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBjb25maWd1cmVkIChhbGxvd3MgZ3JhY2VmdWwgZmFsbGJhY2spXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlKCkge1xuICAgIGlmICghdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlcikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE1lbW9yeU1hbmFnZXIoKSB7XG4gICAgaWYgKCF0aGlzLm1lbW9yeU1hbmFnZXJSZXNvbHZlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIoKTtcbiAgICBpZiAoIW1hbmFnZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IG1hbmFnZXIgcmVzb2x2ZXIgcmV0dXJuZWQgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiBtYW5hZ2VyO1xuICB9XG4gIC8vIE1lbW9yeS1zcGVjaWZpYyBwcm9wZXJ0aWVzICh3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzKVxuICBwcml2YXRlIGVudHJpZXM6IExSVUNhY2hlPE1lbW9yeUVudHJ5PjtcbiAgcHJpdmF0ZSBzdG9yYWdlQmFja2VuZDogU3RvcmFnZUJhY2tlbmQ7XG4gIHByaXZhdGUgcmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBwcml2YXRlIHByaXZhY3lMZXZlbDogUHJpdmFjeUxldmVsO1xuICBwcml2YXRlIHNlYXJjaGFibGU6IGJvb2xlYW47XG4gIHByaXZhdGUgbWF4RW50cmllczogbnVtYmVyO1xuXG4gIC8vIFNlYXJjaCBpbmRleCBmb3IgcGVyZm9ybWFuY2UgKElzc3VlICM5ODQpXG4gIHByaXZhdGUgc2VhcmNoSW5kZXg6IE1lbW9yeVNlYXJjaEluZGV4O1xuXG4gIC8vIFNhbml0aXphdGlvbiBjYWNoZSB0byBhdm9pZCByZWR1bmRhbnQgcHJvY2Vzc2luZyAod2l0aCBzaXplIGxpbWl0cylcbiAgcHJpdmF0ZSBzYW5pdGl6YXRpb25DYWNoZTogTFJVQ2FjaGU8c3RyaW5nPjtcblxuICAvLyBGSVggIzEzMjA6IFN0b3JlIGZpbGUgcGF0aCBmb3IgcGVyc2lzdGVuY2VcbiAgcHJpdmF0ZSBmaWxlUGF0aD86IHN0cmluZztcblxuICAvLyBDYWNoZSBjb25maWd1cmF0aW9uIGNvbnN0YW50c1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfU0FOSVRJWkFUSU9OX0NBQ0hFX1NJWkUgPSA1MDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9TQU5JVElaQVRJT05fQ0FDSEVfTUVNT1JZX01CID0gNTtcbiAgXG4gIGNvbnN0cnVjdG9yKG1ldGFkYXRhOiBQYXJ0aWFsPE1lbW9yeU1ldGFkYXRhPiA9IHt9LCBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSkge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogU2FuaXRpemUgYWxsIGlucHV0cyBkdXJpbmcgY29uc3RydWN0aW9uXG4gICAgY29uc3Qgc2FuaXRpemVkTWV0YWRhdGEgPSB7XG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUgP1xuICAgICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApIDpcbiAgICAgICAgJ1VubmFtZWQgTWVtb3J5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbiA/XG4gICAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEuZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LCA1MDApIDpcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgLy8gRklYICMxMTI0OiBQcmVzZXJ2ZSB0cmlnZ2VycyBmb3IgRW5oYW5jZWQgSW5kZXhcbiAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBCRUZPUkUgc2FuaXRpemF0aW9uIHRvIHJlamVjdCBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgJ2JhZCF0cmlnZ2VyJyBmcm9tIGJlY29taW5nICdiYWR0cmlnZ2VyJyBhbmQgcGFzc2luZ1xuICAgICAgdHJpZ2dlcnM6IEFycmF5LmlzQXJyYXkobWV0YWRhdGEudHJpZ2dlcnMpID9cbiAgICAgICAgbWV0YWRhdGEudHJpZ2dlcnNcbiAgICAgICAgICAubWFwKHQgPT4gU3RyaW5nKHQpLnRyaW0oKSlcbiAgICAgICAgICAuZmlsdGVyKHQgPT4gdCAmJiBUUklHR0VSX1ZBTElEQVRJT05fUkVHRVgudGVzdCh0KSkgLy8gVmFsaWRhdGUgZm9ybWF0IEZJUlNUXG4gICAgICAgICAgLm1hcCh0ID0+IHNhbml0aXplSW5wdXQodCwgTUFYX1RSSUdHRVJfTEVOR1RIKSkgLy8gVGhlbiBzYW5pdGl6ZSBmb3IgbGVuZ3RoXG4gICAgICAgICAgLmZpbHRlcih0ID0+IHQpIDogLy8gUmVtb3ZlIGFueSB0aGF0IGJlY2FtZSBlbXB0eSBhZnRlciBzYW5pdGl6YXRpb25cbiAgICAgICAgW11cbiAgICB9O1xuXG4gICAgc3VwZXIoRWxlbWVudFR5cGUuTUVNT1JZLCBzYW5pdGl6ZWRNZXRhZGF0YSwgbWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIC8vIEluaXRpYWxpemUgbWVtb3J5LXNwZWNpZmljIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0c1xuICAgIHRoaXMuc3RvcmFnZUJhY2tlbmQgPSBtZXRhZGF0YS5zdG9yYWdlQmFja2VuZCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfU1RPUkFHRV9CQUNLRU5EO1xuICAgIHRoaXMucmV0ZW50aW9uRGF5cyA9IG1ldGFkYXRhLnJldGVudGlvbkRheXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTO1xuICAgIC8vIFZhbGlkYXRlIHByaXZhY3kgbGV2ZWwgLSBkZWZhdWx0IHRvIHByaXZhdGUgaWYgaW52YWxpZFxuICAgIHRoaXMucHJpdmFjeUxldmVsID0gKG1ldGFkYXRhLnByaXZhY3lMZXZlbCAmJiBNRU1PUllfQ09OU1RBTlRTLlBSSVZBQ1lfTEVWRUxTLmluY2x1ZGVzKG1ldGFkYXRhLnByaXZhY3lMZXZlbCkpXG4gICAgICA/IG1ldGFkYXRhLnByaXZhY3lMZXZlbFxuICAgICAgOiBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUFJJVkFDWV9MRVZFTDtcbiAgICB0aGlzLnNlYXJjaGFibGUgPSBtZXRhZGF0YS5zZWFyY2hhYmxlICE9PSBmYWxzZTtcbiAgICB0aGlzLm1heEVudHJpZXMgPSBNYXRoLm1pbihcbiAgICAgIG1ldGFkYXRhLm1heEVudHJpZXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxULFxuICAgICAgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUXG4gICAgKTtcblxuICAgIC8vIEluaXRpYWxpemUgTFJVIGNhY2hlcyB3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IExSVUNhY2hlPE1lbW9yeUVudHJ5Pih7XG4gICAgICBuYW1lOiAnbWVtb3J5LWVudHJpZXMnLFxuICAgICAgbWF4U2l6ZTogdGhpcy5tYXhFbnRyaWVzLFxuICAgICAgbWF4TWVtb3J5TUI6IDI1LCAvLyBNYXggMjVNQiBmb3IgbWVtb3J5IGVudHJpZXNcbiAgICB9KTtcblxuICAgIHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nPih7XG4gICAgICBuYW1lOiAnbWVtb3J5LXNhbml0aXphdGlvbicsXG4gICAgICBtYXhTaXplOiBNZW1vcnkuTUFYX1NBTklUSVpBVElPTl9DQUNIRV9TSVpFLFxuICAgICAgbWF4TWVtb3J5TUI6IE1lbW9yeS5NQVhfU0FOSVRJWkFUSU9OX0NBQ0hFX01FTU9SWV9NQixcbiAgICB9KTtcblxuICAgIC8vIEZJWCAjMTQzMDogVXBkYXRlIG1ldGFkYXRhIHRvIGluY2x1ZGUgYWxsIE1lbW9yeU1ldGFkYXRhIGZpZWxkc1xuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGV5IGFyZSBwcmVzZXJ2ZWQgd2hlbiBzZXJpYWxpemVFbGVtZW50KCkgaXMgY2FsbGVkXG4gICAgLy8gUGVyIFRvZGQncyBzdWdnZXN0aW9uOiBzdG9yZSBhbGwgcnVudGltZSBwcm9wZXJ0aWVzIGluIG1ldGFkYXRhLCBub3QgZXh0ZW5zaW9uc1xuICAgIHRoaXMubWV0YWRhdGEgPSB7XG4gICAgICAuLi50aGlzLm1ldGFkYXRhLFxuICAgICAgc3RvcmFnZUJhY2tlbmQ6IHRoaXMuc3RvcmFnZUJhY2tlbmQsXG4gICAgICByZXRlbnRpb25EYXlzOiB0aGlzLnJldGVudGlvbkRheXMsXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgc2VhcmNoYWJsZTogdGhpcy5zZWFyY2hhYmxlLFxuICAgICAgbWF4RW50cmllczogdGhpcy5tYXhFbnRyaWVzLFxuICAgICAgYXV0b0xvYWQ6IG1ldGFkYXRhLmF1dG9Mb2FkLFxuICAgICAgcHJpb3JpdHk6IG1ldGFkYXRhLnByaW9yaXR5LFxuICAgICAgZW5jcnlwdGlvbkVuYWJsZWQ6IG1ldGFkYXRhLmVuY3J5cHRpb25FbmFibGVkIHx8IGZhbHNlXG4gICAgfSBhcyBNZW1vcnlNZXRhZGF0YTtcblxuICAgIC8vIFNldCB1cCBleHRlbnNpb25zIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgdGhpcy5leHRlbnNpb25zID0ge1xuICAgICAgc3RvcmFnZUJhY2tlbmQ6IHRoaXMuc3RvcmFnZUJhY2tlbmQsXG4gICAgICByZXRlbnRpb25EYXlzOiB0aGlzLnJldGVudGlvbkRheXMsXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgc2VhcmNoYWJsZTogdGhpcy5zZWFyY2hhYmxlLFxuICAgICAgbWF4RW50cmllczogdGhpcy5tYXhFbnRyaWVzLFxuICAgICAgZW5jcnlwdGlvbkVuYWJsZWQ6IG1ldGFkYXRhLmVuY3J5cHRpb25FbmFibGVkIHx8IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VhcmNoIGluZGV4IHdpdGggY29uZmlndXJhdGlvbiAoSXNzdWUgIzk4NClcbiAgICBjb25zdCBpbmRleENvbmZpZzogU2VhcmNoSW5kZXhDb25maWcgPSB7XG4gICAgICBpbmRleFRocmVzaG9sZDogbWV0YWRhdGEuaW5kZXhUaHJlc2hvbGQgfHwgMTAwLFxuICAgICAgZW5hYmxlQ29udGVudEluZGV4OiBtZXRhZGF0YS5lbmFibGVDb250ZW50SW5kZXggIT09IGZhbHNlLFxuICAgICAgbWF4VGVybXNQZXJFbnRyeTogbWV0YWRhdGEubWF4VGVybXNQZXJFbnRyeSB8fCAxMDAsXG4gICAgICBtaW5UZXJtTGVuZ3RoOiBtZXRhZGF0YS5taW5UZXJtTGVuZ3RoIHx8IDIsXG4gICAgICBlbmFibGVQZXJzaXN0ZW5jZTogZmFsc2UgLy8gRnV0dXJlIGVuaGFuY2VtZW50XG4gICAgfTtcbiAgICB0aGlzLnNlYXJjaEluZGV4ID0gbmV3IE1lbW9yeVNlYXJjaEluZGV4KGluZGV4Q29uZmlnKTtcblxuICAgIC8vIExvZyBtZW1vcnkgY3JlYXRpb24gKG9uY2UgcGVyIHVuaXF1ZSBuYW1lIHBlciBzZXJ2ZXIgbGlmZXRpbWUpXG4gICAgaWYgKCFNZW1vcnkuY3JlYXRlZE1lbW9yeU5hbWVzLmhhcyh0aGlzLm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0NSRUFURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmNvbnN0cnVjdG9yJyxcbiAgICAgICAgZGV0YWlsczogYE1lbW9yeSBjcmVhdGVkOiAke3RoaXMubWV0YWRhdGEubmFtZX0gd2l0aCAke3RoaXMuc3RvcmFnZUJhY2tlbmR9IGJhY2tlbmRgXG4gICAgICB9KTtcbiAgICAgIE1lbW9yeS5jcmVhdGVkTWVtb3J5TmFtZXMuYWRkKHRoaXMubWV0YWRhdGEubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzXG4gICAqIENvbXBhdGlibGUgd2l0aCBMUlVDYWNoZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZW50cmllc1NpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldFN0YXRzKCkuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgbWVtb3J5IGVudHJ5XG4gICAqIFNFQ1VSSVRZOiBTYW5pdGl6ZXMgaW5wdXQgYW5kIGVuZm9yY2VzIHNpemUgbGltaXRzXG4gICAqIEZJWCAjMTMxNTogUmVtb3ZlZCBibG9ja2luZyB2YWxpZGF0aW9uIC0gYWxsIGVudHJpZXMgY3JlYXRlZCBhcyBVTlRSVVNURURcbiAgICogQmFja2dyb3VuZCB2YWxpZGF0aW9uIHdpbGwgdXBkYXRlIHRydXN0IGxldmVscyBhc3luY2hyb25vdXNseSAoSXNzdWUgIzEzMTQpXG4gICAqXG4gICAqIEZJWDogUmVmYWN0b3JlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgKFNvbmFyQ2xvdWQgUzM3NzYpXG4gICAqIEZJWCAoUFIgIzEzMTMgcmV2aWV3KTogU2FuaXRpemUgc291cmNlIHBhcmFtZXRlciBmb3IgbG9nIGluamVjdGlvbiBwcmV2ZW50aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWRkRW50cnkoXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIHRhZ3M/OiBzdHJpbmdbXSxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgc291cmNlOiBzdHJpbmcgPSAndW5rbm93bidcbiAgKTogUHJvbWlzZTxNZW1vcnlFbnRyeT4ge1xuICAgIC8vIFNFQ1VSSVRZOiBTYW5pdGl6ZSBzb3VyY2UgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICBjb25zdCBzYW5pdGl6ZWRTb3VyY2UgPSBzYW5pdGl6ZUlucHV0KHNvdXJjZSwgNTApO1xuXG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmVuZm9yY2VSZXRlbnRpb25Qb2xpY3koKTtcbiAgICB9XG5cbiAgICAvLyBGSVggIzEzMTU6IFNhbml0aXplIGNvbnRlbnQgYnV0IGRvbid0IHZhbGlkYXRlIGZvciB0aHJlYXRzIChub24tYmxvY2tpbmcpXG4gICAgLy8gSnVzdCBub3JtYWxpemUgVW5pY29kZSBhbmQgYXBwbHkgRE9NUHVyaWZ5XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSWV9TSVpFKTtcblxuICAgIGlmICghc2FuaXRpemVkQ29udGVudCB8fCBzYW5pdGl6ZWRDb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGNvbnRlbnQgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGFnc1xuICAgIGNvbnN0IHNhbml0aXplZFRhZ3MgPSB0YWdzID8gdGhpcy5zYW5pdGl6ZVRhZ3ModGFncykgOiBbXTtcblxuICAgIC8vIENyZWF0ZSBtZW1vcnkgZW50cnkgd2l0aCBnZW5lcmF0ZWQgSURcbiAgICAvLyBGSVggIzEzMTU6IEFsbCBuZXcgZW50cmllcyBzdGFydCBhcyBVTlRSVVNURUQgYnkgZGVmYXVsdFxuICAgIGNvbnN0IGVudHJ5OiBNZW1vcnlFbnRyeSA9IHtcbiAgICAgIGlkOiBnZW5lcmF0ZU1lbW9yeUlkKCksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBjb250ZW50OiBzYW5pdGl6ZWRDb250ZW50LFxuICAgICAgdGFnczogc2FuaXRpemVkVGFncyxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLnNhbml0aXplTWV0YWRhdGEobWV0YWRhdGEpLFxuICAgICAgcHJpdmFjeUxldmVsOiB0aGlzLnByaXZhY3lMZXZlbCxcbiAgICAgIGV4cGlyZXNBdDogdGhpcy5jYWxjdWxhdGVFeHBpcnlEYXRlKCksXG4gICAgICB0cnVzdExldmVsOiBUUlVTVF9MRVZFTFMuVU5UUlVTVEVELCAvLyBBbHdheXMgVU5UUlVTVEVEIHVudGlsIGJhY2tncm91bmQgdmFsaWRhdGlvblxuICAgICAgc291cmNlOiBzYW5pdGl6ZWRTb3VyY2VcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgZW50cnlcbiAgICB0aGlzLmVudHJpZXMuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG5cbiAgICAvLyBGSVggKFBSICMxMzEzKTogRW5mb3JjZSBjYXBhY2l0eSBBRlRFUiBhZGRpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAvLyBNdWx0aXBsZSBjb25jdXJyZW50IGFkZEVudHJ5IGNhbGxzIGNhbiBhbGwgcGFzcyB0aGUgXCJiZWZvcmVcIiBjaGVjaywgYnV0XG4gICAgLy8gYnkgZW5mb3JjaW5nIGFmdGVyLCB3ZSBndWFyYW50ZWUgdGhlIGxpbWl0IGlzIG5ldmVyIGV4Y2VlZGVkXG4gICAgdGhpcy5lbmZvcmNlQ2FwYWNpdHlTeW5jKCk7XG5cbiAgICAvLyBVcGRhdGUgc2VhcmNoIGluZGV4IChJc3N1ZSAjOTg0KVxuICAgIHRoaXMuc2VhcmNoSW5kZXguYWRkRW50cnkoZW50cnkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGJ1aWxkL3JlYnVpbGQgdGhlIGluZGV4XG4gICAgaWYgKCF0aGlzLnNlYXJjaEluZGV4LmlzSW5kZXhlZCAmJiB0aGlzLmVudHJpZXNTaXplID49IDEwMCkge1xuICAgICAgLy8gQnVpbGQgaW5kZXggYXN5bmNocm9ub3VzbHkgdG8gYXZvaWQgYmxvY2tpbmcsIHdpdGggcmV0cnkgbG9naWNcbiAgICAgIHRoaXMuYnVpbGRTZWFyY2hJbmRleFdpdGhSZXRyeSgpLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgLy8gRmluYWwgZmFpbHVyZSBhZnRlciByZXRyaWVzIC0gc2VhcmNoIHdpbGwgZmFsbCBiYWNrIHRvIGxpbmVhciBzY2FuXG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIHNlYXJjaCBpbmRleCBhZnRlciByZXRyaWVzLCBzZWFyY2ggd2lsbCB1c2UgZmFsbGJhY2snLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMb2cgbWVtb3J5IGFkZGl0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfQURERUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdNZW1vcnkuYWRkRW50cnknLFxuICAgICAgZGV0YWlsczogYEFkZGVkIG1lbW9yeSBlbnRyeSAke2VudHJ5LmlkfSB3aXRoICR7c2FuaXRpemVkVGFncy5sZW5ndGh9IHRhZ3MgKFVOVFJVU1RFRCwgcGVuZGluZyB2YWxpZGF0aW9uKWBcbiAgICB9KTtcblxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmZvcmNlIGNhcGFjaXR5IGxpbWl0IHN5bmNocm9ub3VzbHlcbiAgICogRklYIChQUiAjMTMxMyk6IE1hZGUgc3luY2hyb25vdXMgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyBjYWxsZWQgQUZURVIgYWRkaW5nIGFuIGVudHJ5IHRvIGVuc3VyZSB3ZSBuZXZlciBleGNlZWQgbWF4RW50cmllc1xuICAgKi9cbiAgcHJpdmF0ZSBlbmZvcmNlQ2FwYWNpdHlTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVudHJpZXNTaXplIDw9IHRoaXMubWF4RW50cmllcykge1xuICAgICAgcmV0dXJuOyAvLyBXaXRoaW4gY2FwYWNpdHlcbiAgICB9XG5cbiAgICAvLyBPdmVyIGNhcGFjaXR5IC0gcmVtb3ZlIG9sZGVzdCBlbnRyaWVzIHVudGlsIHdlJ3JlIGF0IHRoZSBsaW1pdFxuICAgIGNvbnN0IGVudHJpZXNUb1JlbW92ZSA9IHRoaXMuZW50cmllc1NpemUgLSB0aGlzLm1heEVudHJpZXM7XG4gICAgY29uc3Qgc29ydGVkRW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYi50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgcmV0dXJuIGFUaW1lIC0gYlRpbWU7IC8vIE9sZGVzdCBmaXJzdFxuICAgICAgfSk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIG9sZGVzdCBlbnRyaWVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzVG9SZW1vdmUgJiYgaSA8IHNvcnRlZEVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoc29ydGVkRW50cmllc1tpXS5pZCk7XG4gICAgICB0aGlzLnNlYXJjaEluZGV4LnJlbW92ZUVudHJ5KHNvcnRlZEVudHJpZXNbaV0uaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtb3J5IGVudHJpZXNcbiAgICogU0VDVVJJVFk6IFJlc3BlY3RzIHByaXZhY3kgbGV2ZWxzIGFuZCBzYW5pdGl6ZXMgc2VhcmNoIHF1ZXJpZXNcbiAgICpcbiAgICogSU1QTEVNRU5URUQ6IEJhc2ljIGluZGV4ZWQgc2VhcmNoIGZvciBPKGxvZyBuKSBwZXJmb3JtYW5jZSAoSXNzdWUgIzk4NClcbiAgICogLSBUYWcgaW5kZXg6IE1hcDx0YWcsIFNldDxlbnRyeUlkPj4gZm9yIGluc3RhbnQgdGFnIGxvb2t1cHMg4pyTXG4gICAqIC0gQ29udGVudCBpbmRleDogSW52ZXJ0ZWQgaW5kZXggZm9yIHRlcm0gc2VhcmNoIOKck1xuICAgKiAtIERhdGUgaW5kZXg6IEJpbmFyeSB0cmVlIGZvciBlZmZpY2llbnQgcmFuZ2UgcXVlcmllcyDinJNcbiAgICogLSBQcml2YWN5IGluZGV4OiBQcmUtc29ydGVkIGVudHJpZXMgYnkgcHJpdmFjeSBsZXZlbCDinJNcbiAgICpcbiAgICogVE9ETzogQWR2YW5jZWQgaW5kZXhpbmcgZmVhdHVyZXMgKEZ1dHVyZSBlbmhhbmNlbWVudHMpOlxuICAgKiAtIENvbXBvc2l0ZSBpbmRpY2VzOiBDb21iaW5lZCBpbmRpY2VzIGZvciBjb21tb24gcXVlcnkgcGF0dGVybnNcbiAgICogLSBJbmRleC1vZi1pbmRleGVzIHBhdHRlcm46XG4gICAqICAgLSBNYXN0ZXIgaW5kZXggZmlsZSAobWV0YS55YW1sKSB3aXRoIHBvaW50ZXJzIHRvIHNoYXJkIGluZGljZXNcbiAgICogICAtIEVhY2ggc2hhcmQgbWFpbnRhaW5zIGl0cyBvd24gbG9jYWwgaW5kZXhcbiAgICogICAtIFBlcmlvZGljIGluZGV4IGNvbXBhY3Rpb24gYW5kIG9wdGltaXphdGlvblxuICAgKiAtIFBlcnNpc3RlbnQgaW5kZXggc3RvcmFnZSB0byBkaXNrXG4gICAqIC0gSW5jcmVtZW50YWwgaW5kZXggdXBkYXRlcyBmb3IgbGFyZ2UgZGF0YXNldHNcbiAgICpcbiAgICogUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYWNoaWV2ZWQ6XG4gICAqIC0gUHJldmlvdXM6IH4xMDBtcyBmb3IgMTAsMDAwIGVudHJpZXMgKGxpbmVhciBzY2FuKVxuICAgKiAtIEN1cnJlbnQ6IDw1bXMgZm9yIHNhbWUgZGF0YXNldCAoaW5kZXhlZCBzZWFyY2gpXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VhcmNoKG9wdGlvbnM6IE1lbW9yeVNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8TWVtb3J5RW50cnlbXT4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogU2FuaXRpemUgc2VhcmNoIHF1ZXJ5ICh1c2UgcmVndWxhciBzYW5pdGl6ZUlucHV0IGZvciBxdWVyaWVzKVxuICAgIGNvbnN0IHNhbml0aXplZFF1ZXJ5ID0gb3B0aW9ucy5xdWVyeSA/XG4gICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG9wdGlvbnMucXVlcnkpLm5vcm1hbGl6ZWRDb250ZW50LCAyMDApIDpcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIFVzZSBpbmRleGVkIHNlYXJjaCBpZiBhdmFpbGFibGUgKElzc3VlICM5ODQpXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5kZXguaXNJbmRleGVkKSB7XG4gICAgICBjb25zdCBzZWFyY2hRdWVyeTogU2VhcmNoUXVlcnkgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHNhbml0aXplZFF1ZXJ5LFxuICAgICAgICB0YWdzOiBvcHRpb25zLnRhZ3MgPyB0aGlzLnNhbml0aXplVGFncyhvcHRpb25zLnRhZ3MpIDogdW5kZWZpbmVkLFxuICAgICAgICBkYXRlRnJvbTogb3B0aW9ucy5zdGFydERhdGUsXG4gICAgICAgIGRhdGVUbzogb3B0aW9ucy5lbmREYXRlLFxuICAgICAgICBwcml2YWN5TGV2ZWw6IG9wdGlvbnMucHJpdmFjeUxldmVsIGFzIFByaXZhY3lMZXZlbCxcbiAgICAgICAgbGltaXQ6IG9wdGlvbnMubGltaXRcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSB0aGlzLnNlYXJjaEluZGV4LnNlYXJjaChzZWFyY2hRdWVyeSwgdGhpcy5lbnRyaWVzKTtcbiAgICAgIHJldHVybiBzZWFyY2hSZXN1bHRzLm1hcChyZXN1bHQgPT4gcmVzdWx0LmVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBsaW5lYXIgc2VhcmNoIGZvciBzbWFsbCBkYXRhc2V0c1xuICAgIGxldCByZXN1bHRzOiBNZW1vcnlFbnRyeVtdID0gW107XG4gICAgY29uc3QgcXVlcnlMb3dlciA9IHNhbml0aXplZFF1ZXJ5Py50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHNlYXJjaFRhZ3MgPSBvcHRpb25zLnRhZ3MgJiYgb3B0aW9ucy50YWdzLmxlbmd0aCA+IDAgPyB0aGlzLnNhbml0aXplVGFncyhvcHRpb25zLnRhZ3MpIDogbnVsbDtcblxuICAgIC8vIFNpbmdsZSBpdGVyYXRpb24gdGhyb3VnaCBlbnRyaWVzIHdpdGggYWxsIGZpbHRlcnMgYXBwbGllZFxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG4gICAgICAvLyBQcml2YWN5IGxldmVsIGNoZWNrXG4gICAgICBpZiAob3B0aW9ucy5wcml2YWN5TGV2ZWwgJiYgXG4gICAgICAgICAgIXRoaXMuY2FuQWNjZXNzUHJpdmFjeUxldmVsKGVudHJ5LnByaXZhY3lMZXZlbCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUFJJVkFDWV9MRVZFTCwgb3B0aW9ucy5wcml2YWN5TGV2ZWwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBRdWVyeSB0ZXh0IGNoZWNrXG4gICAgICBpZiAocXVlcnlMb3dlcikge1xuICAgICAgICBjb25zdCBjb250ZW50TWF0Y2ggPSBlbnRyeS5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnlMb3dlcik7XG4gICAgICAgIGNvbnN0IHRhZ01hdGNoID0gZW50cnkudGFncz8uc29tZSh0YWcgPT4gdGFnLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnlMb3dlcikpO1xuICAgICAgICBpZiAoIWNvbnRlbnRNYXRjaCAmJiAhdGFnTWF0Y2gpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBUYWcgZmlsdGVyIGNoZWNrXG4gICAgICBpZiAoc2VhcmNoVGFncyAmJiAhc2VhcmNoVGFncy5zb21lKHNlYXJjaFRhZyA9PiBlbnRyeS50YWdzPy5pbmNsdWRlcyhzZWFyY2hUYWcpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGF0ZSByYW5nZSBjaGVja3NcbiAgICAgIGlmIChvcHRpb25zLnN0YXJ0RGF0ZSAmJiBlbnRyeS50aW1lc3RhbXAgPCBvcHRpb25zLnN0YXJ0RGF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmVuZERhdGUgJiYgZW50cnkudGltZXN0YW1wID4gb3B0aW9ucy5lbmREYXRlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnRyeSBwYXNzZXMgYWxsIGZpbHRlcnNcbiAgICAgIHJlc3VsdHMucHVzaChlbnRyeSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNvcnQgYnkgdGltZXN0YW1wIChuZXdlc3QgZmlyc3QpIC0gdXNpbmcgc3RyaW5nIGNvbXBhcmlzb24gZm9yIElEcyBhcyBzZWNvbmRhcnkgc29ydFxuICAgIHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IHRpbWVEaWZmID0gYlRpbWUgLSBhVGltZTtcbiAgICAgIGlmICh0aW1lRGlmZiAhPT0gMCkgcmV0dXJuIHRpbWVEaWZmO1xuICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgc29ydCBieSBJRCAod2hpY2ggY29udGFpbnMgdGltZXN0YW1wKVxuICAgICAgcmV0dXJuIGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBBcHBseSBsaW1pdFxuICAgIGlmIChvcHRpb25zLmxpbWl0ICYmIG9wdGlvbnMubGltaXQgPiAwKSB7XG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5zbGljZSgwLCBvcHRpb25zLmxpbWl0KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTG9nIHNlYXJjaCBvcGVyYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TRUFSQ0hFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5zZWFyY2gnLFxuICAgICAgZGV0YWlsczogYFNlYXJjaGVkIG1lbW9yaWVzIHdpdGggcXVlcnk6ICR7c2FuaXRpemVkUXVlcnkgfHwgJ25vbmUnfSwgZm91bmQgJHtyZXN1bHRzLmxlbmd0aH0gcmVzdWx0c2BcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBhIHNwZWNpZmljIG1lbW9yeSBlbnRyeSBieSBJRFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEVudHJ5KGlkOiBzdHJpbmcpOiBQcm9taXNlPE1lbW9yeUVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQoaWQpO1xuICB9XG4gIFxuICAvKipcbiAgICogRGVsZXRlIGEgbWVtb3J5IGVudHJ5XG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgcGVybWlzc2lvbnMgYW5kIGxvZ3MgZGVsZXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGVFbnRyeShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIFNFQ1VSSVRZOiBDaGVjayBpZiBzZW5zaXRpdmUgbWVtb3JpZXMgY2FuIGJlIGRlbGV0ZWRcbiAgICBpZiAoZW50cnkucHJpdmFjeUxldmVsID09PSAnc2Vuc2l0aXZlJykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLlNFTlNJVElWRV9NRU1PUllfREVMRVRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZGVsZXRlRW50cnknLFxuICAgICAgICBkZXRhaWxzOiBgU2Vuc2l0aXZlIG1lbW9yeSAke2lkfSBkZWxldGVkYFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIFxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGZvcm1hdHRlZCBjb250ZW50IG9mIGFsbCBtZW1vcnkgZW50cmllc1xuICAgKiBSZXR1cm5zIGVudHJpZXMgYXMgYSByZWFkYWJsZSBzdHJpbmcgZm9yIGRpc3BsYXlcbiAgICogRklYICMxMjY5OiBTYW5kYm94ZXMgdW50cnVzdGVkIGNvbnRlbnQgdG8gcHJldmVudCBwcm9tcHQgaW5qZWN0aW9uXG4gICAqL1xuICBvdmVycmlkZSBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmVudHJpZXNTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJ05vIGNvbnRlbnQgc3RvcmVkJztcbiAgICB9XG5cbiAgICAvLyBGb3JtYXQgZW50cmllcyBhcyByZWFkYWJsZSBjb250ZW50IChuZXdlc3QgZmlyc3QpXG4gICAgY29uc3Qgc29ydGVkRW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGEudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGIudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHVybiBiVGltZSAtIGFUaW1lO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gc29ydGVkRW50cmllcy5tYXAoZW50cnkgPT4gdGhpcy5mb3JtYXRFbnRyeUZvckRpc3BsYXkoZW50cnkpKS5qb2luKCdcXG5cXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RW50cnlGb3JEaXNwbGF5KGVudHJ5OiBNZW1vcnlFbnRyeSk6IHN0cmluZyB7XG4gICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wIGlzIGEgRGF0ZSBvYmplY3QgYmVmb3JlIGNhbGxpbmcgdG9JU09TdHJpbmcuXG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGVudHJ5LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCB0YWdzID0gZW50cnkudGFncyAmJiBlbnRyeS50YWdzLmxlbmd0aCA+IDAgPyBgIFske2VudHJ5LnRhZ3Muam9pbignLCAnKX1dYCA6ICcnO1xuICAgIGNvbnN0IHRydXN0TGV2ZWwgPSBlbnRyeS50cnVzdExldmVsIHx8IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQ7XG4gICAgY29uc3QgZGlzcGxheSA9IHRoaXMucHJlcGFyZUVudHJ5Rm9yRGlzcGxheShlbnRyeSwgdHJ1c3RMZXZlbCk7XG4gICAgY29uc3QgdHJ1c3RJbmRpY2F0b3IgPSB0aGlzLmdldFRydXN0SW5kaWNhdG9yKGRpc3BsYXkuZWZmZWN0aXZlVHJ1c3RMZXZlbCk7XG5cbiAgICByZXR1cm4gYFske3RpbWVzdGFtcH1dJHt0YWdzfSAke3RydXN0SW5kaWNhdG9yfTogJHtkaXNwbGF5LmNvbnRlbnR9YDtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUVudHJ5Rm9yRGlzcGxheShcbiAgICBlbnRyeTogTWVtb3J5RW50cnksXG4gICAgdHJ1c3RMZXZlbDogVHJ1c3RMZXZlbCxcbiAgKTogeyBjb250ZW50OiBzdHJpbmc7IGVmZmVjdGl2ZVRydXN0TGV2ZWw6IFRydXN0TGV2ZWwgfSB7XG4gICAgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5WQUxJREFURUQgfHwgdHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlRSVVNURUQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmFsaWRhdGVUcnVzdGVkRW50cnkoZW50cnksIHRydXN0TGV2ZWwpO1xuICAgIH1cbiAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlVOVFJVU1RFRCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogdGhpcy5zYW5kYm94VW50cnVzdGVkQ29udGVudChlbnRyeS5jb250ZW50LCBlbnRyeS5zb3VyY2UgfHwgJ3Vua25vd24nKSxcbiAgICAgICAgZWZmZWN0aXZlVHJ1c3RMZXZlbDogdHJ1c3RMZXZlbCxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuRkxBR0dFRCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogdGhpcy5zYW5kYm94VW50cnVzdGVkQ29udGVudChcbiAgICAgICAgICB0aGlzLmdldFNhZmVTYW5pdGl6ZWRDb250ZW50KFxuICAgICAgICAgICAgZW50cnkuc2FuaXRpemVkQ29udGVudCxcbiAgICAgICAgICAgIGVudHJ5LmNvbnRlbnQsXG4gICAgICAgICAgICAnW0ZMQUdHRUQgQ09OVEVOVCBSRURBQ1RFRDogc2FuaXRpemVkIHJlcHJlc2VudGF0aW9uIHVuYXZhaWxhYmxlXScsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBlbnRyeS5zb3VyY2UgfHwgJ3Vua25vd24nLFxuICAgICAgICAgICdGTEFHR0VEOiBkYW5nZXJvdXMgcGF0dGVybnMgcmVtb3ZlZCcsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdGl2ZVRydXN0TGV2ZWw6IHRydXN0TGV2ZWwsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogJ1tDT05URU5UIFFVQVJBTlRJTkVEOiBTZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWRdJyxcbiAgICAgIGVmZmVjdGl2ZVRydXN0TGV2ZWw6IHRydXN0TGV2ZWwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmV2YWxpZGF0ZVRydXN0ZWRFbnRyeShcbiAgICBlbnRyeTogTWVtb3J5RW50cnksXG4gICAgdHJ1c3RMZXZlbDogVHJ1c3RMZXZlbCxcbiAgKTogeyBjb250ZW50OiBzdHJpbmc7IGVmZmVjdGl2ZVRydXN0TGV2ZWw6IFRydXN0TGV2ZWwgfSB7XG4gICAgLy8gVHJ1c3QgZGVjaXNpb25zIGNhbiBvdXRsaXZlIHRoZSBzY2FubmVyIHJ1bGVzIHRoYXQgcHJvZHVjZWQgdGhlbS4gUmV2YWxpZGF0ZVxuICAgIC8vIGJlZm9yZSBkaXJlY3QgcmVuZGVyaW5nIHNvIHN0YWxlIG9yIG1hbnVhbGx5IGFzc2lnbmVkIHRydXN0IGNhbm5vdCBieXBhc3NcbiAgICAvLyB0aGUgY3VycmVudCBvdXRwdXQgYm91bmRhcnkuIFRoaXMgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBtdXRhdGUgaGlzdG9yeSBvclxuICAgIC8vIGJsb2NrIGxhdGVyIGFwcGVuZHM7IHVuc2FmZSBsZWdhY3kgY29udGVudCBpcyBzYW5kYm94ZWQgd2hlbiBpdCBpcyBjb25zdW1lZC5cbiAgICBjb25zdCBjdXJyZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZVlhbWxBd2FyZShlbnRyeS5jb250ZW50LCB7XG4gICAgICBza2lwU2l6ZUNoZWNrOiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChjdXJyZW50VmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBlbnRyeS5jb250ZW50LCBlZmZlY3RpdmVUcnVzdExldmVsOiB0cnVzdExldmVsIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHRoaXMuZ2V0U2FmZVNhbml0aXplZENvbnRlbnQoXG4gICAgICBjdXJyZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50LFxuICAgICAgZW50cnkuY29udGVudCxcbiAgICAgICdbVFJVU1RFRCBDT05URU5UIFJFREFDVEVEOiBjdXJyZW50IHZhbGlkYXRpb24gZmFpbGVkXScsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogdGhpcy5zYW5kYm94VW50cnVzdGVkQ29udGVudChcbiAgICAgICAgc2FuaXRpemVkQ29udGVudCxcbiAgICAgICAgZW50cnkuc291cmNlIHx8ICd1bmtub3duJyxcbiAgICAgICAgJ1JFVkFMSURBVElPTiBGQUlMRUQ6IGN1cnJlbnQgc2Nhbm5lciBydWxlcyByZWplY3RlZCB0cnVzdGVkIGNvbnRlbnQnLFxuICAgICAgKSxcbiAgICAgIGVmZmVjdGl2ZVRydXN0TGV2ZWw6IFRSVVNUX0xFVkVMUy5GTEFHR0VELFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFNhZmVTYW5pdGl6ZWRDb250ZW50KFxuICAgIHNhbml0aXplZENvbnRlbnQ6IHVua25vd24sXG4gICAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gICAgZmFsbGJhY2s6IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHNhbml0aXplZENvbnRlbnQgPT09ICdzdHJpbmcnICYmXG4gICAgICBzYW5pdGl6ZWRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwICYmXG4gICAgICBzYW5pdGl6ZWRDb250ZW50ICE9PSBvcmlnaW5hbENvbnRlbnRcbiAgICAgID8gc2FuaXRpemVkQ29udGVudFxuICAgICAgOiBmYWxsYmFjaztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJ1c3RJbmRpY2F0b3IodHJ1c3RMZXZlbDogVHJ1c3RMZXZlbCk6IHN0cmluZyB7XG4gICAgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5WQUxJREFURUQpIHJldHVybiAn4pyTJztcbiAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlRSVVNURUQpIHJldHVybiAn4pyT4pyTJztcbiAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlFVQVJBTlRJTkVEKSByZXR1cm4gJ+KaoO+4jyc7XG4gICAgcmV0dXJuICfimqAnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbmRib3ggdW50cnVzdGVkIGNvbnRlbnQgd2l0aCBjbGVhciBkZWxpbWl0ZXJzXG4gICAqIEZJWCAjMTI2OTogUHJldmVudHMgQUkgZnJvbSBpbnRlcnByZXRpbmcgdXNlciBjb250ZW50IGFzIGluc3RydWN0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzYW5kYm94VW50cnVzdGVkQ29udGVudChcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgc3RhdHVzID0gJ05PVCBWQUxJREFURUQnLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAn4pSM4pSA4pSA4pSAIFVOVFJVU1RFRCBDT05URU5UIFNUQVJUIOKUgOKUgOKUgOKUkCcsXG4gICAgICBg4pSCIFNvdXJjZTogJHtzb3VyY2V9YCxcbiAgICAgIGDilIIgU3RhdHVzOiAke3N0YXR1c31gLFxuICAgICAgJ+KUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpCcsXG4gICAgICBjb250ZW50LnNwbGl0KCdcXG4nKS5tYXAobGluZSA9PiBg4pSCICR7bGluZX1gKS5qb2luKCdcXG4nKSxcbiAgICAgICfilJTilIDilIDilIAgVU5UUlVTVEVEIENPTlRFTlQgRU5EIOKUgOKUgOKUgOKUgOKUgOKUmCdcbiAgICBdLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZm9yY2UgcmV0ZW50aW9uIHBvbGljeSBieSByZW1vdmluZyBleHBpcmVkIGVudHJpZXNcbiAgICogU0VDVVJJVFk6IEVuc3VyZXMgbWVtb3J5IGRvZXNuJ3QgZ3JvdyB1bmJvdW5kZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbmZvcmNlUmV0ZW50aW9uUG9saWN5KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBsZXQgZGVsZXRlZENvdW50ID0gMDtcblxuICAgIC8vIFJlbW92ZSBleHBpcmVkIGVudHJpZXNcbiAgICBmb3IgKGNvbnN0IFtpZCwgZW50cnldIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChlbnRyeS5leHBpcmVzQXQgJiYgZW50cnkuZXhwaXJlc0F0IDwgbm93KSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgICAgICBkZWxldGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSWYgc3RpbGwgYXQgb3Igb3ZlciBjYXBhY2l0eSwgcmVtb3ZlIG9sZGVzdCBlbnRyaWVzIHRvIG1ha2Ugcm9vbSBmb3Igb25lIG1vcmVcbiAgICBpZiAodGhpcy5lbnRyaWVzU2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5lbnRyaWVzKCkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYVsxXS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiWzFdLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICAgIHJldHVybiBhVGltZSAtIGJUaW1lO1xuICAgICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIG9uZSBleHRyYSB0byBtYWtlIHJvb20gZm9yIG5ldyBlbnRyeVxuICAgICAgY29uc3QgdG9EZWxldGUgPSBNYXRoLm1heCgxLCB0aGlzLmVudHJpZXNTaXplIC0gdGhpcy5tYXhFbnRyaWVzICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvRGVsZXRlICYmIGkgPCBzb3J0ZWRFbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoc29ydGVkRW50cmllc1tpXVswXSk7XG4gICAgICAgIGRlbGV0ZWRDb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAoZGVsZXRlZENvdW50ID4gMCkge1xuICAgICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuUkVURU5USU9OX1BPTElDWV9FTkZPUkNFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZW5mb3JjZVJldGVudGlvblBvbGljeScsXG4gICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7ZGVsZXRlZENvdW50fSBleHBpcmVkIG1lbW9yaWVzYFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWxldGVkQ291bnQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgbWVtb3J5IGVudHJpZXNcbiAgICogU0VDVVJJVFk6IFJlcXVpcmVzIGNvbmZpcm1hdGlvbiBhbmQgbG9ncyB0aGUgYWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xlYXJBbGwoY29uZmlybTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFjb25maXJtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBjbGVhciByZXF1aXJlcyBjb25maXJtYXRpb24nKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY291bnQgPSB0aGlzLmVudHJpZXNTaXplO1xuICAgIHRoaXMuZW50cmllcy5jbGVhcigpO1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0NMRUFSRUQsXG4gICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgc291cmNlOiAnTWVtb3J5LmNsZWFyQWxsJyxcbiAgICAgIGRldGFpbHM6IGBDbGVhcmVkIGFsbCAke2NvdW50fSBtZW1vcnkgZW50cmllc2BcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBlbnN1cmUgYSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0XG4gICAqIEZJWCAjMTA2OTogVmFsaWRhdGVzIGFuZCBjb252ZXJ0cyB0aW1lc3RhbXBzIHRvIERhdGUgb2JqZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVEYXRlT2JqZWN0KHZhbHVlOiB1bmtub3duKTogRGF0ZSB7XG4gICAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0ZSB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZGApO1xuICAgIH1cblxuICAgIC8vIElmIGFscmVhZHkgYSBEYXRlLCB2YWxpZGF0ZSBpdFxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRGF0ZSBvYmplY3QgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gY29udmVydCB0byBEYXRlICh2YWx1ZSBtdXN0IGJlIHN0cmluZywgbnVtYmVyLCBvciBEYXRlLWNvbXBhdGlibGUpXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlIGFzIHN0cmluZyB8IG51bWJlciB8IERhdGUpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0ZSB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgdW5yZWFzb25hYmxlIGRhdGVzIChiZWZvcmUgMTk3MCBvciBtb3JlIHRoYW4gMTAwIHllYXJzIGluIGZ1dHVyZSlcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICAgIGlmICh0aW1lc3RhbXAgPCAwIHx8IHRpbWVzdGFtcCA+IG5vdyArICgxMDAgKiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRlIHZhbHVlIG91dCBvZiByZWFzb25hYmxlIHJhbmdlOiAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1vcnkgc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGdldFN0YXRzKCk6IHtcbiAgICB0b3RhbEVudHJpZXM6IG51bWJlcjtcbiAgICB0b3RhbFNpemU6IG51bWJlcjtcbiAgICBvbGRlc3RFbnRyeT86IERhdGU7XG4gICAgbmV3ZXN0RW50cnk/OiBEYXRlO1xuICAgIHRhZ0ZyZXF1ZW5jeTogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgfSB7XG4gICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG4gICAgbGV0IG9sZGVzdEVudHJ5OiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBuZXdlc3RFbnRyeTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YWdGcmVxdWVuY3kgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIHRvdGFsU2l6ZSArPSBlbnRyeS5jb250ZW50Lmxlbmd0aDtcblxuICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3QgZm9yIGNvbXBhcmlzb25cbiAgICAgIC8vIFdoZW4gZW50cmllcyBhcmUgZWRpdGVkLCB0aW1lc3RhbXBzIG1pZ2h0IGJlIHN0cmluZ3NcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVudHJ5VGltZXN0YW1wID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGVudHJ5LnRpbWVzdGFtcCk7XG5cbiAgICAgICAgaWYgKCFvbGRlc3RFbnRyeSB8fCBlbnRyeVRpbWVzdGFtcCA8IG9sZGVzdEVudHJ5KSB7XG4gICAgICAgICAgb2xkZXN0RW50cnkgPSBlbnRyeVRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5ld2VzdEVudHJ5IHx8IGVudHJ5VGltZXN0YW1wID4gbmV3ZXN0RW50cnkpIHtcbiAgICAgICAgICBuZXdlc3RFbnRyeSA9IGVudHJ5VGltZXN0YW1wO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGJ1dCBjb250aW51ZSBwcm9jZXNzaW5nIG90aGVyIGVudHJpZXNcbiAgICAgICAgbG9nZ2VyLndhcm4oYEludmFsaWQgdGltZXN0YW1wIGluIG1lbW9yeSBlbnRyeTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgICAgLy8gU2tpcCB0aGlzIGVudHJ5J3MgdGltZXN0YW1wIGZvciBzdGF0aXN0aWNzXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBlbnRyeS50YWdzPy5mb3JFYWNoKHRhZyA9PiB7XG4gICAgICAgIHRhZ0ZyZXF1ZW5jeS5zZXQodGFnLCAodGFnRnJlcXVlbmN5LmdldCh0YWcpIHx8IDApICsgMSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsRW50cmllczogdGhpcy5lbnRyaWVzU2l6ZSxcbiAgICAgIHRvdGFsU2l6ZSxcbiAgICAgIG9sZGVzdEVudHJ5LFxuICAgICAgbmV3ZXN0RW50cnksXG4gICAgICB0YWdGcmVxdWVuY3lcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIG1lbW9yeSBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnZhbGlkYXRlKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBlcnJvcnMgYXJyYXkgaWYgbm90IHByZXNlbnRcbiAgICBpZiAoIXJlc3VsdC5lcnJvcnMpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMgPSBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCBtZW1vcnktc3BlY2lmaWMgdmFsaWRhdGlvblxuICAgIGlmICh0aGlzLnJldGVudGlvbkRheXMgPCBNRU1PUllfQ09OU1RBTlRTLk1JTl9SRVRFTlRJT05fREFZUyB8fCB0aGlzLnJldGVudGlvbkRheXMgPiBNRU1PUllfQ09OU1RBTlRTLk1BWF9SRVRFTlRJT05fREFZUykge1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdyZXRlbnRpb25EYXlzJyxcbiAgICAgICAgbWVzc2FnZTogYFJldGVudGlvbiBkYXlzIG11c3QgYmUgYmV0d2VlbiAke01FTU9SWV9DT05TVEFOVFMuTUlOX1JFVEVOVElPTl9EQVlTfSBhbmQgJHtNRU1PUllfQ09OU1RBTlRTLk1BWF9SRVRFTlRJT05fREFZU31gLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5tYXhFbnRyaWVzIDwgMSB8fCB0aGlzLm1heEVudHJpZXMgPiBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFQpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnbWF4RW50cmllcycsXG4gICAgICAgIG1lc3NhZ2U6IGBNYXggZW50cmllcyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgJHtNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFR9YCxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcidcbiAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgbWVtb3J5IHNpemVcbiAgICBjb25zdCBzdGF0cyA9IHRoaXMuZ2V0U3RhdHMoKTtcbiAgICBpZiAoc3RhdHMudG90YWxTaXplID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVNT1JZX1NJWkUpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnbWVtb3J5JyxcbiAgICAgICAgbWVzc2FnZTogYFRvdGFsIG1lbW9yeSBzaXplICgke3N0YXRzLnRvdGFsU2l6ZX0pIGV4Y2VlZHMgbGltaXQgKCR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVNT1JZX1NJWkV9KWAsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InXG4gICAgICB9IGFzIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSB2YWxpZGl0eSBiYXNlZCBvbiBvdXIgY2hlY2tzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIHZhbGlkOiByZXN1bHQuZXJyb3JzLmxlbmd0aCA9PT0gMFxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVtb3J5IHRvIHN0cmluZ1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5leHRlbnNpb25zLFxuICAgICAgZW50cmllczogQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuZCB2YWxpZGF0ZSBhIHNpbmdsZSBtZW1vcnkgZW50cnkgZHVyaW5nIGRlc2VyaWFsaXphdGlvblxuICAgKiBGSVggIzEzMTU6IFJlYWRzIHRydXN0IGxldmVsIGZyb20gbWV0YWRhdGEgaW5zdGVhZCBvZiByZS12YWxpZGF0aW5nXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBlbnRyeSB3YXMgbG9hZGVkLCBmYWxzZSBpZiBxdWFyYW50aW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzRGVzZXJpYWxpemVkRW50cnkoZW50cnk6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEVudHJ5KGVudHJ5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZJWCAjMTMxNTogUmVhZCB0cnVzdCBsZXZlbCBmcm9tIG1ldGFkYXRhIChzZXQgYnkgYmFja2dyb3VuZCB2YWxpZGF0aW9uKVxuICAgIC8vIERvbid0IHJlLXZhbGlkYXRlIG9uIGxvYWQgLSB0cnVzdCB0aGUgc3RvcmVkIHRydXN0IGxldmVsXG4gICAgY29uc3QgdHJ1c3RMZXZlbCA9IGVudHJ5LnRydXN0TGV2ZWwgfHwgVFJVU1RfTEVWRUxTLlVOVFJVU1RFRDtcblxuICAgIC8vIE9ubHkgc2tpcCBRVUFSQU5USU5FRCBlbnRyaWVzXG4gICAgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5RVUFSQU5USU5FRCkge1xuICAgICAgLy8gTG9nIHF1YXJhbnRpbmUgZXZlbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmRlc2VyaWFsaXplJyxcbiAgICAgICAgZGV0YWlsczogYFNraXBwaW5nIHF1YXJhbnRpbmVkIGVudHJ5IGluIG1lbW9yeSBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiIG9uIGxvYWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGVudHJ5SWQ6IGVudHJ5LmlkLFxuICAgICAgICAgIG1lbW9yeU5hbWU6IHRoaXMubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBhY3Rpb246ICdza2lwX3F1YXJhbnRpbmVkX29uX2xvYWQnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBFbnRyeSBxdWFyYW50aW5lZCwgZG9uJ3QgbG9hZFxuICAgIH1cblxuICAgIC8vIFNhbml0aXplIGNvbnRlbnQgKGJhc2ljIFVuaWNvZGUgbm9ybWFsaXphdGlvbiArIERPTVB1cmlmeSBvbmx5KVxuICAgIGVudHJ5LmNvbnRlbnQgPSB0aGlzLnNhbml0aXplV2l0aENhY2hlKGVudHJ5LmNvbnRlbnQsIE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJZX1NJWkUpO1xuICAgIGVudHJ5LnRhZ3MgPSB0aGlzLnNhbml0aXplVGFncyhlbnRyeS50YWdzIHx8IFtdKTtcbiAgICBlbnRyeS50aW1lc3RhbXAgPSBuZXcgRGF0ZShlbnRyeS50aW1lc3RhbXApO1xuICAgIGVudHJ5LnRydXN0TGV2ZWwgPSB0cnVzdExldmVsOyAgLy8gVXNlIHRydXN0IGxldmVsIGZyb20gZmlsZVxuICAgIGVudHJ5LnNvdXJjZSA9IGVudHJ5LnNvdXJjZSB8fCAnbG9hZGVkJztcblxuICAgIGlmIChlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgIGVudHJ5LmV4cGlyZXNBdCA9IG5ldyBEYXRlKGVudHJ5LmV4cGlyZXNBdCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgIHJldHVybiB0cnVlOyAvLyBFbnRyeSBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgbWVtb3J5IGZyb20gc3RyaW5nXG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgYWxsIGxvYWRlZCBkYXRhXG4gICAqIEZJWCAjMTI2OTogQWRkZWQgQ29udGVudFZhbGlkYXRvciB0byBwcmV2ZW50IGxvYWRpbmcgaW5mZWN0ZWQgbWVtb3JpZXNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkZXNlcmlhbGl6ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgLy8gVmFsaWRhdGUgYmFzaWMgc3RydWN0dXJlXG4gICAgICBpZiAoIXBhcnNlZC5pZCB8fCAhcGFyc2VkLnR5cGUgfHwgcGFyc2VkLnR5cGUgIT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWVtb3J5IGRhdGEgZm9ybWF0Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmlkID0gcGFyc2VkLmlkO1xuICAgICAgdGhpcy52ZXJzaW9uID0gbm9ybWFsaXplVmVyc2lvbihTdHJpbmcocGFyc2VkLnZlcnNpb24gPz8gJzEuMC4wJykpO1xuICAgICAgdGhpcy5tZXRhZGF0YSA9IHBhcnNlZC5tZXRhZGF0YSB8fCB7fTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHBhcnNlZC5leHRlbnNpb25zIHx8IHt9O1xuXG4gICAgICAvLyBDbGVhciBhbmQgcmVsb2FkIGVudHJpZXNcbiAgICAgIHRoaXMuZW50cmllcy5jbGVhcigpO1xuICAgICAgbGV0IHF1YXJhbnRpbmVkQ291bnQgPSAwO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWQuZW50cmllcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXJzZWQuZW50cmllcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMucHJvY2Vzc0Rlc2VyaWFsaXplZEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICAgICAgcXVhcmFudGluZWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb2cgd2FybmluZyBpZiBlbnRyaWVzIHdlcmUgcXVhcmFudGluZWRcbiAgICAgIGlmIChxdWFyYW50aW5lZENvdW50ID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgUXVhcmFudGluZWQgJHtxdWFyYW50aW5lZENvdW50fSBpbmZlY3RlZCBlbnRyaWVzIGZyb20gbWVtb3J5IFwiJHt0aGlzLm1ldGFkYXRhLm5hbWV9XCJgLCB7XG4gICAgICAgICAgbWVtb3J5TmFtZTogdGhpcy5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIHRvdGFsRW50cmllczogcGFyc2VkLmVudHJpZXM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICAgIHF1YXJhbnRpbmVkOiBxdWFyYW50aW5lZENvdW50LFxuICAgICAgICAgIGxvYWRlZDogdGhpcy5lbnRyaWVzU2l6ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gSXNzdWUgIzUxOiBDaGVjayBpZiByZXRlbnRpb24gZW5mb3JjZW1lbnQgc2hvdWxkIGhhcHBlbiBvbiBsb2FkXG4gICAgICAvLyBJTVBPUlRBTlQ6IFJldGVudGlvbiBlbmZvcmNlbWVudCBpcyBub3cgb3B0LWluLCBub3QgYXV0b21hdGljXG4gICAgICAvLyBOT1RFOiBXcmFwcGVkIGluIHRyeS9jYXRjaCB0byBoYW5kbGUgdGVzdCBlbnZpcm9ubWVudHMgd2hlcmUgQ29uZmlnTWFuYWdlciBtYXkgbm90IGJlIGluaXRpYWxpemVkXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXRlbnRpb25TZXJ2aWNlID0gTWVtb3J5LmdldFJldGVudGlvblBvbGljeVNlcnZpY2UoKTtcbiAgICAgICAgaWYgKHJldGVudGlvblNlcnZpY2U/LnNob3VsZEVuZm9yY2VPbkxvYWQoKSkge1xuICAgICAgICAgIC8vIFVzZXIgaGFzIGV4cGxpY2l0bHkgZW5hYmxlZCBvbi1sb2FkIGVuZm9yY2VtZW50XG4gICAgICAgICAgdGhpcy5lbmZvcmNlUmV0ZW50aW9uUG9saWN5KCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5XSBSZXRlbnRpb24gcG9saWN5IGVuZm9yY2VkIG9uIGxvYWQgZm9yIFwiJHt0aGlzLm1ldGFkYXRhLm5hbWV9XCJgLCB7XG4gICAgICAgICAgICBlbmZvcmNlbWVudE1vZGU6ICdvbl9sb2FkJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJldGVudGlvblNlcnZpY2U/LmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgLy8gUmV0ZW50aW9uIGlzIGVuYWJsZWQgYnV0IG5vdCBzZXQgdG8gb25fbG9hZCBtb2RlIC0gbG9nIGZvciB2aXNpYmlsaXR5XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5XSBSZXRlbnRpb24gaXMgZW5hYmxlZCBidXQgbm90IGVuZm9yY2VkIG9uIGxvYWQgZm9yIFwiJHt0aGlzLm1ldGFkYXRhLm5hbWV9XCJgLCB7XG4gICAgICAgICAgICBub3RlOiAnVXNlIGV4cGxpY2l0IGVuZm9yY2VtZW50IGNvbW1hbmQgdG8gY2xlYW51cCBleHBpcmVkIGVudHJpZXMnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgcmV0ZW50aW9uU2VydmljZSBpcyBub3QgY29uZmlndXJlZCBvciBkaXNhYmxlZCwgbm8gZW5mb3JjZW1lbnQgaGFwcGVuc1xuICAgICAgICAvLyBUaGlzIGlzIHRoZSBzYWZlIGRlZmF1bHQgLSBub3RoaW5nIGlzIGRlbGV0ZWQgd2l0aG91dCBleHBsaWNpdCBjb25zZW50XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIHJldGVudGlvbiBwb2xpY3kgZXJyb3JzIGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGluIHRlc3QgZW52aXJvbm1lbnRzIHdoZXJlIENvbmZpZ01hbmFnZXIgaXMgbm90IGluaXRpYWxpemVkLFxuICAgICAgICAvLyBvciB3aGVuIGEgc3RhbGUgcmVzb2x2ZXIgcmVmZXJlbmNlcyBhIGRpc3Bvc2VkIHNlcnZpY2UgaW5zdGFuY2VcbiAgICAgICAgLy8gSXQncyBzYWZlIHRvIHNraXAgcmV0ZW50aW9uIGVuZm9yY2VtZW50IGluIHRoZXNlIGNhc2VzIC0gdGhlIGRlZmF1bHQgaXMgbm8gZGVsZXRpb25cbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0RFU0VSSUFMSVpFX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmRlc2VyaWFsaXplJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSBtZW1vcnk6ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIFxuICAvLyBQcml2YXRlIGhlbHBlciBtZXRob2RzXG4gIFxuICBwcml2YXRlIGNhbGN1bGF0ZUV4cGlyeURhdGUoKTogRGF0ZSB7XG4gICAgY29uc3QgZXhwaXJ5ID0gbmV3IERhdGUoKTtcbiAgICBleHBpcnkuc2V0RGF0ZShleHBpcnkuZ2V0RGF0ZSgpICsgdGhpcy5yZXRlbnRpb25EYXlzKTtcbiAgICByZXR1cm4gZXhwaXJ5O1xuICB9XG4gIFxuICBwcml2YXRlIHNhbml0aXplVGFncyh0YWdzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IExpbWl0IG51bWJlciBvZiB0YWdzIGFuZCBzYW5pdGl6ZSBlYWNoXG4gICAgY29uc3QgbGltaXRlZFRhZ3MgPSB0YWdzLnNsaWNlKDAsIE1FTU9SWV9DT05TVEFOVFMuTUFYX1RBR1NfUEVSX0VOVFJZKTtcbiAgICBcbiAgICByZXR1cm4gbGltaXRlZFRhZ3NcbiAgICAgIC5tYXAodGFnID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHRhZykubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgICAgIHJldHVybiBzYW5pdGl6ZUlucHV0KG5vcm1hbGl6ZWQsIE1FTU9SWV9DT05TVEFOVFMuTUFYX1RBR19MRU5HVEgpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIodGFnID0+IHRhZyAmJiB0YWcubGVuZ3RoID4gMCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIW1ldGFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWDogU2FuaXRpemUgbWV0YWRhdGEgdmFsdWVzXG4gICAgY29uc3Qgc2FuaXRpemVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgbWF4S2V5cyA9IE1FTU9SWV9DT05TVEFOVFMuTUFYX01FVEFEQVRBX0tFWVM7XG4gICAgbGV0IGtleUNvdW50ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YSkpIHtcbiAgICAgIGlmIChrZXlDb3VudCA+PSBtYXhLZXlzKSBicmVhaztcbiAgICAgIFxuICAgICAgY29uc3Qgc2FuaXRpemVkS2V5ID0gc2FuaXRpemVJbnB1dChrZXksIE1FTU9SWV9DT05TVEFOVFMuTUFYX01FVEFEQVRBX0tFWV9MRU5HVEgpO1xuICAgICAgaWYgKHNhbml0aXplZEtleSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNhbml0aXplZFtzYW5pdGl6ZWRLZXldID0gc2FuaXRpemVJbnB1dCh2YWx1ZSwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVUQURBVEFfVkFMVUVfTEVOR1RIKTtcbiAgICAgICAga2V5Q291bnQrKztcbiAgICAgIH0gZWxzZSBpZiAoc2FuaXRpemVkS2V5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2FuaXRpemVkW3Nhbml0aXplZEtleV0gPSB2YWx1ZTtcbiAgICAgICAga2V5Q291bnQrKztcbiAgICAgIH1cbiAgICAgIC8vIFNraXAgb3RoZXIgdHlwZXMgZm9yIHNlY3VyaXR5XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cbiAgXG4gIHByaXZhdGUgY2FuQWNjZXNzUHJpdmFjeUxldmVsKGVudHJ5TGV2ZWw6IHN0cmluZywgcmVxdWVzdGVkTGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxldmVscyA9IE1FTU9SWV9DT05TVEFOVFMuUFJJVkFDWV9MRVZFTFM7XG4gICAgY29uc3QgZW50cnlJbmRleCA9IGxldmVscy5pbmRleE9mKGVudHJ5TGV2ZWwgYXMgUHJpdmFjeUxldmVsKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRJbmRleCA9IGxldmVscy5pbmRleE9mKHJlcXVlc3RlZExldmVsIGFzIFByaXZhY3lMZXZlbCk7XG4gICAgXG4gICAgLy8gQ2FuIG9ubHkgYWNjZXNzIGVudHJpZXMgYXQgb3IgYmVsb3cgdGhlIHJlcXVlc3RlZCBwcml2YWN5IGxldmVsXG4gICAgLy8gZS5nLiwgaWYgcmVxdWVzdGluZyAncHJpdmF0ZScsIGNhbiBzZWUgJ3B1YmxpYycgYW5kICdwcml2YXRlJyBidXQgbm90ICdzZW5zaXRpdmUnXG4gICAgcmV0dXJuIGVudHJ5SW5kZXggPD0gcmVxdWVzdGVkSW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRFbnRyeShlbnRyeTogdW5rbm93bik6IGVudHJ5IGlzIE1lbW9yeUVudHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJlxuICAgICAgZW50cnkgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiAoZW50cnkgYXMgYW55KS5pZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHR5cGVvZiAoZW50cnkgYXMgYW55KS5jb250ZW50ID09PSAnc3RyaW5nJyAmJlxuICAgICAgKGVudHJ5IGFzIGFueSkudGltZXN0YW1wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICghKGVudHJ5IGFzIGFueSkudGFncyB8fCBBcnJheS5pc0FycmF5KChlbnRyeSBhcyBhbnkpLnRhZ3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpbWl6ZWQgc2FuaXRpemF0aW9uIHdpdGggY2hlY2tzdW0gY2FjaGluZ1xuICAgKiBBdm9pZHMgcmUtc2FuaXRpemluZyBjb250ZW50IHRoYXQgaGFzbid0IGNoYW5nZWRcbiAgICogQHBhcmFtIGNvbnRlbnQgQ29udGVudCB0byBzYW5pdGl6ZVxuICAgKiBAcGFyYW0gbWF4TGVuZ3RoIE1heGltdW0gYWxsb3dlZCBsZW5ndGhcbiAgICogQHJldHVybnMgU2FuaXRpemVkIGNvbnRlbnRcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVXaXRoQ2FjaGUoY29udGVudDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgLy8gR2VuZXJhdGUgY2hlY2tzdW0gZm9yIHRoZSBpbnB1dFxuICAgIGNvbnN0IGNoZWNrc3VtID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSBzYW5pdGl6ZWQgdGhpcyBleGFjdCBjb250ZW50XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjaGVja3N1bX06JHttYXhMZW5ndGh9YDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNhbml0aXphdGlvbkNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIHNhbml0aXphdGlvblxuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50LCBtYXhMZW5ndGgpO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCAobGltaXQgY2FjaGUgc2l6ZSB0byBwcmV2ZW50IG1lbW9yeSBpc3N1ZXMpXG4gICAgaWYgKHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuc2l6ZSA+IDEwMDApIHtcbiAgICAgIC8vIFJlbW92ZSBvbGRlc3QgZW50cmllcyAoc2ltcGxlIEZJRk8pXG4gICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChmaXJzdEtleSkgdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5kZWxldGUoZmlyc3RLZXkpO1xuICAgIH1cbiAgICB0aGlzLnNhbml0aXphdGlvbkNhY2hlLnNldChjYWNoZUtleSwgc2FuaXRpemVkKTtcblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgc2VhcmNoIGluZGV4IHdpdGggcmV0cnkgbG9naWNcbiAgICogQXR0ZW1wdHMgdG8gYnVpbGQgdGhlIGluZGV4IHVwIHRvIDMgdGltZXMgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAqIFRoaXMgZW5zdXJlcyBzZWFyY2ggZnVuY3Rpb25hbGl0eSBldmVuIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgZmFpbHVyZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRTZWFyY2hJbmRleFdpdGhSZXRyeShyZXRyaWVzID0gMyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlYXJjaEluZGV4LmJ1aWxkSW5kZXgodGhpcy5lbnRyaWVzKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBTZWFyY2ggaW5kZXggYnVpbHQgc3VjY2Vzc2Z1bGx5IG9uIGF0dGVtcHQgJHthdHRlbXB0fWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG4gICAgICAgIGxvZ2dlci53YXJuKGBTZWFyY2ggaW5kZXggYnVpbGQgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZGAsIHtcbiAgICAgICAgICBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgZW50cmllc0NvdW50OiB0aGlzLmVudHJpZXNTaXplXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhdHRlbXB0IDwgcmV0cmllcykge1xuICAgICAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmY6IDEwMG1zLCAyMDBtcywgNDAwbXNcbiAgICAgICAgICBjb25zdCBkZWxheSA9IE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKSAqIDEwMDtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGdldCBoZXJlLCBhbGwgcmV0cmllcyBmYWlsZWRcbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCdGYWlsZWQgdG8gYnVpbGQgc2VhcmNoIGluZGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnRyaWVzIHdpdGggYSBzcGVjaWZpYyB0cnVzdCBsZXZlbFxuICAgKiBGSVggIzEzMjA6IFB1YmxpYyBBUEkgZm9yIGFjY2Vzc2luZyBlbnRyaWVzIGJ5IHRydXN0IGxldmVsXG4gICAqIFVzZWQgYnkgQmFja2dyb3VuZFZhbGlkYXRvciB0byBmaW5kIHVudHJ1c3RlZCBlbnRyaWVzXG4gICAqXG4gICAqIEBwYXJhbSB0cnVzdExldmVsIC0gVGhlIHRydXN0IGxldmVsIHRvIGZpbHRlciBieVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBtZW1vcnkgZW50cmllcyBtYXRjaGluZyB0aGUgdHJ1c3QgbGV2ZWxcbiAgICovXG4gIHB1YmxpYyBnZXRFbnRyaWVzQnlUcnVzdExldmVsKHRydXN0TGV2ZWw6IFRydXN0TGV2ZWwpOiBNZW1vcnlFbnRyeVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnRydXN0TGV2ZWwgPT09IHRydXN0TGV2ZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW50cmllcyBpbiB0aGlzIG1lbW9yeVxuICAgKiBGSVggIzEzMjA6IFB1YmxpYyBBUEkgZm9yIGFjY2Vzc2luZyBhbGwgZW50cmllc1xuICAgKiBSZXBsYWNlcyB0aGUgbmVlZCBmb3IgYChtZW1vcnkgYXMgYW55KS5lbnRyaWVzYCBoYWNrc1xuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBhbGwgbWVtb3J5IGVudHJpZXNcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxFbnRyaWVzKCk6IE1lbW9yeUVudHJ5W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbnRyaWVzIG1hcCBkaXJlY3RseVxuICAgKiBVc2VkIGJ5IFJldGVudGlvblBvbGljeVNlcnZpY2UgZm9yIHJldGVudGlvbiBlbmZvcmNlbWVudCAoSXNzdWUgIzUxKVxuICAgKlxuICAgKiBAcmV0dXJucyBNYXAgb2YgZW50cnkgSUQgdG8gbWVtb3J5IGVudHJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0RW50cmllcygpOiBNYXA8c3RyaW5nLCBNZW1vcnlFbnRyeT4ge1xuICAgIC8vIFJldHVybiBhIG5ldyBNYXAgdG8gcHJldmVudCBleHRlcm5hbCBtb2RpZmljYXRpb24gb2YgaW50ZXJuYWwgc3RhdGVcbiAgICByZXR1cm4gbmV3IE1hcCh0aGlzLmVudHJpZXMuZW50cmllcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzcGVjaWZpYyBlbnRyeSBieSBJRFxuICAgKiBGSVggIzUxOiBQdWJsaWMgQVBJIGZvciByZXRlbnRpb24gcG9saWN5IHRvIHJlbW92ZSBleHBpcmVkIGVudHJpZXNcbiAgICogUmVwbGFjZXMgdGhlIG5lZWQgZm9yIGAobWVtb3J5IGFzIGFueSkuZW50cmllcy5kZWxldGUoKWAgaGFja3NcbiAgICpcbiAgICogQHBhcmFtIGVudHJ5SWQgLSBUaGUgSUQgb2YgdGhlIGVudHJ5IHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGVudHJ5IHdhcyByZW1vdmVkLCBmYWxzZSBpZiBub3QgZm91bmRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5lbnRyaWVzLmRlbGV0ZShlbnRyeUlkKTtcbiAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgLy8gSXNzdWUgIzIzMjk6IGtlZXAgdGhlIHNlYXJjaCBpbmRleCBjb25zaXN0ZW50IHdpdGggdGhlIGVudHJpZXMgbWFwIOKAlFxuICAgICAgLy8gcHJldmlvdXNseSByZW1vdmVkIGVudHJpZXMgc3RheWVkIHNlYXJjaGFibGUgdW50aWwgYSBmdWxsIGluZGV4IHJlYnVpbGQuXG4gICAgICB0aGlzLnNlYXJjaEluZGV4LnJlbW92ZUVudHJ5KGVudHJ5SWQpO1xuICAgICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiByZW1vdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpdGVyYXRvciBvdmVyIGFsbCBlbnRyaWVzXG4gICAqIEZJWCAjMTMyMDogTWVtb3J5LWVmZmljaWVudCB3YXkgdG8gaXRlcmF0ZSBlbnRyaWVzXG4gICAqXG4gICAqIEByZXR1cm5zIEl0ZXJhdG9yIG92ZXIgbWVtb3J5IGVudHJpZXNcbiAgICovXG4gIHB1YmxpYyAqZ2V0RW50cmllc0l0ZXJhdG9yKCk6IEl0ZXJhYmxlSXRlcmF0b3I8TWVtb3J5RW50cnk+IHtcbiAgICB5aWVsZCogdGhpcy5lbnRyaWVzLnZhbHVlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmlsZSBwYXRoIGZvciB0aGlzIG1lbW9yeVxuICAgKiBGSVggIzEzMjA6IFVzZWQgYnkgTWVtb3J5TWFuYWdlciBhZnRlciBsb2FkaW5nXG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IEFkZGVkIGlucHV0IHZhbGlkYXRpb24gd2l0aCBwcm9wZXIgZXJyb3IgdHlwZXNcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZmlsZSBwYXRoIHdoZXJlIHRoaXMgbWVtb3J5IGlzIHN0b3JlZFxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHBhdGggaXMgbm90IGEgc3RyaW5nXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBwYXRoIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgc2V0RmlsZVBhdGgocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWVtb3J5IGZpbGUgcGF0aCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChwYXRoLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGZpbGUgcGF0aCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgdGhpcy5maWxlUGF0aCA9IHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIHBhdGggZm9yIHRoaXMgbWVtb3J5XG4gICAqIEZJWCAjMTMyMDogUmV0dXJucyB0aGUgcGF0aCB3aGVyZSB0aGlzIG1lbW9yeSBpcyBzdG9yZWRcbiAgICogQHJldHVybnMgVGhlIGZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIGlmIG5vdCB5ZXQgcGVyc2lzdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsZVBhdGgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maWxlUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoaXMgbWVtb3J5IHRvIGRpc2tcbiAgICogRklYICMxMzIwOiBJbnN0YW5jZSBtZXRob2QgZm9yIHBlcnNpc3RpbmcgbWVtb3J5IGNoYW5nZXNcbiAgICogVXNlZCBieSBCYWNrZ3JvdW5kVmFsaWRhdG9yIHRvIHNhdmUgdXBkYXRlZCB0cnVzdCBsZXZlbHNcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2F2ZSBpcyBjb21wbGV0ZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbWVtb3J5IGhhcyBub3QgYmVlbiBsb2FkZWQgZnJvbSBmaWxlIGFuZCBubyBwYXRoIGlzIHNldFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1lbW9yeS5nZXRNZW1vcnlNYW5hZ2VyKCk7XG4gICAgYXdhaXQgbWFuYWdlci5zYXZlKHRoaXMsIHRoaXMuZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYWxsIG1lbW9yaWVzIHRoYXQgaGF2ZSBlbnRyaWVzIHdpdGggYSBzcGVjaWZpYyB0cnVzdCBsZXZlbFxuICAgKiBGSVggIzEzMjA6IFN0YXRpYyBxdWVyeSBBUEkgZm9yIGZpbmRpbmcgbWVtb3JpZXMgYnkgdHJ1c3QgbGV2ZWxcbiAgICogVXNlZCBieSBCYWNrZ3JvdW5kVmFsaWRhdG9yIHRvIGRpc2NvdmVyIHVudHJ1c3RlZCBtZW1vcmllc1xuICAgKlxuICAgKiBAcGFyYW0gdHJ1c3RMZXZlbCAtIFRoZSB0cnVzdCBsZXZlbCB0byBmaWx0ZXIgYnlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBxdWVyeSBvcHRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbWl0IC0gTWF4aW11bSBudW1iZXIgb2YgbWVtb3JpZXMgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIG1lbW9yaWVzIHdpdGggbWF0Y2hpbmcgZW50cmllc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kQnlUcnVzdExldmVsKFxuICAgIHRydXN0TGV2ZWw6IFRydXN0TGV2ZWwsXG4gICAgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1lbW9yeS5nZXRNZW1vcnlNYW5hZ2VyKCk7XG5cbiAgICAvLyBMb2FkIGFsbCBtZW1vcmllcyBhbmQgZmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAgY29uc3QgYWxsTWVtb3JpZXMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcbiAgICBjb25zdCBtYXRjaGluZ01lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtZW1vcnkgb2YgYWxsTWVtb3JpZXMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgbWVtb3J5IGhhcyBhbnkgZW50cmllcyB3aXRoIHRoZSBzcGVjaWZpZWQgdHJ1c3QgbGV2ZWxcbiAgICAgIGNvbnN0IGhhc01hdGNoaW5nRW50cmllcyA9IG1lbW9yeS5nZXRFbnRyaWVzQnlUcnVzdExldmVsKHRydXN0TGV2ZWwpLmxlbmd0aCA+IDA7XG5cbiAgICAgIGlmIChoYXNNYXRjaGluZ0VudHJpZXMpIHtcbiAgICAgICAgbWF0Y2hpbmdNZW1vcmllcy5wdXNoKG1lbW9yeSk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGltaXQgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChvcHRpb25zPy5saW1pdCAmJiBtYXRjaGluZ01lbW9yaWVzLmxlbmd0aCA+PSBvcHRpb25zLmxpbWl0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIG1lbW9yaWVzIHdpdGggdHJ1c3QgbGV2ZWwnLCB7XG4gICAgICB0cnVzdExldmVsLFxuICAgICAgY291bnQ6IG1hdGNoaW5nTWVtb3JpZXMubGVuZ3RoLFxuICAgICAgbGltaXQ6IG9wdGlvbnM/LmxpbWl0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmdNZW1vcmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmFsIHF1ZXJ5IEFQSSBmb3IgZmluZGluZyBtZW1vcmllc1xuICAgKiBGSVggIzEzMjA6IEZsZXhpYmxlIHF1ZXJ5IEFQSSBmb3IgbXVsdGlwbGUgY3JpdGVyaWFcbiAgICogRklYIChTb25hckNsb3VkKTogUmVmYWN0b3JlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgZnJvbSAyMCB0byA4XG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBRdWVyeSBmaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIGZpbHRlci50cnVzdExldmVsIC0gRmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAqIEBwYXJhbSBmaWx0ZXIudGFncyAtIEZpbHRlciBieSB0YWdzXG4gICAqIEBwYXJhbSBmaWx0ZXIubWF4QWdlIC0gRmlsdGVyIGJ5IGFnZSBpbiBkYXlzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIG1hdGNoaW5nIG1lbW9yaWVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmQoZmlsdGVyOiB7XG4gICAgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIG1heEFnZT86IG51bWJlcjtcbiAgfSk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gTWVtb3J5LmdldE1lbW9yeU1hbmFnZXIoKTtcblxuICAgIC8vIExvYWQgYWxsIG1lbW9yaWVzXG4gICAgY29uc3QgYWxsTWVtb3JpZXMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBjdXRvZmYgZGF0ZSBpZiBtYXhBZ2UgaXMgc3BlY2lmaWVkXG4gICAgY29uc3QgY3V0b2ZmRGF0ZSA9IGZpbHRlci5tYXhBZ2VcbiAgICAgID8gbmV3IERhdGUoRGF0ZS5ub3coKSAtIGZpbHRlci5tYXhBZ2UgKiAyNCAqIDYwICogNjAgKiAxMDAwKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBGaWx0ZXIgbWVtb3JpZXMgdXNpbmcgaGVscGVyIG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdHMgPSBhbGxNZW1vcmllcy5maWx0ZXIobWVtb3J5ID0+XG4gICAgICB0aGlzLm1hdGNoZXNGaWx0ZXIobWVtb3J5LCBmaWx0ZXIsIGN1dG9mZkRhdGUpXG4gICAgKTtcblxuICAgIGxvZ2dlci5kZWJ1ZygnTWVtb3J5IHF1ZXJ5IGNvbXBsZXRlJywge1xuICAgICAgZmlsdGVyLFxuICAgICAgcmVzdWx0Q291bnQ6IHJlc3VsdHMubGVuZ3RoXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1lbW9yeSBtYXRjaGVzIHRoZSBnaXZlbiBmaWx0ZXIgY3JpdGVyaWFcbiAgICogRklYIChTb25hckNsb3VkKTogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hlc0ZpbHRlcihcbiAgICBtZW1vcnk6IE1lbW9yeSxcbiAgICBmaWx0ZXI6IHsgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7IHRhZ3M/OiBzdHJpbmdbXTsgbWF4QWdlPzogbnVtYmVyIH0sXG4gICAgY3V0b2ZmRGF0ZT86IERhdGVcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gRmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAgaWYgKGZpbHRlci50cnVzdExldmVsKSB7XG4gICAgICBjb25zdCBoYXNNYXRjaGluZ1RydXN0TGV2ZWwgPSBtZW1vcnkuZ2V0RW50cmllc0J5VHJ1c3RMZXZlbChmaWx0ZXIudHJ1c3RMZXZlbCkubGVuZ3RoID4gMDtcbiAgICAgIGlmICghaGFzTWF0Y2hpbmdUcnVzdExldmVsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgYnkgdGFnc1xuICAgIGlmIChmaWx0ZXIudGFncyAmJiBmaWx0ZXIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtZW1vcnlUYWdzID0gbWVtb3J5Lm1ldGFkYXRhLnRhZ3MgfHwgW107XG4gICAgICBjb25zdCBoYXNNYXRjaGluZ1RhZyA9IGZpbHRlci50YWdzLnNvbWUodGFnID0+IG1lbW9yeVRhZ3MuaW5jbHVkZXModGFnKSk7XG4gICAgICBpZiAoIWhhc01hdGNoaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgYnkgYWdlXG4gICAgaWYgKGN1dG9mZkRhdGUpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0gbWVtb3J5LmdldFN0YXRzKCk7XG4gICAgICBpZiAoIXN0YXRzLm5ld2VzdEVudHJ5IHx8IHN0YXRzLm5ld2VzdEVudHJ5IDwgY3V0b2ZmRGF0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==
|