@dollhousemcp/mcp-server 1.4.4 → 1.5.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 (667) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +68 -7
  3. package/dist/auth/GitHubAuthManager.d.ts +93 -0
  4. package/dist/auth/GitHubAuthManager.d.ts.map +1 -0
  5. package/dist/auth/GitHubAuthManager.js +465 -0
  6. package/dist/generated/version.d.ts +2 -2
  7. package/dist/generated/version.js +3 -3
  8. package/dist/index.d.ts +23 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +244 -5
  11. package/dist/security/tokenManager.d.ts +34 -0
  12. package/dist/security/tokenManager.d.ts.map +1 -1
  13. package/dist/security/tokenManager.js +199 -1
  14. package/dist/server/ServerSetup.d.ts.map +1 -1
  15. package/dist/server/ServerSetup.js +4 -1
  16. package/dist/server/tools/AuthTools.d.ts +10 -0
  17. package/dist/server/tools/AuthTools.d.ts.map +1 -0
  18. package/dist/server/tools/AuthTools.js +41 -0
  19. package/dist/server/types.d.ts +3 -0
  20. package/dist/server/types.d.ts.map +1 -1
  21. package/dist/server/types.js +1 -1
  22. package/package.json +1 -1
  23. package/dist/collection/MarketplaceBrowser.d.ts +0 -24
  24. package/dist/collection/MarketplaceBrowser.d.ts.map +0 -1
  25. package/dist/collection/MarketplaceBrowser.js +0 -115
  26. package/dist/collection/MarketplaceSearch.d.ts +0 -18
  27. package/dist/collection/MarketplaceSearch.d.ts.map +0 -1
  28. package/dist/collection/MarketplaceSearch.js +0 -48
  29. package/dist/collection/PersonaInstaller.d.ts +0 -26
  30. package/dist/collection/PersonaInstaller.d.ts.map +0 -1
  31. package/dist/collection/PersonaInstaller.js +0 -103
  32. package/dist/elements/ensembles/Ensemble.d.ts +0 -144
  33. package/dist/elements/ensembles/Ensemble.d.ts.map +0 -1
  34. package/dist/elements/ensembles/Ensemble.js +0 -860
  35. package/dist/elements/ensembles/EnsembleManager.d.ts +0 -85
  36. package/dist/elements/ensembles/EnsembleManager.d.ts.map +0 -1
  37. package/dist/elements/ensembles/EnsembleManager.js +0 -378
  38. package/dist/elements/ensembles/constants.d.ts +0 -73
  39. package/dist/elements/ensembles/constants.d.ts.map +0 -1
  40. package/dist/elements/ensembles/constants.js +0 -92
  41. package/dist/elements/ensembles/index.d.ts +0 -8
  42. package/dist/elements/ensembles/index.d.ts.map +0 -1
  43. package/dist/elements/ensembles/index.js +0 -8
  44. package/dist/elements/ensembles/types.d.ts +0 -92
  45. package/dist/elements/ensembles/types.d.ts.map +0 -1
  46. package/dist/elements/ensembles/types.js +0 -8
  47. package/dist/elements/memories/Memory.d.ts +0 -110
  48. package/dist/elements/memories/Memory.d.ts.map +0 -1
  49. package/dist/elements/memories/Memory.js +0 -470
  50. package/dist/elements/memories/MemoryManager.d.ts +0 -86
  51. package/dist/elements/memories/MemoryManager.d.ts.map +0 -1
  52. package/dist/elements/memories/MemoryManager.js +0 -435
  53. package/dist/elements/memories/constants.d.ts +0 -42
  54. package/dist/elements/memories/constants.d.ts.map +0 -1
  55. package/dist/elements/memories/constants.js +0 -49
  56. package/dist/elements/memories/index.d.ts +0 -6
  57. package/dist/elements/memories/index.d.ts.map +0 -1
  58. package/dist/elements/memories/index.js +0 -6
  59. package/dist/marketplace/GitHubClient.d.ts +0 -22
  60. package/dist/marketplace/GitHubClient.d.ts.map +0 -1
  61. package/dist/marketplace/GitHubClient.js +0 -112
  62. package/dist/marketplace/MarketplaceBrowser.d.ts +0 -24
  63. package/dist/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  64. package/dist/marketplace/MarketplaceBrowser.js +0 -115
  65. package/dist/marketplace/MarketplaceSearch.d.ts +0 -18
  66. package/dist/marketplace/MarketplaceSearch.d.ts.map +0 -1
  67. package/dist/marketplace/MarketplaceSearch.js +0 -48
  68. package/dist/marketplace/PersonaDetails.d.ts +0 -22
  69. package/dist/marketplace/PersonaDetails.d.ts.map +0 -1
  70. package/dist/marketplace/PersonaDetails.js +0 -71
  71. package/dist/marketplace/PersonaInstaller.d.ts +0 -25
  72. package/dist/marketplace/PersonaInstaller.d.ts.map +0 -1
  73. package/dist/marketplace/PersonaInstaller.js +0 -100
  74. package/dist/marketplace/PersonaSubmitter.d.ts +0 -19
  75. package/dist/marketplace/PersonaSubmitter.d.ts.map +0 -1
  76. package/dist/marketplace/PersonaSubmitter.js +0 -57
  77. package/dist/marketplace/index.d.ts +0 -10
  78. package/dist/marketplace/index.d.ts.map +0 -1
  79. package/dist/marketplace/index.js +0 -10
  80. package/dist/server/tools/MarketplaceTools.d.ts +0 -10
  81. package/dist/server/tools/MarketplaceTools.d.ts.map +0 -1
  82. package/dist/server/tools/MarketplaceTools.js +0 -96
  83. package/dist/src/cache/APICache.d.ts +0 -23
  84. package/dist/src/cache/APICache.d.ts.map +0 -1
  85. package/dist/src/cache/APICache.js +0 -42
  86. package/dist/src/cache/index.d.ts +0 -5
  87. package/dist/src/cache/index.d.ts.map +0 -1
  88. package/dist/src/cache/index.js +0 -5
  89. package/dist/src/config/constants.d.ts +0 -25
  90. package/dist/src/config/constants.d.ts.map +0 -1
  91. package/dist/src/config/constants.js +0 -30
  92. package/dist/src/config/index.d.ts +0 -6
  93. package/dist/src/config/index.d.ts.map +0 -1
  94. package/dist/src/config/index.js +0 -6
  95. package/dist/src/config/indicator-config.d.ts +0 -107
  96. package/dist/src/config/indicator-config.d.ts.map +0 -1
  97. package/dist/src/config/indicator-config.js +0 -158
  98. package/dist/src/constants/defaultPersonas.d.ts +0 -10
  99. package/dist/src/constants/defaultPersonas.d.ts.map +0 -1
  100. package/dist/src/constants/defaultPersonas.js +0 -18
  101. package/dist/src/constants/limits.d.ts +0 -10
  102. package/dist/src/constants/limits.d.ts.map +0 -1
  103. package/dist/src/constants/limits.js +0 -13
  104. package/dist/src/errors/SecurityError.d.ts +0 -29
  105. package/dist/src/errors/SecurityError.d.ts.map +0 -1
  106. package/dist/src/errors/SecurityError.js +0 -47
  107. package/dist/src/errors/index.d.ts +0 -2
  108. package/dist/src/errors/index.d.ts.map +0 -1
  109. package/dist/src/errors/index.js +0 -2
  110. package/dist/src/index.barrel.d.ts +0 -21
  111. package/dist/src/index.barrel.d.ts.map +0 -1
  112. package/dist/src/index.barrel.js +0 -31
  113. package/dist/src/index.d.ts +0 -220
  114. package/dist/src/index.d.ts.map +0 -1
  115. package/dist/src/index.js +0 -1559
  116. package/dist/src/marketplace/GitHubClient.d.ts +0 -22
  117. package/dist/src/marketplace/GitHubClient.d.ts.map +0 -1
  118. package/dist/src/marketplace/GitHubClient.js +0 -112
  119. package/dist/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  120. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  121. package/dist/src/marketplace/MarketplaceBrowser.js +0 -45
  122. package/dist/src/marketplace/MarketplaceSearch.d.ts +0 -18
  123. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  124. package/dist/src/marketplace/MarketplaceSearch.js +0 -36
  125. package/dist/src/marketplace/PersonaDetails.d.ts +0 -22
  126. package/dist/src/marketplace/PersonaDetails.d.ts.map +0 -1
  127. package/dist/src/marketplace/PersonaDetails.js +0 -71
  128. package/dist/src/marketplace/PersonaInstaller.d.ts +0 -25
  129. package/dist/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  130. package/dist/src/marketplace/PersonaInstaller.js +0 -100
  131. package/dist/src/marketplace/PersonaSubmitter.d.ts +0 -19
  132. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  133. package/dist/src/marketplace/PersonaSubmitter.js +0 -57
  134. package/dist/src/marketplace/index.d.ts +0 -10
  135. package/dist/src/marketplace/index.d.ts.map +0 -1
  136. package/dist/src/marketplace/index.js +0 -10
  137. package/dist/src/persona/PersonaLoader.d.ts +0 -33
  138. package/dist/src/persona/PersonaLoader.d.ts.map +0 -1
  139. package/dist/src/persona/PersonaLoader.js +0 -139
  140. package/dist/src/persona/PersonaManager.d.ts +0 -112
  141. package/dist/src/persona/PersonaManager.d.ts.map +0 -1
  142. package/dist/src/persona/PersonaManager.js +0 -341
  143. package/dist/src/persona/PersonaValidator.d.ts +0 -33
  144. package/dist/src/persona/PersonaValidator.d.ts.map +0 -1
  145. package/dist/src/persona/PersonaValidator.js +0 -157
  146. package/dist/src/persona/export-import/PersonaExporter.d.ts +0 -43
  147. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  148. package/dist/src/persona/export-import/PersonaExporter.js +0 -99
  149. package/dist/src/persona/export-import/PersonaImporter.d.ts +0 -65
  150. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  151. package/dist/src/persona/export-import/PersonaImporter.js +0 -313
  152. package/dist/src/persona/export-import/PersonaSharer.d.ts +0 -60
  153. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  154. package/dist/src/persona/export-import/PersonaSharer.js +0 -363
  155. package/dist/src/persona/export-import/index.d.ts +0 -10
  156. package/dist/src/persona/export-import/index.d.ts.map +0 -1
  157. package/dist/src/persona/export-import/index.js +0 -7
  158. package/dist/src/persona/index.d.ts +0 -7
  159. package/dist/src/persona/index.d.ts.map +0 -1
  160. package/dist/src/persona/index.js +0 -7
  161. package/dist/src/security/InputValidator.d.ts +0 -69
  162. package/dist/src/security/InputValidator.d.ts.map +0 -1
  163. package/dist/src/security/InputValidator.js +0 -381
  164. package/dist/src/security/commandValidator.d.ts +0 -7
  165. package/dist/src/security/commandValidator.d.ts.map +0 -1
  166. package/dist/src/security/commandValidator.js +0 -77
  167. package/dist/src/security/constants.d.ts +0 -21
  168. package/dist/src/security/constants.d.ts.map +0 -1
  169. package/dist/src/security/constants.js +0 -23
  170. package/dist/src/security/contentValidator.d.ts +0 -47
  171. package/dist/src/security/contentValidator.d.ts.map +0 -1
  172. package/dist/src/security/contentValidator.js +0 -188
  173. package/dist/src/security/fileLockManager.d.ts +0 -70
  174. package/dist/src/security/fileLockManager.d.ts.map +0 -1
  175. package/dist/src/security/fileLockManager.js +0 -187
  176. package/dist/src/security/index.d.ts +0 -12
  177. package/dist/src/security/index.d.ts.map +0 -1
  178. package/dist/src/security/index.js +0 -14
  179. package/dist/src/security/pathValidator.d.ts +0 -9
  180. package/dist/src/security/pathValidator.d.ts.map +0 -1
  181. package/dist/src/security/pathValidator.js +0 -97
  182. package/dist/src/security/secureYamlParser.d.ts +0 -46
  183. package/dist/src/security/secureYamlParser.d.ts.map +0 -1
  184. package/dist/src/security/secureYamlParser.js +0 -203
  185. package/dist/src/security/securityMonitor.d.ts +0 -58
  186. package/dist/src/security/securityMonitor.d.ts.map +0 -1
  187. package/dist/src/security/securityMonitor.js +0 -108
  188. package/dist/src/security/tokenManager.d.ts +0 -59
  189. package/dist/src/security/tokenManager.d.ts.map +0 -1
  190. package/dist/src/security/tokenManager.js +0 -216
  191. package/dist/src/security/yamlValidator.d.ts +0 -20
  192. package/dist/src/security/yamlValidator.d.ts.map +0 -1
  193. package/dist/src/security/yamlValidator.js +0 -138
  194. package/dist/src/server/ServerSetup.d.ts +0 -31
  195. package/dist/src/server/ServerSetup.d.ts.map +0 -1
  196. package/dist/src/server/ServerSetup.js +0 -79
  197. package/dist/src/server/index.d.ts +0 -7
  198. package/dist/src/server/index.d.ts.map +0 -1
  199. package/dist/src/server/index.js +0 -7
  200. package/dist/src/server/tools/ConfigTools.d.ts +0 -10
  201. package/dist/src/server/tools/ConfigTools.d.ts.map +0 -1
  202. package/dist/src/server/tools/ConfigTools.js +0 -63
  203. package/dist/src/server/tools/MarketplaceTools.d.ts +0 -10
  204. package/dist/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  205. package/dist/src/server/tools/MarketplaceTools.js +0 -92
  206. package/dist/src/server/tools/PersonaTools.d.ts +0 -10
  207. package/dist/src/server/tools/PersonaTools.d.ts.map +0 -1
  208. package/dist/src/server/tools/PersonaTools.js +0 -257
  209. package/dist/src/server/tools/ToolRegistry.d.ts +0 -37
  210. package/dist/src/server/tools/ToolRegistry.d.ts.map +0 -1
  211. package/dist/src/server/tools/ToolRegistry.js +0 -40
  212. package/dist/src/server/tools/UpdateTools.d.ts +0 -10
  213. package/dist/src/server/tools/UpdateTools.d.ts.map +0 -1
  214. package/dist/src/server/tools/UpdateTools.js +0 -64
  215. package/dist/src/server/tools/UserTools.d.ts +0 -10
  216. package/dist/src/server/tools/UserTools.d.ts.map +0 -1
  217. package/dist/src/server/tools/UserTools.js +0 -51
  218. package/dist/src/server/tools/index.d.ts +0 -10
  219. package/dist/src/server/tools/index.d.ts.map +0 -1
  220. package/dist/src/server/tools/index.js +0 -10
  221. package/dist/src/server/types.d.ts +0 -34
  222. package/dist/src/server/types.d.ts.map +0 -1
  223. package/dist/src/server/types.js +0 -5
  224. package/dist/src/tools/debug.d.ts +0 -20
  225. package/dist/src/tools/debug.d.ts.map +0 -1
  226. package/dist/src/tools/debug.js +0 -37
  227. package/dist/src/types/cache.d.ts +0 -8
  228. package/dist/src/types/cache.d.ts.map +0 -1
  229. package/dist/src/types/cache.js +0 -5
  230. package/dist/src/types/index.d.ts +0 -8
  231. package/dist/src/types/index.d.ts.map +0 -1
  232. package/dist/src/types/index.js +0 -8
  233. package/dist/src/types/marketplace.d.ts +0 -23
  234. package/dist/src/types/marketplace.d.ts.map +0 -1
  235. package/dist/src/types/marketplace.js +0 -5
  236. package/dist/src/types/mcp.d.ts +0 -161
  237. package/dist/src/types/mcp.d.ts.map +0 -1
  238. package/dist/src/types/mcp.js +0 -75
  239. package/dist/src/types/persona.d.ts +0 -30
  240. package/dist/src/types/persona.d.ts.map +0 -1
  241. package/dist/src/types/persona.js +0 -5
  242. package/dist/src/update/BackupManager.d.ts +0 -46
  243. package/dist/src/update/BackupManager.d.ts.map +0 -1
  244. package/dist/src/update/BackupManager.js +0 -261
  245. package/dist/src/update/DependencyChecker.d.ts +0 -41
  246. package/dist/src/update/DependencyChecker.d.ts.map +0 -1
  247. package/dist/src/update/DependencyChecker.js +0 -132
  248. package/dist/src/update/RateLimiter.d.ts +0 -80
  249. package/dist/src/update/RateLimiter.d.ts.map +0 -1
  250. package/dist/src/update/RateLimiter.js +0 -172
  251. package/dist/src/update/SignatureVerifier.d.ts +0 -71
  252. package/dist/src/update/SignatureVerifier.d.ts.map +0 -1
  253. package/dist/src/update/SignatureVerifier.js +0 -214
  254. package/dist/src/update/UpdateChecker.d.ts +0 -127
  255. package/dist/src/update/UpdateChecker.d.ts.map +0 -1
  256. package/dist/src/update/UpdateChecker.js +0 -460
  257. package/dist/src/update/UpdateManager.d.ts +0 -41
  258. package/dist/src/update/UpdateManager.d.ts.map +0 -1
  259. package/dist/src/update/UpdateManager.js +0 -260
  260. package/dist/src/update/VersionManager.d.ts +0 -31
  261. package/dist/src/update/VersionManager.d.ts.map +0 -1
  262. package/dist/src/update/VersionManager.js +0 -134
  263. package/dist/src/update/index.d.ts +0 -9
  264. package/dist/src/update/index.d.ts.map +0 -1
  265. package/dist/src/update/index.js +0 -9
  266. package/dist/src/utils/filesystem.d.ts +0 -32
  267. package/dist/src/utils/filesystem.d.ts.map +0 -1
  268. package/dist/src/utils/filesystem.js +0 -73
  269. package/dist/src/utils/git.d.ts +0 -32
  270. package/dist/src/utils/git.d.ts.map +0 -1
  271. package/dist/src/utils/git.js +0 -65
  272. package/dist/src/utils/index.d.ts +0 -7
  273. package/dist/src/utils/index.d.ts.map +0 -1
  274. package/dist/src/utils/index.js +0 -7
  275. package/dist/src/utils/logger.d.ts +0 -45
  276. package/dist/src/utils/logger.d.ts.map +0 -1
  277. package/dist/src/utils/logger.js +0 -91
  278. package/dist/src/utils/version.d.ts +0 -25
  279. package/dist/src/utils/version.d.ts.map +0 -1
  280. package/dist/src/utils/version.js +0 -97
  281. package/dist/test/src/cache/APICache.d.ts +0 -23
  282. package/dist/test/src/cache/APICache.d.ts.map +0 -1
  283. package/dist/test/src/cache/APICache.js +0 -42
  284. package/dist/test/src/cache/index.d.ts +0 -5
  285. package/dist/test/src/cache/index.d.ts.map +0 -1
  286. package/dist/test/src/cache/index.js +0 -5
  287. package/dist/test/src/collection/CollectionBrowser.d.ts +0 -24
  288. package/dist/test/src/collection/CollectionBrowser.d.ts.map +0 -1
  289. package/dist/test/src/collection/CollectionBrowser.js +0 -115
  290. package/dist/test/src/collection/CollectionSearch.d.ts +0 -18
  291. package/dist/test/src/collection/CollectionSearch.d.ts.map +0 -1
  292. package/dist/test/src/collection/CollectionSearch.js +0 -48
  293. package/dist/test/src/collection/GitHubClient.d.ts +0 -22
  294. package/dist/test/src/collection/GitHubClient.d.ts.map +0 -1
  295. package/dist/test/src/collection/GitHubClient.js +0 -114
  296. package/dist/test/src/collection/PersonaDetails.d.ts +0 -22
  297. package/dist/test/src/collection/PersonaDetails.d.ts.map +0 -1
  298. package/dist/test/src/collection/PersonaDetails.js +0 -71
  299. package/dist/test/src/collection/PersonaInstaller.d.ts +0 -26
  300. package/dist/test/src/collection/PersonaInstaller.d.ts.map +0 -1
  301. package/dist/test/src/collection/PersonaInstaller.js +0 -103
  302. package/dist/test/src/collection/PersonaSubmitter.d.ts +0 -19
  303. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +0 -1
  304. package/dist/test/src/collection/PersonaSubmitter.js +0 -57
  305. package/dist/test/src/collection/index.d.ts +0 -10
  306. package/dist/test/src/collection/index.d.ts.map +0 -1
  307. package/dist/test/src/collection/index.js +0 -10
  308. package/dist/test/src/config/constants.d.ts +0 -25
  309. package/dist/test/src/config/constants.d.ts.map +0 -1
  310. package/dist/test/src/config/constants.js +0 -30
  311. package/dist/test/src/config/index.d.ts +0 -6
  312. package/dist/test/src/config/index.d.ts.map +0 -1
  313. package/dist/test/src/config/index.js +0 -6
  314. package/dist/test/src/config/indicator-config.d.ts +0 -107
  315. package/dist/test/src/config/indicator-config.d.ts.map +0 -1
  316. package/dist/test/src/config/indicator-config.js +0 -158
  317. package/dist/test/src/constants/defaultPersonas.d.ts +0 -10
  318. package/dist/test/src/constants/defaultPersonas.d.ts.map +0 -1
  319. package/dist/test/src/constants/defaultPersonas.js +0 -18
  320. package/dist/test/src/constants/limits.d.ts +0 -10
  321. package/dist/test/src/constants/limits.d.ts.map +0 -1
  322. package/dist/test/src/constants/limits.js +0 -13
  323. package/dist/test/src/elements/BaseElement.d.ts +0 -81
  324. package/dist/test/src/elements/BaseElement.d.ts.map +0 -1
  325. package/dist/test/src/elements/BaseElement.js +0 -381
  326. package/dist/test/src/elements/FeedbackProcessor.d.ts +0 -57
  327. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +0 -1
  328. package/dist/test/src/elements/FeedbackProcessor.js +0 -418
  329. package/dist/test/src/elements/agents/Agent.d.ts +0 -145
  330. package/dist/test/src/elements/agents/Agent.d.ts.map +0 -1
  331. package/dist/test/src/elements/agents/Agent.js +0 -848
  332. package/dist/test/src/elements/agents/AgentManager.d.ts +0 -125
  333. package/dist/test/src/elements/agents/AgentManager.d.ts.map +0 -1
  334. package/dist/test/src/elements/agents/AgentManager.js +0 -608
  335. package/dist/test/src/elements/agents/constants.d.ts +0 -42
  336. package/dist/test/src/elements/agents/constants.d.ts.map +0 -1
  337. package/dist/test/src/elements/agents/constants.js +0 -45
  338. package/dist/test/src/elements/agents/goalTemplates.d.ts +0 -44
  339. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +0 -1
  340. package/dist/test/src/elements/agents/goalTemplates.js +0 -297
  341. package/dist/test/src/elements/agents/index.d.ts +0 -8
  342. package/dist/test/src/elements/agents/index.d.ts.map +0 -1
  343. package/dist/test/src/elements/agents/index.js +0 -8
  344. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +0 -76
  345. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +0 -1
  346. package/dist/test/src/elements/agents/ruleEngineConfig.js +0 -143
  347. package/dist/test/src/elements/agents/types.d.ts +0 -97
  348. package/dist/test/src/elements/agents/types.d.ts.map +0 -1
  349. package/dist/test/src/elements/agents/types.js +0 -5
  350. package/dist/test/src/elements/index.d.ts +0 -6
  351. package/dist/test/src/elements/index.d.ts.map +0 -1
  352. package/dist/test/src/elements/index.js +0 -6
  353. package/dist/test/src/elements/memories/Memory.d.ts +0 -110
  354. package/dist/test/src/elements/memories/Memory.d.ts.map +0 -1
  355. package/dist/test/src/elements/memories/Memory.js +0 -470
  356. package/dist/test/src/elements/memories/MemoryManager.d.ts +0 -86
  357. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +0 -1
  358. package/dist/test/src/elements/memories/MemoryManager.js +0 -435
  359. package/dist/test/src/elements/memories/constants.d.ts +0 -42
  360. package/dist/test/src/elements/memories/constants.d.ts.map +0 -1
  361. package/dist/test/src/elements/memories/constants.js +0 -49
  362. package/dist/test/src/elements/memories/index.d.ts +0 -6
  363. package/dist/test/src/elements/memories/index.d.ts.map +0 -1
  364. package/dist/test/src/elements/memories/index.js +0 -6
  365. package/dist/test/src/elements/skills/Skill.d.ts +0 -109
  366. package/dist/test/src/elements/skills/Skill.d.ts.map +0 -1
  367. package/dist/test/src/elements/skills/Skill.js +0 -381
  368. package/dist/test/src/elements/templates/Template.d.ts +0 -138
  369. package/dist/test/src/elements/templates/Template.d.ts.map +0 -1
  370. package/dist/test/src/elements/templates/Template.js +0 -673
  371. package/dist/test/src/elements/templates/TemplateManager.d.ts +0 -104
  372. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +0 -1
  373. package/dist/test/src/elements/templates/TemplateManager.js +0 -496
  374. package/dist/test/src/elements/templates/index.d.ts +0 -6
  375. package/dist/test/src/elements/templates/index.d.ts.map +0 -1
  376. package/dist/test/src/elements/templates/index.js +0 -6
  377. package/dist/test/src/errors/SecurityError.d.ts +0 -29
  378. package/dist/test/src/errors/SecurityError.d.ts.map +0 -1
  379. package/dist/test/src/errors/SecurityError.js +0 -47
  380. package/dist/test/src/errors/index.d.ts +0 -2
  381. package/dist/test/src/errors/index.d.ts.map +0 -1
  382. package/dist/test/src/errors/index.js +0 -2
  383. package/dist/test/src/index.barrel.d.ts +0 -21
  384. package/dist/test/src/index.barrel.d.ts.map +0 -1
  385. package/dist/test/src/index.barrel.js +0 -31
  386. package/dist/test/src/index.d.ts +0 -223
  387. package/dist/test/src/index.d.ts.map +0 -1
  388. package/dist/test/src/index.js +0 -1594
  389. package/dist/test/src/marketplace/GitHubClient.d.ts +0 -22
  390. package/dist/test/src/marketplace/GitHubClient.d.ts.map +0 -1
  391. package/dist/test/src/marketplace/GitHubClient.js +0 -112
  392. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  393. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  394. package/dist/test/src/marketplace/MarketplaceBrowser.js +0 -45
  395. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +0 -18
  396. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  397. package/dist/test/src/marketplace/MarketplaceSearch.js +0 -36
  398. package/dist/test/src/marketplace/PersonaDetails.d.ts +0 -22
  399. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +0 -1
  400. package/dist/test/src/marketplace/PersonaDetails.js +0 -71
  401. package/dist/test/src/marketplace/PersonaInstaller.d.ts +0 -25
  402. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  403. package/dist/test/src/marketplace/PersonaInstaller.js +0 -100
  404. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +0 -19
  405. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  406. package/dist/test/src/marketplace/PersonaSubmitter.js +0 -57
  407. package/dist/test/src/marketplace/index.d.ts +0 -10
  408. package/dist/test/src/marketplace/index.d.ts.map +0 -1
  409. package/dist/test/src/marketplace/index.js +0 -10
  410. package/dist/test/src/persona/PersonaElement.d.ts +0 -64
  411. package/dist/test/src/persona/PersonaElement.d.ts.map +0 -1
  412. package/dist/test/src/persona/PersonaElement.js +0 -223
  413. package/dist/test/src/persona/PersonaElementManager.d.ts +0 -97
  414. package/dist/test/src/persona/PersonaElementManager.d.ts.map +0 -1
  415. package/dist/test/src/persona/PersonaElementManager.js +0 -342
  416. package/dist/test/src/persona/PersonaLoader.d.ts +0 -34
  417. package/dist/test/src/persona/PersonaLoader.d.ts.map +0 -1
  418. package/dist/test/src/persona/PersonaLoader.js +0 -145
  419. package/dist/test/src/persona/PersonaManager.d.ts +0 -112
  420. package/dist/test/src/persona/PersonaManager.d.ts.map +0 -1
  421. package/dist/test/src/persona/PersonaManager.js +0 -341
  422. package/dist/test/src/persona/PersonaValidator.d.ts +0 -33
  423. package/dist/test/src/persona/PersonaValidator.d.ts.map +0 -1
  424. package/dist/test/src/persona/PersonaValidator.js +0 -157
  425. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +0 -43
  426. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  427. package/dist/test/src/persona/export-import/PersonaExporter.js +0 -99
  428. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +0 -65
  429. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  430. package/dist/test/src/persona/export-import/PersonaImporter.js +0 -315
  431. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +0 -60
  432. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  433. package/dist/test/src/persona/export-import/PersonaSharer.js +0 -502
  434. package/dist/test/src/persona/export-import/index.d.ts +0 -10
  435. package/dist/test/src/persona/export-import/index.d.ts.map +0 -1
  436. package/dist/test/src/persona/export-import/index.js +0 -7
  437. package/dist/test/src/persona/index.d.ts +0 -7
  438. package/dist/test/src/persona/index.d.ts.map +0 -1
  439. package/dist/test/src/persona/index.js +0 -7
  440. package/dist/test/src/portfolio/MigrationManager.d.ts +0 -44
  441. package/dist/test/src/portfolio/MigrationManager.d.ts.map +0 -1
  442. package/dist/test/src/portfolio/MigrationManager.js +0 -163
  443. package/dist/test/src/portfolio/PortfolioManager.d.ts +0 -54
  444. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +0 -1
  445. package/dist/test/src/portfolio/PortfolioManager.js +0 -224
  446. package/dist/test/src/portfolio/types.d.ts +0 -18
  447. package/dist/test/src/portfolio/types.d.ts.map +0 -1
  448. package/dist/test/src/portfolio/types.js +0 -13
  449. package/dist/test/src/security/InputValidator.d.ts +0 -80
  450. package/dist/test/src/security/InputValidator.d.ts.map +0 -1
  451. package/dist/test/src/security/InputValidator.js +0 -436
  452. package/dist/test/src/security/audit/SecurityAuditor.d.ts +0 -44
  453. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +0 -1
  454. package/dist/test/src/security/audit/SecurityAuditor.js +0 -274
  455. package/dist/test/src/security/audit/config/suppressions.d.ts +0 -34
  456. package/dist/test/src/security/audit/config/suppressions.d.ts.map +0 -1
  457. package/dist/test/src/security/audit/config/suppressions.js +0 -575
  458. package/dist/test/src/security/audit/index.d.ts +0 -14
  459. package/dist/test/src/security/audit/index.d.ts.map +0 -1
  460. package/dist/test/src/security/audit/index.js +0 -15
  461. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +0 -46
  462. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +0 -1
  463. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +0 -174
  464. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +0 -13
  465. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +0 -1
  466. package/dist/test/src/security/audit/reporters/JsonReporter.js +0 -25
  467. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +0 -13
  468. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +0 -1
  469. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +0 -79
  470. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +0 -20
  471. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +0 -1
  472. package/dist/test/src/security/audit/rules/SecurityRules.js +0 -244
  473. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +0 -47
  474. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +0 -1
  475. package/dist/test/src/security/audit/scanners/CodeScanner.js +0 -174
  476. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +0 -13
  477. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +0 -1
  478. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +0 -22
  479. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +0 -13
  480. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +0 -1
  481. package/dist/test/src/security/audit/scanners/DependencyScanner.js +0 -22
  482. package/dist/test/src/security/audit/types.d.ts +0 -94
  483. package/dist/test/src/security/audit/types.d.ts.map +0 -1
  484. package/dist/test/src/security/audit/types.js +0 -6
  485. package/dist/test/src/security/commandValidator.d.ts +0 -7
  486. package/dist/test/src/security/commandValidator.d.ts.map +0 -1
  487. package/dist/test/src/security/commandValidator.js +0 -78
  488. package/dist/test/src/security/constants.d.ts +0 -24
  489. package/dist/test/src/security/constants.d.ts.map +0 -1
  490. package/dist/test/src/security/constants.js +0 -26
  491. package/dist/test/src/security/contentValidator.d.ts +0 -47
  492. package/dist/test/src/security/contentValidator.d.ts.map +0 -1
  493. package/dist/test/src/security/contentValidator.js +0 -301
  494. package/dist/test/src/security/errors.d.ts +0 -14
  495. package/dist/test/src/security/errors.d.ts.map +0 -1
  496. package/dist/test/src/security/errors.js +0 -28
  497. package/dist/test/src/security/fileLockManager.d.ts +0 -70
  498. package/dist/test/src/security/fileLockManager.d.ts.map +0 -1
  499. package/dist/test/src/security/fileLockManager.js +0 -187
  500. package/dist/test/src/security/index.d.ts +0 -12
  501. package/dist/test/src/security/index.d.ts.map +0 -1
  502. package/dist/test/src/security/index.js +0 -14
  503. package/dist/test/src/security/pathValidator.d.ts +0 -9
  504. package/dist/test/src/security/pathValidator.d.ts.map +0 -1
  505. package/dist/test/src/security/pathValidator.js +0 -98
  506. package/dist/test/src/security/regexValidator.d.ts +0 -59
  507. package/dist/test/src/security/regexValidator.d.ts.map +0 -1
  508. package/dist/test/src/security/regexValidator.js +0 -214
  509. package/dist/test/src/security/secureYamlParser.d.ts +0 -46
  510. package/dist/test/src/security/secureYamlParser.d.ts.map +0 -1
  511. package/dist/test/src/security/secureYamlParser.js +0 -203
  512. package/dist/test/src/security/securityMonitor.d.ts +0 -58
  513. package/dist/test/src/security/securityMonitor.d.ts.map +0 -1
  514. package/dist/test/src/security/securityMonitor.js +0 -108
  515. package/dist/test/src/security/tokenManager.d.ts +0 -85
  516. package/dist/test/src/security/tokenManager.d.ts.map +0 -1
  517. package/dist/test/src/security/tokenManager.js +0 -286
  518. package/dist/test/src/security/validators/unicodeValidator.d.ts +0 -97
  519. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +0 -1
  520. package/dist/test/src/security/validators/unicodeValidator.js +0 -312
  521. package/dist/test/src/security/yamlValidator.d.ts +0 -21
  522. package/dist/test/src/security/yamlValidator.d.ts.map +0 -1
  523. package/dist/test/src/security/yamlValidator.js +0 -164
  524. package/dist/test/src/server/ServerSetup.d.ts +0 -35
  525. package/dist/test/src/server/ServerSetup.d.ts.map +0 -1
  526. package/dist/test/src/server/ServerSetup.js +0 -116
  527. package/dist/test/src/server/index.d.ts +0 -7
  528. package/dist/test/src/server/index.d.ts.map +0 -1
  529. package/dist/test/src/server/index.js +0 -7
  530. package/dist/test/src/server/startup.d.ts +0 -31
  531. package/dist/test/src/server/startup.d.ts.map +0 -1
  532. package/dist/test/src/server/startup.js +0 -67
  533. package/dist/test/src/server/tools/CollectionTools.d.ts +0 -10
  534. package/dist/test/src/server/tools/CollectionTools.d.ts.map +0 -1
  535. package/dist/test/src/server/tools/CollectionTools.js +0 -96
  536. package/dist/test/src/server/tools/ConfigTools.d.ts +0 -10
  537. package/dist/test/src/server/tools/ConfigTools.d.ts.map +0 -1
  538. package/dist/test/src/server/tools/ConfigTools.js +0 -63
  539. package/dist/test/src/server/tools/MarketplaceTools.d.ts +0 -10
  540. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  541. package/dist/test/src/server/tools/MarketplaceTools.js +0 -92
  542. package/dist/test/src/server/tools/PersonaTools.d.ts +0 -10
  543. package/dist/test/src/server/tools/PersonaTools.d.ts.map +0 -1
  544. package/dist/test/src/server/tools/PersonaTools.js +0 -257
  545. package/dist/test/src/server/tools/ToolRegistry.d.ts +0 -37
  546. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +0 -1
  547. package/dist/test/src/server/tools/ToolRegistry.js +0 -40
  548. package/dist/test/src/server/tools/UpdateTools.d.ts +0 -10
  549. package/dist/test/src/server/tools/UpdateTools.d.ts.map +0 -1
  550. package/dist/test/src/server/tools/UpdateTools.js +0 -64
  551. package/dist/test/src/server/tools/UserTools.d.ts +0 -10
  552. package/dist/test/src/server/tools/UserTools.d.ts.map +0 -1
  553. package/dist/test/src/server/tools/UserTools.js +0 -51
  554. package/dist/test/src/server/tools/index.d.ts +0 -10
  555. package/dist/test/src/server/tools/index.d.ts.map +0 -1
  556. package/dist/test/src/server/tools/index.js +0 -10
  557. package/dist/test/src/server/types.d.ts +0 -34
  558. package/dist/test/src/server/types.d.ts.map +0 -1
  559. package/dist/test/src/server/types.js +0 -5
  560. package/dist/test/src/tools/debug.d.ts +0 -20
  561. package/dist/test/src/tools/debug.d.ts.map +0 -1
  562. package/dist/test/src/tools/debug.js +0 -37
  563. package/dist/test/src/types/cache.d.ts +0 -8
  564. package/dist/test/src/types/cache.d.ts.map +0 -1
  565. package/dist/test/src/types/cache.js +0 -5
  566. package/dist/test/src/types/collection.d.ts +0 -23
  567. package/dist/test/src/types/collection.d.ts.map +0 -1
  568. package/dist/test/src/types/collection.js +0 -5
  569. package/dist/test/src/types/elements/IElement.d.ts +0 -123
  570. package/dist/test/src/types/elements/IElement.d.ts.map +0 -1
  571. package/dist/test/src/types/elements/IElement.js +0 -30
  572. package/dist/test/src/types/elements/IElementManager.d.ts +0 -65
  573. package/dist/test/src/types/elements/IElementManager.d.ts.map +0 -1
  574. package/dist/test/src/types/elements/IElementManager.js +0 -6
  575. package/dist/test/src/types/elements/IRatingManager.d.ts +0 -109
  576. package/dist/test/src/types/elements/IRatingManager.d.ts.map +0 -1
  577. package/dist/test/src/types/elements/IRatingManager.js +0 -6
  578. package/dist/test/src/types/elements/IReferenceResolver.d.ts +0 -52
  579. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +0 -1
  580. package/dist/test/src/types/elements/IReferenceResolver.js +0 -6
  581. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +0 -49
  582. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +0 -1
  583. package/dist/test/src/types/elements/RatingBreakdowns.js +0 -6
  584. package/dist/test/src/types/elements/index.d.ts +0 -9
  585. package/dist/test/src/types/elements/index.d.ts.map +0 -1
  586. package/dist/test/src/types/elements/index.js +0 -11
  587. package/dist/test/src/types/index.d.ts +0 -9
  588. package/dist/test/src/types/index.d.ts.map +0 -1
  589. package/dist/test/src/types/index.js +0 -9
  590. package/dist/test/src/types/marketplace.d.ts +0 -23
  591. package/dist/test/src/types/marketplace.d.ts.map +0 -1
  592. package/dist/test/src/types/marketplace.js +0 -5
  593. package/dist/test/src/types/mcp.d.ts +0 -84
  594. package/dist/test/src/types/mcp.d.ts.map +0 -1
  595. package/dist/test/src/types/mcp.js +0 -80
  596. package/dist/test/src/types/persona.d.ts +0 -30
  597. package/dist/test/src/types/persona.d.ts.map +0 -1
  598. package/dist/test/src/types/persona.js +0 -5
  599. package/dist/test/src/update/BackupManager.d.ts +0 -46
  600. package/dist/test/src/update/BackupManager.d.ts.map +0 -1
  601. package/dist/test/src/update/BackupManager.js +0 -261
  602. package/dist/test/src/update/DependencyChecker.d.ts +0 -41
  603. package/dist/test/src/update/DependencyChecker.d.ts.map +0 -1
  604. package/dist/test/src/update/DependencyChecker.js +0 -132
  605. package/dist/test/src/update/RateLimiter.d.ts +0 -80
  606. package/dist/test/src/update/RateLimiter.d.ts.map +0 -1
  607. package/dist/test/src/update/RateLimiter.js +0 -172
  608. package/dist/test/src/update/SignatureVerifier.d.ts +0 -71
  609. package/dist/test/src/update/SignatureVerifier.d.ts.map +0 -1
  610. package/dist/test/src/update/SignatureVerifier.js +0 -214
  611. package/dist/test/src/update/UpdateChecker.d.ts +0 -127
  612. package/dist/test/src/update/UpdateChecker.d.ts.map +0 -1
  613. package/dist/test/src/update/UpdateChecker.js +0 -469
  614. package/dist/test/src/update/UpdateManager.d.ts +0 -41
  615. package/dist/test/src/update/UpdateManager.d.ts.map +0 -1
  616. package/dist/test/src/update/UpdateManager.js +0 -260
  617. package/dist/test/src/update/VersionManager.d.ts +0 -31
  618. package/dist/test/src/update/VersionManager.d.ts.map +0 -1
  619. package/dist/test/src/update/VersionManager.js +0 -134
  620. package/dist/test/src/update/index.d.ts +0 -9
  621. package/dist/test/src/update/index.d.ts.map +0 -1
  622. package/dist/test/src/update/index.js +0 -9
  623. package/dist/test/src/utils/filesystem.d.ts +0 -29
  624. package/dist/test/src/utils/filesystem.d.ts.map +0 -1
  625. package/dist/test/src/utils/filesystem.js +0 -94
  626. package/dist/test/src/utils/git.d.ts +0 -32
  627. package/dist/test/src/utils/git.d.ts.map +0 -1
  628. package/dist/test/src/utils/git.js +0 -65
  629. package/dist/test/src/utils/index.d.ts +0 -7
  630. package/dist/test/src/utils/index.d.ts.map +0 -1
  631. package/dist/test/src/utils/index.js +0 -7
  632. package/dist/test/src/utils/logger.d.ts +0 -45
  633. package/dist/test/src/utils/logger.d.ts.map +0 -1
  634. package/dist/test/src/utils/logger.js +0 -91
  635. package/dist/test/src/utils/version.d.ts +0 -25
  636. package/dist/test/src/utils/version.d.ts.map +0 -1
  637. package/dist/test/src/utils/version.js +0 -97
  638. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +0 -33
  639. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +0 -1
  640. package/dist/test/test/__tests__/integration/helpers/file-utils.js +0 -83
  641. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +0 -26
  642. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +0 -1
  643. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +0 -95
  644. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +0 -26
  645. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +0 -1
  646. package/dist/test/test/__tests__/integration/helpers/test-server.js +0 -41
  647. package/dist/test/test/__tests__/integration/setup.d.ts +0 -8
  648. package/dist/test/test/__tests__/integration/setup.d.ts.map +0 -1
  649. package/dist/test/test/__tests__/integration/setup.js +0 -31
  650. package/dist/test/test/__tests__/integration/teardown.d.ts +0 -5
  651. package/dist/test/test/__tests__/integration/teardown.d.ts.map +0 -1
  652. package/dist/test/test/__tests__/integration/teardown.js +0 -23
  653. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +0 -34
  654. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +0 -1
  655. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +0 -224
  656. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +0 -89
  657. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +0 -1
  658. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +0 -543
  659. package/dist/test/test/__tests__/security/index.d.ts +0 -46
  660. package/dist/test/test/__tests__/security/index.d.ts.map +0 -1
  661. package/dist/test/test/__tests__/security/index.js +0 -98
  662. package/dist/test/test/__tests__/security/setup.d.ts +0 -3
  663. package/dist/test/test/__tests__/security/setup.d.ts.map +0 -1
  664. package/dist/test/test/__tests__/security/setup.js +0 -23
  665. package/dist/types/marketplace.d.ts +0 -23
  666. package/dist/types/marketplace.d.ts.map +0 -1
  667. package/dist/types/marketplace.js +0 -5
