@dollhousemcp/mcp-server 2.0.0-rc.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +2 -2
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +2 -2
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/constants/version.d.ts +0 -3
  230. package/dist/constants/version.d.ts.map +0 -1
  231. package/dist/constants/version.js +0 -4
  232. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  233. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  234. package/dist/logging/sinks/SSELogSink.js +0 -181
  235. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  236. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  237. package/dist/logging/viewer/viewerHtml.js +0 -204
  238. package/dist/web/public/public/app.js +0 -1878
@@ -74,6 +74,23 @@ export class BaseElementManager {
74
74
  * Keyed by relative file path for deduplication.
75
75
  */
76
76
  invalidElements = new Map();
77
+ /**
78
+ * Tracks file paths whose load failure has already been logged at error level.
79
+ * Repeated failures with the same reason are demoted to debug to avoid log flooding.
80
+ * Cleared when the file changes on disk or loads successfully.
81
+ */
82
+ suppressedLoadPaths = new Set();
83
+ /**
84
+ * Returns true if the most recent load() failure for this path was suppressed
85
+ * because it was a repeat of an already-logged error.
86
+ * Subclasses can use this to avoid duplicate security event logging.
87
+ *
88
+ * @param filePath - Relative file path within the element directory
89
+ * @returns Whether the error for this path is currently suppressed
90
+ */
91
+ isLoadErrorSuppressed(filePath) {
92
+ return this.suppressedLoadPaths.has(filePath);
93
+ }
77
94
  /**
78
95
  * Create a backup before overwriting an existing file.
79
96
  * Subclasses can override to no-op (e.g. MemoryManager has its own backup system).
@@ -231,6 +248,7 @@ export class BaseElementManager {
231
248
  this.cacheElement(element, relativePath);
232
249
  // Issue #708: Clear any previous invalid record on successful load
233
250
  this.invalidElements.delete(relativePath);
251
+ this.suppressedLoadPaths.delete(relativePath);
234
252
  logger.info(`${this.getElementLabelCapitalized()} loaded: ${element.metadata.name}`);
235
253
  this.eventDispatcher.emitAsync('element:load:success', this.createEventPayload({ correlationId, filePath: relativePath, element }));
236
254
  return element;
@@ -241,16 +259,26 @@ export class BaseElementManager {
241
259
  // Only track parse/validation errors — ENOENT means the file is genuinely
242
260
  // missing, not invalid, so we must not pollute the invalid map with it.
243
261
  const isFileNotFound = error.code === 'ENOENT';
262
+ let isRepeatError = false;
244
263
  if (!isFileNotFound) {
245
264
  const reason = error instanceof Error ? error.message : String(error);
265
+ const existing = this.invalidElements.get(relativePath);
266
+ isRepeatError = existing?.reason === reason;
246
267
  this.invalidElements.set(relativePath, {
247
268
  filePath: relativePath,
248
269
  reason,
249
- failedAt: new Date().toISOString(),
270
+ failedAt: isRepeatError ? existing.failedAt : new Date().toISOString(),
250
271
  });
251
272
  }
252
- this.eventDispatcher.emitAsync('element:load:error', this.createEventPayload({ correlationId, filePath: relativePath, error }));
253
- logger.error(`Failed to load ${this.getElementLabel()} from ${absolutePath}:`, error);
273
+ if (isRepeatError) {
274
+ this.suppressedLoadPaths.add(relativePath);
275
+ logger.debug(`Suppressed repeated load error for ${this.getElementLabel()} ${relativePath}`);
276
+ }
277
+ else {
278
+ this.suppressedLoadPaths.delete(relativePath);
279
+ this.eventDispatcher.emitAsync('element:load:error', this.createEventPayload({ correlationId, filePath: relativePath, error }));
280
+ logger.error(`Failed to load ${this.getElementLabel()} from ${absolutePath}:`, error);
281
+ }
254
282
  throw error;
255
283
  }
256
284
  }
@@ -447,9 +475,8 @@ export class BaseElementManager {
447
475
  // Cache miss — read from disk (populates cache for next time)
448
476
  return await this.load(file);
449
477
  }
450
- catch (err) {
451
- const errorMessage = err instanceof Error ? err.message : String(err);
452
- logger.error(`Failed to load ${this.getElementLabel()} ${file}: ${errorMessage}`);
478
+ catch {
479
+ // load() handles error logging with deduplication
453
480
  return null;
454
481
  }
455
482
  }));
@@ -782,6 +809,9 @@ export class BaseElementManager {
782
809
  handleExternalChange(relativePath) {
783
810
  this.uncacheByPath(relativePath);
784
811
  this.storageLayer.invalidate();
812
+ // Clear error suppression so a changed file gets fresh logging
813
+ this.invalidElements.delete(relativePath);
814
+ this.suppressedLoadPaths.delete(relativePath);
785
815
  const correlationId = randomUUID();
786
816
  this.eventDispatcher.emitAsync('element:external-change', this.createEventPayload({ correlationId, filePath: relativePath }));
787
817
  if (this.autoReloadOnExternalChange) {
@@ -864,6 +894,7 @@ export class BaseElementManager {
864
894
  this.filePathToId.clear();
865
895
  this.elementGenerations.clear();
866
896
  this.storageLayer.clear();
897
+ this.suppressedLoadPaths.clear();
867
898
  }
868
899
  /**
869
900
  * Get cache statistics for debugging
@@ -877,6 +908,15 @@ export class BaseElementManager {
877
908
  pathMappings: pathStats.size
878
909
  };
879
910
  }
911
+ /**
912
+ * Expose internal LRU cache instances for metrics collection.
913
+ */
914
+ getMetricsCaches() {
915
+ return [
916
+ { name: `elements:${this.elementType}`, instance: this.elements },
917
+ { name: `pathIndex:${this.elementType}`, instance: this.filePathToId },
918
+ ];
919
+ }
880
920
  /**
881
921
  * Dispose of resources and cleanup
882
922
  * Subclasses should override to add their own cleanup logic
@@ -971,4 +1011,4 @@ export class BaseElementManager {
971
1011
  return result.errors.map(e => ({ field: 'general', message: e }));
972
1012
  }
973
1013
  }
974
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3pCLE1BQU0sdUNBQXVDLENBQUM7QUFJL0MsTUFBTSw0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QWlCLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ2pFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLE9BQU8sR0FBRyxjQUFjLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQWdCRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBYSxFQUFFLE9BQWlCO1FBQ3JELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlRWxlbWVudE1hbmFnZXIgLSBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgZWxlbWVudCBtYW5hZ2Vyc1xuICpcbiAqIFByb3ZpZGVzIGNvbW1vbiBDUlVEIG9wZXJhdGlvbnMgZm9yIGFsbCBlbGVtZW50IHR5cGVzIHVzaW5nIHRoZVxuICogVGVtcGxhdGUgTWV0aG9kIFBhdHRlcm46XG4gKiAtIERlZmluZXMgdGhlIHNrZWxldG9uIG9mIG9wZXJhdGlvbnMgaW4gYmFzZSBjbGFzc1xuICogLSBMZXRzIHN1YmNsYXNzZXMgb3ZlcnJpZGUgc3BlY2lmaWMgc3RlcHMgd2l0aG91dCBjaGFuZ2luZyBzdHJ1Y3R1cmVcbiAqXG4gKiBTdWJjbGFzc2VzOiBTa2lsbE1hbmFnZXIsIFRlbXBsYXRlTWFuYWdlciwgQWdlbnRNYW5hZ2VyLCBNZW1vcnlNYW5hZ2VyXG4gKlxuICogU0VDVVJJVFk6XG4gKiAxLiBDUklUSUNBTDogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyByZWFkL3dyaXRlIG9wZXJhdGlvbnNcbiAqIDIuIEhJR0g6IFBhdGggdmFsaWRhdGlvbiBhbmQgc2FuaXRpemF0aW9uIHRvIHByZXZlbnQgdHJhdmVyc2FsIGF0dGFja3NcbiAqIDMuIE1FRElVTTogU2VjdXJpdHkgZXZlbnQgbG9nZ2luZyBmb3IgYXVkaXQgdHJhaWxcbiAqIDQuIE1FRElVTTogSW5wdXQgdmFsaWRhdGlvbiBhbmQgc2FuaXRpemF0aW9uIHRocm91Z2hvdXRcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgSUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IElFbGVtZW50LCBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0IH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuLi8uLi9jYWNoZS9MUlVDYWNoZS5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3BhdGhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRWxlbWVudEV2ZW50RGlzcGF0Y2hlciwgRWxlbWVudEV2ZW50UGF5bG9hZCB9IGZyb20gJy4uLy4uL2V2ZW50cy9FbGVtZW50RXZlbnREaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlIH0gZnJvbSAnLi9FbGVtZW50VHJhbnNhY3Rpb25TY29wZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgdHlwZSBFbGVtZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9FbGVtZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVsZW1lbnRTdG9yYWdlTGF5ZXIgfSBmcm9tICcuLi8uLi9zdG9yYWdlL0VsZW1lbnRTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudEluZGV4RW50cnkgfSBmcm9tICcuLi8uLi9zdG9yYWdlL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGdldFZhbGlkYXRlZFNjYW5Db29sZG93bixcbiAgZ2V0VmFsaWRhdGVkRWxlbWVudENhY2hlVFRMLFxuICBnZXRWYWxpZGF0ZWRQYXRoQ2FjaGVUVExcbn0gZnJvbSAnLi4vLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IENhY2hlTWVtb3J5QnVkZ2V0IH0gZnJvbSAnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnO1xuaW1wb3J0IHR5cGUgeyBCYWNrdXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcyc7XG5cbmNvbnN0IERFRkFVTFRfRUxFTUVOVF9DQUNIRV9UVExfTVMgPSBnZXRWYWxpZGF0ZWRFbGVtZW50Q2FjaGVUVEwoKTtcbmNvbnN0IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVMgPSBnZXRWYWxpZGF0ZWRQYXRoQ2FjaGVUVEwoKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zIHtcbiAgZWxlbWVudERpck92ZXJyaWRlPzogc3RyaW5nO1xuICBldmVudERpc3BhdGNoZXI/OiBFbGVtZW50RXZlbnREaXNwYXRjaGVyO1xuICBlbGVtZW50Q2FjaGVUVEw/OiBudW1iZXI7XG4gIHBhdGhDYWNoZVRUTD86IG51bWJlcjtcbiAgZW5hYmxlRmlsZVdhdGNoZXI/OiBib29sZWFuO1xuICBhdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZT86IGJvb2xlYW47XG4gIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlO1xuICBtZW1vcnlCdWRnZXQ/OiBDYWNoZU1lbW9yeUJ1ZGdldDtcbiAgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2U7XG59XG5cbi8qKlxuICogUmVjb3JkIG9mIGFuIGVsZW1lbnQgdGhhdCBmYWlsZWQgdG8gbG9hZCAoSXNzdWUgIzcwOCkuXG4gKiBTdG9yZWQgc28gY2FsbGVycyBjYW4gZGlzdGluZ3Vpc2ggXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGludmFsaWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkRWxlbWVudFJlY29yZCB7XG4gIC8qKiBSZWxhdGl2ZSBmaWxlIHBhdGggd2l0aGluIHRoZSBlbGVtZW50IGRpcmVjdG9yeS4gKi9cbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHJlYXNvbiB0aGUgZWxlbWVudCB3YXMgcmVqZWN0ZWQuICovXG4gIHJlYXNvbjogc3RyaW5nO1xuICAvKiogSVNPIHRpbWVzdGFtcCBvZiBsYXN0IGZhaWxlZCBsb2FkIGF0dGVtcHQuICovXG4gIGZhaWxlZEF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBpbXBsZW1lbnRpbmcgY29tbW9uIGVsZW1lbnQgbWFuYWdlbWVudCBvcGVyYXRpb25zXG4gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgbG9naWMgdmlhIGFic3RyYWN0IG1ldGhvZHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbGVtZW50TWFuYWdlcjxUIGV4dGVuZHMgSUVsZW1lbnQ+IGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPFQ+IHtcbiAgcHJvdGVjdGVkIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByb3RlY3RlZCBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcjtcbiAgcHJvdGVjdGVkIGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByb3RlY3RlZCBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZTtcbiAgcHJvdGVjdGVkIGVsZW1lbnREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKiBPYnRhaW5lZCBmcm9tIFZhbGlkYXRpb25SZWdpc3RyeSBkdXJpbmcgY29uc3RydWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdG9yOiBFbGVtZW50VmFsaWRhdG9yO1xuXG4gIC8vIFByaW1hcnkgY2FjaGU6IElEIOKGkiBFbGVtZW50ICh3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzKVxuICBwcm90ZWN0ZWQgZWxlbWVudHM6IExSVUNhY2hlPFQ+O1xuXG4gIC8vIFJldmVyc2UgaW5kZXg6IEFic29sdXRlIEZpbGVQYXRoIOKGkiBFbGVtZW50IElEICh3aXRoIHNpemUgbGltaXRzKVxuICBwcml2YXRlIGZpbGVQYXRoVG9JZDogTFJVQ2FjaGU8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50R2VuZXJhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIGNhY2hlR2VuZXJhdGlvbkNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHdhdGNoZXJDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudERpc3BhdGNoZXI6IEVsZW1lbnRFdmVudERpc3BhdGNoZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeUJ1ZGdldD86IENhY2hlTWVtb3J5QnVkZ2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2U7XG5cbiAgLyoqIE1hcCBwbHVyYWwgRWxlbWVudFR5cGUgZW51bSB2YWx1ZXMgdG8gc2luZ3VsYXIgQ29udGVudFZhbGlkYXRvciBjb250ZXh0LlxuICAgKiAgUGFydGlhbCBiZWNhdXNlIG5vdCBhbGwgZWxlbWVudCB0eXBlcyBoYXZlIGEgY29udGVudCBjb250ZXh0IChlLmcuLCBlbnNlbWJsZXMpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFTEVNRU5UX1RZUEVfVE9fQ09OVEVYVDogUGFydGlhbDxSZWNvcmQ8RWxlbWVudFR5cGUsICdwZXJzb25hJyB8ICdza2lsbCcgfCAndGVtcGxhdGUnIHwgJ2FnZW50JyB8ICdtZW1vcnknPj4gPSB7XG4gICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAncGVyc29uYScsXG4gICAgW0VsZW1lbnRUeXBlLlNLSUxMXTogJ3NraWxsJyxcbiAgICBbRWxlbWVudFR5cGUuVEVNUExBVEVdOiAndGVtcGxhdGUnLFxuICAgIFtFbGVtZW50VHlwZS5BR0VOVF06ICdhZ2VudCcsXG4gICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdtZW1vcnknLFxuICB9O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdG9yYWdlTGF5ZXI6IElTdG9yYWdlTGF5ZXI7XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IEVsZW1lbnRzIHRoYXQgZXhpc3Qgb24gZGlzayBidXQgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIEtleWVkIGJ5IHJlbGF0aXZlIGZpbGUgcGF0aCBmb3IgZGVkdXBsaWNhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW52YWxpZEVsZW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEludmFsaWRFbGVtZW50UmVjb3JkPigpO1xuXG4gIHByb3RlY3RlZCBhZnRlckxvYWQ/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYmVmb3JlU2F2ZT8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBhZnRlclNhdmU/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgZmluZEJ5SWRlbnRpZmllcj8oaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgcHJvdGVjdGVkIGNhbkRlbGV0ZT8oZWxlbWVudDogVCk6IFByb21pc2U8eyBhbGxvd2VkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZS5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gbm8tb3AgKGUuZy4gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgZGVsZXRpbmcgYSBmaWxlIChtb3ZlcyBmaWxlIHRvIGJhY2t1cCBkaXIpLlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9yaWdpbmFsIGZpbGUgd2FzIG1vdmVkIChjYWxsZXIgc2hvdWxkIHNraXAgZGVsZXRlRmlsZSkuXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIG5vLW9wIChlLmcuIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuICEhcmVzdWx0Lm1vdmVkT3JpZ2luYWw7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBkaXNwYXRjaGVyIGZvciBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBlbWl0IGN1c3RvbSBldmVudHMuXG4gICAqXG4gICAqIEJhc2VFbGVtZW50TWFuYWdlciBoYW5kbGVzIHN0YW5kYXJkIGxpZmVjeWNsZSBldmVudHMgKGxvYWQsIHNhdmUsIGRlbGV0ZSkgYXV0b21hdGljYWxseS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgdXNlIHRoaXMgZ2V0dGVyIG9ubHkgd2hlbiB0aGV5IG5lZWQgdG8gZW1pdCBhZGRpdGlvbmFsIGRvbWFpbi1zcGVjaWZpY1xuICAgKiBldmVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIENSVUQgbGlmZWN5Y2xlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBQZXJzb25hTWFuYWdlciBlbWl0cyBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBldmVudHNcbiAgICogdGhpcy5kaXNwYXRjaGVyLmVtaXQoJ2VsZW1lbnQ6YWN0aXZhdGUnLCB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7Li4ufSkpO1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgRWxlbWVudEV2ZW50RGlzcGF0Y2hlciBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgbWFuYWdlclxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkaXNwYXRjaGVyKCk6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmV2ZW50RGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8vIENhY2hlIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUgPSAxMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUEFUSF9DQUNIRV9TSVpFID0gMTAwMDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgLSBpbml0aWFsaXplcyBjb21tb24gZGVwZW5kZW5jaWVzXG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBtYW5hZ2VyIGhhbmRsZXNcbiAgICogQHBhcmFtIHBvcnRmb2xpb01hbmFnZXIgLSBQb3J0Zm9saW8gbWFuYWdlciBmb3IgZGlyZWN0b3J5IHJlc29sdXRpb25cbiAgICogQHBhcmFtIGZpbGVMb2NrTWFuYWdlciAtIEZpbGUgbG9jayBtYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgZmlsZVdhdGNoU2VydmljZVxuICAgKiBAcGFyYW0gZmlsZU9wZXJhdGlvbnNTZXJ2aWNlIC0gU2VydmljZSBmb3IgZmlsZSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uUmVnaXN0cnkgLSBSZWdpc3RyeSBmb3Igb2J0YWluaW5nIHR5cGUtc3BlY2lmaWMgdmFsaWRhdG9yc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgb3B0aW9uczogQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyA9IHt9LFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5XG4gICkge1xuICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBwb3J0Zm9saW9NYW5hZ2VyO1xuICAgIHRoaXMuZmlsZUxvY2tNYW5hZ2VyID0gZmlsZUxvY2tNYW5hZ2VyO1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gICAgdGhpcy5maWxlV2F0Y2hTZXJ2aWNlID0gb3B0aW9ucy5maWxlV2F0Y2hTZXJ2aWNlO1xuICAgIHRoaXMuYmFja3VwU2VydmljZSA9IG9wdGlvbnMuYmFja3VwU2VydmljZTtcblxuICAgIC8vIEdldCB0aGUgc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRvcihlbGVtZW50VHlwZSk7XG5cbiAgICBjb25zdCBlbGVtZW50Q2FjaGVUVEwgPSBvcHRpb25zLmVsZW1lbnRDYWNoZVRUTCA/PyBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TO1xuICAgIGNvbnN0IHBhdGhDYWNoZVRUTCA9IG9wdGlvbnMucGF0aENhY2hlVFRMID8/IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVM7XG4gICAgdGhpcy5tZW1vcnlCdWRnZXQgPSBvcHRpb25zLm1lbW9yeUJ1ZGdldDtcblxuICAgIGNvbnN0IG9uU2V0Q2FsbGJhY2sgPSB0aGlzLm1lbW9yeUJ1ZGdldFxuICAgICAgPyAoKSA9PiB0aGlzLm1lbW9yeUJ1ZGdldCEuZW5mb3JjZSgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEluaXRpYWxpemUgTFJVIGNhY2hlcyB3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgdGhpcy5lbGVtZW50cyA9IG5ldyBMUlVDYWNoZTxUPih7XG4gICAgICBuYW1lOiBgZWxlbWVudHM6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogNTAsIC8vIE1heCA1ME1CIGZvciBlbGVtZW50IGNhY2hlXG4gICAgICB0dGxNczogZWxlbWVudENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVQYXRoVG9JZCA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICAgIG5hbWU6IGBwYXRoSW5kZXg6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9QQVRIX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogMTAsIC8vIE1heCAxME1CIGZvciBwYXRoIG1hcHBpbmdzXG4gICAgICB0dGxNczogcGF0aENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjYWNoZXMgd2l0aCBnbG9iYWwgbWVtb3J5IGJ1ZGdldFxuICAgIGlmICh0aGlzLm1lbW9yeUJ1ZGdldCkge1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC5yZWdpc3Rlcih0aGlzLmZpbGVQYXRoVG9JZCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudERpck92ZXJyaWRlKSB7XG4gICAgICB0aGlzLmVsZW1lbnREaXIgPSBvcHRpb25zLmVsZW1lbnREaXJPdmVycmlkZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAodGhpcy5wb3J0Zm9saW9NYW5hZ2VyIGFzIGFueSkuZ2V0RWxlbWVudERpciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5lbGVtZW50RGlyID0gKHRoaXMucG9ydGZvbGlvTWFuYWdlciBhcyBhbnkpLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gcmVzb2x2ZSBlbGVtZW50IGRpcmVjdG9yeSBmb3IgJHtlbGVtZW50VHlwZX0uIGAgK1xuICAgICAgICAnUHJvdmlkZSBhbiBlbGVtZW50RGlyT3ZlcnJpZGUgd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgbWFuYWdlci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gb3B0aW9ucy5ldmVudERpc3BhdGNoZXIgPz8gRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5nZXRTaGFyZWREaXNwYXRjaGVyKCk7XG4gICAgdGhpcy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSA9XG4gICAgICBvcHRpb25zLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlID8/IHByb2Nlc3MuZW52LkFVVE9fUkVMT0FEX09OX0VYVEVSTkFMX0NIQU5HRSA9PT0gJ3RydWUnO1xuXG4gICAgY29uc3QgZW5hYmxlV2F0Y2hlciA9IG9wdGlvbnMuZW5hYmxlRmlsZVdhdGNoZXIgPz8gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VOQUJMRV9GSUxFX1dBVENIRVIgPT09ICd0cnVlJztcbiAgICBpZiAoZW5hYmxlV2F0Y2hlciAmJiB0aGlzLmZpbGVXYXRjaFNlcnZpY2UpIHtcbiAgICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB0aGlzLmZpbGVXYXRjaFNlcnZpY2Uud2F0Y2hEaXJlY3RvcnkoXG4gICAgICAgIHRoaXMuZWxlbWVudERpcixcbiAgICAgICAgKHJlbGF0aXZlUGF0aCkgPT4gdGhpcy5oYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZUxheWVyID0gdGhpcy5jcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIHN0b3JhZ2UgbGF5ZXIuXG4gICAqIERlZmF1bHQgcmV0dXJucyBFbGVtZW50U3RvcmFnZUxheWVyIGZvciAubWQgZWxlbWVudHMuXG4gICAqIFN1YmNsYXNzZXMgKGUuZy4gTWVtb3J5TWFuYWdlcikgY2FuIG92ZXJyaWRlIHRvIHJldHVybiBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpOiBJU3RvcmFnZUxheWVyIHtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnRTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB7XG4gICAgICBlbGVtZW50RGlyOiB0aGlzLmVsZW1lbnREaXIsXG4gICAgICBmaWxlRXh0ZW5zaW9uOiB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSxcbiAgICAgIHNjYW5Db29sZG93bk1zOiBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24oKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5ndWxhciBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBlbGVtZW50IHR5cGUgKGUuZy4sIFwic2tpbGxcIiwgXCJwZXJzb25hXCIpLlxuICAgKiBVc2VkIGluIGZpbGVuYW1lIGdlbmVyYXRpb24gKHtuYW1lfS17bGFiZWx9Lm1kKSBhbmQgZGlzcGxheSBzdHJpbmdzLlxuICAgKiBNdXN0IHJldHVybiB0aGUgc2luZ3VsYXIgZm9ybSDigJQgbm90IHRoZSBwbHVyYWwgRWxlbWVudFR5cGUgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhcGl0YWxpemVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQgbGFiZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0RWxlbWVudExhYmVsKCk7XG4gICAgcmV0dXJuIGxhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbGFiZWwuc2xpY2UoMSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBlbGVtZW50IGZyb20gZmlsZVxuICAgKiBURU1QTEFURSBNRVRIT0Q6IERlZmluZXMgdGhlIGFsZ29yaXRobSwgc3ViY2xhc3NlcyBjdXN0b21pemUgc3RlcHNcbiAgICpcbiAgICogU0VDVVJJVFkgRklYRVMgKGluaGVyaXRlZCBmcm9tIG9yaWdpbmFsIG1hbmFnZXJzKTpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIHByZXZlbnRzIHJhY2UgY29uZGl0aW9uc1xuICAgKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gICAqL1xuICBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpsb2FkOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZGBcbiAgICAgIH0pO1xuICAgICAgLy8gSXNzdWUgIzgxMDogUGFzcyBlbGVtZW50IHR5cGUgYXMgY29udGVudENvbnRleHQgc28gU2VjdXJlWWFtbFBhcnNlciBleGVtcHRzXG4gICAgICAvLyBsZWdpdGltYXRlIHBhdHRlcm5zIChlLmcuLCA8c2NyaXB0PiBzZWN0aW9uIHRhZ3MgaW4gdGVtcGxhdGVzKVxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBpZiAoIWNvbnRlbnRDb250ZXh0KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gTm8gY29udGVudENvbnRleHQgbWFwcGluZyBmb3IgZWxlbWVudFR5cGUgJyR7dGhpcy5lbGVtZW50VHlwZX0nIOKAlCBwYXJzaW5nIHdpdGhvdXQgY29udGV4dCBleGVtcHRpb25zLiBBdmFpbGFibGU6ICR7T2JqZWN0LmtleXMoQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUKS5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGNvbnRlbnQsIHVuZGVmaW5lZCwgeyBjb250ZW50Q29udGV4dCB9KTtcblxuICAgICAgLy8gSXNzdWUgIzY5NTogRmlsbCBpbiBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gICAgICAvLyBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHNvIG9sZGVyIGVsZW1lbnRzIHdpdGggc3BhcnNlIGZyb250bWF0dGVyXG4gICAgICAvLyBkb24ndCBnZXQgcmVqZWN0ZWQuXG4gICAgICB0aGlzLm1pZ3JhdGVNZXRhZGF0YURlZmF1bHRzKHBhcnNlZC5kYXRhLCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyTG9hZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyTG9hZChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBJc3N1ZSAjNzA4OiBDbGVhciBhbnkgcHJldmlvdXMgaW52YWxpZCByZWNvcmQgb24gc3VjY2Vzc2Z1bCBsb2FkXG4gICAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBsb2FkZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmxvYWQ6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElzc3VlICM3MDg6IFJlY29yZCB0aGUgZmFpbHVyZSBzbyBjYWxsZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgLy8gXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGV4aXN0cyBidXQgZmFpbGVkIHZhbGlkYXRpb25cIi5cbiAgICAgIC8vIE9ubHkgdHJhY2sgcGFyc2UvdmFsaWRhdGlvbiBlcnJvcnMg4oCUIEVOT0VOVCBtZWFucyB0aGUgZmlsZSBpcyBnZW51aW5lbHlcbiAgICAgIC8vIG1pc3NpbmcsIG5vdCBpbnZhbGlkLCBzbyB3ZSBtdXN0IG5vdCBwb2xsdXRlIHRoZSBpbnZhbGlkIG1hcCB3aXRoIGl0LlxuICAgICAgY29uc3QgaXNGaWxlTm90Rm91bmQgPSAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJztcbiAgICAgIGlmICghaXNGaWxlTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICB0aGlzLmludmFsaWRFbGVtZW50cy5zZXQocmVsYXRpdmVQYXRoLCB7XG4gICAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgZmFpbGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6bG9hZDplcnJvcicsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZXJyb3IgfSlcbiAgICAgICk7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gZnJvbSAke2Fic29sdXRlUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM2OTU6IFByZS1maWxsIG1pc3NpbmcgbWV0YWRhdGEgZmllbGRzIHdpdGggc2Vuc2libGUgZGVmYXVsdHNcbiAgICogYmVmb3JlIHBhcnNlTWV0YWRhdGEoKSBydW5zLiBUaGlzIGltcGxlbWVudHMgdGhlIFwidG9sZXJhbnQgcmVhZGVyXCIgcGF0dGVyblxuICAgKiDigJQgc3RyaWN0IG9uIG91dHB1dCwgbGVuaWVudCBvbiBpbnB1dCBmb3Igb2xkZXIvc3BhcnNlIGZyb250bWF0dGVyLlxuICAgKlxuICAgKiBNdXRhdGVzIGBkYXRhYCBpbiBwbGFjZS4gTG9ncyBhIHdhcm5pbmcgZm9yIGVhY2ggZGVmYXVsdGVkIGZpZWxkIHNvXG4gICAqIG9wZXJhdG9ycyBrbm93IHdoaWNoIGZpbGVzIG5lZWQgdXBkYXRpbmcuXG4gICAqL1xuICBwcml2YXRlIG1pZ3JhdGVNZXRhZGF0YURlZmF1bHRzKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWlncmF0ZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBJbmZlciB0eXBlIGZyb20gdGhpcyBtYW5hZ2VyJ3MgZWxlbWVudCB0eXBlXG4gICAgaWYgKCFkYXRhLnR5cGUpIHtcbiAgICAgIC8vIEVsZW1lbnRUeXBlIGlzIHBsdXJhbCAoJ3BlcnNvbmFzJywgJ3NraWxscycsIGV0Yy4pXG4gICAgICAvLyBTb21lIG1hbmFnZXJzIGV4cGVjdCBzaW5ndWxhciAoJ3BlcnNvbmEnLCAnYWdlbnQnKSwgc29tZSBwbHVyYWwuXG4gICAgICAvLyBTZXQgdGhlIHBsdXJhbCBmb3JtIOKAlCBwYXJzZU1ldGFkYXRhKCkgaGFuZGxlcyBub3JtYWxpemF0aW9uLlxuICAgICAgZGF0YS50eXBlID0gdGhpcy5lbGVtZW50VHlwZTtcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ3R5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBJbmZlciBuYW1lIGZyb20gZmlsZW5hbWUgKHN0cmlwIGV4dGVuc2lvbiwgdW4tc2x1Z2lmeSlcbiAgICBpZiAoIWRhdGEubmFtZSkge1xuICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSk7XG4gICAgICBkYXRhLm5hbWUgPSBiYXNlbmFtZTtcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ25hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHZlcnNpb25cbiAgICBpZiAoIWRhdGEudmVyc2lvbikge1xuICAgICAgZGF0YS52ZXJzaW9uID0gJzEuMC4wJztcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ3ZlcnNpb24nKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGF1dGhvclxuICAgIGlmICghZGF0YS5hdXRob3IpIHtcbiAgICAgIGRhdGEuYXV0aG9yID0gJ3Vua25vd24nO1xuICAgICAgbWlncmF0ZWQucHVzaCgnYXV0aG9yJyk7XG4gICAgfVxuXG4gICAgaWYgKG1pZ3JhdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgW1RvbGVyYW50UmVhZGVyXSAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gXCIke2ZpbGVQYXRofVwiOiBgICtcbiAgICAgICAgYGRlZmF1bHRlZCBtaXNzaW5nIGZpZWxkczogJHttaWdyYXRlZC5qb2luKCcsICcpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IFJldHVybnMgZWxlbWVudHMgdGhhdCBleGlzdCBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogQ2FsbGVycyBjYW4gdXNlIHRoaXMgdG8gcmVwb3J0IGludmFsaWQgZWxlbWVudHMgaW5zdGVhZCBvZiBzaWxlbnRseSBoaWRpbmcgdGhlbS5cbiAgICovXG4gIGdldEludmFsaWRFbGVtZW50cygpOiBJbnZhbGlkRWxlbWVudFJlY29yZFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuaW52YWxpZEVsZW1lbnRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBDaGVjayBpZiBhIHNwZWNpZmljIGZpbGUgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIFVzZWQgYnkgZ2V0X2VsZW1lbnQgdG8gZGlzdGluZ3Vpc2ggXCJub3QgZm91bmRcIiBmcm9tIFwiaW52YWxpZFwiLlxuICAgKi9cbiAgZ2V0SW52YWxpZEVsZW1lbnQobmFtZTogc3RyaW5nKTogSW52YWxpZEVsZW1lbnRSZWNvcmQgfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGJ5IGV4YWN0IHBhdGggbWF0Y2ggYW5kIGJ5IG5hbWUtYmFzZWQgbWF0Y2hcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgcmVjb3JkXSBvZiB0aGlzLmludmFsaWRFbGVtZW50cykge1xuICAgICAgaWYgKGZpbGVQYXRoID09PSBuYW1lKSByZXR1cm4gcmVjb3JkO1xuICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSk7XG4gICAgICBpZiAoYmFzZW5hbWUgPT09IG5hbWUgfHwgdGhpcy5ub3JtYWxpemVGaWxlbmFtZShiYXNlbmFtZSkgPT09IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFuIGVsZW1lbnQgdG8gZmlsZVxuICAgKiBURU1QTEFURSBNRVRIT0Q6IENvbW1vbiBzYXZlIGxvZ2ljIHdpdGggaG9va3MgZm9yIGN1c3RvbWl6YXRpb25cbiAgICpcbiAgICogU0VDVVJJVFkgRklYRVM6XG4gICAqIC0gdGhpcy5maWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKCkgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqIC0gUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgdHJhdmVyc2FsIGF0dGFja3NcbiAgICogLSBTZWN1cml0eSBldmVudCBsb2dnaW5nXG4gICAqL1xuICBhc3luYyBzYXZlKGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSh0aGlzLmdldEVsZW1lbnRMYWJlbCgpLCBjb3JyZWxhdGlvbklkKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0VESVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uc2F2ZWAsXG4gICAgICBkZXRhaWxzOiBgU2F2aW5nICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX06ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfSB2JHtlbGVtZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmdldEVsZW1lbnRMYWJlbCgpLFxuICAgICAgICBhdXRob3I6IGVsZW1lbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB2ZXJzaW9uOiBlbGVtZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6c2F2ZTpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQgfSlcbiAgICApO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkQ29tbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZChyZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCk7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OnNhdmU6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZFJvbGxiYWNrKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpzYXZlOmVycm9yJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50LCBlcnJvciB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5iZWZvcmVTYXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYmVmb3JlU2F2ZShlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKSk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEJlZm9yZVNhdmUoYWJzb2x1dGVQYXRoKTtcblxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgLy8gRml4ICM5MDg6IFZhbGlkYXRlIHNlcmlhbGl6ZWQgY29udGVudCBiZWZvcmUgd3JpdGluZyAoc3ltbWV0cmljIHdpdGggcmVhZCBwYXRoKS5cbiAgICAgIC8vIFJlYWQgcGF0aCB2YWxpZGF0ZXMgdmlhIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSDihpIgQ29udGVudFZhbGlkYXRvcjsgd3JpdGUgcGF0aFxuICAgICAgLy8gbXVzdCBhcHBseSB0aGUgc2FtZSBjaGVja3MgdG8gcHJldmVudCBzYXZpbmcgY29udGVudCB0aGF0IHdvdWxkIGZhaWwgdG8gbG9hZC5cbiAgICAgIHRoaXMudmFsaWRhdGVTZXJpYWxpemVkQ29udGVudChjb250ZW50KTtcblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoYWJzb2x1dGVQYXRoLCBjb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAodGhpcy5hZnRlclNhdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlclNhdmUoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gc2F2ZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNlcmlhbGl6ZWQgZWxlbWVudCBjb250ZW50IGJlZm9yZSB3cml0aW5nIHRvIGRpc2suXG4gICAqIEZpeCAjOTA4OiBNaXJyb3JzIHRoZSByZWFkLXBhdGggdmFsaWRhdGlvbiBmcm9tIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKVxuICAgKiB0byBlbnN1cmUgd3JpdGUg4oaSIHJlYWQgc3ltbWV0cnkuIENvbnRlbnQgdGhhdCBmYWlscyB0aGlzIGNoZWNrIHdvdWxkIGFsc29cbiAgICogZmFpbCB0byBsb2FkLCBzbyByZWplY3RpbmcgaXQgb24gd3JpdGUgcHJldmVudHMgcGVybWFuZW50bHkgYnJva2VuIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudCAoU29uYXJDbG91ZCBTNjU5NDogdXNlIFJlZ0V4cC5leGVjKVxuICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLztcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gZnJvbnRtYXR0ZXJSZWdleC5leGVjKGNvbnRlbnQpO1xuXG4gICAgaWYgKGZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gZnJvbnRtYXR0ZXJNYXRjaFsxXTtcbiAgICAgIGNvbnN0IGJvZHlDb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoZnJvbnRtYXR0ZXJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAvLyBZQU1MIGJvbWIgZGV0ZWN0aW9uIChtaXJyb3JzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSBzdGVwIDQpLlxuICAgICAgLy8gT25seSBydW4gd2hlbiBZQU1MIGlzIHVuZGVyIE1BWF9ZQU1MX0xFTkdUSCAoNjRLQikg4oCUIHRoZSBzYW1lIGxpbWl0XG4gICAgICAvLyB1c2VkIGJ5IHRoZSByZWFkIHBhdGggaW4gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpLiB2YWxpZGF0ZVlhbWxDb250ZW50KClcbiAgICAgIC8vIGluY2x1ZGVzIGl0cyBvd24gc2l6ZSBjaGVjayBpbnRlcm5hbGx5LCBhbmQgd2UgaW50ZW50aW9uYWxseSBza2lwIHNpemVcbiAgICAgIC8vIGVuZm9yY2VtZW50IG9uIHRoZSB3cml0ZSBwYXRoIGJlY2F1c2UgdGhlIHNlcmlhbGl6ZXIgbWF5IHByb2R1Y2UgbGFyZ2VcbiAgICAgIC8vIGZyb250bWF0dGVyIGZvciBlbGVtZW50cyB3aXRoIGxvbmcgaW5zdHJ1Y3Rpb25zLiBUaGUgcmVhZCBwYXRoIHdpbGxcbiAgICAgIC8vIHJlamVjdCBvdmVyc2l6ZWQgWUFNTCBvbiB0aGUgbmV4dCBsb2FkIGlmIG5lZWRlZC5cbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPD0gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50YCxcbiAgICAgICAgICAgIGRldGFpbHM6IGBNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuIGRldGVjdGVkIGluIHNlcmlhbGl6ZWQgb3V0cHV0IGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IHlhbWxMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aCB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgICBgU2VyaWFsaXplZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IGNvbnRhaW5zIG1hbGljaW91cyBZQU1MIHBhdHRlcm5zIOKAlCB3cml0ZSBibG9ja2VkLiBgICtcbiAgICAgICAgICAgIGBSZXZpZXcgdGhlIGVsZW1lbnQncyBtZXRhZGF0YSBhbmQgaW5zdHJ1Y3Rpb25zIGZvciBzdXNwaWNpb3VzIGFuY2hvci9hbGlhcyBwYXR0ZXJucy5gLFxuICAgICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQm9keSBjb250ZW50IHZhbGlkYXRpb24gd2l0aCBlbGVtZW50IHR5cGUgY29udGV4dFxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBjb25zdCBib2R5VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShib2R5Q29udGVudCwge1xuICAgICAgICBjb250ZW50Q29udGV4dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5VmFsaWRhdGlvbi5pc1ZhbGlkICYmIGJvZHlWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICAgIGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBib2R5IGNvbnRlbnQ6ICR7Ym9keVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgICdjcml0aWNhbCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgYXZhaWxhYmxlIGVsZW1lbnRzXG4gICAqIFNFQ1VSSVRZOiBVc2VzIFBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKCkgd2hpY2ggZmlsdGVycyB0ZXN0IGVsZW1lbnRzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8VFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBTY2FuIGZvciBjaGFuZ2VzIOKAlCBwb3B1bGF0ZXMgaW5kZXggZm9yIGxpc3RTdW1tYXJpZXMoKS9maW5kQnlOYW1lKClcbiAgICAgIC8vIE5vbi1mYXRhbDogc2NhbiBmYWlsdXJlIG11c3QgbmV2ZXIgcHJldmVudCBsaXN0KCkgZnJvbSByZXR1cm5pbmcgcmVzdWx0c1xuICAgICAgLy8gRXZpY3Qgc3RhbGUgY2FjaGUgZW50cmllcyBzbyB0aGUgY2FjaGUgY2hlY2sgYmVsb3cgbmV2ZXIgcmV0dXJucyBvdXRkYXRlZCBkYXRhXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuc2NhbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgWy4uLmRpZmYubW9kaWZpZWQsIC4uLmRpZmYucmVtb3ZlZF0pIHtcbiAgICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNQYXRoKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHsgLyogaW5kZXggdW5hdmFpbGFibGUsIGxpc3QoKSBjb250aW51ZXMgd2l0aG91dCBjYWNoZSBvcHRpbWl6YXRpb24gKi8gfVxuXG4gICAgICAvLyBVc2UgUG9ydGZvbGlvTWFuYWdlciBmb3IgYXV0aG9yaXRhdGl2ZSBmaWxlIGxpc3QgKyBzZWN1cml0eSBmaWx0ZXJpbmdcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyh0aGlzLmVsZW1lbnRUeXBlKTtcblxuICAgICAgLy8gTG9hZCBhbGwgZWxlbWVudHMgaW4gcGFyYWxsZWwsIGNoZWNraW5nIGNhY2hlIGJlZm9yZSBkaXNrXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgKGF2b2lkcyBkaXNrIHJlYWQgaWYgZWxlbWVudCBpcyBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgICAgICAgLy8gQ2FjaGUgbWlzcyDigJQgcmVhZCBmcm9tIGRpc2sgKHBvcHVsYXRlcyBjYWNoZSBmb3IgbmV4dCB0aW1lKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSAke2ZpbGV9OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIEZpbHRlciBvdXQgZmFpbGVkIGxvYWRzIGFuZCByZXR1cm5cbiAgICAgIHJldHVybiBlbGVtZW50cy5maWx0ZXIoKGUpOiBlIGlzIEF3YWl0ZWQ8VD4gPT4gZSAhPT0gbnVsbCkgYXMgVFtdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgJHtsYWJlbH1zIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCB5ZXQsIHJldHVybmluZyBlbXB0eSBhcnJheWApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsaXN0ICR7dGhpcy5lbGVtZW50VHlwZX1zOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBsaWdodHdlaWdodCBtZXRhZGF0YSBzdW1tYXJpZXMgd2l0aG91dCBsb2FkaW5nIGZ1bGwgZWxlbWVudHMuXG4gICAqIFVzZWZ1bCB3aGVuIG9ubHkgbmFtZXMvZGVzY3JpcHRpb25zL3RhZ3MgYXJlIG5lZWRlZC5cbiAgICovXG4gIGFzeW5jIGxpc3RTdW1tYXJpZXMoKTogUHJvbWlzZTxFbGVtZW50SW5kZXhFbnRyeVtdPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlTGF5ZXIubGlzdFN1bW1hcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmQocHJlZGljYXRlOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8VFtdPiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBlbGVtZW50IGJ5IG5hbWUgb3IgSUQgd2l0aG91dCBsb2FkaW5nIGFsbCBlbGVtZW50c1xuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBmb3IgYWN0aXZhdGlvbiBmbG93XG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFuIG9wdGltaXplZCBsb29rdXAgdGhhdCB0cmllcyBjYWNoZSBmaXJzdCwgdGhlblxuICAgKiBhdHRlbXB0cyBkaXJlY3QgZmlsZSBhY2Nlc3MgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBmdWxsIGxpc3QoKSBzY2FuLlxuICAgKiBUaGlzIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gbGlzdCgpIGZvciBsYXJnZSBwb3J0Zm9saW9zLlxuICAgKlxuICAgKiBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVFM6XG4gICAqIDEuIENhY2hlIGxvb2t1cCAtIE8oMSkgaWYgZWxlbWVudCB3YXMgcHJldmlvdXNseSBsb2FkZWRcbiAgICogMi4gRGlyZWN0IGZpbGUgYWNjZXNzIC0gTygxKSBmb3IgbmFtZS1iYXNlZCBsb29rdXBzXG4gICAqIDMuIEZ1bGwgc2NhbiBmYWxsYmFjayAtIE8obikgb25seSBpZiBhYm92ZSBtZXRob2RzIGZhaWxcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbGVtZW50IG5hbWUgb3IgSUQgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBFbGVtZW50IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBhc3luYyBmaW5kQnlOYW1lKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEZpcnN0LCB0cnkgZmluZGluZyBpbiBjYWNoZSBieSBpdGVyYXRpbmcgY2FjaGVkIGVsZW1lbnRzXG4gICAgLy8gVGhpcyBpcyBmYXN0IChPKGNhY2hlIHNpemUpKSBhbmQgd29ya3MgZm9yIHJlY2VudGx5IGFjY2Vzc2VkIGVsZW1lbnRzXG4gICAgY29uc3QgY2FjaGVkRWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEluQ2FjaGUoaWRlbnRpZmllcik7XG4gICAgaWYgKGNhY2hlZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFNlY29uZCwgdHJ5IHN0b3JhZ2UgbGF5ZXIgaW5kZXggKE8oMSkgbmFtZSBsb29rdXApXG4gICAgY29uc3QgaW5kZXhlZFBhdGggPSB0aGlzLnN0b3JhZ2VMYXllci5nZXRQYXRoQnlOYW1lKGlkZW50aWZpZXIpO1xuICAgIGlmIChpbmRleGVkUGF0aCkge1xuICAgICAgdHJ5IHsgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChpbmRleGVkUGF0aCk7IH0gY2F0Y2ggeyAvKiBmYWxsIHRocm91Z2ggKi8gfVxuICAgIH1cblxuICAgIC8vIFRoaXJkLCB0cnkgZGlyZWN0IGZpbGUgYWNjZXNzIHVzaW5nIHN0YW5kYXJkIG5hbWluZyBjb252ZW50aW9uXG4gICAgLy8gRWxlbWVudCBmaWxlcyBhcmUgdHlwaWNhbGx5IG5hbWVkOiBsb3dlcmNhc2UtbmFtZS13aXRoLWh5cGhlbnMue2V4dH1cbiAgICAvLyBUaGlzIGlzIE8oMSkgZmlsZSBzeXN0ZW0gbG9va3VwXG4gICAgY29uc3QgZGlyZWN0TG9hZEF0dGVtcHQgPSBhd2FpdCB0aGlzLnRyeURpcmVjdExvYWQoaWRlbnRpZmllcik7XG4gICAgaWYgKGRpcmVjdExvYWRBdHRlbXB0KSB7XG4gICAgICByZXR1cm4gZGlyZWN0TG9hZEF0dGVtcHQ7XG4gICAgfVxuXG4gICAgLy8gSWYgc3RvcmFnZSBsYXllciBoYXMgY29tcGxldGVkIGF0IGxlYXN0IG9uZSBzY2FuLCB0aGUgaW5kZXggaXNcbiAgICAvLyBhdXRob3JpdGF0aXZlIOKAlCBhIG1pc3MgbWVhbnMgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuIFNraXAgdGhlXG4gICAgLy8gZXhwZW5zaXZlIGxpc3QoKSBmYWxsYmFjayB0byBhdm9pZCBPKG4pIHJlc2NhbnMgb24gZXZlcnkgY2FjaGUgbWlzcy5cbiAgICBpZiAodGhpcy5zdG9yYWdlTGF5ZXIuaGFzQ29tcGxldGVkU2NhbigpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBGdWxsIGxpc3QoKSBzY2FuIChPKG4pIC0gbG9hZHMgYWxsIGVsZW1lbnRzKVxuICAgIC8vIE9ubHkgdXNlZCBvbiBmaXJzdCBhY2Nlc3MgYmVmb3JlIGFueSBzY2FuIGhhcyBjb21wbGV0ZWQuXG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIGZpbmQgZWxlbWVudHMgZXZlbiB3aXRoIG5vbi1zdGFuZGFyZCBmaWxlIG5hbWluZy5cbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShpZGVudGlmaWVyKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZChlID0+XG4gICAgICB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGUubWV0YWRhdGEubmFtZSkgPT09IG5vcm1hbGl6ZWRJZGVudGlmaWVyIHx8XG4gICAgICBlLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaWRlbnRpZmllci50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBlLmlkID09PSBpZGVudGlmaWVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IFNlYXJjaCBjYWNoZSBmb3IgZWxlbWVudCBieSBuYW1lIG9yIElEXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRJbkNhY2hlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIExSVUNhY2hlIGRvZXNuJ3QgcHJvdmlkZSBpdGVyYXRpb24sIGJ1dCB3ZSBjYW4gY2hlY2sgaWYgd2UgaGF2ZVxuICAgIC8vIGEgY2FjaGVkIHBhdGggZm9yIHRoaXMgaWRlbnRpZmllciBieSB0cnlpbmcgY29tbW9uIG5hbWluZyBwYXR0ZXJucy5cbiAgICAvLyBJTVBPUlRBTlQ6IGZpbGVQYXRoVG9JZCBzdG9yZXMgYWJzb2x1dGUgcGF0aHMgKHNldCBieSBjYWNoZUVsZW1lbnQgdmlhXG4gICAgLy8gcmVzb2x2ZUFic29sdXRlUGF0aCksIHNvIHdlIG11c3QgcmVzb2x2ZSB0byBhYnNvbHV0ZSBiZWZvcmUgbG9va3VwLlxuICAgIGNvbnN0IHBvc3NpYmxlRmlsZW5hbWVzID0gW1xuICAgICAgaWRlbnRpZmllcixcbiAgICAgIGAke2lkZW50aWZpZXJ9JHt0aGlzLmdldEZpbGVFeHRlbnNpb24oKX1gLFxuICAgICAgLy8gVXNlIHVuaWZpZWQgbm9ybWFsaXplRmlsZW5hbWUgZm9yIGNvbnNpc3RlbnQgY2FjaGUgbG9va3Vwc1xuICAgICAgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoaWRlbnRpZmllcilcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBwb3NzaWJsZUZpbGVuYW1lcykge1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGNhY2hlZElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG4gICAgICBpZiAoY2FjaGVkSWQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudHMuZ2V0KGNhY2hlZElkKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBUcnkgbG9hZGluZyBlbGVtZW50IGRpcmVjdGx5IGJ5IGNvbnN0cnVjdGluZyBleHBlY3RlZCBmaWxlbmFtZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cnlEaXJlY3RMb2FkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFRyeSBsb2FkaW5nIHVzaW5nIGNvbW1vbiBuYW1pbmcgcGF0dGVybnNcbiAgICAvLyBVc2UgdW5pZmllZCBub3JtYWxpemVGaWxlbmFtZSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBjb25zdHJ1Y3Rpb25cbiAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgLy8gUHJpbWFyeTogVXNlIHVuaWZpZWQgbm9ybWFsaXphdGlvbiAoaGFuZGxlcyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAgICB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShpZGVudGlmaWVyKSxcbiAgICAgIC8vIEZhbGxiYWNrOiBJZGVudGlmaWVyIGFzLWlzIHdpdGggZXh0ZW5zaW9uXG4gICAgICBgJHtpZGVudGlmaWVyfSR7dGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCl9YCxcbiAgICAgIC8vIEZhbGxiYWNrOiBJZGVudGlmaWVyIGFscmVhZHkgaW5jbHVkZXMgZXh0ZW5zaW9uXG4gICAgICBpZGVudGlmaWVyXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMubG9hZChmaWxlUGF0aCk7XG4gICAgICAgIC8vIFZlcmlmeSB0aGUgbG9hZGVkIGVsZW1lbnQgbWF0Y2hlcyB0aGUgaWRlbnRpZmllclxuICAgICAgICAvLyBOb3JtYWxpemUgYm90aCBzaWRlcyBzbyBcIkNvZGUgUmV2aWV3XCIgKHNwYWNlcykgbWF0Y2hlcyBcImNvZGUtcmV2aWV3XCIgKGh5cGhlbnMpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXRhTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobm9ybWFsaXplZE1ldGFOYW1lID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgICAgICAgZWxlbWVudC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGlkZW50aWZpZXIudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgZWxlbWVudC5pZCA9PT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IG9yIGZhaWxlZCB0byBsb2FkIC0gdHJ5IG5leHQgcGF0aFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRGVsZWdhdGVzIHRvIGVsZW1lbnQncyBvd24gdmFsaWRhdGUgbWV0aG9kXG4gICAqXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggYm90aCAndmFsaWQnIGFuZCAnaXNWYWxpZCcgcHJvcGVydGllcy5cbiAgICogICAgICAgICAgJ2lzVmFsaWQnIGlzIGRlcHJlY2F0ZWQgLSB1c2UgJ3ZhbGlkJyBmb3IgbmV3IGNvZGUuXG4gICAqL1xuICB2YWxpZGF0ZShlbGVtZW50OiBUKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbGVtZW50XG4gICAqIFNFQ1VSSVRZOiBQYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCBkZWxldGlvbiBvdXRzaWRlIGRpcmVjdG9yeVxuICAgKiBDQUNIRSBGSVg6IFVzZXMgZmlsZXBhdGgtYmFzZWQgY2FjaGUgcmVtb3ZhbCB0byBwcmV2ZW50IHN0YWxlIGVudHJpZXNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZGVsZXRlYCxcbiAgICAgIGRldGFpbHM6IGBBdHRlbXB0aW5nIHRvIGRlbGV0ZSAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9OiAke2ZpbGVQYXRofWBcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlKHRoaXMuZ2V0RWxlbWVudExhYmVsKCksIGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OmRlbGV0ZTpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkQ29tbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpkZWxldGU6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZFJvbGxiYWNrKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpkZWxldGU6ZXJyb3InLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVycm9yIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbkRlbGV0ZSkge1xuICAgICAgICBjb25zdCBlbGVtZW50Rm9yVmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMubG9hZEVsZW1lbnRTbmFwc2hvdChhYnNvbHV0ZVBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gYXdhaXQgdGhpcy5jYW5EZWxldGUoZWxlbWVudEZvclZhbGlkYXRpb24pO1xuICAgICAgICBpZiAoIWRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGVjaXNpb24ucmVhc29uID8/IGBEZWxldGlvbiBub3QgcGVybWl0dGVkIGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbW92ZWRUb0JhY2t1cCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCk7XG4gICAgICBpZiAoIW1vdmVkVG9CYWNrdXApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5kZWxldGVgXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBkZWxldGVkOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgZXhpc3RzXG4gICAqL1xuICBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGFic29sdXRlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmlsZSBwYXRoXG4gICAqL1xuICB2YWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgICBpZiAoIXNhbml0aXplZCB8fCBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzYW5pdGl6ZWQuaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoc2FuaXRpemVkKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJy5tZCcsICcubWFya2Rvd24nLCAnLnR4dCcsICcueW1sJywgJy55YW1sJ107XG5cbiAgICAgIHJldHVybiBleHQgPT09ICcnIHx8IGFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlXG4gICAqL1xuICBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBmaWxlIHBhdGggdG8gaXRzIGFic29sdXRlIGZvcm0gZm9yIGNhY2hlIGNvbnNpc3RlbmN5XG4gICAqIEVuc3VyZXMgY29uc2lzdGVudCBwYXRoIGhhbmRsaW5nIGFjcm9zcyByZWxhdGl2ZS9hYnNvbHV0ZSBwYXRoc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgID8gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpXG4gICAgICA6IHBhdGgubm9ybWFsaXplKHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIGZpbGVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7IHJlbGF0aXZlUGF0aDogc3RyaW5nOyBhYnNvbHV0ZVBhdGg6IHN0cmluZyB9PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG5cbiAgICBpZiAoIXNhbml0aXplZFBhdGggfHwgc2FuaXRpemVkUGF0aC50cmltKCkubGVuZ3RoID09PSAwIHx8IHNhbml0aXplZFBhdGggPT09ICcuJyB8fCBzYW5pdGl6ZWRQYXRoID09PSBwYXRoLnNlcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aDogZW1wdHkgcGF0aCBpcyBub3QgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIGlmIChwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWJzb2x1dGUgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRocyBhcmUgbm90IGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGggKHJlbW92ZSByZWR1bmRhbnQgc2VwYXJhdG9ycywgcmVzb2x2ZSAuIGFuZCAuLilcbiAgICBjb25zdCBub3JtYWxpemVkUmVsYXRpdmUgPSBwYXRoLm5vcm1hbGl6ZShzYW5pdGl6ZWRQYXRoKTtcblxuICAgIC8vIEJ1aWxkIGFic29sdXRlIHBhdGhcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBub3JtYWxpemVkUmVsYXRpdmUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIFdJVEhPVVQgcmVzb2x2aW5nIHN5bWxpbmtzIC0ganVzdCBjaGVjayBzZWN1cml0eSBjb25zdHJhaW50c1xuICAgICAgYXdhaXQgUGF0aFZhbGlkYXRvci52YWxpZGF0ZUVsZW1lbnRQYXRoT25seShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgaW5wdXQgYXMgcmVsYXRpdmVQYXRoIChpdCdzIGFscmVhZHkgcmVsYXRpdmUpIGFuZCBjb21wdXRlZCBhYnNvbHV0ZVBhdGhcbiAgICAgIHJldHVybiB7IHJlbGF0aXZlUGF0aDogbm9ybWFsaXplZFJlbGF0aXZlLCBhYnNvbHV0ZVBhdGggfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGg6ICR7cmVhc29ufWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZWxlbWVudElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpKTtcbiAgICBpZiAoIWVsZW1lbnRJZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuZ2V0KGVsZW1lbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdGVjdGVkIGNhY2hlIGxvb2t1cCBieSBhYnNvbHV0ZSBwYXRoLlxuICAgKiBBbGxvd3Mgc3ViY2xhc3NlcyB3aXRoIGN1c3RvbSBsb2FkKCkgb3ZlcnJpZGVzIChlLmcuIE1lbW9yeU1hbmFnZXIpXG4gICAqIHRvIGNoZWNrIHRoZSBMUlUgY2FjaGUgYmVmb3JlIHJlLXJlYWRpbmcgZnJvbSBkaXNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENhY2hlZEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRFbGVtZW50U25hcHNob3QoYWJzb2x1dGVQYXRoOiBzdHJpbmcsIHJlbGF0aXZlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRFbGVtZW50U25hcHNob3RgXG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKHJhdywgdW5kZWZpbmVkLCB7XG4gICAgICBjb250ZW50Q29udGV4dDogQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUW3RoaXMuZWxlbWVudFR5cGVdLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZC5kYXRhKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG4gICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IHBheWxvYWQgZm9yIGVsZW1lbnQgbGlmZWN5Y2xlIGV2ZW50cy5cbiAgICpcbiAgICogVGhpcyBoZWxwZXIgaXMgYXZhaWxhYmxlIHRvIHN1YmNsYXNzZXMgdG8gZW5zdXJlIGNvbnNpc3RlbnQgZXZlbnQgcGF5bG9hZFxuICAgKiBzdHJ1Y3R1cmUgd2hlbiBlbWl0dGluZyBjdXN0b20gZXZlbnRzIHZpYSB0aGUgZGlzcGF0Y2hlciBnZXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBFdmVudCBwYXJhbWV0ZXJzIGluY2x1ZGluZyBjb3JyZWxhdGlvbiBJRCwgZWxlbWVudCwgZmlsZSBwYXRoLCBhbmQgb3B0aW9uYWwgZXJyb3JcbiAgICogQHJldHVybnMgRnVsbHktZm9ybWVkIEVsZW1lbnRFdmVudFBheWxvYWQgcmVhZHkgZm9yIGVtaXNzaW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRXZlbnRQYXlsb2FkKHBhcmFtczoge1xuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICBmaWxlUGF0aD86IHN0cmluZztcbiAgICBlbGVtZW50PzogVDtcbiAgICBlcnJvcj86IHVua25vd247XG4gIH0pOiBFbGVtZW50RXZlbnRQYXlsb2FkIHtcbiAgICBjb25zdCBlbGVtZW50SWQgPSBwYXJhbXMuZWxlbWVudD8uaWQ7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZ2V0KGVsZW1lbnRJZCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHBhcmFtcy5jb3JyZWxhdGlvbklkLFxuICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZWxlbWVudFR5cGUsXG4gICAgICBlbGVtZW50SWQsXG4gICAgICBmaWxlUGF0aDogcGFyYW1zLmZpbGVQYXRoLFxuICAgICAgbWV0YWRhdGE6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIuc25hcHNob3RNZXRhZGF0YShwYXJhbXMuZWxlbWVudCksXG4gICAgICBnZW5lcmF0aW9uLFxuICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUV4dGVybmFsQ2hhbmdlKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmNhY2hlQnlQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgJ2VsZW1lbnQ6ZXh0ZXJuYWwtY2hhbmdlJyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSkge1xuICAgICAgdm9pZCB0aGlzLmxvYWQocmVsYXRpdmVQYXRoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1dG8gcmVsb2FkIGFmdGVyIGV4dGVybmFsIGNoYW5nZSBmYWlsZWQnLCB7XG4gICAgICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZWxlbWVudFR5cGUsXG4gICAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZWxlbWVudCB0byBib3RoIGNhY2hlcyAoYmlkaXJlY3Rpb25hbCBtYXBwaW5nKVxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2FjaGVcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gRmlsZSBwYXRoIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSlcbiAgICovXG4gIHByb3RlY3RlZCBjYWNoZUVsZW1lbnQoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG5cbiAgICAvLyBDbGVhciBhbnkgc3RhbGUgY2FjaGUgZW50cmllcyBmb3IgdGhpcyBmaWxlcGF0aCBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgb25lLlxuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZ2VuZXJhdGVJZCgpIGluIEJhc2VFbGVtZW50LnRzIGluY2x1ZGVzIGEgRGF0ZS5ub3coKVxuICAgIC8vIHRpbWVzdGFtcCwgY2F1c2luZyBlYWNoIGxvYWQgZnJvbSBkaXNrIHRvIGdlbmVyYXRlIGEgZGlmZmVyZW50IElELiBXaXRob3V0IHRoaXNcbiAgICAvLyBjbGVhbnVwLCBvbGQgSURzIHJlbWFpbiBpbiB0aGUgY2FjaGUgYXMgc3RhbGUgZGF0YSwgbGVhZGluZyB0byBpbmNvbnNpc3RlbnRcbiAgICAvLyByZXN1bHRzIGluIG1ldGhvZHMgbGlrZSBmaW5kUGVyc29uYSgpIG9yIGxpc3QoKS5cbiAgICBjb25zdCBleGlzdGluZ0lkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nSWQgJiYgZXhpc3RpbmdJZCAhPT0gZWxlbWVudC5pZCkge1xuICAgICAgLy8gQ2xlYXIgc3RhbGUgY2FjaGUgZW50cnkgd2hlbiBlbGVtZW50IElEIGhhcyBjaGFuZ2VkXG4gICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRzLnNldChlbGVtZW50LmlkLCBlbGVtZW50KTtcbiAgICB0aGlzLmZpbGVQYXRoVG9JZC5zZXQoYWJzb2x1dGVQYXRoLCBlbGVtZW50LmlkKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmNhY2hlR2VuZXJhdGlvbkNvdW50ZXI7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuc2V0KGVsZW1lbnQuaWQsIGdlbmVyYXRpb24pO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgPyBwYXRoLnJlbGF0aXZlKHRoaXMuZWxlbWVudERpciwgZmlsZVBhdGgpXG4gICAgICA6IGZpbGVQYXRoO1xuXG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnZmlsZW5hbWUnLCB7XG4gICAgICAgIHZhbHVlOiBwYXRoLmJhc2VuYW1lKHJlbGF0aXZlUGF0aCksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ2ZpbGVQYXRoJywge1xuICAgICAgICB2YWx1ZTogcmVsYXRpdmVQYXRoLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gYXR0YWNoIGZpbGVuYW1lIG1ldGFkYXRhIHRvIGVsZW1lbnQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIGJvdGggY2FjaGVzIGJ5IGZpbGUgcGF0aFxuICAgKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBkZWxldGlvbiB0byBhdm9pZCBzdGFsZSBjYWNoZSBlbnRyaWVzXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEZpbGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgdW5jYWNoZUJ5UGF0aChmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBlbGVtZW50SWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChlbGVtZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZWxlbWVudElkKTtcbiAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGVsZW1lbnRJZCk7XG4gICAgICBsb2dnZXIuZGVidWcoYFVuY2FjaGVkIGVsZW1lbnQgJHtlbGVtZW50SWR9IGZyb20gJHthYnNvbHV0ZVBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjYWNoZWQgZWxlbWVudHNcbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLmNsZWFyKCk7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBzdGF0aXN0aWNzIGZvciBkZWJ1Z2dpbmdcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggY2FjaGUgc2l6ZSBtZXRyaWNzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q2FjaGVTdGF0cygpOiB7IGVsZW1lbnRDb3VudDogbnVtYmVyOyBwYXRoTWFwcGluZ3M6IG51bWJlciB9IHtcbiAgICBjb25zdCBlbGVtZW50c1N0YXRzID0gdGhpcy5lbGVtZW50cy5nZXRTdGF0cygpO1xuICAgIGNvbnN0IHBhdGhTdGF0cyA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldFN0YXRzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudENvdW50OiBlbGVtZW50c1N0YXRzLnNpemUsXG4gICAgICBwYXRoTWFwcGluZ3M6IHBhdGhTdGF0cy5zaXplXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHJlc291cmNlcyBhbmQgY2xlYW51cFxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBhZGQgdGhlaXIgb3duIGNsZWFudXAgbG9naWNcbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1lbW9yeUJ1ZGdldCkge1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQudW5yZWdpc3Rlcih0aGlzLmVsZW1lbnRzKTtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnVucmVnaXN0ZXIodGhpcy5maWxlUGF0aFRvSWQpO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuY2xlYXIoKTtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmNsZWFyKCk7XG4gICAgdGhpcy53YXRjaGVyQ2xlYW51cD8uKCk7XG4gICAgdGhpcy53YXRjaGVyQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICBsb2dnZXIuZGVidWcoYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfU1hbmFnZXIgZGlzcG9zZWQgYW5kIGNhY2hlcyBjbGVhcmVkYCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGSUxFTkFNRSBOT1JNQUxJWkFUSU9OIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGEgbmFtZSB0byBrZWJhYi1jYXNlIGZvciBjb25zaXN0ZW50IGZpbGVuYW1lIGZvcm1hdHRpbmcuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHVuaWZpZWQgZmlsZW5hbWUgbm9ybWFsaXphdGlvbiBhY3Jvc3MgYWxsIGVsZW1lbnQgbWFuYWdlcnMsXG4gICAqIGVuc3VyaW5nIGNvbnNpc3RlbnQgbmFtaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IGZvcm1hdCAoQ2FtZWxDYXNlLCBzcGFjZXMsXG4gICAqIHVuZGVyc2NvcmVzLCBtaXhlZCBjYXNlLCBldGMuKS5cbiAgICpcbiAgICogVHJhbnNmb3JtYXRpb25zIGFwcGxpZWQgKGluIG9yZGVyKTpcbiAgICogMS4gSW5zZXJ0IGh5cGhlbnMgYmV0d2VlbiBjYW1lbENhc2UgYm91bmRhcmllcyAoTXlOYW1lIC0+IE15LU5hbWUpXG4gICAqIDIuIFJlcGxhY2Ugc3BhY2VzIGFuZCB1bmRlcnNjb3JlcyB3aXRoIGh5cGhlbnNcbiAgICogMy4gQ29udmVydCB0byBsb3dlcmNhc2VcbiAgICogNC4gU3RyaXAgaW52YWxpZCBjaGFyYWN0ZXJzIChrZWVwIG9ubHkgYS16LCAwLTksIC0pXG4gICAqIDUuIENvbGxhcHNlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGh5cGhlbnNcbiAgICogNi4gVHJpbSBsZWFkaW5nL3RyYWlsaW5nIGh5cGhlbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDUlVEVi1BZ2VudC1EZWx0YVwiKSAvLyBcImNydWR2LWFnZW50LWRlbHRhXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDcmVhdGl2ZSBXcml0ZXJcIikgICAvLyBcImNyZWF0aXZlLXdyaXRlclwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ2FtZWxDYXNlTmFtZVwiKSAgICAgLy8gXCJjYW1lbC1jYXNlLW5hbWVcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIm15X3NraWxsX25hbWVcIikgICAgIC8vIFwibXktc2tpbGwtbmFtZVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiU3BlY2lhbEBDaGFycyFcIikgICAgLy8gXCJzcGVjaWFsLWNoYXJzXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCItLWxlYWRpbmctYW5kLXRyYWlsaW5nLS1cIikgLy8gXCJsZWFkaW5nLWFuZC10cmFpbGluZ1wiXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGVsZW1lbnQgbmFtZSB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBrZWJhYi1jYXNlIGZpbGVuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcbiAgICovXG4gIHByb3RlY3RlZCBub3JtYWxpemVGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAndW5uYW1lZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC8vIFN0ZXAgMTogSW5zZXJ0IGh5cGhlbnMgYmV0d2VlbiBjYW1lbENhc2UgYm91bmRhcmllcyAobG93ZXJjYXNlIGZvbGxvd2VkIGJ5IHVwcGVyY2FzZSlcbiAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKVxuICAgICAgLy8gU3RlcCAyOiBSZXBsYWNlIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvW1xcc19dKy9nLCAnLScpXG4gICAgICAvLyBTdGVwIDM6IENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLy8gU3RlcCA0OiBTdHJpcCBpbnZhbGlkIGNoYXJhY3RlcnMgKGtlZXAgb25seSBhbHBoYW51bWVyaWMgYW5kIGh5cGhlbnMpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpXG4gICAgICAvLyBTdGVwIDU6IENvbGxhcHNlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC8tKy9nLCAnLScpXG4gICAgICAvLyBTdGVwIDY6IFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoL14tK3wtKyQvZywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3RhbmRhcmRpemVkIGZpbGVuYW1lIGZvciBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHRoZSBlbGVtZW50IG5hbWUgKGhhbmRsaW5nIENhbWVsQ2FzZSwgc3BhY2VzLCB1bmRlcnNjb3JlcywgZXRjLilcbiAgICogYW5kIGFwcGVuZHMgdGhlIGZpbGUgZXh0ZW5zaW9uLiBUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSAocGVyc29uYXMvLCBza2lsbHMvLCBldGMuKVxuICAgKiBhbHJlYWR5IHByb3ZpZGVzIHR5cGUgY29udGV4dCwgc28gdGhlIHR5cGUgaXMgTk9UIGluY2x1ZGVkIGluIHRoZSBmaWxlbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgZWxlbWVudCBuYW1lIHRvIGNvbnZlcnQgdG8gYSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyBUaGUgc3RhbmRhcmRpemVkIGZpbGVuYW1lIChlLmcuLCBcImNvZGUtcmV2aWV3Lm1kXCIpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcIkNvZGUgUmV2aWV3XCIpICAgICAgICAgLy8g4oaSIFwiY29kZS1yZXZpZXcubWRcIlxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJEZWJ1ZyBEZXRlY3RpdmVcIikgICAgIC8vIOKGkiBcImRlYnVnLWRldGVjdGl2ZS5tZFwiXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcIkJ1Z1JlcG9ydFwiKSAgICAgICAgICAgLy8g4oaSIFwiYnVnLXJlcG9ydC5tZFwiIChDYW1lbENhc2Ugc3BsaXQpXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcImZpeC1wZXJzb25hLWhlbHBlclwiKSAgLy8g4oaSIFwiZml4LXBlcnNvbmEtaGVscGVyLm1kXCIgKG5vIG1hbmdsaW5nKVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEVsZW1lbnRGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKSB8fCAndW5uYW1lZCc7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCk7XG4gICAgcmV0dXJuIGAke25vcm1hbGl6ZWROYW1lfSR7ZXh0ZW5zaW9ufWA7XG4gIH1cblxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFCU1RSQUNUIE1FVEhPRFMgLSBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBtZXRhZGF0YSBmcm9tIGZyb250bWF0dGVyXG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpY1xuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFJhdyBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIGFuZCB0eXBlZCBtZXRhZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxUWydtZXRhZGF0YSddPjtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIEVsZW1lbnRWYWxpZGF0b3IgdmlhIFZhbGlkYXRpb25SZWdpc3RyeSBpbnN0ZWFkLlxuICAgKiBXaWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YTogYW55LCBfc3RyaWN0PzogYm9vbGVhbik6IFByb21pc2U8aW1wb3J0KCcuLi8uLi91dGlscy92YWxpZGF0aW9uL0ZpZWxkVmFsaWRhdG9yLmpzJykuVmFsaWRhdGlvbkVycm9yW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICByZXR1cm4gcmVzdWx0LmVycm9ycy5tYXAoZSA9PiAoeyBmaWVsZDogJ2dlbmVyYWwnLCBtZXNzYWdlOiBlIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZWxlbWVudCBpbnN0YW5jZSBmcm9tIG1ldGFkYXRhIGFuZCBjb250ZW50XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgY29uc3RydWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFZhbGlkYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0gY29udGVudCAtIEVsZW1lbnQgY29udGVudCAoaW5zdHJ1Y3Rpb25zLCB0ZW1wbGF0ZSwgZXRjLilcbiAgICogQHJldHVybnMgTmV3IGVsZW1lbnQgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBUWydtZXRhZGF0YSddLCBjb250ZW50OiBzdHJpbmcpOiBUO1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYW4gZWxlbWVudCB0byBmaWxlIGNvbnRlbnRcbiAgICogU3ViY2xhc3NlcyBjYW4gY3VzdG9taXplIHNlcmlhbGl6YXRpb24gZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXJpYWxpemVcbiAgICogQHJldHVybnMgRmlsZSBjb250ZW50ICh1c3VhbGx5IG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2VyaWFsaXplRWxlbWVudChlbGVtZW50OiBUKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKiBNb3N0IGVsZW1lbnRzIHVzZSAubWQsIGJ1dCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZVxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBlbGVtZW50IGZyb20gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGZvcm1hdC1zcGVjaWZpYyBpbXBvcnQgbG9naWNcbiAgICovXG4gIGFic3RyYWN0IGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxUPjtcblxuICAvKipcbiAgICogRXhwb3J0IGFuIGVsZW1lbnQgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGZvcm1hdC1zcGVjaWZpYyBleHBvcnQgbG9naWNcbiAgICovXG4gIGFic3RyYWN0IGV4cG9ydEVsZW1lbnQoZWxlbWVudDogVCwgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPjtcbn1cbiJdfQ==
1014
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3pCLE1BQU0sdUNBQXVDLENBQUM7QUFJL0MsTUFBTSw0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QUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUMsT0FBTyxHQUFHLGNBQWMsR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBZ0JEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFhLEVBQUUsT0FBaUI7UUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2VFbGVtZW50TWFuYWdlciAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBlbGVtZW50IG1hbmFnZXJzXG4gKlxuICogUHJvdmlkZXMgY29tbW9uIENSVUQgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMgdXNpbmcgdGhlXG4gKiBUZW1wbGF0ZSBNZXRob2QgUGF0dGVybjpcbiAqIC0gRGVmaW5lcyB0aGUgc2tlbGV0b24gb2Ygb3BlcmF0aW9ucyBpbiBiYXNlIGNsYXNzXG4gKiAtIExldHMgc3ViY2xhc3NlcyBvdmVycmlkZSBzcGVjaWZpYyBzdGVwcyB3aXRob3V0IGNoYW5naW5nIHN0cnVjdHVyZVxuICpcbiAqIFN1YmNsYXNzZXM6IFNraWxsTWFuYWdlciwgVGVtcGxhdGVNYW5hZ2VyLCBBZ2VudE1hbmFnZXIsIE1lbW9yeU1hbmFnZXJcbiAqXG4gKiBTRUNVUklUWTpcbiAqIDEuIENSSVRJQ0FMOiBVc2VzIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIHJlYWQvd3JpdGUgb3BlcmF0aW9uc1xuICogMi4gSElHSDogUGF0aCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0YWNrc1xuICogMy4gTUVESVVNOiBTZWN1cml0eSBldmVudCBsb2dnaW5nIGZvciBhdWRpdCB0cmFpbFxuICogNC4gTUVESVVNOiBJbnB1dCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gdGhyb3VnaG91dFxuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnQsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZXJyb3JzLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50RXZlbnREaXNwYXRjaGVyLCBFbGVtZW50RXZlbnRQYXlsb2FkIH0gZnJvbSAnLi4vLi4vZXZlbnRzL0VsZW1lbnRFdmVudERpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUgfSBmcm9tICcuL0VsZW1lbnRUcmFuc2FjdGlvblNjb3BlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB0eXBlIEVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL0VsZW1lbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRWxlbWVudFN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvRWxlbWVudFN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlTGF5ZXIgfSBmcm9tICcuLi8uLi9zdG9yYWdlL0lTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50SW5kZXhFbnRyeSB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0VmFsaWRhdGVkU2NhbkNvb2xkb3duLFxuICBnZXRWYWxpZGF0ZWRFbGVtZW50Q2FjaGVUVEwsXG4gIGdldFZhbGlkYXRlZFBhdGhDYWNoZVRUTFxufSBmcm9tICcuLi8uLi9jb25maWcvcGVyZm9ybWFuY2UtY29uc3RhbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgQ2FjaGVNZW1vcnlCdWRnZXQgfSBmcm9tICcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhY2t1cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJztcblxuY29uc3QgREVGQVVMVF9FTEVNRU5UX0NBQ0hFX1RUTF9NUyA9IGdldFZhbGlkYXRlZEVsZW1lbnRDYWNoZVRUTCgpO1xuY29uc3QgREVGQVVMVF9QQVRIX0NBQ0hFX1RUTF9NUyA9IGdldFZhbGlkYXRlZFBhdGhDYWNoZVRUTCgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VFbGVtZW50TWFuYWdlck9wdGlvbnMge1xuICBlbGVtZW50RGlyT3ZlcnJpZGU/OiBzdHJpbmc7XG4gIGV2ZW50RGlzcGF0Y2hlcj86IEVsZW1lbnRFdmVudERpc3BhdGNoZXI7XG4gIGVsZW1lbnRDYWNoZVRUTD86IG51bWJlcjtcbiAgcGF0aENhY2hlVFRMPzogbnVtYmVyO1xuICBlbmFibGVGaWxlV2F0Y2hlcj86IGJvb2xlYW47XG4gIGF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlPzogYm9vbGVhbjtcbiAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2U7XG4gIG1lbW9yeUJ1ZGdldD86IENhY2hlTWVtb3J5QnVkZ2V0O1xuICBiYWNrdXBTZXJ2aWNlPzogQmFja3VwU2VydmljZTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgb2YgYW4gZWxlbWVudCB0aGF0IGZhaWxlZCB0byBsb2FkIChJc3N1ZSAjNzA4KS5cbiAqIFN0b3JlZCBzbyBjYWxsZXJzIGNhbiBkaXN0aW5ndWlzaCBcImZpbGUgbm90IGZvdW5kXCIgZnJvbSBcImZpbGUgaW52YWxpZFwiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRFbGVtZW50UmVjb3JkIHtcbiAgLyoqIFJlbGF0aXZlIGZpbGUgcGF0aCB3aXRoaW4gdGhlIGVsZW1lbnQgZGlyZWN0b3J5LiAqL1xuICBmaWxlUGF0aDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgcmVhc29uIHRoZSBlbGVtZW50IHdhcyByZWplY3RlZC4gKi9cbiAgcmVhc29uOiBzdHJpbmc7XG4gIC8qKiBJU08gdGltZXN0YW1wIG9mIGxhc3QgZmFpbGVkIGxvYWQgYXR0ZW1wdC4gKi9cbiAgZmFpbGVkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGltcGxlbWVudGluZyBjb21tb24gZWxlbWVudCBtYW5hZ2VtZW50IG9wZXJhdGlvbnNcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgZWxlbWVudC1zcGVjaWZpYyBsb2dpYyB2aWEgYWJzdHJhY3QgbWV0aG9kc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUVsZW1lbnRNYW5hZ2VyPFQgZXh0ZW5kcyBJRWxlbWVudD4gaW1wbGVtZW50cyBJRWxlbWVudE1hbmFnZXI8VD4ge1xuICBwcm90ZWN0ZWQgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJvdGVjdGVkIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyO1xuICBwcm90ZWN0ZWQgZmlsZU9wZXJhdGlvbnM6IEZpbGVPcGVyYXRpb25zU2VydmljZTtcbiAgcHJvdGVjdGVkIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZWxlbWVudERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIHRoaXMgZWxlbWVudCB0eXBlXG4gICAqIE9idGFpbmVkIGZyb20gVmFsaWRhdGlvblJlZ2lzdHJ5IGR1cmluZyBjb25zdHJ1Y3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0b3I6IEVsZW1lbnRWYWxpZGF0b3I7XG5cbiAgLy8gUHJpbWFyeSBjYWNoZTogSUQg4oaSIEVsZW1lbnQgKHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3MpXG4gIHByb3RlY3RlZCBlbGVtZW50czogTFJVQ2FjaGU8VD47XG5cbiAgLy8gUmV2ZXJzZSBpbmRleDogQWJzb2x1dGUgRmlsZVBhdGgg4oaSIEVsZW1lbnQgSUQgKHdpdGggc2l6ZSBsaW1pdHMpXG4gIHByaXZhdGUgZmlsZVBhdGhUb0lkOiBMUlVDYWNoZTxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRHZW5lcmF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgY2FjaGVHZW5lcmF0aW9uQ291bnRlciA9IDA7XG4gIHByaXZhdGUgd2F0Y2hlckNsZWFudXA/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50RGlzcGF0Y2hlcjogRWxlbWVudEV2ZW50RGlzcGF0Y2hlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5QnVkZ2V0PzogQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBiYWNrdXBTZXJ2aWNlPzogQmFja3VwU2VydmljZTtcblxuICAvKiogTWFwIHBsdXJhbCBFbGVtZW50VHlwZSBlbnVtIHZhbHVlcyB0byBzaW5ndWxhciBDb250ZW50VmFsaWRhdG9yIGNvbnRleHQuXG4gICAqICBQYXJ0aWFsIGJlY2F1c2Ugbm90IGFsbCBlbGVtZW50IHR5cGVzIGhhdmUgYSBjb250ZW50IGNvbnRleHQgKGUuZy4sIGVuc2VtYmxlcykuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEVMRU1FTlRfVFlQRV9UT19DT05URVhUOiBQYXJ0aWFsPFJlY29yZDxFbGVtZW50VHlwZSwgJ3BlcnNvbmEnIHwgJ3NraWxsJyB8ICd0ZW1wbGF0ZScgfCAnYWdlbnQnIHwgJ21lbW9yeSc+PiA9IHtcbiAgICBbRWxlbWVudFR5cGUuUEVSU09OQV06ICdwZXJzb25hJyxcbiAgICBbRWxlbWVudFR5cGUuU0tJTExdOiAnc2tpbGwnLFxuICAgIFtFbGVtZW50VHlwZS5URU1QTEFURV06ICd0ZW1wbGF0ZScsXG4gICAgW0VsZW1lbnRUeXBlLkFHRU5UXTogJ2FnZW50JyxcbiAgICBbRWxlbWVudFR5cGUuTUVNT1JZXTogJ21lbW9yeScsXG4gIH07XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JhZ2VMYXllcjogSVN0b3JhZ2VMYXllcjtcblxuICAvKipcbiAgICogSXNzdWUgIzcwODogRWxlbWVudHMgdGhhdCBleGlzdCBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogS2V5ZWQgYnkgcmVsYXRpdmUgZmlsZSBwYXRoIGZvciBkZWR1cGxpY2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnZhbGlkRWxlbWVudHMgPSBuZXcgTWFwPHN0cmluZywgSW52YWxpZEVsZW1lbnRSZWNvcmQ+KCk7XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBmaWxlIHBhdGhzIHdob3NlIGxvYWQgZmFpbHVyZSBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZCBhdCBlcnJvciBsZXZlbC5cbiAgICogUmVwZWF0ZWQgZmFpbHVyZXMgd2l0aCB0aGUgc2FtZSByZWFzb24gYXJlIGRlbW90ZWQgdG8gZGVidWcgdG8gYXZvaWQgbG9nIGZsb29kaW5nLlxuICAgKiBDbGVhcmVkIHdoZW4gdGhlIGZpbGUgY2hhbmdlcyBvbiBkaXNrIG9yIGxvYWRzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VwcHJlc3NlZExvYWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vc3QgcmVjZW50IGxvYWQoKSBmYWlsdXJlIGZvciB0aGlzIHBhdGggd2FzIHN1cHByZXNzZWRcbiAgICogYmVjYXVzZSBpdCB3YXMgYSByZXBlYXQgb2YgYW4gYWxyZWFkeS1sb2dnZWQgZXJyb3IuXG4gICAqIFN1YmNsYXNzZXMgY2FuIHVzZSB0aGlzIHRvIGF2b2lkIGR1cGxpY2F0ZSBzZWN1cml0eSBldmVudCBsb2dnaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBSZWxhdGl2ZSBmaWxlIHBhdGggd2l0aGluIHRoZSBlbGVtZW50IGRpcmVjdG9yeVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlcnJvciBmb3IgdGhpcyBwYXRoIGlzIGN1cnJlbnRseSBzdXBwcmVzc2VkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNMb2FkRXJyb3JTdXBwcmVzc2VkKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmhhcyhmaWxlUGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWZ0ZXJMb2FkPyhlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIGJlZm9yZVNhdmU/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYWZ0ZXJTYXZlPyhlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIGZpbmRCeUlkZW50aWZpZXI/KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD47XG4gIHByb3RlY3RlZCBjYW5EZWxldGU/KGVsZW1lbnQ6IFQpOiBQcm9taXNlPHsgYWxsb3dlZDogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBiYWNrdXAgYmVmb3JlIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIGZpbGUuXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIG5vLW9wIChlLmcuIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5iYWNrdXBTZXJ2aWNlKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5iYWNrdXBTZXJ2aWNlLmJhY2t1cEJlZm9yZVNhdmUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBiYWNrdXAgYmVmb3JlIGRlbGV0aW5nIGEgZmlsZSAobW92ZXMgZmlsZSB0byBiYWNrdXAgZGlyKS5cbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvcmlnaW5hbCBmaWxlIHdhcyBtb3ZlZCAoY2FsbGVyIHNob3VsZCBza2lwIGRlbGV0ZUZpbGUpLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBuby1vcCAoZS5nLiBNZW1vcnlNYW5hZ2VyIGhhcyBpdHMgb3duIGJhY2t1cCBzeXN0ZW0pLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZURlbGV0ZShhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5iYWNrdXBTZXJ2aWNlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iYWNrdXBTZXJ2aWNlLmJhY2t1cEJlZm9yZURlbGV0ZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUpO1xuICAgIHJldHVybiAhIXJlc3VsdC5tb3ZlZE9yaWdpbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZXZlbnQgZGlzcGF0Y2hlciBmb3Igc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gZW1pdCBjdXN0b20gZXZlbnRzLlxuICAgKlxuICAgKiBCYXNlRWxlbWVudE1hbmFnZXIgaGFuZGxlcyBzdGFuZGFyZCBsaWZlY3ljbGUgZXZlbnRzIChsb2FkLCBzYXZlLCBkZWxldGUpIGF1dG9tYXRpY2FsbHkuXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIGdldHRlciBvbmx5IHdoZW4gdGhleSBuZWVkIHRvIGVtaXQgYWRkaXRpb25hbCBkb21haW4tc3BlY2lmaWNcbiAgICogZXZlbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBDUlVEIGxpZmVjeWNsZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUGVyc29uYU1hbmFnZXIgZW1pdHMgYWN0aXZhdGlvbi9kZWFjdGl2YXRpb24gZXZlbnRzXG4gICAqIHRoaXMuZGlzcGF0Y2hlci5lbWl0KCdlbGVtZW50OmFjdGl2YXRlJywgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoey4uLn0pKTtcbiAgICpcbiAgICogQHJldHVybnMgVGhlIEVsZW1lbnRFdmVudERpc3BhdGNoZXIgaW5zdGFuY2UgdXNlZCBieSB0aGlzIG1hbmFnZXJcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZGlzcGF0Y2hlcigpOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudERpc3BhdGNoZXI7XG4gIH1cblxuICAvLyBDYWNoZSBjb25maWd1cmF0aW9uIGNvbnN0YW50c1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfRUxFTUVOVF9DQUNIRV9TSVpFID0gMTAwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1BBVEhfQ0FDSEVfU0laRSA9IDEwMDA7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIC0gaW5pdGlhbGl6ZXMgY29tbW9uIGRlcGVuZGVuY2llc1xuICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgLSBUaGUgdHlwZSBvZiBlbGVtZW50IHRoaXMgbWFuYWdlciBoYW5kbGVzXG4gICAqIEBwYXJhbSBwb3J0Zm9saW9NYW5hZ2VyIC0gUG9ydGZvbGlvIG1hbmFnZXIgZm9yIGRpcmVjdG9yeSByZXNvbHV0aW9uXG4gICAqIEBwYXJhbSBmaWxlTG9ja01hbmFnZXIgLSBGaWxlIGxvY2sgbWFuYWdlciBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIGZpbGVXYXRjaFNlcnZpY2VcbiAgICogQHBhcmFtIGZpbGVPcGVyYXRpb25zU2VydmljZSAtIFNlcnZpY2UgZm9yIGZpbGUgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gdmFsaWRhdGlvblJlZ2lzdHJ5IC0gUmVnaXN0cnkgZm9yIG9idGFpbmluZyB0eXBlLXNwZWNpZmljIHZhbGlkYXRvcnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIG9wdGlvbnM6IEJhc2VFbGVtZW50TWFuYWdlck9wdGlvbnMgPSB7fSxcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeVxuICApIHtcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gcG9ydGZvbGlvTWFuYWdlcjtcbiAgICB0aGlzLmZpbGVMb2NrTWFuYWdlciA9IGZpbGVMb2NrTWFuYWdlcjtcbiAgICB0aGlzLmZpbGVPcGVyYXRpb25zID0gZmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICAgIHRoaXMuZmlsZVdhdGNoU2VydmljZSA9IG9wdGlvbnMuZmlsZVdhdGNoU2VydmljZTtcbiAgICB0aGlzLmJhY2t1cFNlcnZpY2UgPSBvcHRpb25zLmJhY2t1cFNlcnZpY2U7XG5cbiAgICAvLyBHZXQgdGhlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0b3IoZWxlbWVudFR5cGUpO1xuXG4gICAgY29uc3QgZWxlbWVudENhY2hlVFRMID0gb3B0aW9ucy5lbGVtZW50Q2FjaGVUVEwgPz8gREVGQVVMVF9FTEVNRU5UX0NBQ0hFX1RUTF9NUztcbiAgICBjb25zdCBwYXRoQ2FjaGVUVEwgPSBvcHRpb25zLnBhdGhDYWNoZVRUTCA/PyBERUZBVUxUX1BBVEhfQ0FDSEVfVFRMX01TO1xuICAgIHRoaXMubWVtb3J5QnVkZ2V0ID0gb3B0aW9ucy5tZW1vcnlCdWRnZXQ7XG5cbiAgICBjb25zdCBvblNldENhbGxiYWNrID0gdGhpcy5tZW1vcnlCdWRnZXRcbiAgICAgID8gKCkgPT4gdGhpcy5tZW1vcnlCdWRnZXQhLmVuZm9yY2UoKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJbml0aWFsaXplIExSVSBjYWNoZXMgd2l0aCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgIHRoaXMuZWxlbWVudHMgPSBuZXcgTFJVQ2FjaGU8VD4oe1xuICAgICAgbmFtZTogYGVsZW1lbnRzOiR7ZWxlbWVudFR5cGV9YCxcbiAgICAgIG1heFNpemU6IEJhc2VFbGVtZW50TWFuYWdlci5NQVhfRUxFTUVOVF9DQUNIRV9TSVpFLFxuICAgICAgbWF4TWVtb3J5TUI6IDUwLCAvLyBNYXggNTBNQiBmb3IgZWxlbWVudCBjYWNoZVxuICAgICAgdHRsTXM6IGVsZW1lbnRDYWNoZVRUTCxcbiAgICAgIG9uU2V0OiBvblNldENhbGxiYWNrLFxuICAgIH0pO1xuXG4gICAgdGhpcy5maWxlUGF0aFRvSWQgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nPih7XG4gICAgICBuYW1lOiBgcGF0aEluZGV4OiR7ZWxlbWVudFR5cGV9YCxcbiAgICAgIG1heFNpemU6IEJhc2VFbGVtZW50TWFuYWdlci5NQVhfUEFUSF9DQUNIRV9TSVpFLFxuICAgICAgbWF4TWVtb3J5TUI6IDEwLCAvLyBNYXggMTBNQiBmb3IgcGF0aCBtYXBwaW5nc1xuICAgICAgdHRsTXM6IHBhdGhDYWNoZVRUTCxcbiAgICAgIG9uU2V0OiBvblNldENhbGxiYWNrLFxuICAgIH0pO1xuXG4gICAgLy8gUmVnaXN0ZXIgY2FjaGVzIHdpdGggZ2xvYmFsIG1lbW9yeSBidWRnZXRcbiAgICBpZiAodGhpcy5tZW1vcnlCdWRnZXQpIHtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnJlZ2lzdGVyKHRoaXMuZWxlbWVudHMpO1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQucmVnaXN0ZXIodGhpcy5maWxlUGF0aFRvSWQpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmVsZW1lbnREaXJPdmVycmlkZSkge1xuICAgICAgdGhpcy5lbGVtZW50RGlyID0gb3B0aW9ucy5lbGVtZW50RGlyT3ZlcnJpZGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgKHRoaXMucG9ydGZvbGlvTWFuYWdlciBhcyBhbnkpLmdldEVsZW1lbnREaXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuZWxlbWVudERpciA9ICh0aGlzLnBvcnRmb2xpb01hbmFnZXIgYXMgYW55KS5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5hYmxlIHRvIHJlc29sdmUgZWxlbWVudCBkaXJlY3RvcnkgZm9yICR7ZWxlbWVudFR5cGV9LiBgICtcbiAgICAgICAgJ1Byb3ZpZGUgYW4gZWxlbWVudERpck92ZXJyaWRlIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIG1hbmFnZXIuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlciA9IG9wdGlvbnMuZXZlbnREaXNwYXRjaGVyID8/IEVsZW1lbnRFdmVudERpc3BhdGNoZXIuZ2V0U2hhcmVkRGlzcGF0Y2hlcigpO1xuICAgIHRoaXMuYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2UgPVxuICAgICAgb3B0aW9ucy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSA/PyBwcm9jZXNzLmVudi5BVVRPX1JFTE9BRF9PTl9FWFRFUk5BTF9DSEFOR0UgPT09ICd0cnVlJztcblxuICAgIGNvbnN0IGVuYWJsZVdhdGNoZXIgPSBvcHRpb25zLmVuYWJsZUZpbGVXYXRjaGVyID8/IHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTkFCTEVfRklMRV9XQVRDSEVSID09PSAndHJ1ZSc7XG4gICAgaWYgKGVuYWJsZVdhdGNoZXIgJiYgdGhpcy5maWxlV2F0Y2hTZXJ2aWNlKSB7XG4gICAgICB0aGlzLndhdGNoZXJDbGVhbnVwID0gdGhpcy5maWxlV2F0Y2hTZXJ2aWNlLndhdGNoRGlyZWN0b3J5KFxuICAgICAgICB0aGlzLmVsZW1lbnREaXIsXG4gICAgICAgIChyZWxhdGl2ZVBhdGgpID0+IHRoaXMuaGFuZGxlRXh0ZXJuYWxDaGFuZ2UocmVsYXRpdmVQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JhZ2VMYXllciA9IHRoaXMuY3JlYXRlU3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZSk7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIHRoZSBzdG9yYWdlIGxheWVyLlxuICAgKiBEZWZhdWx0IHJldHVybnMgRWxlbWVudFN0b3JhZ2VMYXllciBmb3IgLm1kIGVsZW1lbnRzLlxuICAgKiBTdWJjbGFzc2VzIChlLmcuIE1lbW9yeU1hbmFnZXIpIGNhbiBvdmVycmlkZSB0byByZXR1cm4gYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlU3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTogSVN0b3JhZ2VMYXllciB7XG4gICAgcmV0dXJuIG5ldyBFbGVtZW50U3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZSwge1xuICAgICAgZWxlbWVudERpcjogdGhpcy5lbGVtZW50RGlyLFxuICAgICAgZmlsZUV4dGVuc2lvbjogdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCksXG4gICAgICBzY2FuQ29vbGRvd25NczogZ2V0VmFsaWRhdGVkU2NhbkNvb2xkb3duKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2luZ3VsYXIgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoaXMgZWxlbWVudCB0eXBlIChlLmcuLCBcInNraWxsXCIsIFwicGVyc29uYVwiKS5cbiAgICogVXNlZCBpbiBmaWxlbmFtZSBnZW5lcmF0aW9uICh7bmFtZX0te2xhYmVsfS5tZCkgYW5kIGRpc3BsYXkgc3RyaW5ncy5cbiAgICogTXVzdCByZXR1cm4gdGhlIHNpbmd1bGFyIGZvcm0g4oCUIG5vdCB0aGUgcGx1cmFsIEVsZW1lbnRUeXBlIHZhbHVlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYXBpdGFsaXplZCB2ZXJzaW9uIG9mIHRoZSBlbGVtZW50IGxhYmVsLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEVsZW1lbnRMYWJlbCgpO1xuICAgIHJldHVybiBsYWJlbC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGxhYmVsLnNsaWNlKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gZWxlbWVudCBmcm9tIGZpbGVcbiAgICogVEVNUExBVEUgTUVUSE9EOiBEZWZpbmVzIHRoZSBhbGdvcml0aG0sIHN1YmNsYXNzZXMgY3VzdG9taXplIHN0ZXBzXG4gICAqXG4gICAqIFNFQ1VSSVRZIEZJWEVTIChpbmhlcml0ZWQgZnJvbSBvcmlnaW5hbCBtYW5hZ2Vycyk6XG4gICAqIC0gdGhpcy5maWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoKSBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnNcbiAgICogLSBQYXRoIHZhbGlkYXRpb24gcHJldmVudHMgdHJhdmVyc2FsIGF0dGFja3NcbiAgICogLSBTZWN1cml0eSBldmVudCBsb2dnaW5nIGZvciBhdWRpdCB0cmFpbFxuICAgKi9cbiAgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgeyByZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6bG9hZDpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRFbGVtZW50RmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRgXG4gICAgICB9KTtcbiAgICAgIC8vIElzc3VlICM4MTA6IFBhc3MgZWxlbWVudCB0eXBlIGFzIGNvbnRlbnRDb250ZXh0IHNvIFNlY3VyZVlhbWxQYXJzZXIgZXhlbXB0c1xuICAgICAgLy8gbGVnaXRpbWF0ZSBwYXR0ZXJucyAoZS5nLiwgPHNjcmlwdD4gc2VjdGlvbiB0YWdzIGluIHRlbXBsYXRlcylcbiAgICAgIGNvbnN0IGNvbnRlbnRDb250ZXh0ID0gQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUW3RoaXMuZWxlbWVudFR5cGVdO1xuICAgICAgaWYgKCFjb250ZW50Q29udGV4dCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIE5vIGNvbnRlbnRDb250ZXh0IG1hcHBpbmcgZm9yIGVsZW1lbnRUeXBlICcke3RoaXMuZWxlbWVudFR5cGV9JyDigJQgcGFyc2luZyB3aXRob3V0IGNvbnRleHQgZXhlbXB0aW9ucy4gQXZhaWxhYmxlOiAke09iamVjdC5rZXlzKEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVCkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihjb250ZW50LCB1bmRlZmluZWQsIHsgY29udGVudENvbnRleHQgfSk7XG5cbiAgICAgIC8vIElzc3VlICM2OTU6IEZpbGwgaW4gbWlzc2luZyBtZXRhZGF0YSBmaWVsZHMgd2l0aCBzZW5zaWJsZSBkZWZhdWx0c1xuICAgICAgLy8gYmVmb3JlIHBhcnNlTWV0YWRhdGEoKSBzbyBvbGRlciBlbGVtZW50cyB3aXRoIHNwYXJzZSBmcm9udG1hdHRlclxuICAgICAgLy8gZG9uJ3QgZ2V0IHJlamVjdGVkLlxuICAgICAgdGhpcy5taWdyYXRlTWV0YWRhdGFEZWZhdWx0cyhwYXJzZWQuZGF0YSwgcmVsYXRpdmVQYXRoKTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnBhcnNlTWV0YWRhdGEocGFyc2VkLmRhdGEpO1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuXG4gICAgICBpZiAodGhpcy5hZnRlckxvYWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlckxvYWQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gSXNzdWUgIzcwODogQ2xlYXIgYW55IHByZXZpb3VzIGludmFsaWQgcmVjb3JkIG9uIHN1Y2Nlc3NmdWwgbG9hZFxuICAgICAgdGhpcy5pbnZhbGlkRWxlbWVudHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gbG9hZGVkOiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpsb2FkOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQgfSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJc3N1ZSAjNzA4OiBSZWNvcmQgdGhlIGZhaWx1cmUgc28gY2FsbGVycyBjYW4gZGlzdGluZ3Vpc2hcbiAgICAgIC8vIFwiZmlsZSBub3QgZm91bmRcIiBmcm9tIFwiZmlsZSBleGlzdHMgYnV0IGZhaWxlZCB2YWxpZGF0aW9uXCIuXG4gICAgICAvLyBPbmx5IHRyYWNrIHBhcnNlL3ZhbGlkYXRpb24gZXJyb3JzIOKAlCBFTk9FTlQgbWVhbnMgdGhlIGZpbGUgaXMgZ2VudWluZWx5XG4gICAgICAvLyBtaXNzaW5nLCBub3QgaW52YWxpZCwgc28gd2UgbXVzdCBub3QgcG9sbHV0ZSB0aGUgaW52YWxpZCBtYXAgd2l0aCBpdC5cbiAgICAgIGNvbnN0IGlzRmlsZU5vdEZvdW5kID0gKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCc7XG4gICAgICBsZXQgaXNSZXBlYXRFcnJvciA9IGZhbHNlO1xuXG4gICAgICBpZiAoIWlzRmlsZU5vdEZvdW5kKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmludmFsaWRFbGVtZW50cy5nZXQocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgaXNSZXBlYXRFcnJvciA9IGV4aXN0aW5nPy5yZWFzb24gPT09IHJlYXNvbjtcblxuICAgICAgICB0aGlzLmludmFsaWRFbGVtZW50cy5zZXQocmVsYXRpdmVQYXRoLCB7XG4gICAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgZmFpbGVkQXQ6IGlzUmVwZWF0RXJyb3IgPyBleGlzdGluZyEuZmFpbGVkQXQgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZXBlYXRFcnJvcikge1xuICAgICAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuYWRkKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgU3VwcHJlc3NlZCByZXBlYXRlZCBsb2FkIGVycm9yIGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9ICR7cmVsYXRpdmVQYXRofWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICAgJ2VsZW1lbnQ6bG9hZDplcnJvcicsXG4gICAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlcnJvciB9KVxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gZnJvbSAke2Fic29sdXRlUGF0aH06YCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM2OTU6IFByZS1maWxsIG1pc3NpbmcgbWV0YWRhdGEgZmllbGRzIHdpdGggc2Vuc2libGUgZGVmYXVsdHNcbiAgICogYmVmb3JlIHBhcnNlTWV0YWRhdGEoKSBydW5zLiBUaGlzIGltcGxlbWVudHMgdGhlIFwidG9sZXJhbnQgcmVhZGVyXCIgcGF0dGVyblxuICAgKiDigJQgc3RyaWN0IG9uIG91dHB1dCwgbGVuaWVudCBvbiBpbnB1dCBmb3Igb2xkZXIvc3BhcnNlIGZyb250bWF0dGVyLlxuICAgKlxuICAgKiBNdXRhdGVzIGBkYXRhYCBpbiBwbGFjZS4gTG9ncyBhIHdhcm5pbmcgZm9yIGVhY2ggZGVmYXVsdGVkIGZpZWxkIHNvXG4gICAqIG9wZXJhdG9ycyBrbm93IHdoaWNoIGZpbGVzIG5lZWQgdXBkYXRpbmcuXG4gICAqL1xuICBwcml2YXRlIG1pZ3JhdGVNZXRhZGF0YURlZmF1bHRzKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWlncmF0ZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBJbmZlciB0eXBlIGZyb20gdGhpcyBtYW5hZ2VyJ3MgZWxlbWVudCB0eXBlXG4gICAgaWYgKCFkYXRhLnR5cGUpIHtcbiAgICAgIC8vIEVsZW1lbnRUeXBlIGlzIHBsdXJhbCAoJ3BlcnNvbmFzJywgJ3NraWxscycsIGV0Yy4pXG4gICAgICAvLyBTb21lIG1hbmFnZXJzIGV4cGVjdCBzaW5ndWxhciAoJ3BlcnNvbmEnLCAnYWdlbnQnKSwgc29tZSBwbHVyYWwuXG4gICAgICAvLyBTZXQgdGhlIHBsdXJhbCBmb3JtIOKAlCBwYXJzZU1ldGFkYXRhKCkgaGFuZGxlcyBub3JtYWxpemF0aW9uLlxuICAgICAgZGF0YS50eXBlID0gdGhpcy5lbGVtZW50VHlwZTtcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ3R5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBJbmZlciBuYW1lIGZyb20gZmlsZW5hbWUgKHN0cmlwIGV4dGVuc2lvbiwgdW4tc2x1Z2lmeSlcbiAgICBpZiAoIWRhdGEubmFtZSkge1xuICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSk7XG4gICAgICBkYXRhLm5hbWUgPSBiYXNlbmFtZTtcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ25hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHZlcnNpb25cbiAgICBpZiAoIWRhdGEudmVyc2lvbikge1xuICAgICAgZGF0YS52ZXJzaW9uID0gJzEuMC4wJztcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ3ZlcnNpb24nKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGF1dGhvclxuICAgIGlmICghZGF0YS5hdXRob3IpIHtcbiAgICAgIGRhdGEuYXV0aG9yID0gJ3Vua25vd24nO1xuICAgICAgbWlncmF0ZWQucHVzaCgnYXV0aG9yJyk7XG4gICAgfVxuXG4gICAgaWYgKG1pZ3JhdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgW1RvbGVyYW50UmVhZGVyXSAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gXCIke2ZpbGVQYXRofVwiOiBgICtcbiAgICAgICAgYGRlZmF1bHRlZCBtaXNzaW5nIGZpZWxkczogJHttaWdyYXRlZC5qb2luKCcsICcpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IFJldHVybnMgZWxlbWVudHMgdGhhdCBleGlzdCBvbiBkaXNrIGJ1dCBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogQ2FsbGVycyBjYW4gdXNlIHRoaXMgdG8gcmVwb3J0IGludmFsaWQgZWxlbWVudHMgaW5zdGVhZCBvZiBzaWxlbnRseSBoaWRpbmcgdGhlbS5cbiAgICovXG4gIGdldEludmFsaWRFbGVtZW50cygpOiBJbnZhbGlkRWxlbWVudFJlY29yZFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuaW52YWxpZEVsZW1lbnRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBDaGVjayBpZiBhIHNwZWNpZmljIGZpbGUgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIFVzZWQgYnkgZ2V0X2VsZW1lbnQgdG8gZGlzdGluZ3Vpc2ggXCJub3QgZm91bmRcIiBmcm9tIFwiaW52YWxpZFwiLlxuICAgKi9cbiAgZ2V0SW52YWxpZEVsZW1lbnQobmFtZTogc3RyaW5nKTogSW52YWxpZEVsZW1lbnRSZWNvcmQgfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGJ5IGV4YWN0IHBhdGggbWF0Y2ggYW5kIGJ5IG5hbWUtYmFzZWQgbWF0Y2hcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgcmVjb3JkXSBvZiB0aGlzLmludmFsaWRFbGVtZW50cykge1xuICAgICAgaWYgKGZpbGVQYXRoID09PSBuYW1lKSByZXR1cm4gcmVjb3JkO1xuICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSk7XG4gICAgICBpZiAoYmFzZW5hbWUgPT09IG5hbWUgfHwgdGhpcy5ub3JtYWxpemVGaWxlbmFtZShiYXNlbmFtZSkgPT09IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFuIGVsZW1lbnQgdG8gZmlsZVxuICAgKiBURU1QTEFURSBNRVRIT0Q6IENvbW1vbiBzYXZlIGxvZ2ljIHdpdGggaG9va3MgZm9yIGN1c3RvbWl6YXRpb25cbiAgICpcbiAgICogU0VDVVJJVFkgRklYRVM6XG4gICAqIC0gdGhpcy5maWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKCkgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqIC0gUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgdHJhdmVyc2FsIGF0dGFja3NcbiAgICogLSBTZWN1cml0eSBldmVudCBsb2dnaW5nXG4gICAqL1xuICBhc3luYyBzYXZlKGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSh0aGlzLmdldEVsZW1lbnRMYWJlbCgpLCBjb3JyZWxhdGlvbklkKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0VESVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uc2F2ZWAsXG4gICAgICBkZXRhaWxzOiBgU2F2aW5nICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX06ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfSB2JHtlbGVtZW50Lm1ldGFkYXRhLnZlcnNpb24gfHwgJ3Vua25vd24nfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmdldEVsZW1lbnRMYWJlbCgpLFxuICAgICAgICBhdXRob3I6IGVsZW1lbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB2ZXJzaW9uOiBlbGVtZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6c2F2ZTpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQgfSlcbiAgICApO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkQ29tbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZChyZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCk7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OnNhdmU6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZFJvbGxiYWNrKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpzYXZlOmVycm9yJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50LCBlcnJvciB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5iZWZvcmVTYXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYmVmb3JlU2F2ZShlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKSk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEJlZm9yZVNhdmUoYWJzb2x1dGVQYXRoKTtcblxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgLy8gRml4ICM5MDg6IFZhbGlkYXRlIHNlcmlhbGl6ZWQgY29udGVudCBiZWZvcmUgd3JpdGluZyAoc3ltbWV0cmljIHdpdGggcmVhZCBwYXRoKS5cbiAgICAgIC8vIFJlYWQgcGF0aCB2YWxpZGF0ZXMgdmlhIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSDihpIgQ29udGVudFZhbGlkYXRvcjsgd3JpdGUgcGF0aFxuICAgICAgLy8gbXVzdCBhcHBseSB0aGUgc2FtZSBjaGVja3MgdG8gcHJldmVudCBzYXZpbmcgY29udGVudCB0aGF0IHdvdWxkIGZhaWwgdG8gbG9hZC5cbiAgICAgIHRoaXMudmFsaWRhdGVTZXJpYWxpemVkQ29udGVudChjb250ZW50KTtcblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoYWJzb2x1dGVQYXRoLCBjb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAodGhpcy5hZnRlclNhdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlclNhdmUoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gc2F2ZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNlcmlhbGl6ZWQgZWxlbWVudCBjb250ZW50IGJlZm9yZSB3cml0aW5nIHRvIGRpc2suXG4gICAqIEZpeCAjOTA4OiBNaXJyb3JzIHRoZSByZWFkLXBhdGggdmFsaWRhdGlvbiBmcm9tIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKVxuICAgKiB0byBlbnN1cmUgd3JpdGUg4oaSIHJlYWQgc3ltbWV0cnkuIENvbnRlbnQgdGhhdCBmYWlscyB0aGlzIGNoZWNrIHdvdWxkIGFsc29cbiAgICogZmFpbCB0byBsb2FkLCBzbyByZWplY3RpbmcgaXQgb24gd3JpdGUgcHJldmVudHMgcGVybWFuZW50bHkgYnJva2VuIGVsZW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudCAoU29uYXJDbG91ZCBTNjU5NDogdXNlIFJlZ0V4cC5leGVjKVxuICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLztcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gZnJvbnRtYXR0ZXJSZWdleC5leGVjKGNvbnRlbnQpO1xuXG4gICAgaWYgKGZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gZnJvbnRtYXR0ZXJNYXRjaFsxXTtcbiAgICAgIGNvbnN0IGJvZHlDb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoZnJvbnRtYXR0ZXJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAvLyBZQU1MIGJvbWIgZGV0ZWN0aW9uIChtaXJyb3JzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSBzdGVwIDQpLlxuICAgICAgLy8gT25seSBydW4gd2hlbiBZQU1MIGlzIHVuZGVyIE1BWF9ZQU1MX0xFTkdUSCAoNjRLQikg4oCUIHRoZSBzYW1lIGxpbWl0XG4gICAgICAvLyB1c2VkIGJ5IHRoZSByZWFkIHBhdGggaW4gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpLiB2YWxpZGF0ZVlhbWxDb250ZW50KClcbiAgICAgIC8vIGluY2x1ZGVzIGl0cyBvd24gc2l6ZSBjaGVjayBpbnRlcm5hbGx5LCBhbmQgd2UgaW50ZW50aW9uYWxseSBza2lwIHNpemVcbiAgICAgIC8vIGVuZm9yY2VtZW50IG9uIHRoZSB3cml0ZSBwYXRoIGJlY2F1c2UgdGhlIHNlcmlhbGl6ZXIgbWF5IHByb2R1Y2UgbGFyZ2VcbiAgICAgIC8vIGZyb250bWF0dGVyIGZvciBlbGVtZW50cyB3aXRoIGxvbmcgaW5zdHJ1Y3Rpb25zLiBUaGUgcmVhZCBwYXRoIHdpbGxcbiAgICAgIC8vIHJlamVjdCBvdmVyc2l6ZWQgWUFNTCBvbiB0aGUgbmV4dCBsb2FkIGlmIG5lZWRlZC5cbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPD0gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50YCxcbiAgICAgICAgICAgIGRldGFpbHM6IGBNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuIGRldGVjdGVkIGluIHNlcmlhbGl6ZWQgb3V0cHV0IGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IHlhbWxMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aCB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgICBgU2VyaWFsaXplZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IGNvbnRhaW5zIG1hbGljaW91cyBZQU1MIHBhdHRlcm5zIOKAlCB3cml0ZSBibG9ja2VkLiBgICtcbiAgICAgICAgICAgIGBSZXZpZXcgdGhlIGVsZW1lbnQncyBtZXRhZGF0YSBhbmQgaW5zdHJ1Y3Rpb25zIGZvciBzdXNwaWNpb3VzIGFuY2hvci9hbGlhcyBwYXR0ZXJucy5gLFxuICAgICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQm9keSBjb250ZW50IHZhbGlkYXRpb24gd2l0aCBlbGVtZW50IHR5cGUgY29udGV4dFxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBjb25zdCBib2R5VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShib2R5Q29udGVudCwge1xuICAgICAgICBjb250ZW50Q29udGV4dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5VmFsaWRhdGlvbi5pc1ZhbGlkICYmIGJvZHlWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICAgIGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBib2R5IGNvbnRlbnQ6ICR7Ym9keVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgICdjcml0aWNhbCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgYXZhaWxhYmxlIGVsZW1lbnRzXG4gICAqIFNFQ1VSSVRZOiBVc2VzIFBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKCkgd2hpY2ggZmlsdGVycyB0ZXN0IGVsZW1lbnRzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8VFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBTY2FuIGZvciBjaGFuZ2VzIOKAlCBwb3B1bGF0ZXMgaW5kZXggZm9yIGxpc3RTdW1tYXJpZXMoKS9maW5kQnlOYW1lKClcbiAgICAgIC8vIE5vbi1mYXRhbDogc2NhbiBmYWlsdXJlIG11c3QgbmV2ZXIgcHJldmVudCBsaXN0KCkgZnJvbSByZXR1cm5pbmcgcmVzdWx0c1xuICAgICAgLy8gRXZpY3Qgc3RhbGUgY2FjaGUgZW50cmllcyBzbyB0aGUgY2FjaGUgY2hlY2sgYmVsb3cgbmV2ZXIgcmV0dXJucyBvdXRkYXRlZCBkYXRhXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuc2NhbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgWy4uLmRpZmYubW9kaWZpZWQsIC4uLmRpZmYucmVtb3ZlZF0pIHtcbiAgICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNQYXRoKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHsgLyogaW5kZXggdW5hdmFpbGFibGUsIGxpc3QoKSBjb250aW51ZXMgd2l0aG91dCBjYWNoZSBvcHRpbWl6YXRpb24gKi8gfVxuXG4gICAgICAvLyBVc2UgUG9ydGZvbGlvTWFuYWdlciBmb3IgYXV0aG9yaXRhdGl2ZSBmaWxlIGxpc3QgKyBzZWN1cml0eSBmaWx0ZXJpbmdcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyh0aGlzLmVsZW1lbnRUeXBlKTtcblxuICAgICAgLy8gTG9hZCBhbGwgZWxlbWVudHMgaW4gcGFyYWxsZWwsIGNoZWNraW5nIGNhY2hlIGJlZm9yZSBkaXNrXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgKGF2b2lkcyBkaXNrIHJlYWQgaWYgZWxlbWVudCBpcyBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgICAgICAgLy8gQ2FjaGUgbWlzcyDigJQgcmVhZCBmcm9tIGRpc2sgKHBvcHVsYXRlcyBjYWNoZSBmb3IgbmV4dCB0aW1lKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGxvYWQoKSBoYW5kbGVzIGVycm9yIGxvZ2dpbmcgd2l0aCBkZWR1cGxpY2F0aW9uXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBGaWx0ZXIgb3V0IGZhaWxlZCBsb2FkcyBhbmQgcmV0dXJuXG4gICAgICByZXR1cm4gZWxlbWVudHMuZmlsdGVyKChlKTogZSBpcyBBd2FpdGVkPFQ+ID0+IGUgIT09IG51bGwpIGFzIFRbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYCR7bGFiZWx9cyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXlgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbGlzdCAke3RoaXMuZWxlbWVudFR5cGV9czpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgbGlnaHR3ZWlnaHQgbWV0YWRhdGEgc3VtbWFyaWVzIHdpdGhvdXQgbG9hZGluZyBmdWxsIGVsZW1lbnRzLlxuICAgKiBVc2VmdWwgd2hlbiBvbmx5IG5hbWVzL2Rlc2NyaXB0aW9ucy90YWdzIGFyZSBuZWVkZWQuXG4gICAqL1xuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZUxheWVyLmxpc3RTdW1tYXJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBlbGVtZW50cy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSBlbGVtZW50cyBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBuYW1lIG9yIElEIHdpdGhvdXQgbG9hZGluZyBhbGwgZWxlbWVudHNcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gZm9yIGFjdGl2YXRpb24gZmxvd1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhbiBvcHRpbWl6ZWQgbG9va3VwIHRoYXQgdHJpZXMgY2FjaGUgZmlyc3QsIHRoZW5cbiAgICogYXR0ZW1wdHMgZGlyZWN0IGZpbGUgYWNjZXNzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gZnVsbCBsaXN0KCkgc2Nhbi5cbiAgICogVGhpcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIGxpc3QoKSBmb3IgbGFyZ2UgcG9ydGZvbGlvcy5cbiAgICpcbiAgICogUEVSRk9STUFOQ0UgSU1QUk9WRU1FTlRTOlxuICAgKiAxLiBDYWNoZSBsb29rdXAgLSBPKDEpIGlmIGVsZW1lbnQgd2FzIHByZXZpb3VzbHkgbG9hZGVkXG4gICAqIDIuIERpcmVjdCBmaWxlIGFjY2VzcyAtIE8oMSkgZm9yIG5hbWUtYmFzZWQgbG9va3Vwc1xuICAgKiAzLiBGdWxsIHNjYW4gZmFsbGJhY2sgLSBPKG4pIG9ubHkgaWYgYWJvdmUgbWV0aG9kcyBmYWlsXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRWxlbWVudCBuYW1lIG9yIElEIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgRWxlbWVudCBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmFtZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBGaXJzdCwgdHJ5IGZpbmRpbmcgaW4gY2FjaGUgYnkgaXRlcmF0aW5nIGNhY2hlZCBlbGVtZW50c1xuICAgIC8vIFRoaXMgaXMgZmFzdCAoTyhjYWNoZSBzaXplKSkgYW5kIHdvcmtzIGZvciByZWNlbnRseSBhY2Nlc3NlZCBlbGVtZW50c1xuICAgIGNvbnN0IGNhY2hlZEVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRJbkNhY2hlKGlkZW50aWZpZXIpO1xuICAgIGlmIChjYWNoZWRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gY2FjaGVkRWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIHRyeSBzdG9yYWdlIGxheWVyIGluZGV4IChPKDEpIG5hbWUgbG9va3VwKVxuICAgIGNvbnN0IGluZGV4ZWRQYXRoID0gdGhpcy5zdG9yYWdlTGF5ZXIuZ2V0UGF0aEJ5TmFtZShpZGVudGlmaWVyKTtcbiAgICBpZiAoaW5kZXhlZFBhdGgpIHtcbiAgICAgIHRyeSB7IHJldHVybiBhd2FpdCB0aGlzLmxvYWQoaW5kZXhlZFBhdGgpOyB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH1cbiAgICB9XG5cbiAgICAvLyBUaGlyZCwgdHJ5IGRpcmVjdCBmaWxlIGFjY2VzcyB1c2luZyBzdGFuZGFyZCBuYW1pbmcgY29udmVudGlvblxuICAgIC8vIEVsZW1lbnQgZmlsZXMgYXJlIHR5cGljYWxseSBuYW1lZDogbG93ZXJjYXNlLW5hbWUtd2l0aC1oeXBoZW5zLntleHR9XG4gICAgLy8gVGhpcyBpcyBPKDEpIGZpbGUgc3lzdGVtIGxvb2t1cFxuICAgIGNvbnN0IGRpcmVjdExvYWRBdHRlbXB0ID0gYXdhaXQgdGhpcy50cnlEaXJlY3RMb2FkKGlkZW50aWZpZXIpO1xuICAgIGlmIChkaXJlY3RMb2FkQXR0ZW1wdCkge1xuICAgICAgcmV0dXJuIGRpcmVjdExvYWRBdHRlbXB0O1xuICAgIH1cblxuICAgIC8vIElmIHN0b3JhZ2UgbGF5ZXIgaGFzIGNvbXBsZXRlZCBhdCBsZWFzdCBvbmUgc2NhbiwgdGhlIGluZGV4IGlzXG4gICAgLy8gYXV0aG9yaXRhdGl2ZSDigJQgYSBtaXNzIG1lYW5zIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LiBTa2lwIHRoZVxuICAgIC8vIGV4cGVuc2l2ZSBsaXN0KCkgZmFsbGJhY2sgdG8gYXZvaWQgTyhuKSByZXNjYW5zIG9uIGV2ZXJ5IGNhY2hlIG1pc3MuXG4gICAgaWYgKHRoaXMuc3RvcmFnZUxheWVyLmhhc0NvbXBsZXRlZFNjYW4oKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogRnVsbCBsaXN0KCkgc2NhbiAoTyhuKSAtIGxvYWRzIGFsbCBlbGVtZW50cylcbiAgICAvLyBPbmx5IHVzZWQgb24gZmlyc3QgYWNjZXNzIGJlZm9yZSBhbnkgc2NhbiBoYXMgY29tcGxldGVkLlxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBmaW5kIGVsZW1lbnRzIGV2ZW4gd2l0aCBub24tc3RhbmRhcmQgZmlsZSBuYW1pbmcuXG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoZSA9PlxuICAgICAgdGhpcy5ub3JtYWxpemVGaWxlbmFtZShlLm1ldGFkYXRhLm5hbWUpID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgZS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGlkZW50aWZpZXIudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgZS5pZCA9PT0gaWRlbnRpZmllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBTZWFyY2ggY2FjaGUgZm9yIGVsZW1lbnQgYnkgbmFtZSBvciBJRFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kSW5DYWNoZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBMUlVDYWNoZSBkb2Vzbid0IHByb3ZpZGUgaXRlcmF0aW9uLCBidXQgd2UgY2FuIGNoZWNrIGlmIHdlIGhhdmVcbiAgICAvLyBhIGNhY2hlZCBwYXRoIGZvciB0aGlzIGlkZW50aWZpZXIgYnkgdHJ5aW5nIGNvbW1vbiBuYW1pbmcgcGF0dGVybnMuXG4gICAgLy8gSU1QT1JUQU5UOiBmaWxlUGF0aFRvSWQgc3RvcmVzIGFic29sdXRlIHBhdGhzIChzZXQgYnkgY2FjaGVFbGVtZW50IHZpYVxuICAgIC8vIHJlc29sdmVBYnNvbHV0ZVBhdGgpLCBzbyB3ZSBtdXN0IHJlc29sdmUgdG8gYWJzb2x1dGUgYmVmb3JlIGxvb2t1cC5cbiAgICBjb25zdCBwb3NzaWJsZUZpbGVuYW1lcyA9IFtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBgJHtpZGVudGlmaWVyfSR7dGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCl9YCxcbiAgICAgIC8vIFVzZSB1bmlmaWVkIG5vcm1hbGl6ZUZpbGVuYW1lIGZvciBjb25zaXN0ZW50IGNhY2hlIGxvb2t1cHNcbiAgICAgIHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGlkZW50aWZpZXIpXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcG9zc2libGVGaWxlbmFtZXMpIHtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlbmFtZSk7XG4gICAgICBjb25zdCBjYWNoZWRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKGNhY2hlZElkKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLmdldChjYWNoZWRJZCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogVHJ5IGxvYWRpbmcgZWxlbWVudCBkaXJlY3RseSBieSBjb25zdHJ1Y3RpbmcgZXhwZWN0ZWQgZmlsZW5hbWVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdHJ5RGlyZWN0TG9hZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBUcnkgbG9hZGluZyB1c2luZyBjb21tb24gbmFtaW5nIHBhdHRlcm5zXG4gICAgLy8gVXNlIHVuaWZpZWQgbm9ybWFsaXplRmlsZW5hbWUgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgY29uc3RydWN0aW9uXG4gICAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICAgIC8vIFByaW1hcnk6IFVzZSB1bmlmaWVkIG5vcm1hbGl6YXRpb24gKGhhbmRsZXMgQ2FtZWxDYXNlLCBzcGFjZXMsIHVuZGVyc2NvcmVzLCBldGMuKVxuICAgICAgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoaWRlbnRpZmllciksXG4gICAgICAvLyBGYWxsYmFjazogSWRlbnRpZmllciBhcy1pcyB3aXRoIGV4dGVuc2lvblxuICAgICAgYCR7aWRlbnRpZmllcn0ke3RoaXMuZ2V0RmlsZUV4dGVuc2lvbigpfWAsXG4gICAgICAvLyBGYWxsYmFjazogSWRlbnRpZmllciBhbHJlYWR5IGluY2x1ZGVzIGV4dGVuc2lvblxuICAgICAgaWRlbnRpZmllclxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmxvYWQoZmlsZVBhdGgpO1xuICAgICAgICAvLyBWZXJpZnkgdGhlIGxvYWRlZCBlbGVtZW50IG1hdGNoZXMgdGhlIGlkZW50aWZpZXJcbiAgICAgICAgLy8gTm9ybWFsaXplIGJvdGggc2lkZXMgc28gXCJDb2RlIFJldmlld1wiIChzcGFjZXMpIG1hdGNoZXMgXCJjb2RlLXJldmlld1wiIChoeXBoZW5zKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkTWV0YU5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGVsZW1lbnQubWV0YWRhdGEubmFtZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXRhTmFtZSA9PT0gbm9ybWFsaXplZElkZW50aWZpZXIgfHxcbiAgICAgICAgICAgIGVsZW1lbnQubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCBvciBmYWlsZWQgdG8gbG9hZCAtIHRyeSBuZXh0IHBhdGhcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBlbGVtZW50XG4gICAqIERlbGVnYXRlcyB0byBlbGVtZW50J3Mgb3duIHZhbGlkYXRlIG1ldGhvZFxuICAgKlxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIGJvdGggJ3ZhbGlkJyBhbmQgJ2lzVmFsaWQnIHByb3BlcnRpZXMuXG4gICAqICAgICAgICAgICdpc1ZhbGlkJyBpcyBkZXByZWNhdGVkIC0gdXNlICd2YWxpZCcgZm9yIG5ldyBjb2RlLlxuICAgKi9cbiAgdmFsaWRhdGUoZWxlbWVudDogVCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZWxlbWVudFxuICAgKiBTRUNVUklUWTogUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0c2lkZSBkaXJlY3RvcnlcbiAgICogQ0FDSEUgRklYOiBVc2VzIGZpbGVwYXRoLWJhc2VkIGNhY2hlIHJlbW92YWwgdG8gcHJldmVudCBzdGFsZSBlbnRyaWVzXG4gICAqL1xuICBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmRlbGV0ZWAsXG4gICAgICBkZXRhaWxzOiBgQXR0ZW1wdGluZyB0byBkZWxldGUgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSh0aGlzLmdldEVsZW1lbnRMYWJlbCgpLCBjb3JyZWxhdGlvbklkKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpkZWxldGU6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZENvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLnVuY2FjaGVCeVBhdGgocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRSb2xsYmFjayhhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOmVycm9yJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlcnJvciB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jYW5EZWxldGUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZvclZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLmxvYWRFbGVtZW50U25hcHNob3QoYWJzb2x1dGVQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGF3YWl0IHRoaXMuY2FuRGVsZXRlKGVsZW1lbnRGb3JWYWxpZGF0aW9uKTtcbiAgICAgICAgaWYgKCFkZWNpc2lvbi5hbGxvd2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRlY2lzaW9uLnJlYXNvbiA/PyBgRGVsZXRpb24gbm90IHBlcm1pdHRlZCBmb3IgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vdmVkVG9CYWNrdXAgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEJlZm9yZURlbGV0ZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKCFtb3ZlZFRvQmFja3VwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZGVsZXRlYFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gZGVsZXRlZDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhhYnNvbHV0ZVBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpbGUgcGF0aFxuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgICAgaWYgKCFzYW5pdGl6ZWQgfHwgcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2FuaXRpemVkLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKHNhbml0aXplZCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCddO1xuXG4gICAgICByZXR1cm4gZXh0ID09PSAnJyB8fCBhbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhleHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgZmlsZSBwYXRoIHRvIGl0cyBhYnNvbHV0ZSBmb3JtIGZvciBjYWNoZSBjb25zaXN0ZW5jeVxuICAgKiBFbnN1cmVzIGNvbnNpc3RlbnQgcGF0aCBoYW5kbGluZyBhY3Jvc3MgcmVsYXRpdmUvYWJzb2x1dGUgcGF0aHNcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICA/IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKVxuICAgICAgOiBwYXRoLm5vcm1hbGl6ZShwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBmaWxlUGF0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8eyByZWxhdGl2ZVBhdGg6IHN0cmluZzsgYWJzb2x1dGVQYXRoOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWRQYXRoIHx8IHNhbml0aXplZFBhdGgudHJpbSgpLmxlbmd0aCA9PT0gMCB8fCBzYW5pdGl6ZWRQYXRoID09PSAnLicgfHwgc2FuaXRpemVkUGF0aCA9PT0gcGF0aC5zZXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGg6IGVtcHR5IHBhdGggaXMgbm90IGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFic29sdXRlICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIChyZW1vdmUgcmVkdW5kYW50IHNlcGFyYXRvcnMsIHJlc29sdmUgLiBhbmQgLi4pXG4gICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aXZlID0gcGF0aC5ub3JtYWxpemUoc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBCdWlsZCBhYnNvbHV0ZSBwYXRoXG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgbm9ybWFsaXplZFJlbGF0aXZlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBXSVRIT1VUIHJlc29sdmluZyBzeW1saW5rcyAtIGp1c3QgY2hlY2sgc2VjdXJpdHkgY29uc3RyYWludHNcbiAgICAgIGF3YWl0IFBhdGhWYWxpZGF0b3IudmFsaWRhdGVFbGVtZW50UGF0aE9ubHkoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIGlucHV0IGFzIHJlbGF0aXZlUGF0aCAoaXQncyBhbHJlYWR5IHJlbGF0aXZlKSBhbmQgY29tcHV0ZWQgYWJzb2x1dGVQYXRoXG4gICAgICByZXR1cm4geyByZWxhdGl2ZVBhdGg6IG5vcm1hbGl6ZWRSZWxhdGl2ZSwgYWJzb2x1dGVQYXRoIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCc7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRoOiAke3JlYXNvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldCh0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKSk7XG4gICAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmdldChlbGVtZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBjYWNoZSBsb29rdXAgYnkgYWJzb2x1dGUgcGF0aC5cbiAgICogQWxsb3dzIHN1YmNsYXNzZXMgd2l0aCBjdXN0b20gbG9hZCgpIG92ZXJyaWRlcyAoZS5nLiBNZW1vcnlNYW5hZ2VyKVxuICAgKiB0byBjaGVjayB0aGUgTFJVIGNhY2hlIGJlZm9yZSByZS1yZWFkaW5nIGZyb20gZGlzay5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRDYWNoZWRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRWxlbWVudFNuYXBzaG90KGFic29sdXRlUGF0aDogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRFbGVtZW50RmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5sb2FkRWxlbWVudFNuYXBzaG90YFxuICAgIH0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihyYXcsIHVuZGVmaW5lZCwge1xuICAgICAgY29udGVudENvbnRleHQ6IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXSxcbiAgICB9KTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBwYXlsb2FkIGZvciBlbGVtZW50IGxpZmVjeWNsZSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaGVscGVyIGlzIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzIHRvIGVuc3VyZSBjb25zaXN0ZW50IGV2ZW50IHBheWxvYWRcbiAgICogc3RydWN0dXJlIHdoZW4gZW1pdHRpbmcgY3VzdG9tIGV2ZW50cyB2aWEgdGhlIGRpc3BhdGNoZXIgZ2V0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gRXZlbnQgcGFyYW1ldGVycyBpbmNsdWRpbmcgY29ycmVsYXRpb24gSUQsIGVsZW1lbnQsIGZpbGUgcGF0aCwgYW5kIG9wdGlvbmFsIGVycm9yXG4gICAqIEByZXR1cm5zIEZ1bGx5LWZvcm1lZCBFbGVtZW50RXZlbnRQYXlsb2FkIHJlYWR5IGZvciBlbWlzc2lvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUV2ZW50UGF5bG9hZChwYXJhbXM6IHtcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gICAgZWxlbWVudD86IFQ7XG4gICAgZXJyb3I/OiB1bmtub3duO1xuICB9KTogRWxlbWVudEV2ZW50UGF5bG9hZCB7XG4gICAgY29uc3QgZWxlbWVudElkID0gcGFyYW1zLmVsZW1lbnQ/LmlkO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSBlbGVtZW50SWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmdldChlbGVtZW50SWQpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjb3JyZWxhdGlvbklkOiBwYXJhbXMuY29ycmVsYXRpb25JZCxcbiAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmVsZW1lbnRUeXBlLFxuICAgICAgZWxlbWVudElkLFxuICAgICAgZmlsZVBhdGg6IHBhcmFtcy5maWxlUGF0aCxcbiAgICAgIG1ldGFkYXRhOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyLnNuYXBzaG90TWV0YWRhdGEocGFyYW1zLmVsZW1lbnQpLFxuICAgICAgZ2VuZXJhdGlvbixcbiAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3JcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmludmFsaWRhdGUoKTtcbiAgICAvLyBDbGVhciBlcnJvciBzdXBwcmVzc2lvbiBzbyBhIGNoYW5nZWQgZmlsZSBnZXRzIGZyZXNoIGxvZ2dpbmdcbiAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAnZWxlbWVudDpleHRlcm5hbC1jaGFuZ2UnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlKSB7XG4gICAgICB2b2lkIHRoaXMubG9hZChyZWxhdGl2ZVBhdGgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignQXV0byByZWxvYWQgYWZ0ZXIgZXh0ZXJuYWwgY2hhbmdlIGZhaWxlZCcsIHtcbiAgICAgICAgICBlbGVtZW50VHlwZTogdGhpcy5lbGVtZW50VHlwZSxcbiAgICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQWRkcyBhbiBlbGVtZW50IHRvIGJvdGggY2FjaGVzIChiaWRpcmVjdGlvbmFsIG1hcHBpbmcpXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjYWNoZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBGaWxlIHBhdGggKHJlbGF0aXZlIG9yIGFic29sdXRlKVxuICAgKi9cbiAgcHJvdGVjdGVkIGNhY2hlRWxlbWVudChlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcblxuICAgIC8vIENsZWFyIGFueSBzdGFsZSBjYWNoZSBlbnRyaWVzIGZvciB0aGlzIGZpbGVwYXRoIGJlZm9yZSBhZGRpbmcgdGhlIG5ldyBvbmUuXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBnZW5lcmF0ZUlkKCkgaW4gQmFzZUVsZW1lbnQudHMgaW5jbHVkZXMgYSBEYXRlLm5vdygpXG4gICAgLy8gdGltZXN0YW1wLCBjYXVzaW5nIGVhY2ggbG9hZCBmcm9tIGRpc2sgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQgSUQuIFdpdGhvdXQgdGhpc1xuICAgIC8vIGNsZWFudXAsIG9sZCBJRHMgcmVtYWluIGluIHRoZSBjYWNoZSBhcyBzdGFsZSBkYXRhLCBsZWFkaW5nIHRvIGluY29uc2lzdGVudFxuICAgIC8vIHJlc3VsdHMgaW4gbWV0aG9kcyBsaWtlIGZpbmRQZXJzb25hKCkgb3IgbGlzdCgpLlxuICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdJZCAmJiBleGlzdGluZ0lkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAvLyBDbGVhciBzdGFsZSBjYWNoZSBlbnRyeSB3aGVuIGVsZW1lbnQgSUQgaGFzIGNoYW5nZWRcbiAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudHMuc2V0KGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLnNldChhYnNvbHV0ZVBhdGgsIGVsZW1lbnQuaWQpO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuY2FjaGVHZW5lcmF0aW9uQ291bnRlcjtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5zZXQoZWxlbWVudC5pZCwgZ2VuZXJhdGlvbik7XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICA/IHBhdGgucmVsYXRpdmUodGhpcy5lbGVtZW50RGlyLCBmaWxlUGF0aClcbiAgICAgIDogZmlsZVBhdGg7XG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdmaWxlbmFtZScsIHtcbiAgICAgICAgdmFsdWU6IHBhdGguYmFzZW5hbWUocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnZmlsZVBhdGgnLCB7XG4gICAgICAgIHZhbHVlOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBhdHRhY2ggZmlsZW5hbWUgbWV0YWRhdGEgdG8gZWxlbWVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gYm90aCBjYWNoZXMgYnkgZmlsZSBwYXRoXG4gICAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIGRlbGV0aW9uIHRvIGF2b2lkIHN0YWxlIGNhY2hlIGVudHJpZXNcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gRmlsZSBwYXRoIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSlcbiAgICovXG4gIHByb3RlY3RlZCB1bmNhY2hlQnlQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuXG4gICAgaWYgKGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShlbGVtZW50SWQpO1xuICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic29sdXRlUGF0aCk7XG4gICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZWxlbWVudElkKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVW5jYWNoZWQgZWxlbWVudCAke2VsZW1lbnRJZH0gZnJvbSAke2Fic29sdXRlUGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNhY2hlZCBlbGVtZW50c1xuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuY2xlYXIoKTtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmNsZWFyKCk7XG4gICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRpc3RpY3MgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjYWNoZSBzaXplIG1ldHJpY3NcbiAgICovXG4gIHByb3RlY3RlZCBnZXRDYWNoZVN0YXRzKCk6IHsgZWxlbWVudENvdW50OiBudW1iZXI7IHBhdGhNYXBwaW5nczogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGVsZW1lbnRzU3RhdHMgPSB0aGlzLmVsZW1lbnRzLmdldFN0YXRzKCk7XG4gICAgY29uc3QgcGF0aFN0YXRzID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0U3RhdHMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50Q291bnQ6IGVsZW1lbnRzU3RhdHMuc2l6ZSxcbiAgICAgIHBhdGhNYXBwaW5nczogcGF0aFN0YXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSBpbnRlcm5hbCBMUlUgY2FjaGUgaW5zdGFuY2VzIGZvciBtZXRyaWNzIGNvbGxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0TWV0cmljc0NhY2hlcygpOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgaW5zdGFuY2U6IExSVUNhY2hlPHVua25vd24+IH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBuYW1lOiBgZWxlbWVudHM6JHt0aGlzLmVsZW1lbnRUeXBlfWAsIGluc3RhbmNlOiB0aGlzLmVsZW1lbnRzIGFzIExSVUNhY2hlPHVua25vd24+IH0sXG4gICAgICB7IG5hbWU6IGBwYXRoSW5kZXg6JHt0aGlzLmVsZW1lbnRUeXBlfWAsIGluc3RhbmNlOiB0aGlzLmZpbGVQYXRoVG9JZCBhcyBMUlVDYWNoZTx1bmtub3duPiB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiByZXNvdXJjZXMgYW5kIGNsZWFudXBcbiAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gYWRkIHRoZWlyIG93biBjbGVhbnVwIGxvZ2ljXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZW1vcnlCdWRnZXQpIHtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnVucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC51bnJlZ2lzdGVyKHRoaXMuZmlsZVBhdGhUb0lkKTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLmNsZWFyKCk7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5jbGVhcigpO1xuICAgIHRoaXMud2F0Y2hlckNsZWFudXA/LigpO1xuICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmRlYnVnKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX1NYW5hZ2VyIGRpc3Bvc2VkIGFuZCBjYWNoZXMgY2xlYXJlZGApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRklMRU5BTUUgTk9STUFMSVpBVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIG5hbWUgdG8ga2ViYWItY2FzZSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBmb3JtYXR0aW5nLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyB1bmlmaWVkIGZpbGVuYW1lIG5vcm1hbGl6YXRpb24gYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLFxuICAgKiBlbnN1cmluZyBjb25zaXN0ZW50IG5hbWluZyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmb3JtYXQgKENhbWVsQ2FzZSwgc3BhY2VzLFxuICAgKiB1bmRlcnNjb3JlcywgbWl4ZWQgY2FzZSwgZXRjLikuXG4gICAqXG4gICAqIFRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIChpbiBvcmRlcik6XG4gICAqIDEuIEluc2VydCBoeXBoZW5zIGJldHdlZW4gY2FtZWxDYXNlIGJvdW5kYXJpZXMgKE15TmFtZSAtPiBNeS1OYW1lKVxuICAgKiAyLiBSZXBsYWNlIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zXG4gICAqIDMuIENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gICAqIDQuIFN0cmlwIGludmFsaWQgY2hhcmFjdGVycyAoa2VlcCBvbmx5IGEteiwgMC05LCAtKVxuICAgKiA1LiBDb2xsYXBzZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAqIDYuIFRyaW0gbGVhZGluZy90cmFpbGluZyBoeXBoZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ1JVRFYtQWdlbnQtRGVsdGFcIikgLy8gXCJjcnVkdi1hZ2VudC1kZWx0YVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ3JlYXRpdmUgV3JpdGVyXCIpICAgLy8gXCJjcmVhdGl2ZS13cml0ZXJcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNhbWVsQ2FzZU5hbWVcIikgICAgIC8vIFwiY2FtZWwtY2FzZS1uYW1lXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJteV9za2lsbF9uYW1lXCIpICAgICAvLyBcIm15LXNraWxsLW5hbWVcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIlNwZWNpYWxAQ2hhcnMhXCIpICAgIC8vIFwic3BlY2lhbC1jaGFyc1wiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiLS1sZWFkaW5nLWFuZC10cmFpbGluZy0tXCIpIC8vIFwibGVhZGluZy1hbmQtdHJhaWxpbmdcIlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBlbGVtZW50IG5hbWUgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQga2ViYWItY2FzZSBmaWxlbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqL1xuICBwcm90ZWN0ZWQgbm9ybWFsaXplRmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ3VubmFtZWQnO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lXG4gICAgICAvLyBTdGVwIDE6IEluc2VydCBoeXBoZW5zIGJldHdlZW4gY2FtZWxDYXNlIGJvdW5kYXJpZXMgKGxvd2VyY2FzZSBmb2xsb3dlZCBieSB1cHBlcmNhc2UpXG4gICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJylcbiAgICAgIC8vIFN0ZXAgMjogUmVwbGFjZSBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgJy0nKVxuICAgICAgLy8gU3RlcCAzOiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC8vIFN0ZXAgNDogU3RyaXAgaW52YWxpZCBjaGFyYWN0ZXJzIChrZWVwIG9ubHkgYWxwaGFudW1lcmljIGFuZCBoeXBoZW5zKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKVxuICAgICAgLy8gU3RlcCA1OiBDb2xsYXBzZSBtdWx0aXBsZSBjb25zZWN1dGl2ZSBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvLSsvZywgJy0nKVxuICAgICAgLy8gU3RlcCA2OiBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSBmb3IgYW4gZWxlbWVudC5cbiAgICpcbiAgICogTm9ybWFsaXplcyB0aGUgZWxlbWVudCBuYW1lIChoYW5kbGluZyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAqIGFuZCBhcHBlbmRzIHRoZSBmaWxlIGV4dGVuc2lvbi4gVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHBlcnNvbmFzLywgc2tpbGxzLywgZXRjLilcbiAgICogYWxyZWFkeSBwcm92aWRlcyB0eXBlIGNvbnRleHQsIHNvIHRoZSB0eXBlIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGVsZW1lbnQgbmFtZSB0byBjb252ZXJ0IHRvIGEgZmlsZW5hbWVcbiAgICogQHJldHVybnMgVGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSAoZS5nLiwgXCJjb2RlLXJldmlldy5tZFwiKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJDb2RlIFJldmlld1wiKSAgICAgICAgIC8vIOKGkiBcImNvZGUtcmV2aWV3Lm1kXCJcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiRGVidWcgRGV0ZWN0aXZlXCIpICAgICAvLyDihpIgXCJkZWJ1Zy1kZXRlY3RpdmUubWRcIlxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJCdWdSZXBvcnRcIikgICAgICAgICAgIC8vIOKGkiBcImJ1Zy1yZXBvcnQubWRcIiAoQ2FtZWxDYXNlIHNwbGl0KVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJmaXgtcGVyc29uYS1oZWxwZXJcIikgIC8vIOKGkiBcImZpeC1wZXJzb25hLWhlbHBlci5tZFwiIChubyBtYW5nbGluZylcbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSkgfHwgJ3VubmFtZWQnO1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpO1xuICAgIHJldHVybiBgJHtub3JtYWxpemVkTmFtZX0ke2V4dGVuc2lvbn1gO1xuICB9XG5cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBQlNUUkFDVCBNRVRIT0RTIC0gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbmQgdmFsaWRhdGUgbWV0YWRhdGEgZnJvbSBmcm9udG1hdHRlclxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIHZhbGlkYXRpb24gbG9naWNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgbWV0YWRhdGEgZnJvbSBZQU1MIGZyb250bWF0dGVyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBhbmQgdHlwZWQgbWV0YWRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8VFsnbWV0YWRhdGEnXT47XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBFbGVtZW50VmFsaWRhdG9yIHZpYSBWYWxpZGF0aW9uUmVnaXN0cnkgaW5zdGVhZC5cbiAgICogV2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGE6IGFueSwgX3N0cmljdD86IGJvb2xlYW4pOiBQcm9taXNlPGltcG9ydCgnLi4vLi4vdXRpbHMvdmFsaWRhdGlvbi9GaWVsZFZhbGlkYXRvci5qcycpLlZhbGlkYXRpb25FcnJvcltdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgcmV0dXJuIHJlc3VsdC5lcnJvcnMubWFwKGUgPT4gKHsgZmllbGQ6ICdnZW5lcmFsJywgbWVzc2FnZTogZSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVsZW1lbnQgaW5zdGFuY2UgZnJvbSBtZXRhZGF0YSBhbmQgY29udGVudFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIGNvbnN0cnVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBWYWxpZGF0ZWQgbWV0YWRhdGFcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBFbGVtZW50IGNvbnRlbnQgKGluc3RydWN0aW9ucywgdGVtcGxhdGUsIGV0Yy4pXG4gICAqIEByZXR1cm5zIE5ldyBlbGVtZW50IGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogVFsnbWV0YWRhdGEnXSwgY29udGVudDogc3RyaW5nKTogVDtcblxuICAvKipcbiAgICogU2VyaWFsaXplIGFuIGVsZW1lbnQgdG8gZmlsZSBjb250ZW50XG4gICAqIFN1YmNsYXNzZXMgY2FuIGN1c3RvbWl6ZSBzZXJpYWxpemF0aW9uIGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIEZpbGUgY29udGVudCAodXN1YWxseSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudDogVCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICogTW9zdCBlbGVtZW50cyB1c2UgLm1kLCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGVcbiAgICovXG4gIGFic3RyYWN0IGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZWxlbWVudCBmcm9tIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBmb3JtYXQtc3BlY2lmaWMgaW1wb3J0IGxvZ2ljXG4gICAqL1xuICBhYnN0cmFjdCBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbGVtZW50IHRvIGV4dGVybmFsIGZvcm1hdFxuICAgKiBTdWJjbGFzc2VzIGltcGxlbWVudCBmb3JtYXQtc3BlY2lmaWMgZXhwb3J0IGxvZ2ljXG4gICAqL1xuICBhYnN0cmFjdCBleHBvcnRFbGVtZW50KGVsZW1lbnQ6IFQsIGZvcm1hdD86ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz47XG59XG4iXX0=
@@ -95,6 +95,7 @@ export interface MemorySearchOptions {
95
95
  * - Preserve "pinned" memories regardless of age
96
96
  */
97
97
  export declare class Memory extends BaseElement implements IElement {
98
+ private static readonly createdMemoryNames;
98
99
  private static memoryManagerResolver?;
99
100
  /**
100
101
  * Static resolver for RetentionPolicyService (Issue #51)