@dollhousemcp/mcp-server 2.0.35 → 2.0.37

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  3. package/dist/elements/base/BaseElementManager.js +6 -2
  4. package/dist/elements/memories/Memory.d.ts.map +1 -1
  5. package/dist/elements/memories/Memory.js +9 -2
  6. package/dist/elements/memories/MemoryManager.d.ts +13 -0
  7. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  8. package/dist/elements/memories/MemoryManager.js +57 -44
  9. package/dist/elements/memories/constants.js +2 -2
  10. package/dist/elements/templates/Template.d.ts +2 -0
  11. package/dist/elements/templates/Template.d.ts.map +1 -1
  12. package/dist/elements/templates/Template.js +9 -1
  13. package/dist/generated/version.d.ts +2 -2
  14. package/dist/generated/version.js +3 -3
  15. package/dist/handlers/GitHubAuthHandler.d.ts +12 -0
  16. package/dist/handlers/GitHubAuthHandler.d.ts.map +1 -1
  17. package/dist/handlers/GitHubAuthHandler.js +303 -60
  18. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  19. package/dist/handlers/element-crud/editElement.js +24 -11
  20. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +62 -0
  21. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/MCPAQLHandler.js +209 -34
  23. package/dist/security/contentValidator.d.ts +32 -1
  24. package/dist/security/contentValidator.d.ts.map +1 -1
  25. package/dist/security/contentValidator.js +79 -33
  26. package/dist/security/secureYamlParser.d.ts.map +1 -1
  27. package/dist/security/secureYamlParser.js +5 -2
  28. package/dist/security/tokenManager.d.ts +1 -1
  29. package/dist/security/tokenManager.d.ts.map +1 -1
  30. package/dist/security/tokenManager.js +10 -7
  31. package/dist/storage/MemoryMetadataExtractor.d.ts +4 -1
  32. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  33. package/dist/storage/MemoryMetadataExtractor.js +7 -3
  34. package/dist/utils/pathSecurity.d.ts +3 -1
  35. package/dist/utils/pathSecurity.d.ts.map +1 -1
  36. package/dist/utils/pathSecurity.js +38 -2
  37. package/dist/web/routes/setupRoutes.d.ts +23 -7
  38. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  39. package/dist/web/routes/setupRoutes.js +138 -20
  40. package/oauth-helper.mjs +233 -92
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -20,7 +20,6 @@ import { LRUCache } from '../../cache/LRUCache.js';
20
20
  import { SecurityMonitor } from '../../security/securityMonitor.js';
21
21
  import { logger } from '../../utils/logger.js';
22
22
  import { sanitizeInput } from '../../security/InputValidator.js';
23
- import { ContentValidator } from '../../security/contentValidator.js';
24
23
  import { SecureYamlParser } from '../../security/secureYamlParser.js';
25
24
  import { SECURITY_LIMITS } from '../../security/constants.js';
26
25
  import { MEMORY_CONSTANTS, MEMORY_SECURITY_EVENTS } from './constants.js';
@@ -501,46 +500,7 @@ export class MemoryManager extends BaseElementManager {
501
500
  // Ensure parent directory exists
502
501
  await this.fileOperations.createDirectory(path.dirname(fullPath));
503
502
  const yamlContent = await this.serializeElement(element);
504
- // Fix #916/#918: Size enforcement on Memory's custom save path
505
- // (BaseElementManager.save() has this but Memory overrides it entirely)
506
- if (yamlContent.length > SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES) {
507
- SecurityMonitor.logSecurityEvent({
508
- type: MEMORY_SECURITY_EVENTS.MEMORY_SAVE_FAILED,
509
- severity: 'HIGH',
510
- source: 'MemoryManager.save.sizeEnforcement',
511
- details: `Memory exceeds maximum file size (${yamlContent.length} > ${SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES})`,
512
- metadata: { contentLength: yamlContent.length, limit: SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES }
513
- });
514
- throw new Error(`Memory exceeds maximum file size (${yamlContent.length} > ${SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES})`);
515
- }
516
- // Fix #908/#918: YAML bomb detection on Memory's custom save path
517
- const validationStart = Date.now();
518
- if (yamlContent.length <= SECURITY_LIMITS.MAX_YAML_LENGTH) {
519
- if (!ContentValidator.validateYamlContent(yamlContent)) {
520
- SecurityMonitor.logSecurityEvent({
521
- type: 'YAML_INJECTION_ATTEMPT',
522
- severity: 'CRITICAL',
523
- source: 'MemoryManager.save.yamlBombDetection',
524
- details: 'Serialized memory contains malicious YAML patterns — write blocked',
525
- metadata: { contentLength: yamlContent.length }
526
- });
527
- throw new Error('Serialized memory contains malicious YAML patterns — write blocked');
528
- }
529
- }
530
- const validationMs = Date.now() - validationStart;
531
- if (validationMs > 50) {
532
- logger.warn(`[MemoryManager] Write-path YAML validation took ${validationMs}ms for ${yamlContent.length} bytes`);
533
- }
534
- const parsedYaml = SecureYamlParser.parseRawYaml(yamlContent, SECURITY_LIMITS.MAX_YAML_LENGTH);
535
- const gatekeeperErrors = [
536
- ...getGatekeeperAuthoringErrors(parsedYaml),
537
- ...getGatekeeperAuthoringErrors(parsedYaml.metadata && typeof parsedYaml.metadata === 'object' && !Array.isArray(parsedYaml.metadata)
538
- ? parsedYaml.metadata
539
- : undefined),
540
- ];
541
- if (gatekeeperErrors.length > 0) {
542
- throw new Error(`Invalid gatekeeper policy in serialized memory YAML: ${[...new Set(gatekeeperErrors)].join('; ')}`);
543
- }
503
+ this.validateSerializedMemoryYaml(yamlContent);
544
504
  // CRITICAL FIX: Use FileOperationsService for atomic file write
545
505
  // Previously: await fs.writeFile(fullPath, yamlContent, 'utf-8');
546
506
  // Now: Uses FileOperationsService which wraps FileLockManager
@@ -553,8 +513,7 @@ export class MemoryManager extends BaseElementManager {
553
513
  // Cache via base class LRU cache
554
514
  this.cacheElement(element, relativePath);
555
515
  // Phase 2: Notify storage layer of save
556
- const relPath = path.relative(this.memoriesDir, fullPath).split(path.sep).join('/');
557
- await this.storageLayer.notifySaved(relPath, fullPath);
516
+ await this.storageLayer.notifySaved(relativePath, fullPath);
558
517
  // Update bounded content hash index
559
518
  this.contentHashIndex.set(contentHash, fullPath);
560
519
  this.contentHashByPath.set(fullPath, contentHash);
@@ -577,6 +536,60 @@ export class MemoryManager extends BaseElementManager {
577
536
  throw new Error(`Failed to save memory: ${error}`);
578
537
  }
579
538
  }
539
+ /**
540
+ * Issue #2329: Serialize and run the full save-path validation without writing to disk.
541
+ * Lets callers reject a mutation immediately (e.g. addEntry) when the memory can no
542
+ * longer be persisted, instead of the failure surfacing only in a deferred save
543
+ * where it cannot be reported back to the caller.
544
+ */
545
+ async assertPersistable(element) {
546
+ const yamlContent = await this.serializeElement(element);
547
+ this.validateSerializedMemoryYaml(yamlContent);
548
+ }
549
+ /**
550
+ * Validation applied to serialized memory YAML before any disk write.
551
+ * Shared by save() and assertPersistable() so the pre-flight check and the
552
+ * actual write can never disagree.
553
+ */
554
+ validateSerializedMemoryYaml(yamlContent) {
555
+ // Fix #916/#918, tightened for #2329: cap at MAX_YAML_SIZE (256KB) — the same
556
+ // limit parseContent() enforces on load. The previous 2MB cap allowed writing
557
+ // files the loader would then reject.
558
+ if (yamlContent.length > MEMORY_CONSTANTS.MAX_YAML_SIZE) {
559
+ SecurityMonitor.logSecurityEvent({
560
+ type: MEMORY_SECURITY_EVENTS.MEMORY_SAVE_FAILED,
561
+ severity: 'HIGH',
562
+ source: 'MemoryManager.save.sizeEnforcement',
563
+ details: `Memory exceeds maximum serialized size (${yamlContent.length} > ${MEMORY_CONSTANTS.MAX_YAML_SIZE})`,
564
+ metadata: { contentLength: yamlContent.length, limit: MEMORY_CONSTANTS.MAX_YAML_SIZE }
565
+ });
566
+ throw new Error(`Memory exceeds maximum serialized size (${yamlContent.length} > ${MEMORY_CONSTANTS.MAX_YAML_SIZE} bytes). ` +
567
+ `This memory is full — start a new memory for additional entries.`);
568
+ }
569
+ // Bomb/injection detection + gatekeeper policy validation. Issue #2329 root
570
+ // cause: this parse previously capped at MAX_YAML_LENGTH (64KB — a frontmatter
571
+ // limit), so every save of a memory whose serialized YAML exceeded 64KB threw
572
+ // here, and the deferred save path swallowed the error while addEntry kept
573
+ // reporting success. The cap now matches the memory size limit enforced above
574
+ // and on load. parseRawYaml runs ContentValidator.validateYamlContent with the
575
+ // same cap internally (Fix #908/#918), so bomb detection covers every size —
576
+ // the previous `<= MAX_YAML_LENGTH` guard skipped it for content over 64KB.
577
+ const validationStart = Date.now();
578
+ const parsedYaml = SecureYamlParser.parseRawYaml(yamlContent, MEMORY_CONSTANTS.MAX_YAML_SIZE);
579
+ const validationMs = Date.now() - validationStart;
580
+ if (validationMs > 50) {
581
+ logger.warn(`[MemoryManager] Write-path YAML validation took ${validationMs}ms for ${yamlContent.length} bytes`);
582
+ }
583
+ const gatekeeperErrors = [
584
+ ...getGatekeeperAuthoringErrors(parsedYaml),
585
+ ...getGatekeeperAuthoringErrors(parsedYaml.metadata && typeof parsedYaml.metadata === 'object' && !Array.isArray(parsedYaml.metadata)
586
+ ? parsedYaml.metadata
587
+ : undefined),
588
+ ];
589
+ if (gatekeeperErrors.length > 0) {
590
+ throw new Error(`Invalid gatekeeper policy in serialized memory YAML: ${[...new Set(gatekeeperErrors)].join('; ')}`);
591
+ }
592
+ }
580
593
  /**
581
594
  * Handle memory load failure
582
595
  * FIX (SonarCloud): Extract duplicated error handling to reduce code duplication
@@ -1807,4 +1820,4 @@ export class MemoryManager extends BaseElementManager {
1807
1820
  }
1808
1821
  }
1809
1822
  }
1810
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFrQixNQUFNLGFBQWEsQ0FBQztBQUVyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLG9CQUFvQixFQUNyQixNQUFNLHVDQUF1QyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVF4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RUFBRSxDQUFDO1FBRWxELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsMEVBQTBFO1lBQzFFLE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RSxNQUFNLFNBQVMsR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRTlFLE1BQU0sQ0FBQyxJQUFJLENBQ1Qsc0RBQXNELFNBQVMsTUFBTSxZQUFZLEVBQUUsQ0FDcEYsQ0FBQztZQUVGLGNBQWM7WUFDZCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsK0NBQStDO2dCQUN2RCxPQUFPLEVBQUUsOEJBQThCLFNBQVMsTUFBTSxZQUFZLEVBQUU7Z0JBQ3BFLGNBQWMsRUFBRTtvQkFDZCxTQUFTO29CQUNULFlBQVk7b0JBQ1osVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTO2lCQUNuQzthQUNGLENBQUMsQ0FBQztZQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeU1hbmFnZXIgLSBJbXBsZW1lbnRhdGlvbiBvZiBJRWxlbWVudE1hbmFnZXIgZm9yIE1lbW9yeSBlbGVtZW50c1xuICogSGFuZGxlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGZvciBtZW1vcmllcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqIFxuICogRklYRVMgSU1QTEVNRU5URUQ6XG4gKiAxLiBDUklUSUNBTDogRml4ZWQgcmFjZSBjb25kaXRpb25zIGluIGZpbGUgb3BlcmF0aW9ucyBieSB1c2luZyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyByZWFkcy93cml0ZXNcbiAqIDIuIEhJR0g6IEZpeGVkIHVudmFsaWRhdGVkIFlBTUwgcGFyc2luZyB2dWxuZXJhYmlsaXR5IGJ5IHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAqIDMuIE1FRElVTTogQWxsIHVzZXIgaW5wdXRzIGFyZSBub3cgdmFsaWRhdGVkIGFuZCBzYW5pdGl6ZWRcbiAqIDQuIE1FRElVTTogQXVkaXQgbG9nZ2luZyBhZGRlZCBmb3Igc2VjdXJpdHkgb3BlcmF0aW9uc1xuICogNS4gTUVESVVNOiBQYXRoIHZhbGlkYXRpb24gcHJldmVudHMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhdHRhY2tzXG4gKi9cblxuaW1wb3J0IHsgTWVtb3J5LCBNZW1vcnlNZXRhZGF0YSB9IGZyb20gJy4vTWVtb3J5LmpzJztcbmltcG9ydCB7IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7XG4gIGdldFZhbGlkYXRlZFNjYW5Db29sZG93bixcbiAgZ2V0VmFsaWRhdGVkSW5kZXhEZWJvdW5jZSxcbiAgU1RPUkFHRV9MQVlFUl9DT05GSUdcbn0gZnJvbSAnLi4vLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlTGF5ZXIgfSBmcm9tICcuLi8uLi9zdG9yYWdlL0lTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHsgTWVtb3J5U3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9NZW1vcnlTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHsgTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IgfSBmcm9tICcuLi8uLi9zdG9yYWdlL01lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmpzJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBNRU1PUllfQ09OU1RBTlRTLCBNRU1PUllfU0VDVVJJVFlfRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgTWVtb3J5VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50TWVzc2FnZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50TWVzc2FnZXMuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5LCBnZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuLyoqXG4gKiBJc3N1ZSAjMTM6IFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBmaWxlbmFtZSBpcyBhIGJhY2t1cCBmaWxlXG4gKiBCYWNrdXAgZmlsZXMgc2hvdWxkIG5vdCBiZSBsb2FkZWQgYnkgbGlzdCgpIC0gdGhleSBhcmUgYXJjaGl2ZWQgZGF0YSwgbm90IGFjdGl2ZSBtZW1vcmllc1xuICpcbiAqIEJhY2t1cCBwYXR0ZXJucyBpbmNsdWRlOlxuICogLSAuYmFja3VwLSB0aW1lc3RhbXAgcGF0dGVybiAoZS5nLiwgbmFtZS5iYWNrdXAtMjAyNS0xMS0xNC0yMi00MC01Ny0zMDMueWFtbClcbiAqIC0gQW55IGZpbGUgd2l0aCAnYmFja3VwJyBpbiB0aGUgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSlcbiAqIC0gRmlsZXMgaW4gYmFja3VwLyBvciBiYWNrdXBzLyBkaXJlY3RvcmllcyAoaGFuZGxlZCBhdCBkaXJlY3RvcnkgbGV2ZWwpXG4gKlxuICogQHBhcmFtIGZpbGVuYW1lIC0gVGhlIGZpbGVuYW1lIHRvIGNoZWNrICh3aXRob3V0IGRpcmVjdG9yeSBwYXRoKVxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBhIGJhY2t1cCBmaWxlIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkXG4gKi9cbmZ1bmN0aW9uIGlzQmFja3VwRmlsZShmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlbmFtZS5pbmNsdWRlcygnLmJhY2t1cC0nKSB8fCBmaWxlbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdiYWNrdXAnKTtcbn1cblxuLyoqXG4gKiBJc3N1ZSAjMzk6IENoZWNrIGlmIGEgbWVtb3J5IG5hbWUgY29udGFpbnMgYmFja3VwIHBhdHRlcm5zIChjb3JydXB0ZWQgbmFtZSlcbiAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGJhY2t1cCBmaWxlIG1ldGFkYXRhIGxlYWtzIGludG8gdGhlIGNhbm9uaWNhbCBmaWxlXG4gKlxuICogUGF0dGVybjogbmFtZS5iYWNrdXAtWVlZWS1NTS1ERC1ISC1tbS1zcy1TU1Mgb3IgbmFtZS5iYWNrdXAtLi4uLXZOXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbWVtb3J5IG5hbWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG5hbWUgY29udGFpbnMgYmFja3VwIHBhdHRlcm5zIGluZGljYXRpbmcgY29ycnVwdGlvblxuICovXG5mdW5jdGlvbiBpc0NvcnJ1cHRlZEJhY2t1cE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENoZWNrIGZvciAuYmFja3VwLSB0aW1lc3RhbXAgcGF0dGVybiBpbiB0aGUgbmFtZVxuICByZXR1cm4gL1xcLmJhY2t1cC1cXGR7NH0tXFxkezJ9LVxcZHsyfS8udGVzdChuYW1lKTtcbn1cblxuLyoqXG4gKiBJc3N1ZSAjMzk6IEV4dHJhY3QgdGhlIG9yaWdpbmFsIG5hbWUgZnJvbSBhIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZVxuICpcbiAqIEV4YW1wbGVzOlxuICogLSBcImRvbGxob3VzZW1jcC1iYXNlbGluZS1rbm93bGVkZ2UuYmFja3VwLTIwMjUtMTEtMTQtMjItNDAtNTctMzAzXCJcbiAqICAgLT4gXCJkb2xsaG91c2VtY3AtYmFzZWxpbmUta25vd2xlZGdlXCJcbiAqIC0gXCJteS1tZW1vcnkuYmFja3VwLTIwMjUtMDEtMDEtMDAtMDAtMDAtMDAwLXYyXCJcbiAqICAgLT4gXCJteS1tZW1vcnlcIlxuICpcbiAqIEBwYXJhbSBjb3JydXB0ZWROYW1lIC0gVGhlIGNvcnJ1cHRlZCBuYW1lIGNvbnRhaW5pbmcgYmFja3VwIHBhdHRlcm5cbiAqIEByZXR1cm5zIFRoZSBvcmlnaW5hbCBuYW1lIHdpdGggYmFja3VwIHN1ZmZpeCByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RPcmlnaW5hbE5hbWUoY29ycnVwdGVkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUmVtb3ZlIC5iYWNrdXAtWVlZWS1NTS1ERC1ISC1tbS1zcy1TU1MgYW5kIGFueSAtdk4gc3VmZml4XG4gIHJldHVybiBjb3JydXB0ZWROYW1lLnJlcGxhY2UoL1xcLmJhY2t1cC1cXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7M30oLXZcXGQrKT8kLywgJycpO1xufVxuXG4vLyBJbnRlcm5hbCBpbnRlcmZhY2UgZm9yIHBhcnNlZCBZQU1MIHN0cnVjdHVyZVxuaW50ZXJmYWNlIFBhcnNlZE1lbW9yeURhdGEge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNZW1vcnlNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPE1lbW9yeT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yaWVzRGlyOiBzdHJpbmc7XG4gIC8vIFBoYXNlIDI6IEJvdW5kZWQgY29udGVudCBoYXNoIGluZGV4IHJlcGxhY2VzIHVuYm91bmRlZCBNYXBcbiAgcHJpdmF0ZSBjb250ZW50SGFzaEluZGV4ID0gbmV3IExSVUNhY2hlPHN0cmluZz4oe1xuICAgIG5hbWU6ICdtZW1vcnk6Y29udGVudEhhc2gnLFxuICAgIG1heFNpemU6IDUwMDAsXG4gICAgbWF4TWVtb3J5TUI6IDUsXG4gICAgdHRsTXM6IDAsXG4gIH0pO1xuICBwcml2YXRlIGNvbnRlbnRIYXNoQnlQYXRoID0gbmV3IExSVUNhY2hlPHN0cmluZz4oe1xuICAgIG5hbWU6ICdtZW1vcnk6Y29udGVudEhhc2hSZXZlcnNlJyxcbiAgICBtYXhTaXplOiA1MDAwLFxuICAgIG1heE1lbW9yeU1COiA1LFxuICAgIHR0bE1zOiAwLFxuICB9KTtcbiAgcHJpdmF0ZSB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuXG4gIC8vIFRyYWNrIGFjdGl2ZSBtZW1vcmllcyBieSBuYW1lIChzdGFibGUgaWRlbnRpZmllcikgLSBJc3N1ZSAjMTggUGhhc2UgNFxuICBwcml2YXRlIGFjdGl2ZU1lbW9yeU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlLFxuICAgIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlLFxuICAgIG1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldCxcbiAgICBiYWNrdXBTZXJ2aWNlPzogaW1wb3J0KCcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJykuQmFja3VwU2VydmljZVxuICApIHtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5NRU1PUlksIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBmaWxlV2F0Y2hTZXJ2aWNlLCBtZW1vcnlCdWRnZXQsIGJhY2t1cFNlcnZpY2UgfSwgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMubWVtb3JpZXNEaXIgPSB0aGlzLmVsZW1lbnREaXI7XG4gICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAyOiBPdmVycmlkZSBmYWN0b3J5IHRvIHVzZSBNZW1vcnlTdG9yYWdlTGF5ZXIgZm9yIG11bHRpLWRpcmVjdG9yeSBzY2FubmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpOiBJU3RvcmFnZUxheWVyIHtcbiAgICAvLyBOb3RlOiBVc2UgdGhpcy5lbGVtZW50RGlyIChzZXQgYnkgQmFzZUVsZW1lbnRNYW5hZ2VyIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCksXG4gICAgLy8gbm90IHRoaXMubWVtb3JpZXNEaXIgKHNldCBhZnRlciBzdXBlcigpIHJldHVybnMpLlxuICAgIHJldHVybiBuZXcgTWVtb3J5U3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZSwge1xuICAgICAgbWVtb3JpZXNEaXI6IHRoaXMuZWxlbWVudERpcixcbiAgICAgIHNjYW5Db29sZG93bk1zOiBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24oKSxcbiAgICAgIGluZGV4RGVib3VuY2VNczogZ2V0VmFsaWRhdGVkSW5kZXhEZWJvdW5jZSgpLFxuICAgICAgZmlsZUZpbHRlcjogKGZpbGVuYW1lOiBzdHJpbmcpID0+ICFpc0JhY2t1cEZpbGUoZmlsZW5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnbWVtb3J5JztcbiAgfVxuXG4gIC8vIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSAobW92ZVRvVXNlckJhY2t1cCkgYW5kIGl0c1xuICAvLyBzYXZlL2RlbGV0ZSBkb24ndCBjYWxsIHN1cGVyIOKAlCBuby1vcCB0aGUgdW5pdmVyc2FsIGJhY2t1cCBob29rcy5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZVNhdmUoKTogUHJvbWlzZTx2b2lkPiB7IC8qIG5vLW9wICovIH1cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZURlbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGNsZWFyQ2FjaGUgdG8gYWxzbyBjbGVhciBtZW1vcnktc3BlY2lmaWMgY2FjaGVzLlxuICAgKiBQaGFzZSAyOiBSZW1vdmVkIHVuYm91bmRlZCBtZW1vcnlDYWNoZSBhbmQgZGF0ZUZvbGRlcnNDYWNoZS5cbiAgICovXG4gIG92ZXJyaWRlIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgc3VwZXIuY2xlYXJDYWNoZSgpO1xuICAgIHRoaXMuY29udGVudEhhc2hJbmRleC5jbGVhcigpO1xuICAgIHRoaXMuY29udGVudEhhc2hCeVBhdGguY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBkaXNwb3NlIHRvIGZsdXNoIE1lbW9yeVN0b3JhZ2VMYXllciBfaW5kZXguanNvbiBhbmQgY2xlYXIgY2FjaGVzLlxuICAgKiBQcmV2ZW50cyByZXNvdXJjZSBsZWFrcyBhbmQgXCJKZXN0IGRpZCBub3QgZXhpdFwiIHdhcm5pbmdzIGluIHRlc3RzLlxuICAgKi9cbiAgb3ZlcnJpZGUgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAvLyBzdG9yYWdlTGF5ZXIuY2xlYXIoKSBjYW5jZWxzIHBlbmRpbmcgX2luZGV4Lmpzb24gZGVib3VuY2VkIHdyaXRlcyxcbiAgICAvLyBwcmV2ZW50aW5nIEVOT1RFTVBUWSBlcnJvcnMgd2hlbiB0ZXN0cyBkZWxldGUgdGVtcCBkaXJlY3Rvcmllcy5cbiAgICBzdXBlci5kaXNwb3NlKCk7ICAvLyBDYWxscyBCYXNlRWxlbWVudE1hbmFnZXIuZGlzcG9zZSgpIOKAlCBydW5zIHN0b3JhZ2VMYXllci5jbGVhcigpICsgd2F0Y2hlciBjbGVhbnVwXG4gICAgdGhpcy5jb250ZW50SGFzaEluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5jb250ZW50SGFzaEJ5UGF0aC5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgbWVtb3J5IGZpbGUgcGF0aCBhY3Jvc3MgZGlmZmVyZW50IHN0b3JhZ2UgbG9jYXRpb25zXG4gICAqIFNlYXJjaGVzIGluIHRoaXMgb3JkZXI6IHN5c3RlbS8sIGFkYXB0ZXJzLywgZGF0ZSBmb2xkZXJzLCByb290IChsZWdhY3kpXG4gICAqIEV4dHJhY3RlZCBtZXRob2QgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IChQUiAjNylcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZU1lbW9yeVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIHJlbGF0aXZlIHBhdGggKG5vIGRhdGUgZm9sZGVyKVxuICAgIGlmICghZmlsZVBhdGguaW5jbHVkZXMocGF0aC5zZXApIHx8ICFmaWxlUGF0aC5tYXRjaCgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9LykpIHtcbiAgICAgIC8vIFNlYXJjaCBpbiBzeXN0ZW0vIGZvbGRlciBmaXJzdFxuICAgICAgY29uc3Qgc3lzdGVtUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnc3lzdGVtJywgZmlsZVBhdGgpO1xuICAgICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHN5c3RlbVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBzeXN0ZW1QYXRoO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGNoZWNrIGFkYXB0ZXJzLyBmb2xkZXJcbiAgICAgIGNvbnN0IGFkYXB0ZXJQYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdhZGFwdGVycycsIGZpbGVQYXRoKTtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhhZGFwdGVyUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGFkYXB0ZXJQYXRoO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIHNlYXJjaCBpbiBkYXRlIGZvbGRlcnNcbiAgICAgIGNvbnN0IGRhdGVGb2xkZXJzID0gYXdhaXQgdGhpcy5nZXREYXRlRm9sZGVycygpO1xuICAgICAgZm9yIChjb25zdCBkYXRlRm9sZGVyIG9mIGRhdGVGb2xkZXJzKSB7XG4gICAgICAgIGNvbnN0IHRlc3RQYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsIGRhdGVGb2xkZXIsIGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRlc3RQYXRoKSkge1xuICAgICAgICAgIHJldHVybiB0ZXN0UGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGYWxsIGJhY2sgdG8gcm9vdCBkaXJlY3RvcnkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZHVyaW5nIHRyYW5zaXRpb25cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIG1lbW9yeSBmcm9tIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIGluc3RlYWQgb2YgZnMucmVhZEZpbGUoKVxuICAgKiB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBhbmQgZW5zdXJlIGF0b21pYyBmaWxlIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIG1lbW9yeSBmaWxlIHRvIGxvYWRcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGxvYWRlZCBNZW1vcnkgaW5zdGFuY2VcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gZmlsZSBjYW5ub3QgYmUgZm91bmQgb3IgcGF0aCB2YWxpZGF0aW9uIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIFlBTUwgcGFyc2luZyBmYWlscyBvciBjb250ZW50IGlzIG1hbGZvcm1lZFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBtZW1vcnkgdmFsaWRhdGlvbiBmYWlscyBhZnRlciBsb2FkaW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBSZXNvbHZlIHBhdGggdXNpbmcgZXh0cmFjdGVkIGhlbHBlciBtZXRob2RcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gYXdhaXQgdGhpcy5yZXNvbHZlTWVtb3J5UGF0aChmaWxlUGF0aCk7XG5cbiAgICAgIC8vIEVuc3VyZSBmdWxsUGF0aCBpcyBkZWZpbmVkXG4gICAgICBpZiAoIWZ1bGxQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHJlc29sdmUgcGF0aDogJHtmaWxlUGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGhhc2UgMjogQ2hlY2sgYmFzZSBjbGFzcyBMUlUgY2FjaGUgKHJlcGxhY2VzIHJlbW92ZWQgbWVtb3J5Q2FjaGUgTWFwKVxuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRCeUFic29sdXRlUGF0aChmdWxsUGF0aCk7XG4gICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZm9yIGF0b21pYyBmaWxlIHJlYWRcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIHdoaWNoIHdyYXBzIEZpbGVMb2NrTWFuYWdlclxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZnVsbFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIC8vIFVzZXMgU2VyaWFsaXphdGlvblNlcnZpY2Ugd2hpY2ggd3JhcHMgU2VjdXJlWWFtbFBhcnNlciBhbmQgaGFuZGxlcyBwdXJlIFlBTUwgYXV0b21hdGljYWxseVxuXG4gICAgICAvLyBNZW1vcnkgZmlsZXMgYXJlIHB1cmUgWUFNTCAodW5saWtlIG90aGVyIGVsZW1lbnRzIHdoaWNoIGFyZSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgICAgLy8gU2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcigpIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhbmQgd3JhcHMgcHVyZSBZQU1MXG5cbiAgICAgIC8vIEhhbmRsZSBlbXB0eSBjb250ZW50IGVkZ2UgY2FzZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0ZXN0cy9maWxlcylcbiAgICAgIGxldCBwYXJzZWQ6IFBhcnNlZE1lbW9yeURhdGE7XG5cbiAgICAgIGlmIChjb250ZW50LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgLy8gRW1wdHkgb3IgYWxsIHdoaXRlc3BhY2UgZmlsZSAtIGNyZWF0ZSBtaW5pbWFsIHZhbGlkIHN0cnVjdHVyZVxuICAgICAgICBwYXJzZWQgPSB7IGRhdGE6IHt9LCBjb250ZW50OiAnJyB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgICAgIG1heFlhbWxTaXplOiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUsXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSwgIC8vIEZJWCAoIzEyMDYpOiBMb2NhbCBmaWxlcyBhcmUgcHJlLXRydXN0ZWRcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWQnLFxuICAgICAgICAgIHNjaGVtYTogJ2pzb24nICAvLyBGSVggIzE0MzA6IFByZXNlcnZlIGJvb2xlYW5zIChhdXRvTG9hZCkgYW5kIG51bWJlcnMgKHByaW9yaXR5KVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRvIFBhcnNlZE1lbW9yeURhdGEgZm9ybWF0XG4gICAgICAgIHBhcnNlZCA9IHtcbiAgICAgICAgICBkYXRhOiBwYXJzZVJlc3VsdC5kYXRhLFxuICAgICAgICAgIGNvbnRlbnQ6IHBhcnNlUmVzdWx0LmNvbnRlbnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBtZXRhZGF0YSBhbmQgbWFya2Rvd24gY29udGVudFxuICAgICAgY29uc3QgeyBtZXRhZGF0YSwgY29udGVudDogbWFya2Rvd25Db250ZW50RnJvbUZpbGUgfSA9IHRoaXMucGFyc2VNZW1vcnlGaWxlKHBhcnNlZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgLy8gRml4ICM5MTg6IFJlYWQgaW5zdHJ1Y3Rpb25zIGZyb20gcm9vdC1sZXZlbCBZQU1MICh3aGVyZSBzZXJpYWxpemVFbGVtZW50IHdyaXRlcyB0aGVtKS5cbiAgICAgIC8vIFByZXZpb3VzbHkgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiB0byByb290IGJ1dCBuZXZlciByZWFkIGJhY2sg4oCUIHNpbGVudCBkYXRhIGxvc3MuXG4gICAgICBjb25zdCByb290SW5zdHJ1Y3Rpb25zID0gcGFyc2VkLmRhdGE/Lmluc3RydWN0aW9ucztcbiAgICAgIGlmIChyb290SW5zdHJ1Y3Rpb25zICYmIHR5cGVvZiByb290SW5zdHJ1Y3Rpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZW1vcnkuaW5zdHJ1Y3Rpb25zID0gcm9vdEluc3RydWN0aW9ucztcbiAgICAgIH1cblxuICAgICAgLy8gU3RyaXAgZm9ybWF0X3ZlcnNpb24gZnJvbSBydW50aW1lIG1ldGFkYXRhIChGaXggIzkxMilcbiAgICAgIGRlbGV0ZSAobWVtb3J5Lm1ldGFkYXRhIGFzIGFueSkuZm9ybWF0X3ZlcnNpb247XG5cbiAgICAgIC8vIExvYWQgc2F2ZWQgZW50cmllcyBpZiBwcmVzZW50XG4gICAgICAvLyBNZW1vcnkgZmlsZXMgaGF2ZSBlbnRyaWVzIGFzIGEgdG9wLWxldmVsIGtleSBpbiB0aGUgWUFNTFxuICAgICAgY29uc3QgZW50cmllcyA9IHBhcnNlZC5kYXRhPy5lbnRyaWVzO1xuICAgICAgaWYgKGVudHJpZXMpIHtcbiAgICAgICAgbWVtb3J5LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBpZDogbWVtb3J5LmlkLFxuICAgICAgICAgIHR5cGU6IG1lbW9yeS50eXBlLFxuICAgICAgICAgIHZlcnNpb246IG1lbW9yeS52ZXJzaW9uLFxuICAgICAgICAgIG1ldGFkYXRhOiBtZW1vcnkubWV0YWRhdGEsXG4gICAgICAgICAgZXh0ZW5zaW9uczogbWVtb3J5LmV4dGVuc2lvbnMsXG4gICAgICAgICAgZW50cmllczogZW50cmllc1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG1hcmtkb3duIGNvbnRlbnQgZXhpc3RzIGFmdGVyIHRoZSBmcm9udG1hdHRlciwgYWRkIGl0IGFzIGEgbWVtb3J5IGVudHJ5XG4gICAgICAvLyBUaGlzIHByZXNlcnZlcyBjb250ZW50IGZyb20gc2VlZCBtZW1vcmllcyBhbmQgbWVtb3J5IGZpbGVzIHdpdGggbWFya2Rvd24gc2VjdGlvbnNcbiAgICAgIGlmIChtYXJrZG93bkNvbnRlbnRGcm9tRmlsZSAmJiBtYXJrZG93bkNvbnRlbnRGcm9tRmlsZS50cmltKCkgJiYgcGFyc2VkLmNvbnRlbnQgJiYgcGFyc2VkLmNvbnRlbnQudHJpbSgpKSB7XG4gICAgICAgIGF3YWl0IG1lbW9yeS5hZGRFbnRyeShcbiAgICAgICAgICBwYXJzZWQuY29udGVudC50cmltKCksXG4gICAgICAgICAgW10sICAvLyB0YWdzXG4gICAgICAgICAgeyBsb2FkZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0sICAvLyBtZXRhZGF0YVxuICAgICAgICAgICdmaWxlJyAgLy8gc291cmNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZJWCAjMTMyMDogU2V0IGZpbGUgcGF0aCBvbiBtZW1vcnkgZm9yIHBlcnNpc3RlbmNlIChzdG9yZSByZWxhdGl2ZSBwYXRoKVxuICAgICAgLy8gTm9ybWFsaXplIHRvIGZvcndhcmQgc2xhc2hlcyBzbyBwYXRocyBhcmUgY29uc2lzdGVudCBhY3Jvc3MgcGxhdGZvcm1zXG4gICAgICAvLyAocGF0aC5yZWxhdGl2ZSgpIHJldHVybnMgYmFja3NsYXNoZXMgb24gV2luZG93cykuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMubWVtb3JpZXNEaXIsIGZ1bGxQYXRoKS5zcGxpdChwYXRoLnNlcCkuam9pbignLycpO1xuICAgICAgbWVtb3J5LnNldEZpbGVQYXRoKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIENhY2hlIHZpYSBiYXNlIGNsYXNzIExSVSBjYWNoZVxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQobWVtb3J5LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBSb3V0aW5lIGxvYWQg4oCUIGRlYnVnIGxldmVsIG9ubHkuIFNlY3VyaXR5IGV2ZW50IGZvciBNRU1PUllfTE9BREVEIHdhc1xuICAgICAgLy8gZ2VuZXJhdGluZyB+MTI4SyBlbnRyaWVzL3Nlc3Npb24sIG92ZXJ3aGVsbWluZyB0aGUgNUsgc2VjdXJpdHkgcmluZyBidWZmZXJcbiAgICAgIC8vIHdpdGggMjV4IHR1cm5vdmVyIChiYWNrcHJlc3N1cmUpLiBEb3duZ3JhZGVkIHBlciBJc3N1ZSAjMTY4NyBhbmFseXNpcy5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIExvYWRlZCBtZW1vcnkgZnJvbSAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfWApO1xuICAgICAgXG4gICAgICByZXR1cm4gbWVtb3J5O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfTE9BRF9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkIG1lbW9yeSBmcm9tICR7ZmlsZVBhdGh9OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgZXhpc3RpbmcgbWVtb3J5IGZpbGUgdG8gdXNlciBiYWNrdXAgZGlyZWN0b3J5XG4gICAqIElzc3VlICM0OTogUHJldmVudHMgZHVwbGljYXRlIGZpbGVzIGJ5IGJhY2tpbmcgdXAgaW5zdGVhZCBvZiB2ZXJzaW9uaW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdmVUb1VzZXJCYWNrdXAoZXhpc3RpbmdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBkYXRlRm9sZGVyID0gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke1N0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpfS0ke1N0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgIGNvbnN0IGJhY2t1cERpciA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnYmFja3VwcycsICd1c2VyJywgZGF0ZUZvbGRlcik7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkoYmFja3VwRGlyKTtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShleGlzdGluZ1BhdGgpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9bOi5dL2csICctJyk7XG4gICAgY29uc3QgYmFja3VwTmFtZSA9IGZpbGVuYW1lLnJlcGxhY2UoJy55YW1sJywgYC5iYWNrdXAtJHt0aW1lc3RhbXB9LnlhbWxgKTtcblxuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVuYW1lRmlsZShleGlzdGluZ1BhdGgsIHBhdGguam9pbihiYWNrdXBEaXIsIGJhY2t1cE5hbWUpKTtcbiAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIElzc3VlICM0OTogTW92ZWQgZXhpc3RpbmcgZmlsZSB0byBiYWNrdXA6ICR7YmFja3VwTmFtZX1gKTtcblxuICAgIC8vIElzc3VlICM2NTQ6IFBydW5lIGV4Y2VzcyBiYWNrdXBzIGZvciB0aGlzIG1lbW9yeSBpbiB0aGlzIGRhdGUgZm9sZGVyXG4gICAgYXdhaXQgdGhpcy5wcnVuZUJhY2t1cHNGb3JNZW1vcnkoYmFja3VwRGlyLCBmaWxlbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJ1bmUgZXhjZXNzIGJhY2t1cHMgZm9yIGEgc3BlY2lmaWMgbWVtb3J5IGluIGEgZGF0ZSBmb2xkZXIuXG4gICAqIEtlZXBzIG9ubHkgdGhlIE4gbW9zdCByZWNlbnQgYmFja3VwcyAoYnkgdGltZXN0YW1wIGluIGZpbGVuYW1lKS5cbiAgICogSXNzdWUgIzY1NDogUHJldmVudHMgdW5ib3VuZGVkIGJhY2t1cCBncm93dGggKHdhcyAxOTdrKyBmaWxlcykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBydW5lQmFja3Vwc0Zvck1lbW9yeShiYWNrdXBEaXI6IHN0cmluZywgbWVtb3J5RmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1heEJhY2t1cHMgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NQVhfQkFDS1VQU19QRVJfTUVNT1JZO1xuICAgIGNvbnN0IGJhc2VOYW1lID0gbWVtb3J5RmlsZW5hbWUucmVwbGFjZSgnLnlhbWwnLCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkoYmFja3VwRGlyKTtcbiAgICAgIC8vIEZpbmQgYWxsIGJhY2t1cHMgZm9yIHRoaXMgc3BlY2lmaWMgbWVtb3J5XG4gICAgICBjb25zdCBtZW1vcnlCYWNrdXBzID0gYWxsRmlsZXNcbiAgICAgICAgLmZpbHRlcihmID0+IGYuc3RhcnRzV2l0aChgJHtiYXNlTmFtZX0uYmFja3VwLWApICYmIGYuZW5kc1dpdGgoJy55YW1sJykpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpOyAvLyBMZXhpY29ncmFwaGljIHNvcnQgPSBjaHJvbm9sb2dpY2FsIGZvciBJU08gdGltZXN0YW1wc1xuXG4gICAgICBpZiAobWVtb3J5QmFja3Vwcy5sZW5ndGggPD0gbWF4QmFja3VwcykgcmV0dXJuO1xuXG4gICAgICAvLyBEZWxldGUgb2xkZXN0IGJhY2t1cHMgKGtlZXAgdGhlIGxhc3QgTilcbiAgICAgIGNvbnN0IHRvRGVsZXRlID0gbWVtb3J5QmFja3Vwcy5zbGljZSgwLCBtZW1vcnlCYWNrdXBzLmxlbmd0aCAtIG1heEJhY2t1cHMpO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHRvRGVsZXRlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKGJhY2t1cERpciwgZmlsZSksXG4gICAgICAgICAgICBFbGVtZW50VHlwZS5NRU1PUlksXG4gICAgICAgICAgICB7IHNvdXJjZTogJ01lbW9yeU1hbmFnZXIucHJ1bmVCYWNrdXBzRm9yTWVtb3J5JyB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBGYWlsZWQgdG8gcHJ1bmUgYmFja3VwICR7ZmlsZX06YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0b0RlbGV0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzY1NDogUHJ1bmVkICR7dG9EZWxldGUubGVuZ3RofSBleGNlc3MgYmFja3VwcyBmb3IgJHtiYXNlTmFtZX0gKGtlcHQgJHttYXhCYWNrdXBzfSlgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm9uLWZhdGFsIOKAlCBiYWNrdXAgcHJ1bmluZyBpcyBiZXN0LWVmZm9ydFxuICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gQmFja3VwIHBydW5pbmcgZmFpbGVkIGZvciAke2JhY2t1cERpcn06YCwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBwYXRoIGZvciBtZW1vcnkgc3RvcmFnZSBiYXNlZCBvbiBtZW1vcnkgdHlwZVxuICAgKiBSb3V0ZXMgbWVtb3JpZXMgdG8gYXBwcm9wcmlhdGUgZm9sZGVyczpcbiAgICogLSBTWVNURU06IHN5c3RlbS9cbiAgICogLSBBREFQVEVSOiBhZGFwdGVycy9cbiAgICogLSBVU0VSOiBZWVlZLU1NLURELyAoZGF0ZS1iYXNlZCBmb2xkZXJzKVxuICAgKiBAcGFyYW0gZWxlbWVudCBNZW1vcnkgZWxlbWVudCB0byBzYXZlXG4gICAqIEBwYXJhbSBtZW1vcnlUeXBlIFR5cGUgb2YgbWVtb3J5IChkZWZhdWx0cyB0byBVU0VSKVxuICAgKiBAcGFyYW0gZmlsZU5hbWUgT3B0aW9uYWwgY3VzdG9tIGZpbGVuYW1lXG4gICAqIEByZXR1cm5zIEZ1bGwgcGF0aCB0byBtZW1vcnkgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1lbW9yeVBhdGgoZWxlbWVudDogTWVtb3J5LCBtZW1vcnlUeXBlPzogTWVtb3J5VHlwZSwgZmlsZU5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHR5cGUgPSBtZW1vcnlUeXBlIHx8IE1lbW9yeVR5cGUuVVNFUjtcbiAgICBsZXQgdGFyZ2V0RGlyOiBzdHJpbmc7XG5cbiAgICAvLyBSb3V0ZSB0byBhcHByb3ByaWF0ZSBmb2xkZXIgYmFzZWQgb24gbWVtb3J5IHR5cGVcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgTWVtb3J5VHlwZS5TWVNURU06XG4gICAgICAgIHRhcmdldERpciA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnc3lzdGVtJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNZW1vcnlUeXBlLkFEQVBURVI6XG4gICAgICAgIHRhcmdldERpciA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnYWRhcHRlcnMnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1lbW9yeVR5cGUuVVNFUjpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gVXNlciBtZW1vcmllcyBnbyBpbiBkYXRlLWJhc2VkIGZvbGRlcnMgKGV4aXN0aW5nIGJlaGF2aW9yKVxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgZGF0ZUZvbGRlciA9IGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICAgICAgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsIGRhdGVGb2xkZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGFyZ2V0IGRpcmVjdG9yeSBleGlzdHNcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0YXJnZXREaXIpO1xuXG4gICAgLy8gR2VuZXJhdGUgZmlsZW5hbWUgdXNpbmcgdW5pZmllZCBub3JtYWxpemF0aW9uXG4gICAgLy8gTm90ZTogTWVtb3J5IGZpbGVzIHVzZSAueWFtbCBleHRlbnNpb24sIHNvIHdlIHVzZSBub3JtYWxpemVGaWxlbmFtZSgpIGRpcmVjdGx5XG4gICAgY29uc3QgYmFzZU5hbWUgPSBmaWxlTmFtZSB8fCBgJHt0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGVsZW1lbnQubWV0YWRhdGEubmFtZSB8fCAnbWVtb3J5Jyl9LnlhbWxgO1xuXG4gICAgLy8gSXNzdWUgIzQ5OiBDaGVjayBpZiBmaWxlIGV4aXN0cyBhbmQgbW92ZSB0byBiYWNrdXAgaWYgc28gKGluc3RlYWQgb2YgdmVyc2lvbiBzdWZmaXhlcylcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgYmFzZU5hbWUpO1xuICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0YXJnZXRQYXRoKSkge1xuICAgICAgYXdhaXQgdGhpcy5tb3ZlVG9Vc2VyQmFja3VwKHRhcmdldFBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0UGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgbWVtb3J5IHR5cGUgZnJvbSBmaWxlIHBhdGhcbiAgICogQHBhcmFtIGZpbGVQYXRoIFJlbGF0aXZlIHBhdGggd2l0aGluIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgKiBAcmV0dXJucyBNZW1vcnkgdHlwZSBiYXNlZCBvbiBwYXRoXG4gICAqL1xuICBwcml2YXRlIGdldE1lbW9yeVR5cGVGcm9tUGF0aChmaWxlUGF0aDogc3RyaW5nKTogTWVtb3J5VHlwZSB7XG4gICAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJ3N5c3RlbS8nKSB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKCdzeXN0ZW1cXFxcJykpIHtcbiAgICAgIHJldHVybiBNZW1vcnlUeXBlLlNZU1RFTTtcbiAgICB9XG4gICAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJ2FkYXB0ZXJzLycpIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoJ2FkYXB0ZXJzXFxcXCcpKSB7XG4gICAgICByZXR1cm4gTWVtb3J5VHlwZS5BREFQVEVSO1xuICAgIH1cbiAgICByZXR1cm4gTWVtb3J5VHlwZS5VU0VSO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhbGwgcmVxdWlyZWQgZm9sZGVyIHN0cnVjdHVyZSBleGlzdHNcbiAgICogQ3JlYXRlcyBzeXN0ZW0vLCBiYWNrdXBzL3N5c3RlbS8sIGJhY2t1cHMvdXNlci8sIGFkYXB0ZXJzLyBmb2xkZXJzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUZvbGRlclN0cnVjdHVyZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmb2xkZXJzID0gW1xuICAgICAgcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdzeXN0ZW0nKSxcbiAgICAgIHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnYmFja3VwcycsICdzeXN0ZW0nKSxcbiAgICAgIHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnYmFja3VwcycsICd1c2VyJyksXG4gICAgICBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ2FkYXB0ZXJzJylcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkoZm9sZGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIFNIQS0yNTYgaGFzaCBvZiBtZW1vcnkgY29udGVudCBmb3IgZGVkdXBsaWNhdGlvblxuICAgKiBJbXBsZW1lbnRzIElzc3VlICM5OTQgLSBDb250ZW50LWJhc2VkIGRlZHVwbGljYXRpb25cbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29udGVudEhhc2goZWxlbWVudDogTWVtb3J5KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICBlbnRyaWVzOiBKU09OLnBhcnNlKGVsZW1lbnQuc2VyaWFsaXplKCkpLmVudHJpZXNcbiAgICB9KTtcbiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZGF0ZSBmb2xkZXJzIGluIG1lbW9yaWVzIGRpcmVjdG9yeS5cbiAgICogUGhhc2UgMjogUmVtb3ZlZCBsb2NhbCBjYWNoZSDigJQgTWVtb3J5U3RvcmFnZUxheWVyIHNjYW4gY29vbGRvd24gaGFuZGxlcyB0aGUgaG90IHBhdGguXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5vdyBvbmx5IHVzZWQgYnkgcmVzb2x2ZU1lbW9yeVBhdGgoKSBhcyBhIGZhbGxiYWNrLlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkYXRlIGZvbGRlciBuYW1lc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXREYXRlRm9sZGVycygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkodGhpcy5tZW1vcmllc0Rpcik7XG4gICAgICByZXR1cm4gZW50cmllc1xuICAgICAgICAuZmlsdGVyKG5hbWUgPT4gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QobmFtZSkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgICAgIC5yZXZlcnNlKCk7IC8vIE1vc3QgcmVjZW50IGZpcnN0XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIG1lbW9yeSB0byBmaWxlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogVXNlcyBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKCkgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBlbGVtZW50IE1lbW9yeSBlbGVtZW50IHRvIHNhdmVcbiAgICogQHBhcmFtIGZpbGVQYXRoIE9wdGlvbmFsIGN1c3RvbSBmaWxlIHBhdGgsIGRlZmF1bHRzIHRvIHR5cGUtYmFzZWQgcGF0aFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzYXZlIGlzIGNvbXBsZXRlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIG1lbW9yeSB2YWxpZGF0aW9uIGZhaWxzIGJlZm9yZSBzYXZpbmdcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gcGF0aCB2YWxpZGF0aW9uIGZhaWxzIG9yIGZpbGUgc3lzdGVtIGVycm9ycyBvY2N1clxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBhdG9taWMgd3JpdGUgb3BlcmF0aW9uIGZhaWxzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzYXZlKGVsZW1lbnQ6IE1lbW9yeSwgZmlsZVBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gSXNzdWUgIzM5OiBBdXRvLXJlcGFpciBjb3JydXB0ZWQgYmFja3VwIG5hbWVzIGJlZm9yZSBzYXZpbmdcbiAgICAgIGNvbnN0IG1lbW9yeU5hbWUgPSBlbGVtZW50Lm1ldGFkYXRhLm5hbWU7XG4gICAgICBpZiAoaXNDb3JydXB0ZWRCYWNrdXBOYW1lKG1lbW9yeU5hbWUpKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTmFtZSA9IGV4dHJhY3RPcmlnaW5hbE5hbWUobWVtb3J5TmFtZSk7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBEZXRlY3RlZCBjb3JydXB0ZWQgYmFja3VwIG5hbWUgJyR7bWVtb3J5TmFtZX0nLCBgICtcbiAgICAgICAgICBgYXV0by1yZXBhaXJpbmcgdG8gJyR7b3JpZ2luYWxOYW1lfSdgXG4gICAgICAgICk7XG4gICAgICAgIGVsZW1lbnQubWV0YWRhdGEubmFtZSA9IG9yaWdpbmFsTmFtZTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0FWRUQsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuc2F2ZScsXG4gICAgICAgICAgZGV0YWlsczogYElzc3VlICMzOTogQXV0by1yZXBhaXJlZCBjb3JydXB0ZWQgYmFja3VwIG5hbWU6ICcke21lbW9yeU5hbWV9JyAtPiAnJHtvcmlnaW5hbE5hbWV9J2BcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnRcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1lbW9yeTogJHt2YWxpZGF0aW9uLmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgY29udGVudCBoYXNoIGZvciBkZWR1cGxpY2F0aW9uXG4gICAgICBjb25zdCBjb250ZW50SGFzaCA9IHRoaXMuY2FsY3VsYXRlQ29udGVudEhhc2goZWxlbWVudCk7XG4gICAgICBjb25zdCBleGlzdGluZ1BhdGggPSB0aGlzLmNvbnRlbnRIYXNoSW5kZXguZ2V0KGNvbnRlbnRIYXNoKTtcblxuICAgICAgaWYgKGV4aXN0aW5nUGF0aCkge1xuICAgICAgICAvLyBMb2cgZHVwbGljYXRlIGRldGVjdGlvblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ01FTU9SWV9EVVBMSUNBVEVfREVURUNURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUnLFxuICAgICAgICAgIGRldGFpbHM6IGBEdXBsaWNhdGUgY29udGVudCBkZXRlY3RlZC4gRXhpc3Rpbmc6ICR7ZXhpc3RpbmdQYXRofWBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVjdCBtZW1vcnkgdHlwZSBmcm9tIG1ldGFkYXRhIG9yIGRlZmF1bHQgdG8gVVNFUlxuICAgICAgY29uc3QgbWVtb3J5TWV0YSA9IGVsZW1lbnQubWV0YWRhdGEgYXMgTWVtb3J5TWV0YWRhdGE7XG4gICAgICBjb25zdCBtZW1vcnlUeXBlID0gbWVtb3J5TWV0YS5tZW1vcnlUeXBlIHx8IE1lbW9yeVR5cGUuVVNFUjtcblxuICAgICAgLy8gU2F2ZSBwYXRoIHByZWNlZGVuY2U6XG4gICAgICAvLyAxKSBleHBsaWNpdCBmaWxlUGF0aCBhcmd1bWVudFxuICAgICAgLy8gMikgZXhpc3RpbmcgcGVyc2lzdGVkIHBhdGggb24gdGhlIGVsZW1lbnQgKGV4aXN0aW5nRmlsZVBhdGgpXG4gICAgICAvLyAzKSBuZXdseSBnZW5lcmF0ZWQgZGF0ZS90eXBlLWJhc2VkIHBhdGggZm9yIGZpcnN0LXRpbWUgc2F2ZXNcbiAgICAgIC8vIEtlZXBpbmcgIzIgYWhlYWQgb2YgIzMgcHJldmVudHMgbG9hZGVkIG1lbW9yaWVzIGZyb20gYmVpbmcgY29waWVkIGludG8gYSBuZXdcbiAgICAgIC8vIGRhdGUgZm9sZGVyIG9uIGVhY2ggc2F2ZSAoSXNzdWUgIzY5OSkuXG4gICAgICBjb25zdCBleGlzdGluZ0ZpbGVQYXRoID0gZWxlbWVudC5nZXRGaWxlUGF0aCgpO1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBmaWxlUGF0aFxuICAgICAgICA/IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aClcbiAgICAgICAgOiBleGlzdGluZ0ZpbGVQYXRoXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZXhpc3RpbmdGaWxlUGF0aClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuZ2VuZXJhdGVNZW1vcnlQYXRoKGVsZW1lbnQsIG1lbW9yeVR5cGUpO1xuXG4gICAgICAvLyBFbnN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHBhdGguZGlybmFtZShmdWxsUGF0aCkpO1xuXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgLy8gRml4ICM5MTYvIzkxODogU2l6ZSBlbmZvcmNlbWVudCBvbiBNZW1vcnkncyBjdXN0b20gc2F2ZSBwYXRoXG4gICAgICAvLyAoQmFzZUVsZW1lbnRNYW5hZ2VyLnNhdmUoKSBoYXMgdGhpcyBidXQgTWVtb3J5IG92ZXJyaWRlcyBpdCBlbnRpcmVseSlcbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPiBTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFUykge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0FWRV9GQUlMRUQsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUuc2l6ZUVuZm9yY2VtZW50JyxcbiAgICAgICAgICBkZXRhaWxzOiBgTWVtb3J5IGV4Y2VlZHMgbWF4aW11bSBmaWxlIHNpemUgKCR7eWFtbENvbnRlbnQubGVuZ3RofSA+ICR7U0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVN9KWAsXG4gICAgICAgICAgbWV0YWRhdGE6IHsgY29udGVudExlbmd0aDogeWFtbENvbnRlbnQubGVuZ3RoLCBsaW1pdDogU0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVMgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNZW1vcnkgZXhjZWVkcyBtYXhpbXVtIGZpbGUgc2l6ZSAoJHt5YW1sQ29udGVudC5sZW5ndGh9ID4gJHtTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFU30pYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGaXggIzkwOC8jOTE4OiBZQU1MIGJvbWIgZGV0ZWN0aW9uIG9uIE1lbW9yeSdzIGN1c3RvbSBzYXZlIHBhdGhcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25TdGFydCA9IERhdGUubm93KCk7XG4gICAgICBpZiAoeWFtbENvbnRlbnQubGVuZ3RoIDw9IFNFQ1VSSVRZX0xJTUlUUy5NQVhfWUFNTF9MRU5HVEgpIHtcbiAgICAgICAgaWYgKCFDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlWWFtbENvbnRlbnQoeWFtbENvbnRlbnQpKSB7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUueWFtbEJvbWJEZXRlY3Rpb24nLFxuICAgICAgICAgICAgZGV0YWlsczogJ1NlcmlhbGl6ZWQgbWVtb3J5IGNvbnRhaW5zIG1hbGljaW91cyBZQU1MIHBhdHRlcm5zIOKAlCB3cml0ZSBibG9ja2VkJyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IGNvbnRlbnRMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aCB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJpYWxpemVkIG1lbW9yeSBjb250YWlucyBtYWxpY2lvdXMgWUFNTCBwYXR0ZXJucyDigJQgd3JpdGUgYmxvY2tlZCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB2YWxpZGF0aW9uTXMgPSBEYXRlLm5vdygpIC0gdmFsaWRhdGlvblN0YXJ0O1xuICAgICAgaWYgKHZhbGlkYXRpb25NcyA+IDUwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbTWVtb3J5TWFuYWdlcl0gV3JpdGUtcGF0aCBZQU1MIHZhbGlkYXRpb24gdG9vayAke3ZhbGlkYXRpb25Nc31tcyBmb3IgJHt5YW1sQ29udGVudC5sZW5ndGh9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZFlhbWwgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlUmF3WWFtbCh5YW1sQ29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCk7XG4gICAgICBjb25zdCBnYXRla2VlcGVyRXJyb3JzID0gW1xuICAgICAgICAuLi5nZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKHBhcnNlZFlhbWwpLFxuICAgICAgICAuLi5nZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKFxuICAgICAgICAgIHBhcnNlZFlhbWwubWV0YWRhdGEgJiYgdHlwZW9mIHBhcnNlZFlhbWwubWV0YWRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHBhcnNlZFlhbWwubWV0YWRhdGEpXG4gICAgICAgICAgICA/IHBhcnNlZFlhbWwubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICksXG4gICAgICBdO1xuICAgICAgaWYgKGdhdGVrZWVwZXJFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3kgaW4gc2VyaWFsaXplZCBtZW1vcnkgWUFNTDogJHtbLi4ubmV3IFNldChnYXRla2VlcGVyRXJyb3JzKV0uam9pbignOyAnKX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgYXRvbWljIGZpbGUgd3JpdGVcbiAgICAgIC8vIFByZXZpb3VzbHk6IGF3YWl0IGZzLndyaXRlRmlsZShmdWxsUGF0aCwgeWFtbENvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgLy8gTm93OiBVc2VzIEZpbGVPcGVyYXRpb25zU2VydmljZSB3aGljaCB3cmFwcyBGaWxlTG9ja01hbmFnZXJcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKGZ1bGxQYXRoLCB5YW1sQ29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgLy8gRklYICMxMzIwOiBTZXQgZmlsZSBwYXRoIG9uIG1lbW9yeSBhZnRlciBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byBmb3J3YXJkIHNsYXNoZXMgc28gcGF0aHMgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIHBsYXRmb3Jtc1xuICAgICAgLy8gKHBhdGgucmVsYXRpdmUoKSByZXR1cm5zIGJhY2tzbGFzaGVzIG9uIFdpbmRvd3MpLlxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKTtcbiAgICAgIGVsZW1lbnQuc2V0RmlsZVBhdGgocmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gQ2FjaGUgdmlhIGJhc2UgY2xhc3MgTFJVIGNhY2hlXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBQaGFzZSAyOiBOb3RpZnkgc3RvcmFnZSBsYXllciBvZiBzYXZlXG4gICAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkKHJlbFBhdGgsIGZ1bGxQYXRoKTtcblxuICAgICAgLy8gVXBkYXRlIGJvdW5kZWQgY29udGVudCBoYXNoIGluZGV4XG4gICAgICB0aGlzLmNvbnRlbnRIYXNoSW5kZXguc2V0KGNvbnRlbnRIYXNoLCBmdWxsUGF0aCk7XG4gICAgICB0aGlzLmNvbnRlbnRIYXNoQnlQYXRoLnNldChmdWxsUGF0aCwgY29udGVudEhhc2gpO1xuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBzYXZlXG4gICAgICBjb25zdCBzdGF0cyA9IGVsZW1lbnQuZ2V0U3RhdHMoKTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0FWRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYFNhdmVkIG1lbW9yeSB0byAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfSB3aXRoICR7c3RhdHMudG90YWxFbnRyaWVzfSBlbnRyaWVzYFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBzYXZlIG1lbW9yeSB0byAke2ZpbGVQYXRofTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhdmUgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSGFuZGxlIG1lbW9yeSBsb2FkIGZhaWx1cmVcbiAgICogRklYIChTb25hckNsb3VkKTogRXh0cmFjdCBkdXBsaWNhdGVkIGVycm9yIGhhbmRsaW5nIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUxvYWRGYWlsdXJlKFxuICAgIGZpbGU6IHN0cmluZyxcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBmYWlsZWRMb2FkczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgZmFpbGVkTG9hZHMucHVzaCh7IGZpbGUsIGVycm9yOiBlcnJvck1zZyB9KTtcbiAgICAvLyBPbmx5IGxvZyBzZWN1cml0eSBldmVudCBpZiBsb2FkKCkgZGlkbid0IHN1cHByZXNzIHRoaXMgYXMgYSByZXBlYXRcbiAgICBpZiAoIXRoaXMuaXNMb2FkRXJyb3JTdXBwcmVzc2VkKGZpbGUpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5saXN0JyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkICR7ZmlsZX06ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBtZW1vcmllcyBmcm9tIGFsbCBsb2NhdGlvbnMuXG4gICAqIFBoYXNlIDI6IERlbGVnYXRlcyBtdWx0aS1kaXJlY3Rvcnkgc2Nhbm5pbmcgdG8gTWVtb3J5U3RvcmFnZUxheWVyLlxuICAgKiBTdG9yYWdlIGxheWVyIGhhbmRsZXM6IHN5c3RlbS8sIGFkYXB0ZXJzLywgZGF0ZSBmb2xkZXJzLCByb290LCBiYWNrdXAgZmlsdGVyaW5nLCBjb29sZG93bi5cbiAgICpcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IEFwcGx5IGFjdGl2ZSBzdGF0dXMgdG8gbWVtb3JpZXMgdGhhdCBhcmUgaW4gdGhlIGFjdGl2ZSBzZXQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsaXN0KCk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBmYWlsZWRMb2FkczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKTtcblxuICAgICAgLy8gU3RvcmFnZSBsYXllciBoYW5kbGVzIG11bHRpLWRpcmVjdG9yeSBzY2FuICsgY29vbGRvd25cbiAgICAgIGNvbnN0IGluZGV4ZWRQYXRocyA9IGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLmdldEluZGV4ZWRQYXRocygpO1xuXG4gICAgICAvLyBMb2FkIHRocm91Z2ggTFJVIGNhY2hlXG4gICAgICBjb25zdCBtZW1vcmllczogTWVtb3J5W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIGluZGV4ZWRQYXRocykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMubG9hZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgIC8vIEVuc3VyZSBtZW1vcnlUeXBlIGlzIHNldCBiYXNlZCBvbiBsb2NhdGlvblxuICAgICAgICAgIGNvbnN0IG1lbW9yeU1ldGEgPSBtZW1vcnkubWV0YWRhdGEgYXMgTWVtb3J5TWV0YWRhdGE7XG4gICAgICAgICAgaWYgKCFtZW1vcnlNZXRhLm1lbW9yeVR5cGUpIHtcbiAgICAgICAgICAgIG1lbW9yeU1ldGEubWVtb3J5VHlwZSA9IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmluZmVyTWVtb3J5VHlwZShyZWxhdGl2ZVBhdGgpIGFzIE1lbW9yeVR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbW9yaWVzLnB1c2gobWVtb3J5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUxvYWRGYWlsdXJlKHJlbGF0aXZlUGF0aCwgZXJyb3IsIGZhaWxlZExvYWRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmFpbGVkTG9hZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBsb2FkICR7ZmFpbGVkTG9hZHMubGVuZ3RofSBtZW1vcmllczpgLFxuICAgICAgICAgIGZhaWxlZExvYWRzLm1hcChmID0+IGAgIC0gJHtmLmZpbGV9OiAke2YuZXJyb3J9YCkuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWR1cGxpY2F0ZSBieSBmaWxlIHBhdGggKHByZXNlcnZlcyBleGlzdGluZyBiZWhhdmlvcilcbiAgICAgIGNvbnN0IHVuaXF1ZU1lbW9yaWVzID0gbmV3IE1hcDxzdHJpbmcsIE1lbW9yeT4oKTtcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIG1lbW9yaWVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gbWVtb3J5LmdldEZpbGVQYXRoKCk7XG4gICAgICAgIGlmIChmaWxlUGF0aCAmJiAhdW5pcXVlTWVtb3JpZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHVuaXF1ZU1lbW9yaWVzLnNldChmaWxlUGF0aCwgbWVtb3J5KTtcbiAgICAgICAgfSBlbHNlIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICB1bmlxdWVNZW1vcmllcy5zZXQoYG5vLXBhdGgtJHttZW1vcnkubWV0YWRhdGEubmFtZX0tJHtEYXRlLm5vdygpfWAsIG1lbW9yeSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0TWVtb3JpZXMgPSBBcnJheS5mcm9tKHVuaXF1ZU1lbW9yaWVzLnZhbHVlcygpKTtcblxuICAgICAgLy8gSXNzdWUgIzE4IFBoYXNlIDQ6IEFwcGx5IGFjdGl2ZSBzdGF0dXMgdG8gbWVtb3JpZXMgaW4gdGhlIGFjdGl2ZSBzZXRcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIHJlc3VsdE1lbW9yaWVzKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLmhhcyhtZW1vcnkubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgICBhd2FpdCBtZW1vcnkuYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0TWVtb3JpZXM7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhIG1lbW9yeSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IENvbnRleHQtbG9hZGluZyBhY3RpdmF0aW9uIHN0cmF0ZWd5XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZU1lbW9yeShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBtZW1vcnk/OiBNZW1vcnkgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghbWVtb3J5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5NRU1PUlksIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICAvLyBBZGQgdG8gYWN0aXZlIHNldCAoYnkgbmFtZSwgd2hpY2ggaXMgc3RhYmxlIGFjcm9zcyByZWxvYWRzKVxuICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuYWRkKG1lbW9yeS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBtZW1vcnkgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IG1lbW9yeS5hY3RpdmF0ZSgpO1xuXG4gICAgLy8gUm91dGluZSBhY3RpdmF0aW9uIOKAlCBkZWJ1ZyBvbmx5ICh3YXMgZmxvb2Rpbmcgc2VjdXJpdHkgYnVmZmVyKVxuICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIE1lbW9yeSBhY3RpdmF0ZWQ6ICR7bWVtb3J5Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICBsb2dnZXIuaW5mbyhgTWVtb3J5IGFjdGl2YXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuTUVNT1JZLCBtZW1vcnkubWV0YWRhdGEubmFtZSksXG4gICAgICBtZW1vcnlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYSBtZW1vcnkgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqIElzc3VlICMxOCBQaGFzZSA0OiBSZW1vdmUgZnJvbSBhY3RpdmUgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlTWVtb3J5KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghbWVtb3J5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5NRU1PUlksIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBmcm9tIGFjdGl2ZSBzZXRcbiAgICB0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLmRlbGV0ZShtZW1vcnkubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgbWVtb3J5IHN0YXR1cyBpbiBtZW1vcnlcbiAgICBhd2FpdCBtZW1vcnkuZGVhY3RpdmF0ZSgpO1xuXG4gICAgbG9nZ2VyLmluZm8oYE1lbW9yeSBkZWFjdGl2YXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5NRU1PUlksIG1lbW9yeS5tZXRhZGF0YS5uYW1lKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgbWVtb3JpZXNcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IFJldHVybiBtZW1vcmllcyB0aGF0IGFyZSBpbiB0aGUgYWN0aXZlIHNldFxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlTWVtb3JpZXMoKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbHRlcihtID0+IHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuaGFzKG0ubWV0YWRhdGEubmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICMzOTogU2NhbiBhbGwgbWVtb3JpZXMgYW5kIHJlcGFpciBjb3JydXB0ZWQgYmFja3VwIG5hbWVzXG4gICAqIFRoaXMgbWV0aG9kIGxvYWRzIGFsbCBtZW1vcmllcywgY2hlY2tzIGZvciBjb3JydXB0ZWQgbmFtZXMsIHJlcGFpcnMgdGhlbSxcbiAgICogYW5kIHNhdmVzIHRoZSBjb3JyZWN0ZWQgZmlsZXMgYmFjayB0byBkaXNrLlxuICAgKlxuICAgKiBAcGFyYW0gb25Qcm9ncmVzcyBPcHRpb25hbCBjYWxsYmFjayBmb3IgcHJvZ3Jlc3MgdXBkYXRlcyBkdXJpbmcgbG9uZyBvcGVyYXRpb25zXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHJlcGFpciBzdGF0aXN0aWNzIGFuZCBsaXN0IG9mIHJlcGFpcmVkIG1lbW9yaWVzXG4gICAqL1xuICBhc3luYyByZXBhaXJDb3JydXB0ZWROYW1lcyhcbiAgICBvblByb2dyZXNzPzogKHByb2Nlc3NlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyLCBjdXJyZW50Pzogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8e1xuICAgIHNjYW5uZWQ6IG51bWJlcjtcbiAgICByZXBhaXJlZDogbnVtYmVyO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIHJlcGFpcmVkTWVtb3JpZXM6IEFycmF5PHsgb3JpZ2luYWw6IHN0cmluZzsgcmVwYWlyZWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+O1xuICAgIGVycm9yRGV0YWlsczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gIH0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzY2FubmVkOiAwLFxuICAgICAgcmVwYWlyZWQ6IDAsXG4gICAgICBlcnJvcnM6IDAsXG4gICAgICByZXBhaXJlZE1lbW9yaWVzOiBbXSBhcyBBcnJheTx7IG9yaWdpbmFsOiBzdHJpbmc7IHJlcGFpcmVkOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9PixcbiAgICAgIGVycm9yRGV0YWlsczogW10gYXMgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgICB9O1xuXG4gICAgbG9nZ2VyLmluZm8oJ1tNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IFN0YXJ0aW5nIGNvcnJ1cHRlZCBuYW1lIHJlcGFpciBzY2FuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRm9yY2UgZnJlc2ggc2NhbiDigJQgcmVwYWlyIG11c3Qgc2VlIGN1cnJlbnQgZGlzayBzdGF0ZSwgbm90IGNhY2hlZCBpbmRleFxuICAgICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpO1xuICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIHJlc3VsdC5zY2FubmVkID0gbWVtb3JpZXMubGVuZ3RoO1xuXG4gICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIG1lbW9yaWVzKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROYW1lID0gbWVtb3J5Lm1ldGFkYXRhLm5hbWU7XG4gICAgICAgIHByb2Nlc3NlZCsrO1xuXG4gICAgICAgIC8vIFJlcG9ydCBwcm9ncmVzc1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIG9uUHJvZ3Jlc3MocHJvY2Vzc2VkLCBtZW1vcmllcy5sZW5ndGgsIGN1cnJlbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NvcnJ1cHRlZEJhY2t1cE5hbWUoY3VycmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc3QgcmVwYWlyZWROYW1lID0gZXh0cmFjdE9yaWdpbmFsTmFtZShjdXJyZW50TmFtZSk7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBtZW1vcnkuZ2V0RmlsZVBhdGgoKSB8fCAndW5rbm93bic7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBuYW1lXG4gICAgICAgICAgICBtZW1vcnkubWV0YWRhdGEubmFtZSA9IHJlcGFpcmVkTmFtZTtcblxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgcmVwYWlyZWQgbWVtb3J5XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUobWVtb3J5KTtcblxuICAgICAgICAgICAgcmVzdWx0LnJlcGFpcmVkKys7XG4gICAgICAgICAgICByZXN1bHQucmVwYWlyZWRNZW1vcmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IGN1cnJlbnROYW1lLFxuICAgICAgICAgICAgICByZXBhaXJlZDogcmVwYWlyZWROYW1lLFxuICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICBgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogUmVwYWlyZWQgJyR7Y3VycmVudE5hbWV9JyAtPiAnJHtyZXBhaXJlZE5hbWV9JyBhdCAke2ZpbGVQYXRofWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMrKztcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGN1cnJlbnROYW1lLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogRmFpbGVkIHRvIHJlcGFpciAnJHtjdXJyZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBSZXBhaXIgc2NhbiBjb21wbGV0ZS4gYCArXG4gICAgICAgIGBTY2FubmVkOiAke3Jlc3VsdC5zY2FubmVkfSwgUmVwYWlyZWQ6ICR7cmVzdWx0LnJlcGFpcmVkfSwgRXJyb3JzOiAke3Jlc3VsdC5lcnJvcnN9YFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5yZXBhaXJlZCA+IDApIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NBVkVELFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnJlcGFpckNvcnJ1cHRlZE5hbWVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgSXNzdWUgIzM5OiBSZXBhaXJlZCAke3Jlc3VsdC5yZXBhaXJlZH0gY29ycnVwdGVkIG1lbW9yeSBuYW1lc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHNjYW5uZWQ6IHJlc3VsdC5zY2FubmVkLFxuICAgICAgICAgICAgcmVwYWlyZWQ6IHJlc3VsdC5yZXBhaXJlZCxcbiAgICAgICAgICAgIGVycm9yczogcmVzdWx0LmVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogUmVwYWlyIHNjYW4gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMzk6IENsZWFuIHVwIGV4Y2Vzc2l2ZSBiYWNrdXAgZmlsZXMgaW4gYSBkaXJlY3RvcnlcbiAgICogUmVtb3ZlcyB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzIChlLmcuLCBuYW1lLmJhY2t1cC0uLi4tdjIueWFtbCwgLXYzLnlhbWwsIGV0Yy4pXG4gICAqIGtlZXBpbmcgb25seSB0aGUgbW9zdCByZWNlbnQgYmFja3VwICh3aXRob3V0IHZlcnNpb24gc3VmZml4KVxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0RGlyIERpcmVjdG9yeSB0byBjbGVhbiB1cCAoZGVmYXVsdHMgdG8gc3lzdGVtLyBmb2xkZXIpXG4gICAqIEBwYXJhbSBkcnlSdW4gSWYgdHJ1ZSwgb25seSByZXBvcnRzIHdoYXQgd291bGQgYmUgZGVsZXRlZCB3aXRob3V0IGFjdHVhbGx5IGRlbGV0aW5nXG4gICAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsIGNhbGxiYWNrIGZvciBwcm9ncmVzcyB1cGRhdGVzIGR1cmluZyBsb25nIG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggY2xlYW51cCBzdGF0aXN0aWNzXG4gICAqL1xuICBhc3luYyBjbGVhbnVwRXhjZXNzaXZlQmFja3VwcyhcbiAgICB0YXJnZXREaXI/OiBzdHJpbmcsXG4gICAgZHJ5UnVuOiBib29sZWFuID0gZmFsc2UsXG4gICAgb25Qcm9ncmVzcz86IChwcm9jZXNzZWQ6IG51bWJlciwgdG90YWw6IG51bWJlciwgY3VycmVudD86IHN0cmluZykgPT4gdm9pZFxuICApOiBQcm9taXNlPHtcbiAgICBzY2FubmVkOiBudW1iZXI7XG4gICAgZGVsZXRlZDogbnVtYmVyO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIGRlbGV0ZWRGaWxlczogc3RyaW5nW107XG4gICAga2VwdEZpbGVzOiBzdHJpbmdbXTtcbiAgICBlcnJvckRldGFpbHM6IEFycmF5PHsgZmlsZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+O1xuICB9PiB7XG4gICAgY29uc3QgZGlyID0gdGFyZ2V0RGlyIHx8IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnc3lzdGVtJyk7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgc2Nhbm5lZDogMCxcbiAgICAgIGRlbGV0ZWQ6IDAsXG4gICAgICBlcnJvcnM6IDAsXG4gICAgICBkZWxldGVkRmlsZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAga2VwdEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIGVycm9yRGV0YWlsczogW10gYXMgQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgICB9O1xuXG4gICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IFN0YXJ0aW5nIGJhY2t1cCBjbGVhbnVwIGluICR7ZGlyfSR7ZHJ5UnVuID8gJyAoRFJZIFJVTiknIDogJyd9Li4uYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkoZGlyKTtcbiAgICAgIHJlc3VsdC5zY2FubmVkID0gZmlsZXMubGVuZ3RoO1xuXG4gICAgICAvLyBHcm91cCBiYWNrdXAgZmlsZXMgYnkgYmFzZSBuYW1lXG4gICAgICBjb25zdCBiYWNrdXBHcm91cHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAvLyBNYXRjaCB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzOiBuYW1lLmJhY2t1cC1ZWVlZLU1NLURELUhILW1tLXNzLVNTUy12Ti55YW1sXG4gICAgICAgIGNvbnN0IHZlcnNpb25lZE1hdGNoID0gZmlsZS5tYXRjaCgvXiguK1xcLmJhY2t1cC1cXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7M30pLXYoXFxkKylcXC55YW1sJC8pO1xuICAgICAgICBpZiAodmVyc2lvbmVkTWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IHZlcnNpb25lZE1hdGNoWzFdO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYmFja3VwR3JvdXBzLmdldChiYXNlTmFtZSkgfHwgW107XG4gICAgICAgICAgZXhpc3RpbmcucHVzaChmaWxlKTtcbiAgICAgICAgICBiYWNrdXBHcm91cHMuc2V0KGJhc2VOYW1lLCBleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIGFsbCB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzXG4gICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgICAgIGNvbnN0IHRvdGFsVmVyc2lvbmVkRmlsZXMgPSBBcnJheS5mcm9tKGJhY2t1cEdyb3Vwcy52YWx1ZXMoKSkucmVkdWNlKChzdW0sIGZpbGVzKSA9PiBzdW0gKyBmaWxlcy5sZW5ndGgsIDApO1xuXG4gICAgICBmb3IgKGNvbnN0IFtiYXNlTmFtZSwgdmVyc2lvbmVkRmlsZXNdIG9mIGJhY2t1cEdyb3Vwcykge1xuICAgICAgICAvLyBLZWVwIHRoZSBiYXNlIGJhY2t1cCBmaWxlICh3aXRob3V0IC12TiksIGRlbGV0ZSBhbGwgdmVyc2lvbmVkIG9uZXNcbiAgICAgICAgY29uc3QgYmFzZUJhY2t1cEZpbGUgPSBgJHtiYXNlTmFtZX0ueWFtbGA7XG4gICAgICAgIGlmIChmaWxlcy5pbmNsdWRlcyhiYXNlQmFja3VwRmlsZSkpIHtcbiAgICAgICAgICByZXN1bHQua2VwdEZpbGVzLnB1c2goYmFzZUJhY2t1cEZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uZWRGaWxlIG9mIHZlcnNpb25lZEZpbGVzKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkKys7XG5cbiAgICAgICAgICAvLyBSZXBvcnQgcHJvZ3Jlc3NcbiAgICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgICAgb25Qcm9ncmVzcyhwcm9jZXNzZWQsIHRvdGFsVmVyc2lvbmVkRmlsZXMsIHZlcnNpb25lZEZpbGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgdmVyc2lvbmVkRmlsZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShmdWxsUGF0aCwgRWxlbWVudFR5cGUuTUVNT1JZLCB7XG4gICAgICAgICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5jbGVhbnVwRXhjZXNzaXZlQmFja3VwcydcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuZGVsZXRlZCsrO1xuICAgICAgICAgICAgcmVzdWx0LmRlbGV0ZWRGaWxlcy5wdXNoKHZlcnNpb25lZEZpbGUpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiAke2RyeVJ1biA/ICdXb3VsZCBkZWxldGUnIDogJ0RlbGV0ZWQnfSAke3ZlcnNpb25lZEZpbGV9YCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMrKztcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgIGZpbGU6IHZlcnNpb25lZEZpbGUsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBGYWlsZWQgdG8gZGVsZXRlICR7dmVyc2lvbmVkRmlsZX06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IEJhY2t1cCBjbGVhbnVwIGNvbXBsZXRlJHtkcnlSdW4gPyAnIChEUlkgUlVOKScgOiAnJ30uIGAgK1xuICAgICAgICBgU2Nhbm5lZDogJHtyZXN1bHQuc2Nhbm5lZH0sICR7ZHJ5UnVuID8gJ1dvdWxkIGRlbGV0ZScgOiAnRGVsZXRlZCd9OiAke3Jlc3VsdC5kZWxldGVkfSwgRXJyb3JzOiAke3Jlc3VsdC5lcnJvcnN9YFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5kZWxldGVkID4gMCAmJiAhZHJ5UnVuKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DTEVBUkVELFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNsZWFudXBFeGNlc3NpdmVCYWNrdXBzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgSXNzdWUgIzM5OiBDbGVhbmVkIHVwICR7cmVzdWx0LmRlbGV0ZWR9IGV4Y2Vzc2l2ZSBiYWNrdXAgZmlsZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IGRpcixcbiAgICAgICAgICAgIHNjYW5uZWQ6IHJlc3VsdC5zY2FubmVkLFxuICAgICAgICAgICAgZGVsZXRlZDogcmVzdWx0LmRlbGV0ZWQsXG4gICAgICAgICAgICBlcnJvcnM6IHJlc3VsdC5lcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IEJhY2t1cCBjbGVhbnVwIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ21lbW9yaWVzJyk7XG5cbiAgICAvLyBCZWxvdyB0aHJlc2hvbGQg4oCUIG5vIGFjdGlvbiBuZWVkZWRcbiAgICBpZiAodGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBtZW1vcmllcyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgbWVtb3JpZXMgb3Igc2V0dGluZyBET0xMSE9VU0VfTUFYX0FDVElWRV9NRU1PUklFUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgbWVtb3JpZXMgbGltaXQgcmVhY2hlZDogJHt0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemV9LyR7bWF4fWBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIHRocmVzaG9sZCDigJQgcHJvYWN0aXZlbHkgY2xlYW4gc3RhbGUgZW50cmllc1xuICAgIHZvaWQgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgbWVtb3JpZXMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTaXplID0gdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplO1xuICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nTWVtb3J5TmFtZXMgPSBuZXcgU2V0KG1lbW9yaWVzLm1hcChtID0+IG0ubWV0YWRhdGEubmFtZSkpO1xuXG4gICAgICBjb25zdCBzdGFsZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhY3RpdmVOYW1lIG9mIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ01lbW9yeU5hbWVzLmhhcyhhY3RpdmVOYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuZGVsZXRlKGFjdGl2ZU5hbWUpO1xuICAgICAgICAgIHN0YWxlTmFtZXMucHVzaChhY3RpdmVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBtZW1vcnkgcmVmZXJlbmNlKHMpLiBgICtcbiAgICAgICAgICBgQWN0aXZlIG1lbW9yaWVzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ21lbW9yaWVzJyl9YFxuICAgICAgICApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZU1lbW9yaWVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBtZW1vcnkgcmVmZXJlbmNlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZCxcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50OiBlbmRTaXplLFxuICAgICAgICAgICAgc3RhbGVOYW1lczogc3RhbGVOYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgbWVtb3JpZXM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgcm9vdCBmaWxlcyBmb3IgbG9hZCBmYWlsdXJlc1xuICAgKiBGSVggKFNvbmFyQ2xvdWQgUzM3NzYpOiBFeHRyYWN0IHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1Jvb3RGaWxlcyhcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCByb290RmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkodGhpcy5tZW1vcmllc0RpcilcbiAgICAgIC50aGVuKGZpbGVzID0+IGZpbGVzLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy55YW1sJykpKVxuICAgICAgLmNhdGNoKCgpID0+IFtdKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiByb290RmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBmYWlsdXJlcy5wdXNoKHsgZmlsZSwgZXJyb3I6IGVycm9yTXNnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb290RmlsZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGRhdGUgZm9sZGVyIGZpbGVzIGZvciBsb2FkIGZhaWx1cmVzXG4gICAqIEZJWCAoU29uYXJDbG91ZCBTMzc3Nik6IEV4dHJhY3QgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrRGF0ZUZvbGRlckZpbGVzKFxuICAgIGRhdGVGb2xkZXI6IHN0cmluZyxcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgZGF0ZUZvbGRlcikpXG4gICAgICAudGhlbihmaWxlcyA9PiBmaWxlcy5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcueWFtbCcpKSlcbiAgICAgIC5jYXRjaCgoKSA9PiBbXSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChwYXRoLmpvaW4oZGF0ZUZvbGRlciwgZmlsZSkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goeyBmaWxlOiBgJHtkYXRlRm9sZGVyfS8ke2ZpbGV9YCwgZXJyb3I6IGVycm9yTXNnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWxlcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgbWVtb3J5IGxvYWRpbmcgc3RhdHVzXG4gICAqIEZJWCAoIzEyMDYpOiBOZXcgbWV0aG9kIHRvIGV4cG9zZSBmYWlsZWQgbG9hZHMgdG8gdXNlcnNcbiAgICovXG4gIGFzeW5jIGdldExvYWRTdGF0dXMoKTogUHJvbWlzZTx7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBsb2FkZWQ6IG51bWJlcjtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gIH0+IHtcbiAgICBjb25zdCBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBsZXQgdG90YWxGaWxlcyA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0ZUZvbGRlcnMgPSBhd2FpdCB0aGlzLmdldERhdGVGb2xkZXJzKCk7XG5cbiAgICAgIC8vIENoZWNrIHJvb3QgZmlsZXNcbiAgICAgIHRvdGFsRmlsZXMgKz0gYXdhaXQgdGhpcy5jaGVja1Jvb3RGaWxlcyhmYWlsdXJlcyk7XG5cbiAgICAgIC8vIENoZWNrIGRhdGUgZm9sZGVyc1xuICAgICAgZm9yIChjb25zdCBkYXRlRm9sZGVyIG9mIGRhdGVGb2xkZXJzKSB7XG4gICAgICAgIHRvdGFsRmlsZXMgKz0gYXdhaXQgdGhpcy5jaGVja0RhdGVGb2xkZXJGaWxlcyhkYXRlRm9sZGVyLCBmYWlsdXJlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsOiB0b3RhbEZpbGVzLFxuICAgICAgICBsb2FkZWQ6IHRvdGFsRmlsZXMgLSBmYWlsdXJlcy5sZW5ndGgsXG4gICAgICAgIGZhaWxlZDogZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICBmYWlsdXJlc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IGxvYWQgc3RhdHVzOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtb3JpZXMgbWFya2VkIGZvciBhdXRvLWxvYWRpbmcgb24gc2VydmVyIGluaXRpYWxpemF0aW9uLlxuICAgKiBQaGFzZSAyOiBRdWVyaWVzIGluZGV4IGZvciBhdXRvTG9hZCBlbnRyaWVzIGluc3RlYWQgb2YgbG9hZGluZyBhbGwgbWVtb3JpZXMuXG4gICAqIERyb3BzIGZyb20gfjcwcyB0byA8MzBtcyBmb3IgdHlwaWNhbCBwb3J0Zm9saW9zIHdpdGggMTRrIG1lbW9yaWVzLlxuICAgKiBJc3N1ZSAjMTQzMDogQXV0by1sb2FkIGJhc2VsaW5lIG1lbW9yaWVzIGZlYXR1cmVcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgYXV0by1sb2FkIG1lbW9yaWVzIHNvcnRlZCBieSBwcmlvcml0eVxuICAgKi9cbiAgYXN5bmMgZ2V0QXV0b0xvYWRNZW1vcmllcygpOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBpbmRleCBpcyBwb3B1bGF0ZWRcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLnNjYW4oKTtcblxuICAgICAgLy8gUGhhc2UgMjogUXVlcnkgaW5kZXggZm9yIGF1dG9Mb2FkIGVudHJpZXMg4oCUIGRvZXMgTk9UIGxvYWQgYWxsIGZpbGVzXG4gICAgICBjb25zdCBtZW1TdG9yYWdlTGF5ZXIgPSB0aGlzLnN0b3JhZ2VMYXllciBhcyBNZW1vcnlTdG9yYWdlTGF5ZXI7XG4gICAgICBjb25zdCBhdXRvTG9hZEVudHJpZXMgPSBtZW1TdG9yYWdlTGF5ZXIuZ2V0QXV0b0xvYWRFbnRyaWVzKCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gZ2V0QXV0b0xvYWRNZW1vcmllczogRm91bmQgJHthdXRvTG9hZEVudHJpZXMubGVuZ3RofSBhdXRvLWxvYWQgZW50cmllcyBpbiBpbmRleGApO1xuXG4gICAgICAvLyBMb2FkIG9ubHkgbWF0Y2hpbmcgbWVtb3JpZXMgKHR5cGljYWxseSAzLTUpXG4gICAgICBjb25zdCBhdXRvTG9hZE1lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBhdXRvTG9hZEVudHJpZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCB0aGlzLmxvYWQoZW50cnkuZmlsZVBhdGgpO1xuICAgICAgICAgIGF1dG9Mb2FkTWVtb3JpZXMucHVzaChtZW1vcnkpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdICAgLSAke2VudHJ5Lm5hbWV9OiBwcmlvcml0eT0ke2VudHJ5LnByaW9yaXR5ID8/IDk5OX0gKExPQURFRClgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBsb2FkIGF1dG8tbG9hZCBtZW1vcnkgJHtlbnRyeS5maWxlUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSAoYWxyZWFkeSBzb3J0ZWQgZnJvbSBnZXRBdXRvTG9hZEVudHJpZXMsIGJ1dCBlbnN1cmUgY29uc2lzdGVuY3kpXG4gICAgICBhdXRvTG9hZE1lbW9yaWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcGEgPSAoYS5tZXRhZGF0YSBhcyBNZW1vcnlNZXRhZGF0YSkucHJpb3JpdHkgPz8gOTk5O1xuICAgICAgICBjb25zdCBwYiA9IChiLm1ldGFkYXRhIGFzIE1lbW9yeU1ldGFkYXRhKS5wcmlvcml0eSA/PyA5OTk7XG4gICAgICAgIHJldHVybiBwYSAtIHBiO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBhdXRvTG9hZE1lbW9yaWVzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNZW1vcnlNYW5hZ2VyXSBGYWlsZWQgdG8gZ2V0IGF1dG8tbG9hZCBtZW1vcmllczonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgc2VlZCBtZW1vcmllcyBmcm9tIHRoZSBzZWVkLWVsZW1lbnRzIGRpcmVjdG9yeVxuICAgKiBJc3N1ZSAjMTQzMDogQ29weSBiYXNlbGluZSBtZW1vcnkgdG8gdXNlciBwb3J0Zm9saW8gb24gZmlyc3QgcnVuXG4gICAqXG4gICAqIENvcGllcyBzZWVkIGZpbGVzIGZyb20gc3JjL3NlZWQtZWxlbWVudHMvbWVtb3JpZXMvIHRvIHRoZSB1c2VyJ3MgcG9ydGZvbGlvXG4gICAqIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC4gVGhpcyBhbGxvd3MgdXNlcnMgdG8gaGF2ZSBiYXNlbGluZSBrbm93bGVkZ2VcbiAgICogYXZhaWxhYmxlIGltbWVkaWF0ZWx5IHdpdGhvdXQgbWFudWFsIGluc3RhbGxhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgd2hlbiBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZWVkTWVtb3JpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oJ1tNZW1vcnlNYW5hZ2VyXSDwn4yxIFN0YXJ0aW5nIHNlZWQgbWVtb3J5IGluc3RhbGxhdGlvbi4uLicpO1xuICAgIHRyeSB7XG4gICAgICAvLyBEZWZpbmUgdGhlIHNlZWQgZmlsZVxuICAgICAgY29uc3Qgc2VlZEZpbGVOYW1lID0gJ2RvbGxob3VzZW1jcC1iYXNlbGluZS1rbm93bGVkZ2UueWFtbCc7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDE6IFRhcmdldCBzZWVkIGZpbGU6ICR7c2VlZEZpbGVOYW1lfWApO1xuXG4gICAgICAvLyBDb25zdHJ1Y3QgcGF0aHNcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIGRpc3QvZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci5qczpcbiAgICAgIC8vICAgR28gdXAgdG8gZGlzdC8gdGhlbiBpbnRvIHNlZWQtZWxlbWVudHMvbWVtb3JpZXMvXG4gICAgICAvLyBXaGVuIHJ1bm5pbmcgZnJvbSBzcmMvZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci50czpcbiAgICAgIC8vICAgR28gdXAgdG8gc3JjLyB0aGVuIGludG8gc2VlZC1lbGVtZW50cy9tZW1vcmllcy9cbiAgICAgIC8vIEZJWDogVXNlIGZpbGVVUkxUb1BhdGggZm9yIGNyb3NzLXBsYXRmb3JtIFdpbmRvd3MgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gT24gV2luZG93cywgVVJMLnBhdGhuYW1lIHJldHVybnMgL0M6L1VzZXJzLy4uLiB3aGljaCBpcyBpbnZhbGlkXG4gICAgICAvLyBmaWxlVVJMVG9QYXRoIGNvcnJlY3RseSBjb252ZXJ0cyBmaWxlOi8vIFVSTHMgdG8gbmF0aXZlIHBhdGhzXG4gICAgICBjb25zdCBjdXJyZW50TW9kdWxlRGlyID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDI6IEN1cnJlbnQgbW9kdWxlIGRpcmVjdG9yeTogJHtjdXJyZW50TW9kdWxlRGlyfWApO1xuXG4gICAgICAvLyBUcnkgZGlzdCBsb2NhdGlvbiBmaXJzdCAocHJvZHVjdGlvbi9idWlsdCBjb2RlKVxuICAgICAgbGV0IHNlZWRTb3VyY2VQYXRoID0gcGF0aC5yZXNvbHZlKGN1cnJlbnRNb2R1bGVEaXIsICcuLi8uLi9zZWVkLWVsZW1lbnRzL21lbW9yaWVzJywgc2VlZEZpbGVOYW1lKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAzOiBUcnlpbmcgc2VlZCBwYXRoIChkaXN0KTogJHtzZWVkU291cmNlUGF0aH1gKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgaXQgZXhpc3RzLCBpZiBub3QgdHJ5IHNyYyBsb2NhdGlvbiAoZGV2ZWxvcG1lbnQvdGVzdClcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhzZWVkU291cmNlUGF0aCkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3RlcCA0OiBGb3VuZCBzZWVkIGZpbGUgaW4gZGlzdCBsb2NhdGlvbmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtNZW1vcnlNYW5hZ2VyXSDimqDvuI8gIFN0ZXAgNDogU2VlZCBmaWxlIG5vdCBpbiBkaXN0IGxvY2F0aW9uLCB0cnlpbmcgc3JjLi4uYCk7XG4gICAgICAgIC8vIFRyeSBzcmMgbG9jYXRpb25cbiAgICAgICAgc2VlZFNvdXJjZVBhdGggPSBwYXRoLnJlc29sdmUoY3VycmVudE1vZHVsZURpciwgJy4uLy4uLy4uL3NyYy9zZWVkLWVsZW1lbnRzL21lbW9yaWVzJywgc2VlZEZpbGVOYW1lKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDRiOiBUcnlpbmcgc2VlZCBwYXRoIChzcmMpOiAke3NlZWRTb3VyY2VQYXRofWApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc2VlZCBmaWxlIGV4aXN0c1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhzZWVkU291cmNlUGF0aCkpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0g4p2MIFN0ZXAgNTogU2VlZCBmaWxlIG5vdCBmb3VuZCBhdCAke3NlZWRTb3VyY2VQYXRofWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdGVwIDU6IFZlcmlmaWVkIHNlZWQgZmlsZSBleGlzdHMgYXQ6ICR7c2VlZFNvdXJjZVBhdGh9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdXNlciBwb3J0Zm9saW9cbiAgICAgIC8vIElTU1VFICM1OiBTZWVkIGZpbGVzIGFyZSBzeXN0ZW0gZmlsZXMgLSBBTFdBWVMgdXNlIGxhdGVzdCB2ZXJzaW9uXG4gICAgICAvLyBCYWNrdXAgZXhpc3RpbmcgaWYgaXQgaGFzIHVzZXIgY29udGVudCwgdGhlbiBpbnN0YWxsIGZyZXNoIHNlZWRcblxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDY6IENoZWNraW5nIGZvciBleGlzdGluZyBzZWVkIG1lbW9yeSBpbiBwb3J0Zm9saW8uLi5gKTtcbiAgICAgIGxldCBleGlzdGluZ01lbW9yeTogTWVtb3J5IHwgdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBUcnkgdG8gbG9hZCBleGlzdGluZyBtZW1vcnlcbiAgICAgICAgZXhpc3RpbmdNZW1vcnkgPSBhd2FpdCB0aGlzLmxvYWQoc2VlZEZpbGVOYW1lKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3RlcCA3OiBGb3VuZCBleGlzdGluZyBzZWVkIG1lbW9yeSAnJHtzZWVkRmlsZU5hbWV9J2ApO1xuICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBleGlzdGluZ01lbW9yeS5nZXRGaWxlUGF0aCgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIEV4aXN0aW5nIGZpbGUgbG9jYXRpb246ICR7ZXhpc3RpbmdQYXRofWApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE1lbW9yeSBkb2Vzbid0IGV4aXN0IC0gcHJvY2VlZCB3aXRoIGZyZXNoIGluc3RhbGxhdGlvblxuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKEue+4jyAgU3RlcCA3OiBTZWVkIG1lbW9yeSAnJHtzZWVkRmlsZU5hbWV9JyBub3QgZm91bmQgaW4gcG9ydGZvbGlvLCB3aWxsIGluc3RhbGwgZnJlc2hgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgZXhpc3RpbmcgbWVtb3J5IGZvdW5kLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHJlaW5zdGFsbFxuICAgICAgaWYgKGV4aXN0aW5nTWVtb3J5KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCA4OiBBbmFseXppbmcgZXhpc3Rpbmcgc2VlZCBtZW1vcnkgY29udGVudC4uLmApO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZXhpc3RpbmdNZW1vcnkuZ2V0QWxsRW50cmllcygpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBGb3VuZCAke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzIGluIGV4aXN0aW5nIG1lbW9yeWApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIG1lbW9yeSBoYXMgbWVhbmluZ2Z1bCBjb250ZW50IChub3QganVzdCBcImVudHJpZXM6IFtdXCIpXG4gICAgICAgIC8vIEVtcHR5IGZpbGVzIG9mdGVuIGhhdmUganVzdCB0aGUgXCJlbnRyaWVzOiBbXVwiIFlBTUwgZmllbGQgYXMgY29udGVudFxuICAgICAgICBsZXQgaGFzQ29udGVudCA9IGVudHJpZXMubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoaGFzQ29udGVudCAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0RW50cnkgPSBlbnRyaWVzWzBdO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmaXJzdEVudHJ5LmNvbnRlbnQ/LnRyaW0oKSB8fCAnJztcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTaW5nbGUgZW50cnkgY29udGVudCBsZW5ndGg6ICR7Y29udGVudC5sZW5ndGh9IGNoYXJzYCk7XG4gICAgICAgICAgLy8gSWYgb25seSBjb250ZW50IGlzIFwiZW50cmllczogW11cIiwgY29uc2lkZXIgaXQgZW1wdHlcbiAgICAgICAgICBpZiAoY29udGVudCA9PT0gJ2VudHJpZXM6IFtdJyB8fCBjb250ZW50ID09PSAnJykge1xuICAgICAgICAgICAgaGFzQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBFbnRyeSBhcHBlYXJzIGVtcHR5IChlbnRyaWVzOiBbXSBvciBibGFuaylgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzQ29udGVudCkge1xuICAgICAgICAgIC8vIEZJWCAjMTQzMDogU2tpcCByZWluc3RhbGxhdGlvbiBpZiBzZWVkIGFscmVhZHkgZXhpc3RzIHdpdGggY29udGVudFxuICAgICAgICAgIC8vIFJlaW5zdGFsbGluZyBkZWxldGVzIHRoZSBtZW1vcnkgZnJvbSBjYWNoZSwgbG9zaW5nIGFjdGl2YXRpb24gc3RhdHVzXG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU2VlZCBtZW1vcnkgYWxyZWFkeSBpbnN0YWxsZWQgd2l0aCBjb250ZW50IC0gc2tpcHBpbmcgcmVpbnN0YWxsYXRpb25gKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIPCfjokgU2VlZCBtZW1vcnkgaW5zdGFsbGF0aW9uIGNoZWNrIGNvbXBsZXRlIChhbHJlYWR5IGluc3RhbGxlZClgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDk6IEV4aXN0aW5nIHNlZWQgbWVtb3J5IGlzIGVtcHR5ICgke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzKSwgd2lsbCByZWluc3RhbGxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlbGV0ZSBleGlzdGluZyAod2lsbCBiZSByZXBsYWNlZCB3aXRoIGxhdGVzdClcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDEwOiBSZW1vdmluZyBleGlzdGluZyBzZWVkIG1lbW9yeS4uLmApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHNlZWRGaWxlTmFtZSk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgUmVtb3ZlZCBleGlzdGluZyBzZWVkIG1lbW9yeSwgd2lsbCBpbnN0YWxsIGxhdGVzdCB2ZXJzaW9uYCk7XG4gICAgICAgIH0gY2F0Y2ggKGRlbGV0ZUVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0g4p2MIEZhaWxlZCB0byBkZWxldGUgZXhpc3Rpbmcgc2VlZCBtZW1vcnk6YCwgZGVsZXRlRXJyb3IpO1xuICAgICAgICAgIHRocm93IGRlbGV0ZUVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgdGhlIHNlZWQgZmlsZVxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDExOiBSZWFkaW5nIHNlZWQgZmlsZSBjb250ZW50Li4uYCk7XG4gICAgICBjb25zdCBzZWVkQ29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoc2VlZFNvdXJjZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBSZWFkIHNlZWQgZmlsZTogJHtzZWVkQ29udGVudC5sZW5ndGh9IGNoYXJhY3RlcnNgKTtcblxuICAgICAgLy8gUGFyc2UgYW5kIGNyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAxMjogUGFyc2luZyBzZWVkIGNvbnRlbnQgYW5kIGNyZWF0aW5nIG1lbW9yeSBpbnN0YW5jZS4uLmApO1xuICAgICAgbGV0IG1lbW9yeTogTWVtb3J5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVtb3J5ID0gYXdhaXQgdGhpcy5pbXBvcnRFbGVtZW50KHNlZWRDb250ZW50LCAneWFtbCcpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdWNjZXNzZnVsbHkgcGFyc2VkIHNlZWQgbWVtb3J5YCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIE1lbW9yeSBuYW1lOiAke21lbW9yeS5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSDinYwgRmFpbGVkIHRvIHBhcnNlIHNlZWQgY29udGVudDpgLCBwYXJzZUVycm9yKTtcbiAgICAgICAgdGhyb3cgcGFyc2VFcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IG1lbW9yeSB0eXBlIHRvIFNZU1RFTSBhbmQgZW5zdXJlIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAxMzogU2V0dGluZyBtZW1vcnkgdHlwZSB0byBTWVNURU0gYW5kIGF1dG9Mb2FkLi4uYCk7XG4gICAgICBjb25zdCBtZW1vcnlNZXRhID0gbWVtb3J5Lm1ldGFkYXRhIGFzIE1lbW9yeU1ldGFkYXRhO1xuICAgICAgbWVtb3J5TWV0YS5tZW1vcnlUeXBlID0gTWVtb3J5VHlwZS5TWVNURU07XG4gICAgICBtZW1vcnlNZXRhLmF1dG9Mb2FkID0gdHJ1ZTsgLy8gRW5zdXJlIHNlZWQgbWVtb3JpZXMgYXV0by1sb2FkXG4gICAgICBtZW1vcnlNZXRhLnByaW9yaXR5ID0gMTsgICAvLyBIaWdoIHByaW9yaXR5IGZvciBiYXNlbGluZSBrbm93bGVkZ2VcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIE1lbW9yeSB0eXBlOiAke21lbW9yeU1ldGEubWVtb3J5VHlwZX0sIGF1dG9Mb2FkOiAke21lbW9yeU1ldGEuYXV0b0xvYWR9LCBwcmlvcml0eTogJHttZW1vcnlNZXRhLnByaW9yaXR5fWApO1xuXG4gICAgICAvLyBTYXZlIHRvIHBvcnRmb2xpbyAodGhpcyB3aWxsIHVzZSBzeXN0ZW0vIGZvbGRlciBiYXNlZCBvbiBtZW1vcnlUeXBlKVxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDE0OiBTYXZpbmcgc2VlZCBtZW1vcnkgdG8gcG9ydGZvbGlvIChzaG91bGQgZ28gdG8gc3lzdGVtLyBmb2xkZXIpLi4uYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmUobWVtb3J5KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3VjY2Vzc2Z1bGx5IHNhdmVkIHNlZWQgbWVtb3J5YCk7XG4gICAgICAgIGNvbnN0IHNhdmVkUGF0aCA9IG1lbW9yeS5nZXRGaWxlUGF0aCgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFNhdmVkIHRvOiAke3NhdmVkUGF0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKHNhdmVFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSDinYwgRmFpbGVkIHRvIHNhdmUgc2VlZCBtZW1vcnk6YCwgc2F2ZUVycm9yKTtcbiAgICAgICAgdGhyb3cgc2F2ZUVycm9yO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIPCfjokgU3RlcCAxNTogU2VlZCBtZW1vcnkgaW5zdGFsbGF0aW9uIENPTVBMRVRFIWApO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBJbnN0YWxsZWQgc2VlZCBtZW1vcnk6ICR7c2VlZEZpbGVOYW1lfWApO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBlcnJvciBidXQgZG9uJ3QgdGhyb3cgLSBzZWVkIGluc3RhbGxhdGlvbiBzaG91bGQgbm90IGJyZWFrIHNlcnZlciBzdGFydHVwXG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNZW1vcnlNYW5hZ2VyXSBGYWlsZWQgdG8gaW5zdGFsbCBzZWVkIG1lbW9yaWVzOicsIGVycm9yKTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9MT0FEX0ZBSUxFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5pbnN0YWxsU2VlZE1lbW9yaWVzJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBpbnN0YWxsIHNlZWQgbWVtb3JpZXM6ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogRmluZCBtZW1vcmllcyBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZChwcmVkaWNhdGU6IChlbGVtZW50OiBNZW1vcnkpID0+IGJvb2xlYW4pOiBQcm9taXNlPE1lbW9yeSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZpbmQgbXVsdGlwbGUgbWVtb3JpZXMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IE1lbW9yeSkgPT4gYm9vbGVhbik6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBtZW1vcmllcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBtZW1vcmllcy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlbGV0ZSBhIG1lbW9yeSBmaWxlXG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgcGF0aCBhbmQgbG9ncyBkZWxldGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuXG4gICAgICAvLyBDaGVjayBpZiBmaWxlIGV4aXN0c1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhmdWxsUGF0aCkpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBub3QgYW4gZXJyb3IgZm9yIGRlbGV0ZSBvcGVyYXRpb25cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhlIGZpbGVcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShmdWxsUGF0aCwgRWxlbWVudFR5cGUuTUVNT1JZLCB7XG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuZGVsZXRlJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlc1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCk7XG4gICAgICB0aGlzLnVuY2FjaGVCeVBhdGgocmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gUGhhc2UgMjogTm90aWZ5IHN0b3JhZ2UgbGF5ZXIgb2YgZGVsZXRpb25cbiAgICAgIHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gUGhhc2UgMjogVXNlIHJldmVyc2UgbWFwIGZvciBPKDEpIGhhc2ggY2xlYW51cFxuICAgICAgY29uc3QgaGFzaCA9IHRoaXMuY29udGVudEhhc2hCeVBhdGguZ2V0KGZ1bGxQYXRoKTtcbiAgICAgIGlmIChoYXNoKSB7XG4gICAgICAgIHRoaXMuY29udGVudEhhc2hJbmRleC5kZWxldGUoaGFzaCk7XG4gICAgICAgIHRoaXMuY29udGVudEhhc2hCeVBhdGguZGVsZXRlKGZ1bGxQYXRoKTtcbiAgICAgIH1cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9ERUxFVEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYERlbGV0ZWQgbWVtb3J5IGZpbGU6ICR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9YFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgbm90IGFuIGVycm9yIGZvciBkZWxldGUgb3BlcmF0aW9uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbWVtb3J5IGZpbGUgZXhpc3RzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoZnVsbFBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBtZW1vcnkgd2l0aCBtZXRhZGF0YVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPE1lbW9yeU1ldGFkYXRhPiAmIHsgY29udGVudD86IHN0cmluZzsgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIH0pOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUoe1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvblxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgTWVtb3J5IGNyZWF0aW9uIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIChtb3ZlZCBmcm9tIGNyZWF0ZUVsZW1lbnQgaGFuZGxlcilcbiAgICBjb25zdCBleGlzdGluZ01lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdNZW1vcmllcy5maW5kKG0gPT5cbiAgICAgIG0ubWV0YWRhdGEubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gbWV0YWRhdGEubmFtZT8udG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIG1lbW9yeSBuYW1lZCBcIiR7bWV0YWRhdGEubmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIC8vIFNlcGFyYXRlIGNvbnRlbnQgYW5kIGluc3RydWN0aW9ucyBmcm9tIG1ldGFkYXRhIGZpZWxkc1xuICAgIC8vIE5vdGU6IEJhc2VFbGVtZW50LmNvbnN0cnVjdG9yIGdlbmVyYXRlcyB0aGUgZWxlbWVudCBpZCBmcm9tIHRoZSBuYW1lLFxuICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gc2V0IGlkIGhlcmUg4oCUIGl0IHdvdWxkIGJlIGlnbm9yZWQuXG4gICAgY29uc3QgeyBjb250ZW50LCBpbnN0cnVjdGlvbnMsIC4uLm1ldGFkYXRhRmllbGRzIH0gPSBtZXRhZGF0YTtcblxuICAgIC8vIENyZWF0ZSBpbnN0YW5jZVxuICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGFGaWVsZHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIC8vIFNldCBpbnN0cnVjdGlvbnMgaWYgcHJvdmlkZWQgKHYyLjAgZHVhbC1maWVsZDogbWVtb3J5LWxldmVsIGRpcmVjdGl2ZXMpXG4gICAgaWYgKGluc3RydWN0aW9ucykge1xuICAgICAgbWVtb3J5Lmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBlbnRyeSBpZiBjb250ZW50IHByb3ZpZGVkIChtb3ZlZCBmcm9tIGNyZWF0ZUVsZW1lbnQgaGFuZGxlcilcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgYXdhaXQgbWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8vIFNhdmUgKG1vdmVkIGZyb20gY3JlYXRlRWxlbWVudCBoYW5kbGVyKVxuICAgIGF3YWl0IHRoaXMuc2F2ZShtZW1vcnkpO1xuICAgIC8vIE5vdGU6IE5vIHJlbG9hZCgpIGhlcmUg4oCUIHNhdmUoKSBjYWNoZXMgdGhlIGVsZW1lbnQgY29ycmVjdGx5LlxuICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgbG9nZ2VyLmluZm8oYE1lbW9yeSBjcmVhdGVkOiAke21lbW9yeS5tZXRhZGF0YS5uYW1lfWApO1xuICAgIHJldHVybiBtZW1vcnk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQYXJzZSBZQU1MIGRhdGEgZm9yIGltcG9ydFxuICAgKiBFeHRyYWN0ZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IChTb25hckNsb3VkKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVlhbWxGb3JJbXBvcnQoZGF0YTogc3RyaW5nKTogeyBwYXJzZWQ6IGFueTsgbWFya2Rvd25Db250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQgfSB7XG4gICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBjb25zaXN0ZW50IHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoZGF0YSwge1xuICAgICAgbWF4WWFtbFNpemU6IE1FTU9SWV9DT05TVEFOVFMuTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIucGFyc2VZYW1sRm9ySW1wb3J0JyxcbiAgICAgIHNjaGVtYTogJ2pzb24nICAvLyBGSVggIzE0MzA6IFByZXNlcnZlIGJvb2xlYW5zIChhdXRvTG9hZCkgYW5kIG51bWJlcnMgKHByaW9yaXR5KVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlZDogcmVzdWx0LmRhdGEsXG4gICAgICBtYXJrZG93bkNvbnRlbnQ6IHJlc3VsdC5jb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbWVtb3J5IGZyb20gcGFyc2VkIGRhdGFcbiAgICogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSAoU29uYXJDbG91ZClcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTWVtb3J5RnJvbVBhcnNlZChcbiAgICBwYXJzZWQ6IGFueSxcbiAgICBtYXJrZG93bkNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgc3RydWN0dXJlcyBmcm9tIFlBTUwgcGFyc2luZ1xuICAgIC8vIFN1cHBvcnQgYm90aCBmb3JtYXRzIChzZWUgY29tbWl0IGZlYjVjZTAgb24gbWFpbik6XG4gICAgLy8gMS4gRnJvbnRtYXR0ZXItc3R5bGUgKHNlZWQgZmlsZXMpOiBtZXRhZGF0YSBmaWVsZHMgYXQgdG9wIGxldmVsXG4gICAgLy8gMi4gU2F2ZWQgbWVtb3J5IGZpbGVzOiBuZXN0ZWQgdW5kZXIgJ21ldGFkYXRhJyBrZXlcbiAgICAvLyBUaGlzIG1hdGNoZXMgbWFpbidzIHBhcnNlTWVtb3J5RmlsZSBsb2dpYzogeWFtbERhdGEubWV0YWRhdGEgfHwgeWFtbERhdGFcbiAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlZC5tZXRhZGF0YSB8fCBwYXJzZWQ7XG4gICAgY29uc3QgZW50cmllcyA9IHBhcnNlZC5lbnRyaWVzIHx8IHBhcnNlZC5kYXRhPy5lbnRyaWVzO1xuXG4gICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCFtZXRhZGF0YT8ubmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgbXVzdCBoYXZlIG1ldGFkYXRhIHdpdGggbmFtZScpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICBjb25zdCBtZW1vcnkgPSBuZXcgTWVtb3J5KG1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBMb2FkIGVudHJpZXMgaWYgcHJlc2VudFxuICAgIGlmIChlbnRyaWVzKSB7XG4gICAgICBtZW1vcnkuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBpZDogbWVtb3J5LmlkLFxuICAgICAgICB0eXBlOiBtZW1vcnkudHlwZSxcbiAgICAgICAgdmVyc2lvbjogbWVtb3J5LnZlcnNpb24sXG4gICAgICAgIG1ldGFkYXRhOiBtZW1vcnkubWV0YWRhdGEsXG4gICAgICAgIGV4dGVuc2lvbnM6IG1lbW9yeS5leHRlbnNpb25zLFxuICAgICAgICBlbnRyaWVzOiBlbnRyaWVzXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbWFya2Rvd24gY29udGVudCBleGlzdHMgYWZ0ZXIgdGhlIGZyb250bWF0dGVyLCBhZGQgaXQgYXMgYSBtZW1vcnkgZW50cnlcbiAgICAvLyBUaGlzIHByZXNlcnZlcyBjb250ZW50IGZyb20gc2VlZCBtZW1vcmllcyBhbmQgaW1wb3J0ZWQgWUFNTCBmaWxlcyB3aXRoIG1hcmtkb3duIHNlY3Rpb25zXG4gICAgaWYgKG1hcmtkb3duQ29udGVudD8udHJpbSgpKSB7XG4gICAgICBhd2FpdCBtZW1vcnkuYWRkRW50cnkoXG4gICAgICAgIG1hcmtkb3duQ29udGVudC50cmltKCksXG4gICAgICAgIFtdLCAgLy8gdGFnc1xuICAgICAgICB7IGltcG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9LCAgLy8gbWV0YWRhdGFcbiAgICAgICAgJ2ltcG9ydCcgIC8vIHNvdXJjZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVtb3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIG1lbW9yeSBmcm9tIEpTT04vWUFNTCBzdHJpbmdcbiAgICogU0VDVVJJVFk6IEZ1bGwgdmFsaWRhdGlvbiBvZiBpbXBvcnRlZCBjb250ZW50XG4gICAqIEBwYXJhbSBkYXRhIEpTT04gb3IgWUFNTCBzdHJpbmcgY29udGFpbmluZyBtZW1vcnkgZGF0YVxuICAgKiBAcGFyYW0gZm9ybWF0IEZvcm1hdCBvZiB0aGUgaW5wdXQgZGF0YSAoJ2pzb24nIG9yICd5YW1sJylcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGltcG9ydGVkIE1lbW9yeSBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBKU09OL1lBTUwgcGFyc2luZyBmYWlsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBpbXBvcnRlZCBkYXRhIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIFlBTUwgY29udGVudCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGltcG9ydGVkIG1lbW9yeSBmYWlscyB2YWxpZGF0aW9uXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBpbXBvcnRFbGVtZW50KFxuICAgIGRhdGE6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAneWFtbCdcbiAgKTogUHJvbWlzZTxNZW1vcnk+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHBhcnNlZDogYW55O1xuICAgICAgbGV0IG1hcmtkb3duQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2Ugc2VjdXJlIFlBTUwgcGFyc2luZ1xuICAgICAgICAvLyBNZW1vcnkgaW1wb3J0IGV4cGVjdHMgcHVyZSBZQU1MIChub3QgZnJvbnRtYXR0ZXIpLCBzbyB3ZSBwYXJzZSBpdCBzZWN1cmVseVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VZYW1sRm9ySW1wb3J0KGRhdGEpO1xuICAgICAgICAgIHBhcnNlZCA9IHJlc3VsdC5wYXJzZWQ7XG4gICAgICAgICAgbWFya2Rvd25Db250ZW50ID0gcmVzdWx0Lm1hcmtkb3duQ29udGVudDtcbiAgICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFlBTUw6ICR7eWFtbEVycm9yfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgaXQncyBhbiBvYmplY3RcbiAgICAgICAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lBTUwgbXVzdCBjb250YWluIGFuIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZU1lbW9yeUZyb21QYXJzZWQocGFyc2VkLCBtYXJrZG93bkNvbnRlbnQpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfSU1QT1JUX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGltcG9ydCBtZW1vcnk6ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4cG9ydCBhIG1lbW9yeSB0byBZQU1MIHN0cmluZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZXhwb3J0RWxlbWVudChcbiAgICBlbGVtZW50OiBNZW1vcnksXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ3lhbWwnXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5zZXJpYWxpemUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0cyA9IGVsZW1lbnQuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICBleHRlbnNpb25zOiBlbGVtZW50LmV4dGVuc2lvbnMsXG4gICAgICBzdGF0czoge1xuICAgICAgICB0b3RhbEVudHJpZXM6IHN0YXRzLnRvdGFsRW50cmllcyxcbiAgICAgICAgdG90YWxTaXplOiBzdGF0cy50b3RhbFNpemUsXG4gICAgICAgIG9sZGVzdEVudHJ5OiBzdGF0cy5vbGRlc3RFbnRyeT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgbmV3ZXN0RW50cnk6IHN0YXRzLm5ld2VzdEVudHJ5Py50b0lTT1N0cmluZygpXG4gICAgICB9LFxuICAgICAgZW50cmllczogSlNPTi5wYXJzZShlbGVtZW50LnNlcmlhbGl6ZSgpKS5lbnRyaWVzXG4gICAgfTtcblxuICAgIC8vIFNFQ1VSSVRZIEZJWDogVXNlIHNlY3VyZSBZQU1MIGR1bXBpbmdcbiAgICAvLyBGSVggIzE0MzA6IFVzZSBKU09OX1NDSEVNQSB0byBwcmVzZXJ2ZSBib29sZWFucyAoYXV0b0xvYWQpIGFuZCBudW1iZXJzIChwcmlvcml0eSlcbiAgICAvLyBKU09OX1NDSEVNQSA9IEZBSUxTQUZFICsgYm9vbC9pbnQvZmxvYXQvbnVsbCAoc2FmZXIgdGhhbiBERUZBVUxUIHdoaWNoIGFkZHMgdGltZXN0YW1wcylcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5kdW1wWWFtbChkYXRhLCB7XG4gICAgICBzY2hlbWE6ICdqc29uJyxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNraXBJbnZhbGlkOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8TWVtb3J5TWV0YWRhdGE+IHtcbiAgICBjb25zdCB7IG1ldGFkYXRhIH0gPSB0aGlzLnBhcnNlTWVtb3J5RmlsZSh7IGRhdGEsIGNvbnRlbnQ6ICcnIH0pO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YSwgX2NvbnRlbnQ6IHN0cmluZyk6IE1lbW9yeSB7XG4gICAgY29uc3QgbWVtb3J5ID0gbmV3IE1lbW9yeShtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEV4dHJhY3QgaW5zdHJ1Y3Rpb25zIGZyb20gbWV0YWRhdGEgaWYgcHJlc2VudCAodjIgZHVhbC1maWVsZClcbiAgICBpZiAobWV0YWRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBtZW1vcnkuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG1lbW9yeTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQ6IE1lbW9yeSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBlbGVtZW50LmdldFN0YXRzKCk7XG4gICAgLy8gSXNzdWUgIzc1NTogU2VyaWFsaXplIHR5cGUgYXMgc2luZ3VsYXIgYW5kIHBlcnNpc3QgdW5pcXVlX2lkXG4gICAgY29uc3QgbWV0YWRhdGEgPSB7IC4uLmVsZW1lbnQubWV0YWRhdGEgfTtcbiAgICBtZXRhZGF0YS50eXBlID0gdG9TaW5ndWxhckxhYmVsKEVsZW1lbnRUeXBlLk1FTU9SWSkgYXMgYW55O1xuICAgIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uID0gJ3YyJzsgIC8vIEZpeCAjOTEyLyM5MTg6IEV4cGxpY2l0IGZvcm1hdCBtYXJrZXJcbiAgICAobWV0YWRhdGEgYXMgYW55KS51bmlxdWVfaWQgPSBlbGVtZW50LmlkO1xuICAgIGNvbnN0IHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgbWV0YWRhdGEsXG4gICAgICAuLi4oZWxlbWVudC5pbnN0cnVjdGlvbnMgPyB7IGluc3RydWN0aW9uczogZWxlbWVudC5pbnN0cnVjdGlvbnMgfSA6IHt9KSxcbiAgICAgIGV4dGVuc2lvbnM6IGVsZW1lbnQuZXh0ZW5zaW9ucyxcbiAgICAgIHN0YXRzOiB7XG4gICAgICAgIHRvdGFsRW50cmllczogc3RhdHMudG90YWxFbnRyaWVzLFxuICAgICAgICB0b3RhbFNpemU6IHN0YXRzLnRvdGFsU2l6ZSxcbiAgICAgICAgb2xkZXN0RW50cnk6IHN0YXRzLm9sZGVzdEVudHJ5Py50b0lTT1N0cmluZygpLFxuICAgICAgICBuZXdlc3RFbnRyeTogc3RhdHMubmV3ZXN0RW50cnk/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHRvcFRhZ3M6IEFycmF5LmZyb20oc3RhdHMudGFnRnJlcXVlbmN5LmVudHJpZXMoKSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYlsxXSAtIGFbMV0pXG4gICAgICAgICAgLnNsaWNlKDAsIDEwKVxuICAgICAgICAgIC5tYXAoKFt0YWcsIGNvdW50XSkgPT4gKHsgdGFnLCBjb3VudCB9KSlcbiAgICAgIH0sXG4gICAgICBlbnRyaWVzOiBKU09OLnBhcnNlKGVsZW1lbnQuc2VyaWFsaXplKCkpLmVudHJpZXNcbiAgICB9O1xuXG4gICAgLy8gRklYICMxNDMwOiBVc2UgSlNPTl9TQ0hFTUEgdG8gcHJlc2VydmUgYm9vbGVhbnMgKGF1dG9Mb2FkKSBhbmQgbnVtYmVycyAocHJpb3JpdHkpXG4gICAgLy8gSlNPTl9TQ0hFTUEgPSBGQUlMU0FGRSArIGJvb2wvaW50L2Zsb2F0L251bGwgKHNhZmVyIHRoYW4gREVGQVVMVCB3aGljaCBhZGRzIHRpbWVzdGFtcHMpXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuZHVtcFlhbWwocGF5bG9hZCwge1xuICAgICAgc2NoZW1hOiAnanNvbicsXG4gICAgICBub1JlZnM6IHRydWUsXG4gICAgICBza2lwSW52YWxpZDogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIG1lbW9yeSBlbGVtZW50XG4gICAqL1xuICBvdmVycmlkZSB2YWxpZGF0ZShlbGVtZW50OiBNZW1vcnkpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCByZXNvbHZlIGEgZmlsZSBwYXRoXG4gICAqIFNFQ1VSSVRZOiBQcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAgICovXG4gIG92ZXJyaWRlIHZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFBlcmZvcm0gc3luY2hyb25vdXMgdmFsaWRhdGlvbiBjaGVja3NcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4uJykgfHwgcGF0aC5pc0Fic29sdXRlKG5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zdXJlIHByb3BlciBleHRlbnNpb25cbiAgICAgIGlmICghbm9ybWFsaXplZC5lbmRzV2l0aCgnLm1kJykgJiYgIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy55YW1sJykgJiYgIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy55bWwnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlIHRoaXMgbWFuYWdlciBoYW5kbGVzXG4gICAqL1xuICBvdmVycmlkZSBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIEVsZW1lbnRUeXBlLk1FTU9SWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBtZW1vcnkgZmlsZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJy55YW1sJztcbiAgfVxuICBcbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCByZXNvbHZlIGEgZmlsZSBwYXRoIHRvIHByZXZlbnQgc2VjdXJpdHkgaXNzdWVzXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHZhbGlkYXRlIGFuZCByZXNvbHZlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB2YWxpZGF0ZWQgZnVsbCBwYXRoXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHBhdGggY29udGFpbnMgdHJhdmVyc2FsIGF0dGVtcHRzICguLi8pXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHBhdGggaXMgYWJzb2x1dGUgb3IgaW52YWxpZFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBmaWxlIGV4dGVuc2lvbiBpcyBub3QgYWxsb3dlZCAoLm1kLCAueWFtbCwgLnltbClcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gcmVzb2x2ZWQgcGF0aCB3b3VsZCBiZSBvdXRzaWRlIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogQ29tcHJlaGVuc2l2ZSBwYXRoIHZhbGlkYXRpb25cbiAgICAvLyBFbmhhbmNlZCB2YWxpZGF0aW9uIGluc3BpcmVkIGJ5IEplZXQgU2luZ2ggKEBqZWV0c2luZ2gwMDgpIC0gUFIgIzEwMzVcblxuICAgIC8vIEZpcnN0IG5vcm1hbGl6ZSB0aGUgcGF0aCB0byByZXNvbHZlIGFueSAuLyBvciAuLi8gc2VxdWVuY2VzXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcblxuICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0cyAtIGJvdGggaW4gb3JpZ2luYWwgYW5kIG5vcm1hbGl6ZWRcbiAgICAvLyBDaGVjayBib3RoIHRoZSBub3JtYWxpemVkIHBhdGggYW5kIHRoZSBvcmlnaW5hbCBmb3IgYW55IHRyYXZlcnNhbCBwYXR0ZXJuc1xuICAgIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKCcuLicpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcuLicpIHx8XG4gICAgICAgIHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkKSB8fFxuICAgICAgICBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci52YWxpZGF0ZUFuZFJlc29sdmVQYXRoJyxcbiAgICAgICAgZGV0YWlsczogYEJsb2NrZWQgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdDogJHtmaWxlUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmaWxlIHBhdGg6IFBhdGggdHJhdmVyc2FsIGRldGVjdGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBwcm9wZXIgZXh0ZW5zaW9uIC0gbWVtb3JpZXMgc2hvdWxkIG9ubHkgYmUgLnlhbWwgb3IgLnltbFxuICAgIGlmICghbm9ybWFsaXplZC5lbmRzV2l0aCgnLnlhbWwnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnltbCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBmaWxlcyBtdXN0IGhhdmUgLnlhbWwgb3IgLnltbCBleHRlbnNpb24nKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29uc3RydWN0IGZ1bGwgcGF0aFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsIG5vcm1hbGl6ZWQpO1xuICAgIFxuICAgIC8vIFZlcmlmeSBpdCdzIHdpdGhpbiBtZW1vcmllcyBkaXJlY3RvcnlcbiAgICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUodGhpcy5tZW1vcmllc0RpciwgZnVsbFBhdGgpO1xuICAgIGlmIChyZWxhdGl2ZS5zdGFydHNXaXRoKCcuLicpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBwYXRoIG11c3QgYmUgd2l0aGluIG1lbW9yaWVzIGRpcmVjdG9yeScpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZnVsbFBhdGg7XG4gIH1cbiAgXG4gIHByaXZhdGUgcGFyc2VNZW1vcnlGaWxlKHBhcnNlZDogUGFyc2VkTWVtb3J5RGF0YSk6IHsgbWV0YWRhdGE6IE1lbW9yeU1ldGFkYXRhOyBjb250ZW50OiBzdHJpbmcgfSB7XG4gICAgLy8gRklYOiBTZWN1cmVZYW1sUGFyc2VyIHJldHVybnMgZGF0YSBpbiAnZGF0YScgcHJvcGVydHksIG5vdCAnbWV0YWRhdGEnXG4gICAgLy8gRm9yIG1hcmtkb3duIGZpbGVzIHdpdGggWUFNTCBmcm9udG1hdHRlciwgdGhlIHN0cnVjdHVyZSBpczpcbiAgICAvLyBwYXJzZWQuZGF0YSA9IFlBTUwgZnJvbnRtYXR0ZXIgdmFsdWVzXG4gICAgLy8gcGFyc2VkLmNvbnRlbnQgPSBtYXJrZG93biBjb250ZW50IGFmdGVyIGZyb250bWF0dGVyXG5cbiAgICAvLyBGb3IgcHVyZSBZQU1MIG1lbW9yeSBmaWxlcywgd2UgbmVlZCB0byBjaGVjayBpZiBtZXRhZGF0YSBpcyBkaXJlY3RseSBpbiBkYXRhXG4gICAgY29uc3QgeWFtbERhdGEgPSBwYXJzZWQuZGF0YSB8fCB7fTtcblxuICAgIC8vIE1lbW9yeSBmaWxlcyBzYXZlZCBieSB0aGUgc3lzdGVtIGhhdmUgbWV0YWRhdGEgYXMgYSB0b3AtbGV2ZWwga2V5XG4gICAgY29uc3QgbWV0YWRhdGFTb3VyY2UgPSB5YW1sRGF0YS5tZXRhZGF0YSB8fCB5YW1sRGF0YTtcblxuICAgIC8vIEV4dHJhY3QgbWV0YWRhdGEgd2l0aCB2YWxpZGF0aW9uXG4gICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBCRUZPUkUgc2FuaXRpemF0aW9uIHRvIHByZXZlbnQgYnlwYXNzIGF0dGFja3NcbiAgICBjb25zdCBuYW1lSW5wdXQgPSBtZXRhZGF0YVNvdXJjZS5uYW1lIHx8ICdVbm5hbWVkIE1lbW9yeSc7XG4gICAgY29uc3QgbmFtZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KG5hbWVJbnB1dCwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICB9KTtcbiAgICBpZiAoIW5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1lbW9yeSBuYW1lOiAke25hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIEZJWDogTXVzdCBzcGVjaWZ5IGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJyB0byBhbGxvdyBwdW5jdHVhdGlvbiBsaWtlIGNvbG9ucywgc2VtaWNvbG9ucywgZXRjLlxuICAgIGxldCBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9ICcnO1xuICAgIGlmIChtZXRhZGF0YVNvdXJjZS5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgZGVzY1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KG1ldGFkYXRhU291cmNlLmRlc2NyaXB0aW9uLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgICAgICBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbidcbiAgICAgIH0pO1xuICAgICAgaWYgKCFkZXNjUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1lbW9yeSBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIHNhbml0aXplZERlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YWRhdGE6IE1lbW9yeU1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSEsXG4gICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YVNvdXJjZS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IG1ldGFkYXRhU291cmNlLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhU291cmNlLmNyZWF0ZWQsXG4gICAgICBtb2RpZmllZDogbWV0YWRhdGFTb3VyY2UubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFnczogQXJyYXkuaXNBcnJheShtZXRhZGF0YVNvdXJjZS50YWdzKSA/XG4gICAgICAgIG1ldGFkYXRhU291cmNlLnRhZ3MubWFwKCh0YWc6IHN0cmluZykgPT4gc2FuaXRpemVJbnB1dCh0YWcsIE1FTU9SWV9DT05TVEFOVFMuTUFYX1RBR19MRU5HVEgpKSA6XG4gICAgICAgIFtdLFxuICAgICAgLy8gRklYICMxMTI0OiBFeHRyYWN0IHRyaWdnZXJzIGZvciBFbmhhbmNlZCBJbmRleCBzdXBwb3J0XG4gICAgICAvLyBFbmhhbmNlZCB0cmlnZ2VyIHZhbGlkYXRpb24gbG9nZ2luZyBmb3IgSXNzdWUgIzExMzlcbiAgICAgIHRyaWdnZXJzOiBbXSwgIC8vIFdpbGwgYmUgc2V0IGJlbG93IHdpdGggZW5oYW5jZWQgbG9nZ2luZ1xuICAgICAgc3RvcmFnZUJhY2tlbmQ6IG1ldGFkYXRhU291cmNlLnN0b3JhZ2VfYmFja2VuZCB8fCBtZXRhZGF0YVNvdXJjZS5zdG9yYWdlQmFja2VuZCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfU1RPUkFHRV9CQUNLRU5ELFxuICAgICAgcmV0ZW50aW9uRGF5czogbWV0YWRhdGFTb3VyY2UucmV0ZW50aW9uX3BvbGljeT8uZGVmYXVsdCA/XG4gICAgICAgIHRoaXMucGFyc2VSZXRlbnRpb25EYXlzKG1ldGFkYXRhU291cmNlLnJldGVudGlvbl9wb2xpY3kuZGVmYXVsdCkgOlxuICAgICAgICAobWV0YWRhdGFTb3VyY2UucmV0ZW50aW9uRGF5cyB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUkVURU5USU9OX0RBWVMpLFxuICAgICAgcHJpdmFjeUxldmVsOiBtZXRhZGF0YVNvdXJjZS5wcml2YWN5X2xldmVsIHx8IG1ldGFkYXRhU291cmNlLnByaXZhY3lMZXZlbCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUFJJVkFDWV9MRVZFTCxcbiAgICAgIHNlYXJjaGFibGU6IG1ldGFkYXRhU291cmNlLnNlYXJjaGFibGUgIT09IGZhbHNlLFxuICAgICAgbWF4RW50cmllczogbWV0YWRhdGFTb3VyY2UubWF4RW50cmllcyB8fCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFQsXG4gICAgICAvLyBGSVggIzE0MzA6IEV4dHJhY3QgYXV0by1sb2FkIGNvbmZpZ3VyYXRpb25cbiAgICAgIGF1dG9Mb2FkOiBtZXRhZGF0YVNvdXJjZS5hdXRvTG9hZCxcbiAgICAgIHByaW9yaXR5OiBtZXRhZGF0YVNvdXJjZS5wcmlvcml0eSxcbiAgICAgIC8vIE1lbW9yeSB0eXBlIGNsYXNzaWZpY2F0aW9uXG4gICAgICBtZW1vcnlUeXBlOiBtZXRhZGF0YVNvdXJjZS5tZW1vcnlUeXBlLFxuICAgICAgLy8gSXNzdWUgIzUyNCDigJQgR2F0ZWtlZXBlciBwb2xpY3kgKGFsbCBlbGVtZW50IHR5cGVzKVxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KG1ldGFkYXRhU291cmNlLmdhdGVrZWVwZXIsIG5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWUgfHwgJ3Vua25vd24nLCAnbWVtb3J5JywgbWV0YWRhdGFTb3VyY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgIH07XG5cbiAgICAvLyBFbmhhbmNlZCB0cmlnZ2VyIHZhbGlkYXRpb24gYW5kIGxvZ2dpbmdcbiAgICAvLyBOT1RFOiBNZW1vcnkgdHJpZ2dlcnMgbWF5IGV2b2x2ZSB0byBzdXBwb3J0IGRhdGUgcGF0dGVybnMgKDIwMjQtUTMpLFxuICAgIC8vIHNlbWFudGljIG1hcmtlcnMgKHJlY2FsbC1jb250ZXh0KSwgb3IgbmF0dXJhbCBsYW5ndWFnZSBwaHJhc2VzLlxuICAgIC8vIEtlcHQgc2VwYXJhdGUgZnJvbSBTa2lsbHMgKHRlY2huaWNhbCkgYW5kIFBlcnNvbmFzIChjaGFyYWN0ZXIgbmFtZXMpLlxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhU291cmNlLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhU291cmNlLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5NRU1PUlksXG4gICAgICAgIG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nXG4gICAgICApO1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkVHJpZ2dlcnM7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBjb250ZW50IChpZiBhbnkpXG4gICAgY29uc3QgY29udGVudCA9IHBhcnNlZC5jb250ZW50IHx8ICcnO1xuXG4gICAgcmV0dXJuIHsgbWV0YWRhdGEsIGNvbnRlbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gcGFyc2UgcmV0ZW50aW9uIGRheXMgZnJvbSB2YXJpb3VzIGZvcm1hdHNcbiAgICovXG4gIHByaXZhdGUgcGFyc2VSZXRlbnRpb25EYXlzKHJldGVudGlvbjogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIHJldGVudGlvbiA9PT0gJ251bWJlcicpIHJldHVybiByZXRlbnRpb247XG4gICAgaWYgKHJldGVudGlvbiA9PT0gJ3Blcm1hbmVudCcgfHwgcmV0ZW50aW9uID09PSAncGVycGV0dWFsJykgcmV0dXJuIDk5OTk5OTtcbiAgICBjb25zdCByZWdleCA9IC8oXFxkKylcXHMqZGF5cz8vaTtcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMocmV0ZW50aW9uKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pIDogTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlIHRva2VucyBpbiBtZW1vcnkgY29udGVudCAocm91Z2ggYXBwcm94aW1hdGlvbilcbiAgICogVXNlcyAxIHRva2VuIOKJiCAwLjc1IHdvcmRzIGZvciBFbmdsaXNoIHRleHRcbiAgICogQHBhcmFtIGNvbnRlbnQgTWVtb3J5IGNvbnRlbnQgdG8gZXN0aW1hdGVcbiAgICogQHJldHVybnMgRXN0aW1hdGVkIHRva2VuIGNvdW50XG4gICAqL1xuICBwdWJsaWMgZXN0aW1hdGVUb2tlbnMoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIWNvbnRlbnQgfHwgdHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSByZXR1cm4gMDtcblxuICAgIC8vIFNpbXBsZSB3b3JkIGNvdW50IGFwcHJveGltYXRpb25cbiAgICBjb25zdCB3b3JkcyA9IGNvbnRlbnQudHJpbSgpLnNwbGl0KC9cXHMrLykubGVuZ3RoO1xuXG4gICAgLy8gMSB0b2tlbiDiiYggMC43NSB3b3JkcyAoY29uc2VydmF0aXZlIGVzdGltYXRlKVxuICAgIHJldHVybiBNYXRoLmNlaWwod29yZHMgLyAwLjc1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuZCBhY3RpdmF0ZSBhdXRvLWxvYWQgbWVtb3JpZXMgZHVyaW5nIHNlcnZlciBpbml0aWFsaXphdGlvblxuICAgKiBJc3N1ZSAjMTQzMDogQXV0by1sb2FkIGJhc2VsaW5lIG1lbW9yaWVzIGZlYXR1cmVcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IENvbnRhaW5lci5wcmVwYXJlUG9ydGZvbGlvKCkgZHVyaW5nIHNlcnZlciBzdGFydHVwXG4gICAqIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBtZW1vcmllcyBtYXJrZWQgd2l0aCBhdXRvTG9hZDogdHJ1ZVxuICAgKlxuICAgKiBBcmNoaXRlY3R1cmUgTm90ZTpcbiAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBESS1hbGlnbmVkIHBhdHRlcm4gd2hlcmUgbWFuYWdlcnMgb3duIGFsbCBvcGVyYXRpb25zXG4gICAqIGZvciB0aGVpciBlbGVtZW50IHR5cGUuIEF1dG8tbG9hZCBsb2dpYyBsaXZlcyBpbiBNZW1vcnlNYW5hZ2VyIChub3QgU2VydmVyU3RhcnR1cClcbiAgICogYmVjYXVzZSBNZW1vcnlNYW5hZ2VyIGFscmVhZHkgb3ducyBhbGwgbWVtb3J5IG9wZXJhdGlvbnMgKENSVUQsIGFjdGl2YXRpb24sIGV0Yy4pXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGF1dG8tbG9hZCBzdGF0aXN0aWNzXG4gICAqL1xuICBhc3luYyBsb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzKCk6IFByb21pc2U8e1xuICAgIGxvYWRlZDogbnVtYmVyO1xuICAgIHNraXBwZWQ6IG51bWJlcjtcbiAgICB0b3RhbFRva2VuczogbnVtYmVyO1xuICAgIGVycm9yczogc3RyaW5nW107XG4gIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBsb2FkZWQgPSAwO1xuICAgIGxldCBza2lwcGVkID0gMDtcbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBmb3IgZW1lcmdlbmN5IGRpc2FibGVcbiAgICAgIGNvbnN0IGVtZXJnZW5jeURpc2FibGVkID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQgPT09ICd0cnVlJztcbiAgICAgIGlmIChlbWVyZ2VuY3lEaXNhYmxlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnW01lbW9yeU1hbmFnZXJdIEF1dG8tbG9hZCBkaXNhYmxlZCB2aWEgRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQnKTtcbiAgICAgICAgLy8gS2VlcCBhcyBzZWN1cml0eSBldmVudCDigJQgZW1lcmdlbmN5IGRpc2FibGUgaXMgYSBub3RhYmxlIG9wZXJhdGlvbmFsIGRlY2lzaW9uXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIubG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcycsXG4gICAgICAgICAgZGV0YWlsczogJ0F1dG8tbG9hZCBtZW1vcmllcyBkaXNhYmxlZCB2aWEgZW1lcmdlbmN5IGVudmlyb25tZW50IHZhcmlhYmxlJyxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyByZWFzb246ICdET0xMSE9VU0VfRElTQUJMRV9BVVRPTE9BRD10cnVlJyB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBsb2FkZWQ6IDAsIHNraXBwZWQ6IDAsIHRvdGFsVG9rZW5zOiAwLCBlcnJvcnM6IFtdIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEluc3RhbGwgc2VlZCBtZW1vcmllcyBmaXJzdFxuICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsU2VlZE1lbW9yaWVzKCk7XG5cbiAgICAgIC8vIEdldCBhdXRvLWxvYWQgbWVtb3JpZXNcbiAgICAgIGNvbnN0IGF1dG9Mb2FkTWVtb3JpZXMgPSBhd2FpdCB0aGlzLmdldEF1dG9Mb2FkTWVtb3JpZXMoKTtcblxuICAgICAgaWYgKGF1dG9Mb2FkTWVtb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW01lbW9yeU1hbmFnZXJdIE5vIGF1dG8tbG9hZCBtZW1vcmllcyBjb25maWd1cmVkJyk7XG4gICAgICAgIHJldHVybiB7IGxvYWRlZDogMCwgc2tpcHBlZDogMCwgdG90YWxUb2tlbnM6IDAsIGVycm9yczogW10gfTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBGb3VuZCAke2F1dG9Mb2FkTWVtb3JpZXMubGVuZ3RofSBhdXRvLWxvYWQgbWVtb3JpZXNgKTtcblxuICAgICAgLy8gUHJvY2VzcyBlYWNoIGF1dG8tbG9hZCBtZW1vcnlcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIGF1dG9Mb2FkTWVtb3JpZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZW1vcnlOYW1lID0gbWVtb3J5Lm1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nO1xuXG4gICAgICAgICAgLy8gVmFsaWRhdGUgbWVtb3J5IGJlZm9yZSBsb2FkaW5nXG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IG1lbW9yeS52YWxpZGF0ZSgpO1xuICAgICAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBgVmFsaWRhdGlvbiBmYWlsZWQgZm9yICcke21lbW9yeU5hbWV9JzogJHt2YWxpZGF0aW9uLmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfWA7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChlcnJvck1zZyk7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFc3RpbWF0ZSB0b2tlbnNcbiAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRUb2tlbnMgPSB0aGlzLmVzdGltYXRlVG9rZW5zKG1lbW9yeS5jb250ZW50IHx8ICcnKTtcblxuICAgICAgICAgIC8vIEFjdGl2YXRlIHRoZSBtZW1vcnlcbiAgICAgICAgICAvLyBGSVggSXNzdWUgIzM1OiBBZGQgdG8gYWN0aXZlTWVtb3J5TmFtZXMgc2V0IHNvIGdldEFjdGl2ZU1lbW9yaWVzKCkgcmV0dXJucyBpdFxuICAgICAgICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuYWRkKG1lbW9yeU5hbWUpO1xuICAgICAgICAgIGF3YWl0IG1lbW9yeS5hY3RpdmF0ZSgpO1xuICAgICAgICAgIGxvYWRlZCsrO1xuICAgICAgICAgIHRvdGFsVG9rZW5zICs9IGVzdGltYXRlZFRva2VucztcblxuICAgICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gQXV0by1sb2FkZWQ6ICR7bWVtb3J5TmFtZX0gKH4ke2VzdGltYXRlZFRva2Vuc30gdG9rZW5zKWApO1xuXG4gICAgICAgICAgLy8gUm91dGluZSBhdXRvLWxvYWQg4oCUIGRlYnVnIG9ubHkgKHdhcyBmbG9vZGluZyBzZWN1cml0eSBidWZmZXIpXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gQXV0by1sb2FkZWQ6ICR7bWVtb3J5TmFtZX0gKH4ke2VzdGltYXRlZFRva2Vuc30gdG9rZW5zLCBwcmlvcml0eTogJHsobWVtb3J5Lm1ldGFkYXRhIGFzIGFueSkucHJpb3JpdHl9KWApO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgbWVtb3J5TmFtZSA9IG1lbW9yeS5tZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGBGYWlsZWQgdG8gbG9hZCAnJHttZW1vcnlOYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWA7XG4gICAgICAgICAgZXJyb3JzLnB1c2goZXJyb3JNc2cpO1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbTWVtb3J5TWFuYWdlcl0gJHtlcnJvck1zZ31gKTtcbiAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbTWVtb3J5TWFuYWdlcl0gQXV0by1sb2FkIGNvbXBsZXRlOiAke2xvYWRlZH0gbWVtb3JpZXMgYWN0aXZhdGVkIGAgK1xuICAgICAgICBgKH4ke3RvdGFsVG9rZW5zfSB0b2tlbnMpLCAke3NraXBwZWR9IHNraXBwZWQsICR7ZXJyb3JzLmxlbmd0aH0gZXJyb3JzLCAke2VsYXBzZWRUaW1lfW1zYFxuICAgICAgKTtcblxuICAgICAgLy8gU3VtbWFyeSBldmVudCDigJQgZmlyZXMgb25jZSBwZXIgc3RhcnR1cCwga2VlcCBhcyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzJyxcbiAgICAgICAgZGV0YWlsczogYEF1dG8tbG9hZCBjb21wbGV0ZTogJHtsb2FkZWR9IGxvYWRlZCwgJHtza2lwcGVkfSBza2lwcGVkLCAke2Vycm9ycy5sZW5ndGh9IGVycm9yc2AsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgbG9hZGVkQ291bnQ6IGxvYWRlZCxcbiAgICAgICAgICBza2lwcGVkQ291bnQ6IHNraXBwZWQsXG4gICAgICAgICAgZXJyb3JDb3VudDogZXJyb3JzLmxlbmd0aCxcbiAgICAgICAgICB0b3RhbFRva2VucyxcbiAgICAgICAgICBsb2FkVGltZU1zOiBlbGFwc2VkVGltZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgbG9hZGVkLCBza2lwcGVkLCB0b3RhbFRva2VucywgZXJyb3JzIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG9uJ3QgZmFpbCBzdGFydHVwIGlmIGF1dG8tbG9hZCBmYWlscywgYnV0IHByb3ZpZGUgZGV0YWlsZWQgZGlhZ25vc3RpY3NcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lIDogJ1Vua25vd24nO1xuXG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBGYWlsZWQgdG8gbG9hZCBhdXRvLWxvYWQgbWVtb3JpZXMgKCR7ZXJyb3JUeXBlfSk6ICR7ZXJyb3JNZXNzYWdlfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIExvZyBmYWlsdXJlXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BRF9GQUlMRUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIubG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcycsXG4gICAgICAgIGRldGFpbHM6IGBBdXRvLWxvYWQgbWVtb3JpZXMgZmFpbGVkOiAke2Vycm9yVHlwZX0gLSAke2Vycm9yTWVzc2FnZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGVycm9yVHlwZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgbG9hZFRpbWVNczogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgbG9hZGVkOiAwLCBza2lwcGVkOiAwLCB0b3RhbFRva2VuczogMCwgZXJyb3JzOiBbZXJyb3JNZXNzYWdlXSB9O1xuICAgIH1cbiAgfVxufVxuIl19
1823
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFrQixNQUFNLGFBQWEsQ0FBQztBQUVyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLG9CQUFvQixFQUNyQixNQUFNLHVDQUF1QyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVF4QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXBDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU1SCwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkc7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxRQUFnQjtJQUNwQyxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLElBQVk7SUFDekMsbURBQW1EO0lBQ25ELE9BQU8sNEJBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsbUJBQW1CLENBQUMsYUFBcUI7SUFDaEQsNERBQTREO0lBQzVELE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQyw2REFBNkQsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsRyxDQUFDO0FBUUQsTUFBTSxPQUFPLGFBQWMsU0FBUSxrQkFBMEI7SUE0QmpEO0lBM0JPLFdBQVcsQ0FBUztJQUNyQyw2REFBNkQ7SUFDckQsZ0JBQWdCLEdBQUcsSUFBSSxRQUFRLENBQVM7UUFDOUMsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixPQUFPLEVBQUUsSUFBSTtRQUNiLFdBQVcsRUFBRSxDQUFDO1FBQ2QsS0FBSyxFQUFFLENBQUM7S0FDVCxDQUFDLENBQUM7SUFDSyxpQkFBaUIsR0FBRyxJQUFJLFFBQVEsQ0FBUztRQUMvQyxJQUFJLEVBQUUsMkJBQTJCO1FBQ2pDLE9BQU8sRUFBRSxJQUFJO1FBQ2IsV0FBVyxFQUFFLENBQUM7UUFDZCxLQUFLLEVBQUUsQ0FBQztLQUNULENBQUMsQ0FBQztJQUNLLHdCQUF3QixDQUEyQjtJQUNuRCxpQkFBaUIsQ0FBb0I7SUFDckMsb0JBQW9CLENBQXVCO0lBRW5ELHdFQUF3RTtJQUNoRSxpQkFBaUIsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVuRCxZQUNFLGdCQUFrQyxFQUNsQyxlQUFnQyxFQUNoQyxxQkFBNEMsRUFDNUMsa0JBQXNDLEVBQ3RDLG9CQUEwQyxFQUNsQyxlQUFnQyxFQUN4QyxnQkFBbUMsRUFDbkMsWUFBMkUsRUFDM0UsYUFBdUU7UUFFdkUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFMbkosb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBTXhDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsa0JBQWtCLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNqRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ2dCLGtCQUFrQixDQUFDLHFCQUE0QztRQUNoRiwrRUFBK0U7UUFDL0Usb0RBQW9EO1FBQ3BELE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRTtZQUNuRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDNUIsY0FBYyxFQUFFLHdCQUF3QixFQUFFO1lBQzFDLGVBQWUsRUFBRSx5QkFBeUIsRUFBRTtZQUM1QyxVQUFVLEVBQUUsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7U0FDMUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVrQixlQUFlO1FBQ2hDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsbUVBQW1FO0lBQ2hELEtBQUssQ0FBQyxzQkFBc0IsS0FBZ0MsQ0FBQztJQUM3RCxLQUFLLENBQUMsd0JBQXdCLEtBQXVCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQztJQUV2Rjs7O09BR0c7SUFDTSxVQUFVO1FBQ2pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDTSxPQUFPO1FBQ2QscUVBQXFFO1FBQ3JFLGtFQUFrRTtRQUNsRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBRSxtRkFBbUY7UUFDckcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0I7UUFDOUMsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQzFFLGlDQUFpQztZQUNqQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ25FLElBQUksTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDO1lBRUQsOEJBQThCO1lBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEUsSUFBSSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELE9BQU8sV0FBVyxDQUFDO1lBQ3JCLENBQUM7WUFFRCw4QkFBOEI7WUFDOUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDaEQsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQy9DLE9BQU8sUUFBUSxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztZQUVELDJFQUEyRTtZQUMzRSxPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNNLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBZ0I7UUFDbEMsSUFBSSxDQUFDO1lBQ0gsNkNBQTZDO1lBQzdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXhELDZCQUE2QjtZQUM3QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQseUVBQXlFO1lBQ3pFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RCxJQUFJLE1BQU07Z0JBQUUsT0FBTyxNQUFNLENBQUM7WUFFMUIsK0RBQStEO1lBQy9ELG9FQUFvRTtZQUNwRSw4REFBOEQ7WUFDOUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUVwRiw0RUFBNEU7WUFDNUUsNkZBQTZGO1lBRTdGLHlGQUF5RjtZQUN6RixvRkFBb0Y7WUFFcEYsd0ZBQXdGO1lBQ3hGLElBQUksTUFBd0IsQ0FBQztZQUU3QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDMUIsZ0VBQWdFO2dCQUNoRSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNyQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQkFDdEUsV0FBVyxFQUFFLGdCQUFnQixDQUFDLGFBQWE7b0JBQzNDLGVBQWUsRUFBRSxLQUFLLEVBQUcsMkNBQTJDO29CQUNwRSxNQUFNLEVBQUUsb0JBQW9CO29CQUM1QixNQUFNLEVBQUUsTUFBTSxDQUFFLGlFQUFpRTtpQkFDbEYsQ0FBQyxDQUFDO2dCQUVILHFDQUFxQztnQkFDckMsTUFBTSxHQUFHO29CQUNQLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtvQkFDdEIsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO2lCQUM3QixDQUFDO1lBQ0osQ0FBQztZQUVELHdDQUF3QztZQUN4QyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFcEYseUJBQXlCO1lBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFMUQseUZBQXlGO1lBQ3pGLHVGQUF1RjtZQUN2RixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDO1lBQ25ELElBQUksZ0JBQWdCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztZQUN6QyxDQUFDO1lBRUQsd0RBQXdEO1lBQ3hELE9BQVEsTUFBTSxDQUFDLFFBQWdCLENBQUMsY0FBYyxDQUFDO1lBRS9DLGdDQUFnQztZQUNoQywyREFBMkQ7WUFDM0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7WUFDckMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ2hDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtvQkFDYixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ2pCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztvQkFDdkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO29CQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQzdCLE9BQU8sRUFBRSxPQUFPO2lCQUNqQixDQUFDLENBQUMsQ0FBQztZQUNOLENBQUM7WUFFRCw2RUFBNkU7WUFDN0Usb0ZBQW9GO1lBQ3BGLElBQUksdUJBQXVCLElBQUksdUJBQXVCLENBQUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3pHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFDckIsRUFBRSxFQUFHLE9BQU87Z0JBQ1osRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFHLFdBQVc7Z0JBQ3BELE1BQU0sQ0FBRSxTQUFTO2lCQUNsQixDQUFDO1lBQ0osQ0FBQztZQUVELDJFQUEyRTtZQUMzRSx3RUFBd0U7WUFDeEUsb0RBQW9EO1lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RixNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRWpDLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUV4Qyx3RUFBd0U7WUFDeEUsNkVBQTZFO1lBQzdFLHlFQUF5RTtZQUN6RSxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUU5RSxPQUFPLE1BQU0sQ0FBQztRQUVoQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQjtnQkFDL0MsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLE9BQU8sRUFBRSw4QkFBOEIsUUFBUSxLQUFLLEtBQUssRUFBRTthQUM1RCxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLGdCQUFnQixDQUFDLFlBQW9CO1FBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEksTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDN0UsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsU0FBUyxPQUFPLENBQUMsQ0FBQztRQUUxRSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFdkYsdUVBQXVFO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFpQixFQUFFLGNBQXNCO1FBQzNFLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDO1FBQy9ELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEUsNENBQTRDO1lBQzVDLE1BQU0sYUFBYSxHQUFHLFFBQVE7aUJBQzNCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3ZFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdEQUF3RDtZQUUvRixJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksVUFBVTtnQkFBRSxPQUFPO1lBRS9DLDBDQUEwQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQzNFLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQztvQkFDSCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFDMUIsV0FBVyxDQUFDLE1BQU0sRUFDbEIsRUFBRSxNQUFNLEVBQUUscUNBQXFDLEVBQUUsQ0FDbEQsQ0FBQztnQkFDSixDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsSUFBSSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pFLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxRQUFRLENBQUMsTUFBTSx1QkFBdUIsUUFBUSxVQUFVLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDM0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsNENBQTRDO1lBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLFNBQVMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFlLEVBQUUsVUFBdUIsRUFBRSxRQUFpQjtRQUMxRixNQUFNLElBQUksR0FBRyxVQUFVLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQztRQUMzQyxJQUFJLFNBQWlCLENBQUM7UUFFdEIsbURBQW1EO1FBQ25ELFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDYixLQUFLLFVBQVUsQ0FBQyxNQUFNO2dCQUNwQixTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNO1lBQ1IsS0FBSyxVQUFVLENBQUMsT0FBTztnQkFDckIsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDcEQsTUFBTTtZQUNSLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQztZQUNyQixPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNSLDZEQUE2RDtnQkFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RJLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3BELE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXJELGdEQUFnRDtRQUNoRCxpRkFBaUY7UUFDakYsTUFBTSxRQUFRLEdBQUcsUUFBUSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFFakcseUZBQXlGO1FBQ3pGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELElBQUksTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHFCQUFxQixDQUFDLFFBQWdCO1FBQzVDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzFFLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMscUJBQXFCO1FBQ2pDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQztZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO1NBQ3hDLENBQUM7UUFFRixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxvQkFBb0IsQ0FBQyxPQUFlO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDN0IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU87U0FDakQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGNBQWM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUUsT0FBTyxPQUFPO2lCQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDaEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7UUFDcEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFLLEtBQWEsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWUsRUFBRSxRQUFpQjtRQUNwRCxJQUFJLENBQUM7WUFDSCw4REFBOEQ7WUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDekMsSUFBSSxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDckQsTUFBTSxDQUFDLElBQUksQ0FDVCw4REFBOEQsVUFBVSxLQUFLO29CQUM3RSxzQkFBc0IsWUFBWSxHQUFHLENBQ3RDLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO2dCQUVyQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxZQUFZO29CQUN6QyxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsTUFBTSxFQUFFLG9CQUFvQjtvQkFDNUIsT0FBTyxFQUFFLG9EQUFvRCxVQUFVLFNBQVMsWUFBWSxHQUFHO2lCQUNoRyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsbUJBQW1CO1lBQ25CLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFFRCwyQ0FBMkM7WUFDM0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFNUQsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsMEJBQTBCO2dCQUMxQixlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSxvQkFBb0I7b0JBQzVCLE9BQU8sRUFBRSx5Q0FBeUMsWUFBWSxFQUFFO2lCQUNqRSxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsc0RBQXNEO1lBQ3RELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUEwQixDQUFDO1lBQ3RELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQztZQUU1RCx3QkFBd0I7WUFDeEIsZ0NBQWdDO1lBQ2hDLCtEQUErRDtZQUMvRCwrREFBK0Q7WUFDL0QsK0VBQStFO1lBQy9FLHlDQUF5QztZQUN6QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFFBQVEsR0FBRyxRQUFRO2dCQUN2QixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDO2dCQUM3QyxDQUFDLENBQUMsZ0JBQWdCO29CQUNoQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUM7b0JBQ3JELENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFekQsaUNBQWlDO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRWxFLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXpELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUUvQyxnRUFBZ0U7WUFDaEUsa0VBQWtFO1lBQ2xFLDhEQUE4RDtZQUM5RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUVsRiwyREFBMkQ7WUFDM0Qsd0VBQXdFO1lBQ3hFLG9EQUFvRDtZQUNwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekYsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVsQyxpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFekMsd0NBQXdDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRTVELG9DQUFvQztZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVsRCxzQkFBc0I7WUFDdEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHNCQUFzQixDQUFDLFlBQVk7Z0JBQ3pDLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLE9BQU8sRUFBRSxtQkFBbUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLENBQUMsWUFBWSxVQUFVO2FBQ3pGLENBQUMsQ0FBQztRQUVMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCO2dCQUMvQyxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLG9CQUFvQjtnQkFDNUIsT0FBTyxFQUFFLDRCQUE0QixRQUFRLEtBQUssS0FBSyxFQUFFO2FBQzFELENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFlO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDRCQUE0QixDQUFDLFdBQW1CO1FBQ3RELDhFQUE4RTtRQUM5RSw4RUFBOEU7UUFDOUUsc0NBQXNDO1FBQ3RDLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4RCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0I7Z0JBQy9DLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsb0NBQW9DO2dCQUM1QyxPQUFPLEVBQUUsMkNBQTJDLFdBQVcsQ0FBQyxNQUFNLE1BQU0sZ0JBQWdCLENBQUMsYUFBYSxHQUFHO2dCQUM3RyxRQUFRLEVBQUUsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsYUFBYSxFQUFFO2FBQ3ZGLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQ2IsMkNBQTJDLFdBQVcsQ0FBQyxNQUFNLE1BQU0sZ0JBQWdCLENBQUMsYUFBYSxXQUFXO2dCQUM1RyxrRUFBa0UsQ0FDbkUsQ0FBQztRQUNKLENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsK0VBQStFO1FBQy9FLDhFQUE4RTtRQUM5RSwyRUFBMkU7UUFDM0UsOEVBQThFO1FBQzlFLCtFQUErRTtRQUMvRSw2RUFBNkU7UUFDN0UsNEVBQTRFO1FBQzVFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxlQUFlLENBQUM7UUFDbEQsSUFBSSxZQUFZLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsWUFBWSxVQUFVLFdBQVcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDO1FBQ25ILENBQUM7UUFDRCxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLEdBQUcsNEJBQTRCLENBQUMsVUFBVSxDQUFDO1lBQzNDLEdBQUcsNEJBQTRCLENBQzdCLFVBQVUsQ0FBQyxRQUFRLElBQUksT0FBTyxVQUFVLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDbkcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFtQztnQkFDaEQsQ0FBQyxDQUFDLFNBQVMsQ0FDZDtTQUNGLENBQUM7UUFDRixJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLHdEQUF3RCxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNwRyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCLENBQ3ZCLElBQVksRUFDWixLQUFjLEVBQ2QsV0FBbUQ7UUFFbkQsTUFBTSxRQUFRLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDNUMscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxzQkFBc0IsQ0FBQyx1QkFBdUI7Z0JBQ3BELFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLE9BQU8sRUFBRSxrQkFBa0IsSUFBSSxLQUFLLEtBQUssRUFBRTthQUM1QyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLE1BQU0sV0FBVyxHQUEyQyxFQUFFLENBQUM7UUFFL0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFNUQsd0RBQXdEO1lBQ3hELE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUUvRCx5QkFBeUI7WUFDekIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1lBQzlCLEtBQUssTUFBTSxZQUFZLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQztvQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzdDLDZDQUE2QztvQkFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQTBCLENBQUM7b0JBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQzNCLFVBQVUsQ0FBQyxVQUFVLEdBQUcsdUJBQXVCLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBZSxDQUFDO29CQUM5RixDQUFDO29CQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hCLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLFdBQVcsQ0FBQyxNQUFNLFlBQVksRUFDMUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBRUQseURBQXlEO1lBQ3pELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1lBQ2pELEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxRQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQzlDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO3FCQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDckIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM5RSxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFM0QsdUVBQXVFO1lBQ3ZFLEtBQUssTUFBTSxNQUFNLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3JELE1BQU0sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sY0FBYyxDQUFDO1FBRXhCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSyxLQUFhLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFrQjtRQUNyQyxzREFBc0Q7UUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QseURBQXlEO2dCQUN6RCxPQUFPLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQzthQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUVELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUVoQyw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpELGlDQUFpQztRQUNqQyxNQUFNLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV4QixpRUFBaUU7UUFDakUsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFFLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV6RCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYiwyREFBMkQ7WUFDM0QsT0FBTyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUM1RSxNQUFNO1NBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUN2QyxzREFBc0Q7UUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QseURBQXlEO2dCQUN6RCxPQUFPLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQzthQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUVELHlCQUF5QjtRQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEQsaUNBQWlDO1FBQ2pDLE1BQU0sTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYiwyREFBMkQ7WUFDM0QsT0FBTyxFQUFFLGVBQWUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztTQUMvRSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLFVBQXlFO1FBUXpFLE1BQU0sTUFBTSxHQUFHO1lBQ2IsT0FBTyxFQUFFLENBQUM7WUFDVixRQUFRLEVBQUUsQ0FBQztZQUNYLE1BQU0sRUFBRSxDQUFDO1lBQ1QsZ0JBQWdCLEVBQUUsRUFBaUU7WUFDbkYsWUFBWSxFQUFFLEVBQTRDO1NBQzNELENBQUM7UUFFRixNQUFNLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFFakYsSUFBSSxDQUFDO1lBQ0gsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkMsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBRWpDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQixLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDekMsU0FBUyxFQUFFLENBQUM7Z0JBRVosa0JBQWtCO2dCQUNsQixJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUNmLFVBQVUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDdEQsQ0FBQztnQkFFRCxJQUFJLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksU0FBUyxDQUFDO29CQUVuRCxJQUFJLENBQUM7d0JBQ0gsa0JBQWtCO3dCQUNsQixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7d0JBRXBDLDJCQUEyQjt3QkFDM0IsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUV4QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ2xCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7NEJBQzNCLFFBQVEsRUFBRSxXQUFXOzRCQUNyQixRQUFRLEVBQUUsWUFBWTs0QkFDdEIsSUFBSSxFQUFFLFFBQVE7eUJBQ2YsQ0FBQyxDQUFDO3dCQUVILE1BQU0sQ0FBQyxJQUFJLENBQ1Qsd0NBQXdDLFdBQVcsU0FBUyxZQUFZLFFBQVEsUUFBUSxFQUFFLENBQzNGLENBQUM7b0JBQ0osQ0FBQztvQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO3dCQUNmLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDaEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7NEJBQ3ZCLElBQUksRUFBRSxXQUFXOzRCQUNqQixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzt5QkFDOUQsQ0FBQyxDQUFDO3dCQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELFdBQVcsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUN2RixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FDVCxtREFBbUQ7Z0JBQ25ELFlBQVksTUFBTSxDQUFDLE9BQU8sZUFBZSxNQUFNLENBQUMsUUFBUSxhQUFhLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDckYsQ0FBQztZQUVGLElBQUksTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsWUFBWTtvQkFDekMsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE1BQU0sRUFBRSxvQ0FBb0M7b0JBQzVDLE9BQU8sRUFBRSx1QkFBdUIsTUFBTSxDQUFDLFFBQVEseUJBQXlCO29CQUN4RSxjQUFjLEVBQUU7d0JBQ2QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO3dCQUN2QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7d0JBQ3pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtxQkFDdEI7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RSxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixTQUFrQixFQUNsQixTQUFrQixLQUFLLEVBQ3ZCLFVBQXlFO1FBU3pFLE1BQU0sR0FBRyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxFQUFFLENBQUM7WUFDVCxZQUFZLEVBQUUsRUFBYztZQUM1QixTQUFTLEVBQUUsRUFBYztZQUN6QixZQUFZLEVBQUUsRUFBNEM7U0FDM0QsQ0FBQztRQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQXlELEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU1RyxJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNELE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUU5QixrQ0FBa0M7WUFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7WUFFakQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsNEVBQTRFO2dCQUM1RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUM7Z0JBQzNHLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ25CLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbkMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2xELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3BCLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0gsQ0FBQztZQUVELG9DQUFvQztZQUNwQyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbEIsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRTVHLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDdEQscUVBQXFFO2dCQUNyRSxNQUFNLGNBQWMsR0FBRyxHQUFHLFFBQVEsT0FBTyxDQUFDO2dCQUMxQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7Z0JBRUQsS0FBSyxNQUFNLGFBQWEsSUFBSSxjQUFjLEVBQUUsQ0FBQztvQkFDM0MsU0FBUyxFQUFFLENBQUM7b0JBRVosa0JBQWtCO29CQUNsQixJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNmLFVBQVUsQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQzVELENBQUM7b0JBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQy9DLElBQUksQ0FBQzt3QkFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7NEJBQ1osTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRTtnQ0FDakUsTUFBTSxFQUFFLHVDQUF1Qzs2QkFDaEQsQ0FBQyxDQUFDO3dCQUNMLENBQUM7d0JBQ0QsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNqQixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDeEMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDO29CQUNyRyxDQUFDO29CQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7d0JBQ2YsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNoQixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQzs0QkFDdkIsSUFBSSxFQUFFLGFBQWE7NEJBQ25CLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO3lCQUM5RCxDQUFDLENBQUM7d0JBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsYUFBYSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3ZGLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLENBQUMsSUFBSSxDQUNULHFEQUFxRCxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJO2dCQUNuRixZQUFZLE1BQU0sQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsT0FBTyxhQUFhLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDbEgsQ0FBQztZQUVGLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsc0JBQXNCLENBQUMsY0FBYztvQkFDM0MsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsTUFBTSxFQUFFLHVDQUF1QztvQkFDL0MsT0FBTyxFQUFFLHlCQUF5QixNQUFNLENBQUMsT0FBTyx5QkFBeUI7b0JBQ3pFLGNBQWMsRUFBRTt3QkFDZCxTQUFTLEVBQUUsR0FBRzt3QkFDZCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87d0JBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTzt3QkFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO3FCQUN0QjtpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssd0JBQXdCO1FBQzlCLE1BQU0sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxRSxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDbkQsT0FBTztRQUNULENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQ1Qsa0NBQWtDLEdBQUcsS0FBSztnQkFDMUMsbUdBQW1HLENBQ3BHLENBQUM7WUFFRixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxlQUFlO2dCQUNyQixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsTUFBTSxFQUFFLHdDQUF3QztnQkFDaEQsT0FBTyxFQUFFLGtDQUFrQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRTthQUNoRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsMERBQTBEO1FBQzFELEtBQUssSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsMEJBQTBCO1FBQ3RDLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRXhFLE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztZQUNoQyxLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUM1QyxNQUFNLE9BQU8sR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDO1lBRXBDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsSUFBSSxDQUNULGNBQWMsT0FBTyxxQ0FBcUM7b0JBQzFELG9CQUFvQixPQUFPLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FDL0QsQ0FBQztnQkFFRixlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSwwQ0FBMEM7b0JBQ2xELE9BQU8sRUFBRSxXQUFXLE9BQU8saUNBQWlDO29CQUM1RCxjQUFjLEVBQUU7d0JBQ2QsWUFBWSxFQUFFLE9BQU87d0JBQ3JCLFdBQVcsRUFBRSxPQUFPO3dCQUNwQixVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7cUJBQ2xDO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFaEUsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsMENBQTBDO2dCQUNsRCxPQUFPLEVBQUUsbUJBQW1CLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTthQUNyRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsY0FBYyxDQUMxQixRQUFnRDtRQUVoRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDeEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNyRCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkIsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sUUFBUSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEUsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxvQkFBb0IsQ0FDaEMsVUFBa0IsRUFDbEIsUUFBZ0Q7UUFFaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDM0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNyRCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxRQUFRLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsYUFBYTtRQU1qQixNQUFNLFFBQVEsR0FBMkMsRUFBRSxDQUFDO1FBQzVELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVuQixJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVoRCxtQkFBbUI7WUFDbkIsVUFBVSxJQUFJLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVsRCxxQkFBcUI7WUFDckIsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckMsVUFBVSxJQUFJLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RSxDQUFDO1lBRUQsT0FBTztnQkFDTCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsTUFBTSxFQUFFLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTTtnQkFDcEMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN2QixRQUFRO2FBQ1QsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLElBQUksQ0FBQztZQUNILDRCQUE0QjtZQUM1QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFL0Isc0VBQXNFO1lBQ3RFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFrQyxDQUFDO1lBQ2hFLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBRTdELE1BQU0sQ0FBQyxJQUFJLENBQUMsOENBQThDLGVBQWUsQ0FBQyxNQUFNLDZCQUE2QixDQUFDLENBQUM7WUFFL0csOENBQThDO1lBQzlDLE1BQU0sZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO1lBQ3RDLEtBQUssTUFBTSxLQUFLLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQztvQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMvQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEtBQUssQ0FBQyxJQUFJLGNBQWMsS0FBSyxDQUFDLFFBQVEsSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDO2dCQUNoRyxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsS0FBSyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RixDQUFDO1lBQ0gsQ0FBQztZQUVELG9GQUFvRjtZQUNwRixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLE1BQU0sRUFBRSxHQUFJLENBQUMsQ0FBQyxRQUEyQixDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUM7Z0JBQzFELE1BQU0sRUFBRSxHQUFJLENBQUMsQ0FBQyxRQUEyQixDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUM7Z0JBQzFELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUM7WUFDSCx1QkFBdUI7WUFDdkIsTUFBTSxZQUFZLEdBQUcsc0NBQXNDLENBQUM7WUFDNUQsTUFBTSxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUUxRSxrQkFBa0I7WUFDbEIsNkRBQTZEO1lBQzdELHFEQUFxRDtZQUNyRCw0REFBNEQ7WUFDNUQsb0RBQW9EO1lBQ3BELGtFQUFrRTtZQUNsRSxrRUFBa0U7WUFDbEUsZ0VBQWdFO1lBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxLQUFLLENBQUMscURBQXFELGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUV0RixrREFBa0Q7WUFDbEQsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSw4QkFBOEIsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNsRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBRWxGLGlFQUFpRTtZQUNqRSxJQUFJLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1lBQzVFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLDJFQUEyRSxDQUFDLENBQUM7Z0JBQ3pGLG1CQUFtQjtnQkFDbkIsY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUscUNBQXFDLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3JHLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDcEYsQ0FBQztZQUVELGdDQUFnQztZQUNoQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsMkRBQTJELGNBQWMsRUFBRSxDQUFDLENBQUM7WUFFekYsaURBQWlEO1lBQ2pELG9FQUFvRTtZQUNwRSxrRUFBa0U7WUFFbEUsTUFBTSxDQUFDLElBQUksQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO1lBQ3pGLElBQUksY0FBa0MsQ0FBQztZQUV2QyxJQUFJLENBQUM7Z0JBQ0gsOEJBQThCO2dCQUM5QixjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDekUsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCx5REFBeUQ7Z0JBQ3pELE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLFlBQVksOENBQThDLENBQUMsQ0FBQztZQUN0SCxDQUFDO1lBRUQsMERBQTBEO1lBQzFELElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUVBQW1FLENBQUMsQ0FBQztnQkFDakYsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixPQUFPLENBQUMsTUFBTSw2QkFBNkIsQ0FBQyxDQUFDO2dCQUVuRixrRUFBa0U7Z0JBQ2xFLHNFQUFzRTtnQkFDdEUsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBRXBDLElBQUksVUFBVSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBQ2pELE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDO29CQUNyRixzREFBc0Q7b0JBQ3RELElBQUksT0FBTyxLQUFLLGFBQWEsSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFLENBQUM7d0JBQ2hELFVBQVUsR0FBRyxLQUFLLENBQUM7d0JBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztvQkFDNUUsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2YscUVBQXFFO29CQUNyRSx1RUFBdUU7b0JBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0ZBQXdGLENBQUMsQ0FBQztvQkFDdEcsTUFBTSxDQUFDLElBQUksQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO29CQUM5RixPQUFPO2dCQUNULENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxPQUFPLENBQUMsTUFBTSwyQkFBMkIsQ0FBQyxDQUFDO2dCQUNuSCxDQUFDO2dCQUVELGlEQUFpRDtnQkFDakQsTUFBTSxDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZFQUE2RSxDQUFDLENBQUM7Z0JBQzdGLENBQUM7Z0JBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxDQUFDLEtBQUssQ0FBQywwREFBMEQsRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFDdEYsTUFBTSxXQUFXLENBQUM7Z0JBQ3BCLENBQUM7WUFDSCxDQUFDO1lBRUQscUJBQXFCO1lBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsdURBQXVELENBQUMsQ0FBQztZQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLE1BQU0sQ0FBQyxJQUFJLENBQUMscUNBQXFDLFdBQVcsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxDQUFDO1lBRWxGLG1DQUFtQztZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtFQUErRSxDQUFDLENBQUM7WUFDN0YsSUFBSSxNQUFjLENBQUM7WUFDbkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxVQUFVLENBQUM7WUFDbkIsQ0FBQztZQUVELDJEQUEyRDtZQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLHdFQUF3RSxDQUFDLENBQUM7WUFDdEYsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQTBCLENBQUM7WUFDckQsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQzFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsaUNBQWlDO1lBQzdELFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUcsdUNBQXVDO1lBQ2xFLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLFVBQVUsQ0FBQyxVQUFVLGVBQWUsVUFBVSxDQUFDLFFBQVEsZUFBZSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUUxSSx1RUFBdUU7WUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQywyRkFBMkYsQ0FBQyxDQUFDO1lBQ3pHLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztnQkFDaEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFBQyxPQUFPLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLCtDQUErQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN6RSxNQUFNLFNBQVMsQ0FBQztZQUNsQixDQUFDO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1lBRTlFLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFekUsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixnRkFBZ0Y7WUFDaEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RSxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxtQ0FBbUM7Z0JBQzNDLE9BQU8sRUFBRSxvQ0FBb0MsS0FBSyxFQUFFO2FBQ3JELENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBR0Q7O09BRUc7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQXVDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQXVDO1FBQzdELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQjtRQUNwQyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU3RCx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDaEQsd0RBQXdEO2dCQUN4RCxPQUFPO1lBQ1QsQ0FBQztZQUVELGtCQUFrQjtZQUNsQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFO2dCQUNqRSxNQUFNLEVBQUUsc0JBQXNCO2FBQy9CLENBQUMsQ0FBQztZQUVILHFCQUFxQjtZQUNyQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVqQyw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFOUMsaURBQWlEO1lBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFFRCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxjQUFjO2dCQUMzQyxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsTUFBTSxFQUFFLHNCQUFzQjtnQkFDOUIsT0FBTyxFQUFFLHdCQUF3QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2FBQzNELENBQUMsQ0FBQztRQUVMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSyxLQUFhLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyQyx3REFBd0Q7Z0JBQ3hELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQjtRQUNwQyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RCxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBK0U7UUFDMUYsaURBQWlEO1FBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUMzRCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO1NBQ2xDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksZ0JBQWdCLENBQUMsUUFBUSxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNDLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMxQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUNoRSxDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLFFBQVEsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCx3RUFBd0U7UUFDeEUseURBQXlEO1FBQ3pELE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBRTlELGtCQUFrQjtRQUNsQixNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWhFLDBFQUEwRTtRQUMxRSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ3JDLENBQUM7UUFFRCwyRUFBMkU7UUFDM0UsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsMENBQTBDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixnRUFBZ0U7UUFDaEUsMkVBQTJFO1FBRTNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGtCQUFrQixDQUFDLElBQVk7UUFDckMsa0RBQWtEO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7WUFDOUQsV0FBVyxFQUFFLGdCQUFnQixDQUFDLGFBQWE7WUFDM0MsZUFBZSxFQUFFLElBQUk7WUFDckIsTUFBTSxFQUFFLGtDQUFrQztZQUMxQyxNQUFNLEVBQUUsTUFBTSxDQUFFLGlFQUFpRTtTQUNsRixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ25CLGVBQWUsRUFBRSxNQUFNLENBQUMsT0FBTztTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsc0JBQXNCLENBQ2xDLE1BQVcsRUFDWCxlQUFtQztRQUVuQyxnREFBZ0Q7UUFDaEQscURBQXFEO1FBQ3JELGtFQUFrRTtRQUNsRSxxREFBcUQ7UUFDckQsMkVBQTJFO1FBQzNFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7UUFFdkQsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCx5QkFBeUI7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUxRCwwQkFBMEI7UUFDMUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDaEMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNiLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN2QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDN0IsT0FBTyxFQUFFLE9BQU87YUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO1FBRUQsNkVBQTZFO1FBQzdFLDJGQUEyRjtRQUMzRixJQUFJLGVBQWUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FDbkIsZUFBZSxDQUFDLElBQUksRUFBRSxFQUN0QixFQUFFLEVBQUcsT0FBTztZQUNaLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRyxXQUFXO1lBQ3RELFFBQVEsQ0FBRSxTQUFTO2FBQ3BCLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDTSxLQUFLLENBQUMsYUFBYSxDQUMxQixJQUFZLEVBQ1osU0FBdUMsTUFBTTtRQUU3QyxJQUFJLENBQUM7WUFDSCxJQUFJLE1BQVcsQ0FBQztZQUNoQixJQUFJLGVBQW1DLENBQUM7WUFFeEMsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUM7aUJBQU0sQ0FBQztnQkFDTiw2Q0FBNkM7Z0JBQzdDLDZFQUE2RTtnQkFDN0UsSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3ZCLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO2dCQUMzQyxDQUFDO2dCQUFDLE9BQU8sU0FBUyxFQUFFLENBQUM7b0JBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELENBQUM7Z0JBRUQsMEJBQTBCO2dCQUMxQixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7Z0JBQ2pELENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFcEUsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxvQkFBb0I7Z0JBQ2pELFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsNkJBQTZCO2dCQUNyQyxPQUFPLEVBQUUsNEJBQTRCLEtBQUssRUFBRTthQUM3QyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLLENBQUMsYUFBYSxDQUMxQixPQUFlLEVBQ2YsU0FBdUMsTUFBTTtRQUU3QyxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN0QixPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxHQUFHO1lBQ1gsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixLQUFLLEVBQUU7Z0JBQ0wsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUNoQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRTtnQkFDN0MsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFO2FBQzlDO1lBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsT0FBTztTQUNqRCxDQUFDO1FBRUYsd0NBQXdDO1FBQ3hDLG9GQUFvRjtRQUNwRiwwRkFBMEY7UUFDMUYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUM5QyxNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU0sRUFBRSxJQUFJO1lBQ1osV0FBVyxFQUFFLElBQUk7WUFDakIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRWtCLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBUztRQUM5QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRSxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRWtCLGFBQWEsQ0FBQyxRQUF3QixFQUFFLFFBQWdCO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUQsZ0VBQWdFO1FBQ2hFLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUM1QyxPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFa0IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWU7UUFDdkQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLCtEQUErRDtRQUMvRCxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQVEsQ0FBQztRQUMxRCxRQUFnQixDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsQ0FBRSx3Q0FBd0M7UUFDakYsUUFBZ0IsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLE9BQU8sR0FBNEI7WUFDdkMsUUFBUTtZQUNSLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RSxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsS0FBSyxFQUFFO2dCQUNMLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUU7Z0JBQzdDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRTtnQkFDN0MsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDOUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDM0IsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7cUJBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUMzQztZQUNELE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU87U0FDakQsQ0FBQztRQUVGLG9GQUFvRjtRQUNwRiwwRkFBMEY7UUFDMUYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUNqRCxNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU0sRUFBRSxJQUFJO1lBQ1osV0FBVyxFQUFFLElBQUk7WUFDakIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTSxRQUFRLENBQUMsT0FBZTtRQUMvQixPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ00sWUFBWSxDQUFDLFFBQWdCO1FBQ3BDLElBQUksQ0FBQztZQUNILHdDQUF3QztZQUN4QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTVDLG9DQUFvQztZQUNwQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNqRyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTSxjQUFjO1FBQ3JCLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDTSxnQkFBZ0I7UUFDdkIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELHlCQUF5QjtJQUV6Qjs7Ozs7Ozs7T0FRRztJQUNLLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxRQUFnQjtRQUNuRCw4Q0FBOEM7UUFDOUMsd0VBQXdFO1FBRXhFLDhEQUE4RDtRQUM5RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLHNFQUFzRTtRQUN0RSw2RUFBNkU7UUFDN0UsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN6QixRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDOUIsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsd0JBQXdCO2dCQUM5QixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLHNDQUFzQztnQkFDOUMsT0FBTyxFQUFFLG1DQUFtQyxRQUFRLEVBQUU7YUFDdkQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXpELHdDQUF3QztRQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0QsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBd0I7UUFDOUMsd0VBQXdFO1FBQ3hFLDhEQUE4RDtRQUM5RCx3Q0FBd0M7UUFDeEMsc0RBQXNEO1FBRXRELCtFQUErRTtRQUMvRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUVuQyxvRUFBb0U7UUFDcEUsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUM7UUFFckQsbUNBQW1DO1FBQ25DLHVFQUF1RTtRQUN2RSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUU7WUFDNUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxlQUFlO1lBQzFDLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFFRCxnR0FBZ0c7UUFDaEcsSUFBSSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUU7Z0JBQzdGLFNBQVMsRUFBRSxlQUFlLENBQUMsc0JBQXNCO2dCQUNqRCxXQUFXLEVBQUUsSUFBSTtnQkFDakIsU0FBUyxFQUFFLGFBQWE7YUFDekIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxvQkFBb0IsR0FBRyxVQUFVLENBQUMsY0FBZSxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBbUI7WUFDL0IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxjQUFlO1lBQ2hDLFdBQVcsRUFBRSxvQkFBb0I7WUFDakMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPLElBQUksT0FBTztZQUMxQyxNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU07WUFDN0IsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPO1lBQy9CLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQzdELElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9GLEVBQUU7WUFDSix5REFBeUQ7WUFDekQsc0RBQXNEO1lBQ3RELFFBQVEsRUFBRSxFQUFFLEVBQUcsMENBQTBDO1lBQ3pELGNBQWMsRUFBRSxjQUFjLENBQUMsZUFBZSxJQUFJLGNBQWMsQ0FBQyxjQUFjLElBQUksZ0JBQWdCLENBQUMsdUJBQXVCO1lBQzNILGFBQWEsRUFBRSxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDbEUsQ0FBQyxjQUFjLENBQUMsYUFBYSxJQUFJLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDO1lBQzNFLFlBQVksRUFBRSxjQUFjLENBQUMsYUFBYSxJQUFJLGNBQWMsQ0FBQyxZQUFZLElBQUksZ0JBQWdCLENBQUMscUJBQXFCO1lBQ25ILFVBQVUsRUFBRSxjQUFjLENBQUMsVUFBVSxLQUFLLEtBQUs7WUFDL0MsVUFBVSxFQUFFLGNBQWMsQ0FBQyxVQUFVLElBQUksZ0JBQWdCLENBQUMsbUJBQW1CO1lBQzdFLDZDQUE2QztZQUM3QyxRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVE7WUFDakMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO1lBQ2pDLDZCQUE2QjtZQUM3QixVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7WUFDckMscURBQXFEO1lBQ3JELFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxjQUFjLElBQUksU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUF5QyxDQUFDO1NBQzdKLENBQUM7UUFFRiwwQ0FBMEM7UUFDMUMsdUVBQXVFO1FBQ3ZFLGtFQUFrRTtRQUNsRSx3RUFBd0U7UUFDeEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUNyRSxjQUFjLENBQUMsUUFBUSxFQUN2QixXQUFXLENBQUMsTUFBTSxFQUNsQixRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FDM0IsQ0FBQztZQUNGLFFBQVEsQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDO1FBQ3JELENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFckMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxrQkFBa0IsQ0FBQyxTQUEwQjtRQUNuRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVE7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNwRCxJQUFJLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxLQUFLLFdBQVc7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMxRSxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsT0FBZTtRQUNuQyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUV0RCxrQ0FBa0M7UUFDbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFakQsK0NBQStDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxLQUFLLENBQUMsK0JBQStCO1FBTW5DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUM7WUFDSCw4QkFBOEI7WUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixLQUFLLE1BQU0sQ0FBQztZQUM1RSxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUVBQW1FLENBQUMsQ0FBQztnQkFDakYsK0VBQStFO2dCQUMvRSxlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxlQUFlO29CQUNyQixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsTUFBTSxFQUFFLCtDQUErQztvQkFDdkQsT0FBTyxFQUFFLGdFQUFnRTtvQkFDekUsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLGlDQUFpQyxFQUFFO2lCQUM5RCxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMvRCxDQUFDO1lBRUQsOEJBQThCO1lBQzlCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFFakMseUJBQXlCO1lBQ3pCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUUxRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO2dCQUNqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQy9ELENBQUM7WUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixnQkFBZ0IsQ0FBQyxNQUFNLHFCQUFxQixDQUFDLENBQUM7WUFFbkYsZ0NBQWdDO1lBQ2hDLEtBQUssTUFBTSxNQUFNLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDO29CQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQztvQkFFckQsaUNBQWlDO29CQUNqQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ3RCLE1BQU0sUUFBUSxHQUFHLDBCQUEwQixVQUFVLE1BQU0sVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQy9HLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBQzNDLE9BQU8sRUFBRSxDQUFDO3dCQUNWLFNBQVM7b0JBQ1gsQ0FBQztvQkFFRCxrQkFBa0I7b0JBQ2xCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFFbEUsc0JBQXNCO29CQUN0QixnRkFBZ0Y7b0JBQ2hGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3ZDLE1BQU0sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN4QixNQUFNLEVBQUUsQ0FBQztvQkFDVCxXQUFXLElBQUksZUFBZSxDQUFDO29CQUUvQixNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxVQUFVLE1BQU0sZUFBZSxVQUFVLENBQUMsQ0FBQztvQkFFdkYsZ0VBQWdFO29CQUNoRSxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxVQUFVLE1BQU0sZUFBZSxzQkFBdUIsTUFBTSxDQUFDLFFBQWdCLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztnQkFFMUksQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQztvQkFDckQsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLFVBQVUsTUFBTSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDN0csTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDM0MsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsdUNBQXVDLE1BQU0sc0JBQXNCO2dCQUNuRSxLQUFLLFdBQVcsYUFBYSxPQUFPLGFBQWEsTUFBTSxDQUFDLE1BQU0sWUFBWSxXQUFXLElBQUksQ0FDMUYsQ0FBQztZQUVGLGlFQUFpRTtZQUNqRSxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxlQUFlO2dCQUNyQixRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsK0NBQStDO2dCQUN2RCxPQUFPLEVBQUUsdUJBQXVCLE1BQU0sWUFBWSxPQUFPLGFBQWEsTUFBTSxDQUFDLE1BQU0sU0FBUztnQkFDNUYsY0FBYyxFQUFFO29CQUNkLFdBQVcsRUFBRSxNQUFNO29CQUNuQixZQUFZLEVBQUUsT0FBTztvQkFDckIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUN6QixXQUFXO29CQUNYLFVBQVUsRUFBRSxXQUFXO2lCQUN4QjthQUNGLENBQUMsQ0FBQztZQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUVsRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDBFQUEwRTtZQUMxRSxNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUUsTUFBTSxTQUFTLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUU5RSxNQUFNLENBQUMsSUFBSSxDQUNULHNEQUFzRCxTQUFTLE1BQU0sWUFBWSxFQUFFLENBQ3BGLENBQUM7WUFFRixjQUFjO1lBQ2QsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsb0JBQW9CO2dCQUMxQixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsTUFBTSxFQUFFLCtDQUErQztnQkFDdkQsT0FBTyxFQUFFLDhCQUE4QixTQUFTLE1BQU0sWUFBWSxFQUFFO2dCQUNwRSxjQUFjLEVBQUU7b0JBQ2QsU0FBUztvQkFDVCxZQUFZO29CQUNaLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUztpQkFDbkM7YUFDRixDQUFDLENBQUM7WUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUMzRSxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1vcnlNYW5hZ2VyIC0gSW1wbGVtZW50YXRpb24gb2YgSUVsZW1lbnRNYW5hZ2VyIGZvciBNZW1vcnkgZWxlbWVudHNcbiAqIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgbWVtb3JpZXMgaW1wbGVtZW50aW5nIElFbGVtZW50XG4gKiBcbiAqIEZJWEVTIElNUExFTUVOVEVEOlxuICogMS4gQ1JJVElDQUw6IEZpeGVkIHJhY2UgY29uZGl0aW9ucyBpbiBmaWxlIG9wZXJhdGlvbnMgYnkgdXNpbmcgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZHMvd3JpdGVzXG4gKiAyLiBISUdIOiBGaXhlZCB1bnZhbGlkYXRlZCBZQU1MIHBhcnNpbmcgdnVsbmVyYWJpbGl0eSBieSB1c2luZyBTZWN1cmVZYW1sUGFyc2VyXG4gKiAzLiBNRURJVU06IEFsbCB1c2VyIGlucHV0cyBhcmUgbm93IHZhbGlkYXRlZCBhbmQgc2FuaXRpemVkXG4gKiA0LiBNRURJVU06IEF1ZGl0IGxvZ2dpbmcgYWRkZWQgZm9yIHNlY3VyaXR5IG9wZXJhdGlvbnNcbiAqIDUuIE1FRElVTTogUGF0aCB2YWxpZGF0aW9uIHByZXZlbnRzIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYXR0YWNrc1xuICovXG5cbmltcG9ydCB7IE1lbW9yeSwgTWVtb3J5TWV0YWRhdGEgfSBmcm9tICcuL01lbW9yeS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IHRvU2luZ3VsYXJMYWJlbCB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlTm9ybWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQge1xuICBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24sXG4gIGdldFZhbGlkYXRlZEluZGV4RGVib3VuY2UsXG4gIFNUT1JBR0VfTEFZRVJfQ09ORklHXG59IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB7IE1lbW9yeVN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvTWVtb3J5U3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB7IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9NZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5qcyc7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgTUVNT1JZX0NPTlNUQU5UUywgTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1lbW9yeVR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1NlcmlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudE1lc3NhZ2VzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudE1lc3NhZ2VzLmpzJztcbmltcG9ydCB7IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeSwgZ2V0R2F0ZWtlZXBlckF1dGhvcmluZ0Vycm9ycyB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcblxuLy8gSXNzdWUgIzgzOiBDZW50cmFsaXplZCBhY3RpdmUgZWxlbWVudCBsaW1pdHMgKGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMpXG5pbXBvcnQgeyBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcsIGdldE1heEFjdGl2ZUxpbWl0IH0gZnJvbSAnLi4vLi4vY29uZmlnL2FjdGl2ZS1lbGVtZW50LWxpbWl0cy5qcyc7XG5cbi8qKlxuICogSXNzdWUgIzEzOiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgZmlsZW5hbWUgaXMgYSBiYWNrdXAgZmlsZVxuICogQmFja3VwIGZpbGVzIHNob3VsZCBub3QgYmUgbG9hZGVkIGJ5IGxpc3QoKSAtIHRoZXkgYXJlIGFyY2hpdmVkIGRhdGEsIG5vdCBhY3RpdmUgbWVtb3JpZXNcbiAqXG4gKiBCYWNrdXAgcGF0dGVybnMgaW5jbHVkZTpcbiAqIC0gLmJhY2t1cC0gdGltZXN0YW1wIHBhdHRlcm4gKGUuZy4sIG5hbWUuYmFja3VwLTIwMjUtMTEtMTQtMjItNDAtNTctMzAzLnlhbWwpXG4gKiAtIEFueSBmaWxlIHdpdGggJ2JhY2t1cCcgaW4gdGhlIG5hbWUgKGNhc2UtaW5zZW5zaXRpdmUpXG4gKiAtIEZpbGVzIGluIGJhY2t1cC8gb3IgYmFja3Vwcy8gZGlyZWN0b3JpZXMgKGhhbmRsZWQgYXQgZGlyZWN0b3J5IGxldmVsKVxuICpcbiAqIEBwYXJhbSBmaWxlbmFtZSAtIFRoZSBmaWxlbmFtZSB0byBjaGVjayAod2l0aG91dCBkaXJlY3RvcnkgcGF0aClcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgaXMgYSBiYWNrdXAgZmlsZSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZFxuICovXG5mdW5jdGlvbiBpc0JhY2t1cEZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZW5hbWUuaW5jbHVkZXMoJy5iYWNrdXAtJykgfHwgZmlsZW5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYmFja3VwJyk7XG59XG5cbi8qKlxuICogSXNzdWUgIzM5OiBDaGVjayBpZiBhIG1lbW9yeSBuYW1lIGNvbnRhaW5zIGJhY2t1cCBwYXR0ZXJucyAoY29ycnVwdGVkIG5hbWUpXG4gKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBiYWNrdXAgZmlsZSBtZXRhZGF0YSBsZWFrcyBpbnRvIHRoZSBjYW5vbmljYWwgZmlsZVxuICpcbiAqIFBhdHRlcm46IG5hbWUuYmFja3VwLVlZWVktTU0tREQtSEgtbW0tc3MtU1NTIG9yIG5hbWUuYmFja3VwLS4uLi12TlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG1lbW9yeSBuYW1lIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIGNvbnRhaW5zIGJhY2t1cCBwYXR0ZXJucyBpbmRpY2F0aW5nIGNvcnJ1cHRpb25cbiAqL1xuZnVuY3Rpb24gaXNDb3JydXB0ZWRCYWNrdXBOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBDaGVjayBmb3IgLmJhY2t1cC0gdGltZXN0YW1wIHBhdHRlcm4gaW4gdGhlIG5hbWVcbiAgcmV0dXJuIC9cXC5iYWNrdXAtXFxkezR9LVxcZHsyfS1cXGR7Mn0vLnRlc3QobmFtZSk7XG59XG5cbi8qKlxuICogSXNzdWUgIzM5OiBFeHRyYWN0IHRoZSBvcmlnaW5hbCBuYW1lIGZyb20gYSBjb3JydXB0ZWQgYmFja3VwIG5hbWVcbiAqXG4gKiBFeGFtcGxlczpcbiAqIC0gXCJkb2xsaG91c2VtY3AtYmFzZWxpbmUta25vd2xlZGdlLmJhY2t1cC0yMDI1LTExLTE0LTIyLTQwLTU3LTMwM1wiXG4gKiAgIC0+IFwiZG9sbGhvdXNlbWNwLWJhc2VsaW5lLWtub3dsZWRnZVwiXG4gKiAtIFwibXktbWVtb3J5LmJhY2t1cC0yMDI1LTAxLTAxLTAwLTAwLTAwLTAwMC12MlwiXG4gKiAgIC0+IFwibXktbWVtb3J5XCJcbiAqXG4gKiBAcGFyYW0gY29ycnVwdGVkTmFtZSAtIFRoZSBjb3JydXB0ZWQgbmFtZSBjb250YWluaW5nIGJhY2t1cCBwYXR0ZXJuXG4gKiBAcmV0dXJucyBUaGUgb3JpZ2luYWwgbmFtZSB3aXRoIGJhY2t1cCBzdWZmaXggcmVtb3ZlZFxuICovXG5mdW5jdGlvbiBleHRyYWN0T3JpZ2luYWxOYW1lKGNvcnJ1cHRlZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFJlbW92ZSAuYmFja3VwLVlZWVktTU0tREQtSEgtbW0tc3MtU1NTIGFuZCBhbnkgLXZOIHN1ZmZpeFxuICByZXR1cm4gY29ycnVwdGVkTmFtZS5yZXBsYWNlKC9cXC5iYWNrdXAtXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezN9KC12XFxkKyk/JC8sICcnKTtcbn1cblxuLy8gSW50ZXJuYWwgaW50ZXJmYWNlIGZvciBwYXJzZWQgWUFNTCBzdHJ1Y3R1cmVcbmludGVyZmFjZSBQYXJzZWRNZW1vcnlEYXRhIHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWVtb3J5TWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxNZW1vcnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcmllc0Rpcjogc3RyaW5nO1xuICAvLyBQaGFzZSAyOiBCb3VuZGVkIGNvbnRlbnQgaGFzaCBpbmRleCByZXBsYWNlcyB1bmJvdW5kZWQgTWFwXG4gIHByaXZhdGUgY29udGVudEhhc2hJbmRleCA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICBuYW1lOiAnbWVtb3J5OmNvbnRlbnRIYXNoJyxcbiAgICBtYXhTaXplOiA1MDAwLFxuICAgIG1heE1lbW9yeU1COiA1LFxuICAgIHR0bE1zOiAwLFxuICB9KTtcbiAgcHJpdmF0ZSBjb250ZW50SGFzaEJ5UGF0aCA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICBuYW1lOiAnbWVtb3J5OmNvbnRlbnRIYXNoUmV2ZXJzZScsXG4gICAgbWF4U2l6ZTogNTAwMCxcbiAgICBtYXhNZW1vcnlNQjogNSxcbiAgICB0dGxNczogMCxcbiAgfSk7XG4gIHByaXZhdGUgdHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcblxuICAvLyBUcmFjayBhY3RpdmUgbWVtb3JpZXMgYnkgbmFtZSAoc3RhYmxlIGlkZW50aWZpZXIpIC0gSXNzdWUgIzE4IFBoYXNlIDRcbiAgcHJpdmF0ZSBhY3RpdmVNZW1vcnlOYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZSxcbiAgICBtZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQsXG4gICAgYmFja3VwU2VydmljZT86IGltcG9ydCgnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcycpLkJhY2t1cFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuTUVNT1JZLCBwb3J0Zm9saW9NYW5hZ2VyLCBmaWxlTG9ja01hbmFnZXIsIHsgZmlsZVdhdGNoU2VydmljZSwgbWVtb3J5QnVkZ2V0LCBiYWNrdXBTZXJ2aWNlIH0sIGZpbGVPcGVyYXRpb25zU2VydmljZSwgdmFsaWRhdGlvblJlZ2lzdHJ5KTtcbiAgICB0aGlzLm1lbW9yaWVzRGlyID0gdGhpcy5lbGVtZW50RGlyO1xuICAgIHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlID0gc2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMjogT3ZlcnJpZGUgZmFjdG9yeSB0byB1c2UgTWVtb3J5U3RvcmFnZUxheWVyIGZvciBtdWx0aS1kaXJlY3Rvcnkgc2Nhbm5pbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlU3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTogSVN0b3JhZ2VMYXllciB7XG4gICAgLy8gTm90ZTogVXNlIHRoaXMuZWxlbWVudERpciAoc2V0IGJ5IEJhc2VFbGVtZW50TWFuYWdlciBiZWZvcmUgdGhpcyBpcyBjYWxsZWQpLFxuICAgIC8vIG5vdCB0aGlzLm1lbW9yaWVzRGlyIChzZXQgYWZ0ZXIgc3VwZXIoKSByZXR1cm5zKS5cbiAgICByZXR1cm4gbmV3IE1lbW9yeVN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHtcbiAgICAgIG1lbW9yaWVzRGlyOiB0aGlzLmVsZW1lbnREaXIsXG4gICAgICBzY2FuQ29vbGRvd25NczogZ2V0VmFsaWRhdGVkU2NhbkNvb2xkb3duKCksXG4gICAgICBpbmRleERlYm91bmNlTXM6IGdldFZhbGlkYXRlZEluZGV4RGVib3VuY2UoKSxcbiAgICAgIGZpbGVGaWx0ZXI6IChmaWxlbmFtZTogc3RyaW5nKSA9PiAhaXNCYWNrdXBGaWxlKGZpbGVuYW1lKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ21lbW9yeSc7XG4gIH1cblxuICAvLyBNZW1vcnlNYW5hZ2VyIGhhcyBpdHMgb3duIGJhY2t1cCBzeXN0ZW0gKG1vdmVUb1VzZXJCYWNrdXApIGFuZCBpdHNcbiAgLy8gc2F2ZS9kZWxldGUgZG9uJ3QgY2FsbCBzdXBlciDigJQgbm8tb3AgdGhlIHVuaXZlcnNhbCBiYWNrdXAgaG9va3MuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVTYXZlKCk6IFByb21pc2U8dm9pZD4geyAvKiBuby1vcCAqLyB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVEZWxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBjbGVhckNhY2hlIHRvIGFsc28gY2xlYXIgbWVtb3J5LXNwZWNpZmljIGNhY2hlcy5cbiAgICogUGhhc2UgMjogUmVtb3ZlZCB1bmJvdW5kZWQgbWVtb3J5Q2FjaGUgYW5kIGRhdGVGb2xkZXJzQ2FjaGUuXG4gICAqL1xuICBvdmVycmlkZSBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHN1cGVyLmNsZWFyQ2FjaGUoKTtcbiAgICB0aGlzLmNvbnRlbnRIYXNoSW5kZXguY2xlYXIoKTtcbiAgICB0aGlzLmNvbnRlbnRIYXNoQnlQYXRoLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGlzcG9zZSB0byBmbHVzaCBNZW1vcnlTdG9yYWdlTGF5ZXIgX2luZGV4Lmpzb24gYW5kIGNsZWFyIGNhY2hlcy5cbiAgICogUHJldmVudHMgcmVzb3VyY2UgbGVha3MgYW5kIFwiSmVzdCBkaWQgbm90IGV4aXRcIiB3YXJuaW5ncyBpbiB0ZXN0cy5cbiAgICovXG4gIG92ZXJyaWRlIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgLy8gc3RvcmFnZUxheWVyLmNsZWFyKCkgY2FuY2VscyBwZW5kaW5nIF9pbmRleC5qc29uIGRlYm91bmNlZCB3cml0ZXMsXG4gICAgLy8gcHJldmVudGluZyBFTk9URU1QVFkgZXJyb3JzIHdoZW4gdGVzdHMgZGVsZXRlIHRlbXAgZGlyZWN0b3JpZXMuXG4gICAgc3VwZXIuZGlzcG9zZSgpOyAgLy8gQ2FsbHMgQmFzZUVsZW1lbnRNYW5hZ2VyLmRpc3Bvc2UoKSDigJQgcnVucyBzdG9yYWdlTGF5ZXIuY2xlYXIoKSArIHdhdGNoZXIgY2xlYW51cFxuICAgIHRoaXMuY29udGVudEhhc2hJbmRleC5jbGVhcigpO1xuICAgIHRoaXMuY29udGVudEhhc2hCeVBhdGguY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIG1lbW9yeSBmaWxlIHBhdGggYWNyb3NzIGRpZmZlcmVudCBzdG9yYWdlIGxvY2F0aW9uc1xuICAgKiBTZWFyY2hlcyBpbiB0aGlzIG9yZGVyOiBzeXN0ZW0vLCBhZGFwdGVycy8sIGRhdGUgZm9sZGVycywgcm9vdCAobGVnYWN5KVxuICAgKiBFeHRyYWN0ZWQgbWV0aG9kIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSAoUFIgIzcpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVNZW1vcnlQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIENoZWNrIGlmIGl0J3MgYSByZWxhdGl2ZSBwYXRoIChubyBkYXRlIGZvbGRlcilcbiAgICBpZiAoIWZpbGVQYXRoLmluY2x1ZGVzKHBhdGguc2VwKSB8fCAhZmlsZVBhdGgubWF0Y2goL15cXGR7NH0tXFxkezJ9LVxcZHsyfS8pKSB7XG4gICAgICAvLyBTZWFyY2ggaW4gc3lzdGVtLyBmb2xkZXIgZmlyc3RcbiAgICAgIGNvbnN0IHN5c3RlbVBhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ3N5c3RlbScsIGZpbGVQYXRoKTtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhzeXN0ZW1QYXRoKSkge1xuICAgICAgICByZXR1cm4gc3lzdGVtUGF0aDtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlbiBjaGVjayBhZGFwdGVycy8gZm9sZGVyXG4gICAgICBjb25zdCBhZGFwdGVyUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnYWRhcHRlcnMnLCBmaWxlUGF0aCk7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoYWRhcHRlclBhdGgpKSB7XG4gICAgICAgIHJldHVybiBhZGFwdGVyUGF0aDtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlbiBzZWFyY2ggaW4gZGF0ZSBmb2xkZXJzXG4gICAgICBjb25zdCBkYXRlRm9sZGVycyA9IGF3YWl0IHRoaXMuZ2V0RGF0ZUZvbGRlcnMoKTtcbiAgICAgIGZvciAoY29uc3QgZGF0ZUZvbGRlciBvZiBkYXRlRm9sZGVycykge1xuICAgICAgICBjb25zdCB0ZXN0UGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBkYXRlRm9sZGVyLCBmaWxlUGF0aCk7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0ZXN0UGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gdGVzdFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHJvb3QgZGlyZWN0b3J5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGR1cmluZyB0cmFuc2l0aW9uXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBtZW1vcnkgZnJvbSBmaWxlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogVXNlcyBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoKSBpbnN0ZWFkIG9mIGZzLnJlYWRGaWxlKClcbiAgICogdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgYW5kIGVuc3VyZSBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBtZW1vcnkgZmlsZSB0byBsb2FkXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBsb2FkZWQgTWVtb3J5IGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGZpbGUgY2Fubm90IGJlIGZvdW5kIG9yIHBhdGggdmFsaWRhdGlvbiBmYWlsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBZQU1MIHBhcnNpbmcgZmFpbHMgb3IgY29udGVudCBpcyBtYWxmb3JtZWRcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbWVtb3J5IHZhbGlkYXRpb24gZmFpbHMgYWZ0ZXIgbG9hZGluZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxNZW1vcnk+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUmVzb2x2ZSBwYXRoIHVzaW5nIGV4dHJhY3RlZCBoZWxwZXIgbWV0aG9kXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IHRoaXMucmVzb2x2ZU1lbW9yeVBhdGgoZmlsZVBhdGgpO1xuXG4gICAgICAvLyBFbnN1cmUgZnVsbFBhdGggaXMgZGVmaW5lZFxuICAgICAgaWYgKCFmdWxsUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHBhdGg6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBoYXNlIDI6IENoZWNrIGJhc2UgY2xhc3MgTFJVIGNhY2hlIChyZXBsYWNlcyByZW1vdmVkIG1lbW9yeUNhY2hlIE1hcClcbiAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkQnlBYnNvbHV0ZVBhdGgoZnVsbFBhdGgpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGZvciBhdG9taWMgZmlsZSByZWFkXG4gICAgICAvLyBQcmV2aW91c2x5OiBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgsICd1dGYtOCcpO1xuICAgICAgLy8gTm93OiBVc2VzIEZpbGVPcGVyYXRpb25zU2VydmljZSB3aGljaCB3cmFwcyBGaWxlTG9ja01hbmFnZXJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBISUdIIFNFVkVSSVRZIEZJWDogVXNlIFNlY3VyZVlhbWxQYXJzZXIgdG8gcHJldmVudCBZQU1MIGluamVjdGlvbiBhdHRhY2tzXG4gICAgICAvLyBVc2VzIFNlcmlhbGl6YXRpb25TZXJ2aWNlIHdoaWNoIHdyYXBzIFNlY3VyZVlhbWxQYXJzZXIgYW5kIGhhbmRsZXMgcHVyZSBZQU1MIGF1dG9tYXRpY2FsbHlcblxuICAgICAgLy8gTWVtb3J5IGZpbGVzIGFyZSBwdXJlIFlBTUwgKHVubGlrZSBvdGhlciBlbGVtZW50cyB3aGljaCBhcmUgbWFya2Rvd24gd2l0aCBmcm9udG1hdHRlcilcbiAgICAgIC8vIFNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoKSBhdXRvbWF0aWNhbGx5IGRldGVjdHMgYW5kIHdyYXBzIHB1cmUgWUFNTFxuXG4gICAgICAvLyBIYW5kbGUgZW1wdHkgY29udGVudCBlZGdlIGNhc2UgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGVzdHMvZmlsZXMpXG4gICAgICBsZXQgcGFyc2VkOiBQYXJzZWRNZW1vcnlEYXRhO1xuXG4gICAgICBpZiAoY29udGVudC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIC8vIEVtcHR5IG9yIGFsbCB3aGl0ZXNwYWNlIGZpbGUgLSBjcmVhdGUgbWluaW1hbCB2YWxpZCBzdHJ1Y3R1cmVcbiAgICAgICAgcGFyc2VkID0geyBkYXRhOiB7fSwgY29udGVudDogJycgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGNvbnRlbnQsIHtcbiAgICAgICAgICBtYXhZYW1sU2l6ZTogTUVNT1JZX0NPTlNUQU5UUy5NQVhfWUFNTF9TSVpFLFxuICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsICAvLyBGSVggKCMxMjA2KTogTG9jYWwgZmlsZXMgYXJlIHByZS10cnVzdGVkXG4gICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkJyxcbiAgICAgICAgICBzY2hlbWE6ICdqc29uJyAgLy8gRklYICMxNDMwOiBQcmVzZXJ2ZSBib29sZWFucyAoYXV0b0xvYWQpIGFuZCBudW1iZXJzIChwcmlvcml0eSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ29udmVydCB0byBQYXJzZWRNZW1vcnlEYXRhIGZvcm1hdFxuICAgICAgICBwYXJzZWQgPSB7XG4gICAgICAgICAgZGF0YTogcGFyc2VSZXN1bHQuZGF0YSxcbiAgICAgICAgICBjb250ZW50OiBwYXJzZVJlc3VsdC5jb250ZW50XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgbWV0YWRhdGEgYW5kIG1hcmtkb3duIGNvbnRlbnRcbiAgICAgIGNvbnN0IHsgbWV0YWRhdGEsIGNvbnRlbnQ6IG1hcmtkb3duQ29udGVudEZyb21GaWxlIH0gPSB0aGlzLnBhcnNlTWVtb3J5RmlsZShwYXJzZWQpO1xuXG4gICAgICAvLyBDcmVhdGUgbWVtb3J5IGluc3RhbmNlXG4gICAgICBjb25zdCBtZW1vcnkgPSBuZXcgTWVtb3J5KG1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAgIC8vIEZpeCAjOTE4OiBSZWFkIGluc3RydWN0aW9ucyBmcm9tIHJvb3QtbGV2ZWwgWUFNTCAod2hlcmUgc2VyaWFsaXplRWxlbWVudCB3cml0ZXMgdGhlbSkuXG4gICAgICAvLyBQcmV2aW91c2x5IGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gdG8gcm9vdCBidXQgbmV2ZXIgcmVhZCBiYWNrIOKAlCBzaWxlbnQgZGF0YSBsb3NzLlxuICAgICAgY29uc3Qgcm9vdEluc3RydWN0aW9ucyA9IHBhcnNlZC5kYXRhPy5pbnN0cnVjdGlvbnM7XG4gICAgICBpZiAocm9vdEluc3RydWN0aW9ucyAmJiB0eXBlb2Ygcm9vdEluc3RydWN0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWVtb3J5Lmluc3RydWN0aW9ucyA9IHJvb3RJbnN0cnVjdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0cmlwIGZvcm1hdF92ZXJzaW9uIGZyb20gcnVudGltZSBtZXRhZGF0YSAoRml4ICM5MTIpXG4gICAgICBkZWxldGUgKG1lbW9yeS5tZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uO1xuXG4gICAgICAvLyBMb2FkIHNhdmVkIGVudHJpZXMgaWYgcHJlc2VudFxuICAgICAgLy8gTWVtb3J5IGZpbGVzIGhhdmUgZW50cmllcyBhcyBhIHRvcC1sZXZlbCBrZXkgaW4gdGhlIFlBTUxcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZWQuZGF0YT8uZW50cmllcztcbiAgICAgIGlmIChlbnRyaWVzKSB7XG4gICAgICAgIG1lbW9yeS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaWQ6IG1lbW9yeS5pZCxcbiAgICAgICAgICB0eXBlOiBtZW1vcnkudHlwZSxcbiAgICAgICAgICB2ZXJzaW9uOiBtZW1vcnkudmVyc2lvbixcbiAgICAgICAgICBtZXRhZGF0YTogbWVtb3J5Lm1ldGFkYXRhLFxuICAgICAgICAgIGV4dGVuc2lvbnM6IG1lbW9yeS5leHRlbnNpb25zLFxuICAgICAgICAgIGVudHJpZXM6IGVudHJpZXNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBtYXJrZG93biBjb250ZW50IGV4aXN0cyBhZnRlciB0aGUgZnJvbnRtYXR0ZXIsIGFkZCBpdCBhcyBhIG1lbW9yeSBlbnRyeVxuICAgICAgLy8gVGhpcyBwcmVzZXJ2ZXMgY29udGVudCBmcm9tIHNlZWQgbWVtb3JpZXMgYW5kIG1lbW9yeSBmaWxlcyB3aXRoIG1hcmtkb3duIHNlY3Rpb25zXG4gICAgICBpZiAobWFya2Rvd25Db250ZW50RnJvbUZpbGUgJiYgbWFya2Rvd25Db250ZW50RnJvbUZpbGUudHJpbSgpICYmIHBhcnNlZC5jb250ZW50ICYmIHBhcnNlZC5jb250ZW50LnRyaW0oKSkge1xuICAgICAgICBhd2FpdCBtZW1vcnkuYWRkRW50cnkoXG4gICAgICAgICAgcGFyc2VkLmNvbnRlbnQudHJpbSgpLFxuICAgICAgICAgIFtdLCAgLy8gdGFnc1xuICAgICAgICAgIHsgbG9hZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9LCAgLy8gbWV0YWRhdGFcbiAgICAgICAgICAnZmlsZScgIC8vIHNvdXJjZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGSVggIzEzMjA6IFNldCBmaWxlIHBhdGggb24gbWVtb3J5IGZvciBwZXJzaXN0ZW5jZSAoc3RvcmUgcmVsYXRpdmUgcGF0aClcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byBmb3J3YXJkIHNsYXNoZXMgc28gcGF0aHMgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIHBsYXRmb3Jtc1xuICAgICAgLy8gKHBhdGgucmVsYXRpdmUoKSByZXR1cm5zIGJhY2tzbGFzaGVzIG9uIFdpbmRvd3MpLlxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKTtcbiAgICAgIG1lbW9yeS5zZXRGaWxlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBDYWNoZSB2aWEgYmFzZSBjbGFzcyBMUlUgY2FjaGVcbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KG1lbW9yeSwgcmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gUm91dGluZSBsb2FkIOKAlCBkZWJ1ZyBsZXZlbCBvbmx5LiBTZWN1cml0eSBldmVudCBmb3IgTUVNT1JZX0xPQURFRCB3YXNcbiAgICAgIC8vIGdlbmVyYXRpbmcgfjEyOEsgZW50cmllcy9zZXNzaW9uLCBvdmVyd2hlbG1pbmcgdGhlIDVLIHNlY3VyaXR5IHJpbmcgYnVmZmVyXG4gICAgICAvLyB3aXRoIDI1eCB0dXJub3ZlciAoYmFja3ByZXNzdXJlKS4gRG93bmdyYWRlZCBwZXIgSXNzdWUgIzE2ODcgYW5hbHlzaXMuXG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBMb2FkZWQgbWVtb3J5IGZyb20gJHtwYXRoLmJhc2VuYW1lKGZ1bGxQYXRoKX1gKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIG1lbW9yeTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0xPQURfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIubG9hZCcsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gbG9hZCBtZW1vcnkgZnJvbSAke2ZpbGVQYXRofTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGV4aXN0aW5nIG1lbW9yeSBmaWxlIHRvIHVzZXIgYmFja3VwIGRpcmVjdG9yeVxuICAgKiBJc3N1ZSAjNDk6IFByZXZlbnRzIGR1cGxpY2F0ZSBmaWxlcyBieSBiYWNraW5nIHVwIGluc3RlYWQgb2YgdmVyc2lvbmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3ZlVG9Vc2VyQmFja3VwKGV4aXN0aW5nUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgZGF0ZUZvbGRlciA9IGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICBjb25zdCBiYWNrdXBEaXIgPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ2JhY2t1cHMnLCAndXNlcicsIGRhdGVGb2xkZXIpO1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KGJhY2t1cERpcik7XG5cbiAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoZXhpc3RpbmdQYXRoKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBkYXRlLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IGJhY2t1cE5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKCcueWFtbCcsIGAuYmFja3VwLSR7dGltZXN0YW1wfS55YW1sYCk7XG5cbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlbmFtZUZpbGUoZXhpc3RpbmdQYXRoLCBwYXRoLmpvaW4oYmFja3VwRGlyLCBiYWNrdXBOYW1lKSk7XG4gICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjNDk6IE1vdmVkIGV4aXN0aW5nIGZpbGUgdG8gYmFja3VwOiAke2JhY2t1cE5hbWV9YCk7XG5cbiAgICAvLyBJc3N1ZSAjNjU0OiBQcnVuZSBleGNlc3MgYmFja3VwcyBmb3IgdGhpcyBtZW1vcnkgaW4gdGhpcyBkYXRlIGZvbGRlclxuICAgIGF3YWl0IHRoaXMucHJ1bmVCYWNrdXBzRm9yTWVtb3J5KGJhY2t1cERpciwgZmlsZW5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBydW5lIGV4Y2VzcyBiYWNrdXBzIGZvciBhIHNwZWNpZmljIG1lbW9yeSBpbiBhIGRhdGUgZm9sZGVyLlxuICAgKiBLZWVwcyBvbmx5IHRoZSBOIG1vc3QgcmVjZW50IGJhY2t1cHMgKGJ5IHRpbWVzdGFtcCBpbiBmaWxlbmFtZSkuXG4gICAqIElzc3VlICM2NTQ6IFByZXZlbnRzIHVuYm91bmRlZCBiYWNrdXAgZ3Jvd3RoICh3YXMgMTk3aysgZmlsZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcnVuZUJhY2t1cHNGb3JNZW1vcnkoYmFja3VwRGlyOiBzdHJpbmcsIG1lbW9yeUZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYXhCYWNrdXBzID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUFYX0JBQ0tVUFNfUEVSX01FTU9SWTtcbiAgICBjb25zdCBiYXNlTmFtZSA9IG1lbW9yeUZpbGVuYW1lLnJlcGxhY2UoJy55YW1sJywgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFsbEZpbGVzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KGJhY2t1cERpcik7XG4gICAgICAvLyBGaW5kIGFsbCBiYWNrdXBzIGZvciB0aGlzIHNwZWNpZmljIG1lbW9yeVxuICAgICAgY29uc3QgbWVtb3J5QmFja3VwcyA9IGFsbEZpbGVzXG4gICAgICAgIC5maWx0ZXIoZiA9PiBmLnN0YXJ0c1dpdGgoYCR7YmFzZU5hbWV9LmJhY2t1cC1gKSAmJiBmLmVuZHNXaXRoKCcueWFtbCcpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTsgLy8gTGV4aWNvZ3JhcGhpYyBzb3J0ID0gY2hyb25vbG9naWNhbCBmb3IgSVNPIHRpbWVzdGFtcHNcblxuICAgICAgaWYgKG1lbW9yeUJhY2t1cHMubGVuZ3RoIDw9IG1heEJhY2t1cHMpIHJldHVybjtcblxuICAgICAgLy8gRGVsZXRlIG9sZGVzdCBiYWNrdXBzIChrZWVwIHRoZSBsYXN0IE4pXG4gICAgICBjb25zdCB0b0RlbGV0ZSA9IG1lbW9yeUJhY2t1cHMuc2xpY2UoMCwgbWVtb3J5QmFja3Vwcy5sZW5ndGggLSBtYXhCYWNrdXBzKTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB0b0RlbGV0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShcbiAgICAgICAgICAgIHBhdGguam9pbihiYWNrdXBEaXIsIGZpbGUpLFxuICAgICAgICAgICAgRWxlbWVudFR5cGUuTUVNT1JZLFxuICAgICAgICAgICAgeyBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnBydW5lQmFja3Vwc0Zvck1lbW9yeScgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gRmFpbGVkIHRvIHBydW5lIGJhY2t1cCAke2ZpbGV9OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIElzc3VlICM2NTQ6IFBydW5lZCAke3RvRGVsZXRlLmxlbmd0aH0gZXhjZXNzIGJhY2t1cHMgZm9yICR7YmFzZU5hbWV9IChrZXB0ICR7bWF4QmFja3Vwc30pYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE5vbi1mYXRhbCDigJQgYmFja3VwIHBydW5pbmcgaXMgYmVzdC1lZmZvcnRcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIEJhY2t1cCBwcnVuaW5nIGZhaWxlZCBmb3IgJHtiYWNrdXBEaXJ9OmAsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgcGF0aCBmb3IgbWVtb3J5IHN0b3JhZ2UgYmFzZWQgb24gbWVtb3J5IHR5cGVcbiAgICogUm91dGVzIG1lbW9yaWVzIHRvIGFwcHJvcHJpYXRlIGZvbGRlcnM6XG4gICAqIC0gU1lTVEVNOiBzeXN0ZW0vXG4gICAqIC0gQURBUFRFUjogYWRhcHRlcnMvXG4gICAqIC0gVVNFUjogWVlZWS1NTS1ERC8gKGRhdGUtYmFzZWQgZm9sZGVycylcbiAgICogQHBhcmFtIGVsZW1lbnQgTWVtb3J5IGVsZW1lbnQgdG8gc2F2ZVxuICAgKiBAcGFyYW0gbWVtb3J5VHlwZSBUeXBlIG9mIG1lbW9yeSAoZGVmYXVsdHMgdG8gVVNFUilcbiAgICogQHBhcmFtIGZpbGVOYW1lIE9wdGlvbmFsIGN1c3RvbSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyBGdWxsIHBhdGggdG8gbWVtb3J5IGZpbGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNZW1vcnlQYXRoKGVsZW1lbnQ6IE1lbW9yeSwgbWVtb3J5VHlwZT86IE1lbW9yeVR5cGUsIGZpbGVOYW1lPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0eXBlID0gbWVtb3J5VHlwZSB8fCBNZW1vcnlUeXBlLlVTRVI7XG4gICAgbGV0IHRhcmdldERpcjogc3RyaW5nO1xuXG4gICAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgZm9sZGVyIGJhc2VkIG9uIG1lbW9yeSB0eXBlXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIE1lbW9yeVR5cGUuU1lTVEVNOlxuICAgICAgICB0YXJnZXREaXIgPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ3N5c3RlbScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWVtb3J5VHlwZS5BREFQVEVSOlxuICAgICAgICB0YXJnZXREaXIgPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ2FkYXB0ZXJzJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNZW1vcnlUeXBlLlVTRVI6XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFVzZXIgbWVtb3JpZXMgZ28gaW4gZGF0ZS1iYXNlZCBmb2xkZXJzIChleGlzdGluZyBiZWhhdmlvcilcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IGRhdGVGb2xkZXIgPSBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICAgIHRhcmdldERpciA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBkYXRlRm9sZGVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGFyZ2V0RGlyKTtcblxuICAgIC8vIEdlbmVyYXRlIGZpbGVuYW1lIHVzaW5nIHVuaWZpZWQgbm9ybWFsaXphdGlvblxuICAgIC8vIE5vdGU6IE1lbW9yeSBmaWxlcyB1c2UgLnlhbWwgZXh0ZW5zaW9uLCBzbyB3ZSB1c2Ugbm9ybWFsaXplRmlsZW5hbWUoKSBkaXJlY3RseVxuICAgIGNvbnN0IGJhc2VOYW1lID0gZmlsZU5hbWUgfHwgYCR7dGhpcy5ub3JtYWxpemVGaWxlbmFtZShlbGVtZW50Lm1ldGFkYXRhLm5hbWUgfHwgJ21lbW9yeScpfS55YW1sYDtcblxuICAgIC8vIElzc3VlICM0OTogQ2hlY2sgaWYgZmlsZSBleGlzdHMgYW5kIG1vdmUgdG8gYmFja3VwIGlmIHNvIChpbnN0ZWFkIG9mIHZlcnNpb24gc3VmZml4ZXMpXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsIGJhc2VOYW1lKTtcbiAgICBpZiAoYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHModGFyZ2V0UGF0aCkpIHtcbiAgICAgIGF3YWl0IHRoaXMubW92ZVRvVXNlckJhY2t1cCh0YXJnZXRQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFBhdGg7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIG1lbW9yeSB0eXBlIGZyb20gZmlsZSBwYXRoXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBSZWxhdGl2ZSBwYXRoIHdpdGhpbiBtZW1vcmllcyBkaXJlY3RvcnlcbiAgICogQHJldHVybnMgTWVtb3J5IHR5cGUgYmFzZWQgb24gcGF0aFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNZW1vcnlUeXBlRnJvbVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IE1lbW9yeVR5cGUge1xuICAgIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKCdzeXN0ZW0vJykgfHwgZmlsZVBhdGguc3RhcnRzV2l0aCgnc3lzdGVtXFxcXCcpKSB7XG4gICAgICByZXR1cm4gTWVtb3J5VHlwZS5TWVNURU07XG4gICAgfVxuICAgIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKCdhZGFwdGVycy8nKSB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKCdhZGFwdGVyc1xcXFwnKSkge1xuICAgICAgcmV0dXJuIE1lbW9yeVR5cGUuQURBUFRFUjtcbiAgICB9XG4gICAgcmV0dXJuIE1lbW9yeVR5cGUuVVNFUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYWxsIHJlcXVpcmVkIGZvbGRlciBzdHJ1Y3R1cmUgZXhpc3RzXG4gICAqIENyZWF0ZXMgc3lzdGVtLywgYmFja3Vwcy9zeXN0ZW0vLCBiYWNrdXBzL3VzZXIvLCBhZGFwdGVycy8gZm9sZGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVGb2xkZXJTdHJ1Y3R1cmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZm9sZGVycyA9IFtcbiAgICAgIHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnc3lzdGVtJyksXG4gICAgICBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ2JhY2t1cHMnLCAnc3lzdGVtJyksXG4gICAgICBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ2JhY2t1cHMnLCAndXNlcicpLFxuICAgICAgcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdhZGFwdGVycycpXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIGZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KGZvbGRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBTSEEtMjU2IGhhc2ggb2YgbWVtb3J5IGNvbnRlbnQgZm9yIGRlZHVwbGljYXRpb25cbiAgICogSW1wbGVtZW50cyBJc3N1ZSAjOTk0IC0gQ29udGVudC1iYXNlZCBkZWR1cGxpY2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRlbnRIYXNoKGVsZW1lbnQ6IE1lbW9yeSk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgZW50cmllczogSlNPTi5wYXJzZShlbGVtZW50LnNlcmlhbGl6ZSgpKS5lbnRyaWVzXG4gICAgfSk7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoY29udGVudCkuZGlnZXN0KCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGRhdGUgZm9sZGVycyBpbiBtZW1vcmllcyBkaXJlY3RvcnkuXG4gICAqIFBoYXNlIDI6IFJlbW92ZWQgbG9jYWwgY2FjaGUg4oCUIE1lbW9yeVN0b3JhZ2VMYXllciBzY2FuIGNvb2xkb3duIGhhbmRsZXMgdGhlIGhvdCBwYXRoLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBub3cgb25seSB1c2VkIGJ5IHJlc29sdmVNZW1vcnlQYXRoKCkgYXMgYSBmYWxsYmFjay5cbiAgICogQHJldHVybnMgQXJyYXkgb2YgZGF0ZSBmb2xkZXIgbmFtZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RGF0ZUZvbGRlcnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KHRoaXMubWVtb3JpZXNEaXIpO1xuICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgICAgLmZpbHRlcihuYW1lID0+IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KG5hbWUpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAucmV2ZXJzZSgpOyAvLyBNb3N0IHJlY2VudCBmaXJzdFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYSBtZW1vcnkgdG8gZmlsZVxuICAgKiBTRUNVUklUWSBGSVggIzE6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZSgpIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gZWxlbWVudCBNZW1vcnkgZWxlbWVudCB0byBzYXZlXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBPcHRpb25hbCBjdXN0b20gZmlsZSBwYXRoLCBkZWZhdWx0cyB0byB0eXBlLWJhc2VkIHBhdGhcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2F2ZSBpcyBjb21wbGV0ZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBtZW1vcnkgdmFsaWRhdGlvbiBmYWlscyBiZWZvcmUgc2F2aW5nXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHBhdGggdmFsaWRhdGlvbiBmYWlscyBvciBmaWxlIHN5c3RlbSBlcnJvcnMgb2NjdXJcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gYXRvbWljIHdyaXRlIG9wZXJhdGlvbiBmYWlsc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2F2ZShlbGVtZW50OiBNZW1vcnksIGZpbGVQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIElzc3VlICMzOTogQXV0by1yZXBhaXIgY29ycnVwdGVkIGJhY2t1cCBuYW1lcyBiZWZvcmUgc2F2aW5nXG4gICAgICBjb25zdCBtZW1vcnlOYW1lID0gZWxlbWVudC5tZXRhZGF0YS5uYW1lO1xuICAgICAgaWYgKGlzQ29ycnVwdGVkQmFja3VwTmFtZShtZW1vcnlOYW1lKSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE5hbWUgPSBleHRyYWN0T3JpZ2luYWxOYW1lKG1lbW9yeU5hbWUpO1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogRGV0ZWN0ZWQgY29ycnVwdGVkIGJhY2t1cCBuYW1lICcke21lbW9yeU5hbWV9JywgYCArXG4gICAgICAgICAgYGF1dG8tcmVwYWlyaW5nIHRvICcke29yaWdpbmFsTmFtZX0nYFxuICAgICAgICApO1xuICAgICAgICBlbGVtZW50Lm1ldGFkYXRhLm5hbWUgPSBvcmlnaW5hbE5hbWU7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NBVkVELFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUnLFxuICAgICAgICAgIGRldGFpbHM6IGBJc3N1ZSAjMzk6IEF1dG8tcmVwYWlyZWQgY29ycnVwdGVkIGJhY2t1cCBuYW1lOiAnJHttZW1vcnlOYW1lfScgLT4gJyR7b3JpZ2luYWxOYW1lfSdgXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50XG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZW1vcnk6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIGNvbnRlbnQgaGFzaCBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgY29uc3QgY29udGVudEhhc2ggPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRIYXNoKGVsZW1lbnQpO1xuICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gdGhpcy5jb250ZW50SGFzaEluZGV4LmdldChjb250ZW50SGFzaCk7XG5cbiAgICAgIGlmIChleGlzdGluZ1BhdGgpIHtcbiAgICAgICAgLy8gTG9nIGR1cGxpY2F0ZSBkZXRlY3Rpb25cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdNRU1PUllfRFVQTElDQVRFX0RFVEVDVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRHVwbGljYXRlIGNvbnRlbnQgZGV0ZWN0ZWQuIEV4aXN0aW5nOiAke2V4aXN0aW5nUGF0aH1gXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlY3QgbWVtb3J5IHR5cGUgZnJvbSBtZXRhZGF0YSBvciBkZWZhdWx0IHRvIFVTRVJcbiAgICAgIGNvbnN0IG1lbW9yeU1ldGEgPSBlbGVtZW50Lm1ldGFkYXRhIGFzIE1lbW9yeU1ldGFkYXRhO1xuICAgICAgY29uc3QgbWVtb3J5VHlwZSA9IG1lbW9yeU1ldGEubWVtb3J5VHlwZSB8fCBNZW1vcnlUeXBlLlVTRVI7XG5cbiAgICAgIC8vIFNhdmUgcGF0aCBwcmVjZWRlbmNlOlxuICAgICAgLy8gMSkgZXhwbGljaXQgZmlsZVBhdGggYXJndW1lbnRcbiAgICAgIC8vIDIpIGV4aXN0aW5nIHBlcnNpc3RlZCBwYXRoIG9uIHRoZSBlbGVtZW50IChleGlzdGluZ0ZpbGVQYXRoKVxuICAgICAgLy8gMykgbmV3bHkgZ2VuZXJhdGVkIGRhdGUvdHlwZS1iYXNlZCBwYXRoIGZvciBmaXJzdC10aW1lIHNhdmVzXG4gICAgICAvLyBLZWVwaW5nICMyIGFoZWFkIG9mICMzIHByZXZlbnRzIGxvYWRlZCBtZW1vcmllcyBmcm9tIGJlaW5nIGNvcGllZCBpbnRvIGEgbmV3XG4gICAgICAvLyBkYXRlIGZvbGRlciBvbiBlYWNoIHNhdmUgKElzc3VlICM2OTkpLlxuICAgICAgY29uc3QgZXhpc3RpbmdGaWxlUGF0aCA9IGVsZW1lbnQuZ2V0RmlsZVBhdGgoKTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gZmlsZVBhdGhcbiAgICAgICAgPyBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpXG4gICAgICAgIDogZXhpc3RpbmdGaWxlUGF0aFxuICAgICAgICAgID8gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGV4aXN0aW5nRmlsZVBhdGgpXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLmdlbmVyYXRlTWVtb3J5UGF0aChlbGVtZW50LCBtZW1vcnlUeXBlKTtcblxuICAgICAgLy8gRW5zdXJlIHBhcmVudCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShwYXRoLmRpcm5hbWUoZnVsbFBhdGgpKTtcblxuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgIHRoaXMudmFsaWRhdGVTZXJpYWxpemVkTWVtb3J5WWFtbCh5YW1sQ29udGVudCk7XG5cbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgYXRvbWljIGZpbGUgd3JpdGVcbiAgICAgIC8vIFByZXZpb3VzbHk6IGF3YWl0IGZzLndyaXRlRmlsZShmdWxsUGF0aCwgeWFtbENvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgLy8gTm93OiBVc2VzIEZpbGVPcGVyYXRpb25zU2VydmljZSB3aGljaCB3cmFwcyBGaWxlTG9ja01hbmFnZXJcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKGZ1bGxQYXRoLCB5YW1sQ29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgLy8gRklYICMxMzIwOiBTZXQgZmlsZSBwYXRoIG9uIG1lbW9yeSBhZnRlciBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byBmb3J3YXJkIHNsYXNoZXMgc28gcGF0aHMgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIHBsYXRmb3Jtc1xuICAgICAgLy8gKHBhdGgucmVsYXRpdmUoKSByZXR1cm5zIGJhY2tzbGFzaGVzIG9uIFdpbmRvd3MpLlxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKTtcbiAgICAgIGVsZW1lbnQuc2V0RmlsZVBhdGgocmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gQ2FjaGUgdmlhIGJhc2UgY2xhc3MgTFJVIGNhY2hlXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBQaGFzZSAyOiBOb3RpZnkgc3RvcmFnZSBsYXllciBvZiBzYXZlXG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZChyZWxhdGl2ZVBhdGgsIGZ1bGxQYXRoKTtcblxuICAgICAgLy8gVXBkYXRlIGJvdW5kZWQgY29udGVudCBoYXNoIGluZGV4XG4gICAgICB0aGlzLmNvbnRlbnRIYXNoSW5kZXguc2V0KGNvbnRlbnRIYXNoLCBmdWxsUGF0aCk7XG4gICAgICB0aGlzLmNvbnRlbnRIYXNoQnlQYXRoLnNldChmdWxsUGF0aCwgY29udGVudEhhc2gpO1xuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBzYXZlXG4gICAgICBjb25zdCBzdGF0cyA9IGVsZW1lbnQuZ2V0U3RhdHMoKTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0FWRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYFNhdmVkIG1lbW9yeSB0byAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfSB3aXRoICR7c3RhdHMudG90YWxFbnRyaWVzfSBlbnRyaWVzYFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBzYXZlIG1lbW9yeSB0byAke2ZpbGVQYXRofTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhdmUgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMjMyOTogU2VyaWFsaXplIGFuZCBydW4gdGhlIGZ1bGwgc2F2ZS1wYXRoIHZhbGlkYXRpb24gd2l0aG91dCB3cml0aW5nIHRvIGRpc2suXG4gICAqIExldHMgY2FsbGVycyByZWplY3QgYSBtdXRhdGlvbiBpbW1lZGlhdGVseSAoZS5nLiBhZGRFbnRyeSkgd2hlbiB0aGUgbWVtb3J5IGNhbiBub1xuICAgKiBsb25nZXIgYmUgcGVyc2lzdGVkLCBpbnN0ZWFkIG9mIHRoZSBmYWlsdXJlIHN1cmZhY2luZyBvbmx5IGluIGEgZGVmZXJyZWQgc2F2ZVxuICAgKiB3aGVyZSBpdCBjYW5ub3QgYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgYXN5bmMgYXNzZXJ0UGVyc2lzdGFibGUoZWxlbWVudDogTWVtb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgdGhpcy52YWxpZGF0ZVNlcmlhbGl6ZWRNZW1vcnlZYW1sKHlhbWxDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIGFwcGxpZWQgdG8gc2VyaWFsaXplZCBtZW1vcnkgWUFNTCBiZWZvcmUgYW55IGRpc2sgd3JpdGUuXG4gICAqIFNoYXJlZCBieSBzYXZlKCkgYW5kIGFzc2VydFBlcnNpc3RhYmxlKCkgc28gdGhlIHByZS1mbGlnaHQgY2hlY2sgYW5kIHRoZVxuICAgKiBhY3R1YWwgd3JpdGUgY2FuIG5ldmVyIGRpc2FncmVlLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlcmlhbGl6ZWRNZW1vcnlZYW1sKHlhbWxDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBGaXggIzkxNi8jOTE4LCB0aWdodGVuZWQgZm9yICMyMzI5OiBjYXAgYXQgTUFYX1lBTUxfU0laRSAoMjU2S0IpIOKAlCB0aGUgc2FtZVxuICAgIC8vIGxpbWl0IHBhcnNlQ29udGVudCgpIGVuZm9yY2VzIG9uIGxvYWQuIFRoZSBwcmV2aW91cyAyTUIgY2FwIGFsbG93ZWQgd3JpdGluZ1xuICAgIC8vIGZpbGVzIHRoZSBsb2FkZXIgd291bGQgdGhlbiByZWplY3QuXG4gICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX1lBTUxfU0laRSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlLnNpemVFbmZvcmNlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBNZW1vcnkgZXhjZWVkcyBtYXhpbXVtIHNlcmlhbGl6ZWQgc2l6ZSAoJHt5YW1sQ29udGVudC5sZW5ndGh9ID4gJHtNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkV9KWAsXG4gICAgICAgIG1ldGFkYXRhOiB7IGNvbnRlbnRMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aCwgbGltaXQ6IE1FTU9SWV9DT05TVEFOVFMuTUFYX1lBTUxfU0laRSB9XG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1lbW9yeSBleGNlZWRzIG1heGltdW0gc2VyaWFsaXplZCBzaXplICgke3lhbWxDb250ZW50Lmxlbmd0aH0gPiAke01FTU9SWV9DT05TVEFOVFMuTUFYX1lBTUxfU0laRX0gYnl0ZXMpLiBgICtcbiAgICAgICAgYFRoaXMgbWVtb3J5IGlzIGZ1bGwg4oCUIHN0YXJ0IGEgbmV3IG1lbW9yeSBmb3IgYWRkaXRpb25hbCBlbnRyaWVzLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQm9tYi9pbmplY3Rpb24gZGV0ZWN0aW9uICsgZ2F0ZWtlZXBlciBwb2xpY3kgdmFsaWRhdGlvbi4gSXNzdWUgIzIzMjkgcm9vdFxuICAgIC8vIGNhdXNlOiB0aGlzIHBhcnNlIHByZXZpb3VzbHkgY2FwcGVkIGF0IE1BWF9ZQU1MX0xFTkdUSCAoNjRLQiDigJQgYSBmcm9udG1hdHRlclxuICAgIC8vIGxpbWl0KSwgc28gZXZlcnkgc2F2ZSBvZiBhIG1lbW9yeSB3aG9zZSBzZXJpYWxpemVkIFlBTUwgZXhjZWVkZWQgNjRLQiB0aHJld1xuICAgIC8vIGhlcmUsIGFuZCB0aGUgZGVmZXJyZWQgc2F2ZSBwYXRoIHN3YWxsb3dlZCB0aGUgZXJyb3Igd2hpbGUgYWRkRW50cnkga2VwdFxuICAgIC8vIHJlcG9ydGluZyBzdWNjZXNzLiBUaGUgY2FwIG5vdyBtYXRjaGVzIHRoZSBtZW1vcnkgc2l6ZSBsaW1pdCBlbmZvcmNlZCBhYm92ZVxuICAgIC8vIGFuZCBvbiBsb2FkLiBwYXJzZVJhd1lhbWwgcnVucyBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlWWFtbENvbnRlbnQgd2l0aCB0aGVcbiAgICAvLyBzYW1lIGNhcCBpbnRlcm5hbGx5IChGaXggIzkwOC8jOTE4KSwgc28gYm9tYiBkZXRlY3Rpb24gY292ZXJzIGV2ZXJ5IHNpemUg4oCUXG4gICAgLy8gdGhlIHByZXZpb3VzIGA8PSBNQVhfWUFNTF9MRU5HVEhgIGd1YXJkIHNraXBwZWQgaXQgZm9yIGNvbnRlbnQgb3ZlciA2NEtCLlxuICAgIGNvbnN0IHZhbGlkYXRpb25TdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcGFyc2VkWWFtbCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2VSYXdZYW1sKHlhbWxDb250ZW50LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUpO1xuICAgIGNvbnN0IHZhbGlkYXRpb25NcyA9IERhdGUubm93KCkgLSB2YWxpZGF0aW9uU3RhcnQ7XG4gICAgaWYgKHZhbGlkYXRpb25NcyA+IDUwKSB7XG4gICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdIFdyaXRlLXBhdGggWUFNTCB2YWxpZGF0aW9uIHRvb2sgJHt2YWxpZGF0aW9uTXN9bXMgZm9yICR7eWFtbENvbnRlbnQubGVuZ3RofSBieXRlc2ApO1xuICAgIH1cbiAgICBjb25zdCBnYXRla2VlcGVyRXJyb3JzID0gW1xuICAgICAgLi4uZ2V0R2F0ZWtlZXBlckF1dGhvcmluZ0Vycm9ycyhwYXJzZWRZYW1sKSxcbiAgICAgIC4uLmdldEdhdGVrZWVwZXJBdXRob3JpbmdFcnJvcnMoXG4gICAgICAgIHBhcnNlZFlhbWwubWV0YWRhdGEgJiYgdHlwZW9mIHBhcnNlZFlhbWwubWV0YWRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHBhcnNlZFlhbWwubWV0YWRhdGEpXG4gICAgICAgICAgPyBwYXJzZWRZYW1sLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICksXG4gICAgXTtcbiAgICBpZiAoZ2F0ZWtlZXBlckVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5IGluIHNlcmlhbGl6ZWQgbWVtb3J5IFlBTUw6ICR7Wy4uLm5ldyBTZXQoZ2F0ZWtlZXBlckVycm9ycyldLmpvaW4oJzsgJyl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG1lbW9yeSBsb2FkIGZhaWx1cmVcbiAgICogRklYIChTb25hckNsb3VkKTogRXh0cmFjdCBkdXBsaWNhdGVkIGVycm9yIGhhbmRsaW5nIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUxvYWRGYWlsdXJlKFxuICAgIGZpbGU6IHN0cmluZyxcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBmYWlsZWRMb2FkczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgZmFpbGVkTG9hZHMucHVzaCh7IGZpbGUsIGVycm9yOiBlcnJvck1zZyB9KTtcbiAgICAvLyBPbmx5IGxvZyBzZWN1cml0eSBldmVudCBpZiBsb2FkKCkgZGlkbid0IHN1cHByZXNzIHRoaXMgYXMgYSByZXBlYXRcbiAgICBpZiAoIXRoaXMuaXNMb2FkRXJyb3JTdXBwcmVzc2VkKGZpbGUpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5saXN0JyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkICR7ZmlsZX06ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBtZW1vcmllcyBmcm9tIGFsbCBsb2NhdGlvbnMuXG4gICAqIFBoYXNlIDI6IERlbGVnYXRlcyBtdWx0aS1kaXJlY3Rvcnkgc2Nhbm5pbmcgdG8gTWVtb3J5U3RvcmFnZUxheWVyLlxuICAgKiBTdG9yYWdlIGxheWVyIGhhbmRsZXM6IHN5c3RlbS8sIGFkYXB0ZXJzLywgZGF0ZSBmb2xkZXJzLCByb290LCBiYWNrdXAgZmlsdGVyaW5nLCBjb29sZG93bi5cbiAgICpcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IEFwcGx5IGFjdGl2ZSBzdGF0dXMgdG8gbWVtb3JpZXMgdGhhdCBhcmUgaW4gdGhlIGFjdGl2ZSBzZXQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsaXN0KCk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBmYWlsZWRMb2FkczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKTtcblxuICAgICAgLy8gU3RvcmFnZSBsYXllciBoYW5kbGVzIG11bHRpLWRpcmVjdG9yeSBzY2FuICsgY29vbGRvd25cbiAgICAgIGNvbnN0IGluZGV4ZWRQYXRocyA9IGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLmdldEluZGV4ZWRQYXRocygpO1xuXG4gICAgICAvLyBMb2FkIHRocm91Z2ggTFJVIGNhY2hlXG4gICAgICBjb25zdCBtZW1vcmllczogTWVtb3J5W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIGluZGV4ZWRQYXRocykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMubG9hZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgIC8vIEVuc3VyZSBtZW1vcnlUeXBlIGlzIHNldCBiYXNlZCBvbiBsb2NhdGlvblxuICAgICAgICAgIGNvbnN0IG1lbW9yeU1ldGEgPSBtZW1vcnkubWV0YWRhdGEgYXMgTWVtb3J5TWV0YWRhdGE7XG4gICAgICAgICAgaWYgKCFtZW1vcnlNZXRhLm1lbW9yeVR5cGUpIHtcbiAgICAgICAgICAgIG1lbW9yeU1ldGEubWVtb3J5VHlwZSA9IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmluZmVyTWVtb3J5VHlwZShyZWxhdGl2ZVBhdGgpIGFzIE1lbW9yeVR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbW9yaWVzLnB1c2gobWVtb3J5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUxvYWRGYWlsdXJlKHJlbGF0aXZlUGF0aCwgZXJyb3IsIGZhaWxlZExvYWRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmFpbGVkTG9hZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBsb2FkICR7ZmFpbGVkTG9hZHMubGVuZ3RofSBtZW1vcmllczpgLFxuICAgICAgICAgIGZhaWxlZExvYWRzLm1hcChmID0+IGAgIC0gJHtmLmZpbGV9OiAke2YuZXJyb3J9YCkuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWR1cGxpY2F0ZSBieSBmaWxlIHBhdGggKHByZXNlcnZlcyBleGlzdGluZyBiZWhhdmlvcilcbiAgICAgIGNvbnN0IHVuaXF1ZU1lbW9yaWVzID0gbmV3IE1hcDxzdHJpbmcsIE1lbW9yeT4oKTtcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIG1lbW9yaWVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gbWVtb3J5LmdldEZpbGVQYXRoKCk7XG4gICAgICAgIGlmIChmaWxlUGF0aCAmJiAhdW5pcXVlTWVtb3JpZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHVuaXF1ZU1lbW9yaWVzLnNldChmaWxlUGF0aCwgbWVtb3J5KTtcbiAgICAgICAgfSBlbHNlIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICB1bmlxdWVNZW1vcmllcy5zZXQoYG5vLXBhdGgtJHttZW1vcnkubWV0YWRhdGEubmFtZX0tJHtEYXRlLm5vdygpfWAsIG1lbW9yeSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0TWVtb3JpZXMgPSBBcnJheS5mcm9tKHVuaXF1ZU1lbW9yaWVzLnZhbHVlcygpKTtcblxuICAgICAgLy8gSXNzdWUgIzE4IFBoYXNlIDQ6IEFwcGx5IGFjdGl2ZSBzdGF0dXMgdG8gbWVtb3JpZXMgaW4gdGhlIGFjdGl2ZSBzZXRcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIHJlc3VsdE1lbW9yaWVzKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLmhhcyhtZW1vcnkubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgICBhd2FpdCBtZW1vcnkuYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0TWVtb3JpZXM7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhIG1lbW9yeSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IENvbnRleHQtbG9hZGluZyBhY3RpdmF0aW9uIHN0cmF0ZWd5XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZU1lbW9yeShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBtZW1vcnk/OiBNZW1vcnkgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghbWVtb3J5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5NRU1PUlksIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICAvLyBBZGQgdG8gYWN0aXZlIHNldCAoYnkgbmFtZSwgd2hpY2ggaXMgc3RhYmxlIGFjcm9zcyByZWxvYWRzKVxuICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuYWRkKG1lbW9yeS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBtZW1vcnkgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IG1lbW9yeS5hY3RpdmF0ZSgpO1xuXG4gICAgLy8gUm91dGluZSBhY3RpdmF0aW9uIOKAlCBkZWJ1ZyBvbmx5ICh3YXMgZmxvb2Rpbmcgc2VjdXJpdHkgYnVmZmVyKVxuICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIE1lbW9yeSBhY3RpdmF0ZWQ6ICR7bWVtb3J5Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICBsb2dnZXIuaW5mbyhgTWVtb3J5IGFjdGl2YXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuTUVNT1JZLCBtZW1vcnkubWV0YWRhdGEubmFtZSksXG4gICAgICBtZW1vcnlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYSBtZW1vcnkgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqIElzc3VlICMxOCBQaGFzZSA0OiBSZW1vdmUgZnJvbSBhY3RpdmUgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlTWVtb3J5KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghbWVtb3J5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5NRU1PUlksIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBmcm9tIGFjdGl2ZSBzZXRcbiAgICB0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLmRlbGV0ZShtZW1vcnkubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgbWVtb3J5IHN0YXR1cyBpbiBtZW1vcnlcbiAgICBhd2FpdCBtZW1vcnkuZGVhY3RpdmF0ZSgpO1xuXG4gICAgbG9nZ2VyLmluZm8oYE1lbW9yeSBkZWFjdGl2YXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5NRU1PUlksIG1lbW9yeS5tZXRhZGF0YS5uYW1lKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgbWVtb3JpZXNcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IFJldHVybiBtZW1vcmllcyB0aGF0IGFyZSBpbiB0aGUgYWN0aXZlIHNldFxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlTWVtb3JpZXMoKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbHRlcihtID0+IHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuaGFzKG0ubWV0YWRhdGEubmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICMzOTogU2NhbiBhbGwgbWVtb3JpZXMgYW5kIHJlcGFpciBjb3JydXB0ZWQgYmFja3VwIG5hbWVzXG4gICAqIFRoaXMgbWV0aG9kIGxvYWRzIGFsbCBtZW1vcmllcywgY2hlY2tzIGZvciBjb3JydXB0ZWQgbmFtZXMsIHJlcGFpcnMgdGhlbSxcbiAgICogYW5kIHNhdmVzIHRoZSBjb3JyZWN0ZWQgZmlsZXMgYmFjayB0byBkaXNrLlxuICAgKlxuICAgKiBAcGFyYW0gb25Qcm9ncmVzcyBPcHRpb25hbCBjYWxsYmFjayBmb3IgcHJvZ3Jlc3MgdXBkYXRlcyBkdXJpbmcgbG9uZyBvcGVyYXRpb25zXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHJlcGFpciBzdGF0aXN0aWNzIGFuZCBsaXN0IG9mIHJlcGFpcmVkIG1lbW9yaWVzXG4gICAqL1xuICBhc3luYyByZXBhaXJDb3JydXB0ZWROYW1lcyhcbiAgICBvblByb2dyZXNzPzogKHByb2Nlc3NlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyLCBjdXJyZW50Pzogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8e1xuICAgIHNjYW5uZWQ6IG51bWJlcjtcbiAgICByZXBhaXJlZDogbnVtYmVyO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIHJlcGFpcmVkTWVtb3JpZXM6IEFycmF5PHsgb3JpZ2luYWw6IHN0cmluZzsgcmVwYWlyZWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+O1xuICAgIGVycm9yRGV0YWlsczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gIH0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzY2FubmVkOiAwLFxuICAgICAgcmVwYWlyZWQ6IDAsXG4gICAgICBlcnJvcnM6IDAsXG4gICAgICByZXBhaXJlZE1lbW9yaWVzOiBbXSBhcyBBcnJheTx7IG9yaWdpbmFsOiBzdHJpbmc7IHJlcGFpcmVkOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9PixcbiAgICAgIGVycm9yRGV0YWlsczogW10gYXMgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgICB9O1xuXG4gICAgbG9nZ2VyLmluZm8oJ1tNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IFN0YXJ0aW5nIGNvcnJ1cHRlZCBuYW1lIHJlcGFpciBzY2FuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRm9yY2UgZnJlc2ggc2NhbiDigJQgcmVwYWlyIG11c3Qgc2VlIGN1cnJlbnQgZGlzayBzdGF0ZSwgbm90IGNhY2hlZCBpbmRleFxuICAgICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpO1xuICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIHJlc3VsdC5zY2FubmVkID0gbWVtb3JpZXMubGVuZ3RoO1xuXG4gICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIG1lbW9yaWVzKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROYW1lID0gbWVtb3J5Lm1ldGFkYXRhLm5hbWU7XG4gICAgICAgIHByb2Nlc3NlZCsrO1xuXG4gICAgICAgIC8vIFJlcG9ydCBwcm9ncmVzc1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIG9uUHJvZ3Jlc3MocHJvY2Vzc2VkLCBtZW1vcmllcy5sZW5ndGgsIGN1cnJlbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NvcnJ1cHRlZEJhY2t1cE5hbWUoY3VycmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc3QgcmVwYWlyZWROYW1lID0gZXh0cmFjdE9yaWdpbmFsTmFtZShjdXJyZW50TmFtZSk7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBtZW1vcnkuZ2V0RmlsZVBhdGgoKSB8fCAndW5rbm93bic7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBuYW1lXG4gICAgICAgICAgICBtZW1vcnkubWV0YWRhdGEubmFtZSA9IHJlcGFpcmVkTmFtZTtcblxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgcmVwYWlyZWQgbWVtb3J5XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUobWVtb3J5KTtcblxuICAgICAgICAgICAgcmVzdWx0LnJlcGFpcmVkKys7XG4gICAgICAgICAgICByZXN1bHQucmVwYWlyZWRNZW1vcmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IGN1cnJlbnROYW1lLFxuICAgICAgICAgICAgICByZXBhaXJlZDogcmVwYWlyZWROYW1lLFxuICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICBgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogUmVwYWlyZWQgJyR7Y3VycmVudE5hbWV9JyAtPiAnJHtyZXBhaXJlZE5hbWV9JyBhdCAke2ZpbGVQYXRofWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMrKztcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGN1cnJlbnROYW1lLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogRmFpbGVkIHRvIHJlcGFpciAnJHtjdXJyZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBSZXBhaXIgc2NhbiBjb21wbGV0ZS4gYCArXG4gICAgICAgIGBTY2FubmVkOiAke3Jlc3VsdC5zY2FubmVkfSwgUmVwYWlyZWQ6ICR7cmVzdWx0LnJlcGFpcmVkfSwgRXJyb3JzOiAke3Jlc3VsdC5lcnJvcnN9YFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5yZXBhaXJlZCA+IDApIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NBVkVELFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnJlcGFpckNvcnJ1cHRlZE5hbWVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgSXNzdWUgIzM5OiBSZXBhaXJlZCAke3Jlc3VsdC5yZXBhaXJlZH0gY29ycnVwdGVkIG1lbW9yeSBuYW1lc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHNjYW5uZWQ6IHJlc3VsdC5zY2FubmVkLFxuICAgICAgICAgICAgcmVwYWlyZWQ6IHJlc3VsdC5yZXBhaXJlZCxcbiAgICAgICAgICAgIGVycm9yczogcmVzdWx0LmVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogUmVwYWlyIHNjYW4gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMzk6IENsZWFuIHVwIGV4Y2Vzc2l2ZSBiYWNrdXAgZmlsZXMgaW4gYSBkaXJlY3RvcnlcbiAgICogUmVtb3ZlcyB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzIChlLmcuLCBuYW1lLmJhY2t1cC0uLi4tdjIueWFtbCwgLXYzLnlhbWwsIGV0Yy4pXG4gICAqIGtlZXBpbmcgb25seSB0aGUgbW9zdCByZWNlbnQgYmFja3VwICh3aXRob3V0IHZlcnNpb24gc3VmZml4KVxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0RGlyIERpcmVjdG9yeSB0byBjbGVhbiB1cCAoZGVmYXVsdHMgdG8gc3lzdGVtLyBmb2xkZXIpXG4gICAqIEBwYXJhbSBkcnlSdW4gSWYgdHJ1ZSwgb25seSByZXBvcnRzIHdoYXQgd291bGQgYmUgZGVsZXRlZCB3aXRob3V0IGFjdHVhbGx5IGRlbGV0aW5nXG4gICAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsIGNhbGxiYWNrIGZvciBwcm9ncmVzcyB1cGRhdGVzIGR1cmluZyBsb25nIG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggY2xlYW51cCBzdGF0aXN0aWNzXG4gICAqL1xuICBhc3luYyBjbGVhbnVwRXhjZXNzaXZlQmFja3VwcyhcbiAgICB0YXJnZXREaXI/OiBzdHJpbmcsXG4gICAgZHJ5UnVuOiBib29sZWFuID0gZmFsc2UsXG4gICAgb25Qcm9ncmVzcz86IChwcm9jZXNzZWQ6IG51bWJlciwgdG90YWw6IG51bWJlciwgY3VycmVudD86IHN0cmluZykgPT4gdm9pZFxuICApOiBQcm9taXNlPHtcbiAgICBzY2FubmVkOiBudW1iZXI7XG4gICAgZGVsZXRlZDogbnVtYmVyO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIGRlbGV0ZWRGaWxlczogc3RyaW5nW107XG4gICAga2VwdEZpbGVzOiBzdHJpbmdbXTtcbiAgICBlcnJvckRldGFpbHM6IEFycmF5PHsgZmlsZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+O1xuICB9PiB7XG4gICAgY29uc3QgZGlyID0gdGFyZ2V0RGlyIHx8IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnc3lzdGVtJyk7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgc2Nhbm5lZDogMCxcbiAgICAgIGRlbGV0ZWQ6IDAsXG4gICAgICBlcnJvcnM6IDAsXG4gICAgICBkZWxldGVkRmlsZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAga2VwdEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIGVycm9yRGV0YWlsczogW10gYXMgQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgICB9O1xuXG4gICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IFN0YXJ0aW5nIGJhY2t1cCBjbGVhbnVwIGluICR7ZGlyfSR7ZHJ5UnVuID8gJyAoRFJZIFJVTiknIDogJyd9Li4uYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkoZGlyKTtcbiAgICAgIHJlc3VsdC5zY2FubmVkID0gZmlsZXMubGVuZ3RoO1xuXG4gICAgICAvLyBHcm91cCBiYWNrdXAgZmlsZXMgYnkgYmFzZSBuYW1lXG4gICAgICBjb25zdCBiYWNrdXBHcm91cHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAvLyBNYXRjaCB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzOiBuYW1lLmJhY2t1cC1ZWVlZLU1NLURELUhILW1tLXNzLVNTUy12Ti55YW1sXG4gICAgICAgIGNvbnN0IHZlcnNpb25lZE1hdGNoID0gZmlsZS5tYXRjaCgvXiguK1xcLmJhY2t1cC1cXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7M30pLXYoXFxkKylcXC55YW1sJC8pO1xuICAgICAgICBpZiAodmVyc2lvbmVkTWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IHZlcnNpb25lZE1hdGNoWzFdO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYmFja3VwR3JvdXBzLmdldChiYXNlTmFtZSkgfHwgW107XG4gICAgICAgICAgZXhpc3RpbmcucHVzaChmaWxlKTtcbiAgICAgICAgICBiYWNrdXBHcm91cHMuc2V0KGJhc2VOYW1lLCBleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIGFsbCB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzXG4gICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgICAgIGNvbnN0IHRvdGFsVmVyc2lvbmVkRmlsZXMgPSBBcnJheS5mcm9tKGJhY2t1cEdyb3Vwcy52YWx1ZXMoKSkucmVkdWNlKChzdW0sIGZpbGVzKSA9PiBzdW0gKyBmaWxlcy5sZW5ndGgsIDApO1xuXG4gICAgICBmb3IgKGNvbnN0IFtiYXNlTmFtZSwgdmVyc2lvbmVkRmlsZXNdIG9mIGJhY2t1cEdyb3Vwcykge1xuICAgICAgICAvLyBLZWVwIHRoZSBiYXNlIGJhY2t1cCBmaWxlICh3aXRob3V0IC12TiksIGRlbGV0ZSBhbGwgdmVyc2lvbmVkIG9uZXNcbiAgICAgICAgY29uc3QgYmFzZUJhY2t1cEZpbGUgPSBgJHtiYXNlTmFtZX0ueWFtbGA7XG4gICAgICAgIGlmIChmaWxlcy5pbmNsdWRlcyhiYXNlQmFja3VwRmlsZSkpIHtcbiAgICAgICAgICByZXN1bHQua2VwdEZpbGVzLnB1c2goYmFzZUJhY2t1cEZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uZWRGaWxlIG9mIHZlcnNpb25lZEZpbGVzKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkKys7XG5cbiAgICAgICAgICAvLyBSZXBvcnQgcHJvZ3Jlc3NcbiAgICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgICAgb25Qcm9ncmVzcyhwcm9jZXNzZWQsIHRvdGFsVmVyc2lvbmVkRmlsZXMsIHZlcnNpb25lZEZpbGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgdmVyc2lvbmVkRmlsZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShmdWxsUGF0aCwgRWxlbWVudFR5cGUuTUVNT1JZLCB7XG4gICAgICAgICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5jbGVhbnVwRXhjZXNzaXZlQmFja3VwcydcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuZGVsZXRlZCsrO1xuICAgICAgICAgICAgcmVzdWx0LmRlbGV0ZWRGaWxlcy5wdXNoKHZlcnNpb25lZEZpbGUpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiAke2RyeVJ1biA/ICdXb3VsZCBkZWxldGUnIDogJ0RlbGV0ZWQnfSAke3ZlcnNpb25lZEZpbGV9YCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMrKztcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgIGZpbGU6IHZlcnNpb25lZEZpbGUsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBGYWlsZWQgdG8gZGVsZXRlICR7dmVyc2lvbmVkRmlsZX06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IEJhY2t1cCBjbGVhbnVwIGNvbXBsZXRlJHtkcnlSdW4gPyAnIChEUlkgUlVOKScgOiAnJ30uIGAgK1xuICAgICAgICBgU2Nhbm5lZDogJHtyZXN1bHQuc2Nhbm5lZH0sICR7ZHJ5UnVuID8gJ1dvdWxkIGRlbGV0ZScgOiAnRGVsZXRlZCd9OiAke3Jlc3VsdC5kZWxldGVkfSwgRXJyb3JzOiAke3Jlc3VsdC5lcnJvcnN9YFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5kZWxldGVkID4gMCAmJiAhZHJ5UnVuKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DTEVBUkVELFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNsZWFudXBFeGNlc3NpdmVCYWNrdXBzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgSXNzdWUgIzM5OiBDbGVhbmVkIHVwICR7cmVzdWx0LmRlbGV0ZWR9IGV4Y2Vzc2l2ZSBiYWNrdXAgZmlsZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IGRpcixcbiAgICAgICAgICAgIHNjYW5uZWQ6IHJlc3VsdC5zY2FubmVkLFxuICAgICAgICAgICAgZGVsZXRlZDogcmVzdWx0LmRlbGV0ZWQsXG4gICAgICAgICAgICBlcnJvcnM6IHJlc3VsdC5lcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IEJhY2t1cCBjbGVhbnVwIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ21lbW9yaWVzJyk7XG5cbiAgICAvLyBCZWxvdyB0aHJlc2hvbGQg4oCUIG5vIGFjdGlvbiBuZWVkZWRcbiAgICBpZiAodGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBtZW1vcmllcyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgbWVtb3JpZXMgb3Igc2V0dGluZyBET0xMSE9VU0VfTUFYX0FDVElWRV9NRU1PUklFUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgbWVtb3JpZXMgbGltaXQgcmVhY2hlZDogJHt0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemV9LyR7bWF4fWBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIHRocmVzaG9sZCDigJQgcHJvYWN0aXZlbHkgY2xlYW4gc3RhbGUgZW50cmllc1xuICAgIHZvaWQgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgbWVtb3JpZXMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTaXplID0gdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplO1xuICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nTWVtb3J5TmFtZXMgPSBuZXcgU2V0KG1lbW9yaWVzLm1hcChtID0+IG0ubWV0YWRhdGEubmFtZSkpO1xuXG4gICAgICBjb25zdCBzdGFsZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhY3RpdmVOYW1lIG9mIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ01lbW9yeU5hbWVzLmhhcyhhY3RpdmVOYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuZGVsZXRlKGFjdGl2ZU5hbWUpO1xuICAgICAgICAgIHN0YWxlTmFtZXMucHVzaChhY3RpdmVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBtZW1vcnkgcmVmZXJlbmNlKHMpLiBgICtcbiAgICAgICAgICBgQWN0aXZlIG1lbW9yaWVzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ21lbW9yaWVzJyl9YFxuICAgICAgICApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZU1lbW9yaWVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBtZW1vcnkgcmVmZXJlbmNlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZCxcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50OiBlbmRTaXplLFxuICAgICAgICAgICAgc3RhbGVOYW1lczogc3RhbGVOYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgbWVtb3JpZXM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgcm9vdCBmaWxlcyBmb3IgbG9hZCBmYWlsdXJlc1xuICAgKiBGSVggKFNvbmFyQ2xvdWQgUzM3NzYpOiBFeHRyYWN0IHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1Jvb3RGaWxlcyhcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCByb290RmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkodGhpcy5tZW1vcmllc0RpcilcbiAgICAgIC50aGVuKGZpbGVzID0+IGZpbGVzLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy55YW1sJykpKVxuICAgICAgLmNhdGNoKCgpID0+IFtdKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiByb290RmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBmYWlsdXJlcy5wdXNoKHsgZmlsZSwgZXJyb3I6IGVycm9yTXNnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb290RmlsZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGRhdGUgZm9sZGVyIGZpbGVzIGZvciBsb2FkIGZhaWx1cmVzXG4gICAqIEZJWCAoU29uYXJDbG91ZCBTMzc3Nik6IEV4dHJhY3QgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrRGF0ZUZvbGRlckZpbGVzKFxuICAgIGRhdGVGb2xkZXI6IHN0cmluZyxcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgZGF0ZUZvbGRlcikpXG4gICAgICAudGhlbihmaWxlcyA9PiBmaWxlcy5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcueWFtbCcpKSlcbiAgICAgIC5jYXRjaCgoKSA9PiBbXSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChwYXRoLmpvaW4oZGF0ZUZvbGRlciwgZmlsZSkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goeyBmaWxlOiBgJHtkYXRlRm9sZGVyfS8ke2ZpbGV9YCwgZXJyb3I6IGVycm9yTXNnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWxlcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgbWVtb3J5IGxvYWRpbmcgc3RhdHVzXG4gICAqIEZJWCAoIzEyMDYpOiBOZXcgbWV0aG9kIHRvIGV4cG9zZSBmYWlsZWQgbG9hZHMgdG8gdXNlcnNcbiAgICovXG4gIGFzeW5jIGdldExvYWRTdGF0dXMoKTogUHJvbWlzZTx7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBsb2FkZWQ6IG51bWJlcjtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gIH0+IHtcbiAgICBjb25zdCBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBsZXQgdG90YWxGaWxlcyA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0ZUZvbGRlcnMgPSBhd2FpdCB0aGlzLmdldERhdGVGb2xkZXJzKCk7XG5cbiAgICAgIC8vIENoZWNrIHJvb3QgZmlsZXNcbiAgICAgIHRvdGFsRmlsZXMgKz0gYXdhaXQgdGhpcy5jaGVja1Jvb3RGaWxlcyhmYWlsdXJlcyk7XG5cbiAgICAgIC8vIENoZWNrIGRhdGUgZm9sZGVyc1xuICAgICAgZm9yIChjb25zdCBkYXRlRm9sZGVyIG9mIGRhdGVGb2xkZXJzKSB7XG4gICAgICAgIHRvdGFsRmlsZXMgKz0gYXdhaXQgdGhpcy5jaGVja0RhdGVGb2xkZXJGaWxlcyhkYXRlRm9sZGVyLCBmYWlsdXJlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsOiB0b3RhbEZpbGVzLFxuICAgICAgICBsb2FkZWQ6IHRvdGFsRmlsZXMgLSBmYWlsdXJlcy5sZW5ndGgsXG4gICAgICAgIGZhaWxlZDogZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICBmYWlsdXJlc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IGxvYWQgc3RhdHVzOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtb3JpZXMgbWFya2VkIGZvciBhdXRvLWxvYWRpbmcgb24gc2VydmVyIGluaXRpYWxpemF0aW9uLlxuICAgKiBQaGFzZSAyOiBRdWVyaWVzIGluZGV4IGZvciBhdXRvTG9hZCBlbnRyaWVzIGluc3RlYWQgb2YgbG9hZGluZyBhbGwgbWVtb3JpZXMuXG4gICAqIERyb3BzIGZyb20gfjcwcyB0byA8MzBtcyBmb3IgdHlwaWNhbCBwb3J0Zm9saW9zIHdpdGggMTRrIG1lbW9yaWVzLlxuICAgKiBJc3N1ZSAjMTQzMDogQXV0by1sb2FkIGJhc2VsaW5lIG1lbW9yaWVzIGZlYXR1cmVcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgYXV0by1sb2FkIG1lbW9yaWVzIHNvcnRlZCBieSBwcmlvcml0eVxuICAgKi9cbiAgYXN5bmMgZ2V0QXV0b0xvYWRNZW1vcmllcygpOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBpbmRleCBpcyBwb3B1bGF0ZWRcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLnNjYW4oKTtcblxuICAgICAgLy8gUGhhc2UgMjogUXVlcnkgaW5kZXggZm9yIGF1dG9Mb2FkIGVudHJpZXMg4oCUIGRvZXMgTk9UIGxvYWQgYWxsIGZpbGVzXG4gICAgICBjb25zdCBtZW1TdG9yYWdlTGF5ZXIgPSB0aGlzLnN0b3JhZ2VMYXllciBhcyBNZW1vcnlTdG9yYWdlTGF5ZXI7XG4gICAgICBjb25zdCBhdXRvTG9hZEVudHJpZXMgPSBtZW1TdG9yYWdlTGF5ZXIuZ2V0QXV0b0xvYWRFbnRyaWVzKCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gZ2V0QXV0b0xvYWRNZW1vcmllczogRm91bmQgJHthdXRvTG9hZEVudHJpZXMubGVuZ3RofSBhdXRvLWxvYWQgZW50cmllcyBpbiBpbmRleGApO1xuXG4gICAgICAvLyBMb2FkIG9ubHkgbWF0Y2hpbmcgbWVtb3JpZXMgKHR5cGljYWxseSAzLTUpXG4gICAgICBjb25zdCBhdXRvTG9hZE1lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBhdXRvTG9hZEVudHJpZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCB0aGlzLmxvYWQoZW50cnkuZmlsZVBhdGgpO1xuICAgICAgICAgIGF1dG9Mb2FkTWVtb3JpZXMucHVzaChtZW1vcnkpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdICAgLSAke2VudHJ5Lm5hbWV9OiBwcmlvcml0eT0ke2VudHJ5LnByaW9yaXR5ID8/IDk5OX0gKExPQURFRClgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBsb2FkIGF1dG8tbG9hZCBtZW1vcnkgJHtlbnRyeS5maWxlUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSAoYWxyZWFkeSBzb3J0ZWQgZnJvbSBnZXRBdXRvTG9hZEVudHJpZXMsIGJ1dCBlbnN1cmUgY29uc2lzdGVuY3kpXG4gICAgICBhdXRvTG9hZE1lbW9yaWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcGEgPSAoYS5tZXRhZGF0YSBhcyBNZW1vcnlNZXRhZGF0YSkucHJpb3JpdHkgPz8gOTk5O1xuICAgICAgICBjb25zdCBwYiA9IChiLm1ldGFkYXRhIGFzIE1lbW9yeU1ldGFkYXRhKS5wcmlvcml0eSA/PyA5OTk7XG4gICAgICAgIHJldHVybiBwYSAtIHBiO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBhdXRvTG9hZE1lbW9yaWVzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNZW1vcnlNYW5hZ2VyXSBGYWlsZWQgdG8gZ2V0IGF1dG8tbG9hZCBtZW1vcmllczonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgc2VlZCBtZW1vcmllcyBmcm9tIHRoZSBzZWVkLWVsZW1lbnRzIGRpcmVjdG9yeVxuICAgKiBJc3N1ZSAjMTQzMDogQ29weSBiYXNlbGluZSBtZW1vcnkgdG8gdXNlciBwb3J0Zm9saW8gb24gZmlyc3QgcnVuXG4gICAqXG4gICAqIENvcGllcyBzZWVkIGZpbGVzIGZyb20gc3JjL3NlZWQtZWxlbWVudHMvbWVtb3JpZXMvIHRvIHRoZSB1c2VyJ3MgcG9ydGZvbGlvXG4gICAqIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC4gVGhpcyBhbGxvd3MgdXNlcnMgdG8gaGF2ZSBiYXNlbGluZSBrbm93bGVkZ2VcbiAgICogYXZhaWxhYmxlIGltbWVkaWF0ZWx5IHdpdGhvdXQgbWFudWFsIGluc3RhbGxhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgd2hlbiBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZWVkTWVtb3JpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oJ1tNZW1vcnlNYW5hZ2VyXSDwn4yxIFN0YXJ0aW5nIHNlZWQgbWVtb3J5IGluc3RhbGxhdGlvbi4uLicpO1xuICAgIHRyeSB7XG4gICAgICAvLyBEZWZpbmUgdGhlIHNlZWQgZmlsZVxuICAgICAgY29uc3Qgc2VlZEZpbGVOYW1lID0gJ2RvbGxob3VzZW1jcC1iYXNlbGluZS1rbm93bGVkZ2UueWFtbCc7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDE6IFRhcmdldCBzZWVkIGZpbGU6ICR7c2VlZEZpbGVOYW1lfWApO1xuXG4gICAgICAvLyBDb25zdHJ1Y3QgcGF0aHNcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIGRpc3QvZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci5qczpcbiAgICAgIC8vICAgR28gdXAgdG8gZGlzdC8gdGhlbiBpbnRvIHNlZWQtZWxlbWVudHMvbWVtb3JpZXMvXG4gICAgICAvLyBXaGVuIHJ1bm5pbmcgZnJvbSBzcmMvZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci50czpcbiAgICAgIC8vICAgR28gdXAgdG8gc3JjLyB0aGVuIGludG8gc2VlZC1lbGVtZW50cy9tZW1vcmllcy9cbiAgICAgIC8vIEZJWDogVXNlIGZpbGVVUkxUb1BhdGggZm9yIGNyb3NzLXBsYXRmb3JtIFdpbmRvd3MgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gT24gV2luZG93cywgVVJMLnBhdGhuYW1lIHJldHVybnMgL0M6L1VzZXJzLy4uLiB3aGljaCBpcyBpbnZhbGlkXG4gICAgICAvLyBmaWxlVVJMVG9QYXRoIGNvcnJlY3RseSBjb252ZXJ0cyBmaWxlOi8vIFVSTHMgdG8gbmF0aXZlIHBhdGhzXG4gICAgICBjb25zdCBjdXJyZW50TW9kdWxlRGlyID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDI6IEN1cnJlbnQgbW9kdWxlIGRpcmVjdG9yeTogJHtjdXJyZW50TW9kdWxlRGlyfWApO1xuXG4gICAgICAvLyBUcnkgZGlzdCBsb2NhdGlvbiBmaXJzdCAocHJvZHVjdGlvbi9idWlsdCBjb2RlKVxuICAgICAgbGV0IHNlZWRTb3VyY2VQYXRoID0gcGF0aC5yZXNvbHZlKGN1cnJlbnRNb2R1bGVEaXIsICcuLi8uLi9zZWVkLWVsZW1lbnRzL21lbW9yaWVzJywgc2VlZEZpbGVOYW1lKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAzOiBUcnlpbmcgc2VlZCBwYXRoIChkaXN0KTogJHtzZWVkU291cmNlUGF0aH1gKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgaXQgZXhpc3RzLCBpZiBub3QgdHJ5IHNyYyBsb2NhdGlvbiAoZGV2ZWxvcG1lbnQvdGVzdClcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhzZWVkU291cmNlUGF0aCkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3RlcCA0OiBGb3VuZCBzZWVkIGZpbGUgaW4gZGlzdCBsb2NhdGlvbmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtNZW1vcnlNYW5hZ2VyXSDimqDvuI8gIFN0ZXAgNDogU2VlZCBmaWxlIG5vdCBpbiBkaXN0IGxvY2F0aW9uLCB0cnlpbmcgc3JjLi4uYCk7XG4gICAgICAgIC8vIFRyeSBzcmMgbG9jYXRpb25cbiAgICAgICAgc2VlZFNvdXJjZVBhdGggPSBwYXRoLnJlc29sdmUoY3VycmVudE1vZHVsZURpciwgJy4uLy4uLy4uL3NyYy9zZWVkLWVsZW1lbnRzL21lbW9yaWVzJywgc2VlZEZpbGVOYW1lKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDRiOiBUcnlpbmcgc2VlZCBwYXRoIChzcmMpOiAke3NlZWRTb3VyY2VQYXRofWApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc2VlZCBmaWxlIGV4aXN0c1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhzZWVkU291cmNlUGF0aCkpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0g4p2MIFN0ZXAgNTogU2VlZCBmaWxlIG5vdCBmb3VuZCBhdCAke3NlZWRTb3VyY2VQYXRofWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdGVwIDU6IFZlcmlmaWVkIHNlZWQgZmlsZSBleGlzdHMgYXQ6ICR7c2VlZFNvdXJjZVBhdGh9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdXNlciBwb3J0Zm9saW9cbiAgICAgIC8vIElTU1VFICM1OiBTZWVkIGZpbGVzIGFyZSBzeXN0ZW0gZmlsZXMgLSBBTFdBWVMgdXNlIGxhdGVzdCB2ZXJzaW9uXG4gICAgICAvLyBCYWNrdXAgZXhpc3RpbmcgaWYgaXQgaGFzIHVzZXIgY29udGVudCwgdGhlbiBpbnN0YWxsIGZyZXNoIHNlZWRcblxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDY6IENoZWNraW5nIGZvciBleGlzdGluZyBzZWVkIG1lbW9yeSBpbiBwb3J0Zm9saW8uLi5gKTtcbiAgICAgIGxldCBleGlzdGluZ01lbW9yeTogTWVtb3J5IHwgdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBUcnkgdG8gbG9hZCBleGlzdGluZyBtZW1vcnlcbiAgICAgICAgZXhpc3RpbmdNZW1vcnkgPSBhd2FpdCB0aGlzLmxvYWQoc2VlZEZpbGVOYW1lKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3RlcCA3OiBGb3VuZCBleGlzdGluZyBzZWVkIG1lbW9yeSAnJHtzZWVkRmlsZU5hbWV9J2ApO1xuICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBleGlzdGluZ01lbW9yeS5nZXRGaWxlUGF0aCgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIEV4aXN0aW5nIGZpbGUgbG9jYXRpb246ICR7ZXhpc3RpbmdQYXRofWApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE1lbW9yeSBkb2Vzbid0IGV4aXN0IC0gcHJvY2VlZCB3aXRoIGZyZXNoIGluc3RhbGxhdGlvblxuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKEue+4jyAgU3RlcCA3OiBTZWVkIG1lbW9yeSAnJHtzZWVkRmlsZU5hbWV9JyBub3QgZm91bmQgaW4gcG9ydGZvbGlvLCB3aWxsIGluc3RhbGwgZnJlc2hgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgZXhpc3RpbmcgbWVtb3J5IGZvdW5kLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHJlaW5zdGFsbFxuICAgICAgaWYgKGV4aXN0aW5nTWVtb3J5KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCA4OiBBbmFseXppbmcgZXhpc3Rpbmcgc2VlZCBtZW1vcnkgY29udGVudC4uLmApO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZXhpc3RpbmdNZW1vcnkuZ2V0QWxsRW50cmllcygpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBGb3VuZCAke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzIGluIGV4aXN0aW5nIG1lbW9yeWApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIG1lbW9yeSBoYXMgbWVhbmluZ2Z1bCBjb250ZW50IChub3QganVzdCBcImVudHJpZXM6IFtdXCIpXG4gICAgICAgIC8vIEVtcHR5IGZpbGVzIG9mdGVuIGhhdmUganVzdCB0aGUgXCJlbnRyaWVzOiBbXVwiIFlBTUwgZmllbGQgYXMgY29udGVudFxuICAgICAgICBsZXQgaGFzQ29udGVudCA9IGVudHJpZXMubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoaGFzQ29udGVudCAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0RW50cnkgPSBlbnRyaWVzWzBdO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmaXJzdEVudHJ5LmNvbnRlbnQ/LnRyaW0oKSB8fCAnJztcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTaW5nbGUgZW50cnkgY29udGVudCBsZW5ndGg6ICR7Y29udGVudC5sZW5ndGh9IGNoYXJzYCk7XG4gICAgICAgICAgLy8gSWYgb25seSBjb250ZW50IGlzIFwiZW50cmllczogW11cIiwgY29uc2lkZXIgaXQgZW1wdHlcbiAgICAgICAgICBpZiAoY29udGVudCA9PT0gJ2VudHJpZXM6IFtdJyB8fCBjb250ZW50ID09PSAnJykge1xuICAgICAgICAgICAgaGFzQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBFbnRyeSBhcHBlYXJzIGVtcHR5IChlbnRyaWVzOiBbXSBvciBibGFuaylgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzQ29udGVudCkge1xuICAgICAgICAgIC8vIEZJWCAjMTQzMDogU2tpcCByZWluc3RhbGxhdGlvbiBpZiBzZWVkIGFscmVhZHkgZXhpc3RzIHdpdGggY29udGVudFxuICAgICAgICAgIC8vIFJlaW5zdGFsbGluZyBkZWxldGVzIHRoZSBtZW1vcnkgZnJvbSBjYWNoZSwgbG9zaW5nIGFjdGl2YXRpb24gc3RhdHVzXG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU2VlZCBtZW1vcnkgYWxyZWFkeSBpbnN0YWxsZWQgd2l0aCBjb250ZW50IC0gc2tpcHBpbmcgcmVpbnN0YWxsYXRpb25gKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIPCfjokgU2VlZCBtZW1vcnkgaW5zdGFsbGF0aW9uIGNoZWNrIGNvbXBsZXRlIChhbHJlYWR5IGluc3RhbGxlZClgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDk6IEV4aXN0aW5nIHNlZWQgbWVtb3J5IGlzIGVtcHR5ICgke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzKSwgd2lsbCByZWluc3RhbGxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlbGV0ZSBleGlzdGluZyAod2lsbCBiZSByZXBsYWNlZCB3aXRoIGxhdGVzdClcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDEwOiBSZW1vdmluZyBleGlzdGluZyBzZWVkIG1lbW9yeS4uLmApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHNlZWRGaWxlTmFtZSk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgUmVtb3ZlZCBleGlzdGluZyBzZWVkIG1lbW9yeSwgd2lsbCBpbnN0YWxsIGxhdGVzdCB2ZXJzaW9uYCk7XG4gICAgICAgIH0gY2F0Y2ggKGRlbGV0ZUVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0g4p2MIEZhaWxlZCB0byBkZWxldGUgZXhpc3Rpbmcgc2VlZCBtZW1vcnk6YCwgZGVsZXRlRXJyb3IpO1xuICAgICAgICAgIHRocm93IGRlbGV0ZUVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgdGhlIHNlZWQgZmlsZVxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDExOiBSZWFkaW5nIHNlZWQgZmlsZSBjb250ZW50Li4uYCk7XG4gICAgICBjb25zdCBzZWVkQ29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoc2VlZFNvdXJjZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBSZWFkIHNlZWQgZmlsZTogJHtzZWVkQ29udGVudC5sZW5ndGh9IGNoYXJhY3RlcnNgKTtcblxuICAgICAgLy8gUGFyc2UgYW5kIGNyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAxMjogUGFyc2luZyBzZWVkIGNvbnRlbnQgYW5kIGNyZWF0aW5nIG1lbW9yeSBpbnN0YW5jZS4uLmApO1xuICAgICAgbGV0IG1lbW9yeTogTWVtb3J5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVtb3J5ID0gYXdhaXQgdGhpcy5pbXBvcnRFbGVtZW50KHNlZWRDb250ZW50LCAneWFtbCcpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdWNjZXNzZnVsbHkgcGFyc2VkIHNlZWQgbWVtb3J5YCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIE1lbW9yeSBuYW1lOiAke21lbW9yeS5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSDinYwgRmFpbGVkIHRvIHBhcnNlIHNlZWQgY29udGVudDpgLCBwYXJzZUVycm9yKTtcbiAgICAgICAgdGhyb3cgcGFyc2VFcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IG1lbW9yeSB0eXBlIHRvIFNZU1RFTSBhbmQgZW5zdXJlIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAxMzogU2V0dGluZyBtZW1vcnkgdHlwZSB0byBTWVNURU0gYW5kIGF1dG9Mb2FkLi4uYCk7XG4gICAgICBjb25zdCBtZW1vcnlNZXRhID0gbWVtb3J5Lm1ldGFkYXRhIGFzIE1lbW9yeU1ldGFkYXRhO1xuICAgICAgbWVtb3J5TWV0YS5tZW1vcnlUeXBlID0gTWVtb3J5VHlwZS5TWVNURU07XG4gICAgICBtZW1vcnlNZXRhLmF1dG9Mb2FkID0gdHJ1ZTsgLy8gRW5zdXJlIHNlZWQgbWVtb3JpZXMgYXV0by1sb2FkXG4gICAgICBtZW1vcnlNZXRhLnByaW9yaXR5ID0gMTsgICAvLyBIaWdoIHByaW9yaXR5IGZvciBiYXNlbGluZSBrbm93bGVkZ2VcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIE1lbW9yeSB0eXBlOiAke21lbW9yeU1ldGEubWVtb3J5VHlwZX0sIGF1dG9Mb2FkOiAke21lbW9yeU1ldGEuYXV0b0xvYWR9LCBwcmlvcml0eTogJHttZW1vcnlNZXRhLnByaW9yaXR5fWApO1xuXG4gICAgICAvLyBTYXZlIHRvIHBvcnRmb2xpbyAodGhpcyB3aWxsIHVzZSBzeXN0ZW0vIGZvbGRlciBiYXNlZCBvbiBtZW1vcnlUeXBlKVxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDE0OiBTYXZpbmcgc2VlZCBtZW1vcnkgdG8gcG9ydGZvbGlvIChzaG91bGQgZ28gdG8gc3lzdGVtLyBmb2xkZXIpLi4uYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmUobWVtb3J5KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3VjY2Vzc2Z1bGx5IHNhdmVkIHNlZWQgbWVtb3J5YCk7XG4gICAgICAgIGNvbnN0IHNhdmVkUGF0aCA9IG1lbW9yeS5nZXRGaWxlUGF0aCgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFNhdmVkIHRvOiAke3NhdmVkUGF0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKHNhdmVFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSDinYwgRmFpbGVkIHRvIHNhdmUgc2VlZCBtZW1vcnk6YCwgc2F2ZUVycm9yKTtcbiAgICAgICAgdGhyb3cgc2F2ZUVycm9yO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIPCfjokgU3RlcCAxNTogU2VlZCBtZW1vcnkgaW5zdGFsbGF0aW9uIENPTVBMRVRFIWApO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBJbnN0YWxsZWQgc2VlZCBtZW1vcnk6ICR7c2VlZEZpbGVOYW1lfWApO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBlcnJvciBidXQgZG9uJ3QgdGhyb3cgLSBzZWVkIGluc3RhbGxhdGlvbiBzaG91bGQgbm90IGJyZWFrIHNlcnZlciBzdGFydHVwXG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNZW1vcnlNYW5hZ2VyXSBGYWlsZWQgdG8gaW5zdGFsbCBzZWVkIG1lbW9yaWVzOicsIGVycm9yKTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9MT0FEX0ZBSUxFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5pbnN0YWxsU2VlZE1lbW9yaWVzJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBpbnN0YWxsIHNlZWQgbWVtb3JpZXM6ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogRmluZCBtZW1vcmllcyBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZChwcmVkaWNhdGU6IChlbGVtZW50OiBNZW1vcnkpID0+IGJvb2xlYW4pOiBQcm9taXNlPE1lbW9yeSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZpbmQgbXVsdGlwbGUgbWVtb3JpZXMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IE1lbW9yeSkgPT4gYm9vbGVhbik6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBtZW1vcmllcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBtZW1vcmllcy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlbGV0ZSBhIG1lbW9yeSBmaWxlXG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgcGF0aCBhbmQgbG9ncyBkZWxldGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuXG4gICAgICAvLyBDaGVjayBpZiBmaWxlIGV4aXN0c1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhmdWxsUGF0aCkpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBub3QgYW4gZXJyb3IgZm9yIGRlbGV0ZSBvcGVyYXRpb25cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhlIGZpbGVcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShmdWxsUGF0aCwgRWxlbWVudFR5cGUuTUVNT1JZLCB7XG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuZGVsZXRlJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlc1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCk7XG4gICAgICB0aGlzLnVuY2FjaGVCeVBhdGgocmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gUGhhc2UgMjogTm90aWZ5IHN0b3JhZ2UgbGF5ZXIgb2YgZGVsZXRpb25cbiAgICAgIHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gUGhhc2UgMjogVXNlIHJldmVyc2UgbWFwIGZvciBPKDEpIGhhc2ggY2xlYW51cFxuICAgICAgY29uc3QgaGFzaCA9IHRoaXMuY29udGVudEhhc2hCeVBhdGguZ2V0KGZ1bGxQYXRoKTtcbiAgICAgIGlmIChoYXNoKSB7XG4gICAgICAgIHRoaXMuY29udGVudEhhc2hJbmRleC5kZWxldGUoaGFzaCk7XG4gICAgICAgIHRoaXMuY29udGVudEhhc2hCeVBhdGguZGVsZXRlKGZ1bGxQYXRoKTtcbiAgICAgIH1cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9ERUxFVEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYERlbGV0ZWQgbWVtb3J5IGZpbGU6ICR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9YFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgbm90IGFuIGVycm9yIGZvciBkZWxldGUgb3BlcmF0aW9uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbWVtb3J5IGZpbGUgZXhpc3RzXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoZnVsbFBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBtZW1vcnkgd2l0aCBtZXRhZGF0YVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1ldGFkYXRhOiBQYXJ0aWFsPE1lbW9yeU1ldGFkYXRhPiAmIHsgY29udGVudD86IHN0cmluZzsgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIH0pOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUoe1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvblxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgTWVtb3J5IGNyZWF0aW9uIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIChtb3ZlZCBmcm9tIGNyZWF0ZUVsZW1lbnQgaGFuZGxlcilcbiAgICBjb25zdCBleGlzdGluZ01lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdNZW1vcmllcy5maW5kKG0gPT5cbiAgICAgIG0ubWV0YWRhdGEubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gbWV0YWRhdGEubmFtZT8udG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIG1lbW9yeSBuYW1lZCBcIiR7bWV0YWRhdGEubmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIC8vIFNlcGFyYXRlIGNvbnRlbnQgYW5kIGluc3RydWN0aW9ucyBmcm9tIG1ldGFkYXRhIGZpZWxkc1xuICAgIC8vIE5vdGU6IEJhc2VFbGVtZW50LmNvbnN0cnVjdG9yIGdlbmVyYXRlcyB0aGUgZWxlbWVudCBpZCBmcm9tIHRoZSBuYW1lLFxuICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gc2V0IGlkIGhlcmUg4oCUIGl0IHdvdWxkIGJlIGlnbm9yZWQuXG4gICAgY29uc3QgeyBjb250ZW50LCBpbnN0cnVjdGlvbnMsIC4uLm1ldGFkYXRhRmllbGRzIH0gPSBtZXRhZGF0YTtcblxuICAgIC8vIENyZWF0ZSBpbnN0YW5jZVxuICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGFGaWVsZHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIC8vIFNldCBpbnN0cnVjdGlvbnMgaWYgcHJvdmlkZWQgKHYyLjAgZHVhbC1maWVsZDogbWVtb3J5LWxldmVsIGRpcmVjdGl2ZXMpXG4gICAgaWYgKGluc3RydWN0aW9ucykge1xuICAgICAgbWVtb3J5Lmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9ucztcbiAgICB9XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBlbnRyeSBpZiBjb250ZW50IHByb3ZpZGVkIChtb3ZlZCBmcm9tIGNyZWF0ZUVsZW1lbnQgaGFuZGxlcilcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgYXdhaXQgbWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8vIFNhdmUgKG1vdmVkIGZyb20gY3JlYXRlRWxlbWVudCBoYW5kbGVyKVxuICAgIGF3YWl0IHRoaXMuc2F2ZShtZW1vcnkpO1xuICAgIC8vIE5vdGU6IE5vIHJlbG9hZCgpIGhlcmUg4oCUIHNhdmUoKSBjYWNoZXMgdGhlIGVsZW1lbnQgY29ycmVjdGx5LlxuICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgbG9nZ2VyLmluZm8oYE1lbW9yeSBjcmVhdGVkOiAke21lbW9yeS5tZXRhZGF0YS5uYW1lfWApO1xuICAgIHJldHVybiBtZW1vcnk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQYXJzZSBZQU1MIGRhdGEgZm9yIGltcG9ydFxuICAgKiBFeHRyYWN0ZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IChTb25hckNsb3VkKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVlhbWxGb3JJbXBvcnQoZGF0YTogc3RyaW5nKTogeyBwYXJzZWQ6IGFueTsgbWFya2Rvd25Db250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQgfSB7XG4gICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBjb25zaXN0ZW50IHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoZGF0YSwge1xuICAgICAgbWF4WWFtbFNpemU6IE1FTU9SWV9DT05TVEFOVFMuTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZSxcbiAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIucGFyc2VZYW1sRm9ySW1wb3J0JyxcbiAgICAgIHNjaGVtYTogJ2pzb24nICAvLyBGSVggIzE0MzA6IFByZXNlcnZlIGJvb2xlYW5zIChhdXRvTG9hZCkgYW5kIG51bWJlcnMgKHByaW9yaXR5KVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlZDogcmVzdWx0LmRhdGEsXG4gICAgICBtYXJrZG93bkNvbnRlbnQ6IHJlc3VsdC5jb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbWVtb3J5IGZyb20gcGFyc2VkIGRhdGFcbiAgICogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSAoU29uYXJDbG91ZClcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTWVtb3J5RnJvbVBhcnNlZChcbiAgICBwYXJzZWQ6IGFueSxcbiAgICBtYXJrZG93bkNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgc3RydWN0dXJlcyBmcm9tIFlBTUwgcGFyc2luZ1xuICAgIC8vIFN1cHBvcnQgYm90aCBmb3JtYXRzIChzZWUgY29tbWl0IGZlYjVjZTAgb24gbWFpbik6XG4gICAgLy8gMS4gRnJvbnRtYXR0ZXItc3R5bGUgKHNlZWQgZmlsZXMpOiBtZXRhZGF0YSBmaWVsZHMgYXQgdG9wIGxldmVsXG4gICAgLy8gMi4gU2F2ZWQgbWVtb3J5IGZpbGVzOiBuZXN0ZWQgdW5kZXIgJ21ldGFkYXRhJyBrZXlcbiAgICAvLyBUaGlzIG1hdGNoZXMgbWFpbidzIHBhcnNlTWVtb3J5RmlsZSBsb2dpYzogeWFtbERhdGEubWV0YWRhdGEgfHwgeWFtbERhdGFcbiAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlZC5tZXRhZGF0YSB8fCBwYXJzZWQ7XG4gICAgY29uc3QgZW50cmllcyA9IHBhcnNlZC5lbnRyaWVzIHx8IHBhcnNlZC5kYXRhPy5lbnRyaWVzO1xuXG4gICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCFtZXRhZGF0YT8ubmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgbXVzdCBoYXZlIG1ldGFkYXRhIHdpdGggbmFtZScpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICBjb25zdCBtZW1vcnkgPSBuZXcgTWVtb3J5KG1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBMb2FkIGVudHJpZXMgaWYgcHJlc2VudFxuICAgIGlmIChlbnRyaWVzKSB7XG4gICAgICBtZW1vcnkuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBpZDogbWVtb3J5LmlkLFxuICAgICAgICB0eXBlOiBtZW1vcnkudHlwZSxcbiAgICAgICAgdmVyc2lvbjogbWVtb3J5LnZlcnNpb24sXG4gICAgICAgIG1ldGFkYXRhOiBtZW1vcnkubWV0YWRhdGEsXG4gICAgICAgIGV4dGVuc2lvbnM6IG1lbW9yeS5leHRlbnNpb25zLFxuICAgICAgICBlbnRyaWVzOiBlbnRyaWVzXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbWFya2Rvd24gY29udGVudCBleGlzdHMgYWZ0ZXIgdGhlIGZyb250bWF0dGVyLCBhZGQgaXQgYXMgYSBtZW1vcnkgZW50cnlcbiAgICAvLyBUaGlzIHByZXNlcnZlcyBjb250ZW50IGZyb20gc2VlZCBtZW1vcmllcyBhbmQgaW1wb3J0ZWQgWUFNTCBmaWxlcyB3aXRoIG1hcmtkb3duIHNlY3Rpb25zXG4gICAgaWYgKG1hcmtkb3duQ29udGVudD8udHJpbSgpKSB7XG4gICAgICBhd2FpdCBtZW1vcnkuYWRkRW50cnkoXG4gICAgICAgIG1hcmtkb3duQ29udGVudC50cmltKCksXG4gICAgICAgIFtdLCAgLy8gdGFnc1xuICAgICAgICB7IGltcG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9LCAgLy8gbWV0YWRhdGFcbiAgICAgICAgJ2ltcG9ydCcgIC8vIHNvdXJjZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVtb3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIG1lbW9yeSBmcm9tIEpTT04vWUFNTCBzdHJpbmdcbiAgICogU0VDVVJJVFk6IEZ1bGwgdmFsaWRhdGlvbiBvZiBpbXBvcnRlZCBjb250ZW50XG4gICAqIEBwYXJhbSBkYXRhIEpTT04gb3IgWUFNTCBzdHJpbmcgY29udGFpbmluZyBtZW1vcnkgZGF0YVxuICAgKiBAcGFyYW0gZm9ybWF0IEZvcm1hdCBvZiB0aGUgaW5wdXQgZGF0YSAoJ2pzb24nIG9yICd5YW1sJylcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGltcG9ydGVkIE1lbW9yeSBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBKU09OL1lBTUwgcGFyc2luZyBmYWlsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBpbXBvcnRlZCBkYXRhIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIFlBTUwgY29udGVudCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGltcG9ydGVkIG1lbW9yeSBmYWlscyB2YWxpZGF0aW9uXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBpbXBvcnRFbGVtZW50KFxuICAgIGRhdGE6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAneWFtbCdcbiAgKTogUHJvbWlzZTxNZW1vcnk+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHBhcnNlZDogYW55O1xuICAgICAgbGV0IG1hcmtkb3duQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2Ugc2VjdXJlIFlBTUwgcGFyc2luZ1xuICAgICAgICAvLyBNZW1vcnkgaW1wb3J0IGV4cGVjdHMgcHVyZSBZQU1MIChub3QgZnJvbnRtYXR0ZXIpLCBzbyB3ZSBwYXJzZSBpdCBzZWN1cmVseVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VZYW1sRm9ySW1wb3J0KGRhdGEpO1xuICAgICAgICAgIHBhcnNlZCA9IHJlc3VsdC5wYXJzZWQ7XG4gICAgICAgICAgbWFya2Rvd25Db250ZW50ID0gcmVzdWx0Lm1hcmtkb3duQ29udGVudDtcbiAgICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFlBTUw6ICR7eWFtbEVycm9yfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgaXQncyBhbiBvYmplY3RcbiAgICAgICAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lBTUwgbXVzdCBjb250YWluIGFuIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZU1lbW9yeUZyb21QYXJzZWQocGFyc2VkLCBtYXJrZG93bkNvbnRlbnQpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfSU1QT1JUX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGltcG9ydCBtZW1vcnk6ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4cG9ydCBhIG1lbW9yeSB0byBZQU1MIHN0cmluZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZXhwb3J0RWxlbWVudChcbiAgICBlbGVtZW50OiBNZW1vcnksXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ3lhbWwnXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5zZXJpYWxpemUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0cyA9IGVsZW1lbnQuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICBleHRlbnNpb25zOiBlbGVtZW50LmV4dGVuc2lvbnMsXG4gICAgICBzdGF0czoge1xuICAgICAgICB0b3RhbEVudHJpZXM6IHN0YXRzLnRvdGFsRW50cmllcyxcbiAgICAgICAgdG90YWxTaXplOiBzdGF0cy50b3RhbFNpemUsXG4gICAgICAgIG9sZGVzdEVudHJ5OiBzdGF0cy5vbGRlc3RFbnRyeT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgbmV3ZXN0RW50cnk6IHN0YXRzLm5ld2VzdEVudHJ5Py50b0lTT1N0cmluZygpXG4gICAgICB9LFxuICAgICAgZW50cmllczogSlNPTi5wYXJzZShlbGVtZW50LnNlcmlhbGl6ZSgpKS5lbnRyaWVzXG4gICAgfTtcblxuICAgIC8vIFNFQ1VSSVRZIEZJWDogVXNlIHNlY3VyZSBZQU1MIGR1bXBpbmdcbiAgICAvLyBGSVggIzE0MzA6IFVzZSBKU09OX1NDSEVNQSB0byBwcmVzZXJ2ZSBib29sZWFucyAoYXV0b0xvYWQpIGFuZCBudW1iZXJzIChwcmlvcml0eSlcbiAgICAvLyBKU09OX1NDSEVNQSA9IEZBSUxTQUZFICsgYm9vbC9pbnQvZmxvYXQvbnVsbCAoc2FmZXIgdGhhbiBERUZBVUxUIHdoaWNoIGFkZHMgdGltZXN0YW1wcylcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5kdW1wWWFtbChkYXRhLCB7XG4gICAgICBzY2hlbWE6ICdqc29uJyxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNraXBJbnZhbGlkOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8TWVtb3J5TWV0YWRhdGE+IHtcbiAgICBjb25zdCB7IG1ldGFkYXRhIH0gPSB0aGlzLnBhcnNlTWVtb3J5RmlsZSh7IGRhdGEsIGNvbnRlbnQ6ICcnIH0pO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YSwgX2NvbnRlbnQ6IHN0cmluZyk6IE1lbW9yeSB7XG4gICAgY29uc3QgbWVtb3J5ID0gbmV3IE1lbW9yeShtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEV4dHJhY3QgaW5zdHJ1Y3Rpb25zIGZyb20gbWV0YWRhdGEgaWYgcHJlc2VudCAodjIgZHVhbC1maWVsZClcbiAgICBpZiAobWV0YWRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBtZW1vcnkuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG1lbW9yeTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQ6IE1lbW9yeSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBlbGVtZW50LmdldFN0YXRzKCk7XG4gICAgLy8gSXNzdWUgIzc1NTogU2VyaWFsaXplIHR5cGUgYXMgc2luZ3VsYXIgYW5kIHBlcnNpc3QgdW5pcXVlX2lkXG4gICAgY29uc3QgbWV0YWRhdGEgPSB7IC4uLmVsZW1lbnQubWV0YWRhdGEgfTtcbiAgICBtZXRhZGF0YS50eXBlID0gdG9TaW5ndWxhckxhYmVsKEVsZW1lbnRUeXBlLk1FTU9SWSkgYXMgYW55O1xuICAgIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uID0gJ3YyJzsgIC8vIEZpeCAjOTEyLyM5MTg6IEV4cGxpY2l0IGZvcm1hdCBtYXJrZXJcbiAgICAobWV0YWRhdGEgYXMgYW55KS51bmlxdWVfaWQgPSBlbGVtZW50LmlkO1xuICAgIGNvbnN0IHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgbWV0YWRhdGEsXG4gICAgICAuLi4oZWxlbWVudC5pbnN0cnVjdGlvbnMgPyB7IGluc3RydWN0aW9uczogZWxlbWVudC5pbnN0cnVjdGlvbnMgfSA6IHt9KSxcbiAgICAgIGV4dGVuc2lvbnM6IGVsZW1lbnQuZXh0ZW5zaW9ucyxcbiAgICAgIHN0YXRzOiB7XG4gICAgICAgIHRvdGFsRW50cmllczogc3RhdHMudG90YWxFbnRyaWVzLFxuICAgICAgICB0b3RhbFNpemU6IHN0YXRzLnRvdGFsU2l6ZSxcbiAgICAgICAgb2xkZXN0RW50cnk6IHN0YXRzLm9sZGVzdEVudHJ5Py50b0lTT1N0cmluZygpLFxuICAgICAgICBuZXdlc3RFbnRyeTogc3RhdHMubmV3ZXN0RW50cnk/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHRvcFRhZ3M6IEFycmF5LmZyb20oc3RhdHMudGFnRnJlcXVlbmN5LmVudHJpZXMoKSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYlsxXSAtIGFbMV0pXG4gICAgICAgICAgLnNsaWNlKDAsIDEwKVxuICAgICAgICAgIC5tYXAoKFt0YWcsIGNvdW50XSkgPT4gKHsgdGFnLCBjb3VudCB9KSlcbiAgICAgIH0sXG4gICAgICBlbnRyaWVzOiBKU09OLnBhcnNlKGVsZW1lbnQuc2VyaWFsaXplKCkpLmVudHJpZXNcbiAgICB9O1xuXG4gICAgLy8gRklYICMxNDMwOiBVc2UgSlNPTl9TQ0hFTUEgdG8gcHJlc2VydmUgYm9vbGVhbnMgKGF1dG9Mb2FkKSBhbmQgbnVtYmVycyAocHJpb3JpdHkpXG4gICAgLy8gSlNPTl9TQ0hFTUEgPSBGQUlMU0FGRSArIGJvb2wvaW50L2Zsb2F0L251bGwgKHNhZmVyIHRoYW4gREVGQVVMVCB3aGljaCBhZGRzIHRpbWVzdGFtcHMpXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuZHVtcFlhbWwocGF5bG9hZCwge1xuICAgICAgc2NoZW1hOiAnanNvbicsXG4gICAgICBub1JlZnM6IHRydWUsXG4gICAgICBza2lwSW52YWxpZDogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIG1lbW9yeSBlbGVtZW50XG4gICAqL1xuICBvdmVycmlkZSB2YWxpZGF0ZShlbGVtZW50OiBNZW1vcnkpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCByZXNvbHZlIGEgZmlsZSBwYXRoXG4gICAqIFNFQ1VSSVRZOiBQcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAgICovXG4gIG92ZXJyaWRlIHZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFBlcmZvcm0gc3luY2hyb25vdXMgdmFsaWRhdGlvbiBjaGVja3NcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4uJykgfHwgcGF0aC5pc0Fic29sdXRlKG5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zdXJlIHByb3BlciBleHRlbnNpb25cbiAgICAgIGlmICghbm9ybWFsaXplZC5lbmRzV2l0aCgnLm1kJykgJiYgIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy55YW1sJykgJiYgIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy55bWwnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlIHRoaXMgbWFuYWdlciBoYW5kbGVzXG4gICAqL1xuICBvdmVycmlkZSBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIEVsZW1lbnRUeXBlLk1FTU9SWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBtZW1vcnkgZmlsZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJy55YW1sJztcbiAgfVxuICBcbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCByZXNvbHZlIGEgZmlsZSBwYXRoIHRvIHByZXZlbnQgc2VjdXJpdHkgaXNzdWVzXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHZhbGlkYXRlIGFuZCByZXNvbHZlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB2YWxpZGF0ZWQgZnVsbCBwYXRoXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHBhdGggY29udGFpbnMgdHJhdmVyc2FsIGF0dGVtcHRzICguLi8pXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHBhdGggaXMgYWJzb2x1dGUgb3IgaW52YWxpZFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBmaWxlIGV4dGVuc2lvbiBpcyBub3QgYWxsb3dlZCAoLm1kLCAueWFtbCwgLnltbClcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gcmVzb2x2ZWQgcGF0aCB3b3VsZCBiZSBvdXRzaWRlIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogQ29tcHJlaGVuc2l2ZSBwYXRoIHZhbGlkYXRpb25cbiAgICAvLyBFbmhhbmNlZCB2YWxpZGF0aW9uIGluc3BpcmVkIGJ5IEplZXQgU2luZ2ggKEBqZWV0c2luZ2gwMDgpIC0gUFIgIzEwMzVcblxuICAgIC8vIEZpcnN0IG5vcm1hbGl6ZSB0aGUgcGF0aCB0byByZXNvbHZlIGFueSAuLyBvciAuLi8gc2VxdWVuY2VzXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcblxuICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0cyAtIGJvdGggaW4gb3JpZ2luYWwgYW5kIG5vcm1hbGl6ZWRcbiAgICAvLyBDaGVjayBib3RoIHRoZSBub3JtYWxpemVkIHBhdGggYW5kIHRoZSBvcmlnaW5hbCBmb3IgYW55IHRyYXZlcnNhbCBwYXR0ZXJuc1xuICAgIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKCcuLicpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcuLicpIHx8XG4gICAgICAgIHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkKSB8fFxuICAgICAgICBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci52YWxpZGF0ZUFuZFJlc29sdmVQYXRoJyxcbiAgICAgICAgZGV0YWlsczogYEJsb2NrZWQgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdDogJHtmaWxlUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmaWxlIHBhdGg6IFBhdGggdHJhdmVyc2FsIGRldGVjdGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBwcm9wZXIgZXh0ZW5zaW9uIC0gbWVtb3JpZXMgc2hvdWxkIG9ubHkgYmUgLnlhbWwgb3IgLnltbFxuICAgIGlmICghbm9ybWFsaXplZC5lbmRzV2l0aCgnLnlhbWwnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnltbCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBmaWxlcyBtdXN0IGhhdmUgLnlhbWwgb3IgLnltbCBleHRlbnNpb24nKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29uc3RydWN0IGZ1bGwgcGF0aFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsIG5vcm1hbGl6ZWQpO1xuICAgIFxuICAgIC8vIFZlcmlmeSBpdCdzIHdpdGhpbiBtZW1vcmllcyBkaXJlY3RvcnlcbiAgICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUodGhpcy5tZW1vcmllc0RpciwgZnVsbFBhdGgpO1xuICAgIGlmIChyZWxhdGl2ZS5zdGFydHNXaXRoKCcuLicpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBwYXRoIG11c3QgYmUgd2l0aGluIG1lbW9yaWVzIGRpcmVjdG9yeScpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZnVsbFBhdGg7XG4gIH1cbiAgXG4gIHByaXZhdGUgcGFyc2VNZW1vcnlGaWxlKHBhcnNlZDogUGFyc2VkTWVtb3J5RGF0YSk6IHsgbWV0YWRhdGE6IE1lbW9yeU1ldGFkYXRhOyBjb250ZW50OiBzdHJpbmcgfSB7XG4gICAgLy8gRklYOiBTZWN1cmVZYW1sUGFyc2VyIHJldHVybnMgZGF0YSBpbiAnZGF0YScgcHJvcGVydHksIG5vdCAnbWV0YWRhdGEnXG4gICAgLy8gRm9yIG1hcmtkb3duIGZpbGVzIHdpdGggWUFNTCBmcm9udG1hdHRlciwgdGhlIHN0cnVjdHVyZSBpczpcbiAgICAvLyBwYXJzZWQuZGF0YSA9IFlBTUwgZnJvbnRtYXR0ZXIgdmFsdWVzXG4gICAgLy8gcGFyc2VkLmNvbnRlbnQgPSBtYXJrZG93biBjb250ZW50IGFmdGVyIGZyb250bWF0dGVyXG5cbiAgICAvLyBGb3IgcHVyZSBZQU1MIG1lbW9yeSBmaWxlcywgd2UgbmVlZCB0byBjaGVjayBpZiBtZXRhZGF0YSBpcyBkaXJlY3RseSBpbiBkYXRhXG4gICAgY29uc3QgeWFtbERhdGEgPSBwYXJzZWQuZGF0YSB8fCB7fTtcblxuICAgIC8vIE1lbW9yeSBmaWxlcyBzYXZlZCBieSB0aGUgc3lzdGVtIGhhdmUgbWV0YWRhdGEgYXMgYSB0b3AtbGV2ZWwga2V5XG4gICAgY29uc3QgbWV0YWRhdGFTb3VyY2UgPSB5YW1sRGF0YS5tZXRhZGF0YSB8fCB5YW1sRGF0YTtcblxuICAgIC8vIEV4dHJhY3QgbWV0YWRhdGEgd2l0aCB2YWxpZGF0aW9uXG4gICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBCRUZPUkUgc2FuaXRpemF0aW9uIHRvIHByZXZlbnQgYnlwYXNzIGF0dGFja3NcbiAgICBjb25zdCBuYW1lSW5wdXQgPSBtZXRhZGF0YVNvdXJjZS5uYW1lIHx8ICdVbm5hbWVkIE1lbW9yeSc7XG4gICAgY29uc3QgbmFtZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KG5hbWVJbnB1dCwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICB9KTtcbiAgICBpZiAoIW5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1lbW9yeSBuYW1lOiAke25hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIEZJWDogTXVzdCBzcGVjaWZ5IGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJyB0byBhbGxvdyBwdW5jdHVhdGlvbiBsaWtlIGNvbG9ucywgc2VtaWNvbG9ucywgZXRjLlxuICAgIGxldCBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9ICcnO1xuICAgIGlmIChtZXRhZGF0YVNvdXJjZS5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgZGVzY1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KG1ldGFkYXRhU291cmNlLmRlc2NyaXB0aW9uLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgICAgICBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbidcbiAgICAgIH0pO1xuICAgICAgaWYgKCFkZXNjUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1lbW9yeSBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIHNhbml0aXplZERlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YWRhdGE6IE1lbW9yeU1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSEsXG4gICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YVNvdXJjZS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IG1ldGFkYXRhU291cmNlLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhU291cmNlLmNyZWF0ZWQsXG4gICAgICBtb2RpZmllZDogbWV0YWRhdGFTb3VyY2UubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFnczogQXJyYXkuaXNBcnJheShtZXRhZGF0YVNvdXJjZS50YWdzKSA/XG4gICAgICAgIG1ldGFkYXRhU291cmNlLnRhZ3MubWFwKCh0YWc6IHN0cmluZykgPT4gc2FuaXRpemVJbnB1dCh0YWcsIE1FTU9SWV9DT05TVEFOVFMuTUFYX1RBR19MRU5HVEgpKSA6XG4gICAgICAgIFtdLFxuICAgICAgLy8gRklYICMxMTI0OiBFeHRyYWN0IHRyaWdnZXJzIGZvciBFbmhhbmNlZCBJbmRleCBzdXBwb3J0XG4gICAgICAvLyBFbmhhbmNlZCB0cmlnZ2VyIHZhbGlkYXRpb24gbG9nZ2luZyBmb3IgSXNzdWUgIzExMzlcbiAgICAgIHRyaWdnZXJzOiBbXSwgIC8vIFdpbGwgYmUgc2V0IGJlbG93IHdpdGggZW5oYW5jZWQgbG9nZ2luZ1xuICAgICAgc3RvcmFnZUJhY2tlbmQ6IG1ldGFkYXRhU291cmNlLnN0b3JhZ2VfYmFja2VuZCB8fCBtZXRhZGF0YVNvdXJjZS5zdG9yYWdlQmFja2VuZCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfU1RPUkFHRV9CQUNLRU5ELFxuICAgICAgcmV0ZW50aW9uRGF5czogbWV0YWRhdGFTb3VyY2UucmV0ZW50aW9uX3BvbGljeT8uZGVmYXVsdCA/XG4gICAgICAgIHRoaXMucGFyc2VSZXRlbnRpb25EYXlzKG1ldGFkYXRhU291cmNlLnJldGVudGlvbl9wb2xpY3kuZGVmYXVsdCkgOlxuICAgICAgICAobWV0YWRhdGFTb3VyY2UucmV0ZW50aW9uRGF5cyB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUkVURU5USU9OX0RBWVMpLFxuICAgICAgcHJpdmFjeUxldmVsOiBtZXRhZGF0YVNvdXJjZS5wcml2YWN5X2xldmVsIHx8IG1ldGFkYXRhU291cmNlLnByaXZhY3lMZXZlbCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUFJJVkFDWV9MRVZFTCxcbiAgICAgIHNlYXJjaGFibGU6IG1ldGFkYXRhU291cmNlLnNlYXJjaGFibGUgIT09IGZhbHNlLFxuICAgICAgbWF4RW50cmllczogbWV0YWRhdGFTb3VyY2UubWF4RW50cmllcyB8fCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFQsXG4gICAgICAvLyBGSVggIzE0MzA6IEV4dHJhY3QgYXV0by1sb2FkIGNvbmZpZ3VyYXRpb25cbiAgICAgIGF1dG9Mb2FkOiBtZXRhZGF0YVNvdXJjZS5hdXRvTG9hZCxcbiAgICAgIHByaW9yaXR5OiBtZXRhZGF0YVNvdXJjZS5wcmlvcml0eSxcbiAgICAgIC8vIE1lbW9yeSB0eXBlIGNsYXNzaWZpY2F0aW9uXG4gICAgICBtZW1vcnlUeXBlOiBtZXRhZGF0YVNvdXJjZS5tZW1vcnlUeXBlLFxuICAgICAgLy8gSXNzdWUgIzUyNCDigJQgR2F0ZWtlZXBlciBwb2xpY3kgKGFsbCBlbGVtZW50IHR5cGVzKVxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KG1ldGFkYXRhU291cmNlLmdhdGVrZWVwZXIsIG5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWUgfHwgJ3Vua25vd24nLCAnbWVtb3J5JywgbWV0YWRhdGFTb3VyY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgIH07XG5cbiAgICAvLyBFbmhhbmNlZCB0cmlnZ2VyIHZhbGlkYXRpb24gYW5kIGxvZ2dpbmdcbiAgICAvLyBOT1RFOiBNZW1vcnkgdHJpZ2dlcnMgbWF5IGV2b2x2ZSB0byBzdXBwb3J0IGRhdGUgcGF0dGVybnMgKDIwMjQtUTMpLFxuICAgIC8vIHNlbWFudGljIG1hcmtlcnMgKHJlY2FsbC1jb250ZXh0KSwgb3IgbmF0dXJhbCBsYW5ndWFnZSBwaHJhc2VzLlxuICAgIC8vIEtlcHQgc2VwYXJhdGUgZnJvbSBTa2lsbHMgKHRlY2huaWNhbCkgYW5kIFBlcnNvbmFzIChjaGFyYWN0ZXIgbmFtZXMpLlxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhU291cmNlLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhU291cmNlLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5NRU1PUlksXG4gICAgICAgIG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nXG4gICAgICApO1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkVHJpZ2dlcnM7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBjb250ZW50IChpZiBhbnkpXG4gICAgY29uc3QgY29udGVudCA9IHBhcnNlZC5jb250ZW50IHx8ICcnO1xuXG4gICAgcmV0dXJuIHsgbWV0YWRhdGEsIGNvbnRlbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gcGFyc2UgcmV0ZW50aW9uIGRheXMgZnJvbSB2YXJpb3VzIGZvcm1hdHNcbiAgICovXG4gIHByaXZhdGUgcGFyc2VSZXRlbnRpb25EYXlzKHJldGVudGlvbjogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIHJldGVudGlvbiA9PT0gJ251bWJlcicpIHJldHVybiByZXRlbnRpb247XG4gICAgaWYgKHJldGVudGlvbiA9PT0gJ3Blcm1hbmVudCcgfHwgcmV0ZW50aW9uID09PSAncGVycGV0dWFsJykgcmV0dXJuIDk5OTk5OTtcbiAgICBjb25zdCByZWdleCA9IC8oXFxkKylcXHMqZGF5cz8vaTtcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMocmV0ZW50aW9uKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pIDogTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlIHRva2VucyBpbiBtZW1vcnkgY29udGVudCAocm91Z2ggYXBwcm94aW1hdGlvbilcbiAgICogVXNlcyAxIHRva2VuIOKJiCAwLjc1IHdvcmRzIGZvciBFbmdsaXNoIHRleHRcbiAgICogQHBhcmFtIGNvbnRlbnQgTWVtb3J5IGNvbnRlbnQgdG8gZXN0aW1hdGVcbiAgICogQHJldHVybnMgRXN0aW1hdGVkIHRva2VuIGNvdW50XG4gICAqL1xuICBwdWJsaWMgZXN0aW1hdGVUb2tlbnMoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIWNvbnRlbnQgfHwgdHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSByZXR1cm4gMDtcblxuICAgIC8vIFNpbXBsZSB3b3JkIGNvdW50IGFwcHJveGltYXRpb25cbiAgICBjb25zdCB3b3JkcyA9IGNvbnRlbnQudHJpbSgpLnNwbGl0KC9cXHMrLykubGVuZ3RoO1xuXG4gICAgLy8gMSB0b2tlbiDiiYggMC43NSB3b3JkcyAoY29uc2VydmF0aXZlIGVzdGltYXRlKVxuICAgIHJldHVybiBNYXRoLmNlaWwod29yZHMgLyAwLjc1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuZCBhY3RpdmF0ZSBhdXRvLWxvYWQgbWVtb3JpZXMgZHVyaW5nIHNlcnZlciBpbml0aWFsaXphdGlvblxuICAgKiBJc3N1ZSAjMTQzMDogQXV0by1sb2FkIGJhc2VsaW5lIG1lbW9yaWVzIGZlYXR1cmVcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IENvbnRhaW5lci5wcmVwYXJlUG9ydGZvbGlvKCkgZHVyaW5nIHNlcnZlciBzdGFydHVwXG4gICAqIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBtZW1vcmllcyBtYXJrZWQgd2l0aCBhdXRvTG9hZDogdHJ1ZVxuICAgKlxuICAgKiBBcmNoaXRlY3R1cmUgTm90ZTpcbiAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBESS1hbGlnbmVkIHBhdHRlcm4gd2hlcmUgbWFuYWdlcnMgb3duIGFsbCBvcGVyYXRpb25zXG4gICAqIGZvciB0aGVpciBlbGVtZW50IHR5cGUuIEF1dG8tbG9hZCBsb2dpYyBsaXZlcyBpbiBNZW1vcnlNYW5hZ2VyIChub3QgU2VydmVyU3RhcnR1cClcbiAgICogYmVjYXVzZSBNZW1vcnlNYW5hZ2VyIGFscmVhZHkgb3ducyBhbGwgbWVtb3J5IG9wZXJhdGlvbnMgKENSVUQsIGFjdGl2YXRpb24sIGV0Yy4pXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGF1dG8tbG9hZCBzdGF0aXN0aWNzXG4gICAqL1xuICBhc3luYyBsb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzKCk6IFByb21pc2U8e1xuICAgIGxvYWRlZDogbnVtYmVyO1xuICAgIHNraXBwZWQ6IG51bWJlcjtcbiAgICB0b3RhbFRva2VuczogbnVtYmVyO1xuICAgIGVycm9yczogc3RyaW5nW107XG4gIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBsb2FkZWQgPSAwO1xuICAgIGxldCBza2lwcGVkID0gMDtcbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBmb3IgZW1lcmdlbmN5IGRpc2FibGVcbiAgICAgIGNvbnN0IGVtZXJnZW5jeURpc2FibGVkID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQgPT09ICd0cnVlJztcbiAgICAgIGlmIChlbWVyZ2VuY3lEaXNhYmxlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnW01lbW9yeU1hbmFnZXJdIEF1dG8tbG9hZCBkaXNhYmxlZCB2aWEgRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQnKTtcbiAgICAgICAgLy8gS2VlcCBhcyBzZWN1cml0eSBldmVudCDigJQgZW1lcmdlbmN5IGRpc2FibGUgaXMgYSBub3RhYmxlIG9wZXJhdGlvbmFsIGRlY2lzaW9uXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIubG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcycsXG4gICAgICAgICAgZGV0YWlsczogJ0F1dG8tbG9hZCBtZW1vcmllcyBkaXNhYmxlZCB2aWEgZW1lcmdlbmN5IGVudmlyb25tZW50IHZhcmlhYmxlJyxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyByZWFzb246ICdET0xMSE9VU0VfRElTQUJMRV9BVVRPTE9BRD10cnVlJyB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBsb2FkZWQ6IDAsIHNraXBwZWQ6IDAsIHRvdGFsVG9rZW5zOiAwLCBlcnJvcnM6IFtdIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEluc3RhbGwgc2VlZCBtZW1vcmllcyBmaXJzdFxuICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsU2VlZE1lbW9yaWVzKCk7XG5cbiAgICAgIC8vIEdldCBhdXRvLWxvYWQgbWVtb3JpZXNcbiAgICAgIGNvbnN0IGF1dG9Mb2FkTWVtb3JpZXMgPSBhd2FpdCB0aGlzLmdldEF1dG9Mb2FkTWVtb3JpZXMoKTtcblxuICAgICAgaWYgKGF1dG9Mb2FkTWVtb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW01lbW9yeU1hbmFnZXJdIE5vIGF1dG8tbG9hZCBtZW1vcmllcyBjb25maWd1cmVkJyk7XG4gICAgICAgIHJldHVybiB7IGxvYWRlZDogMCwgc2tpcHBlZDogMCwgdG90YWxUb2tlbnM6IDAsIGVycm9yczogW10gfTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBGb3VuZCAke2F1dG9Mb2FkTWVtb3JpZXMubGVuZ3RofSBhdXRvLWxvYWQgbWVtb3JpZXNgKTtcblxuICAgICAgLy8gUHJvY2VzcyBlYWNoIGF1dG8tbG9hZCBtZW1vcnlcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIGF1dG9Mb2FkTWVtb3JpZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZW1vcnlOYW1lID0gbWVtb3J5Lm1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nO1xuXG4gICAgICAgICAgLy8gVmFsaWRhdGUgbWVtb3J5IGJlZm9yZSBsb2FkaW5nXG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IG1lbW9yeS52YWxpZGF0ZSgpO1xuICAgICAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBgVmFsaWRhdGlvbiBmYWlsZWQgZm9yICcke21lbW9yeU5hbWV9JzogJHt2YWxpZGF0aW9uLmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfWA7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChlcnJvck1zZyk7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFc3RpbWF0ZSB0b2tlbnNcbiAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRUb2tlbnMgPSB0aGlzLmVzdGltYXRlVG9rZW5zKG1lbW9yeS5jb250ZW50IHx8ICcnKTtcblxuICAgICAgICAgIC8vIEFjdGl2YXRlIHRoZSBtZW1vcnlcbiAgICAgICAgICAvLyBGSVggSXNzdWUgIzM1OiBBZGQgdG8gYWN0aXZlTWVtb3J5TmFtZXMgc2V0IHNvIGdldEFjdGl2ZU1lbW9yaWVzKCkgcmV0dXJucyBpdFxuICAgICAgICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuYWRkKG1lbW9yeU5hbWUpO1xuICAgICAgICAgIGF3YWl0IG1lbW9yeS5hY3RpdmF0ZSgpO1xuICAgICAgICAgIGxvYWRlZCsrO1xuICAgICAgICAgIHRvdGFsVG9rZW5zICs9IGVzdGltYXRlZFRva2VucztcblxuICAgICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gQXV0by1sb2FkZWQ6ICR7bWVtb3J5TmFtZX0gKH4ke2VzdGltYXRlZFRva2Vuc30gdG9rZW5zKWApO1xuXG4gICAgICAgICAgLy8gUm91dGluZSBhdXRvLWxvYWQg4oCUIGRlYnVnIG9ubHkgKHdhcyBmbG9vZGluZyBzZWN1cml0eSBidWZmZXIpXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gQXV0by1sb2FkZWQ6ICR7bWVtb3J5TmFtZX0gKH4ke2VzdGltYXRlZFRva2Vuc30gdG9rZW5zLCBwcmlvcml0eTogJHsobWVtb3J5Lm1ldGFkYXRhIGFzIGFueSkucHJpb3JpdHl9KWApO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgbWVtb3J5TmFtZSA9IG1lbW9yeS5tZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcbiAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGBGYWlsZWQgdG8gbG9hZCAnJHttZW1vcnlOYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWA7XG4gICAgICAgICAgZXJyb3JzLnB1c2goZXJyb3JNc2cpO1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbTWVtb3J5TWFuYWdlcl0gJHtlcnJvck1zZ31gKTtcbiAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbTWVtb3J5TWFuYWdlcl0gQXV0by1sb2FkIGNvbXBsZXRlOiAke2xvYWRlZH0gbWVtb3JpZXMgYWN0aXZhdGVkIGAgK1xuICAgICAgICBgKH4ke3RvdGFsVG9rZW5zfSB0b2tlbnMpLCAke3NraXBwZWR9IHNraXBwZWQsICR7ZXJyb3JzLmxlbmd0aH0gZXJyb3JzLCAke2VsYXBzZWRUaW1lfW1zYFxuICAgICAgKTtcblxuICAgICAgLy8gU3VtbWFyeSBldmVudCDigJQgZmlyZXMgb25jZSBwZXIgc3RhcnR1cCwga2VlcCBhcyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzJyxcbiAgICAgICAgZGV0YWlsczogYEF1dG8tbG9hZCBjb21wbGV0ZTogJHtsb2FkZWR9IGxvYWRlZCwgJHtza2lwcGVkfSBza2lwcGVkLCAke2Vycm9ycy5sZW5ndGh9IGVycm9yc2AsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgbG9hZGVkQ291bnQ6IGxvYWRlZCxcbiAgICAgICAgICBza2lwcGVkQ291bnQ6IHNraXBwZWQsXG4gICAgICAgICAgZXJyb3JDb3VudDogZXJyb3JzLmxlbmd0aCxcbiAgICAgICAgICB0b3RhbFRva2VucyxcbiAgICAgICAgICBsb2FkVGltZU1zOiBlbGFwc2VkVGltZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgbG9hZGVkLCBza2lwcGVkLCB0b3RhbFRva2VucywgZXJyb3JzIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG9uJ3QgZmFpbCBzdGFydHVwIGlmIGF1dG8tbG9hZCBmYWlscywgYnV0IHByb3ZpZGUgZGV0YWlsZWQgZGlhZ25vc3RpY3NcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lIDogJ1Vua25vd24nO1xuXG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBGYWlsZWQgdG8gbG9hZCBhdXRvLWxvYWQgbWVtb3JpZXMgKCR7ZXJyb3JUeXBlfSk6ICR7ZXJyb3JNZXNzYWdlfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIExvZyBmYWlsdXJlXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BRF9GQUlMRUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIubG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcycsXG4gICAgICAgIGRldGFpbHM6IGBBdXRvLWxvYWQgbWVtb3JpZXMgZmFpbGVkOiAke2Vycm9yVHlwZX0gLSAke2Vycm9yTWVzc2FnZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGVycm9yVHlwZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgbG9hZFRpbWVNczogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgbG9hZGVkOiAwLCBza2lwcGVkOiAwLCB0b3RhbFRva2VuczogMCwgZXJyb3JzOiBbZXJyb3JNZXNzYWdlXSB9O1xuICAgIH1cbiAgfVxufVxuIl19