@@ -1,575 +0,0 @@
1
- /**
2
- * Security Audit Suppression Configuration
3
- *
4
- * This file contains suppression rules for false positives in the security audit.
5
- * Each suppression should be well-documented with a clear reason.
6
- */
7
- /**
8
- * Suppression cache for performance optimization
9
- */
10
- class SuppressionCache {
11
- cache = new Map();
12
- regexCache = new Map();
13
- clear() {
14
- this.cache.clear();
15
- this.regexCache.clear();
16
- }
17
- getCacheKey(ruleId, filePath) {
18
- return `${ruleId}::${filePath}`;
19
- }
20
- get(ruleId, filePath) {
21
- return this.cache.get(this.getCacheKey(ruleId, filePath));
22
- }
23
- set(ruleId, filePath, value) {
24
- this.cache.set(this.getCacheKey(ruleId, filePath), value);
25
- }
26
- getRegex(pattern) {
27
- return this.regexCache.get(pattern);
28
- }
29
- setRegex(pattern, regex) {
30
- this.regexCache.set(pattern, regex);
31
- }
32
- }
33
- const cache = new SuppressionCache();
34
- export const suppressions = [
35
- // ========================================
36
- // SQL Injection False Positives
37
- // ========================================
38
- {
39
- rule: 'CWE-89-001',
40
- file: 'src/update/UpdateManager.ts',
41
- reason: 'False positive - "Update Failed" is a UI message, not SQL. The codebase does not use SQL.'
42
- },
43
- // ========================================
44
- // Test File Suppressions
45
- // ========================================
46
- {
47
- rule: '*',
48
- file: '__tests__/**/*',
49
- reason: 'Test files may contain intentional security patterns for testing'
50
- },
51
- {
52
- rule: '*',
53
- file: '**/*.test.ts',
54
- reason: 'Test files may contain intentional security patterns for testing'
55
- },
56
- {
57
- rule: '*',
58
- file: '**/*.spec.ts',
59
- reason: 'Test files may contain intentional security patterns for testing'
60
- },
61
- {
62
- rule: 'OWASP-A01-001',
63
- file: '__tests__/**/*',
64
- reason: 'Test files use fake tokens and secrets for testing security features'
65
- },
66
- {
67
- rule: 'CWE-89-001',
68
- file: '__tests__/**/*',
69
- reason: 'Test files contain SQL injection patterns for security testing'
70
- },
71
- {
72
- rule: 'OWASP-A03-002',
73
- file: '__tests__/**/*',
74
- reason: 'Test files contain command injection patterns for security testing'
75
- },
76
- {
77
- rule: 'OWASP-A03-003',
78
- file: '__tests__/**/*',
79
- reason: 'Test files contain path traversal patterns for security testing'
80
- },
81
- // ========================================
82
- // YAML Parsing False Positives
83
- // ========================================
84
- {
85
- rule: 'DMCP-SEC-005',
86
- file: 'src/security/yamlValidator.ts',
87
- reason: 'YamlValidator is the security validation layer itself - it needs direct yaml.load access'
88
- },
89
- {
90
- rule: 'DMCP-SEC-005',
91
- file: 'src/security/secureYamlParser.ts',
92
- reason: 'SecureYamlParser is the security wrapper that validates YAML before parsing'
93
- },
94
- // ========================================
95
- // Security Rule Definition Files
96
- // ========================================
97
- {
98
- rule: 'OWASP-A03-004',
99
- file: 'src/security/audit/rules/SecurityRules.ts',
100
- reason: 'This is a regex pattern definition for detecting innerHTML usage, not actual usage'
101
- },
102
- // ========================================
103
- // Persona Loading False Positives
104
- // ========================================
105
- {
106
- rule: 'DMCP-SEC-001',
107
- file: 'src/persona/PersonaLoader.ts',
108
- reason: 'PersonaLoader validates personas through SecureYamlParser and ContentValidator'
109
- },
110
- // ========================================
111
- // Unicode Normalization False Positives
112
- // ========================================
113
- {
114
- rule: 'DMCP-SEC-004',
115
- file: 'src/types/*.ts',
116
- reason: 'Type definition files do not process user input'
117
- },
118
- {
119
- rule: 'DMCP-SEC-004',
120
- file: 'src/types/elements/*.ts',
121
- reason: 'Element interface files are type definitions that do not process user input'
122
- },
123
- {
124
- rule: 'DMCP-SEC-004',
125
- file: 'src/errors/*.ts',
126
- reason: 'Error classes do not process user input'
127
- },
128
- {
129
- rule: 'DMCP-SEC-004',
130
- file: 'src/config/*.ts',
131
- reason: 'Configuration files do not process user input directly'
132
- },
133
- {
134
- rule: 'DMCP-SEC-004',
135
- file: 'src/constants/*.ts',
136
- reason: 'Constant definition files do not process user input'
137
- },
138
- {
139
- rule: 'DMCP-SEC-004',
140
- file: 'src/utils/version.ts',
141
- reason: 'Version utility only handles internal version strings, not user input'
142
- },
143
- {
144
- rule: 'DMCP-SEC-004',
145
- file: 'src/cache/*.ts',
146
- reason: 'Cache layer receives already-normalized input'
147
- },
148
- {
149
- rule: 'DMCP-SEC-004',
150
- file: 'src/security/**/*.ts',
151
- reason: 'Security modules handle validation and normalization themselves'
152
- },
153
- {
154
- rule: 'DMCP-SEC-004',
155
- file: 'src/index.ts',
156
- reason: 'Main entry point delegates to ServerSetup which normalizes all inputs'
157
- },
158
- {
159
- rule: 'DMCP-SEC-004',
160
- file: 'src/server/ServerSetup.ts',
161
- reason: 'This is where Unicode normalization is implemented for all tool inputs'
162
- },
163
- {
164
- rule: 'DMCP-SEC-004',
165
- file: 'src/collection/*.ts',
166
- reason: 'Marketplace modules receive normalized input from tool handlers'
167
- },
168
- {
169
- rule: 'DMCP-SEC-004',
170
- file: 'src/collection/**/*.ts',
171
- reason: 'Marketplace modules receive normalized input from tool handlers'
172
- },
173
- {
174
- rule: 'DMCP-SEC-004',
175
- file: 'src/persona/*.ts',
176
- reason: 'Persona modules receive normalized input from tool handlers'
177
- },
178
- {
179
- rule: 'DMCP-SEC-004',
180
- file: 'src/persona/**/*.ts',
181
- reason: 'Persona modules receive normalized input from tool handlers'
182
- },
183
- {
184
- rule: 'DMCP-SEC-004',
185
- file: 'src/update/*.ts',
186
- reason: 'Update modules receive normalized input from tool handlers'
187
- },
188
- {
189
- rule: 'DMCP-SEC-004',
190
- file: 'src/tools/*.ts',
191
- reason: 'Tool files receive normalized input from ServerSetup'
192
- },
193
- {
194
- rule: 'DMCP-SEC-004',
195
- file: 'src/server/types.ts',
196
- reason: 'Type definition file does not process user input'
197
- },
198
- {
199
- rule: 'DMCP-SEC-004',
200
- file: 'src/server/tools/*.ts',
201
- reason: 'Server tools receive normalized input from ServerSetup'
202
- },
203
- {
204
- rule: 'DMCP-SEC-004',
205
- file: 'scripts/**/*',
206
- reason: 'Build and utility scripts do not process user input'
207
- },
208
- // ========================================
209
- // Audit Logging False Positives
210
- // ========================================
211
- {
212
- rule: 'DMCP-SEC-006',
213
- file: 'src/types/*.ts',
214
- reason: 'Type definition files do not perform security operations'
215
- },
216
- {
217
- rule: 'DMCP-SEC-006',
218
- file: 'src/types/elements/*.ts',
219
- reason: 'Element interface files are type definitions that do not perform security operations'
220
- },
221
- {
222
- rule: 'DMCP-SEC-006',
223
- file: 'src/constants/*.ts',
224
- reason: 'Constant files do not perform security operations'
225
- },
226
- {
227
- rule: 'DMCP-SEC-006',
228
- file: 'src/config/*.ts',
229
- reason: 'Configuration files do not perform security operations'
230
- },
231
- {
232
- rule: 'DMCP-SEC-006',
233
- file: 'src/errors/*.ts',
234
- reason: 'Error classes are not security operations requiring audit'
235
- },
236
- {
237
- rule: 'DMCP-SEC-006',
238
- file: '**/*.json',
239
- reason: 'JSON files cannot contain executable code'
240
- },
241
- {
242
- rule: 'DMCP-SEC-006',
243
- file: 'src/security/**/*.ts',
244
- reason: 'Security modules are infrastructure, not operations requiring audit'
245
- },
246
- {
247
- rule: 'DMCP-SEC-006',
248
- file: 'src/collection/*.ts',
249
- reason: 'Marketplace operations are not security-sensitive requiring audit'
250
- },
251
- {
252
- rule: 'DMCP-SEC-006',
253
- file: 'src/collection/**/*.ts',
254
- reason: 'Marketplace operations are not security-sensitive requiring audit'
255
- },
256
- {
257
- rule: 'DMCP-SEC-006',
258
- file: 'src/persona/*.ts',
259
- reason: 'Persona operations are validated at entry point, not security operations'
260
- },
261
- {
262
- rule: 'DMCP-SEC-006',
263
- file: 'src/persona/**/*.ts',
264
- reason: 'Persona operations are validated at entry point, not security operations'
265
- },
266
- {
267
- rule: 'DMCP-SEC-006',
268
- file: 'src/server/tools/**/*.ts',
269
- reason: 'Tool implementations delegate to services that handle security'
270
- },
271
- {
272
- rule: 'DMCP-SEC-006',
273
- file: 'src/index.ts',
274
- reason: 'Main entry point delegates security operations to specialized modules'
275
- },
276
- {
277
- rule: 'DMCP-SEC-006',
278
- file: 'src/utils/*.ts',
279
- reason: 'Utility functions are not security operations requiring audit'
280
- },
281
- {
282
- rule: 'DMCP-SEC-006',
283
- file: 'src/update/**/*.ts',
284
- reason: 'Update system has its own logging and is not a direct security operation'
285
- },
286
- {
287
- rule: 'DMCP-SEC-006',
288
- file: 'src/server/types.ts',
289
- reason: 'Type definition file does not perform operations'
290
- },
291
- {
292
- rule: 'DMCP-SEC-006',
293
- file: 'scripts/**/*',
294
- reason: 'Build scripts do not perform runtime security operations'
295
- },
296
- // ========================================
297
- // Coverage Report Files
298
- // ========================================
299
- {
300
- rule: '*',
301
- file: 'test/coverage/**/*',
302
- reason: 'Coverage report files are auto-generated and not part of the application code'
303
- },
304
- {
305
- rule: '*',
306
- file: '**/lcov-report/**/*',
307
- reason: 'LCOV coverage report files are auto-generated and not part of the application code'
308
- },
309
- // ========================================
310
- // Documentation and Non-Code Files
311
- // ========================================
312
- {
313
- rule: '*',
314
- file: '**/*.md',
315
- reason: 'Markdown documentation files'
316
- },
317
- {
318
- rule: '*',
319
- file: 'LICENSE',
320
- reason: 'License file'
321
- },
322
- {
323
- rule: '*',
324
- file: '.gitignore',
325
- reason: 'Git configuration file'
326
- },
327
- {
328
- rule: '*',
329
- file: 'package-lock.json',
330
- reason: 'NPM lock file - auto-generated, no user input processing'
331
- },
332
- {
333
- rule: '*',
334
- file: '**/*.yml',
335
- reason: 'YAML configuration files are data, not code'
336
- },
337
- {
338
- rule: '*',
339
- file: '**/*.yaml',
340
- reason: 'YAML configuration files are data, not code'
341
- }
342
- ];
343
- /**
344
- * Validate suppression configuration at startup
345
- */
346
- export function validateSuppressions() {
347
- const errors = [];
348
- const seenPatterns = new Set();
349
- for (const suppression of suppressions) {
350
- // Check for empty reasons
351
- if (!suppression.reason || suppression.reason.trim().length < 10) {
352
- errors.push(`Suppression for ${suppression.rule} has insufficient reason`);
353
- }
354
- // Check for valid rule patterns
355
- const rulePattern = /^(DMCP-SEC-\d{3}|OWASP-[A-Z]\d{2}-\d{3}|CWE-\d+-\d{3}|\*)$/;
356
- if (!suppression.rule.match(rulePattern)) {
357
- errors.push(`Invalid rule pattern: ${suppression.rule}`);
358
- }
359
- // Check for duplicate suppressions
360
- const key = `${suppression.rule}:${suppression.file || '*'}`;
361
- if (seenPatterns.has(key)) {
362
- errors.push(`Duplicate suppression: ${key}`);
363
- }
364
- seenPatterns.add(key);
365
- // Validate glob patterns
366
- if (suppression.file?.includes('**') && !suppression.file.includes('**/')) {
367
- errors.push(`Invalid glob pattern in ${suppression.file} - ** must be followed by /`);
368
- }
369
- }
370
- return errors;
371
- }
372
- /**
373
- * Convert glob pattern to regex pattern safely
374
- * Using a proper glob-to-regex conversion that handles all edge cases
375
- */
376
- function globToRegex(glob) {
377
- // Check cache first
378
- const cached = cache.getRegex(glob);
379
- if (cached)
380
- return cached;
381
- // Special case: if glob starts with *, it should match anything at the beginning
382
- let processedGlob = glob;
383
- let prefix = '';
384
- if (glob.startsWith('*') && !glob.startsWith('**')) {
385
- prefix = '(?:.*/)?'; // Optional path prefix
386
- processedGlob = glob.substring(1);
387
- }
388
- // Escape all regex special characters except * and /
389
- // Fixed: Properly escape backslashes and other special regex characters
390
- let pattern = processedGlob.replace(/[\\^$.()+?{}[\]|]/g, '\\$&');
391
- // Handle glob patterns in correct order
392
- // Replace ** before * to avoid conflicts
393
- pattern = pattern
394
- .replace(/\*\*/g, '<<GLOBSTAR>>') // Temporary placeholder for **
395
- .replace(/\*/g, '<<STAR>>') // Temporary placeholder for *
396
- .replace(/<<GLOBSTAR>>\//g, '(?:.*/)?') // **/ matches any number of directories including none
397
- .replace(/<<GLOBSTAR>>/g, '.*') // ** matches anything
398
- .replace(/<<STAR>>/g, '[^/]*') // * matches anything except directory separator
399
- .replace(/\//g, '\\/'); // Escape forward slashes
400
- // Combine prefix and pattern
401
- const fullPattern = prefix + pattern;
402
- // Add anchors to ensure full path match
403
- const regex = new RegExp(`^${fullPattern}$`);
404
- // Cache the compiled regex
405
- cache.setRegex(glob, regex);
406
- return regex;
407
- }
408
- /**
409
- * Normalize file path for consistent matching
410
- * Handles both absolute and relative paths across different platforms
411
- */
412
- function normalizePath(filePath) {
413
- // Convert backslashes to forward slashes for Windows paths
414
- let normalized = filePath.replace(/\\/g, '/');
415
- // Remove duplicate slashes
416
- normalized = normalized.replace(/\/+/g, '/');
417
- // Remove trailing slash if present
418
- if (normalized.endsWith('/') && normalized.length > 1) {
419
- normalized = normalized.slice(0, -1);
420
- }
421
- return normalized;
422
- }
423
- /**
424
- * Extract relative path from absolute path
425
- * Handles various CI/CD and local development path formats
426
- */
427
- function getRelativePath(absolutePath) {
428
- const normalized = normalizePath(absolutePath);
429
- // If already a relative path, return as-is
430
- if (!normalized.startsWith('/') && !normalized.match(/^[A-Z]:/i)) {
431
- return normalized;
432
- }
433
- // Define common project source directories
434
- const projectDirs = ['src/', '__tests__/', 'scripts/', 'docs/', 'test/', 'tests/', 'lib/'];
435
- // Find the position of common project directories in the path
436
- let bestMatch = { index: -1, dir: '', relativePath: '' };
437
- for (const dir of projectDirs) {
438
- // Look for /dir pattern (with leading slash to avoid false matches)
439
- const searchPattern = `/${dir}`;
440
- const index = normalized.lastIndexOf(searchPattern);
441
- if (index >= 0) {
442
- // Extract everything after the parent of this directory
443
- // For example: /home/user/project/src/file.ts -> src/file.ts
444
- const dirStartIndex = index + 1; // Skip the leading slash
445
- const relativePath = normalized.substring(dirStartIndex);
446
- // Verify this looks like a valid project file
447
- if (relativePath.startsWith(dir) && relativePath.includes('.')) {
448
- // Keep the match that appears latest in the path (most specific)
449
- if (index > bestMatch.index) {
450
- bestMatch = { index, dir, relativePath };
451
- }
452
- }
453
- }
454
- }
455
- // If we found a match, return it
456
- if (bestMatch.index >= 0) {
457
- return bestMatch.relativePath;
458
- }
459
- // Fallback: Try to find common file patterns that indicate project files
460
- const filePatterns = [
461
- /\/(src|__tests__|scripts|test|tests|lib)\/.*\.[jt]sx?$/,
462
- /\/(src|__tests__|scripts|test|tests|lib)\/.*\.json$/,
463
- /\/(src|__tests__|scripts|test|tests|lib)\/.*\.ya?ml$/,
464
- /\/package\.json$/,
465
- /\/package-lock\.json$/,
466
- /\/tsconfig.*\.json$/,
467
- /\/\..*rc\.json$/ // .eslintrc.json, etc.
468
- ];
469
- for (const pattern of filePatterns) {
470
- const match = normalized.match(pattern);
471
- if (match) {
472
- // Find where the match starts and extract from there
473
- const matchIndex = normalized.indexOf(match[0]);
474
- if (matchIndex >= 0) {
475
- return normalized.substring(matchIndex + 1); // Skip leading /
476
- }
477
- }
478
- }
479
- // Last resort: if path contains common extensions, try to extract a reasonable relative path
480
- if (normalized.match(/\.(ts|js|tsx|jsx|json|yaml|yml)$/)) {
481
- // Find the last segment that looks like a project directory
482
- const segments = normalized.split('/');
483
- for (let i = segments.length - 2; i >= 0; i--) {
484
- if (projectDirs.some(dir => dir.startsWith(segments[i]))) {
485
- return segments.slice(i).join('/');
486
- }
487
- }
488
- // For root-level files like package-lock.json, just return the filename
489
- const filename = segments[segments.length - 1];
490
- if (filename && filename.includes('.')) {
491
- return filename;
492
- }
493
- }
494
- // Return the normalized path if we can't extract relative
495
- return normalized;
496
- }
497
- /**
498
- * Check if a finding should be suppressed
499
- * Optimized with caching and early returns
500
- */
501
- export function shouldSuppress(ruleId, filePath) {
502
- if (!filePath)
503
- return false;
504
- // Normalize paths for consistent matching
505
- const normalizedPath = normalizePath(filePath);
506
- const relativePath = getRelativePath(normalizedPath);
507
- // Check cache first
508
- const cacheKey = `${ruleId}::${relativePath}`;
509
- const cached = cache.get(ruleId, relativePath);
510
- if (cached !== undefined)
511
- return cached;
512
- // Process suppressions with early returns
513
- for (const suppression of suppressions) {
514
- // Skip if rule doesn't match
515
- if (suppression.rule !== '*' && suppression.rule !== ruleId) {
516
- continue;
517
- }
518
- // Handle global suppressions (no file specified)
519
- if (!suppression.file) {
520
- cache.set(ruleId, relativePath, true);
521
- return true;
522
- }
523
- // Check exact file match (most common case)
524
- if (suppression.file === relativePath || suppression.file === normalizedPath) {
525
- cache.set(ruleId, relativePath, true);
526
- return true;
527
- }
528
- // Check pattern match only if file contains wildcards
529
- if (suppression.file.includes('*')) {
530
- try {
531
- const regex = globToRegex(suppression.file);
532
- if (regex.test(relativePath) || regex.test(normalizedPath)) {
533
- cache.set(ruleId, relativePath, true);
534
- return true;
535
- }
536
- }
537
- catch (error) {
538
- console.error(`Invalid suppression pattern "${suppression.file}":`, error);
539
- }
540
- }
541
- }
542
- // Not suppressed
543
- cache.set(ruleId, relativePath, false);
544
- return false;
545
- }
546
- /**
547
- * Clear suppression cache (useful for testing)
548
- */
549
- export function clearSuppressionCache() {
550
- cache.clear();
551
- }
552
- /**
553
- * Get suppression statistics for reporting
554
- */
555
- export function getSuppressionStats() {
556
- const stats = {
557
- total: suppressions.length,
558
- byRule: {},
559
- byCategory: {}
560
- };
561
- for (const suppression of suppressions) {
562
- // Count by rule
563
- stats.byRule[suppression.rule] = (stats.byRule[suppression.rule] || 0) + 1;
564
- // Count by category (extract from rule prefix)
565
- const category = suppression.rule.split('-')[0];
566
- stats.byCategory[category] = (stats.byCategory[category] || 0) + 1;
567
- }
568
- return stats;
569
- }
570
- // Validate suppressions on module load
571
- const validationErrors = validateSuppressions();
572
- if (validationErrors.length > 0) {
573
- console.warn('Suppression configuration warnings:', validationErrors);
574
- }
575
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcHJlc3Npb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NlY3VyaXR5L2F1ZGl0L2NvbmZpZy9zdXBwcmVzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFVSDs7R0FFRztBQUNILE1BQU0sZ0JBQWdCO0lBQ1osS0FBSyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ25DLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUUvQyxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBYyxFQUFFLFFBQWdCO1FBQzFDLE9BQU8sR0FBRyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELEdBQUcsQ0FBQyxNQUFjLEVBQUUsUUFBZ0I7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxHQUFHLENBQUMsTUFBYyxFQUFFLFFBQWdCLEVBQUUsS0FBYztRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQWUsRUFBRSxLQUFhO1FBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFL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eEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VjdXJpdHkgQXVkaXQgU3VwcHJlc3Npb24gQ29uZmlndXJhdGlvblxuICogXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgc3VwcHJlc3Npb24gcnVsZXMgZm9yIGZhbHNlIHBvc2l0aXZlcyBpbiB0aGUgc2VjdXJpdHkgYXVkaXQuXG4gKiBFYWNoIHN1cHByZXNzaW9uIHNob3VsZCBiZSB3ZWxsLWRvY3VtZW50ZWQgd2l0aCBhIGNsZWFyIHJlYXNvbi5cbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1cHByZXNzaW9uIHtcbiAgcnVsZTogc3RyaW5nO1xuICBmaWxlPzogc3RyaW5nO1xuICByZWFzb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdXBwcmVzc2lvbiBjYWNoZSBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gKi9cbmNsYXNzIFN1cHByZXNzaW9uQ2FjaGUge1xuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgcmVnZXhDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWdFeHA+KCk7XG4gIFxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5yZWdleENhY2hlLmNsZWFyKCk7XG4gIH1cbiAgXG4gIGdldENhY2hlS2V5KHJ1bGVJZDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cnVsZUlkfTo6JHtmaWxlUGF0aH1gO1xuICB9XG4gIFxuICBnZXQocnVsZUlkOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQodGhpcy5nZXRDYWNoZUtleShydWxlSWQsIGZpbGVQYXRoKSk7XG4gIH1cbiAgXG4gIHNldChydWxlSWQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlLnNldCh0aGlzLmdldENhY2hlS2V5KHJ1bGVJZCwgZmlsZVBhdGgpLCB2YWx1ZSk7XG4gIH1cbiAgXG4gIGdldFJlZ2V4KHBhdHRlcm46IHN0cmluZyk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVnZXhDYWNoZS5nZXQocGF0dGVybik7XG4gIH1cbiAgXG4gIHNldFJlZ2V4KHBhdHRlcm46IHN0cmluZywgcmVnZXg6IFJlZ0V4cCk6IHZvaWQge1xuICAgIHRoaXMucmVnZXhDYWNoZS5zZXQocGF0dGVybiwgcmVnZXgpO1xuICB9XG59XG5cbmNvbnN0IGNhY2hlID0gbmV3IFN1cHByZXNzaW9uQ2FjaGUoKTtcblxuZXhwb3J0IGNvbnN0IHN1cHByZXNzaW9uczogU3VwcHJlc3Npb25bXSA9IFtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTUUwgSW5qZWN0aW9uIEZhbHNlIFBvc2l0aXZlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHtcbiAgICBydWxlOiAnQ1dFLTg5LTAwMScsXG4gICAgZmlsZTogJ3NyYy91cGRhdGUvVXBkYXRlTWFuYWdlci50cycsXG4gICAgcmVhc29uOiAnRmFsc2UgcG9zaXRpdmUgLSBcIlVwZGF0ZSBGYWlsZWRcIiBpcyBhIFVJIG1lc3NhZ2UsIG5vdCBTUUwuIFRoZSBjb2RlYmFzZSBkb2VzIG5vdCB1c2UgU1FMLidcbiAgfSxcbiAgXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVGVzdCBGaWxlIFN1cHByZXNzaW9uc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHtcbiAgICBydWxlOiAnKicsXG4gICAgZmlsZTogJ19fdGVzdHNfXy8qKi8qJyxcbiAgICByZWFzb246ICdUZXN0IGZpbGVzIG1heSBjb250YWluIGludGVudGlvbmFsIHNlY3VyaXR5IHBhdHRlcm5zIGZvciB0ZXN0aW5nJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJyonLFxuICAgIGZpbGU6ICcqKi8qLnRlc3QudHMnLFxuICAgIHJlYXNvbjogJ1Rlc3QgZmlsZXMgbWF5IGNvbnRhaW4gaW50ZW50aW9uYWwgc2VjdXJpdHkgcGF0dGVybnMgZm9yIHRlc3RpbmcnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnKicsXG4gICAgZmlsZTogJyoqLyouc3BlYy50cycsXG4gICAgcmVhc29uOiAnVGVzdCBmaWxlcyBtYXkgY29udGFpbiBpbnRlbnRpb25hbCBzZWN1cml0eSBwYXR0ZXJucyBmb3IgdGVzdGluZydcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICdPV0FTUC1BMDEtMDAxJyxcbiAgICBmaWxlOiAnX190ZXN0c19fLyoqLyonLFxuICAgIHJlYXNvbjogJ1Rlc3QgZmlsZXMgdXNlIGZha2UgdG9rZW5zIGFuZCBzZWNyZXRzIGZvciB0ZXN0aW5nIHNlY3VyaXR5IGZlYXR1cmVzJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0NXRS04OS0wMDEnLFxuICAgIGZpbGU6ICdfX3Rlc3RzX18vKiovKicsXG4gICAgcmVhc29uOiAnVGVzdCBmaWxlcyBjb250YWluIFNRTCBpbmplY3Rpb24gcGF0dGVybnMgZm9yIHNlY3VyaXR5IHRlc3RpbmcnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnT1dBU1AtQTAzLTAwMicsXG4gICAgZmlsZTogJ19fdGVzdHNfXy8qKi8qJyxcbiAgICByZWFzb246ICdUZXN0IGZpbGVzIGNvbnRhaW4gY29tbWFuZCBpbmplY3Rpb24gcGF0dGVybnMgZm9yIHNlY3VyaXR5IHRlc3RpbmcnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnT1dBU1AtQTAzLTAwMycsXG4gICAgZmlsZTogJ19fdGVzdHNfXy8qKi8qJyxcbiAgICByZWFzb246ICdUZXN0IGZpbGVzIGNvbnRhaW4gcGF0aCB0cmF2ZXJzYWwgcGF0dGVybnMgZm9yIHNlY3VyaXR5IHRlc3RpbmcnXG4gIH0sXG4gIFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFlBTUwgUGFyc2luZyBGYWxzZSBQb3NpdGl2ZXNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNScsXG4gICAgZmlsZTogJ3NyYy9zZWN1cml0eS95YW1sVmFsaWRhdG9yLnRzJyxcbiAgICByZWFzb246ICdZYW1sVmFsaWRhdG9yIGlzIHRoZSBzZWN1cml0eSB2YWxpZGF0aW9uIGxheWVyIGl0c2VsZiAtIGl0IG5lZWRzIGRpcmVjdCB5YW1sLmxvYWQgYWNjZXNzJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNScsXG4gICAgZmlsZTogJ3NyYy9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLnRzJyxcbiAgICByZWFzb246ICdTZWN1cmVZYW1sUGFyc2VyIGlzIHRoZSBzZWN1cml0eSB3cmFwcGVyIHRoYXQgdmFsaWRhdGVzIFlBTUwgYmVmb3JlIHBhcnNpbmcnXG4gIH0sXG4gIFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNlY3VyaXR5IFJ1bGUgRGVmaW5pdGlvbiBGaWxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHtcbiAgICBydWxlOiAnT1dBU1AtQTAzLTAwNCcsXG4gICAgZmlsZTogJ3NyYy9zZWN1cml0eS9hdWRpdC9ydWxlcy9TZWN1cml0eVJ1bGVzLnRzJyxcbiAgICByZWFzb246ICdUaGlzIGlzIGEgcmVnZXggcGF0dGVybiBkZWZpbml0aW9uIGZvciBkZXRlY3RpbmcgaW5uZXJIVE1MIHVzYWdlLCBub3QgYWN0dWFsIHVzYWdlJ1xuICB9LFxuICBcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQZXJzb25hIExvYWRpbmcgRmFsc2UgUG9zaXRpdmVzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAge1xuICAgIHJ1bGU6ICdETUNQLVNFQy0wMDEnLFxuICAgIGZpbGU6ICdzcmMvcGVyc29uYS9QZXJzb25hTG9hZGVyLnRzJyxcbiAgICByZWFzb246ICdQZXJzb25hTG9hZGVyIHZhbGlkYXRlcyBwZXJzb25hcyB0aHJvdWdoIFNlY3VyZVlhbWxQYXJzZXIgYW5kIENvbnRlbnRWYWxpZGF0b3InXG4gIH0sXG4gIFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVuaWNvZGUgTm9ybWFsaXphdGlvbiBGYWxzZSBQb3NpdGl2ZXNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy90eXBlcy8qLnRzJyxcbiAgICByZWFzb246ICdUeXBlIGRlZmluaXRpb24gZmlsZXMgZG8gbm90IHByb2Nlc3MgdXNlciBpbnB1dCdcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICdETUNQLVNFQy0wMDQnLFxuICAgIGZpbGU6ICdzcmMvdHlwZXMvZWxlbWVudHMvKi50cycsXG4gICAgcmVhc29uOiAnRWxlbWVudCBpbnRlcmZhY2UgZmlsZXMgYXJlIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBkbyBub3QgcHJvY2VzcyB1c2VyIGlucHV0J1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy9lcnJvcnMvKi50cycsXG4gICAgcmVhc29uOiAnRXJyb3IgY2xhc3NlcyBkbyBub3QgcHJvY2VzcyB1c2VyIGlucHV0J1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy9jb25maWcvKi50cycsXG4gICAgcmVhc29uOiAnQ29uZmlndXJhdGlvbiBmaWxlcyBkbyBub3QgcHJvY2VzcyB1c2VyIGlucHV0IGRpcmVjdGx5J1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy9jb25zdGFudHMvKi50cycsXG4gICAgcmVhc29uOiAnQ29uc3RhbnQgZGVmaW5pdGlvbiBmaWxlcyBkbyBub3QgcHJvY2VzcyB1c2VyIGlucHV0J1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy91dGlscy92ZXJzaW9uLnRzJyxcbiAgICByZWFzb246ICdWZXJzaW9uIHV0aWxpdHkgb25seSBoYW5kbGVzIGludGVybmFsIHZlcnNpb24gc3RyaW5ncywgbm90IHVzZXIgaW5wdXQnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA0JyxcbiAgICBmaWxlOiAnc3JjL2NhY2hlLyoudHMnLFxuICAgIHJlYXNvbjogJ0NhY2hlIGxheWVyIHJlY2VpdmVzIGFscmVhZHktbm9ybWFsaXplZCBpbnB1dCdcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICdETUNQLVNFQy0wMDQnLFxuICAgIGZpbGU6ICdzcmMvc2VjdXJpdHkvKiovKi50cycsXG4gICAgcmVhc29uOiAnU2VjdXJpdHkgbW9kdWxlcyBoYW5kbGUgdmFsaWRhdGlvbiBhbmQgbm9ybWFsaXphdGlvbiB0aGVtc2VsdmVzJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy9pbmRleC50cycsXG4gICAgcmVhc29uOiAnTWFpbiBlbnRyeSBwb2ludCBkZWxlZ2F0ZXMgdG8gU2VydmVyU2V0dXAgd2hpY2ggbm9ybWFsaXplcyBhbGwgaW5wdXRzJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy9zZXJ2ZXIvU2VydmVyU2V0dXAudHMnLFxuICAgIHJlYXNvbjogJ1RoaXMgaXMgd2hlcmUgVW5pY29kZSBub3JtYWxpemF0aW9uIGlzIGltcGxlbWVudGVkIGZvciBhbGwgdG9vbCBpbnB1dHMnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA0JyxcbiAgICBmaWxlOiAnc3JjL2NvbGxlY3Rpb24vKi50cycsXG4gICAgcmVhc29uOiAnTWFya2V0cGxhY2UgbW9kdWxlcyByZWNlaXZlIG5vcm1hbGl6ZWQgaW5wdXQgZnJvbSB0b29sIGhhbmRsZXJzJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy9jb2xsZWN0aW9uLyoqLyoudHMnLFxuICAgIHJlYXNvbjogJ01hcmtldHBsYWNlIG1vZHVsZXMgcmVjZWl2ZSBub3JtYWxpemVkIGlucHV0IGZyb20gdG9vbCBoYW5kbGVycydcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICdETUNQLVNFQy0wMDQnLFxuICAgIGZpbGU6ICdzcmMvcGVyc29uYS8qLnRzJyxcbiAgICByZWFzb246ICdQZXJzb25hIG1vZHVsZXMgcmVjZWl2ZSBub3JtYWxpemVkIGlucHV0IGZyb20gdG9vbCBoYW5kbGVycydcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICdETUNQLVNFQy0wMDQnLFxuICAgIGZpbGU6ICdzcmMvcGVyc29uYS8qKi8qLnRzJyxcbiAgICByZWFzb246ICdQZXJzb25hIG1vZHVsZXMgcmVjZWl2ZSBub3JtYWxpemVkIGlucHV0IGZyb20gdG9vbCBoYW5kbGVycydcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICdETUNQLVNFQy0wMDQnLFxuICAgIGZpbGU6ICdzcmMvdXBkYXRlLyoudHMnLFxuICAgIHJlYXNvbjogJ1VwZGF0ZSBtb2R1bGVzIHJlY2VpdmUgbm9ybWFsaXplZCBpbnB1dCBmcm9tIHRvb2wgaGFuZGxlcnMnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA0JyxcbiAgICBmaWxlOiAnc3JjL3Rvb2xzLyoudHMnLFxuICAgIHJlYXNvbjogJ1Rvb2wgZmlsZXMgcmVjZWl2ZSBub3JtYWxpemVkIGlucHV0IGZyb20gU2VydmVyU2V0dXAnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA0JyxcbiAgICBmaWxlOiAnc3JjL3NlcnZlci90eXBlcy50cycsXG4gICAgcmVhc29uOiAnVHlwZSBkZWZpbml0aW9uIGZpbGUgZG9lcyBub3QgcHJvY2VzcyB1c2VyIGlucHV0J1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NyYy9zZXJ2ZXIvdG9vbHMvKi50cycsXG4gICAgcmVhc29uOiAnU2VydmVyIHRvb2xzIHJlY2VpdmUgbm9ybWFsaXplZCBpbnB1dCBmcm9tIFNlcnZlclNldHVwJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNCcsXG4gICAgZmlsZTogJ3NjcmlwdHMvKiovKicsXG4gICAgcmVhc29uOiAnQnVpbGQgYW5kIHV0aWxpdHkgc2NyaXB0cyBkbyBub3QgcHJvY2VzcyB1c2VyIGlucHV0J1xuICB9LFxuICBcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBMb2dnaW5nIEZhbHNlIFBvc2l0aXZlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA2JyxcbiAgICBmaWxlOiAnc3JjL3R5cGVzLyoudHMnLFxuICAgIHJlYXNvbjogJ1R5cGUgZGVmaW5pdGlvbiBmaWxlcyBkbyBub3QgcGVyZm9ybSBzZWN1cml0eSBvcGVyYXRpb25zJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJ3NyYy90eXBlcy9lbGVtZW50cy8qLnRzJyxcbiAgICByZWFzb246ICdFbGVtZW50IGludGVyZmFjZSBmaWxlcyBhcmUgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGRvIG5vdCBwZXJmb3JtIHNlY3VyaXR5IG9wZXJhdGlvbnMnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA2JyxcbiAgICBmaWxlOiAnc3JjL2NvbnN0YW50cy8qLnRzJyxcbiAgICByZWFzb246ICdDb25zdGFudCBmaWxlcyBkbyBub3QgcGVyZm9ybSBzZWN1cml0eSBvcGVyYXRpb25zJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJ3NyYy9jb25maWcvKi50cycsXG4gICAgcmVhc29uOiAnQ29uZmlndXJhdGlvbiBmaWxlcyBkbyBub3QgcGVyZm9ybSBzZWN1cml0eSBvcGVyYXRpb25zJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJ3NyYy9lcnJvcnMvKi50cycsXG4gICAgcmVhc29uOiAnRXJyb3IgY2xhc3NlcyBhcmUgbm90IHNlY3VyaXR5IG9wZXJhdGlvbnMgcmVxdWlyaW5nIGF1ZGl0J1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJyoqLyouanNvbicsXG4gICAgcmVhc29uOiAnSlNPTiBmaWxlcyBjYW5ub3QgY29udGFpbiBleGVjdXRhYmxlIGNvZGUnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA2JyxcbiAgICBmaWxlOiAnc3JjL3NlY3VyaXR5LyoqLyoudHMnLFxuICAgIHJlYXNvbjogJ1NlY3VyaXR5IG1vZHVsZXMgYXJlIGluZnJhc3RydWN0dXJlLCBub3Qgb3BlcmF0aW9ucyByZXF1aXJpbmcgYXVkaXQnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA2JyxcbiAgICBmaWxlOiAnc3JjL2NvbGxlY3Rpb24vKi50cycsXG4gICAgcmVhc29uOiAnTWFya2V0cGxhY2Ugb3BlcmF0aW9ucyBhcmUgbm90IHNlY3VyaXR5LXNlbnNpdGl2ZSByZXF1aXJpbmcgYXVkaXQnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA2JyxcbiAgICBmaWxlOiAnc3JjL2NvbGxlY3Rpb24vKiovKi50cycsXG4gICAgcmVhc29uOiAnTWFya2V0cGxhY2Ugb3BlcmF0aW9ucyBhcmUgbm90IHNlY3VyaXR5LXNlbnNpdGl2ZSByZXF1aXJpbmcgYXVkaXQnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnRE1DUC1TRUMtMDA2JyxcbiAgICBmaWxlOiAnc3JjL3BlcnNvbmEvKi50cycsXG4gICAgcmVhc29uOiAnUGVyc29uYSBvcGVyYXRpb25zIGFyZSB2YWxpZGF0ZWQgYXQgZW50cnkgcG9pbnQsIG5vdCBzZWN1cml0eSBvcGVyYXRpb25zJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJ3NyYy9wZXJzb25hLyoqLyoudHMnLFxuICAgIHJlYXNvbjogJ1BlcnNvbmEgb3BlcmF0aW9ucyBhcmUgdmFsaWRhdGVkIGF0IGVudHJ5IHBvaW50LCBub3Qgc2VjdXJpdHkgb3BlcmF0aW9ucydcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICdETUNQLVNFQy0wMDYnLFxuICAgIGZpbGU6ICdzcmMvc2VydmVyL3Rvb2xzLyoqLyoudHMnLFxuICAgIHJlYXNvbjogJ1Rvb2wgaW1wbGVtZW50YXRpb25zIGRlbGVnYXRlIHRvIHNlcnZpY2VzIHRoYXQgaGFuZGxlIHNlY3VyaXR5J1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJ3NyYy9pbmRleC50cycsXG4gICAgcmVhc29uOiAnTWFpbiBlbnRyeSBwb2ludCBkZWxlZ2F0ZXMgc2VjdXJpdHkgb3BlcmF0aW9ucyB0byBzcGVjaWFsaXplZCBtb2R1bGVzJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJ3NyYy91dGlscy8qLnRzJyxcbiAgICByZWFzb246ICdVdGlsaXR5IGZ1bmN0aW9ucyBhcmUgbm90IHNlY3VyaXR5IG9wZXJhdGlvbnMgcmVxdWlyaW5nIGF1ZGl0J1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJ3NyYy91cGRhdGUvKiovKi50cycsXG4gICAgcmVhc29uOiAnVXBkYXRlIHN5c3RlbSBoYXMgaXRzIG93biBsb2dnaW5nIGFuZCBpcyBub3QgYSBkaXJlY3Qgc2VjdXJpdHkgb3BlcmF0aW9uJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJ0RNQ1AtU0VDLTAwNicsXG4gICAgZmlsZTogJ3NyYy9zZXJ2ZXIvdHlwZXMudHMnLFxuICAgIHJlYXNvbjogJ1R5cGUgZGVmaW5pdGlvbiBmaWxlIGRvZXMgbm90IHBlcmZvcm0gb3BlcmF0aW9ucydcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICdETUNQLVNFQy0wMDYnLFxuICAgIGZpbGU6ICdzY3JpcHRzLyoqLyonLFxuICAgIHJlYXNvbjogJ0J1aWxkIHNjcmlwdHMgZG8gbm90IHBlcmZvcm0gcnVudGltZSBzZWN1cml0eSBvcGVyYXRpb25zJ1xuICB9LFxuICBcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb3ZlcmFnZSBSZXBvcnQgRmlsZXNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB7XG4gICAgcnVsZTogJyonLFxuICAgIGZpbGU6ICd0ZXN0L2NvdmVyYWdlLyoqLyonLFxuICAgIHJlYXNvbjogJ0NvdmVyYWdlIHJlcG9ydCBmaWxlcyBhcmUgYXV0by1nZW5lcmF0ZWQgYW5kIG5vdCBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBjb2RlJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJyonLFxuICAgIGZpbGU6ICcqKi9sY292LXJlcG9ydC8qKi8qJyxcbiAgICByZWFzb246ICdMQ09WIGNvdmVyYWdlIHJlcG9ydCBmaWxlcyBhcmUgYXV0by1nZW5lcmF0ZWQgYW5kIG5vdCBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBjb2RlJ1xuICB9LFxuICBcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEb2N1bWVudGF0aW9uIGFuZCBOb24tQ29kZSBGaWxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHtcbiAgICBydWxlOiAnKicsXG4gICAgZmlsZTogJyoqLyoubWQnLFxuICAgIHJlYXNvbjogJ01hcmtkb3duIGRvY3VtZW50YXRpb24gZmlsZXMnXG4gIH0sXG4gIHtcbiAgICBydWxlOiAnKicsXG4gICAgZmlsZTogJ0xJQ0VOU0UnLFxuICAgIHJlYXNvbjogJ0xpY2Vuc2UgZmlsZSdcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICcqJyxcbiAgICBmaWxlOiAnLmdpdGlnbm9yZScsXG4gICAgcmVhc29uOiAnR2l0IGNvbmZpZ3VyYXRpb24gZmlsZSdcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICcqJyxcbiAgICBmaWxlOiAncGFja2FnZS1sb2NrLmpzb24nLFxuICAgIHJlYXNvbjogJ05QTSBsb2NrIGZpbGUgLSBhdXRvLWdlbmVyYXRlZCwgbm8gdXNlciBpbnB1dCBwcm9jZXNzaW5nJ1xuICB9LFxuICB7XG4gICAgcnVsZTogJyonLFxuICAgIGZpbGU6ICcqKi8qLnltbCcsXG4gICAgcmVhc29uOiAnWUFNTCBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBkYXRhLCBub3QgY29kZSdcbiAgfSxcbiAge1xuICAgIHJ1bGU6ICcqJyxcbiAgICBmaWxlOiAnKiovKi55YW1sJyxcbiAgICByZWFzb246ICdZQU1MIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIGRhdGEsIG5vdCBjb2RlJ1xuICB9XG5dO1xuXG4vKipcbiAqIFZhbGlkYXRlIHN1cHByZXNzaW9uIGNvbmZpZ3VyYXRpb24gYXQgc3RhcnR1cFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTdXBwcmVzc2lvbnMoKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlZW5QYXR0ZXJucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBcbiAgZm9yIChjb25zdCBzdXBwcmVzc2lvbiBvZiBzdXBwcmVzc2lvbnMpIHtcbiAgICAvLyBDaGVjayBmb3IgZW1wdHkgcmVhc29uc1xuICAgIGlmICghc3VwcHJlc3Npb24ucmVhc29uIHx8IHN1cHByZXNzaW9uLnJlYXNvbi50cmltKCkubGVuZ3RoIDwgMTApIHtcbiAgICAgIGVycm9ycy5wdXNoKGBTdXBwcmVzc2lvbiBmb3IgJHtzdXBwcmVzc2lvbi5ydWxlfSBoYXMgaW5zdWZmaWNpZW50IHJlYXNvbmApO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgcnVsZSBwYXR0ZXJuc1xuICAgIGNvbnN0IHJ1bGVQYXR0ZXJuID0gL14oRE1DUC1TRUMtXFxkezN9fE9XQVNQLVtBLVpdXFxkezJ9LVxcZHszfXxDV0UtXFxkKy1cXGR7M318XFwqKSQvO1xuICAgIGlmICghc3VwcHJlc3Npb24ucnVsZS5tYXRjaChydWxlUGF0dGVybikpIHtcbiAgICAgIGVycm9ycy5wdXNoKGBJbnZhbGlkIHJ1bGUgcGF0dGVybjogJHtzdXBwcmVzc2lvbi5ydWxlfWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIHN1cHByZXNzaW9uc1xuICAgIGNvbnN0IGtleSA9IGAke3N1cHByZXNzaW9uLnJ1bGV9OiR7c3VwcHJlc3Npb24uZmlsZSB8fCAnKid9YDtcbiAgICBpZiAoc2VlblBhdHRlcm5zLmhhcyhrZXkpKSB7XG4gICAgICBlcnJvcnMucHVzaChgRHVwbGljYXRlIHN1cHByZXNzaW9uOiAke2tleX1gKTtcbiAgICB9XG4gICAgc2VlblBhdHRlcm5zLmFkZChrZXkpO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIGdsb2IgcGF0dGVybnNcbiAgICBpZiAoc3VwcHJlc3Npb24uZmlsZT8uaW5jbHVkZXMoJyoqJykgJiYgIXN1cHByZXNzaW9uLmZpbGUuaW5jbHVkZXMoJyoqLycpKSB7XG4gICAgICBlcnJvcnMucHVzaChgSW52YWxpZCBnbG9iIHBhdHRlcm4gaW4gJHtzdXBwcmVzc2lvbi5maWxlfSAtICoqIG11c3QgYmUgZm9sbG93ZWQgYnkgL2ApO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGdsb2IgcGF0dGVybiB0byByZWdleCBwYXR0ZXJuIHNhZmVseVxuICogVXNpbmcgYSBwcm9wZXIgZ2xvYi10by1yZWdleCBjb252ZXJzaW9uIHRoYXQgaGFuZGxlcyBhbGwgZWRnZSBjYXNlc1xuICovXG5mdW5jdGlvbiBnbG9iVG9SZWdleChnbG9iOiBzdHJpbmcpOiBSZWdFeHAge1xuICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXRSZWdleChnbG9iKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgXG4gIC8vIFNwZWNpYWwgY2FzZTogaWYgZ2xvYiBzdGFydHMgd2l0aCAqLCBpdCBzaG91bGQgbWF0Y2ggYW55dGhpbmcgYXQgdGhlIGJlZ2lubmluZ1xuICBsZXQgcHJvY2Vzc2VkR2xvYiA9IGdsb2I7XG4gIGxldCBwcmVmaXggPSAnJztcbiAgaWYgKGdsb2Iuc3RhcnRzV2l0aCgnKicpICYmICFnbG9iLnN0YXJ0c1dpdGgoJyoqJykpIHtcbiAgICBwcmVmaXggPSAnKD86LiovKT8nOyAgLy8gT3B0aW9uYWwgcGF0aCBwcmVmaXhcbiAgICBwcm9jZXNzZWRHbG9iID0gZ2xvYi5zdWJzdHJpbmcoMSk7XG4gIH1cbiAgXG4gIC8vIEVzY2FwZSBhbGwgcmVnZXggc3BlY2lhbCBjaGFyYWN0ZXJzIGV4Y2VwdCAqIGFuZCAvXG4gIC8vIEZpeGVkOiBQcm9wZXJseSBlc2NhcGUgYmFja3NsYXNoZXMgYW5kIG90aGVyIHNwZWNpYWwgcmVnZXggY2hhcmFjdGVyc1xuICBsZXQgcGF0dGVybiA9IHByb2Nlc3NlZEdsb2IucmVwbGFjZSgvW1xcXFxeJC4oKSs/e31bXFxdfF0vZywgJ1xcXFwkJicpO1xuICBcbiAgLy8gSGFuZGxlIGdsb2IgcGF0dGVybnMgaW4gY29ycmVjdCBvcmRlclxuICAvLyBSZXBsYWNlICoqIGJlZm9yZSAqIHRvIGF2b2lkIGNvbmZsaWN0c1xuICBwYXR0ZXJuID0gcGF0dGVyblxuICAgIC5yZXBsYWNlKC9cXCpcXCovZywgJzw8R0xPQlNUQVI+PicpICAgICAvLyBUZW1wb3JhcnkgcGxhY2Vob2xkZXIgZm9yICoqXG4gICAgLnJlcGxhY2UoL1xcKi9nLCAnPDxTVEFSPj4nKSAgICAgICAgICAgIC8vIFRlbXBvcmFyeSBwbGFjZWhvbGRlciBmb3IgKlxuICAgIC5yZXBsYWNlKC88PEdMT0JTVEFSPj5cXC8vZywgJyg/Oi4qLyk/JykgLy8gKiovIG1hdGNoZXMgYW55IG51bWJlciBvZiBkaXJlY3RvcmllcyBpbmNsdWRpbmcgbm9uZVxuICAgIC5yZXBsYWNlKC88PEdMT0JTVEFSPj4vZywgJy4qJykgICAgICAgLy8gKiogbWF0Y2hlcyBhbnl0aGluZ1xuICAgIC5yZXBsYWNlKC88PFNUQVI+Pi9nLCAnW14vXSonKSAgICAgICAgLy8gKiBtYXRjaGVzIGFueXRoaW5nIGV4Y2VwdCBkaXJlY3Rvcnkgc2VwYXJhdG9yXG4gICAgLnJlcGxhY2UoL1xcLy9nLCAnXFxcXC8nKTsgICAgICAgICAgICAgICAgLy8gRXNjYXBlIGZvcndhcmQgc2xhc2hlc1xuICBcbiAgLy8gQ29tYmluZSBwcmVmaXggYW5kIHBhdHRlcm5cbiAgY29uc3QgZnVsbFBhdHRlcm4gPSBwcmVmaXggKyBwYXR0ZXJuO1xuICBcbiAgLy8gQWRkIGFuY2hvcnMgdG8gZW5zdXJlIGZ1bGwgcGF0aCBtYXRjaFxuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke2Z1bGxQYXR0ZXJufSRgKTtcbiAgXG4gIC8vIENhY2hlIHRoZSBjb21waWxlZCByZWdleFxuICBjYWNoZS5zZXRSZWdleChnbG9iLCByZWdleCk7XG4gIFxuICByZXR1cm4gcmVnZXg7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGZpbGUgcGF0aCBmb3IgY29uc2lzdGVudCBtYXRjaGluZ1xuICogSGFuZGxlcyBib3RoIGFic29sdXRlIGFuZCByZWxhdGl2ZSBwYXRocyBhY3Jvc3MgZGlmZmVyZW50IHBsYXRmb3Jtc1xuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBDb252ZXJ0IGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcyBmb3IgV2luZG93cyBwYXRoc1xuICBsZXQgbm9ybWFsaXplZCA9IGZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgXG4gIC8vIFJlbW92ZSBkdXBsaWNhdGUgc2xhc2hlc1xuICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKC9cXC8rL2csICcvJyk7XG4gIFxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2ggaWYgcHJlc2VudFxuICBpZiAobm9ybWFsaXplZC5lbmRzV2l0aCgnLycpICYmIG5vcm1hbGl6ZWQubGVuZ3RoID4gMSkge1xuICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnNsaWNlKDAsIC0xKTtcbiAgfVxuICBcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCByZWxhdGl2ZSBwYXRoIGZyb20gYWJzb2x1dGUgcGF0aFxuICogSGFuZGxlcyB2YXJpb3VzIENJL0NEIGFuZCBsb2NhbCBkZXZlbG9wbWVudCBwYXRoIGZvcm1hdHNcbiAqL1xuZnVuY3Rpb24gZ2V0UmVsYXRpdmVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgXG4gIC8vIElmIGFscmVhZHkgYSByZWxhdGl2ZSBwYXRoLCByZXR1cm4gYXMtaXNcbiAgaWYgKCFub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSAmJiAhbm9ybWFsaXplZC5tYXRjaCgvXltBLVpdOi9pKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG4gIFxuICAvLyBEZWZpbmUgY29tbW9uIHByb2plY3Qgc291cmNlIGRpcmVjdG9yaWVzXG4gIGNvbnN0IHByb2plY3REaXJzID0gWydzcmMvJywgJ19fdGVzdHNfXy8nLCAnc2NyaXB0cy8nLCAnZG9jcy8nLCAndGVzdC8nLCAndGVzdHMvJywgJ2xpYi8nXTtcbiAgXG4gIC8vIEZpbmQgdGhlIHBvc2l0aW9uIG9mIGNvbW1vbiBwcm9qZWN0IGRpcmVjdG9yaWVzIGluIHRoZSBwYXRoXG4gIGxldCBiZXN0TWF0Y2ggPSB7IGluZGV4OiAtMSwgZGlyOiAnJywgcmVsYXRpdmVQYXRoOiAnJyB9O1xuICBcbiAgZm9yIChjb25zdCBkaXIgb2YgcHJvamVjdERpcnMpIHtcbiAgICAvLyBMb29rIGZvciAvZGlyIHBhdHRlcm4gKHdpdGggbGVhZGluZyBzbGFzaCB0byBhdm9pZCBmYWxzZSBtYXRjaGVzKVxuICAgIGNvbnN0IHNlYXJjaFBhdHRlcm4gPSBgLyR7ZGlyfWA7XG4gICAgY29uc3QgaW5kZXggPSBub3JtYWxpemVkLmxhc3RJbmRleE9mKHNlYXJjaFBhdHRlcm4pO1xuICAgIFxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAvLyBFeHRyYWN0IGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIHBhcmVudCBvZiB0aGlzIGRpcmVjdG9yeVxuICAgICAgLy8gRm9yIGV4YW1wbGU6IC9ob21lL3VzZXIvcHJvamVjdC9zcmMvZmlsZS50cyAtPiBzcmMvZmlsZS50c1xuICAgICAgY29uc3QgZGlyU3RhcnRJbmRleCA9IGluZGV4ICsgMTsgLy8gU2tpcCB0aGUgbGVhZGluZyBzbGFzaFxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoZGlyU3RhcnRJbmRleCk7XG4gICAgICBcbiAgICAgIC8vIFZlcmlmeSB0aGlzIGxvb2tzIGxpa2UgYSB2YWxpZCBwcm9qZWN0IGZpbGVcbiAgICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChkaXIpICYmIHJlbGF0aXZlUGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIG1hdGNoIHRoYXQgYXBwZWFycyBsYXRlc3QgaW4gdGhlIHBhdGggKG1vc3Qgc3BlY2lmaWMpXG4gICAgICAgIGlmIChpbmRleCA+IGJlc3RNYXRjaC5pbmRleCkge1xuICAgICAgICAgIGJlc3RNYXRjaCA9IHsgaW5kZXgsIGRpciwgcmVsYXRpdmVQYXRoIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8vIElmIHdlIGZvdW5kIGEgbWF0Y2gsIHJldHVybiBpdFxuICBpZiAoYmVzdE1hdGNoLmluZGV4ID49IDApIHtcbiAgICByZXR1cm4gYmVzdE1hdGNoLnJlbGF0aXZlUGF0aDtcbiAgfVxuICBcbiAgLy8gRmFsbGJhY2s6IFRyeSB0byBmaW5kIGNvbW1vbiBmaWxlIHBhdHRlcm5zIHRoYXQgaW5kaWNhdGUgcHJvamVjdCBmaWxlc1xuICBjb25zdCBmaWxlUGF0dGVybnMgPSBbXG4gICAgL1xcLyhzcmN8X190ZXN0c19ffHNjcmlwdHN8dGVzdHx0ZXN0c3xsaWIpXFwvLipcXC5banRdc3g/JC8sXG4gICAgL1xcLyhzcmN8X190ZXN0c19ffHNjcmlwdHN8dGVzdHx0ZXN0c3xsaWIpXFwvLipcXC5qc29uJC8sXG4gICAgL1xcLyhzcmN8X190ZXN0c19ffHNjcmlwdHN8dGVzdHx0ZXN0c3xsaWIpXFwvLipcXC55YT9tbCQvLFxuICAgIC9cXC9wYWNrYWdlXFwuanNvbiQvLFxuICAgIC9cXC9wYWNrYWdlLWxvY2tcXC5qc29uJC8sXG4gICAgL1xcL3RzY29uZmlnLipcXC5qc29uJC8sXG4gICAgL1xcL1xcLi4qcmNcXC5qc29uJC8gIC8vIC5lc2xpbnRyYy5qc29uLCBldGMuXG4gIF07XG4gIFxuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgZmlsZVBhdHRlcm5zKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBub3JtYWxpemVkLm1hdGNoKHBhdHRlcm4pO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgLy8gRmluZCB3aGVyZSB0aGUgbWF0Y2ggc3RhcnRzIGFuZCBleHRyYWN0IGZyb20gdGhlcmVcbiAgICAgIGNvbnN0IG1hdGNoSW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YobWF0Y2hbMF0pO1xuICAgICAgaWYgKG1hdGNoSW5kZXggPj0gMCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZC5zdWJzdHJpbmcobWF0Y2hJbmRleCArIDEpOyAvLyBTa2lwIGxlYWRpbmcgL1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLy8gTGFzdCByZXNvcnQ6IGlmIHBhdGggY29udGFpbnMgY29tbW9uIGV4dGVuc2lvbnMsIHRyeSB0byBleHRyYWN0IGEgcmVhc29uYWJsZSByZWxhdGl2ZSBwYXRoXG4gIGlmIChub3JtYWxpemVkLm1hdGNoKC9cXC4odHN8anN8dHN4fGpzeHxqc29ufHlhbWx8eW1sKSQvKSkge1xuICAgIC8vIEZpbmQgdGhlIGxhc3Qgc2VnbWVudCB0aGF0IGxvb2tzIGxpa2UgYSBwcm9qZWN0IGRpcmVjdG9yeVxuICAgIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplZC5zcGxpdCgnLycpO1xuICAgIGZvciAobGV0IGkgPSBzZWdtZW50cy5sZW5ndGggLSAyOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHByb2plY3REaXJzLnNvbWUoZGlyID0+IGRpci5zdGFydHNXaXRoKHNlZ21lbnRzW2ldKSkpIHtcbiAgICAgICAgcmV0dXJuIHNlZ21lbnRzLnNsaWNlKGkpLmpvaW4oJy8nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRm9yIHJvb3QtbGV2ZWwgZmlsZXMgbGlrZSBwYWNrYWdlLWxvY2suanNvbiwganVzdCByZXR1cm4gdGhlIGZpbGVuYW1lXG4gICAgY29uc3QgZmlsZW5hbWUgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoZmlsZW5hbWUgJiYgZmlsZW5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgcmV0dXJuIGZpbGVuYW1lO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIHBhdGggaWYgd2UgY2FuJ3QgZXh0cmFjdCByZWxhdGl2ZVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGZpbmRpbmcgc2hvdWxkIGJlIHN1cHByZXNzZWRcbiAqIE9wdGltaXplZCB3aXRoIGNhY2hpbmcgYW5kIGVhcmx5IHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzKHJ1bGVJZDogc3RyaW5nLCBmaWxlUGF0aD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWZpbGVQYXRoKSByZXR1cm4gZmFsc2U7XG4gIFxuICAvLyBOb3JtYWxpemUgcGF0aHMgZm9yIGNvbnNpc3RlbnQgbWF0Y2hpbmdcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKGZpbGVQYXRoKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRoKG5vcm1hbGl6ZWRQYXRoKTtcbiAgXG4gIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gIGNvbnN0IGNhY2hlS2V5ID0gYCR7cnVsZUlkfTo6JHtyZWxhdGl2ZVBhdGh9YDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KHJ1bGVJZCwgcmVsYXRpdmVQYXRoKTtcbiAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICBcbiAgLy8gUHJvY2VzcyBzdXBwcmVzc2lvbnMgd2l0aCBlYXJseSByZXR1cm5zXG4gIGZvciAoY29uc3Qgc3VwcHJlc3Npb24gb2Ygc3VwcHJlc3Npb25zKSB7XG4gICAgLy8gU2tpcCBpZiBydWxlIGRvZXNuJ3QgbWF0Y2hcbiAgICBpZiAoc3VwcHJlc3Npb24ucnVsZSAhPT0gJyonICYmIHN1cHByZXNzaW9uLnJ1bGUgIT09IHJ1bGVJZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIFxuICAgIC8vIEhhbmRsZSBnbG9iYWwgc3VwcHJlc3Npb25zIChubyBmaWxlIHNwZWNpZmllZClcbiAgICBpZiAoIXN1cHByZXNzaW9uLmZpbGUpIHtcbiAgICAgIGNhY2hlLnNldChydWxlSWQsIHJlbGF0aXZlUGF0aCwgdHJ1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZXhhY3QgZmlsZSBtYXRjaCAobW9zdCBjb21tb24gY2FzZSlcbiAgICBpZiAoc3VwcHJlc3Npb24uZmlsZSA9PT0gcmVsYXRpdmVQYXRoIHx8IHN1cHByZXNzaW9uLmZpbGUgPT09IG5vcm1hbGl6ZWRQYXRoKSB7XG4gICAgICBjYWNoZS5zZXQocnVsZUlkLCByZWxhdGl2ZVBhdGgsIHRydWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIHBhdHRlcm4gbWF0Y2ggb25seSBpZiBmaWxlIGNvbnRhaW5zIHdpbGRjYXJkc1xuICAgIGlmIChzdXBwcmVzc2lvbi5maWxlLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gZ2xvYlRvUmVnZXgoc3VwcHJlc3Npb24uZmlsZSk7XG4gICAgICAgIGlmIChyZWdleC50ZXN0KHJlbGF0aXZlUGF0aCkgfHwgcmVnZXgudGVzdChub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICBjYWNoZS5zZXQocnVsZUlkLCByZWxhdGl2ZVBhdGgsIHRydWUpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIHN1cHByZXNzaW9uIHBhdHRlcm4gXCIke3N1cHByZXNzaW9uLmZpbGV9XCI6YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLy8gTm90IHN1cHByZXNzZWRcbiAgY2FjaGUuc2V0KHJ1bGVJZCwgcmVsYXRpdmVQYXRoLCBmYWxzZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDbGVhciBzdXBwcmVzc2lvbiBjYWNoZSAodXNlZnVsIGZvciB0ZXN0aW5nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJTdXBwcmVzc2lvbkNhY2hlKCk6IHZvaWQge1xuICBjYWNoZS5jbGVhcigpO1xufVxuXG4vKipcbiAqIEdldCBzdXBwcmVzc2lvbiBzdGF0aXN0aWNzIGZvciByZXBvcnRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN1cHByZXNzaW9uU3RhdHMoKTogeyBcbiAgdG90YWw6IG51bWJlcjsgXG4gIGJ5UnVsZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgYnlDYXRlZ29yeTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbn0ge1xuICBjb25zdCBzdGF0cyA9IHtcbiAgICB0b3RhbDogc3VwcHJlc3Npb25zLmxlbmd0aCxcbiAgICBieVJ1bGU6IHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICAgYnlDYXRlZ29yeToge30gYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuICB9O1xuICBcbiAgZm9yIChjb25zdCBzdXBwcmVzc2lvbiBvZiBzdXBwcmVzc2lvbnMpIHtcbiAgICAvLyBDb3VudCBieSBydWxlXG4gICAgc3RhdHMuYnlSdWxlW3N1cHByZXNzaW9uLnJ1bGVdID0gKHN0YXRzLmJ5UnVsZVtzdXBwcmVzc2lvbi5ydWxlXSB8fCAwKSArIDE7XG4gICAgXG4gICAgLy8gQ291bnQgYnkgY2F0ZWdvcnkgKGV4dHJhY3QgZnJvbSBydWxlIHByZWZpeClcbiAgICBjb25zdCBjYXRlZ29yeSA9IHN1cHByZXNzaW9uLnJ1bGUuc3BsaXQoJy0nKVswXTtcbiAgICBzdGF0cy5ieUNhdGVnb3J5W2NhdGVnb3J5XSA9IChzdGF0cy5ieUNhdGVnb3J5W2NhdGVnb3J5XSB8fCAwKSArIDE7XG4gIH1cbiAgXG4gIHJldHVybiBzdGF0cztcbn1cblxuLy8gVmFsaWRhdGUgc3VwcHJlc3Npb25zIG9uIG1vZHVsZSBsb2FkXG5jb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVTdXBwcmVzc2lvbnMoKTtcbmlmICh2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgY29uc29sZS53YXJuKCdTdXBwcmVzc2lvbiBjb25maWd1cmF0aW9uIHdhcm5pbmdzOicsIHZhbGlkYXRpb25FcnJvcnMpO1xufSJdfQ==