@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
@@ -1 +1 @@
1
- {"version":3,"file":"LRUCache.d.ts","sourceRoot":"","sources":["../../src/cache/LRUCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LRUCache.d.ts","sourceRoot":"","sources":["../../src/cache/LRUCache.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,16 @@
5
5
  import { SecurityMonitor } from '../security/securityMonitor.js';
6
6
  import { CACHE_SIZE_ESTIMATION_CONFIG, getValidatedSampleSize } from '../config/performance-constants.js';
7
7
  export class LRUCache {
8
+ static hasLoggedInit = false;
8
9
  static logListener;
9
10
  static addLogListener(fn) {
10
11
  LRUCache.logListener = fn;
11
12
  return () => { LRUCache.logListener = undefined; };
12
13
  }
14
+ /** Reset static flags for test isolation. */
15
+ static resetStaticState() {
16
+ LRUCache.hasLoggedInit = false;
17
+ }
13
18
  name;
14
19
  maxSize;
15
20
  maxMemoryBytes;
@@ -42,19 +47,22 @@ export class LRUCache {
42
47
  this.onEviction = options.onEviction;
43
48
  this.onSet = options.onSet;
44
49
  this.sizeEstimationMode = options.sizeEstimationMode || 'fast';
45
- // FIX: DMCP-SEC-006 - Audit cache initialization
46
- SecurityMonitor.logSecurityEvent({
47
- type: 'PORTFOLIO_INITIALIZATION',
48
- severity: 'LOW',
49
- source: 'LRUCache.constructor',
50
- details: `Cache initialized with maxSize=${this.maxSize}, maxMemoryMB=${options.maxMemoryMB || 50}, ttl=${this.ttlMs}ms`,
51
- additionalData: {
52
- maxSize: this.maxSize,
53
- maxMemoryMB: options.maxMemoryMB || 50,
54
- ttlMs: this.ttlMs,
55
- sizeEstimationMode: this.sizeEstimationMode
56
- }
57
- });
50
+ // FIX: DMCP-SEC-006 - Audit cache initialization (logs only for the first cache constructed)
51
+ if (!LRUCache.hasLoggedInit) {
52
+ SecurityMonitor.logSecurityEvent({
53
+ type: 'PORTFOLIO_INITIALIZATION',
54
+ severity: 'LOW',
55
+ source: 'LRUCache.constructor',
56
+ details: `Cache initialized with maxSize=${this.maxSize}, maxMemoryMB=${options.maxMemoryMB || 50}, ttl=${this.ttlMs}ms`,
57
+ additionalData: {
58
+ maxSize: this.maxSize,
59
+ maxMemoryMB: options.maxMemoryMB || 50,
60
+ ttlMs: this.ttlMs,
61
+ sizeEstimationMode: this.sizeEstimationMode
62
+ }
63
+ });
64
+ LRUCache.hasLoggedInit = true;
65
+ }
58
66
  }
59
67
  /**
60
68
  * Get value from cache with automatic cleanup
@@ -168,18 +176,20 @@ export class LRUCache {
168
176
  this.currentMemoryBytes = 0;
169
177
  this.nextExpiryTimestamp = Infinity;
170
178
  this.evictionCount += this.cache.size;
171
- LRUCache.logListener?.('debug', 'Clear cache', {
172
- cacheName: this.name,
173
- entriesCleared,
174
- });
175
- // FIX: DMCP-SEC-006 - Audit cache clearing
176
- SecurityMonitor.logSecurityEvent({
177
- type: 'MEMORY_CLEARED',
178
- severity: 'LOW',
179
- source: 'LRUCache.clear',
180
- details: `Cache cleared: ${entriesCleared} entries removed`,
181
- additionalData: { entriesCleared }
182
- });
179
+ if (entriesCleared > 0) {
180
+ LRUCache.logListener?.('debug', 'Clear cache', {
181
+ cacheName: this.name,
182
+ entriesCleared,
183
+ });
184
+ // FIX: DMCP-SEC-006 - Audit cache clearing
185
+ SecurityMonitor.logSecurityEvent({
186
+ type: 'MEMORY_CLEARED',
187
+ severity: 'LOW',
188
+ source: 'LRUCache.clear',
189
+ details: `Cache cleared: ${entriesCleared} entries removed`,
190
+ additionalData: { entriesCleared }
191
+ });
192
+ }
183
193
  }
184
194
  /**
185
195
  * Get current cache size (number of entries)
@@ -601,4 +611,4 @@ export class CacheFactory {
601
611
  });
602
612
  }
603
613
  }
604
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJVQ2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUvTFJVQ2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsc0JBQXNCLEVBQ3ZCLE1BQU0sb0NBQW9DLENBQUM7QUFpQzVDLE1BQU0sT0FBTyxRQUFRO0lBQ1gsTUFBTSxDQUFDLFdBQVcsQ0FBeUc7SUFFbkksTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUF5RztRQUM3SCxRQUFRLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUMxQixPQUFPLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFZ0IsSUFBSSxDQUFTO0lBQ2IsT0FBTyxDQUFTO0lBQ2hCLGNBQWMsQ0FBUztJQUN2QixLQUFLLENBQVM7SUFDZCxVQUFVLENBQW1DO0lBQzdDLEtBQUssQ0FBYztJQUNuQixrQkFBa0IsQ0FBcUI7SUFFaEQsS0FBSyxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQ3hDLElBQUksR0FBd0IsSUFBSSxDQUFDO0lBQ2pDLElBQUksR0FBd0IsSUFBSSxDQUFDO0lBQ2pDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUN2QixtQkFBbUIsR0FBRyxRQUFRLENBQUM7SUFDL0IsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBRTdCLHVCQUF1QjtJQUNmLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDYixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUUxQixrRUFBa0U7SUFDMUQsTUFBTSxDQUFVLGNBQWMsR0FBRyw0QkFBNEIsQ0FBQyxjQUFjLENBQUM7SUFDN0UsTUFBTSxDQUFVLG9CQUFvQixHQUFHLDRCQUE0QixD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IG1lbW9yeSBtb25pdG9yaW5nIGFuZCBhdXRvbWF0aWMgY2xlYW51cFxuICogT3B0aW1pemVkIGZvciBsYXJnZS1zY2FsZSBpbmRleGluZyBvcGVyYXRpb25zIHdpdGggY29uZmlndXJhYmxlIG1lbW9yeSBsaW1pdHNcbiAqL1xuXG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHtcbiAgQ0FDSEVfU0laRV9FU1RJTUFUSU9OX0NPTkZJRyxcbiAgZ2V0VmFsaWRhdGVkU2FtcGxlU2l6ZVxufSBmcm9tICcuLi9jb25maWcvcGVyZm9ybWFuY2UtY29uc3RhbnRzLmpzJztcblxuZXhwb3J0IHR5cGUgU2l6ZUVzdGltYXRpb25Nb2RlID0gJ2Zhc3QnIHwgJ2JhbGFuY2VkJyB8ICdhY2N1cmF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTFJVQ2FjaGVPcHRpb25zIHtcbiAgbmFtZT86IHN0cmluZztcbiAgbWF4U2l6ZTogbnVtYmVyO1xuICBtYXhNZW1vcnlNQj86IG51bWJlcjtcbiAgdHRsTXM/OiBudW1iZXI7XG4gIG9uRXZpY3Rpb24/OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gIG9uU2V0PzogKCkgPT4gdm9pZDtcbiAgc2l6ZUVzdGltYXRpb25Nb2RlPzogU2l6ZUVzdGltYXRpb25Nb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlU3RhdHMge1xuICBzaXplOiBudW1iZXI7XG4gIG1heFNpemU6IG51bWJlcjtcbiAgaGl0Q291bnQ6IG51bWJlcjtcbiAgbWlzc0NvdW50OiBudW1iZXI7XG4gIGV2aWN0aW9uQ291bnQ6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2VNQjogbnVtYmVyO1xuICBoaXRSYXRlOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBDYWNoZU5vZGU8VD4ge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IFQ7XG4gIHByZXY6IENhY2hlTm9kZTxUPiB8IG51bGw7XG4gIG5leHQ6IENhY2hlTm9kZTxUPiB8IG51bGw7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7IC8vIEVzdGltYXRlZCBzaXplIGluIGJ5dGVzXG59XG5cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxUPiB7XG4gIHByaXZhdGUgc3RhdGljIGxvZ0xpc3RlbmVyPzogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbiAgc3RhdGljIGFkZExvZ0xpc3RlbmVyKGZuOiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIExSVUNhY2hlLmxvZ0xpc3RlbmVyID0gZm47XG4gICAgcmV0dXJuICgpID0+IHsgTFJVQ2FjaGUubG9nTGlzdGVuZXIgPSB1bmRlZmluZWQ7IH07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4TWVtb3J5Qnl0ZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXZpY3Rpb24/OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uU2V0PzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaXplRXN0aW1hdGlvbk1vZGU6IFNpemVFc3RpbWF0aW9uTW9kZTtcblxuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlTm9kZTxUPj4oKTtcbiAgcHJpdmF0ZSBoZWFkOiBDYWNoZU5vZGU8VD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0YWlsOiBDYWNoZU5vZGU8VD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50TWVtb3J5Qnl0ZXMgPSAwO1xuICBwcml2YXRlIG5leHRFeHBpcnlUaW1lc3RhbXAgPSBJbmZpbml0eTtcbiAgcHJpdmF0ZSBsYXN0QWN0aXZpdHlUaW1lID0gMDtcblxuICAvLyBQZXJmb3JtYW5jZSBjb3VudGVyc1xuICBwcml2YXRlIGhpdENvdW50ID0gMDtcbiAgcHJpdmF0ZSBtaXNzQ291bnQgPSAwO1xuICBwcml2YXRlIGV2aWN0aW9uQ291bnQgPSAwO1xuXG4gIC8vIENvbnN0YW50cyBmb3IgZmFzdCBlc3RpbWF0aW9uIC0gdXNpbmcgY2VudHJhbGl6ZWQgY29uZmlndXJhdGlvblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQUklNSVRJVkVfU0laRSA9IENBQ0hFX1NJWkVfRVNUSU1BVElPTl9DT05GSUcuUFJJTUlUSVZFX1NJWkU7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9CSkVDVF9CQVNFX09WRVJIRUFEID0gQ0FDSEVfU0laRV9FU1RJTUFUSU9OX0NPTkZJRy5PQkpFQ1RfQkFTRV9PVkVSSEVBRDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVJSQVlfQkFTRV9PVkVSSEVBRCA9IENBQ0hFX1NJWkVfRVNUSU1BVElPTl9DT05GSUcuQVJSQVlfQkFTRV9PVkVSSEVBRDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRklFTERfT1ZFUkhFQUQgPSBDQUNIRV9TSVpFX0VTVElNQVRJT05fQ09ORklHLkZJRUxEX09WRVJIRUFEO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFTEVNRU5UX0VTVElNQVRFID0gQ0FDSEVfU0laRV9FU1RJTUFUSU9OX0NPTkZJRy5FTEVNRU5UX0VTVElNQVRFO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCQUxBTkNFRF9TQU1QTEVfU0laRSA9IGdldFZhbGlkYXRlZFNhbXBsZVNpemUoKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMUlVDYWNoZU9wdGlvbnMpIHtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgPz8gJ3VubmFtZWQnO1xuICAgIHRoaXMubWF4U2l6ZSA9IG9wdGlvbnMubWF4U2l6ZTtcbiAgICB0aGlzLm1heE1lbW9yeUJ5dGVzID0gKG9wdGlvbnMubWF4TWVtb3J5TUIgfHwgNTApICogMTAyNCAqIDEwMjQ7IC8vIENvbnZlcnQgTUIgdG8gYnl0ZXNcbiAgICB0aGlzLnR0bE1zID0gb3B0aW9ucy50dGxNcyB8fCAwOyAvLyAwIG1lYW5zIG5vIFRUTFxuICAgIHRoaXMub25FdmljdGlvbiA9IG9wdGlvbnMub25FdmljdGlvbjtcbiAgICB0aGlzLm9uU2V0ID0gb3B0aW9ucy5vblNldDtcbiAgICB0aGlzLnNpemVFc3RpbWF0aW9uTW9kZSA9IG9wdGlvbnMuc2l6ZUVzdGltYXRpb25Nb2RlIHx8ICdmYXN0JztcblxuICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQXVkaXQgY2FjaGUgaW5pdGlhbGl6YXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0xSVUNhY2hlLmNvbnN0cnVjdG9yJyxcbiAgICAgIGRldGFpbHM6IGBDYWNoZSBpbml0aWFsaXplZCB3aXRoIG1heFNpemU9JHt0aGlzLm1heFNpemV9LCBtYXhNZW1vcnlNQj0ke29wdGlvbnMubWF4TWVtb3J5TUIgfHwgNTB9LCB0dGw9JHt0aGlzLnR0bE1zfW1zYCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIG1heFNpemU6IHRoaXMubWF4U2l6ZSxcbiAgICAgICAgbWF4TWVtb3J5TUI6IG9wdGlvbnMubWF4TWVtb3J5TUIgfHwgNTAsXG4gICAgICAgIHR0bE1zOiB0aGlzLnR0bE1zLFxuICAgICAgICBzaXplRXN0aW1hdGlvbk1vZGU6IHRoaXMuc2l6ZUVzdGltYXRpb25Nb2RlXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZhbHVlIGZyb20gY2FjaGUgd2l0aCBhdXRvbWF0aWMgY2xlYW51cFxuICAgKi9cbiAgZ2V0KGtleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XG5cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHRoaXMubWlzc0NvdW50Kys7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIENoZWNrIFRUTCBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMudHRsTXMgPiAwICYmIERhdGUubm93KCkgLSBub2RlLnRpbWVzdGFtcCA+IHRoaXMudHRsTXMpIHtcbiAgICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLm1pc3NDb3VudCsrO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIHRvIGZyb250IChtb3N0IHJlY2VudGx5IHVzZWQpXG4gICAgdGhpcy5tb3ZlVG9Gcm9udChub2RlKTtcbiAgICB0aGlzLmhpdENvdW50Kys7XG4gICAgdGhpcy5sYXN0QWN0aXZpdHlUaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmFsdWUgaW4gY2FjaGUgd2l0aCBhdXRvbWF0aWMgZXZpY3Rpb25cbiAgICovXG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFQsIHNpemVIaW50PzogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgZXhpc3RpbmdOb2RlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcblxuICAgIGlmIChleGlzdGluZ05vZGUpIHtcbiAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBub2RlXG4gICAgICBjb25zdCBvbGRTaXplID0gZXhpc3RpbmdOb2RlLnNpemU7XG4gICAgICBleGlzdGluZ05vZGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGV4aXN0aW5nTm9kZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgZXhpc3RpbmdOb2RlLnNpemUgPSBzaXplSGludCA/PyB0aGlzLmVzdGltYXRlU2l6ZSh2YWx1ZSk7XG5cbiAgICAgIHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzICs9IGV4aXN0aW5nTm9kZS5zaXplIC0gb2xkU2l6ZTtcbiAgICAgIHRoaXMubW92ZVRvRnJvbnQoZXhpc3RpbmdOb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBub2RlXG4gICAgICBjb25zdCBuZXdOb2RlOiBDYWNoZU5vZGU8VD4gPSB7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHByZXY6IG51bGwsXG4gICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgc2l6ZTogc2l6ZUhpbnQgPz8gdGhpcy5lc3RpbWF0ZVNpemUodmFsdWUpXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIG5ld05vZGUpO1xuICAgICAgdGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgKz0gbmV3Tm9kZS5zaXplO1xuICAgICAgdGhpcy5hZGRUb0Zyb250KG5ld05vZGUpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGVhcmxpZXN0IGV4cGlyeSBmb3IgZGV0ZXJtaW5pc3RpYyBUVEwgY2xlYW51cFxuICAgIGlmICh0aGlzLnR0bE1zID4gMCkge1xuICAgICAgY29uc3QgZXhwaXJ5ID0gRGF0ZS5ub3coKSArIHRoaXMudHRsTXM7XG4gICAgICBpZiAoZXhwaXJ5IDwgdGhpcy5uZXh0RXhwaXJ5VGltZXN0YW1wKSB7XG4gICAgICAgIHRoaXMubmV4dEV4cGlyeVRpbWVzdGFtcCA9IGV4cGlyeTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFdmljdCBpZiBuZWNlc3NhcnlcbiAgICB0aGlzLmV2aWN0SWZOZWNlc3NhcnkoKTtcblxuICAgIHRoaXMubGFzdEFjdGl2aXR5VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAvLyBOb3RpZnkgYnVkZ2V0IGNvb3JkaW5hdG9yIChpZiByZWdpc3RlcmVkKVxuICAgIGlmICh0aGlzLm9uU2V0KSB7XG4gICAgICB0aGlzLm9uU2V0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHNwZWNpZmljIGtleSBmcm9tIGNhY2hlXG4gICAqL1xuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZU5vZGUobm9kZSk7XG4gICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyAtPSBub2RlLnNpemU7XG5cbiAgICBpZiAodGhpcy5vbkV2aWN0aW9uKSB7XG4gICAgICB0aGlzLm9uRXZpY3Rpb24oa2V5LCBub2RlLnZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBrZXkgZXhpc3RzIGluIGNhY2hlXG4gICAqL1xuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBUVExcbiAgICBpZiAodGhpcy50dGxNcyA+IDAgJiYgRGF0ZS5ub3coKSAtIG5vZGUudGltZXN0YW1wID4gdGhpcy50dGxNcykge1xuICAgICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZW50cmllcyBmcm9tIGNhY2hlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzQ2xlYXJlZCA9IHRoaXMuY2FjaGUuc2l6ZTtcblxuICAgIGlmICh0aGlzLm9uRXZpY3Rpb24pIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgbm9kZV0gb2YgdGhpcy5jYWNoZSkge1xuICAgICAgICB0aGlzLm9uRXZpY3Rpb24oa2V5LCBub2RlLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzID0gMDtcbiAgICB0aGlzLm5leHRFeHBpcnlUaW1lc3RhbXAgPSBJbmZpbml0eTtcbiAgICB0aGlzLmV2aWN0aW9uQ291bnQgKz0gdGhpcy5jYWNoZS5zaXplO1xuXG4gICAgTFJVQ2FjaGUubG9nTGlzdGVuZXI/LignZGVidWcnLCAnQ2xlYXIgY2FjaGUnLCB7XG4gICAgICBjYWNoZU5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGVudHJpZXNDbGVhcmVkLFxuICAgIH0pO1xuXG4gICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBBdWRpdCBjYWNoZSBjbGVhcmluZ1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdNRU1PUllfQ0xFQVJFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdMUlVDYWNoZS5jbGVhcicsXG4gICAgICBkZXRhaWxzOiBgQ2FjaGUgY2xlYXJlZDogJHtlbnRyaWVzQ2xlYXJlZH0gZW50cmllcyByZW1vdmVkYCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVudHJpZXNDbGVhcmVkIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBjYWNoZSBzaXplIChudW1iZXIgb2YgZW50cmllcylcbiAgICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgc3RhdGlzdGljc1xuICAgKi9cbiAgZ2V0U3RhdHMoKTogQ2FjaGVTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6IHRoaXMuY2FjaGUuc2l6ZSxcbiAgICAgIG1heFNpemU6IHRoaXMubWF4U2l6ZSxcbiAgICAgIGhpdENvdW50OiB0aGlzLmhpdENvdW50LFxuICAgICAgbWlzc0NvdW50OiB0aGlzLm1pc3NDb3VudCxcbiAgICAgIGV2aWN0aW9uQ291bnQ6IHRoaXMuZXZpY3Rpb25Db3VudCxcbiAgICAgIG1lbW9yeVVzYWdlTUI6IHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzIC8gKDEwMjQgKiAxMDI0KSxcbiAgICAgIGhpdFJhdGU6IHRoaXMuaGl0Q291bnQgKyB0aGlzLm1pc3NDb3VudCA+IDAgPyB0aGlzLmhpdENvdW50IC8gKHRoaXMuaGl0Q291bnQgKyB0aGlzLm1pc3NDb3VudCkgOiAwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGtleXMgaW4gYWNjZXNzIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdClcbiAgICogUmV0dXJucyBhbiBhcnJheSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE1hcCBiZWhhdmlvciBhbmQgYXJyYXkgaW5kZXhpbmdcbiAgICovXG4gIGtleXMoKTogc3RyaW5nW10gJiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuaGVhZDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgcmVzdWx0LnB1c2goY3VycmVudC5rZXkpO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICB9XG5cbiAgICAvLyBBZGQgaXRlcmF0b3IgaW50ZXJmYWNlIHRvIHN1cHBvcnQgYm90aCBhcnJheSBhbmQgaXRlcmF0b3IgdXNhZ2VcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IGl0ZXJhdG9yLFxuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICBpZiAoaW5kZXggPCByZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdFtpbmRleCsrXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlIH0gYXMgSXRlcmF0b3JSZXN1bHQ8c3RyaW5nPjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTWVyZ2UgYXJyYXkgbWV0aG9kcyB3aXRoIGl0ZXJhdG9yXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBpdGVyYXRvcikgYXMgc3RyaW5nW10gJiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB2YWx1ZXMgaW4gYWNjZXNzIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdClcbiAgICogUmV0dXJucyBhbiBhcnJheSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE1hcCBiZWhhdmlvciBhbmQgYXJyYXkgaW5kZXhpbmdcbiAgICovXG4gIHZhbHVlcygpOiBUW10gJiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIGl0ZXJhdG9yIGludGVyZmFjZSB0byBzdXBwb3J0IGJvdGggYXJyYXkgYW5kIGl0ZXJhdG9yIHVzYWdlXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiBpdGVyYXRvcixcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4IDwgcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHRbaW5kZXgrK10sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9IGFzIEl0ZXJhdG9yUmVzdWx0PFQ+O1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBNZXJnZSBhcnJheSBtZXRob2RzIHdpdGggaXRlcmF0b3JcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihyZXN1bHQsIGl0ZXJhdG9yKSBhcyBUW10gJiBJdGVyYWJsZUl0ZXJhdG9yPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW50cmllcyBpbiBhY2Nlc3Mgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KVxuICAgKiBSZXR1cm5zIGFuIGFycmF5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggTWFwIGJlaGF2aW9yIGFuZCBhcnJheSBpbmRleGluZ1xuICAgKi9cbiAgZW50cmllcygpOiBBcnJheTxbc3RyaW5nLCBUXT4gJiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIFRdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxbc3RyaW5nLCBUXT4gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuaGVhZDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgcmVzdWx0LnB1c2goW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cblxuICAgIC8vIEFkZCBpdGVyYXRvciBpbnRlcmZhY2UgdG8gc3VwcG9ydCBib3RoIGFycmF5IGFuZCBpdGVyYXRvciB1c2FnZVxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gaXRlcmF0b3IsXG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA8IHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0W2luZGV4KytdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfSBhcyBJdGVyYXRvclJlc3VsdDxbc3RyaW5nLCBUXT47XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE1lcmdlIGFycmF5IG1ldGhvZHMgd2l0aCBpdGVyYXRvclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlc3VsdCwgaXRlcmF0b3IpIGFzIEFycmF5PFtzdHJpbmcsIFRdPiAmIEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgVF0+O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgY2FjaGVcbiAgICovXG4gIGZvckVhY2goY2FsbGJhY2s6ICh2YWx1ZTogVCwga2V5OiBzdHJpbmcsIG1hcDogdGhpcykgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdG9yIGZvciBlbnRyaWVzIChmb3IgTWFwIGNvbXBhdGliaWxpdHkpXG4gICAqL1xuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBUXT4ge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICB5aWVsZCBbY3VycmVudC5rZXksIGN1cnJlbnQudmFsdWVdO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHRhZyBmb3IgTWFwIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnTFJVQ2FjaGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IG1lbW9yeSB1c2FnZSBpbiBNQlxuICAgKi9cbiAgZ2V0TWVtb3J5VXNhZ2VNQigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyAvICgxMDI0ICogMTAyNCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgbWVtb3J5IHVzYWdlIGluIGJ5dGVzXG4gICAqL1xuICBnZXRNZW1vcnlVc2FnZUJ5dGVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY2FjaGUgbmFtZSAoc2V0IHZpYSBjb25zdHJ1Y3RvciBvcHRpb25zKVxuICAgKi9cbiAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IGdldCgpIGhpdCBvciBzZXQoKSBjYWxsLlxuICAgKiBVc2VkIGJ5IENhY2hlTWVtb3J5QnVkZ2V0IHRvIGlkZW50aWZ5IHRoZSBjb2xkZXN0IChsZWFzdC1hY3RpdmUpIGNhY2hlLlxuICAgKiBSZXR1cm5zIDAgaWYgdGhlIGNhY2hlIGhhcyBuZXZlciBiZWVuIGFjY2Vzc2VkLlxuICAgKi9cbiAgZ2V0TGFzdEFjdGl2aXR5VGltZXN0YW1wKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubGFzdEFjdGl2aXR5VGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmljdCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbnRyeSBmcm9tIHRoZSBjYWNoZS5cbiAgICogVXNlZCBieSBDYWNoZU1lbW9yeUJ1ZGdldCB0byBlbmZvcmNlIGdsb2JhbCBtZW1vcnkgbGltaXRzLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFuIGVudHJ5IHdhcyBldmljdGVkLCBmYWxzZSBpZiB0aGUgY2FjaGUgd2FzIGVtcHR5XG4gICAqL1xuICBldmljdE9uZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudGFpbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmV2aWN0TGVhc3RSZWNlbnRseVVzZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSB0cmlnZ2VyIGNsZWFudXAgb2YgZXhwaXJlZCBlbnRyaWVzLlxuICAgKiBSZWNvbXB1dGVzIG5leHRFeHBpcnlUaW1lc3RhbXAgZnJvbSByZW1haW5pbmcgZW50cmllcy5cbiAgICovXG4gIGNsZWFudXAoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy50dGxNcyA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgZWFybGllc3RSZW1haW5pbmcgPSBJbmZpbml0eTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgbm9kZV0gb2YgdGhpcy5jYWNoZSkge1xuICAgICAgY29uc3QgZXhwaXJ5ID0gbm9kZS50aW1lc3RhbXAgKyB0aGlzLnR0bE1zO1xuICAgICAgaWYgKG5vdyA+PSBleHBpcnkpIHtcbiAgICAgICAga2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoZXhwaXJ5IDwgZWFybGllc3RSZW1haW5pbmcpIHtcbiAgICAgICAgZWFybGllc3RSZW1haW5pbmcgPSBleHBpcnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvRGVsZXRlKSB7XG4gICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIHRoaXMubmV4dEV4cGlyeVRpbWVzdGFtcCA9IGVhcmxpZXN0UmVtYWluaW5nO1xuICAgIHJldHVybiBrZXlzVG9EZWxldGUubGVuZ3RoO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBtZXRob2RzXG5cbiAgcHJpdmF0ZSBtb3ZlVG9Gcm9udChub2RlOiBDYWNoZU5vZGU8VD4pOiB2b2lkIHtcbiAgICBpZiAobm9kZSA9PT0gdGhpcy5oZWFkKSB7XG4gICAgICByZXR1cm47IC8vIEFscmVhZHkgYXQgZnJvbnRcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5yZW1vdmVOb2RlKG5vZGUpO1xuICAgIFxuICAgIC8vIEFkZCB0byBmcm9udFxuICAgIHRoaXMuYWRkVG9Gcm9udChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9Gcm9udChub2RlOiBDYWNoZU5vZGU8VD4pOiB2b2lkIHtcbiAgICBub2RlLnByZXYgPSBudWxsO1xuICAgIG5vZGUubmV4dCA9IHRoaXMuaGVhZDtcblxuICAgIGlmICh0aGlzLmhlYWQpIHtcbiAgICAgIHRoaXMuaGVhZC5wcmV2ID0gbm9kZTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5oZWFkID0gbm9kZTtcblxuICAgIGlmICghdGhpcy50YWlsKSB7XG4gICAgICB0aGlzLnRhaWwgPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTm9kZShub2RlOiBDYWNoZU5vZGU8VD4pOiB2b2lkIHtcbiAgICBpZiAobm9kZS5wcmV2KSB7XG4gICAgICBub2RlLnByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkID0gbm9kZS5uZXh0O1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgIG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhaWwgPSBub2RlLnByZXY7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmljdElmTmVjZXNzYXJ5KCk6IHZvaWQge1xuICAgIC8vIEV2aWN0IGJ5IHNpemVcbiAgICB3aGlsZSAodGhpcy5jYWNoZS5zaXplID4gdGhpcy5tYXhTaXplKSB7XG4gICAgICB0aGlzLmV2aWN0TGVhc3RSZWNlbnRseVVzZWQoKTtcbiAgICB9XG5cbiAgICAvLyBFdmljdCBieSBtZW1vcnlcbiAgICBpZiAodGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgPiB0aGlzLm1heE1lbW9yeUJ5dGVzICYmIHRoaXMudGFpbCkge1xuICAgICAgTFJVQ2FjaGUubG9nTGlzdGVuZXI/Lignd2FybicsICdNZW1vcnkgbGltaXQgZXhjZWVkZWQnLCB7XG4gICAgICAgIGNhY2hlTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICBtZW1vcnlVc2FnZU1COiB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyAvICgxMDI0ICogMTAyNCksXG4gICAgICAgIG1heE1lbW9yeU1COiB0aGlzLm1heE1lbW9yeUJ5dGVzIC8gKDEwMjQgKiAxMDI0KSxcbiAgICAgIH0pO1xuICAgICAgd2hpbGUgKHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzID4gdGhpcy5tYXhNZW1vcnlCeXRlcyAmJiB0aGlzLnRhaWwpIHtcbiAgICAgICAgdGhpcy5ldmljdExlYXN0UmVjZW50bHlVc2VkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5pc3RpYyBUVEwgY2xlYW51cDogZmlyZXMgZXhhY3RseSB3aGVuIGFuIGVudHJ5IGhhcyBleHBpcmVkXG4gICAgaWYgKHRoaXMudHRsTXMgPiAwICYmIERhdGUubm93KCkgPj0gdGhpcy5uZXh0RXhwaXJ5VGltZXN0YW1wKSB7XG4gICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2aWN0TGVhc3RSZWNlbnRseVVzZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhaWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBldmljdGVkID0gdGhpcy50YWlsO1xuICAgIHRoaXMucmVtb3ZlTm9kZShldmljdGVkKTtcbiAgICB0aGlzLmNhY2hlLmRlbGV0ZShldmljdGVkLmtleSk7XG4gICAgdGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgLT0gZXZpY3RlZC5zaXplO1xuICAgIHRoaXMuZXZpY3Rpb25Db3VudCsrO1xuXG4gICAgTFJVQ2FjaGUubG9nTGlzdGVuZXI/LignZGVidWcnLCAnRXZpY3QgZW50cnknLCB7XG4gICAgICBjYWNoZU5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGtleTogZXZpY3RlZC5rZXksXG4gICAgICBzaXplOiBldmljdGVkLnNpemUsXG4gICAgICBjYWNoZVNpemU6IHRoaXMuY2FjaGUuc2l6ZSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9uRXZpY3Rpb24pIHtcbiAgICAgIHRoaXMub25FdmljdGlvbihldmljdGVkLmtleSwgZXZpY3RlZC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyB0aGUgbWVtb3J5IHNpemUgb2YgYSB2YWx1ZSB1c2luZyBjb25maWd1cmFibGUgYWNjdXJhY3kgbW9kZXM6XG4gICAqIC0gZmFzdDogTygxKSBoZXVyaXN0aWNzIGJhc2VkIG9uIHR5cGUgYW5kIHByb3BlcnR5IGNvdW50ICgyLTV4IGZhc3RlciB0aGFuIEpTT04uc3RyaW5naWZ5KVxuICAgKiAtIGJhbGFuY2VkOiBTYW1wbGVzIGZpcnN0IE4gcHJvcGVydGllcyBmb3IgYmV0dGVyIGFjY3VyYWN5IChtb2RlcmF0ZSBzcGVlZClcbiAgICogLSBhY2N1cmF0ZTogVXNlcyBKU09OLnN0cmluZ2lmeSBmb3IgcHJlY2lzZSBzaXplIChzbG93ZXN0LCBvcmlnaW5hbCBiZWhhdmlvcilcbiAgICovXG4gIHByaXZhdGUgZXN0aW1hdGVTaXplKHZhbHVlOiBUKTogbnVtYmVyIHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoICh0aGlzLnNpemVFc3RpbWF0aW9uTW9kZSkge1xuICAgICAgICBjYXNlICdmYXN0JzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZVNpemVGYXN0KHZhbHVlKTtcbiAgICAgICAgY2FzZSAnYmFsYW5jZWQnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmVzdGltYXRlU2l6ZUJhbGFuY2VkKHZhbHVlKTtcbiAgICAgICAgY2FzZSAnYWNjdXJhdGUnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmVzdGltYXRlU2l6ZUFjY3VyYXRlKHZhbHVlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZVNpemVGYXN0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBMUlVDYWNoZS5PQkpFQ1RfQkFTRV9PVkVSSEVBRDsgLy8gRmFsbGJhY2tcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFzdCBPKDEpIHNpemUgZXN0aW1hdGlvbiB1c2luZyBoZXVyaXN0aWNzXG4gICAqIEFjaGlldmVzIDItNXggc3BlZWR1cCBvdmVyIEpTT04uc3RyaW5naWZ5IHdpdGggcmVhc29uYWJsZSBhY2N1cmFjeSAoNTAtMjAwJSlcbiAgICovXG4gIHByaXZhdGUgZXN0aW1hdGVTaXplRmFzdCh2YWx1ZTogVCk6IG51bWJlciB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBMUlVDYWNoZS5QUklNSVRJVkVfU0laRTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIHVua25vd24gYXMgc3RyaW5nKS5sZW5ndGggKiAyOyAvLyBVVEYtMTYgY2hhcmFjdGVyc1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBMUlVDYWNoZS5QUklNSVRJVkVfU0laRTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIEZhc3QgZXN0aW1hdGU6IGJhc2Ugb3ZlcmhlYWQgKyBlbGVtZW50IGNvdW50ICogYXZlcmFnZSBlbGVtZW50IHNpemVcbiAgICAgIC8vIEFzc3VtZXMgYXZlcmFnZSBlbGVtZW50IGlzIH42NCBieXRlcyAod29ya3Mgd2VsbCBmb3IgbWl4ZWQgY29udGVudClcbiAgICAgIHJldHVybiBMUlVDYWNoZS5BUlJBWV9CQVNFX09WRVJIRUFEICsgdmFsdWUubGVuZ3RoICogTFJVQ2FjaGUuRUxFTUVOVF9FU1RJTUFURTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIEZhc3QgZXN0aW1hdGU6IGJhc2Ugb3ZlcmhlYWQgKyBrZXkgY291bnQgKiBhdmVyYWdlIGZpZWxkIG92ZXJoZWFkXG4gICAgICAvLyBFYWNoIGZpZWxkIGFzc3VtZWQgdG8gdGFrZSB+NDggYnl0ZXMgKGtleSBzdHJpbmcgKyB2YWx1ZSArIHBvaW50ZXIpXG4gICAgICBjb25zdCBrZXlDb3VudCA9IE9iamVjdC5rZXlzKHZhbHVlIGFzIG9iamVjdCkubGVuZ3RoO1xuICAgICAgcmV0dXJuIExSVUNhY2hlLk9CSkVDVF9CQVNFX09WRVJIRUFEICsga2V5Q291bnQgKiBMUlVDYWNoZS5GSUVMRF9PVkVSSEVBRDtcbiAgICB9XG5cbiAgICByZXR1cm4gTFJVQ2FjaGUuT0JKRUNUX0JBU0VfT1ZFUkhFQUQ7XG4gIH1cblxuICAvKipcbiAgICogQmFsYW5jZWQgZXN0aW1hdGlvbjogU2FtcGxlcyBmaXJzdCBOIHByb3BlcnRpZXMgZm9yIGltcHJvdmVkIGFjY3VyYWN5XG4gICAqIFByb3ZpZGVzIGJldHRlciBhY2N1cmFjeSB0aGFuIGZhc3QgbW9kZSB3aXRoIG1vZGVyYXRlIHBlcmZvcm1hbmNlIGNvc3RcbiAgICovXG4gIHByaXZhdGUgZXN0aW1hdGVTaXplQmFsYW5jZWQodmFsdWU6IFQpOiBudW1iZXIge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gTFJVQ2FjaGUuUFJJTUlUSVZFX1NJWkU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyB1bmtub3duIGFzIHN0cmluZykubGVuZ3RoICogMjtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gTFJVQ2FjaGUuUFJJTUlUSVZFX1NJWkU7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBzYW1wbGVTaXplID0gTWF0aC5taW4odmFsdWUubGVuZ3RoLCBMUlVDYWNoZS5CQUxBTkNFRF9TQU1QTEVfU0laRSk7XG4gICAgICBpZiAoc2FtcGxlU2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gTFJVQ2FjaGUuQVJSQVlfQkFTRV9PVkVSSEVBRDtcbiAgICAgIH1cblxuICAgICAgLy8gU2FtcGxlIGZpcnN0IE4gZWxlbWVudHMgYW5kIGV4dHJhcG9sYXRlXG4gICAgICBsZXQgc2FtcGxlVG90YWwgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgc2FtcGxlVG90YWwgKz0gdGhpcy5lc3RpbWF0ZVNpemVGYXN0KHZhbHVlW2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF2Z1NpemUgPSBzYW1wbGVUb3RhbCAvIHNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gTFJVQ2FjaGUuQVJSQVlfQkFTRV9PVkVSSEVBRCArIHZhbHVlLmxlbmd0aCAqIGF2Z1NpemU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUgYXMgb2JqZWN0KTtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbihrZXlzLmxlbmd0aCwgTFJVQ2FjaGUuQkFMQU5DRURfU0FNUExFX1NJWkUpO1xuXG4gICAgICBpZiAoc2FtcGxlU2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gTFJVQ2FjaGUuT0JKRUNUX0JBU0VfT1ZFUkhFQUQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbXBsZSBmaXJzdCBOIHByb3BlcnRpZXMgYW5kIGV4dHJhcG9sYXRlXG4gICAgICBsZXQgc2FtcGxlVG90YWwgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgY29uc3QgcHJvcFZhbHVlID0gKHZhbHVlIGFzIGFueSlba2V5XTtcbiAgICAgICAgLy8gS2V5IHNpemUgKyB2YWx1ZSBzaXplICsgcG9pbnRlciBvdmVyaGVhZFxuICAgICAgICBzYW1wbGVUb3RhbCArPSBrZXkubGVuZ3RoICogMiArIHRoaXMuZXN0aW1hdGVTaXplRmFzdChwcm9wVmFsdWUpICsgMTY7XG4gICAgICB9XG4gICAgICBjb25zdCBhdmdGaWVsZFNpemUgPSBzYW1wbGVUb3RhbCAvIHNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gTFJVQ2FjaGUuT0JKRUNUX0JBU0VfT1ZFUkhFQUQgKyBrZXlzLmxlbmd0aCAqIGF2Z0ZpZWxkU2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gTFJVQ2FjaGUuT0JKRUNUX0JBU0VfT1ZFUkhFQUQ7XG4gIH1cblxuICAvKipcbiAgICogQWNjdXJhdGUgZXN0aW1hdGlvbiB1c2luZyBKU09OLnN0cmluZ2lmeSAob3JpZ2luYWwgYmVoYXZpb3IpXG4gICAqIFNsb3dlc3QgYnV0IG1vc3QgYWNjdXJhdGUsIE8obikgd2hlcmUgbiBpcyB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIGVzdGltYXRlU2l6ZUFjY3VyYXRlKHZhbHVlOiBUKTogbnVtYmVyIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIExSVUNhY2hlLlBSSU1JVElWRV9TSVpFO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIHVua25vd24gYXMgc3RyaW5nKS5sZW5ndGggKiAyO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gTFJVQ2FjaGUuUFJJTUlUSVZFX1NJWkU7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyArIHRoaXMuZXN0aW1hdGVTaXplQWNjdXJhdGUoaXRlbSksIExSVUNhY2hlLkFSUkFZX0JBU0VfT1ZFUkhFQUQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBqc29uU3RyID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgcmV0dXJuIGpzb25TdHIubGVuZ3RoICogMiArIExSVUNhY2hlLk9CSkVDVF9CQVNFX09WRVJIRUFEO1xuICAgIH1cblxuICAgIHJldHVybiBMUlVDYWNoZS5PQkpFQ1RfQkFTRV9PVkVSSEVBRDtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG9wdGltaXplZCBMUlUgY2FjaGVzIGZvciBkaWZmZXJlbnQgdXNlIGNhc2VzXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZUZhY3Rvcnkge1xuICAvKipcbiAgICogQ3JlYXRlIGNhY2hlIG9wdGltaXplZCBmb3Igc2VhcmNoIHJlc3VsdHNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVTZWFyY2hSZXN1bHRDYWNoZTxUPihvcHRpb25zPzogUGFydGlhbDxMUlVDYWNoZU9wdGlvbnM+KTogTFJVQ2FjaGU8VD4ge1xuICAgIHJldHVybiBuZXcgTFJVQ2FjaGU8VD4oe1xuICAgICAgbWF4U2l6ZTogMTAwLFxuICAgICAgbWF4TWVtb3J5TUI6IDEwLFxuICAgICAgdHRsTXM6IDUgKiA2MCAqIDEwMDAsIC8vIDUgbWludXRlc1xuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjYWNoZSBvcHRpbWl6ZWQgZm9yIGluZGV4IGRhdGFcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVJbmRleENhY2hlPFQ+KG9wdGlvbnM/OiBQYXJ0aWFsPExSVUNhY2hlT3B0aW9ucz4pOiBMUlVDYWNoZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBMUlVDYWNoZTxUPih7XG4gICAgICBtYXhTaXplOiA1MCxcbiAgICAgIG1heE1lbW9yeU1COiAyNSxcbiAgICAgIHR0bE1zOiAxNSAqIDYwICogMTAwMCwgLy8gMTUgbWludXRlc1xuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjYWNoZSBvcHRpbWl6ZWQgZm9yIEFQSSByZXNwb25zZXNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBUElDYWNoZTxUPihvcHRpb25zPzogUGFydGlhbDxMUlVDYWNoZU9wdGlvbnM+KTogTFJVQ2FjaGU8VD4ge1xuICAgIHJldHVybiBuZXcgTFJVQ2FjaGU8VD4oe1xuICAgICAgbWF4U2l6ZTogMjAwLFxuICAgICAgbWF4TWVtb3J5TUI6IDUsXG4gICAgICB0dGxNczogMTAgKiA2MCAqIDEwMDAsIC8vIDEwIG1pbnV0ZXNcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxufSJdfQ==
614
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJVQ2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUvTFJVQ2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsc0JBQXNCLEVBQ3ZCLE1BQU0sb0NBQW9DLENBQUM7QUFpQzVDLE1BQU0sT0FBTyxRQUFRO0lBQ1gsTUFBTSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsTUFBTSxDQUFDLFdBQVcsQ0FBeUc7SUFFbkksTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUF5RztRQUM3SCxRQUFRLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUMxQixPQUFPLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsTUFBTSxDQUFDLGdCQUFnQjtRQUNyQixRQUFRLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBRWdCLElBQUksQ0FBUztJQUNiLE9BQU8sQ0FBUztJQUNoQixjQUFjLENBQVM7SUFDdkIsS0FBSyxDQUFTO0lBQ2QsVUFBVSxDQUFtQztJQUM3QyxLQUFLLENBQWM7SUFDbkIsa0JBQWtCLENBQXFCO0lBRWhELEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUN4QyxJQUFJLEdBQXdCLElBQUksQ0FBQztJQUNqQyxJQUFJLEdBQXdCLElBQUksQ0FBQztJQUNqQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDdkIsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO0lBQy9CLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUU3Qix1QkFBdUI7SUFDZixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNk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SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUksT0FBa0M7UUFDekQsT0FBTyxJQUFJLFFBQVEsQ0FBSTtZQUNyQixPQUFPLEVBQUUsR0FBRztZQUNaLFdBQVcsRUFBRSxDQUFDO1lBQ2QsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLGFBQWE7WUFDcEMsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIaWdoLXBlcmZvcm1hbmNlIExSVSBDYWNoZSB3aXRoIG1lbW9yeSBtb25pdG9yaW5nIGFuZCBhdXRvbWF0aWMgY2xlYW51cFxuICogT3B0aW1pemVkIGZvciBsYXJnZS1zY2FsZSBpbmRleGluZyBvcGVyYXRpb25zIHdpdGggY29uZmlndXJhYmxlIG1lbW9yeSBsaW1pdHNcbiAqL1xuXG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHtcbiAgQ0FDSEVfU0laRV9FU1RJTUFUSU9OX0NPTkZJRyxcbiAgZ2V0VmFsaWRhdGVkU2FtcGxlU2l6ZVxufSBmcm9tICcuLi9jb25maWcvcGVyZm9ybWFuY2UtY29uc3RhbnRzLmpzJztcblxuZXhwb3J0IHR5cGUgU2l6ZUVzdGltYXRpb25Nb2RlID0gJ2Zhc3QnIHwgJ2JhbGFuY2VkJyB8ICdhY2N1cmF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTFJVQ2FjaGVPcHRpb25zIHtcbiAgbmFtZT86IHN0cmluZztcbiAgbWF4U2l6ZTogbnVtYmVyO1xuICBtYXhNZW1vcnlNQj86IG51bWJlcjtcbiAgdHRsTXM/OiBudW1iZXI7XG4gIG9uRXZpY3Rpb24/OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gIG9uU2V0PzogKCkgPT4gdm9pZDtcbiAgc2l6ZUVzdGltYXRpb25Nb2RlPzogU2l6ZUVzdGltYXRpb25Nb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlU3RhdHMge1xuICBzaXplOiBudW1iZXI7XG4gIG1heFNpemU6IG51bWJlcjtcbiAgaGl0Q291bnQ6IG51bWJlcjtcbiAgbWlzc0NvdW50OiBudW1iZXI7XG4gIGV2aWN0aW9uQ291bnQ6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2VNQjogbnVtYmVyO1xuICBoaXRSYXRlOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBDYWNoZU5vZGU8VD4ge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IFQ7XG4gIHByZXY6IENhY2hlTm9kZTxUPiB8IG51bGw7XG4gIG5leHQ6IENhY2hlTm9kZTxUPiB8IG51bGw7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7IC8vIEVzdGltYXRlZCBzaXplIGluIGJ5dGVzXG59XG5cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxUPiB7XG4gIHByaXZhdGUgc3RhdGljIGhhc0xvZ2dlZEluaXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGF0aWMgbG9nTGlzdGVuZXI/OiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcblxuICBzdGF0aWMgYWRkTG9nTGlzdGVuZXIoZm46IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgTFJVQ2FjaGUubG9nTGlzdGVuZXIgPSBmbjtcbiAgICByZXR1cm4gKCkgPT4geyBMUlVDYWNoZS5sb2dMaXN0ZW5lciA9IHVuZGVmaW5lZDsgfTtcbiAgfVxuXG4gIC8qKiBSZXNldCBzdGF0aWMgZmxhZ3MgZm9yIHRlc3QgaXNvbGF0aW9uLiAqL1xuICBzdGF0aWMgcmVzZXRTdGF0aWNTdGF0ZSgpOiB2b2lkIHtcbiAgICBMUlVDYWNoZS5oYXNMb2dnZWRJbml0ID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4TWVtb3J5Qnl0ZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXZpY3Rpb24/OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uU2V0PzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaXplRXN0aW1hdGlvbk1vZGU6IFNpemVFc3RpbWF0aW9uTW9kZTtcblxuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlTm9kZTxUPj4oKTtcbiAgcHJpdmF0ZSBoZWFkOiBDYWNoZU5vZGU8VD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0YWlsOiBDYWNoZU5vZGU8VD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50TWVtb3J5Qnl0ZXMgPSAwO1xuICBwcml2YXRlIG5leHRFeHBpcnlUaW1lc3RhbXAgPSBJbmZpbml0eTtcbiAgcHJpdmF0ZSBsYXN0QWN0aXZpdHlUaW1lID0gMDtcblxuICAvLyBQZXJmb3JtYW5jZSBjb3VudGVyc1xuICBwcml2YXRlIGhpdENvdW50ID0gMDtcbiAgcHJpdmF0ZSBtaXNzQ291bnQgPSAwO1xuICBwcml2YXRlIGV2aWN0aW9uQ291bnQgPSAwO1xuXG4gIC8vIENvbnN0YW50cyBmb3IgZmFzdCBlc3RpbWF0aW9uIC0gdXNpbmcgY2VudHJhbGl6ZWQgY29uZmlndXJhdGlvblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQUklNSVRJVkVfU0laRSA9IENBQ0hFX1NJWkVfRVNUSU1BVElPTl9DT05GSUcuUFJJTUlUSVZFX1NJWkU7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE9CSkVDVF9CQVNFX09WRVJIRUFEID0gQ0FDSEVfU0laRV9FU1RJTUFUSU9OX0NPTkZJRy5PQkpFQ1RfQkFTRV9PVkVSSEVBRDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVJSQVlfQkFTRV9PVkVSSEVBRCA9IENBQ0hFX1NJWkVfRVNUSU1BVElPTl9DT05GSUcuQVJSQVlfQkFTRV9PVkVSSEVBRDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRklFTERfT1ZFUkhFQUQgPSBDQUNIRV9TSVpFX0VTVElNQVRJT05fQ09ORklHLkZJRUxEX09WRVJIRUFEO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFTEVNRU5UX0VTVElNQVRFID0gQ0FDSEVfU0laRV9FU1RJTUFUSU9OX0NPTkZJRy5FTEVNRU5UX0VTVElNQVRFO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCQUxBTkNFRF9TQU1QTEVfU0laRSA9IGdldFZhbGlkYXRlZFNhbXBsZVNpemUoKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMUlVDYWNoZU9wdGlvbnMpIHtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgPz8gJ3VubmFtZWQnO1xuICAgIHRoaXMubWF4U2l6ZSA9IG9wdGlvbnMubWF4U2l6ZTtcbiAgICB0aGlzLm1heE1lbW9yeUJ5dGVzID0gKG9wdGlvbnMubWF4TWVtb3J5TUIgfHwgNTApICogMTAyNCAqIDEwMjQ7IC8vIENvbnZlcnQgTUIgdG8gYnl0ZXNcbiAgICB0aGlzLnR0bE1zID0gb3B0aW9ucy50dGxNcyB8fCAwOyAvLyAwIG1lYW5zIG5vIFRUTFxuICAgIHRoaXMub25FdmljdGlvbiA9IG9wdGlvbnMub25FdmljdGlvbjtcbiAgICB0aGlzLm9uU2V0ID0gb3B0aW9ucy5vblNldDtcbiAgICB0aGlzLnNpemVFc3RpbWF0aW9uTW9kZSA9IG9wdGlvbnMuc2l6ZUVzdGltYXRpb25Nb2RlIHx8ICdmYXN0JztcblxuICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQXVkaXQgY2FjaGUgaW5pdGlhbGl6YXRpb24gKGxvZ3Mgb25seSBmb3IgdGhlIGZpcnN0IGNhY2hlIGNvbnN0cnVjdGVkKVxuICAgIGlmICghTFJVQ2FjaGUuaGFzTG9nZ2VkSW5pdCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdMUlVDYWNoZS5jb25zdHJ1Y3RvcicsXG4gICAgICAgIGRldGFpbHM6IGBDYWNoZSBpbml0aWFsaXplZCB3aXRoIG1heFNpemU9JHt0aGlzLm1heFNpemV9LCBtYXhNZW1vcnlNQj0ke29wdGlvbnMubWF4TWVtb3J5TUIgfHwgNTB9LCB0dGw9JHt0aGlzLnR0bE1zfW1zYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBtYXhTaXplOiB0aGlzLm1heFNpemUsXG4gICAgICAgICAgbWF4TWVtb3J5TUI6IG9wdGlvbnMubWF4TWVtb3J5TUIgfHwgNTAsXG4gICAgICAgICAgdHRsTXM6IHRoaXMudHRsTXMsXG4gICAgICAgICAgc2l6ZUVzdGltYXRpb25Nb2RlOiB0aGlzLnNpemVFc3RpbWF0aW9uTW9kZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIExSVUNhY2hlLmhhc0xvZ2dlZEluaXQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmFsdWUgZnJvbSBjYWNoZSB3aXRoIGF1dG9tYXRpYyBjbGVhbnVwXG4gICAqL1xuICBnZXQoa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgdGhpcy5taXNzQ291bnQrKztcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgVFRMIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy50dGxNcyA+IDAgJiYgRGF0ZS5ub3coKSAtIG5vZGUudGltZXN0YW1wID4gdGhpcy50dGxNcykge1xuICAgICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMubWlzc0NvdW50Kys7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdG8gZnJvbnQgKG1vc3QgcmVjZW50bHkgdXNlZClcbiAgICB0aGlzLm1vdmVUb0Zyb250KG5vZGUpO1xuICAgIHRoaXMuaGl0Q291bnQrKztcbiAgICB0aGlzLmxhc3RBY3Rpdml0eVRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBub2RlLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZSBpbiBjYWNoZSB3aXRoIGF1dG9tYXRpYyBldmljdGlvblxuICAgKi9cbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgc2l6ZUhpbnQ/OiBudW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCBleGlzdGluZ05vZGUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuXG4gICAgaWYgKGV4aXN0aW5nTm9kZSkge1xuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIG5vZGVcbiAgICAgIGNvbnN0IG9sZFNpemUgPSBleGlzdGluZ05vZGUuc2l6ZTtcbiAgICAgIGV4aXN0aW5nTm9kZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgZXhpc3RpbmdOb2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICBleGlzdGluZ05vZGUuc2l6ZSA9IHNpemVIaW50ID8/IHRoaXMuZXN0aW1hdGVTaXplKHZhbHVlKTtcblxuICAgICAgdGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgKz0gZXhpc3RpbmdOb2RlLnNpemUgLSBvbGRTaXplO1xuICAgICAgdGhpcy5tb3ZlVG9Gcm9udChleGlzdGluZ05vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IG5vZGVcbiAgICAgIGNvbnN0IG5ld05vZGU6IENhY2hlTm9kZTxUPiA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcHJldjogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBzaXplOiBzaXplSGludCA/PyB0aGlzLmVzdGltYXRlU2l6ZSh2YWx1ZSlcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgbmV3Tm9kZSk7XG4gICAgICB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyArPSBuZXdOb2RlLnNpemU7XG4gICAgICB0aGlzLmFkZFRvRnJvbnQobmV3Tm9kZSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgZWFybGllc3QgZXhwaXJ5IGZvciBkZXRlcm1pbmlzdGljIFRUTCBjbGVhbnVwXG4gICAgaWYgKHRoaXMudHRsTXMgPiAwKSB7XG4gICAgICBjb25zdCBleHBpcnkgPSBEYXRlLm5vdygpICsgdGhpcy50dGxNcztcbiAgICAgIGlmIChleHBpcnkgPCB0aGlzLm5leHRFeHBpcnlUaW1lc3RhbXApIHtcbiAgICAgICAgdGhpcy5uZXh0RXhwaXJ5VGltZXN0YW1wID0gZXhwaXJ5O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV2aWN0IGlmIG5lY2Vzc2FyeVxuICAgIHRoaXMuZXZpY3RJZk5lY2Vzc2FyeSgpO1xuXG4gICAgdGhpcy5sYXN0QWN0aXZpdHlUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIE5vdGlmeSBidWRnZXQgY29vcmRpbmF0b3IgKGlmIHJlZ2lzdGVyZWQpXG4gICAgaWYgKHRoaXMub25TZXQpIHtcbiAgICAgIHRoaXMub25TZXQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgc3BlY2lmaWMga2V5IGZyb20gY2FjaGVcbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlTm9kZShub2RlKTtcbiAgICB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpO1xuICAgIHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzIC09IG5vZGUuc2l6ZTtcblxuICAgIGlmICh0aGlzLm9uRXZpY3Rpb24pIHtcbiAgICAgIHRoaXMub25FdmljdGlvbihrZXksIG5vZGUudmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGtleSBleGlzdHMgaW4gY2FjaGVcbiAgICovXG4gIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIFRUTFxuICAgIGlmICh0aGlzLnR0bE1zID4gMCAmJiBEYXRlLm5vdygpIC0gbm9kZS50aW1lc3RhbXAgPiB0aGlzLnR0bE1zKSB7XG4gICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlbnRyaWVzIGZyb20gY2FjaGVcbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXNDbGVhcmVkID0gdGhpcy5jYWNoZS5zaXplO1xuXG4gICAgaWYgKHRoaXMub25FdmljdGlvbikge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBub2RlXSBvZiB0aGlzLmNhY2hlKSB7XG4gICAgICAgIHRoaXMub25FdmljdGlvbihrZXksIG5vZGUudmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgPSAwO1xuICAgIHRoaXMubmV4dEV4cGlyeVRpbWVzdGFtcCA9IEluZmluaXR5O1xuICAgIHRoaXMuZXZpY3Rpb25Db3VudCArPSB0aGlzLmNhY2hlLnNpemU7XG5cbiAgICBpZiAoZW50cmllc0NsZWFyZWQgPiAwKSB7XG4gICAgICBMUlVDYWNoZS5sb2dMaXN0ZW5lcj8uKCdkZWJ1ZycsICdDbGVhciBjYWNoZScsIHtcbiAgICAgICAgY2FjaGVOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGVudHJpZXNDbGVhcmVkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gQXVkaXQgY2FjaGUgY2xlYXJpbmdcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9DTEVBUkVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdMUlVDYWNoZS5jbGVhcicsXG4gICAgICAgIGRldGFpbHM6IGBDYWNoZSBjbGVhcmVkOiAke2VudHJpZXNDbGVhcmVkfSBlbnRyaWVzIHJlbW92ZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbnRyaWVzQ2xlYXJlZCB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgY2FjaGUgc2l6ZSAobnVtYmVyIG9mIGVudHJpZXMpXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhY2hlLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRpc3RpY3NcbiAgICovXG4gIGdldFN0YXRzKCk6IENhY2hlU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICBzaXplOiB0aGlzLmNhY2hlLnNpemUsXG4gICAgICBtYXhTaXplOiB0aGlzLm1heFNpemUsXG4gICAgICBoaXRDb3VudDogdGhpcy5oaXRDb3VudCxcbiAgICAgIG1pc3NDb3VudDogdGhpcy5taXNzQ291bnQsXG4gICAgICBldmljdGlvbkNvdW50OiB0aGlzLmV2aWN0aW9uQ291bnQsXG4gICAgICBtZW1vcnlVc2FnZU1COiB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyAvICgxMDI0ICogMTAyNCksXG4gICAgICBoaXRSYXRlOiB0aGlzLmhpdENvdW50ICsgdGhpcy5taXNzQ291bnQgPiAwID8gdGhpcy5oaXRDb3VudCAvICh0aGlzLmhpdENvdW50ICsgdGhpcy5taXNzQ291bnQpIDogMFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBrZXlzIGluIGFjY2VzcyBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpXG4gICAqIFJldHVybnMgYW4gYXJyYXkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNYXAgYmVoYXZpb3IgYW5kIGFycmF5IGluZGV4aW5nXG4gICAqL1xuICBrZXlzKCk6IHN0cmluZ1tdICYgSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+IHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnQua2V5KTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIGl0ZXJhdG9yIGludGVyZmFjZSB0byBzdXBwb3J0IGJvdGggYXJyYXkgYW5kIGl0ZXJhdG9yIHVzYWdlXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiBpdGVyYXRvcixcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4IDwgcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHRbaW5kZXgrK10sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9IGFzIEl0ZXJhdG9yUmVzdWx0PHN0cmluZz47XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE1lcmdlIGFycmF5IG1ldGhvZHMgd2l0aCBpdGVyYXRvclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlc3VsdCwgaXRlcmF0b3IpIGFzIHN0cmluZ1tdICYgSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdmFsdWVzIGluIGFjY2VzcyBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpXG4gICAqIFJldHVybnMgYW4gYXJyYXkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNYXAgYmVoYXZpb3IgYW5kIGFycmF5IGluZGV4aW5nXG4gICAqL1xuICB2YWx1ZXMoKTogVFtdICYgSXRlcmFibGVJdGVyYXRvcjxUPiB7XG4gICAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuaGVhZDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgcmVzdWx0LnB1c2goY3VycmVudC52YWx1ZSk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cblxuICAgIC8vIEFkZCBpdGVyYXRvciBpbnRlcmZhY2UgdG8gc3VwcG9ydCBib3RoIGFycmF5IGFuZCBpdGVyYXRvciB1c2FnZVxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gaXRlcmF0b3IsXG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA8IHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0W2luZGV4KytdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfSBhcyBJdGVyYXRvclJlc3VsdDxUPjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTWVyZ2UgYXJyYXkgbWV0aG9kcyB3aXRoIGl0ZXJhdG9yXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBpdGVyYXRvcikgYXMgVFtdICYgSXRlcmFibGVJdGVyYXRvcjxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVudHJpZXMgaW4gYWNjZXNzIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdClcbiAgICogUmV0dXJucyBhbiBhcnJheSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE1hcCBiZWhhdmlvciBhbmQgYXJyYXkgaW5kZXhpbmdcbiAgICovXG4gIGVudHJpZXMoKTogQXJyYXk8W3N0cmluZywgVF0+ICYgSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBUXT4ge1xuICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8W3N0cmluZywgVF0+ID0gW107XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFtjdXJyZW50LmtleSwgY3VycmVudC52YWx1ZV0pO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICB9XG5cbiAgICAvLyBBZGQgaXRlcmF0b3IgaW50ZXJmYWNlIHRvIHN1cHBvcnQgYm90aCBhcnJheSBhbmQgaXRlcmF0b3IgdXNhZ2VcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IGl0ZXJhdG9yLFxuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICBpZiAoaW5kZXggPCByZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdFtpbmRleCsrXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlIH0gYXMgSXRlcmF0b3JSZXN1bHQ8W3N0cmluZywgVF0+O1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBNZXJnZSBhcnJheSBtZXRob2RzIHdpdGggaXRlcmF0b3JcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihyZXN1bHQsIGl0ZXJhdG9yKSBhcyBBcnJheTxbc3RyaW5nLCBUXT4gJiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIFRdPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGVhY2ggZW50cnkgaW4gdGhlIGNhY2hlXG4gICAqL1xuICBmb3JFYWNoKGNhbGxiYWNrOiAodmFsdWU6IFQsIGtleTogc3RyaW5nLCBtYXA6IHRoaXMpID0+IHZvaWQsIHRoaXNBcmc/OiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuaGVhZDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRvciBmb3IgZW50cmllcyAoZm9yIE1hcCBjb21wYXRpYmlsaXR5KVxuICAgKi9cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgVF0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuaGVhZDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgeWllbGQgW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0cmluZyB0YWcgZm9yIE1hcCBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0xSVUNhY2hlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBtZW1vcnkgdXNhZ2UgaW4gTUJcbiAgICovXG4gIGdldE1lbW9yeVVzYWdlTUIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgLyAoMTAyNCAqIDEwMjQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IG1lbW9yeSB1c2FnZSBpbiBieXRlc1xuICAgKi9cbiAgZ2V0TWVtb3J5VXNhZ2VCeXRlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNhY2hlIG5hbWUgKHNldCB2aWEgY29uc3RydWN0b3Igb3B0aW9ucylcbiAgICovXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBnZXQoKSBoaXQgb3Igc2V0KCkgY2FsbC5cbiAgICogVXNlZCBieSBDYWNoZU1lbW9yeUJ1ZGdldCB0byBpZGVudGlmeSB0aGUgY29sZGVzdCAobGVhc3QtYWN0aXZlKSBjYWNoZS5cbiAgICogUmV0dXJucyAwIGlmIHRoZSBjYWNoZSBoYXMgbmV2ZXIgYmVlbiBhY2Nlc3NlZC5cbiAgICovXG4gIGdldExhc3RBY3Rpdml0eVRpbWVzdGFtcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY3Rpdml0eVRpbWU7XG4gIH1cblxuICAvKipcbiAgICogRXZpY3QgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cnkgZnJvbSB0aGUgY2FjaGUuXG4gICAqIFVzZWQgYnkgQ2FjaGVNZW1vcnlCdWRnZXQgdG8gZW5mb3JjZSBnbG9iYWwgbWVtb3J5IGxpbWl0cy5cbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbiBlbnRyeSB3YXMgZXZpY3RlZCwgZmFsc2UgaWYgdGhlIGNhY2hlIHdhcyBlbXB0eVxuICAgKi9cbiAgZXZpY3RPbmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnRhaWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5ldmljdExlYXN0UmVjZW50bHlVc2VkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgdHJpZ2dlciBjbGVhbnVwIG9mIGV4cGlyZWQgZW50cmllcy5cbiAgICogUmVjb21wdXRlcyBuZXh0RXhwaXJ5VGltZXN0YW1wIGZyb20gcmVtYWluaW5nIGVudHJpZXMuXG4gICAqL1xuICBjbGVhbnVwKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudHRsTXMgPD0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBrZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGVhcmxpZXN0UmVtYWluaW5nID0gSW5maW5pdHk7XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIG5vZGVdIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgIGNvbnN0IGV4cGlyeSA9IG5vZGUudGltZXN0YW1wICsgdGhpcy50dGxNcztcbiAgICAgIGlmIChub3cgPj0gZXhwaXJ5KSB7XG4gICAgICAgIGtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICB9IGVsc2UgaWYgKGV4cGlyeSA8IGVhcmxpZXN0UmVtYWluaW5nKSB7XG4gICAgICAgIGVhcmxpZXN0UmVtYWluaW5nID0gZXhwaXJ5O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNUb0RlbGV0ZSkge1xuICAgICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLm5leHRFeHBpcnlUaW1lc3RhbXAgPSBlYXJsaWVzdFJlbWFpbmluZztcbiAgICByZXR1cm4ga2V5c1RvRGVsZXRlLmxlbmd0aDtcbiAgfVxuXG4gIC8vIFByaXZhdGUgbWV0aG9kc1xuXG4gIHByaXZhdGUgbW92ZVRvRnJvbnQobm9kZTogQ2FjaGVOb2RlPFQ+KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgPT09IHRoaXMuaGVhZCkge1xuICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IGF0IGZyb250XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIHRoaXMucmVtb3ZlTm9kZShub2RlKTtcbiAgICBcbiAgICAvLyBBZGQgdG8gZnJvbnRcbiAgICB0aGlzLmFkZFRvRnJvbnQobm9kZSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRvRnJvbnQobm9kZTogQ2FjaGVOb2RlPFQ+KTogdm9pZCB7XG4gICAgbm9kZS5wcmV2ID0gbnVsbDtcbiAgICBub2RlLm5leHQgPSB0aGlzLmhlYWQ7XG5cbiAgICBpZiAodGhpcy5oZWFkKSB7XG4gICAgICB0aGlzLmhlYWQucHJldiA9IG5vZGU7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaGVhZCA9IG5vZGU7XG5cbiAgICBpZiAoIXRoaXMudGFpbCkge1xuICAgICAgdGhpcy50YWlsID0gbm9kZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU5vZGUobm9kZTogQ2FjaGVOb2RlPFQ+KTogdm9pZCB7XG4gICAgaWYgKG5vZGUucHJldikge1xuICAgICAgbm9kZS5wcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZCA9IG5vZGUubmV4dDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICBub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWlsID0gbm9kZS5wcmV2O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXZpY3RJZk5lY2Vzc2FyeSgpOiB2b2lkIHtcbiAgICAvLyBFdmljdCBieSBzaXplXG4gICAgd2hpbGUgKHRoaXMuY2FjaGUuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgdGhpcy5ldmljdExlYXN0UmVjZW50bHlVc2VkKCk7XG4gICAgfVxuXG4gICAgLy8gRXZpY3QgYnkgbWVtb3J5XG4gICAgaWYgKHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzID4gdGhpcy5tYXhNZW1vcnlCeXRlcyAmJiB0aGlzLnRhaWwpIHtcbiAgICAgIExSVUNhY2hlLmxvZ0xpc3RlbmVyPy4oJ3dhcm4nLCAnTWVtb3J5IGxpbWl0IGV4Y2VlZGVkJywge1xuICAgICAgICBjYWNoZU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgbWVtb3J5VXNhZ2VNQjogdGhpcy5jdXJyZW50TWVtb3J5Qnl0ZXMgLyAoMTAyNCAqIDEwMjQpLFxuICAgICAgICBtYXhNZW1vcnlNQjogdGhpcy5tYXhNZW1vcnlCeXRlcyAvICgxMDI0ICogMTAyNCksXG4gICAgICB9KTtcbiAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRNZW1vcnlCeXRlcyA+IHRoaXMubWF4TWVtb3J5Qnl0ZXMgJiYgdGhpcy50YWlsKSB7XG4gICAgICAgIHRoaXMuZXZpY3RMZWFzdFJlY2VudGx5VXNlZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluaXN0aWMgVFRMIGNsZWFudXA6IGZpcmVzIGV4YWN0bHkgd2hlbiBhbiBlbnRyeSBoYXMgZXhwaXJlZFxuICAgIGlmICh0aGlzLnR0bE1zID4gMCAmJiBEYXRlLm5vdygpID49IHRoaXMubmV4dEV4cGlyeVRpbWVzdGFtcCkge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmljdExlYXN0UmVjZW50bHlVc2VkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWlsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXZpY3RlZCA9IHRoaXMudGFpbDtcbiAgICB0aGlzLnJlbW92ZU5vZGUoZXZpY3RlZCk7XG4gICAgdGhpcy5jYWNoZS5kZWxldGUoZXZpY3RlZC5rZXkpO1xuICAgIHRoaXMuY3VycmVudE1lbW9yeUJ5dGVzIC09IGV2aWN0ZWQuc2l6ZTtcbiAgICB0aGlzLmV2aWN0aW9uQ291bnQrKztcblxuICAgIExSVUNhY2hlLmxvZ0xpc3RlbmVyPy4oJ2RlYnVnJywgJ0V2aWN0IGVudHJ5Jywge1xuICAgICAgY2FjaGVOYW1lOiB0aGlzLm5hbWUsXG4gICAgICBrZXk6IGV2aWN0ZWQua2V5LFxuICAgICAgc2l6ZTogZXZpY3RlZC5zaXplLFxuICAgICAgY2FjaGVTaXplOiB0aGlzLmNhY2hlLnNpemUsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5vbkV2aWN0aW9uKSB7XG4gICAgICB0aGlzLm9uRXZpY3Rpb24oZXZpY3RlZC5rZXksIGV2aWN0ZWQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZXMgdGhlIG1lbW9yeSBzaXplIG9mIGEgdmFsdWUgdXNpbmcgY29uZmlndXJhYmxlIGFjY3VyYWN5IG1vZGVzOlxuICAgKiAtIGZhc3Q6IE8oMSkgaGV1cmlzdGljcyBiYXNlZCBvbiB0eXBlIGFuZCBwcm9wZXJ0eSBjb3VudCAoMi01eCBmYXN0ZXIgdGhhbiBKU09OLnN0cmluZ2lmeSlcbiAgICogLSBiYWxhbmNlZDogU2FtcGxlcyBmaXJzdCBOIHByb3BlcnRpZXMgZm9yIGJldHRlciBhY2N1cmFjeSAobW9kZXJhdGUgc3BlZWQpXG4gICAqIC0gYWNjdXJhdGU6IFVzZXMgSlNPTi5zdHJpbmdpZnkgZm9yIHByZWNpc2Ugc2l6ZSAoc2xvd2VzdCwgb3JpZ2luYWwgYmVoYXZpb3IpXG4gICAqL1xuICBwcml2YXRlIGVzdGltYXRlU2l6ZSh2YWx1ZTogVCk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAodGhpcy5zaXplRXN0aW1hdGlvbk1vZGUpIHtcbiAgICAgICAgY2FzZSAnZmFzdCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVTaXplRmFzdCh2YWx1ZSk7XG4gICAgICAgIGNhc2UgJ2JhbGFuY2VkJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZVNpemVCYWxhbmNlZCh2YWx1ZSk7XG4gICAgICAgIGNhc2UgJ2FjY3VyYXRlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZVNpemVBY2N1cmF0ZSh2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVTaXplRmFzdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gTFJVQ2FjaGUuT0JKRUNUX0JBU0VfT1ZFUkhFQUQ7IC8vIEZhbGxiYWNrXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZhc3QgTygxKSBzaXplIGVzdGltYXRpb24gdXNpbmcgaGV1cmlzdGljc1xuICAgKiBBY2hpZXZlcyAyLTV4IHNwZWVkdXAgb3ZlciBKU09OLnN0cmluZ2lmeSB3aXRoIHJlYXNvbmFibGUgYWNjdXJhY3kgKDUwLTIwMCUpXG4gICAqL1xuICBwcml2YXRlIGVzdGltYXRlU2l6ZUZhc3QodmFsdWU6IFQpOiBudW1iZXIge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gTFJVQ2FjaGUuUFJJTUlUSVZFX1NJWkU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyB1bmtub3duIGFzIHN0cmluZykubGVuZ3RoICogMjsgLy8gVVRGLTE2IGNoYXJhY3RlcnNcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gTFJVQ2FjaGUuUFJJTUlUSVZFX1NJWkU7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBGYXN0IGVzdGltYXRlOiBiYXNlIG92ZXJoZWFkICsgZWxlbWVudCBjb3VudCAqIGF2ZXJhZ2UgZWxlbWVudCBzaXplXG4gICAgICAvLyBBc3N1bWVzIGF2ZXJhZ2UgZWxlbWVudCBpcyB+NjQgYnl0ZXMgKHdvcmtzIHdlbGwgZm9yIG1peGVkIGNvbnRlbnQpXG4gICAgICByZXR1cm4gTFJVQ2FjaGUuQVJSQVlfQkFTRV9PVkVSSEVBRCArIHZhbHVlLmxlbmd0aCAqIExSVUNhY2hlLkVMRU1FTlRfRVNUSU1BVEU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBGYXN0IGVzdGltYXRlOiBiYXNlIG92ZXJoZWFkICsga2V5IGNvdW50ICogYXZlcmFnZSBmaWVsZCBvdmVyaGVhZFxuICAgICAgLy8gRWFjaCBmaWVsZCBhc3N1bWVkIHRvIHRha2UgfjQ4IGJ5dGVzIChrZXkgc3RyaW5nICsgdmFsdWUgKyBwb2ludGVyKVxuICAgICAgY29uc3Qga2V5Q291bnQgPSBPYmplY3Qua2V5cyh2YWx1ZSBhcyBvYmplY3QpLmxlbmd0aDtcbiAgICAgIHJldHVybiBMUlVDYWNoZS5PQkpFQ1RfQkFTRV9PVkVSSEVBRCArIGtleUNvdW50ICogTFJVQ2FjaGUuRklFTERfT1ZFUkhFQUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIExSVUNhY2hlLk9CSkVDVF9CQVNFX09WRVJIRUFEO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhbGFuY2VkIGVzdGltYXRpb246IFNhbXBsZXMgZmlyc3QgTiBwcm9wZXJ0aWVzIGZvciBpbXByb3ZlZCBhY2N1cmFjeVxuICAgKiBQcm92aWRlcyBiZXR0ZXIgYWNjdXJhY3kgdGhhbiBmYXN0IG1vZGUgd2l0aCBtb2RlcmF0ZSBwZXJmb3JtYW5jZSBjb3N0XG4gICAqL1xuICBwcml2YXRlIGVzdGltYXRlU2l6ZUJhbGFuY2VkKHZhbHVlOiBUKTogbnVtYmVyIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIExSVUNhY2hlLlBSSU1JVElWRV9TSVpFO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgdW5rbm93biBhcyBzdHJpbmcpLmxlbmd0aCAqIDI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIExSVUNhY2hlLlBSSU1JVElWRV9TSVpFO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKHZhbHVlLmxlbmd0aCwgTFJVQ2FjaGUuQkFMQU5DRURfU0FNUExFX1NJWkUpO1xuICAgICAgaWYgKHNhbXBsZVNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIExSVUNhY2hlLkFSUkFZX0JBU0VfT1ZFUkhFQUQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbXBsZSBmaXJzdCBOIGVsZW1lbnRzIGFuZCBleHRyYXBvbGF0ZVxuICAgICAgbGV0IHNhbXBsZVRvdGFsID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIHNhbXBsZVRvdGFsICs9IHRoaXMuZXN0aW1hdGVTaXplRmFzdCh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBhdmdTaXplID0gc2FtcGxlVG90YWwgLyBzYW1wbGVTaXplO1xuICAgICAgcmV0dXJuIExSVUNhY2hlLkFSUkFZX0JBU0VfT1ZFUkhFQUQgKyB2YWx1ZS5sZW5ndGggKiBhdmdTaXplO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlIGFzIG9iamVjdCk7XG4gICAgICBjb25zdCBzYW1wbGVTaXplID0gTWF0aC5taW4oa2V5cy5sZW5ndGgsIExSVUNhY2hlLkJBTEFOQ0VEX1NBTVBMRV9TSVpFKTtcblxuICAgICAgaWYgKHNhbXBsZVNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIExSVUNhY2hlLk9CSkVDVF9CQVNFX09WRVJIRUFEO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW1wbGUgZmlyc3QgTiBwcm9wZXJ0aWVzIGFuZCBleHRyYXBvbGF0ZVxuICAgICAgbGV0IHNhbXBsZVRvdGFsID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGNvbnN0IHByb3BWYWx1ZSA9ICh2YWx1ZSBhcyBhbnkpW2tleV07XG4gICAgICAgIC8vIEtleSBzaXplICsgdmFsdWUgc2l6ZSArIHBvaW50ZXIgb3ZlcmhlYWRcbiAgICAgICAgc2FtcGxlVG90YWwgKz0ga2V5Lmxlbmd0aCAqIDIgKyB0aGlzLmVzdGltYXRlU2l6ZUZhc3QocHJvcFZhbHVlKSArIDE2O1xuICAgICAgfVxuICAgICAgY29uc3QgYXZnRmllbGRTaXplID0gc2FtcGxlVG90YWwgLyBzYW1wbGVTaXplO1xuICAgICAgcmV0dXJuIExSVUNhY2hlLk9CSkVDVF9CQVNFX09WRVJIRUFEICsga2V5cy5sZW5ndGggKiBhdmdGaWVsZFNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIExSVUNhY2hlLk9CSkVDVF9CQVNFX09WRVJIRUFEO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY3VyYXRlIGVzdGltYXRpb24gdXNpbmcgSlNPTi5zdHJpbmdpZnkgKG9yaWdpbmFsIGJlaGF2aW9yKVxuICAgKiBTbG93ZXN0IGJ1dCBtb3N0IGFjY3VyYXRlLCBPKG4pIHdoZXJlIG4gaXMgdGhlIHNpemUgb2YgdGhlIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBlc3RpbWF0ZVNpemVBY2N1cmF0ZSh2YWx1ZTogVCk6IG51bWJlciB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBMUlVDYWNoZS5QUklNSVRJVkVfU0laRTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyB1bmtub3duIGFzIHN0cmluZykubGVuZ3RoICogMjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIExSVUNhY2hlLlBSSU1JVElWRV9TSVpFO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiBhY2MgKyB0aGlzLmVzdGltYXRlU2l6ZUFjY3VyYXRlKGl0ZW0pLCBMUlVDYWNoZS5BUlJBWV9CQVNFX09WRVJIRUFEKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIHJldHVybiBqc29uU3RyLmxlbmd0aCAqIDIgKyBMUlVDYWNoZS5PQkpFQ1RfQkFTRV9PVkVSSEVBRDtcbiAgICB9XG5cbiAgICByZXR1cm4gTFJVQ2FjaGUuT0JKRUNUX0JBU0VfT1ZFUkhFQUQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBvcHRpbWl6ZWQgTFJVIGNhY2hlcyBmb3IgZGlmZmVyZW50IHVzZSBjYXNlc1xuICovXG5leHBvcnQgY2xhc3MgQ2FjaGVGYWN0b3J5IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBjYWNoZSBvcHRpbWl6ZWQgZm9yIHNlYXJjaCByZXN1bHRzXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlU2VhcmNoUmVzdWx0Q2FjaGU8VD4ob3B0aW9ucz86IFBhcnRpYWw8TFJVQ2FjaGVPcHRpb25zPik6IExSVUNhY2hlPFQ+IHtcbiAgICByZXR1cm4gbmV3IExSVUNhY2hlPFQ+KHtcbiAgICAgIG1heFNpemU6IDEwMCxcbiAgICAgIG1heE1lbW9yeU1COiAxMCxcbiAgICAgIHR0bE1zOiA1ICogNjAgKiAxMDAwLCAvLyA1IG1pbnV0ZXNcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2FjaGUgb3B0aW1pemVkIGZvciBpbmRleCBkYXRhXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW5kZXhDYWNoZTxUPihvcHRpb25zPzogUGFydGlhbDxMUlVDYWNoZU9wdGlvbnM+KTogTFJVQ2FjaGU8VD4ge1xuICAgIHJldHVybiBuZXcgTFJVQ2FjaGU8VD4oe1xuICAgICAgbWF4U2l6ZTogNTAsXG4gICAgICBtYXhNZW1vcnlNQjogMjUsXG4gICAgICB0dGxNczogMTUgKiA2MCAqIDEwMDAsIC8vIDE1IG1pbnV0ZXNcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgY2FjaGUgb3B0aW1pemVkIGZvciBBUEkgcmVzcG9uc2VzXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQVBJQ2FjaGU8VD4ob3B0aW9ucz86IFBhcnRpYWw8TFJVQ2FjaGVPcHRpb25zPik6IExSVUNhY2hlPFQ+IHtcbiAgICByZXR1cm4gbmV3IExSVUNhY2hlPFQ+KHtcbiAgICAgIG1heFNpemU6IDIwMCxcbiAgICAgIG1heE1lbW9yeU1COiA1LFxuICAgICAgdHRsTXM6IDEwICogNjAgKiAxMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSk7XG4gIH1cbn0iXX0=
@@ -72,8 +72,7 @@ declare const envSchema: z.ZodObject<{
72
72
  DOLLHOUSE_LOG_FILE_MAX_SIZE: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
73
73
  DOLLHOUSE_LOG_MAX_DIR_SIZE_BYTES: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
74
74
  DOLLHOUSE_LOG_MAX_FILES_PER_CATEGORY: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
75
- DOLLHOUSE_LOG_VIEWER: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
76
- DOLLHOUSE_LOG_VIEWER_PORT: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
75
+ DOLLHOUSE_WEB_CONSOLE: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
77
76
  DOLLHOUSE_GATEKEEPER_ENABLED: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
78
77
  DOLLHOUSE_GATEKEEPER_ELEMENT_POLICY_OVERRIDES: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
79
78
  DOLLHOUSE_POLICY_EXPORT_ENABLED: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
@@ -88,6 +87,12 @@ declare const envSchema: z.ZodObject<{
88
87
  DOLLHOUSE_PERMISSION_PROMPT_RATE_LIMIT: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
89
88
  DOLLHOUSE_CLI_APPROVAL_RATE_LIMIT: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
90
89
  DOLLHOUSE_PERMISSION_RATE_WINDOW_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
90
+ DOLLHOUSE_METRICS_ENABLED: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
91
+ DOLLHOUSE_METRICS_COLLECTION_INTERVAL_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
92
+ DOLLHOUSE_METRICS_MAX_SNAPSHOT_SIZE: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
93
+ DOLLHOUSE_METRICS_COLLECTOR_FAILURE_THRESHOLD: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
94
+ DOLLHOUSE_METRICS_COLLECTION_DURATION_WARN_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
95
+ DOLLHOUSE_METRICS_MEMORY_SNAPSHOT_CAPACITY: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
91
96
  DOLLHOUSE_DISABLE_ENCRYPTION: z.ZodDefault<z.ZodCoercedBoolean<unknown>>;
92
97
  DOLLHOUSE_ENCRYPTION_SECRET: z.ZodOptional<z.ZodString>;
93
98
  DOLLHOUSE_ENCRYPTION_SALT: z.ZodOptional<z.ZodString>;
@@ -121,8 +126,7 @@ export declare const env: {
121
126
  DOLLHOUSE_LOG_FILE_MAX_SIZE: number;
122
127
  DOLLHOUSE_LOG_MAX_DIR_SIZE_BYTES: number;
123
128
  DOLLHOUSE_LOG_MAX_FILES_PER_CATEGORY: number;
124
- DOLLHOUSE_LOG_VIEWER: boolean;
125
- DOLLHOUSE_LOG_VIEWER_PORT: number;
129
+ DOLLHOUSE_WEB_CONSOLE: boolean;
126
130
  DOLLHOUSE_GATEKEEPER_ENABLED: boolean;
127
131
  DOLLHOUSE_GATEKEEPER_ELEMENT_POLICY_OVERRIDES: boolean;
128
132
  DOLLHOUSE_POLICY_EXPORT_ENABLED: boolean;
@@ -137,6 +141,12 @@ export declare const env: {
137
141
  DOLLHOUSE_PERMISSION_PROMPT_RATE_LIMIT: number;
138
142
  DOLLHOUSE_CLI_APPROVAL_RATE_LIMIT: number;
139
143
  DOLLHOUSE_PERMISSION_RATE_WINDOW_MS: number;
144
+ DOLLHOUSE_METRICS_ENABLED: boolean;
145
+ DOLLHOUSE_METRICS_COLLECTION_INTERVAL_MS: number;
146
+ DOLLHOUSE_METRICS_MAX_SNAPSHOT_SIZE: number;
147
+ DOLLHOUSE_METRICS_COLLECTOR_FAILURE_THRESHOLD: number;
148
+ DOLLHOUSE_METRICS_COLLECTION_DURATION_WARN_MS: number;
149
+ DOLLHOUSE_METRICS_MEMORY_SNAPSHOT_CAPACITY: number;
140
150
  DOLLHOUSE_DISABLE_ENCRYPTION: boolean;
141
151
  GITHUB_TOKEN?: string | undefined;
142
152
  GITHUB_USERNAME?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB;;GAEG;AACH,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsJb,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA+B,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,MAAM,SAA0B,CAAC;AAC9C,eAAO,MAAM,aAAa,SAAiC,CAAC;AAC5D,eAAO,MAAM,YAAY,SAAgC,CAAC"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB;;GAEG;AACH,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsKb,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA+B,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,MAAM,SAA0B,CAAC;AAC9C,eAAO,MAAM,aAAa,SAAiC,CAAC;AAC5D,eAAO,MAAM,YAAY,SAAgC,CAAC"}
@@ -94,10 +94,12 @@ const envSchema = z.object({
94
94
  DOLLHOUSE_LOG_RETENTION_DAYS: z.coerce.number().default(30),
95
95
  DOLLHOUSE_LOG_SECURITY_RETENTION_DAYS: z.coerce.number().default(7),
96
96
  DOLLHOUSE_LOG_FLUSH_INTERVAL_MS: z.coerce.number().default(5000),
97
- DOLLHOUSE_LOG_BUFFER_SIZE: z.coerce.number().default(100),
97
+ // Buffer raised to 2000 to support the web console log viewer — the higher capacity
98
+ // reduces flush frequency and keeps more entries available for SSE backfill on connect.
99
+ DOLLHOUSE_LOG_BUFFER_SIZE: z.coerce.number().default(2000),
98
100
  DOLLHOUSE_LOG_MEMORY_CAPACITY: z.coerce.number().default(5000),
99
- DOLLHOUSE_LOG_MEMORY_APP_CAPACITY: z.coerce.number().default(5000),
100
- DOLLHOUSE_LOG_MEMORY_SECURITY_CAPACITY: z.coerce.number().default(3000),
101
+ DOLLHOUSE_LOG_MEMORY_APP_CAPACITY: z.coerce.number().default(10000),
102
+ DOLLHOUSE_LOG_MEMORY_SECURITY_CAPACITY: z.coerce.number().default(5000),
101
103
  DOLLHOUSE_LOG_MEMORY_PERF_CAPACITY: z.coerce.number().default(2000),
102
104
  DOLLHOUSE_LOG_MEMORY_TELEMETRY_CAPACITY: z.coerce.number().default(1000),
103
105
  DOLLHOUSE_LOG_MAX_ENTRY_SIZE: z.coerce.number().default(16384),
@@ -105,8 +107,11 @@ const envSchema = z.object({
105
107
  DOLLHOUSE_LOG_FILE_MAX_SIZE: z.coerce.number().default(104857600),
106
108
  DOLLHOUSE_LOG_MAX_DIR_SIZE_BYTES: z.coerce.number().default(0),
107
109
  DOLLHOUSE_LOG_MAX_FILES_PER_CATEGORY: z.coerce.number().default(100),
108
- DOLLHOUSE_LOG_VIEWER: z.coerce.boolean().default(false),
109
- DOLLHOUSE_LOG_VIEWER_PORT: z.coerce.number().default(9100),
110
+ // ============================================================================
111
+ // Web Console Configuration
112
+ // ============================================================================
113
+ /** Enable the unified web console (logs + metrics tabs on port 3939) */
114
+ DOLLHOUSE_WEB_CONSOLE: z.coerce.boolean().default(true),
110
115
  // ============================================================================
111
116
  // Security Configuration
112
117
  // ============================================================================
@@ -156,6 +161,15 @@ const envSchema = z.object({
156
161
  DOLLHOUSE_CLI_APPROVAL_RATE_LIMIT: z.coerce.number().default(20),
157
162
  /** Rate limit window in ms for permission prompt and CLI approvals (default: 60000 = 60s) */
158
163
  DOLLHOUSE_PERMISSION_RATE_WINDOW_MS: z.coerce.number().default(60_000),
164
+ // ============================================================================
165
+ // Metrics Collection Configuration
166
+ // ============================================================================
167
+ DOLLHOUSE_METRICS_ENABLED: z.coerce.boolean().default(true),
168
+ DOLLHOUSE_METRICS_COLLECTION_INTERVAL_MS: z.coerce.number().min(1000).max(300000).default(15000),
169
+ DOLLHOUSE_METRICS_MAX_SNAPSHOT_SIZE: z.coerce.number().default(102400),
170
+ DOLLHOUSE_METRICS_COLLECTOR_FAILURE_THRESHOLD: z.coerce.number().min(1).max(100).default(10),
171
+ DOLLHOUSE_METRICS_COLLECTION_DURATION_WARN_MS: z.coerce.number().min(100).max(60000).default(5000),
172
+ DOLLHOUSE_METRICS_MEMORY_SNAPSHOT_CAPACITY: z.coerce.number().min(10).max(10000).default(240),
159
173
  // Pattern encryption settings for Memory Security (Issue #1321)
160
174
  DOLLHOUSE_DISABLE_ENCRYPTION: z.coerce.boolean().default(false),
161
175
  DOLLHOUSE_ENCRYPTION_SECRET: z.string().optional(),
@@ -184,4 +198,4 @@ if (isDevelopment || isTest) {
184
198
  HAS_GITHUB_TEST_TOKEN: !!env.GITHUB_TEST_TOKEN,
185
199
  });
186
200
  }
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLGdGQUFnRjtBQUNoRiw2REFBNkQ7QUFDN0QsRUFBRTtBQUNGLDJEQUEyRDtBQUMzRCxzRUFBc0U7QUFDdEUsb0ZBQW9GO0FBQ3BGLGdGQUFnRjtBQUNoRixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQVEsQ0FBQztBQUN4RSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekIsK0VBQStFO0lBQy9FLGNBQWM7SUFDZCwrRUFBK0U7SUFDL0UsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUU5RSwrRUFBK0U7SUFDL0UsZ0NBQWdDO0lBQ2hDLCtFQUErRTtJQUMvRSw0REFBNEQ7SUFDNUQsc0VBQXNF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TSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDO0FBRTFEOztHQUVHO0FBQ0gsSUFBSSxhQUFhLElBQUksTUFBTSxFQUFFLENBQUM7SUFDNUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRTtRQUNoRCxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDdEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1FBQ3hCLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWTtRQUNwQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQjtLQUMvQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDZW50cmFsaXplZCBFbnZpcm9ubWVudCBDb25maWd1cmF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdHlwZS1zYWZlIGFjY2VzcyB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB2YWxpZGF0aW9uLlxuICogQWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBzaG91bGQgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGlzIG1vZHVsZSByYXRoZXIgdGhhblxuICogZGlyZWN0bHkgdmlhIHByb2Nlc3MuZW52IHRvIGVuc3VyZSB0eXBlIHNhZmV0eSBhbmQgdmFsaWRhdGlvbi5cbiAqXG4gKiBVc2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGVudiB9IGZyb20gJy4vY29uZmlnL2Vudic7XG4gKiBjb25zdCB0b2tlbiA9IGVudi5HSVRIVUJfVE9LRU47ICAvLyBUeXBlOiBzdHJpbmdcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuLy8gTG9hZCAuZW52IGZpbGVzIHdpdGggcHJpb3JpdHk6IC5lbnYubG9jYWwgKHBlcnNvbmFsKSA+IC5lbnYgKHNoYXJlZCBkZWZhdWx0cylcbi8vIEJvdGggZmlsZXMgYXJlIG9wdGlvbmFsIC0gbm8gZXJyb3IgaWYgZWl0aGVyIGRvZXNuJ3QgZXhpc3Rcbi8vXG4vLyBNQ1AgUHJvdG9jb2wgQ29tcGxpYW5jZTogU3VwcHJlc3MgZG90ZW52J3Mgc3Rkb3V0IG91dHB1dFxuLy8gVGhlIE1DUCBwcm90b2NvbCByZXF1aXJlcyB0aGF0IE9OTFkgSlNPTi1SUEMgbWVzc2FnZXMgZ28gdG8gc3Rkb3V0LlxuLy8gZG90ZW52IG1heSBvdXRwdXQgdmVyc2lvbiBpbmZvIHRvIHN0ZG91dCwgd2hpY2ggYnJlYWtzIENsYXVkZSBEZXNrdG9wIGNvbm5lY3Rpb24uXG4vLyBTb2x1dGlvbjogVGVtcG9yYXJpbHkgcmVkaXJlY3Qgc3Rkb3V0IHRvIHN0ZGVyciBkdXJpbmcgZG90ZW52IGluaXRpYWxpemF0aW9uLlxuY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xucHJvY2Vzcy5zdGRvdXQud3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKSBhcyBhbnk7XG5kb3RlbnYuY29uZmlnKHsgcGF0aDogWycuZW52LmxvY2FsJywgJy5lbnYnXSB9KTtcbnByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZTtcblxuLyoqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBzY2hlbWEgd2l0aCB2YWxpZGF0aW9uXG4gKi9cbmNvbnN0IGVudlNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFbnZpcm9ubWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIE5PREVfRU5WOiB6LmVudW0oWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3Byb2R1Y3Rpb24nXSkuZGVmYXVsdCgnZGV2ZWxvcG1lbnQnKSxcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByb2R1Y3Rpb24gR2l0SHViIENyZWRlbnRpYWxzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXNlZCBieSBwcm9kdWN0aW9uIGNvZGUgKHNyYy8pIGZvciByZWFsIEdpdEh1YiBvcGVyYXRpb25zXG4gIC8vIE9wdGlvbmFsOiBGZWF0dXJlcyByZXF1aXJpbmcgR2l0SHViIHdpbGwgZmFpbCBncmFjZWZ1bGx5IGlmIG5vdCBzZXRcbiAgR0lUSFVCX1RPS0VOOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIEdJVEhVQl9VU0VSTkFNRTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBHSVRIVUJfUkVQT1NJVE9SWTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVGVzdCBHaXRIdWIgQ3JlZGVudGlhbHMgKFNFUEFSQVRFIGFjY291bnQhKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVzZWQgYnkgdGVzdCBjb2RlICh0ZXN0cy8pIC0gdGVzdHMgd2lsbCBza2lwIGlmIG5vdCBwcm92aWRlZFxuICAvLyBJTVBPUlRBTlQ6IFVzZSBhIGRpZmZlcmVudCBHaXRIdWIgYWNjb3VudCBmb3IgdGVzdGluZyFcbiAgR0lUSFVCX1RFU1RfVE9LRU46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgR0lUSFVCX1RFU1RfVVNFUk5BTUU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgR0lUSFVCX1RFU1RfUkVQT1NJVE9SWTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2VydmVyIENvbmZpZ3VyYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBQT1JUOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDMwMDApLFxuICBMT0dfTEVWRUw6IHouZW51bShbJ2Vycm9yJywgJ3dhcm4nLCAnaW5mbycsICdkZWJ1ZyddKS5kZWZhdWx0KCdpbmZvJyksXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUZXN0IENvbmZpZ3VyYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBURVNUX0JBU0VfRElSOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIFRFU1RfUEVSU09OQVNfRElSOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIFRFU1RfQ0FDSEVfRElSOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIFRFU1RfQ09ORklHX0RJUjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRmVhdHVyZSBGbGFnc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIERPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OOiB6LmNvZXJjZS5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG4gIEVOQUJMRV9ERUJVRzogei5jb2VyY2UuYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICBURVNUX1ZFUkJPU0VfTE9HR0lORzogei5jb2VyY2UuYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUNQIEludGVyZmFjZSBDb25maWd1cmF0aW9uIChJc3N1ZSAjMjM3KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBNQ1AgaW50ZXJmYWNlIG1vZGUgLSBjb250cm9scyB3aGljaCB0b29sIGludGVyZmFjZSBpcyBleHBvc2VkIHRvIExMTXM6XG4gICAqIC0gJ2Rpc2NyZXRlJzogfjQwIGluZGl2aWR1YWwgdG9vbHMgKGxpc3RfZWxlbWVudHMsIGNyZWF0ZV9lbGVtZW50LCBldGMuKSAtIH4zLDAwMCB0b2tlbnNcbiAgICogLSAnbWNwYXFsJzogQ29uc29saWRhdGVkIE1DUC1BUUwgaW50ZXJmYWNlIC0gdXNlcyBNQ1BfQVFMX0VORFBPSU5UX01PREUgZm9yIHN0eWxlXG4gICAqXG4gICAqIERlZmF1bHQ6ICdtY3BhcWwnIC0gcmVjb21tZW5kZWQgZm9yIHRva2VuIGVmZmljaWVuY3kgYW5kIGNsZWFuZXIgdG9vbCBkaXNjb3ZlcnlcbiAgICovXG4gIE1DUF9JTlRFUkZBQ0VfTU9ERTogei5lbnVtKFsnZGlzY3JldGUnLCAnbWNwYXFsJ10pLmRlZmF1bHQoJ21jcGFxbCcpLFxuXG4gIC8qKlxuICAgKiBNQ1AtQVFMIGVuZHBvaW50IG1vZGUgKG9ubHkgYXBwbGllcyB3aGVuIE1DUF9JTlRFUkZBQ0VfTU9ERT0nbWNwYXFsJyk6XG4gICAqIC0gJ2NydWRlJzogNSBDUlVERSB0b29scyAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSwgRXhlY3V0ZSkgLSB+NCwzMDAgdG9rZW5zXG4gICAqIC0gJ3NpbmdsZSc6IDEgdG9vbCAobWNwX2FxbCkgLSB+MzUwIHRva2VucywgaWRlYWwgZm9yIG11bHRpLXNlcnZlciBkZXBsb3ltZW50c1xuICAgKi9cbiAgTUNQX0FRTF9FTkRQT0lOVF9NT0RFOiB6LmVudW0oWydjcnVkZScsICdzaW5nbGUnXSkuZGVmYXVsdCgnY3J1ZGUnKSxcblxuICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFsaWFzIGZvciBNQ1BfQVFMX01PREUgKGRlcHJlY2F0ZWQsIHVzZSBNQ1BfQVFMX0VORFBPSU5UX01PREUpXG4gIE1DUF9BUUxfTU9ERTogei5lbnVtKFsnY3J1ZGUnLCAnc2luZ2xlJ10pLm9wdGlvbmFsKCksXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVbmlmaWVkIExvZ2dpbmcgQ29uZmlndXJhdGlvbiAoZG9jcy9MT0dHSU5HLURFU0lHTi5tZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBET0xMSE9VU0VfTE9HX0RJUjogei5zdHJpbmcoKS5kZWZhdWx0KCd+Ly5kb2xsaG91c2UvbG9ncy8nKSxcbiAgRE9MTEhPVVNFX0xPR19GT1JNQVQ6IHouZW51bShbJ3RleHQnLCAnanNvbmwnXSkuZGVmYXVsdCgndGV4dCcpLFxuICBET0xMSE9VU0VfTE9HX1JFVEVOVElPTl9EQVlTOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDMwKSxcbiAgRE9MTEhPVVNFX0xPR19TRUNVUklUWV9SRVRFTlRJT05fREFZUzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCg3KSxcbiAgRE9MTEhPVVNFX0xPR19GTFVTSF9JTlRFUlZBTF9NUzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCg1MDAwKSxcbiAgRE9MTEhPVVNFX0xPR19CVUZGRVJfU0laRTogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgxMDApLFxuICBET0xMSE9VU0VfTE9HX01FTU9SWV9DQVBBQ0lUWTogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCg1MDAwKSxcbiAgRE9MTEhPVVNFX0xPR19NRU1PUllfQVBQX0NBUEFDSVRZOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDUwMDApLFxuICBET0xMSE9VU0VfTE9HX01FTU9SWV9TRUNVUklUWV9DQVBBQ0lUWTogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgzMDAwKSxcbiAgRE9MTEhPVVNFX0xPR19NRU1PUllfUEVSRl9DQVBBQ0lUWTogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgyMDAwKSxcbiAgRE9MTEhPVVNFX0xPR19NRU1PUllfVEVMRU1FVFJZX0NBUEFDSVRZOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDEwMDApLFxuICBET0xMSE9VU0VfTE9HX01BWF9FTlRSWV9TSVpFOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDE2Mzg0KSxcbiAgRE9MTEhPVVNFX0xPR19JTU1FRElBVEVfRkxVU0hfUkFURTogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCg1MCksXG4gIERPTExIT1VTRV9MT0dfRklMRV9NQVhfU0laRTogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgxMDQ4NTc2MDApLFxuICBET0xMSE9VU0VfTE9HX01BWF9ESVJfU0laRV9CWVRFUzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgwKSxcbiAgRE9MTEhPVVNFX0xPR19NQVhfRklMRVNfUEVSX0NBVEVHT1JZOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDEwMCksXG4gIERPTExIT1VTRV9MT0dfVklFV0VSOiB6LmNvZXJjZS5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG4gIERPTExIT1VTRV9MT0dfVklFV0VSX1BPUlQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoOTEwMCksXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZWN1cml0eSBDb25maWd1cmF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIElzc3VlICM0NTI6IEdhdGVrZWVwZXIgcG9saWN5IGVuZm9yY2VtZW50LlxuICAgKiBXaGVuIHRydWUgKGRlZmF1bHQpLCBhbGwgTUNQLUFRTCBvcGVyYXRpb25zIGdvIHRocm91Z2ggdGhlIDQtbGF5ZXIgR2F0ZWtlZXBlclxuICAgKiBlbmZvcmNlKCkgcGlwZWxpbmUuIFdoZW4gZmFsc2UsIGZhbGxzIGJhY2sgdG8gcm91dGUgdmFsaWRhdGlvbiBvbmx5LlxuICAgKiBUaGlzIGlzIGEgdXNlci9vcGVyYXRvciBzZXR0aW5nIOKAlCB0aGUgTExNIGNhbm5vdCBieXBhc3MgaXQuXG4gICAqL1xuICBET0xMSE9VU0VfR0FURUtFRVBFUl9FTkFCTEVEOiB6LmNvZXJjZS5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcbiAgLyoqXG4gICAqIElzc3VlICM2Nzk6IEVsZW1lbnQgcG9saWN5IGxheWVyIGtpbGwgc3dpdGNoLlxuICAgKiBXaGVuIHRydWUgKGRlZmF1bHQpLCBhY3RpdmUgZWxlbWVudCBnYXRla2VlcGVyIHBvbGljaWVzIChhbGxvdy9jb25maXJtL2Rlbnkvc2NvcGVSZXN0cmljdGlvbnMpXG4gICAqIGNhbiBvdmVycmlkZSBkZWZhdWx0IG9wZXJhdGlvbiBwZXJtaXNzaW9uIGxldmVscy4gV2hlbiBmYWxzZSwgTGF5ZXIgMiBvZiBHYXRla2VlcGVyLmVuZm9yY2UoKVxuICAgKiBpcyBieXBhc3NlZCBlbnRpcmVseSDigJQgb25seSByb3V0ZSB2YWxpZGF0aW9uIGFuZCBkZWZhdWx0IHBlcm1pc3Npb24gbGV2ZWxzIGFwcGx5LlxuICAgKiBVc2UgZm9yIGVtZXJnZW5jeSBsb2NrZG93biwgaGFyZGVuZWQgZGVwbG95bWVudHMsIG9yIHBvbGljeSBkZWJ1Z2dpbmcuXG4gICAqIFRoaXMgaXMgYW4gb3BlcmF0b3IvaW5mcmFzdHJ1Y3R1cmUgc2V0dGluZyDigJQgdGhlIExMTSBjYW5ub3QgYnlwYXNzIGl0LlxuICAgKi9cbiAgRE9MTEhPVVNFX0dBVEVLRUVQRVJfRUxFTUVOVF9QT0xJQ1lfT1ZFUlJJREVTOiB6LmNvZXJjZS5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcbiAgLyoqXG4gICAqIElzc3VlICM3OTk6IFBvbGljeSBleHBvcnQgb3B0LWluIGZsYWcuXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIFBvbGljeUV4cG9ydFNlcnZpY2Ugd3JpdGVzIHRoZSBzZWN1cml0eSBwb2xpY3kgYmx1ZXByaW50IHRvXG4gICAqIH4vLmRvbGxob3VzZS9icmlkZ2UvaW1wb3J0cy9wb2xpY2llcy8gb24gYWN0aXZhdGlvbiBjaGFuZ2VzLiBUaGUgRG9sbGhvdXNlQnJpZGdlXG4gICAqIHBlcm1pc3Npb24tcHJvbXB0IHNlcnZlciB3YXRjaGVzIHRoaXMgZmlsZSB0byBldmFsdWF0ZSBwZXJtaXNzaW9ucyBsb2NhbGx5LlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBwb2xpY3kgZmlsZSBleHBvcnQgZW50aXJlbHkuXG4gICAqL1xuICBET0xMSE9VU0VfUE9MSUNZX0VYUE9SVF9FTkFCTEVEOiB6LmNvZXJjZS5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFN0b3JhZ2UgTGF5ZXIgQ29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIERPTExIT1VTRV9TQ0FOX0NPT0xET1dOX01TOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDEwMDApLFxuICBET0xMSE9VU0VfSU5ERVhfREVCT1VOQ0VfTVM6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMjAwMCksXG4gIERPTExIT1VTRV9FTEVNRU5UX0NBQ0hFX1RUTF9NUzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgzNjAwMDAwKSxcbiAgRE9MTEhPVVNFX1BBVEhfQ0FDSEVfVFRMX01TOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDM2MDAwMDApLFxuICBET0xMSE9VU0VfVE9PTF9DQUNIRV9UVExfTVM6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoNjAwMDApLFxuICBET0xMSE9VU0VfR0xPQkFMX0NBQ0hFX01FTU9SWV9NQjogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgxNTApLFxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUGVybWlzc2lvbiBQcm9tcHQgQ29uZmlndXJhdGlvbiAoSXNzdWUgIzYyNSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBNYXhpbXVtIENMSSBhcHByb3ZhbCByZWNvcmRzIGJlZm9yZSBMUlUgZXZpY3Rpb24gKGRlZmF1bHQ6IDUwKSAqL1xuICBET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX01BWDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCg1MCksXG5cbiAgLyoqIERlZmF1bHQgVFRMIGZvciBDTEkgYXBwcm92YWwgcmVjb3JkcyBpbiBtcyAoZGVmYXVsdDogMzAwMDAwID0gNSBtaW4pICovXG4gIERPTExIT1VTRV9DTElfQVBQUk9WQUxfVFRMX01TOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDMwMF8wMDApLFxuXG4gIC8qKiBQZXJtaXNzaW9uIHByb21wdCByYXRlIGxpbWl0OiBtYXggcmVxdWVzdHMgcGVyIHdpbmRvdyAoZGVmYXVsdDogMTAwKSAqL1xuICBET0xMSE9VU0VfUEVSTUlTU0lPTl9QUk9NUFRfUkFURV9MSU1JVDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgxMDApLFxuXG4gIC8qKiBDTEkgYXBwcm92YWwgY3JlYXRpb24gcmF0ZSBsaW1pdDogbWF4IHJlcXVlc3RzIHBlciB3aW5kb3cgKGRlZmF1bHQ6IDIwKSAqL1xuICBET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1JBVEVfTElNSVQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMjApLFxuXG4gIC8qKiBSYXRlIGxpbWl0IHdpbmRvdyBpbiBtcyBmb3IgcGVybWlzc2lvbiBwcm9tcHQgYW5kIENMSSBhcHByb3ZhbHMgKGRlZmF1bHQ6IDYwMDAwID0gNjBzKSAqL1xuICBET0xMSE9VU0VfUEVSTUlTU0lPTl9SQVRFX1dJTkRPV19NUzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCg2MF8wMDApLFxuXG4gIC8vIFBhdHRlcm4gZW5jcnlwdGlvbiBzZXR0aW5ncyBmb3IgTWVtb3J5IFNlY3VyaXR5IChJc3N1ZSAjMTMyMSlcbiAgRE9MTEhPVVNFX0RJU0FCTEVfRU5DUllQVElPTjogei5jb2VyY2UuYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICBET0xMSE9VU0VfRU5DUllQVElPTl9TRUNSRVQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgRE9MTEhPVVNFX0VOQ1JZUFRJT05fU0FMVDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogVmFsaWRhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICogVHlwZSBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gdGhlIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgZW52ID0gZW52U2NoZW1hLnBhcnNlKHByb2Nlc3MuZW52KTtcblxuLyoqXG4gKiBFbnZpcm9ubWVudCB0eXBlIChpbmZlcnJlZCBmcm9tIHNjaGVtYSlcbiAqL1xuZXhwb3J0IHR5cGUgRW52ID0gei5pbmZlcjx0eXBlb2YgZW52U2NoZW1hPjtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBoZWxwZXJzIGZvciBlbnZpcm9ubWVudCBkZXRlY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVGVzdCA9IGVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnO1xuZXhwb3J0IGNvbnN0IGlzRGV2ZWxvcG1lbnQgPSBlbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG5leHBvcnQgY29uc3QgaXNQcm9kdWN0aW9uID0gZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG5cbi8qKlxuICogTG9nIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gKHdpdGhvdXQgc2VjcmV0cylcbiAqL1xuaWYgKGlzRGV2ZWxvcG1lbnQgfHwgaXNUZXN0KSB7XG4gIGxvZ2dlci5kZWJ1ZygnRW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBsb2FkZWQ6Jywge1xuICAgIE5PREVfRU5WOiBlbnYuTk9ERV9FTlYsXG4gICAgUE9SVDogZW52LlBPUlQsXG4gICAgTE9HX0xFVkVMOiBlbnYuTE9HX0xFVkVMLFxuICAgIEhBU19HSVRIVUJfVE9LRU46ICEhZW52LkdJVEhVQl9UT0tFTixcbiAgICBIQVNfR0lUSFVCX1RFU1RfVE9LRU46ICEhZW52LkdJVEhVQl9URVNUX1RPS0VOLFxuICB9KTtcbn1cbiJdfQ==
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLGdGQUFnRjtBQUNoRiw2REFBNkQ7QUFDN0QsRUFBRTtBQUNGLDJEQUEyRDtBQUMzRCxzRUFBc0U7QUFDdEUsb0ZBQW9GO0FBQ3BGLGdGQUFnRjtBQUNoRixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQVEsQ0FBQztBQUN4RSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekIsK0VBQStFO0lBQy9FLGNBQWM7SUFDZCwrRUFBK0U7SUFDL0UsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUU5RSwrRUFBK0U7SUFDL0UsZ0NBQWdDO0lBQ2hDLCtFQUErRTtJQUMvRSw0REFBNEQ7SUFDNUQsc0VBQXNF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LENBQUMsU0FBUztRQUN4QixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVk7UUFDcEMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7S0FDL0MsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2VudHJhbGl6ZWQgRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHR5cGUtc2FmZSBhY2Nlc3MgdG8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggdmFsaWRhdGlvbi5cbiAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2hvdWxkIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhpcyBtb2R1bGUgcmF0aGVyIHRoYW5cbiAqIGRpcmVjdGx5IHZpYSBwcm9jZXNzLmVudiB0byBlbnN1cmUgdHlwZSBzYWZldHkgYW5kIHZhbGlkYXRpb24uXG4gKlxuICogVXNhZ2U6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBlbnYgfSBmcm9tICcuL2NvbmZpZy9lbnYnO1xuICogY29uc3QgdG9rZW4gPSBlbnYuR0lUSFVCX1RPS0VOOyAgLy8gVHlwZTogc3RyaW5nXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbi8vIExvYWQgLmVudiBmaWxlcyB3aXRoIHByaW9yaXR5OiAuZW52LmxvY2FsIChwZXJzb25hbCkgPiAuZW52IChzaGFyZWQgZGVmYXVsdHMpXG4vLyBCb3RoIGZpbGVzIGFyZSBvcHRpb25hbCAtIG5vIGVycm9yIGlmIGVpdGhlciBkb2Vzbid0IGV4aXN0XG4vL1xuLy8gTUNQIFByb3RvY29sIENvbXBsaWFuY2U6IFN1cHByZXNzIGRvdGVudidzIHN0ZG91dCBvdXRwdXRcbi8vIFRoZSBNQ1AgcHJvdG9jb2wgcmVxdWlyZXMgdGhhdCBPTkxZIEpTT04tUlBDIG1lc3NhZ2VzIGdvIHRvIHN0ZG91dC5cbi8vIGRvdGVudiBtYXkgb3V0cHV0IHZlcnNpb24gaW5mbyB0byBzdGRvdXQsIHdoaWNoIGJyZWFrcyBDbGF1ZGUgRGVza3RvcCBjb25uZWN0aW9uLlxuLy8gU29sdXRpb246IFRlbXBvcmFyaWx5IHJlZGlyZWN0IHN0ZG91dCB0byBzdGRlcnIgZHVyaW5nIGRvdGVudiBpbml0aWFsaXphdGlvbi5cbmNvbnN0IG9yaWdpbmFsU3Rkb3V0V3JpdGUgPSBwcm9jZXNzLnN0ZG91dC53cml0ZS5iaW5kKHByb2Nlc3Muc3Rkb3V0KTtcbnByb2Nlc3Muc3Rkb3V0LndyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycikgYXMgYW55O1xuZG90ZW52LmNvbmZpZyh7IHBhdGg6IFsnLmVudi5sb2NhbCcsICcuZW52J10gfSk7XG5wcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGU7XG5cbi8qKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGUgc2NoZW1hIHdpdGggdmFsaWRhdGlvblxuICovXG5jb25zdCBlbnZTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRW52aXJvbm1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBOT0RFX0VOVjogei5lbnVtKFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdwcm9kdWN0aW9uJ10pLmRlZmF1bHQoJ2RldmVsb3BtZW50JyksXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcm9kdWN0aW9uIEdpdEh1YiBDcmVkZW50aWFsc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVzZWQgYnkgcHJvZHVjdGlvbiBjb2RlIChzcmMvKSBmb3IgcmVhbCBHaXRIdWIgb3BlcmF0aW9uc1xuICAvLyBPcHRpb25hbDogRmVhdHVyZXMgcmVxdWlyaW5nIEdpdEh1YiB3aWxsIGZhaWwgZ3JhY2VmdWxseSBpZiBub3Qgc2V0XG4gIEdJVEhVQl9UT0tFTjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBHSVRIVUJfVVNFUk5BTUU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgR0lUSFVCX1JFUE9TSVRPUlk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRlc3QgR2l0SHViIENyZWRlbnRpYWxzIChTRVBBUkFURSBhY2NvdW50ISlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVc2VkIGJ5IHRlc3QgY29kZSAodGVzdHMvKSAtIHRlc3RzIHdpbGwgc2tpcCBpZiBub3QgcHJvdmlkZWRcbiAgLy8gSU1QT1JUQU5UOiBVc2UgYSBkaWZmZXJlbnQgR2l0SHViIGFjY291bnQgZm9yIHRlc3RpbmchXG4gIEdJVEhVQl9URVNUX1RPS0VOOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIEdJVEhVQl9URVNUX1VTRVJOQU1FOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIEdJVEhVQl9URVNUX1JFUE9TSVRPUlk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNlcnZlciBDb25maWd1cmF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUE9SVDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgzMDAwKSxcbiAgTE9HX0xFVkVMOiB6LmVudW0oWydlcnJvcicsICd3YXJuJywgJ2luZm8nLCAnZGVidWcnXSkuZGVmYXVsdCgnaW5mbycpLFxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVGVzdCBDb25maWd1cmF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgVEVTVF9CQVNFX0RJUjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBURVNUX1BFUlNPTkFTX0RJUjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBURVNUX0NBQ0hFX0RJUjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBURVNUX0NPTkZJR19ESVI6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZlYXR1cmUgRmxhZ3NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBET0xMSE9VU0VfQVVUT19TVUJNSVRfVE9fQ09MTEVDVElPTjogei5jb2VyY2UuYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICBFTkFCTEVfREVCVUc6IHouY29lcmNlLmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgVEVTVF9WRVJCT1NFX0xPR0dJTkc6IHouY29lcmNlLmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1DUCBJbnRlcmZhY2UgQ29uZmlndXJhdGlvbiAoSXNzdWUgIzIzNylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogTUNQIGludGVyZmFjZSBtb2RlIC0gY29udHJvbHMgd2hpY2ggdG9vbCBpbnRlcmZhY2UgaXMgZXhwb3NlZCB0byBMTE1zOlxuICAgKiAtICdkaXNjcmV0ZSc6IH40MCBpbmRpdmlkdWFsIHRvb2xzIChsaXN0X2VsZW1lbnRzLCBjcmVhdGVfZWxlbWVudCwgZXRjLikgLSB+MywwMDAgdG9rZW5zXG4gICAqIC0gJ21jcGFxbCc6IENvbnNvbGlkYXRlZCBNQ1AtQVFMIGludGVyZmFjZSAtIHVzZXMgTUNQX0FRTF9FTkRQT0lOVF9NT0RFIGZvciBzdHlsZVxuICAgKlxuICAgKiBEZWZhdWx0OiAnbWNwYXFsJyAtIHJlY29tbWVuZGVkIGZvciB0b2tlbiBlZmZpY2llbmN5IGFuZCBjbGVhbmVyIHRvb2wgZGlzY292ZXJ5XG4gICAqL1xuICBNQ1BfSU5URVJGQUNFX01PREU6IHouZW51bShbJ2Rpc2NyZXRlJywgJ21jcGFxbCddKS5kZWZhdWx0KCdtY3BhcWwnKSxcblxuICAvKipcbiAgICogTUNQLUFRTCBlbmRwb2ludCBtb2RlIChvbmx5IGFwcGxpZXMgd2hlbiBNQ1BfSU5URVJGQUNFX01PREU9J21jcGFxbCcpOlxuICAgKiAtICdjcnVkZSc6IDUgQ1JVREUgdG9vbHMgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUsIEV4ZWN1dGUpIC0gfjQsMzAwIHRva2Vuc1xuICAgKiAtICdzaW5nbGUnOiAxIHRvb2wgKG1jcF9hcWwpIC0gfjM1MCB0b2tlbnMsIGlkZWFsIGZvciBtdWx0aS1zZXJ2ZXIgZGVwbG95bWVudHNcbiAgICovXG4gIE1DUF9BUUxfRU5EUE9JTlRfTU9ERTogei5lbnVtKFsnY3J1ZGUnLCAnc2luZ2xlJ10pLmRlZmF1bHQoJ2NydWRlJyksXG5cbiAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbGlhcyBmb3IgTUNQX0FRTF9NT0RFIChkZXByZWNhdGVkLCB1c2UgTUNQX0FRTF9FTkRQT0lOVF9NT0RFKVxuICBNQ1BfQVFMX01PREU6IHouZW51bShbJ2NydWRlJywgJ3NpbmdsZSddKS5vcHRpb25hbCgpLFxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVW5pZmllZCBMb2dnaW5nIENvbmZpZ3VyYXRpb24gKGRvY3MvTE9HR0lORy1ERVNJR04ubWQpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgRE9MTEhPVVNFX0xPR19ESVI6IHouc3RyaW5nKCkuZGVmYXVsdCgnfi8uZG9sbGhvdXNlL2xvZ3MvJyksXG4gIERPTExIT1VTRV9MT0dfRk9STUFUOiB6LmVudW0oWyd0ZXh0JywgJ2pzb25sJ10pLmRlZmF1bHQoJ3RleHQnKSxcbiAgRE9MTEhPVVNFX0xPR19SRVRFTlRJT05fREFZUzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgzMCksXG4gIERPTExIT1VTRV9MT0dfU0VDVVJJVFlfUkVURU5USU9OX0RBWVM6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoNyksXG4gIERPTExIT1VTRV9MT0dfRkxVU0hfSU5URVJWQUxfTVM6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoNTAwMCksXG4gIC8vIEJ1ZmZlciByYWlzZWQgdG8gMjAwMCB0byBzdXBwb3J0IHRoZSB3ZWIgY29uc29sZSBsb2cgdmlld2VyIOKAlCB0aGUgaGlnaGVyIGNhcGFjaXR5XG4gIC8vIHJlZHVjZXMgZmx1c2ggZnJlcXVlbmN5IGFuZCBrZWVwcyBtb3JlIGVudHJpZXMgYXZhaWxhYmxlIGZvciBTU0UgYmFja2ZpbGwgb24gY29ubmVjdC5cbiAgRE9MTEhPVVNFX0xPR19CVUZGRVJfU0laRTogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgyMDAwKSxcbiAgRE9MTEhPVVNFX0xPR19NRU1PUllfQ0FQQUNJVFk6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoNTAwMCksXG4gIERPTExIT1VTRV9MT0dfTUVNT1JZX0FQUF9DQVBBQ0lUWTogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgxMDAwMCksXG4gIERPTExIT1VTRV9MT0dfTUVNT1JZX1NFQ1VSSVRZX0NBUEFDSVRZOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDUwMDApLFxuICBET0xMSE9VU0VfTE9HX01FTU9SWV9QRVJGX0NBUEFDSVRZOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDIwMDApLFxuICBET0xMSE9VU0VfTE9HX01FTU9SWV9URUxFTUVUUllfQ0FQQUNJVFk6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMTAwMCksXG4gIERPTExIT1VTRV9MT0dfTUFYX0VOVFJZX1NJWkU6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMTYzODQpLFxuICBET0xMSE9VU0VfTE9HX0lNTUVESUFURV9GTFVTSF9SQVRFOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDUwKSxcbiAgRE9MTEhPVVNFX0xPR19GSUxFX01BWF9TSVpFOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDEwNDg1NzYwMCksXG4gIERPTExIT1VTRV9MT0dfTUFYX0RJUl9TSVpFX0JZVEVTOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBET0xMSE9VU0VfTE9HX01BWF9GSUxFU19QRVJfQ0FURUdPUlk6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMTAwKSxcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFdlYiBDb25zb2xlIENvbmZpZ3VyYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogRW5hYmxlIHRoZSB1bmlmaWVkIHdlYiBjb25zb2xlIChsb2dzICsgbWV0cmljcyB0YWJzIG9uIHBvcnQgMzkzOSkgKi9cbiAgRE9MTEhPVVNFX1dFQl9DT05TT0xFOiB6LmNvZXJjZS5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNlY3VyaXR5IENvbmZpZ3VyYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogSXNzdWUgIzQ1MjogR2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQuXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIGFsbCBNQ1AtQVFMIG9wZXJhdGlvbnMgZ28gdGhyb3VnaCB0aGUgNC1sYXllciBHYXRla2VlcGVyXG4gICAqIGVuZm9yY2UoKSBwaXBlbGluZS4gV2hlbiBmYWxzZSwgZmFsbHMgYmFjayB0byByb3V0ZSB2YWxpZGF0aW9uIG9ubHkuXG4gICAqIFRoaXMgaXMgYSB1c2VyL29wZXJhdG9yIHNldHRpbmcg4oCUIHRoZSBMTE0gY2Fubm90IGJ5cGFzcyBpdC5cbiAgICovXG4gIERPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQ6IHouY29lcmNlLmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICAvKipcbiAgICogSXNzdWUgIzY3OTogRWxlbWVudCBwb2xpY3kgbGF5ZXIga2lsbCBzd2l0Y2guXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIGFjdGl2ZSBlbGVtZW50IGdhdGVrZWVwZXIgcG9saWNpZXMgKGFsbG93L2NvbmZpcm0vZGVueS9zY29wZVJlc3RyaWN0aW9ucylcbiAgICogY2FuIG92ZXJyaWRlIGRlZmF1bHQgb3BlcmF0aW9uIHBlcm1pc3Npb24gbGV2ZWxzLiBXaGVuIGZhbHNlLCBMYXllciAyIG9mIEdhdGVrZWVwZXIuZW5mb3JjZSgpXG4gICAqIGlzIGJ5cGFzc2VkIGVudGlyZWx5IOKAlCBvbmx5IHJvdXRlIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgcGVybWlzc2lvbiBsZXZlbHMgYXBwbHkuXG4gICAqIFVzZSBmb3IgZW1lcmdlbmN5IGxvY2tkb3duLCBoYXJkZW5lZCBkZXBsb3ltZW50cywgb3IgcG9saWN5IGRlYnVnZ2luZy5cbiAgICogVGhpcyBpcyBhbiBvcGVyYXRvci9pbmZyYXN0cnVjdHVyZSBzZXR0aW5nIOKAlCB0aGUgTExNIGNhbm5vdCBieXBhc3MgaXQuXG4gICAqL1xuICBET0xMSE9VU0VfR0FURUtFRVBFUl9FTEVNRU5UX1BPTElDWV9PVkVSUklERVM6IHouY29lcmNlLmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICAvKipcbiAgICogSXNzdWUgIzc5OTogUG9saWN5IGV4cG9ydCBvcHQtaW4gZmxhZy5cbiAgICogV2hlbiB0cnVlIChkZWZhdWx0KSwgUG9saWN5RXhwb3J0U2VydmljZSB3cml0ZXMgdGhlIHNlY3VyaXR5IHBvbGljeSBibHVlcHJpbnQgdG9cbiAgICogfi8uZG9sbGhvdXNlL2JyaWRnZS9pbXBvcnRzL3BvbGljaWVzLyBvbiBhY3RpdmF0aW9uIGNoYW5nZXMuIFRoZSBEb2xsaG91c2VCcmlkZ2VcbiAgICogcGVybWlzc2lvbi1wcm9tcHQgc2VydmVyIHdhdGNoZXMgdGhpcyBmaWxlIHRvIGV2YWx1YXRlIHBlcm1pc3Npb25zIGxvY2FsbHkuXG4gICAqIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHBvbGljeSBmaWxlIGV4cG9ydCBlbnRpcmVseS5cbiAgICovXG4gIERPTExIT1VTRV9QT0xJQ1lfRVhQT1JUX0VOQUJMRUQ6IHouY29lcmNlLmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3RvcmFnZSBMYXllciBDb25maWd1cmF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgRE9MTEhPVVNFX1NDQU5fQ09PTERPV05fTVM6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMTAwMCksXG4gIERPTExIT1VTRV9JTkRFWF9ERUJPVU5DRV9NUzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgyMDAwKSxcbiAgRE9MTEhPVVNFX0VMRU1FTlRfQ0FDSEVfVFRMX01TOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDM2MDAwMDApLFxuICBET0xMSE9VU0VfUEFUSF9DQUNIRV9UVExfTVM6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMzYwMDAwMCksXG4gIERPTExIT1VTRV9UT09MX0NBQ0hFX1RUTF9NUzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCg2MDAwMCksXG4gIERPTExIT1VTRV9HTE9CQUxfQ0FDSEVfTUVNT1JZX01COiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDE1MCksXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQZXJtaXNzaW9uIFByb21wdCBDb25maWd1cmF0aW9uIChJc3N1ZSAjNjI1KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIE1heGltdW0gQ0xJIGFwcHJvdmFsIHJlY29yZHMgYmVmb3JlIExSVSBldmljdGlvbiAoZGVmYXVsdDogNTApICovXG4gIERPTExIT1VTRV9DTElfQVBQUk9WQUxfTUFYOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDUwKSxcblxuICAvKiogRGVmYXVsdCBUVEwgZm9yIENMSSBhcHByb3ZhbCByZWNvcmRzIGluIG1zIChkZWZhdWx0OiAzMDAwMDAgPSA1IG1pbikgKi9cbiAgRE9MTEhPVVNFX0NMSV9BUFBST1ZBTF9UVExfTVM6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMzAwXzAwMCksXG5cbiAgLyoqIFBlcm1pc3Npb24gcHJvbXB0IHJhdGUgbGltaXQ6IG1heCByZXF1ZXN0cyBwZXIgd2luZG93IChkZWZhdWx0OiAxMDApICovXG4gIERPTExIT1VTRV9QRVJNSVNTSU9OX1BST01QVF9SQVRFX0xJTUlUOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDEwMCksXG5cbiAgLyoqIENMSSBhcHByb3ZhbCBjcmVhdGlvbiByYXRlIGxpbWl0OiBtYXggcmVxdWVzdHMgcGVyIHdpbmRvdyAoZGVmYXVsdDogMjApICovXG4gIERPTExIT1VTRV9DTElfQVBQUk9WQUxfUkFURV9MSU1JVDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgyMCksXG5cbiAgLyoqIFJhdGUgbGltaXQgd2luZG93IGluIG1zIGZvciBwZXJtaXNzaW9uIHByb21wdCBhbmQgQ0xJIGFwcHJvdmFscyAoZGVmYXVsdDogNjAwMDAgPSA2MHMpICovXG4gIERPTExIT1VTRV9QRVJNSVNTSU9OX1JBVEVfV0lORE9XX01TOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDYwXzAwMCksXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNZXRyaWNzIENvbGxlY3Rpb24gQ29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIERPTExIT1VTRV9NRVRSSUNTX0VOQUJMRUQ6IHouY29lcmNlLmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICBET0xMSE9VU0VfTUVUUklDU19DT0xMRUNUSU9OX0lOVEVSVkFMX01TOiB6LmNvZXJjZS5udW1iZXIoKS5taW4oMTAwMCkubWF4KDMwMDAwMCkuZGVmYXVsdCgxNTAwMCksXG4gIERPTExIT1VTRV9NRVRSSUNTX01BWF9TTkFQU0hPVF9TSVpFOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDEwMjQwMCksXG4gIERPTExIT1VTRV9NRVRSSUNTX0NPTExFQ1RPUl9GQUlMVVJFX1RIUkVTSE9MRDogei5jb2VyY2UubnVtYmVyKCkubWluKDEpLm1heCgxMDApLmRlZmF1bHQoMTApLFxuICBET0xMSE9VU0VfTUVUUklDU19DT0xMRUNUSU9OX0RVUkFUSU9OX1dBUk5fTVM6IHouY29lcmNlLm51bWJlcigpLm1pbigxMDApLm1heCg2MDAwMCkuZGVmYXVsdCg1MDAwKSxcbiAgRE9MTEhPVVNFX01FVFJJQ1NfTUVNT1JZX1NOQVBTSE9UX0NBUEFDSVRZOiB6LmNvZXJjZS5udW1iZXIoKS5taW4oMTApLm1heCgxMDAwMCkuZGVmYXVsdCgyNDApLFxuXG4gIC8vIFBhdHRlcm4gZW5jcnlwdGlvbiBzZXR0aW5ncyBmb3IgTWVtb3J5IFNlY3VyaXR5IChJc3N1ZSAjMTMyMSlcbiAgRE9MTEhPVVNFX0RJU0FCTEVfRU5DUllQVElPTjogei5jb2VyY2UuYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICBET0xMSE9VU0VfRU5DUllQVElPTl9TRUNSRVQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgRE9MTEhPVVNFX0VOQ1JZUFRJT05fU0FMVDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogVmFsaWRhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICogVHlwZSBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gdGhlIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgZW52ID0gZW52U2NoZW1hLnBhcnNlKHByb2Nlc3MuZW52KTtcblxuLyoqXG4gKiBFbnZpcm9ubWVudCB0eXBlIChpbmZlcnJlZCBmcm9tIHNjaGVtYSlcbiAqL1xuZXhwb3J0IHR5cGUgRW52ID0gei5pbmZlcjx0eXBlb2YgZW52U2NoZW1hPjtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBoZWxwZXJzIGZvciBlbnZpcm9ubWVudCBkZXRlY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVGVzdCA9IGVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnO1xuZXhwb3J0IGNvbnN0IGlzRGV2ZWxvcG1lbnQgPSBlbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG5leHBvcnQgY29uc3QgaXNQcm9kdWN0aW9uID0gZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG5cbi8qKlxuICogTG9nIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gKHdpdGhvdXQgc2VjcmV0cylcbiAqL1xuaWYgKGlzRGV2ZWxvcG1lbnQgfHwgaXNUZXN0KSB7XG4gIGxvZ2dlci5kZWJ1ZygnRW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBsb2FkZWQ6Jywge1xuICAgIE5PREVfRU5WOiBlbnYuTk9ERV9FTlYsXG4gICAgUE9SVDogZW52LlBPUlQsXG4gICAgTE9HX0xFVkVMOiBlbnYuTE9HX0xFVkVMLFxuICAgIEhBU19HSVRIVUJfVE9LRU46ICEhZW52LkdJVEhVQl9UT0tFTixcbiAgICBIQVNfR0lUSFVCX1RFU1RfVE9LRU46ICEhZW52LkdJVEhVQl9URVNUX1RPS0VOLFxuICB9KTtcbn1cbiJdfQ==
@@ -80,6 +80,19 @@ export declare class DollhouseContainer {
80
80
  * This shrinks the critical path by 1000-3700ms.
81
81
  */
82
82
  completeDeferredSetup(): Promise<void>;
83
+ private deferredMemoryAutoload;
84
+ private deferredActivationRestore;
85
+ private deferredPolicyExport;
86
+ private deferredLogHooks;
87
+ private deferredMetricsCollectors;
88
+ /** Try to resolve a service, returning undefined if not registered */
89
+ private tryResolve;
90
+ /** Wire SSE broadcast sinks for the web console */
91
+ private wireSSEBroadcasts;
92
+ private deferredWebConsole;
93
+ private deferredDangerZoneInit;
94
+ private deferredPatternEncryption;
95
+ private deferredBackgroundValidator;
83
96
  /**
84
97
  * Restore per-session activation state from the ActivationStore.
85
98
  * Called during preparePortfolio() after auto-load memories.
@@ -112,7 +125,15 @@ export declare class DollhouseContainer {
112
125
  * Issue #237 enhancement
113
126
  */
114
127
  private logToolTokenStats;
128
+ /**
129
+ * Wire all metric collectors into the MetricsManager.
130
+ * Mirrors wireLogHooks() — keeps collector registration out of the constructor.
131
+ */
132
+ private wireMetricsCollectors;
133
+ private collectLruCachesForMetrics;
115
134
  dispose(): Promise<void>;
135
+ private buildDisposalPromises;
136
+ private reportDisposalFailures;
116
137
  private initializeCollectionCache;
117
138
  }
118
139
  //# sourceMappingURL=Container.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../src/di/Container.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAkBnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAYrE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAsE3D,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,aAAa,EAAE,aAAa,CAAC;CAC9B;AAiBD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,WAAW,CAAuB;IAC1C,qEAAqE;IAC9D,qBAAqB,UAAS;;IAarC;;;;;;;;;;;OAWG;IACI,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAwB,GAAG,IAAI;IAgBhH;;;;;;;;;;;;;OAaG;IACI,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;IAgClC,OAAO,CAAC,gBAAgB;IAqdjB,cAAc,IAAI,MAAM,GAAG,IAAI;IAItC;;;;;;;OAOG;IACU,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgG9C;;;;;;OAMG;IACU,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkHnD;;;;;;;OAOG;YACW,kBAAkB;IAoHhC;;;;OAIG;IACU,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC;IAyLxD;;;OAGG;IACU,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAuDnE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;IA2EZ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAoDvB,yBAAyB;CAkBxC"}
1
+ {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../src/di/Container.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAkBnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAwB,MAAM,sCAAsC,CAAC;AAa3F,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAsF3D,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,aAAa,EAAE,aAAa,CAAC;CAC9B;AAiBD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,WAAW,CAAuB;IAC1C,qEAAqE;IAC9D,qBAAqB,UAAS;;IAarC;;;;;;;;;;;OAWG;IACI,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAwB,GAAG,IAAI;IAgBhH;;;;;;;;;;;;;OAaG;IACI,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;IAgClC,OAAO,CAAC,gBAAgB;IA6djB,cAAc,IAAI,MAAM,GAAG,IAAI;IAItC;;;;;;;OAOG;IACU,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgG9C;;;;;;OAMG;IACU,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;YA8BrC,sBAAsB;YA8BtB,yBAAyB;YAezB,oBAAoB;YASpB,gBAAgB;YAYhB,yBAAyB;IAavC,sEAAsE;IACtE,OAAO,CAAC,UAAU;IAIlB,mDAAmD;IACnD,OAAO,CAAC,iBAAiB;YAgBX,kBAAkB;YA+BlB,sBAAsB;YAWtB,yBAAyB;YAYzB,2BAA2B;IAYzC;;;;;;;OAOG;YACW,kBAAkB;IAoHhC;;;;OAIG;IACU,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC;IAqMxD;;;OAGG;IACU,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAuDnE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;IA2EzB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAkE7B,OAAO,CAAC,0BAA0B;IAqBrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrC,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,sBAAsB;YAkBhB,yBAAyB;CAkBxC"}