@dollhousemcp/mcp-server 1.4.2 → 1.4.4

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 +68 -0
  2. package/README.md +49 -6
  3. package/dist/collection/MarketplaceBrowser.d.ts +24 -0
  4. package/dist/collection/MarketplaceBrowser.d.ts.map +1 -0
  5. package/dist/collection/MarketplaceBrowser.js +115 -0
  6. package/dist/collection/MarketplaceSearch.d.ts +18 -0
  7. package/dist/collection/MarketplaceSearch.d.ts.map +1 -0
  8. package/dist/collection/MarketplaceSearch.js +48 -0
  9. package/dist/collection/PersonaInstaller.d.ts +26 -0
  10. package/dist/collection/PersonaInstaller.d.ts.map +1 -0
  11. package/dist/collection/PersonaInstaller.js +103 -0
  12. package/dist/elements/ensembles/Ensemble.d.ts +144 -0
  13. package/dist/elements/ensembles/Ensemble.d.ts.map +1 -0
  14. package/dist/elements/ensembles/Ensemble.js +860 -0
  15. package/dist/elements/ensembles/EnsembleManager.d.ts +85 -0
  16. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -0
  17. package/dist/elements/ensembles/EnsembleManager.js +378 -0
  18. package/dist/elements/ensembles/constants.d.ts +73 -0
  19. package/dist/elements/ensembles/constants.d.ts.map +1 -0
  20. package/dist/elements/ensembles/constants.js +92 -0
  21. package/dist/elements/ensembles/index.d.ts +8 -0
  22. package/dist/elements/ensembles/index.d.ts.map +1 -0
  23. package/dist/elements/ensembles/index.js +8 -0
  24. package/dist/elements/ensembles/types.d.ts +92 -0
  25. package/dist/elements/ensembles/types.d.ts.map +1 -0
  26. package/dist/elements/ensembles/types.js +8 -0
  27. package/dist/elements/memories/Memory.d.ts +110 -0
  28. package/dist/elements/memories/Memory.d.ts.map +1 -0
  29. package/dist/elements/memories/Memory.js +470 -0
  30. package/dist/elements/memories/MemoryManager.d.ts +86 -0
  31. package/dist/elements/memories/MemoryManager.d.ts.map +1 -0
  32. package/dist/elements/memories/MemoryManager.js +435 -0
  33. package/dist/elements/memories/constants.d.ts +42 -0
  34. package/dist/elements/memories/constants.d.ts.map +1 -0
  35. package/dist/elements/memories/constants.js +49 -0
  36. package/dist/elements/memories/index.d.ts +6 -0
  37. package/dist/elements/memories/index.d.ts.map +1 -0
  38. package/dist/elements/memories/index.js +6 -0
  39. package/dist/generated/version.d.ts +2 -2
  40. package/dist/generated/version.js +3 -3
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +71 -10
  44. package/dist/marketplace/GitHubClient.d.ts +22 -0
  45. package/dist/marketplace/GitHubClient.d.ts.map +1 -0
  46. package/dist/marketplace/GitHubClient.js +112 -0
  47. package/dist/marketplace/MarketplaceBrowser.d.ts +24 -0
  48. package/dist/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  49. package/dist/marketplace/MarketplaceBrowser.js +115 -0
  50. package/dist/marketplace/MarketplaceSearch.d.ts +18 -0
  51. package/dist/marketplace/MarketplaceSearch.d.ts.map +1 -0
  52. package/dist/marketplace/MarketplaceSearch.js +48 -0
  53. package/dist/marketplace/PersonaDetails.d.ts +22 -0
  54. package/dist/marketplace/PersonaDetails.d.ts.map +1 -0
  55. package/dist/marketplace/PersonaDetails.js +71 -0
  56. package/dist/marketplace/PersonaInstaller.d.ts +25 -0
  57. package/dist/marketplace/PersonaInstaller.d.ts.map +1 -0
  58. package/dist/marketplace/PersonaInstaller.js +100 -0
  59. package/dist/marketplace/PersonaSubmitter.d.ts +19 -0
  60. package/dist/marketplace/PersonaSubmitter.d.ts.map +1 -0
  61. package/dist/marketplace/PersonaSubmitter.js +57 -0
  62. package/dist/marketplace/index.d.ts +10 -0
  63. package/dist/marketplace/index.d.ts.map +1 -0
  64. package/dist/marketplace/index.js +10 -0
  65. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  66. package/dist/portfolio/DefaultElementProvider.js +8 -20
  67. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  68. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  69. package/dist/portfolio/PortfolioManager.js +78 -2
  70. package/dist/portfolio/types.d.ts +6 -6
  71. package/dist/portfolio/types.d.ts.map +1 -1
  72. package/dist/portfolio/types.js +7 -7
  73. package/dist/security/securityMonitor.d.ts +1 -1
  74. package/dist/security/securityMonitor.d.ts.map +1 -1
  75. package/dist/security/securityMonitor.js +1 -1
  76. package/dist/server/tools/MarketplaceTools.d.ts +10 -0
  77. package/dist/server/tools/MarketplaceTools.d.ts.map +1 -0
  78. package/dist/server/tools/MarketplaceTools.js +96 -0
  79. package/dist/src/cache/APICache.d.ts +23 -0
  80. package/dist/src/cache/APICache.d.ts.map +1 -0
  81. package/dist/src/cache/APICache.js +42 -0
  82. package/dist/src/cache/index.d.ts +5 -0
  83. package/dist/src/cache/index.d.ts.map +1 -0
  84. package/dist/src/cache/index.js +5 -0
  85. package/dist/src/config/constants.d.ts +25 -0
  86. package/dist/src/config/constants.d.ts.map +1 -0
  87. package/dist/src/config/constants.js +30 -0
  88. package/dist/src/config/index.d.ts +6 -0
  89. package/dist/src/config/index.d.ts.map +1 -0
  90. package/dist/src/config/index.js +6 -0
  91. package/dist/src/config/indicator-config.d.ts +107 -0
  92. package/dist/src/config/indicator-config.d.ts.map +1 -0
  93. package/dist/src/config/indicator-config.js +158 -0
  94. package/dist/src/constants/defaultPersonas.d.ts +10 -0
  95. package/dist/src/constants/defaultPersonas.d.ts.map +1 -0
  96. package/dist/src/constants/defaultPersonas.js +18 -0
  97. package/dist/src/constants/limits.d.ts +10 -0
  98. package/dist/src/constants/limits.d.ts.map +1 -0
  99. package/dist/src/constants/limits.js +13 -0
  100. package/dist/src/errors/SecurityError.d.ts +29 -0
  101. package/dist/src/errors/SecurityError.d.ts.map +1 -0
  102. package/dist/src/errors/SecurityError.js +47 -0
  103. package/dist/src/errors/index.d.ts +2 -0
  104. package/dist/src/errors/index.d.ts.map +1 -0
  105. package/dist/src/errors/index.js +2 -0
  106. package/dist/src/index.barrel.d.ts +21 -0
  107. package/dist/src/index.barrel.d.ts.map +1 -0
  108. package/dist/src/index.barrel.js +31 -0
  109. package/dist/src/index.d.ts +220 -0
  110. package/dist/src/index.d.ts.map +1 -0
  111. package/dist/src/index.js +1559 -0
  112. package/dist/src/marketplace/GitHubClient.d.ts +22 -0
  113. package/dist/src/marketplace/GitHubClient.d.ts.map +1 -0
  114. package/dist/src/marketplace/GitHubClient.js +112 -0
  115. package/dist/src/marketplace/MarketplaceBrowser.d.ts +21 -0
  116. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  117. package/dist/src/marketplace/MarketplaceBrowser.js +45 -0
  118. package/dist/src/marketplace/MarketplaceSearch.d.ts +18 -0
  119. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
  120. package/dist/src/marketplace/MarketplaceSearch.js +36 -0
  121. package/dist/src/marketplace/PersonaDetails.d.ts +22 -0
  122. package/dist/src/marketplace/PersonaDetails.d.ts.map +1 -0
  123. package/dist/src/marketplace/PersonaDetails.js +71 -0
  124. package/dist/src/marketplace/PersonaInstaller.d.ts +25 -0
  125. package/dist/src/marketplace/PersonaInstaller.d.ts.map +1 -0
  126. package/dist/src/marketplace/PersonaInstaller.js +100 -0
  127. package/dist/src/marketplace/PersonaSubmitter.d.ts +19 -0
  128. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
  129. package/dist/src/marketplace/PersonaSubmitter.js +57 -0
  130. package/dist/src/marketplace/index.d.ts +10 -0
  131. package/dist/src/marketplace/index.d.ts.map +1 -0
  132. package/dist/src/marketplace/index.js +10 -0
  133. package/dist/src/persona/PersonaLoader.d.ts +33 -0
  134. package/dist/src/persona/PersonaLoader.d.ts.map +1 -0
  135. package/dist/src/persona/PersonaLoader.js +139 -0
  136. package/dist/src/persona/PersonaManager.d.ts +112 -0
  137. package/dist/src/persona/PersonaManager.d.ts.map +1 -0
  138. package/dist/src/persona/PersonaManager.js +341 -0
  139. package/dist/src/persona/PersonaValidator.d.ts +33 -0
  140. package/dist/src/persona/PersonaValidator.d.ts.map +1 -0
  141. package/dist/src/persona/PersonaValidator.js +157 -0
  142. package/dist/src/persona/export-import/PersonaExporter.d.ts +43 -0
  143. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
  144. package/dist/src/persona/export-import/PersonaExporter.js +99 -0
  145. package/dist/src/persona/export-import/PersonaImporter.d.ts +65 -0
  146. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
  147. package/dist/src/persona/export-import/PersonaImporter.js +313 -0
  148. package/dist/src/persona/export-import/PersonaSharer.d.ts +60 -0
  149. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
  150. package/dist/src/persona/export-import/PersonaSharer.js +363 -0
  151. package/dist/src/persona/export-import/index.d.ts +10 -0
  152. package/dist/src/persona/export-import/index.d.ts.map +1 -0
  153. package/dist/src/persona/export-import/index.js +7 -0
  154. package/dist/src/persona/index.d.ts +7 -0
  155. package/dist/src/persona/index.d.ts.map +1 -0
  156. package/dist/src/persona/index.js +7 -0
  157. package/dist/src/security/InputValidator.d.ts +69 -0
  158. package/dist/src/security/InputValidator.d.ts.map +1 -0
  159. package/dist/src/security/InputValidator.js +381 -0
  160. package/dist/src/security/commandValidator.d.ts +7 -0
  161. package/dist/src/security/commandValidator.d.ts.map +1 -0
  162. package/dist/src/security/commandValidator.js +77 -0
  163. package/dist/src/security/constants.d.ts +21 -0
  164. package/dist/src/security/constants.d.ts.map +1 -0
  165. package/dist/src/security/constants.js +23 -0
  166. package/dist/src/security/contentValidator.d.ts +47 -0
  167. package/dist/src/security/contentValidator.d.ts.map +1 -0
  168. package/dist/src/security/contentValidator.js +188 -0
  169. package/dist/src/security/fileLockManager.d.ts +70 -0
  170. package/dist/src/security/fileLockManager.d.ts.map +1 -0
  171. package/dist/src/security/fileLockManager.js +187 -0
  172. package/dist/src/security/index.d.ts +12 -0
  173. package/dist/src/security/index.d.ts.map +1 -0
  174. package/dist/src/security/index.js +14 -0
  175. package/dist/src/security/pathValidator.d.ts +9 -0
  176. package/dist/src/security/pathValidator.d.ts.map +1 -0
  177. package/dist/src/security/pathValidator.js +97 -0
  178. package/dist/src/security/secureYamlParser.d.ts +46 -0
  179. package/dist/src/security/secureYamlParser.d.ts.map +1 -0
  180. package/dist/src/security/secureYamlParser.js +203 -0
  181. package/dist/src/security/securityMonitor.d.ts +58 -0
  182. package/dist/src/security/securityMonitor.d.ts.map +1 -0
  183. package/dist/src/security/securityMonitor.js +108 -0
  184. package/dist/src/security/tokenManager.d.ts +59 -0
  185. package/dist/src/security/tokenManager.d.ts.map +1 -0
  186. package/dist/src/security/tokenManager.js +216 -0
  187. package/dist/src/security/yamlValidator.d.ts +20 -0
  188. package/dist/src/security/yamlValidator.d.ts.map +1 -0
  189. package/dist/src/security/yamlValidator.js +138 -0
  190. package/dist/src/server/ServerSetup.d.ts +31 -0
  191. package/dist/src/server/ServerSetup.d.ts.map +1 -0
  192. package/dist/src/server/ServerSetup.js +79 -0
  193. package/dist/src/server/index.d.ts +7 -0
  194. package/dist/src/server/index.d.ts.map +1 -0
  195. package/dist/src/server/index.js +7 -0
  196. package/dist/src/server/tools/ConfigTools.d.ts +10 -0
  197. package/dist/src/server/tools/ConfigTools.d.ts.map +1 -0
  198. package/dist/src/server/tools/ConfigTools.js +63 -0
  199. package/dist/src/server/tools/MarketplaceTools.d.ts +10 -0
  200. package/dist/src/server/tools/MarketplaceTools.d.ts.map +1 -0
  201. package/dist/src/server/tools/MarketplaceTools.js +92 -0
  202. package/dist/src/server/tools/PersonaTools.d.ts +10 -0
  203. package/dist/src/server/tools/PersonaTools.d.ts.map +1 -0
  204. package/dist/src/server/tools/PersonaTools.js +257 -0
  205. package/dist/src/server/tools/ToolRegistry.d.ts +37 -0
  206. package/dist/src/server/tools/ToolRegistry.d.ts.map +1 -0
  207. package/dist/src/server/tools/ToolRegistry.js +40 -0
  208. package/dist/src/server/tools/UpdateTools.d.ts +10 -0
  209. package/dist/src/server/tools/UpdateTools.d.ts.map +1 -0
  210. package/dist/src/server/tools/UpdateTools.js +64 -0
  211. package/dist/src/server/tools/UserTools.d.ts +10 -0
  212. package/dist/src/server/tools/UserTools.d.ts.map +1 -0
  213. package/dist/src/server/tools/UserTools.js +51 -0
  214. package/dist/src/server/tools/index.d.ts +10 -0
  215. package/dist/src/server/tools/index.d.ts.map +1 -0
  216. package/dist/src/server/tools/index.js +10 -0
  217. package/dist/src/server/types.d.ts +34 -0
  218. package/dist/src/server/types.d.ts.map +1 -0
  219. package/dist/src/server/types.js +5 -0
  220. package/dist/src/tools/debug.d.ts +20 -0
  221. package/dist/src/tools/debug.d.ts.map +1 -0
  222. package/dist/src/tools/debug.js +37 -0
  223. package/dist/src/types/cache.d.ts +8 -0
  224. package/dist/src/types/cache.d.ts.map +1 -0
  225. package/dist/src/types/cache.js +5 -0
  226. package/dist/src/types/index.d.ts +8 -0
  227. package/dist/src/types/index.d.ts.map +1 -0
  228. package/dist/src/types/index.js +8 -0
  229. package/dist/src/types/marketplace.d.ts +23 -0
  230. package/dist/src/types/marketplace.d.ts.map +1 -0
  231. package/dist/src/types/marketplace.js +5 -0
  232. package/dist/src/types/mcp.d.ts +161 -0
  233. package/dist/src/types/mcp.d.ts.map +1 -0
  234. package/dist/src/types/mcp.js +75 -0
  235. package/dist/src/types/persona.d.ts +30 -0
  236. package/dist/src/types/persona.d.ts.map +1 -0
  237. package/dist/src/types/persona.js +5 -0
  238. package/dist/src/update/BackupManager.d.ts +46 -0
  239. package/dist/src/update/BackupManager.d.ts.map +1 -0
  240. package/dist/src/update/BackupManager.js +261 -0
  241. package/dist/src/update/DependencyChecker.d.ts +41 -0
  242. package/dist/src/update/DependencyChecker.d.ts.map +1 -0
  243. package/dist/src/update/DependencyChecker.js +132 -0
  244. package/dist/src/update/RateLimiter.d.ts +80 -0
  245. package/dist/src/update/RateLimiter.d.ts.map +1 -0
  246. package/dist/src/update/RateLimiter.js +172 -0
  247. package/dist/src/update/SignatureVerifier.d.ts +71 -0
  248. package/dist/src/update/SignatureVerifier.d.ts.map +1 -0
  249. package/dist/src/update/SignatureVerifier.js +214 -0
  250. package/dist/src/update/UpdateChecker.d.ts +127 -0
  251. package/dist/src/update/UpdateChecker.d.ts.map +1 -0
  252. package/dist/src/update/UpdateChecker.js +460 -0
  253. package/dist/src/update/UpdateManager.d.ts +41 -0
  254. package/dist/src/update/UpdateManager.d.ts.map +1 -0
  255. package/dist/src/update/UpdateManager.js +260 -0
  256. package/dist/src/update/VersionManager.d.ts +31 -0
  257. package/dist/src/update/VersionManager.d.ts.map +1 -0
  258. package/dist/src/update/VersionManager.js +134 -0
  259. package/dist/src/update/index.d.ts +9 -0
  260. package/dist/src/update/index.d.ts.map +1 -0
  261. package/dist/src/update/index.js +9 -0
  262. package/dist/src/utils/filesystem.d.ts +32 -0
  263. package/dist/src/utils/filesystem.d.ts.map +1 -0
  264. package/dist/src/utils/filesystem.js +73 -0
  265. package/dist/src/utils/git.d.ts +32 -0
  266. package/dist/src/utils/git.d.ts.map +1 -0
  267. package/dist/src/utils/git.js +65 -0
  268. package/dist/src/utils/index.d.ts +7 -0
  269. package/dist/src/utils/index.d.ts.map +1 -0
  270. package/dist/src/utils/index.js +7 -0
  271. package/dist/src/utils/logger.d.ts +45 -0
  272. package/dist/src/utils/logger.d.ts.map +1 -0
  273. package/dist/src/utils/logger.js +91 -0
  274. package/dist/src/utils/version.d.ts +25 -0
  275. package/dist/src/utils/version.d.ts.map +1 -0
  276. package/dist/src/utils/version.js +97 -0
  277. package/dist/test/src/cache/APICache.d.ts +23 -0
  278. package/dist/test/src/cache/APICache.d.ts.map +1 -0
  279. package/dist/test/src/cache/APICache.js +42 -0
  280. package/dist/test/src/cache/index.d.ts +5 -0
  281. package/dist/test/src/cache/index.d.ts.map +1 -0
  282. package/dist/test/src/cache/index.js +5 -0
  283. package/dist/test/src/collection/CollectionBrowser.d.ts +24 -0
  284. package/dist/test/src/collection/CollectionBrowser.d.ts.map +1 -0
  285. package/dist/test/src/collection/CollectionBrowser.js +115 -0
  286. package/dist/test/src/collection/CollectionSearch.d.ts +18 -0
  287. package/dist/test/src/collection/CollectionSearch.d.ts.map +1 -0
  288. package/dist/test/src/collection/CollectionSearch.js +48 -0
  289. package/dist/test/src/collection/GitHubClient.d.ts +22 -0
  290. package/dist/test/src/collection/GitHubClient.d.ts.map +1 -0
  291. package/dist/test/src/collection/GitHubClient.js +114 -0
  292. package/dist/test/src/collection/PersonaDetails.d.ts +22 -0
  293. package/dist/test/src/collection/PersonaDetails.d.ts.map +1 -0
  294. package/dist/test/src/collection/PersonaDetails.js +71 -0
  295. package/dist/test/src/collection/PersonaInstaller.d.ts +26 -0
  296. package/dist/test/src/collection/PersonaInstaller.d.ts.map +1 -0
  297. package/dist/test/src/collection/PersonaInstaller.js +103 -0
  298. package/dist/test/src/collection/PersonaSubmitter.d.ts +19 -0
  299. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +1 -0
  300. package/dist/test/src/collection/PersonaSubmitter.js +57 -0
  301. package/dist/test/src/collection/index.d.ts +10 -0
  302. package/dist/test/src/collection/index.d.ts.map +1 -0
  303. package/dist/test/src/collection/index.js +10 -0
  304. package/dist/test/src/config/constants.d.ts +25 -0
  305. package/dist/test/src/config/constants.d.ts.map +1 -0
  306. package/dist/test/src/config/constants.js +30 -0
  307. package/dist/test/src/config/index.d.ts +6 -0
  308. package/dist/test/src/config/index.d.ts.map +1 -0
  309. package/dist/test/src/config/index.js +6 -0
  310. package/dist/test/src/config/indicator-config.d.ts +107 -0
  311. package/dist/test/src/config/indicator-config.d.ts.map +1 -0
  312. package/dist/test/src/config/indicator-config.js +158 -0
  313. package/dist/test/src/constants/defaultPersonas.d.ts +10 -0
  314. package/dist/test/src/constants/defaultPersonas.d.ts.map +1 -0
  315. package/dist/test/src/constants/defaultPersonas.js +18 -0
  316. package/dist/test/src/constants/limits.d.ts +10 -0
  317. package/dist/test/src/constants/limits.d.ts.map +1 -0
  318. package/dist/test/src/constants/limits.js +13 -0
  319. package/dist/test/src/elements/BaseElement.d.ts +81 -0
  320. package/dist/test/src/elements/BaseElement.d.ts.map +1 -0
  321. package/dist/test/src/elements/BaseElement.js +381 -0
  322. package/dist/test/src/elements/FeedbackProcessor.d.ts +57 -0
  323. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +1 -0
  324. package/dist/test/src/elements/FeedbackProcessor.js +418 -0
  325. package/dist/test/src/elements/agents/Agent.d.ts +145 -0
  326. package/dist/test/src/elements/agents/Agent.d.ts.map +1 -0
  327. package/dist/test/src/elements/agents/Agent.js +848 -0
  328. package/dist/test/src/elements/agents/AgentManager.d.ts +125 -0
  329. package/dist/test/src/elements/agents/AgentManager.d.ts.map +1 -0
  330. package/dist/test/src/elements/agents/AgentManager.js +608 -0
  331. package/dist/test/src/elements/agents/constants.d.ts +42 -0
  332. package/dist/test/src/elements/agents/constants.d.ts.map +1 -0
  333. package/dist/test/src/elements/agents/constants.js +45 -0
  334. package/dist/test/src/elements/agents/goalTemplates.d.ts +44 -0
  335. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +1 -0
  336. package/dist/test/src/elements/agents/goalTemplates.js +297 -0
  337. package/dist/test/src/elements/agents/index.d.ts +8 -0
  338. package/dist/test/src/elements/agents/index.d.ts.map +1 -0
  339. package/dist/test/src/elements/agents/index.js +8 -0
  340. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +76 -0
  341. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +1 -0
  342. package/dist/test/src/elements/agents/ruleEngineConfig.js +143 -0
  343. package/dist/test/src/elements/agents/types.d.ts +97 -0
  344. package/dist/test/src/elements/agents/types.d.ts.map +1 -0
  345. package/dist/test/src/elements/agents/types.js +5 -0
  346. package/dist/test/src/elements/index.d.ts +6 -0
  347. package/dist/test/src/elements/index.d.ts.map +1 -0
  348. package/dist/test/src/elements/index.js +6 -0
  349. package/dist/test/src/elements/memories/Memory.d.ts +110 -0
  350. package/dist/test/src/elements/memories/Memory.d.ts.map +1 -0
  351. package/dist/test/src/elements/memories/Memory.js +470 -0
  352. package/dist/test/src/elements/memories/MemoryManager.d.ts +86 -0
  353. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +1 -0
  354. package/dist/test/src/elements/memories/MemoryManager.js +435 -0
  355. package/dist/test/src/elements/memories/constants.d.ts +42 -0
  356. package/dist/test/src/elements/memories/constants.d.ts.map +1 -0
  357. package/dist/test/src/elements/memories/constants.js +49 -0
  358. package/dist/test/src/elements/memories/index.d.ts +6 -0
  359. package/dist/test/src/elements/memories/index.d.ts.map +1 -0
  360. package/dist/test/src/elements/memories/index.js +6 -0
  361. package/dist/test/src/elements/skills/Skill.d.ts +109 -0
  362. package/dist/test/src/elements/skills/Skill.d.ts.map +1 -0
  363. package/dist/test/src/elements/skills/Skill.js +381 -0
  364. package/dist/test/src/elements/templates/Template.d.ts +138 -0
  365. package/dist/test/src/elements/templates/Template.d.ts.map +1 -0
  366. package/dist/test/src/elements/templates/Template.js +673 -0
  367. package/dist/test/src/elements/templates/TemplateManager.d.ts +104 -0
  368. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +1 -0
  369. package/dist/test/src/elements/templates/TemplateManager.js +496 -0
  370. package/dist/test/src/elements/templates/index.d.ts +6 -0
  371. package/dist/test/src/elements/templates/index.d.ts.map +1 -0
  372. package/dist/test/src/elements/templates/index.js +6 -0
  373. package/dist/test/src/errors/SecurityError.d.ts +29 -0
  374. package/dist/test/src/errors/SecurityError.d.ts.map +1 -0
  375. package/dist/test/src/errors/SecurityError.js +47 -0
  376. package/dist/test/src/errors/index.d.ts +2 -0
  377. package/dist/test/src/errors/index.d.ts.map +1 -0
  378. package/dist/test/src/errors/index.js +2 -0
  379. package/dist/test/src/index.barrel.d.ts +21 -0
  380. package/dist/test/src/index.barrel.d.ts.map +1 -0
  381. package/dist/test/src/index.barrel.js +31 -0
  382. package/dist/test/src/index.d.ts +223 -0
  383. package/dist/test/src/index.d.ts.map +1 -0
  384. package/dist/test/src/index.js +1594 -0
  385. package/dist/test/src/marketplace/GitHubClient.d.ts +22 -0
  386. package/dist/test/src/marketplace/GitHubClient.d.ts.map +1 -0
  387. package/dist/test/src/marketplace/GitHubClient.js +112 -0
  388. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +21 -0
  389. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  390. package/dist/test/src/marketplace/MarketplaceBrowser.js +45 -0
  391. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +18 -0
  392. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
  393. package/dist/test/src/marketplace/MarketplaceSearch.js +36 -0
  394. package/dist/test/src/marketplace/PersonaDetails.d.ts +22 -0
  395. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +1 -0
  396. package/dist/test/src/marketplace/PersonaDetails.js +71 -0
  397. package/dist/test/src/marketplace/PersonaInstaller.d.ts +25 -0
  398. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +1 -0
  399. package/dist/test/src/marketplace/PersonaInstaller.js +100 -0
  400. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +19 -0
  401. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
  402. package/dist/test/src/marketplace/PersonaSubmitter.js +57 -0
  403. package/dist/test/src/marketplace/index.d.ts +10 -0
  404. package/dist/test/src/marketplace/index.d.ts.map +1 -0
  405. package/dist/test/src/marketplace/index.js +10 -0
  406. package/dist/test/src/persona/PersonaElement.d.ts +64 -0
  407. package/dist/test/src/persona/PersonaElement.d.ts.map +1 -0
  408. package/dist/test/src/persona/PersonaElement.js +223 -0
  409. package/dist/test/src/persona/PersonaElementManager.d.ts +97 -0
  410. package/dist/test/src/persona/PersonaElementManager.d.ts.map +1 -0
  411. package/dist/test/src/persona/PersonaElementManager.js +342 -0
  412. package/dist/test/src/persona/PersonaLoader.d.ts +34 -0
  413. package/dist/test/src/persona/PersonaLoader.d.ts.map +1 -0
  414. package/dist/test/src/persona/PersonaLoader.js +145 -0
  415. package/dist/test/src/persona/PersonaManager.d.ts +112 -0
  416. package/dist/test/src/persona/PersonaManager.d.ts.map +1 -0
  417. package/dist/test/src/persona/PersonaManager.js +341 -0
  418. package/dist/test/src/persona/PersonaValidator.d.ts +33 -0
  419. package/dist/test/src/persona/PersonaValidator.d.ts.map +1 -0
  420. package/dist/test/src/persona/PersonaValidator.js +157 -0
  421. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +43 -0
  422. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
  423. package/dist/test/src/persona/export-import/PersonaExporter.js +99 -0
  424. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +65 -0
  425. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
  426. package/dist/test/src/persona/export-import/PersonaImporter.js +315 -0
  427. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +60 -0
  428. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
  429. package/dist/test/src/persona/export-import/PersonaSharer.js +502 -0
  430. package/dist/test/src/persona/export-import/index.d.ts +10 -0
  431. package/dist/test/src/persona/export-import/index.d.ts.map +1 -0
  432. package/dist/test/src/persona/export-import/index.js +7 -0
  433. package/dist/test/src/persona/index.d.ts +7 -0
  434. package/dist/test/src/persona/index.d.ts.map +1 -0
  435. package/dist/test/src/persona/index.js +7 -0
  436. package/dist/test/src/portfolio/MigrationManager.d.ts +44 -0
  437. package/dist/test/src/portfolio/MigrationManager.d.ts.map +1 -0
  438. package/dist/test/src/portfolio/MigrationManager.js +163 -0
  439. package/dist/test/src/portfolio/PortfolioManager.d.ts +54 -0
  440. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +1 -0
  441. package/dist/test/src/portfolio/PortfolioManager.js +224 -0
  442. package/dist/test/src/portfolio/types.d.ts +18 -0
  443. package/dist/test/src/portfolio/types.d.ts.map +1 -0
  444. package/dist/test/src/portfolio/types.js +13 -0
  445. package/dist/test/src/security/InputValidator.d.ts +80 -0
  446. package/dist/test/src/security/InputValidator.d.ts.map +1 -0
  447. package/dist/test/src/security/InputValidator.js +436 -0
  448. package/dist/test/src/security/audit/SecurityAuditor.d.ts +44 -0
  449. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +1 -0
  450. package/dist/test/src/security/audit/SecurityAuditor.js +274 -0
  451. package/dist/test/src/security/audit/config/suppressions.d.ts +34 -0
  452. package/dist/test/src/security/audit/config/suppressions.d.ts.map +1 -0
  453. package/dist/test/src/security/audit/config/suppressions.js +575 -0
  454. package/dist/test/src/security/audit/index.d.ts +14 -0
  455. package/dist/test/src/security/audit/index.d.ts.map +1 -0
  456. package/dist/test/src/security/audit/index.js +15 -0
  457. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +46 -0
  458. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +1 -0
  459. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +174 -0
  460. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +13 -0
  461. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +1 -0
  462. package/dist/test/src/security/audit/reporters/JsonReporter.js +25 -0
  463. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +13 -0
  464. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +1 -0
  465. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +79 -0
  466. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +20 -0
  467. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +1 -0
  468. package/dist/test/src/security/audit/rules/SecurityRules.js +244 -0
  469. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +47 -0
  470. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +1 -0
  471. package/dist/test/src/security/audit/scanners/CodeScanner.js +174 -0
  472. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +13 -0
  473. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +1 -0
  474. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +22 -0
  475. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +13 -0
  476. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +1 -0
  477. package/dist/test/src/security/audit/scanners/DependencyScanner.js +22 -0
  478. package/dist/test/src/security/audit/types.d.ts +94 -0
  479. package/dist/test/src/security/audit/types.d.ts.map +1 -0
  480. package/dist/test/src/security/audit/types.js +6 -0
  481. package/dist/test/src/security/commandValidator.d.ts +7 -0
  482. package/dist/test/src/security/commandValidator.d.ts.map +1 -0
  483. package/dist/test/src/security/commandValidator.js +78 -0
  484. package/dist/test/src/security/constants.d.ts +24 -0
  485. package/dist/test/src/security/constants.d.ts.map +1 -0
  486. package/dist/test/src/security/constants.js +26 -0
  487. package/dist/test/src/security/contentValidator.d.ts +47 -0
  488. package/dist/test/src/security/contentValidator.d.ts.map +1 -0
  489. package/dist/test/src/security/contentValidator.js +301 -0
  490. package/dist/test/src/security/errors.d.ts +14 -0
  491. package/dist/test/src/security/errors.d.ts.map +1 -0
  492. package/dist/test/src/security/errors.js +28 -0
  493. package/dist/test/src/security/fileLockManager.d.ts +70 -0
  494. package/dist/test/src/security/fileLockManager.d.ts.map +1 -0
  495. package/dist/test/src/security/fileLockManager.js +187 -0
  496. package/dist/test/src/security/index.d.ts +12 -0
  497. package/dist/test/src/security/index.d.ts.map +1 -0
  498. package/dist/test/src/security/index.js +14 -0
  499. package/dist/test/src/security/pathValidator.d.ts +9 -0
  500. package/dist/test/src/security/pathValidator.d.ts.map +1 -0
  501. package/dist/test/src/security/pathValidator.js +98 -0
  502. package/dist/test/src/security/regexValidator.d.ts +59 -0
  503. package/dist/test/src/security/regexValidator.d.ts.map +1 -0
  504. package/dist/test/src/security/regexValidator.js +214 -0
  505. package/dist/test/src/security/secureYamlParser.d.ts +46 -0
  506. package/dist/test/src/security/secureYamlParser.d.ts.map +1 -0
  507. package/dist/test/src/security/secureYamlParser.js +203 -0
  508. package/dist/test/src/security/securityMonitor.d.ts +58 -0
  509. package/dist/test/src/security/securityMonitor.d.ts.map +1 -0
  510. package/dist/test/src/security/securityMonitor.js +108 -0
  511. package/dist/test/src/security/tokenManager.d.ts +85 -0
  512. package/dist/test/src/security/tokenManager.d.ts.map +1 -0
  513. package/dist/test/src/security/tokenManager.js +286 -0
  514. package/dist/test/src/security/validators/unicodeValidator.d.ts +97 -0
  515. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +1 -0
  516. package/dist/test/src/security/validators/unicodeValidator.js +312 -0
  517. package/dist/test/src/security/yamlValidator.d.ts +21 -0
  518. package/dist/test/src/security/yamlValidator.d.ts.map +1 -0
  519. package/dist/test/src/security/yamlValidator.js +164 -0
  520. package/dist/test/src/server/ServerSetup.d.ts +35 -0
  521. package/dist/test/src/server/ServerSetup.d.ts.map +1 -0
  522. package/dist/test/src/server/ServerSetup.js +116 -0
  523. package/dist/test/src/server/index.d.ts +7 -0
  524. package/dist/test/src/server/index.d.ts.map +1 -0
  525. package/dist/test/src/server/index.js +7 -0
  526. package/dist/test/src/server/startup.d.ts +31 -0
  527. package/dist/test/src/server/startup.d.ts.map +1 -0
  528. package/dist/test/src/server/startup.js +67 -0
  529. package/dist/test/src/server/tools/CollectionTools.d.ts +10 -0
  530. package/dist/test/src/server/tools/CollectionTools.d.ts.map +1 -0
  531. package/dist/test/src/server/tools/CollectionTools.js +96 -0
  532. package/dist/test/src/server/tools/ConfigTools.d.ts +10 -0
  533. package/dist/test/src/server/tools/ConfigTools.d.ts.map +1 -0
  534. package/dist/test/src/server/tools/ConfigTools.js +63 -0
  535. package/dist/test/src/server/tools/MarketplaceTools.d.ts +10 -0
  536. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +1 -0
  537. package/dist/test/src/server/tools/MarketplaceTools.js +92 -0
  538. package/dist/test/src/server/tools/PersonaTools.d.ts +10 -0
  539. package/dist/test/src/server/tools/PersonaTools.d.ts.map +1 -0
  540. package/dist/test/src/server/tools/PersonaTools.js +257 -0
  541. package/dist/test/src/server/tools/ToolRegistry.d.ts +37 -0
  542. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +1 -0
  543. package/dist/test/src/server/tools/ToolRegistry.js +40 -0
  544. package/dist/test/src/server/tools/UpdateTools.d.ts +10 -0
  545. package/dist/test/src/server/tools/UpdateTools.d.ts.map +1 -0
  546. package/dist/test/src/server/tools/UpdateTools.js +64 -0
  547. package/dist/test/src/server/tools/UserTools.d.ts +10 -0
  548. package/dist/test/src/server/tools/UserTools.d.ts.map +1 -0
  549. package/dist/test/src/server/tools/UserTools.js +51 -0
  550. package/dist/test/src/server/tools/index.d.ts +10 -0
  551. package/dist/test/src/server/tools/index.d.ts.map +1 -0
  552. package/dist/test/src/server/tools/index.js +10 -0
  553. package/dist/test/src/server/types.d.ts +34 -0
  554. package/dist/test/src/server/types.d.ts.map +1 -0
  555. package/dist/test/src/server/types.js +5 -0
  556. package/dist/test/src/tools/debug.d.ts +20 -0
  557. package/dist/test/src/tools/debug.d.ts.map +1 -0
  558. package/dist/test/src/tools/debug.js +37 -0
  559. package/dist/test/src/types/cache.d.ts +8 -0
  560. package/dist/test/src/types/cache.d.ts.map +1 -0
  561. package/dist/test/src/types/cache.js +5 -0
  562. package/dist/test/src/types/collection.d.ts +23 -0
  563. package/dist/test/src/types/collection.d.ts.map +1 -0
  564. package/dist/test/src/types/collection.js +5 -0
  565. package/dist/test/src/types/elements/IElement.d.ts +123 -0
  566. package/dist/test/src/types/elements/IElement.d.ts.map +1 -0
  567. package/dist/test/src/types/elements/IElement.js +30 -0
  568. package/dist/test/src/types/elements/IElementManager.d.ts +65 -0
  569. package/dist/test/src/types/elements/IElementManager.d.ts.map +1 -0
  570. package/dist/test/src/types/elements/IElementManager.js +6 -0
  571. package/dist/test/src/types/elements/IRatingManager.d.ts +109 -0
  572. package/dist/test/src/types/elements/IRatingManager.d.ts.map +1 -0
  573. package/dist/test/src/types/elements/IRatingManager.js +6 -0
  574. package/dist/test/src/types/elements/IReferenceResolver.d.ts +52 -0
  575. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +1 -0
  576. package/dist/test/src/types/elements/IReferenceResolver.js +6 -0
  577. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +49 -0
  578. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +1 -0
  579. package/dist/test/src/types/elements/RatingBreakdowns.js +6 -0
  580. package/dist/test/src/types/elements/index.d.ts +9 -0
  581. package/dist/test/src/types/elements/index.d.ts.map +1 -0
  582. package/dist/test/src/types/elements/index.js +11 -0
  583. package/dist/test/src/types/index.d.ts +9 -0
  584. package/dist/test/src/types/index.d.ts.map +1 -0
  585. package/dist/test/src/types/index.js +9 -0
  586. package/dist/test/src/types/marketplace.d.ts +23 -0
  587. package/dist/test/src/types/marketplace.d.ts.map +1 -0
  588. package/dist/test/src/types/marketplace.js +5 -0
  589. package/dist/test/src/types/mcp.d.ts +84 -0
  590. package/dist/test/src/types/mcp.d.ts.map +1 -0
  591. package/dist/test/src/types/mcp.js +80 -0
  592. package/dist/test/src/types/persona.d.ts +30 -0
  593. package/dist/test/src/types/persona.d.ts.map +1 -0
  594. package/dist/test/src/types/persona.js +5 -0
  595. package/dist/test/src/update/BackupManager.d.ts +46 -0
  596. package/dist/test/src/update/BackupManager.d.ts.map +1 -0
  597. package/dist/test/src/update/BackupManager.js +261 -0
  598. package/dist/test/src/update/DependencyChecker.d.ts +41 -0
  599. package/dist/test/src/update/DependencyChecker.d.ts.map +1 -0
  600. package/dist/test/src/update/DependencyChecker.js +132 -0
  601. package/dist/test/src/update/RateLimiter.d.ts +80 -0
  602. package/dist/test/src/update/RateLimiter.d.ts.map +1 -0
  603. package/dist/test/src/update/RateLimiter.js +172 -0
  604. package/dist/test/src/update/SignatureVerifier.d.ts +71 -0
  605. package/dist/test/src/update/SignatureVerifier.d.ts.map +1 -0
  606. package/dist/test/src/update/SignatureVerifier.js +214 -0
  607. package/dist/test/src/update/UpdateChecker.d.ts +127 -0
  608. package/dist/test/src/update/UpdateChecker.d.ts.map +1 -0
  609. package/dist/test/src/update/UpdateChecker.js +469 -0
  610. package/dist/test/src/update/UpdateManager.d.ts +41 -0
  611. package/dist/test/src/update/UpdateManager.d.ts.map +1 -0
  612. package/dist/test/src/update/UpdateManager.js +260 -0
  613. package/dist/test/src/update/VersionManager.d.ts +31 -0
  614. package/dist/test/src/update/VersionManager.d.ts.map +1 -0
  615. package/dist/test/src/update/VersionManager.js +134 -0
  616. package/dist/test/src/update/index.d.ts +9 -0
  617. package/dist/test/src/update/index.d.ts.map +1 -0
  618. package/dist/test/src/update/index.js +9 -0
  619. package/dist/test/src/utils/filesystem.d.ts +29 -0
  620. package/dist/test/src/utils/filesystem.d.ts.map +1 -0
  621. package/dist/test/src/utils/filesystem.js +94 -0
  622. package/dist/test/src/utils/git.d.ts +32 -0
  623. package/dist/test/src/utils/git.d.ts.map +1 -0
  624. package/dist/test/src/utils/git.js +65 -0
  625. package/dist/test/src/utils/index.d.ts +7 -0
  626. package/dist/test/src/utils/index.d.ts.map +1 -0
  627. package/dist/test/src/utils/index.js +7 -0
  628. package/dist/test/src/utils/logger.d.ts +45 -0
  629. package/dist/test/src/utils/logger.d.ts.map +1 -0
  630. package/dist/test/src/utils/logger.js +91 -0
  631. package/dist/test/src/utils/version.d.ts +25 -0
  632. package/dist/test/src/utils/version.d.ts.map +1 -0
  633. package/dist/test/src/utils/version.js +97 -0
  634. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +33 -0
  635. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +1 -0
  636. package/dist/test/test/__tests__/integration/helpers/file-utils.js +83 -0
  637. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +26 -0
  638. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +1 -0
  639. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +95 -0
  640. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +26 -0
  641. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +1 -0
  642. package/dist/test/test/__tests__/integration/helpers/test-server.js +41 -0
  643. package/dist/test/test/__tests__/integration/setup.d.ts +8 -0
  644. package/dist/test/test/__tests__/integration/setup.d.ts.map +1 -0
  645. package/dist/test/test/__tests__/integration/setup.js +31 -0
  646. package/dist/test/test/__tests__/integration/teardown.d.ts +5 -0
  647. package/dist/test/test/__tests__/integration/teardown.d.ts.map +1 -0
  648. package/dist/test/test/__tests__/integration/teardown.js +23 -0
  649. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +34 -0
  650. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +1 -0
  651. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +224 -0
  652. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +89 -0
  653. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +1 -0
  654. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +543 -0
  655. package/dist/test/test/__tests__/security/index.d.ts +46 -0
  656. package/dist/test/test/__tests__/security/index.d.ts.map +1 -0
  657. package/dist/test/test/__tests__/security/index.js +98 -0
  658. package/dist/test/test/__tests__/security/setup.d.ts +3 -0
  659. package/dist/test/test/__tests__/security/setup.d.ts.map +1 -0
  660. package/dist/test/test/__tests__/security/setup.js +23 -0
  661. package/dist/types/marketplace.d.ts +23 -0
  662. package/dist/types/marketplace.d.ts.map +1 -0
  663. package/dist/types/marketplace.js +5 -0
  664. package/dist/update/UpdateChecker.d.ts +5 -0
  665. package/dist/update/UpdateChecker.d.ts.map +1 -1
  666. package/dist/update/UpdateChecker.js +44 -7
  667. package/package.json +1 -1
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Install content from marketplace
3
+ */
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ import { validatePath, validateFilename, validateContentSize } from '../security/InputValidator.js';
7
+ import { SECURITY_LIMITS } from '../security/constants.js';
8
+ import { ContentValidator } from '../security/contentValidator.js';
9
+ import { SecureYamlParser } from '../security/secureYamlParser.js';
10
+ import { SecurityError } from '../errors/SecurityError.js';
11
+ export class PersonaInstaller {
12
+ githubClient;
13
+ personasDir;
14
+ baseUrl = 'https://api.github.com/repos/DollhouseMCP/collection/contents';
15
+ constructor(githubClient, personasDir) {
16
+ this.githubClient = githubClient;
17
+ this.personasDir = personasDir;
18
+ }
19
+ /**
20
+ * Install content from the marketplace
21
+ */
22
+ async installContent(inputPath) {
23
+ // Validate and sanitize the input path
24
+ const sanitizedPath = validatePath(inputPath);
25
+ // Ensure the path ends with .md
26
+ if (!sanitizedPath.endsWith('.md')) {
27
+ throw new Error('Invalid file type. Only .md files are allowed.');
28
+ }
29
+ const url = `${this.baseUrl}/${sanitizedPath}`;
30
+ const data = await this.githubClient.fetchFromGitHub(url);
31
+ if (data.type !== 'file') {
32
+ throw new Error('Path does not point to a file');
33
+ }
34
+ // Check file size before downloading
35
+ if (data.size > SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES) {
36
+ throw new Error(`File too large (${data.size} bytes, max ${SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES} bytes)`);
37
+ }
38
+ // Decode Base64 content
39
+ const content = Buffer.from(data.content, 'base64').toString('utf-8');
40
+ // Validate content size after decoding
41
+ validateContentSize(content, SECURITY_LIMITS.MAX_PERSONA_SIZE_BYTES);
42
+ // Sanitize content for security threats
43
+ const sanitizedContent = ContentValidator.sanitizePersonaContent(content);
44
+ // Use secure YAML parser
45
+ let parsed;
46
+ try {
47
+ parsed = SecureYamlParser.safeMatter(sanitizedContent);
48
+ }
49
+ catch (error) {
50
+ if (error instanceof SecurityError) {
51
+ throw new Error(`Security threat in content: ${error.message}`);
52
+ }
53
+ throw error;
54
+ }
55
+ const metadata = parsed.data;
56
+ // Additional metadata validation for injection attacks
57
+ const metadataValidation = ContentValidator.validateMetadata(metadata);
58
+ if (!metadataValidation.isValid) {
59
+ throw new Error(`Security validation failed: ${metadataValidation.detectedPatterns?.join(', ')}`);
60
+ }
61
+ // Validate metadata
62
+ if (!metadata.name || !metadata.description) {
63
+ throw new Error('Invalid content: missing required name or description');
64
+ }
65
+ // Generate and validate local filename
66
+ const originalFilename = sanitizedPath.split('/').pop() || 'downloaded-persona.md';
67
+ const filename = validateFilename(originalFilename);
68
+ const localPath = path.join(this.personasDir, filename);
69
+ // Check if file already exists
70
+ try {
71
+ await fs.access(localPath);
72
+ return {
73
+ success: false,
74
+ message: `Content already exists: ${filename}\n\nUse \`reload_personas\` to refresh if you've updated it manually.`
75
+ };
76
+ }
77
+ catch {
78
+ // File doesn't exist, proceed with installation
79
+ }
80
+ // Write the sanitized file
81
+ await fs.writeFile(localPath, sanitizedContent, 'utf-8');
82
+ return {
83
+ success: true,
84
+ message: `Content installed successfully!`,
85
+ metadata,
86
+ filename
87
+ };
88
+ }
89
+ /**
90
+ * Format installation success message
91
+ */
92
+ formatInstallSuccess(metadata, filename, totalPersonas, personaIndicator = '') {
93
+ return `${personaIndicator}✅ **Content Installed Successfully!**\n\n` +
94
+ `🎭 **${metadata.name}** by ${metadata.author}\n` +
95
+ `📁 Saved as: ${filename}\n` +
96
+ `📊 Total personas: ${totalPersonas}\n\n` +
97
+ `🎯 **Ready to use:** \`activate_persona "${metadata.name}"\``;
98
+ }
99
+ }
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYUluc3RhbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXJrZXRwbGFjZS9QZXJzb25hSW5zdGFsbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFJN0IsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFM0QsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixZQUFZLENBQWU7SUFDM0IsV0FBVyxDQUFTO0lBQ3BCLE9BQU8sR0FBRywrREFBK0QsQ0FBQztJQUVsRixZQUFZLFlBQTBCLEVBQUUsV0FBbUI7UUFDekQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFpQjtRQU1wQyx1Q0FBdUM7UUFDdkMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlDLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcs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QUFDLENBQUM7UUFFekQsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLGlDQUFpQztZQUMxQyxRQUFRO1lBQ1IsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0IsQ0FBQyxRQUF5QixFQUFFLFFBQWdCLEVBQUUsYUFBcUIsRUFBRSxtQkFBMkIsRUFBRTtRQUNwSCxPQUFPLEdBQUcsZ0JBQWdCLDJDQUEyQztZQUNuRSxRQUFRLFFBQVEsQ0FBQyxJQUFJLFNBQVMsUUFBUSxDQUFDLE1BQU0sSUFBSTtZQUNqRCxnQkFBZ0IsUUFBUSxJQUFJO1lBQzVCLHNCQUFzQixhQUFhLE1BQU07WUFDekMsNENBQTRDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNuRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluc3RhbGwgY29udGVudCBmcm9tIG1hcmtldHBsYWNlXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBtYXR0ZXIgZnJvbSAnZ3JheS1tYXR0ZXInO1xuaW1wb3J0IHsgR2l0SHViQ2xpZW50IH0gZnJvbSAnLi9HaXRIdWJDbGllbnQuanMnO1xuaW1wb3J0IHsgUGVyc29uYU1ldGFkYXRhIH0gZnJvbSAnLi4vdHlwZXMvcGVyc29uYS5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBhdGgsIHZhbGlkYXRlRmlsZW5hbWUsIHZhbGlkYXRlQ29udGVudFNpemUgfSBmcm9tICcuLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9TZWN1cml0eUVycm9yLmpzJztcblxuZXhwb3J0IGNsYXNzIFBlcnNvbmFJbnN0YWxsZXIge1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIHBlcnNvbmFzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgYmFzZVVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2NvbnRlbnRzJztcbiAgXG4gIGNvbnN0cnVjdG9yKGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50LCBwZXJzb25hc0Rpcjogc3RyaW5nKSB7XG4gICAgdGhpcy5naXRodWJDbGllbnQgPSBnaXRodWJDbGllbnQ7XG4gICAgdGhpcy5wZXJzb25hc0RpciA9IHBlcnNvbmFzRGlyO1xuICB9XG4gIFxuICAvKipcbiAgICogSW5zdGFsbCBjb250ZW50IGZyb20gdGhlIG1hcmtldHBsYWNlXG4gICAqL1xuICBhc3luYyBpbnN0YWxsQ29udGVudChpbnB1dFBhdGg6IHN0cmluZyk6IFByb21pc2U8eyBcbiAgICBzdWNjZXNzOiBib29sZWFuOyBcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBQZXJzb25hTWV0YWRhdGE7XG4gICAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICAvLyBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGlucHV0IHBhdGhcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gdmFsaWRhdGVQYXRoKGlucHV0UGF0aCk7XG4gICAgXG4gICAgLy8gRW5zdXJlIHRoZSBwYXRoIGVuZHMgd2l0aCAubWRcbiAgICBpZiAoIXNhbml0aXplZFBhdGguZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmlsZSB0eXBlLiBPbmx5IC5tZCBmaWxlcyBhcmUgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS8ke3Nhbml0aXplZFBhdGh9YDtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5naXRodWJDbGllbnQuZmV0Y2hGcm9tR2l0SHViKHVybCk7XG4gICAgXG4gICAgaWYgKGRhdGEudHlwZSAhPT0gJ2ZpbGUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggZG9lcyBub3QgcG9pbnQgdG8gYSBmaWxlJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZpbGUgc2l6ZSBiZWZvcmUgZG93bmxvYWRpbmdcbiAgICBpZiAoZGF0YS5zaXplID4gU0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSB0b28gbGFyZ2UgKCR7ZGF0YS5zaXplfSBieXRlcywgbWF4ICR7U0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVN9IGJ5dGVzKWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZWNvZGUgQmFzZTY0IGNvbnRlbnRcbiAgICBjb25zdCBjb250ZW50ID0gQnVmZmVyLmZyb20oZGF0YS5jb250ZW50LCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgY29udGVudCBzaXplIGFmdGVyIGRlY29kaW5nXG4gICAgdmFsaWRhdGVDb250ZW50U2l6ZShjb250ZW50LCBTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFUyk7XG4gICAgXG4gICAgLy8gU2FuaXRpemUgY29udGVudCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBDb250ZW50VmFsaWRhdG9yLnNhbml0aXplUGVyc29uYUNvbnRlbnQoY29udGVudCk7XG4gICAgXG4gICAgLy8gVXNlIHNlY3VyZSBZQU1MIHBhcnNlclxuICAgIGxldCBwYXJzZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihzYW5pdGl6ZWRDb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlY3VyaXR5IHRocmVhdCBpbiBjb250ZW50OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWQuZGF0YSBhcyBQZXJzb25hTWV0YWRhdGE7XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCBtZXRhZGF0YSB2YWxpZGF0aW9uIGZvciBpbmplY3Rpb24gYXR0YWNrc1xuICAgIGNvbnN0IG1ldGFkYXRhVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgaWYgKCFtZXRhZGF0YVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWN1cml0eSB2YWxpZGF0aW9uIGZhaWxlZDogJHttZXRhZGF0YVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgbWV0YWRhdGFcbiAgICBpZiAoIW1ldGFkYXRhLm5hbWUgfHwgIW1ldGFkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29udGVudDogbWlzc2luZyByZXF1aXJlZCBuYW1lIG9yIGRlc2NyaXB0aW9uJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEdlbmVyYXRlIGFuZCB2YWxpZGF0ZSBsb2NhbCBmaWxlbmFtZVxuICAgIGNvbnN0IG9yaWdpbmFsRmlsZW5hbWUgPSBzYW5pdGl6ZWRQYXRoLnNwbGl0KCcvJykucG9wKCkgfHwgJ2Rvd25sb2FkZWQtcGVyc29uYS5tZCc7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB2YWxpZGF0ZUZpbGVuYW1lKG9yaWdpbmFsRmlsZW5hbWUpO1xuICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBmaWxlbmFtZSk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MobG9jYWxQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgQ29udGVudCBhbHJlYWR5IGV4aXN0czogJHtmaWxlbmFtZX1cXG5cXG5Vc2UgXFxgcmVsb2FkX3BlcnNvbmFzXFxgIHRvIHJlZnJlc2ggaWYgeW91J3ZlIHVwZGF0ZWQgaXQgbWFudWFsbHkuYFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZCB3aXRoIGluc3RhbGxhdGlvblxuICAgIH1cbiAgICBcbiAgICAvLyBXcml0ZSB0aGUgc2FuaXRpemVkIGZpbGVcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxQYXRoLCBzYW5pdGl6ZWRDb250ZW50LCAndXRmLTgnKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBDb250ZW50IGluc3RhbGxlZCBzdWNjZXNzZnVsbHkhYCxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgZmlsZW5hbWVcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogRm9ybWF0IGluc3RhbGxhdGlvbiBzdWNjZXNzIG1lc3NhZ2VcbiAgICovXG4gIGZvcm1hdEluc3RhbGxTdWNjZXNzKG1ldGFkYXRhOiBQZXJzb25hTWV0YWRhdGEsIGZpbGVuYW1lOiBzdHJpbmcsIHRvdGFsUGVyc29uYXM6IG51bWJlciwgcGVyc29uYUluZGljYXRvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwZXJzb25hSW5kaWNhdG9yfeKchSAqKkNvbnRlbnQgSW5zdGFsbGVkIFN1Y2Nlc3NmdWxseSEqKlxcblxcbmAgK1xuICAgICAgYPCfjq0gKioke21ldGFkYXRhLm5hbWV9KiogYnkgJHttZXRhZGF0YS5hdXRob3J9XFxuYCArXG4gICAgICBg8J+TgSBTYXZlZCBhczogJHtmaWxlbmFtZX1cXG5gICtcbiAgICAgIGDwn5OKIFRvdGFsIHBlcnNvbmFzOiAke3RvdGFsUGVyc29uYXN9XFxuXFxuYCArXG4gICAgICBg8J+OryAqKlJlYWR5IHRvIHVzZToqKiBcXGBhY3RpdmF0ZV9wZXJzb25hIFwiJHttZXRhZGF0YS5uYW1lfVwiXFxgYDtcbiAgfVxufSJdfQ==
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Submit personas to the marketplace
3
+ */
4
+ import { Persona } from '../types/persona.js';
5
+ export declare class PersonaSubmitter {
6
+ /**
7
+ * Generate GitHub issue for persona submission
8
+ */
9
+ generateSubmissionIssue(persona: Persona): {
10
+ issueTitle: string;
11
+ issueBody: string;
12
+ githubIssueUrl: string;
13
+ };
14
+ /**
15
+ * Format submission response
16
+ */
17
+ formatSubmissionResponse(persona: Persona, githubIssueUrl: string, personaIndicator?: string): string;
18
+ }
19
+ //# sourceMappingURL=PersonaSubmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonaSubmitter.d.ts","sourceRoot":"","sources":["../../src/marketplace/PersonaSubmitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG;QACzC,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAA;KACvB;IAqCD;;OAEG;IACH,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;CAW1G"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Submit personas to the marketplace
3
+ */
4
+ export class PersonaSubmitter {
5
+ /**
6
+ * Generate GitHub issue for persona submission
7
+ */
8
+ generateSubmissionIssue(persona) {
9
+ const issueTitle = `New Persona Submission: ${persona.metadata.name}`;
10
+ const issueBody = `## Persona Submission
11
+
12
+ **Name:** ${persona.metadata.name}
13
+ **Author:** ${persona.metadata.author || 'Unknown'}
14
+ **Category:** ${persona.metadata.category || 'General'}
15
+ **Description:** ${persona.metadata.description}
16
+
17
+ ### Persona Content:
18
+ \`\`\`markdown
19
+ ---
20
+ ${Object.entries(persona.metadata)
21
+ .map(([key, value]) => `${key}: ${Array.isArray(value) ? JSON.stringify(value) : JSON.stringify(value)}`)
22
+ .join('\n')}
23
+ ---
24
+
25
+ ${persona.content}
26
+ \`\`\`
27
+
28
+ ### Submission Details:
29
+ - Submitted via DollhouseMCP client
30
+ - Filename: ${persona.filename}
31
+ - Unique ID: ${persona.unique_id}
32
+
33
+ ---
34
+ *Please review this persona for inclusion in the marketplace.*`;
35
+ const githubIssueUrl = `https://github.com/DollhouseMCP/collection/issues/new?title=${encodeURIComponent(issueTitle)}&body=${encodeURIComponent(issueBody)}`;
36
+ return {
37
+ issueTitle,
38
+ issueBody,
39
+ githubIssueUrl
40
+ };
41
+ }
42
+ /**
43
+ * Format submission response
44
+ */
45
+ formatSubmissionResponse(persona, githubIssueUrl, personaIndicator = '') {
46
+ return `${personaIndicator}📤 **Persona Submission Prepared**\n\n` +
47
+ `🎭 **${persona.metadata.name}** is ready for marketplace submission!\n\n` +
48
+ `**Next Steps:**\n` +
49
+ `1. Click this link to create a GitHub issue: \n` +
50
+ ` ${githubIssueUrl}\n\n` +
51
+ `2. Review the pre-filled content\n` +
52
+ `3. Click "Submit new issue"\n` +
53
+ `4. The maintainers will review your submission\n\n` +
54
+ `⭐ **Tip:** You can also submit via pull request if you're familiar with Git!`;
55
+ }
56
+ }
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYVN1Ym1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXJrZXRwbGFjZS9QZXJzb25hU3VibWl0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBSUgsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjs7T0FFRztJQUNILHVCQUF1QixDQUFDLE9BQWdCO1FBS3RDLE1BQU0sVUFBVSxHQUFHLDJCQUEyQixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RFLE1BQU0sU0FBUyxHQUFHOztZQUVWLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSTtjQUNuQixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxTQUFTO2dCQUNsQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxTQUFTO21CQUNuQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7Ozs7O0VBSzdDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzthQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ3hHLElBQUksQ0FBQyxJQUFJLENBQUM7OztFQUdYLE9BQU8sQ0FBQyxPQUFPOzs7OztjQUtILE9BQU8sQ0FBQyxRQUFRO2VBQ2YsT0FBTyxDQUFDLFNBQVM7OzsrREFHK0IsQ0FBQztRQUU1RCxNQUFNLGNBQWMsR0FBRywrREFBK0Qsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFNBQVMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUU3SixPQUFPO1lBQ0wsVUFBVTtZQUNWLFNBQVM7WUFDVCxjQUFjO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILHdCQUF3QixDQUFDLE9BQWdCLEVBQUUsY0FBc0IsRUFBRSxtQkFBMkIsRUFBRTtRQUM5RixPQUFPLEdBQUcsZ0JBQWdCLHdDQUF3QztZQUNoRSxRQUFRLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSw2Q0FBNkM7WUFDMUUsbUJBQW1CO1lBQ25CLGlEQUFpRDtZQUNqRCxNQUFNLGNBQWMsTUFBTTtZQUMxQixvQ0FBb0M7WUFDcEMsK0JBQStCO1lBQy9CLG9EQUFvRDtZQUNwRCw4RUFBOEUsQ0FBQztJQUNuRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1Ym1pdCBwZXJzb25hcyB0byB0aGUgbWFya2V0cGxhY2VcbiAqL1xuXG5pbXBvcnQgeyBQZXJzb25hIH0gZnJvbSAnLi4vdHlwZXMvcGVyc29uYS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQZXJzb25hU3VibWl0dGVyIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIEdpdEh1YiBpc3N1ZSBmb3IgcGVyc29uYSBzdWJtaXNzaW9uXG4gICAqL1xuICBnZW5lcmF0ZVN1Ym1pc3Npb25Jc3N1ZShwZXJzb25hOiBQZXJzb25hKTogeyBcbiAgICBpc3N1ZVRpdGxlOiBzdHJpbmc7IFxuICAgIGlzc3VlQm9keTogc3RyaW5nOyBcbiAgICBnaXRodWJJc3N1ZVVybDogc3RyaW5nIFxuICB9IHtcbiAgICBjb25zdCBpc3N1ZVRpdGxlID0gYE5ldyBQZXJzb25hIFN1Ym1pc3Npb246ICR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfWA7XG4gICAgY29uc3QgaXNzdWVCb2R5ID0gYCMjIFBlcnNvbmEgU3VibWlzc2lvblxuXG4qKk5hbWU6KiogJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9XG4qKkF1dGhvcjoqKiAke3BlcnNvbmEubWV0YWRhdGEuYXV0aG9yIHx8ICdVbmtub3duJ31cbioqQ2F0ZWdvcnk6KiogJHtwZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5IHx8ICdHZW5lcmFsJ31cbioqRGVzY3JpcHRpb246KiogJHtwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxuXG4jIyMgUGVyc29uYSBDb250ZW50OlxuXFxgXFxgXFxgbWFya2Rvd25cbi0tLVxuJHtPYmplY3QuZW50cmllcyhwZXJzb25hLm1ldGFkYXRhKVxuICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7QXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YClcbiAgLmpvaW4oJ1xcbicpfVxuLS0tXG5cbiR7cGVyc29uYS5jb250ZW50fVxuXFxgXFxgXFxgXG5cbiMjIyBTdWJtaXNzaW9uIERldGFpbHM6XG4tIFN1Ym1pdHRlZCB2aWEgRG9sbGhvdXNlTUNQIGNsaWVudFxuLSBGaWxlbmFtZTogJHtwZXJzb25hLmZpbGVuYW1lfVxuLSBVbmlxdWUgSUQ6ICR7cGVyc29uYS51bmlxdWVfaWR9XG5cbi0tLVxuKlBsZWFzZSByZXZpZXcgdGhpcyBwZXJzb25hIGZvciBpbmNsdXNpb24gaW4gdGhlIG1hcmtldHBsYWNlLipgO1xuICAgIFxuICAgIGNvbnN0IGdpdGh1Yklzc3VlVXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9pc3N1ZXMvbmV3P3RpdGxlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGlzc3VlVGl0bGUpfSZib2R5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGlzc3VlQm9keSl9YDtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaXNzdWVUaXRsZSxcbiAgICAgIGlzc3VlQm9keSxcbiAgICAgIGdpdGh1Yklzc3VlVXJsXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZvcm1hdCBzdWJtaXNzaW9uIHJlc3BvbnNlXG4gICAqL1xuICBmb3JtYXRTdWJtaXNzaW9uUmVzcG9uc2UocGVyc29uYTogUGVyc29uYSwgZ2l0aHViSXNzdWVVcmw6IHN0cmluZywgcGVyc29uYUluZGljYXRvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwZXJzb25hSW5kaWNhdG9yffCfk6QgKipQZXJzb25hIFN1Ym1pc3Npb24gUHJlcGFyZWQqKlxcblxcbmAgK1xuICAgICAgYPCfjq0gKioke3BlcnNvbmEubWV0YWRhdGEubmFtZX0qKiBpcyByZWFkeSBmb3IgbWFya2V0cGxhY2Ugc3VibWlzc2lvbiFcXG5cXG5gICtcbiAgICAgIGAqKk5leHQgU3RlcHM6KipcXG5gICtcbiAgICAgIGAxLiBDbGljayB0aGlzIGxpbmsgdG8gY3JlYXRlIGEgR2l0SHViIGlzc3VlOiBcXG5gICtcbiAgICAgIGAgICAke2dpdGh1Yklzc3VlVXJsfVxcblxcbmAgK1xuICAgICAgYDIuIFJldmlldyB0aGUgcHJlLWZpbGxlZCBjb250ZW50XFxuYCArXG4gICAgICBgMy4gQ2xpY2sgXCJTdWJtaXQgbmV3IGlzc3VlXCJcXG5gICtcbiAgICAgIGA0LiBUaGUgbWFpbnRhaW5lcnMgd2lsbCByZXZpZXcgeW91ciBzdWJtaXNzaW9uXFxuXFxuYCArXG4gICAgICBg4q2QICoqVGlwOioqIFlvdSBjYW4gYWxzbyBzdWJtaXQgdmlhIHB1bGwgcmVxdWVzdCBpZiB5b3UncmUgZmFtaWxpYXIgd2l0aCBHaXQhYDtcbiAgfVxufSJdfQ==
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Marketplace module exports
3
+ */
4
+ export * from './GitHubClient.js';
5
+ export * from './MarketplaceBrowser.js';
6
+ export * from './MarketplaceSearch.js';
7
+ export * from './PersonaDetails.js';
8
+ export * from './PersonaInstaller.js';
9
+ export * from './PersonaSubmitter.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Marketplace module exports
3
+ */
4
+ export * from './GitHubClient.js';
5
+ export * from './MarketplaceBrowser.js';
6
+ export * from './MarketplaceSearch.js';
7
+ export * from './PersonaDetails.js';
8
+ export * from './PersonaInstaller.js';
9
+ export * from './PersonaSubmitter.js';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFya2V0cGxhY2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFya2V0cGxhY2UgbW9kdWxlIGV4cG9ydHNcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL0dpdEh1YkNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL01hcmtldHBsYWNlQnJvd3Nlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL01hcmtldHBsYWNlU2VhcmNoLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUGVyc29uYURldGFpbHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QZXJzb25hSW5zdGFsbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUGVyc29uYVN1Ym1pdHRlci5qcyc7Il19
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultElementProvider.d.ts","sourceRoot":"","sources":["../../src/portfolio/DefaultElementProvider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,eAAO,MAAM,cAAc;;;;;;;;;CASjB,CAAC;AAOX,MAAM,WAAW,4BAA4B;IAC3C,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAuB;IACnD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAyC;IAC1E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAE1C,MAAM,CAAC,EAAE,4BAA4B;IASjD;;;OAGG;IACH,OAAO,KAAK,eAAe,GAmC1B;IAED;;;OAGG;YACW,iBAAiB;IAyC/B;;OAEG;YACW,eAAe;IAS7B;;;OAGG;YACW,gBAAgB;IAmG9B;;;OAGG;IACH;;;;OAIG;YACW,iBAAiB;IAuB/B;;;;;OAKG;YACW,wBAAwB;IA8EtC;;;;OAIG;IACU,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtE;;;OAGG;YACW,iBAAiB;CAwFhC"}
1
+ {"version":3,"file":"DefaultElementProvider.d.ts","sourceRoot":"","sources":["../../src/portfolio/DefaultElementProvider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,eAAO,MAAM,cAAc;;;;;;;;;CASjB,CAAC;AAOX,MAAM,WAAW,4BAA4B;IAC3C,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAuB;IACnD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAyC;IAC1E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAE1C,MAAM,CAAC,EAAE,4BAA4B;IASjD;;;OAGG;IACH,OAAO,KAAK,eAAe,GAmC1B;IAED;;;OAGG;YACW,iBAAiB;IAyC/B;;OAEG;YACW,eAAe;IAS7B;;;OAGG;YACW,gBAAgB;IAmG9B;;;OAGG;IACH;;;;OAIG;YACW,iBAAiB;IAuB/B;;;;;OAKG;YACW,wBAAwB;IA8EtC;;;;OAIG;IACU,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtE;;;OAGG;YACW,iBAAiB;CA2EhC"}
@@ -343,39 +343,27 @@ export class DefaultElementProvider {
343
343
  // Track total files copied
344
344
  let totalCopied = 0;
345
345
  const copiedCounts = {};
346
- // Map of data subdirectory names (plural) to portfolio directory names (singular)
347
- const elementMappings = {
348
- 'personas': ElementType.PERSONA,
349
- 'skills': ElementType.SKILL,
350
- 'templates': ElementType.TEMPLATE,
351
- 'agents': ElementType.AGENT,
352
- 'memories': ElementType.MEMORY,
353
- 'ensembles': ElementType.ENSEMBLE
354
- };
355
- // Copy each element type
356
- for (const [dataSubdir, elementType] of Object.entries(elementMappings)) {
357
- const sourceDir = path.join(dataDir, dataSubdir);
346
+ // Copy each element type - directories now match enum values (all plural)
347
+ for (const elementType of Object.values(ElementType)) {
348
+ const sourceDir = path.join(dataDir, elementType);
358
349
  const destDir = path.join(portfolioBaseDir, elementType);
359
350
  try {
360
351
  // Check if source directory exists
361
352
  await fs.access(sourceDir);
362
- const copiedCount = await this.copyElementFiles(sourceDir, destDir, dataSubdir);
363
- copiedCounts[dataSubdir] = copiedCount;
353
+ const copiedCount = await this.copyElementFiles(sourceDir, destDir, elementType);
354
+ copiedCounts[elementType] = copiedCount;
364
355
  totalCopied += copiedCount;
365
356
  }
366
357
  catch (error) {
367
358
  // Source directory doesn't exist, skip
368
- logger.debug(`[DefaultElementProvider] No ${dataSubdir} directory in bundled data`);
359
+ logger.debug(`[DefaultElementProvider] No ${elementType} directory in bundled data`);
369
360
  }
370
361
  }
371
362
  if (totalCopied > 0) {
372
363
  logger.info(`[DefaultElementProvider] Successfully populated portfolio with ${totalCopied} default element(s)`, {
373
364
  portfolioBaseDir,
374
365
  dataDir,
375
- breakdown: Object.entries(elementMappings).reduce((acc, [dataDir, elementType]) => {
376
- acc[elementType] = copiedCounts[dataDir] || 0;
377
- return acc;
378
- }, {})
366
+ breakdown: copiedCounts
379
367
  });
380
368
  // Log security event for successful population
381
369
  SecurityMonitor.logSecurityEvent({
@@ -395,4 +383,4 @@ export class DefaultElementProvider {
395
383
  }
396
384
  }
397
385
  }
398
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztBQUVYLHFCQUFxQjtBQUNyQixNQUFNLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0FBQ2hELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSztBQVNuQyxN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QkFDaEYsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUMsRUFBRSxFQUE0QixDQUFDO2FBQ2pDLENBQ0YsQ0FBQztZQUVGLCtDQUErQztZQUMvQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSwwQ0FBMEM7Z0JBQ2xELE9BQU8sRUFBRSx5Q0FBeUMsV0FBVyxtQkFBbUI7Z0JBQ2hGLFFBQVEsRUFBRTtvQkFDUixnQkFBZ0I7b0JBQ2hCLE9BQU87b0JBQ1AsWUFBWTtpQkFDYjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyx1RkFBdUYsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyIC0gUG9wdWxhdGVzIHBvcnRmb2xpbyB3aXRoIGRlZmF1bHQgZWxlbWVudHMgZnJvbSBidW5kbGVkIGRhdGFcbiAqIFxuICogVGhpcyBjbGFzcyBoYW5kbGVzIGNvcHlpbmcgZGVmYXVsdCBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFuZCBvdGhlciBlbGVtZW50c1xuICogZnJvbSB0aGUgTlBNIHBhY2thZ2Ugb3IgR2l0IHJlcG9zaXRvcnkgdG8gdGhlIHVzZXIncyBwb3J0Zm9saW8gb24gZmlyc3QgcnVuLlxuICogSXQgZW5zdXJlcyB1c2VycyBoYXZlIGV4YW1wbGUgY29udGVudCB0byB3b3JrIHdpdGggaW1tZWRpYXRlbHkgYWZ0ZXIgaW5zdGFsbGF0aW9uLlxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5cbi8vIEZpbGUgb3BlcmF0aW9uIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IEZJTEVfQ09OU1RBTlRTID0ge1xuICBFTEVNRU5UX0VYVEVOU0lPTjogJy5tZCcsXG4gIFlBTUxfRVhURU5TSU9OOiAnLnlhbWwnLFxuICBZTUxfRVhURU5TSU9OOiAnLnltbCcsXG4gIEpTT05fRVhURU5TSU9OOiAnLmpzb24nLFxuICBNQVhfRklMRV9TSVpFOiAxMCAqIDEwMjQgKiAxMDI0LCAvLyAxME1CIG1heCBmaWxlIHNpemUgZm9yIHNhZmV0eVxuICBDSEVDS1NVTV9BTEdPUklUSE06ICdzaGEyNTYnLFxuICBGSUxFX1BFUk1JU1NJT05TOiAwbzY0NCxcbiAgQ0hVTktfU0laRTogNjQgKiAxMDI0IC8vIDY0S0IgY2h1bmtzIGZvciByZWFkaW5nIGxhcmdlIGZpbGVzXG59IGFzIGNvbnN0O1xuXG4vLyBJbnRlcm5hbCBjb25zdGFudHNcbmNvbnN0IERBVEFfRElSX0NBQ0hFX0tFWSA9ICdkb2xsaG91c2VfZGF0YV9kaXInO1xuY29uc3QgQ09QWV9SRVRSWV9BVFRFTVBUUyA9IDM7XG5jb25zdCBDT1BZX1JFVFJZX0RFTEFZID0gMTAwOyAvLyBtc1xuXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWcge1xuICAvKiogQ3VzdG9tIGRhdGEgZGlyZWN0b3J5IHBhdGhzIHRvIHNlYXJjaCAoY2hlY2tlZCBiZWZvcmUgZGVmYXVsdCBwYXRocykgKi9cbiAgY3VzdG9tRGF0YVBhdGhzPzogc3RyaW5nW107XG4gIC8qKiBXaGV0aGVyIHRvIHVzZSBkZWZhdWx0IHNlYXJjaCBwYXRocyBhZnRlciBjdXN0b20gcGF0aHMgKi9cbiAgdXNlRGVmYXVsdFBhdGhzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRFbGVtZW50UHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IF9fZGlybmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZWREYXRhRGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcG9wdWxhdGVJblByb2dyZXNzOiBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWc7XG4gIFxuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnKSB7XG4gICAgY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICB0aGlzLl9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKTtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHVzZURlZmF1bHRQYXRoczogdHJ1ZSxcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggcGF0aHMgZm9yIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnlcbiAgICogT3JkZXJlZCBieSBwcmlvcml0eSAtIGN1c3RvbSBwYXRocyBmaXJzdCwgdGhlbiBkZXZlbG9wbWVudC9naXQsIHRoZW4gTlBNIGxvY2F0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZGF0YVNlYXJjaFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBBZGQgY3VzdG9tIHBhdGhzIGZpcnN0IChoaWdoZXN0IHByaW9yaXR5KVxuICAgIGlmICh0aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpIHtcbiAgICAgIHBhdGhzLnB1c2goLi4udGhpcy5jb25maWcuY3VzdG9tRGF0YVBhdGhzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGRlZmF1bHQgcGF0aHMgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmNvbmZpZy51c2VEZWZhdWx0UGF0aHMgIT09IGZhbHNlKSB7XG4gICAgICBwYXRocy5wdXNoKFxuICAgICAgICAvLyBEZXZlbG9wbWVudC9HaXQgaW5zdGFsbGF0aW9uIChyZWxhdGl2ZSB0byB0aGlzIGZpbGUpXG4gICAgICAgIHBhdGguam9pbih0aGlzLl9fZGlybmFtZSwgJy4uLy4uL2RhdGEnKSxcbiAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YScpLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBtYWNPUyBIb21lYnJld1xuICAgICAgICAnL29wdC9ob21lYnJldy9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gc3RhbmRhcmQgVW5peC9MaW51eFxuICAgICAgICAnL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgJy91c3IvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIFdpbmRvd3NcbiAgICAgICAgJ0M6XFxcXFByb2dyYW0gRmlsZXNcXFxcbm9kZWpzXFxcXG5vZGVfbW9kdWxlc1xcXFxAZG9sbGhvdXNlbWNwXFxcXG1jcC1zZXJ2ZXJcXFxcZGF0YScsXG4gICAgICAgICdDOlxcXFxQcm9ncmFtIEZpbGVzICh4ODYpXFxcXG5vZGVqc1xcXFxub2RlX21vZHVsZXNcXFxcQGRvbGxob3VzZW1jcFxcXFxtY3Atc2VydmVyXFxcXGRhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBXaW5kb3dzIHdpdGggbnZtXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmVudi5BUFBEQVRBIHx8ICcnLCAnbnBtJywgJ25vZGVfbW9kdWxlcycsICdAZG9sbGhvdXNlbWNwJywgJ21jcC1zZXJ2ZXInLCAnZGF0YScpLFxuICAgICAgICBcbiAgICAgICAgLy8gQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAobGFzdCByZXNvcnQpXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnZGF0YScpXG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGJ5IGNoZWNraW5nIGVhY2ggc2VhcmNoIHBhdGhcbiAgICogVXNlcyBQcm9taXNlLmFsbFNldHRsZWQgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgY2FjaGVzIHRoZSByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZERhdGFEaXJlY3RvcnkoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCB2YWx1ZSBpZiBhdmFpbGFibGVcbiAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBhbGwgcGF0aHMgaW4gcGFyYWxsZWwgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IGNoZWNrUHJvbWlzZXMgPSB0aGlzLmRhdGFTZWFyY2hQYXRocy5tYXAoYXN5bmMgKHNlYXJjaFBhdGgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChzZWFyY2hQYXRoKTtcbiAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAvLyBWZXJpZnkgaXQgY29udGFpbnMgZXhwZWN0ZWQgc3ViZGlyZWN0b3JpZXNcbiAgICAgICAgICBjb25zdCBoYXNQZXJzb25hcyA9IGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKHBhdGguam9pbihzZWFyY2hQYXRoLCAncGVyc29uYXMnKSk7XG4gICAgICAgICAgY29uc3QgaGFzU2tpbGxzID0gYXdhaXQgdGhpcy5kaXJlY3RvcnlFeGlzdHMocGF0aC5qb2luKHNlYXJjaFBhdGgsICdza2lsbHMnKSk7XG4gICAgICAgICAgaWYgKGhhc1BlcnNvbmFzIHx8IGhhc1NraWxscykge1xuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBhY2Nlc3NlZFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2hlY2tQcm9taXNlcyk7XG4gICAgXG4gICAgLy8gRmluZCB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHRcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgcmVzdWx0LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRm91bmQgZGF0YSBkaXJlY3RvcnkgYXQ6ICR7cmVzdWx0LnZhbHVlfWApO1xuICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0XG4gICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpciA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLndhcm4oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGZvdW5kIGluIGFueSBzZWFyY2ggcGF0aCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogSGVscGVyIHRvIGNoZWNrIGlmIGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXJlY3RvcnlFeGlzdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChkaXJQYXRoKTtcbiAgICAgIHJldHVybiBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENvcHkgYWxsIGZpbGVzIGZyb20gc291cmNlIGRpcmVjdG9yeSB0byBkZXN0aW5hdGlvbiBkaXJlY3RvcnlcbiAgICogU2tpcHMgZmlsZXMgdGhhdCBhbHJlYWR5IGV4aXN0IHRvIHByZXNlcnZlIHVzZXIgbW9kaWZpY2F0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpcjogc3RyaW5nLCBkZXN0RGlyOiBzdHJpbmcsIGVsZW1lbnRUeXBlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCBjb3BpZWRDb3VudCA9IDA7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCBmcy5ta2RpcihkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVhZCBzb3VyY2UgZGlyZWN0b3J5XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoc291cmNlRGlyKTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIC8vIE9ubHkgY29weSBtYXJrZG93biBmaWxlc1xuICAgICAgICBpZiAoIWZpbGUuZW5kc1dpdGgoRklMRV9DT05TVEFOVFMuRUxFTUVOVF9FWFRFTlNJT04pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBmaWxlbmFtZSBmb3Igc2VjdXJpdHlcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShmaWxlKTtcbiAgICAgICAgaWYgKCFub3JtYWxpemVkRmlsZS5pc1ZhbGlkKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBmaWxlIHdpdGggaW52YWxpZCBVbmljb2RlOiAke2ZpbGV9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLmpvaW4oc291cmNlRGlyLCBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKGRlc3REaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZGVzdGluYXRpb24gZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhkZXN0UGF0aCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZXhpc3RpbmcgZmlsZTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggY29weVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFZhbGlkYXRlIHNvdXJjZSBmaWxlIGJlZm9yZSBjb3B5aW5nXG4gICAgICAgICAgY29uc3Qgc291cmNlU3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNvdXJjZVBhdGgpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZSBsaW1pdFxuICAgICAgICAgIGlmIChzb3VyY2VTdGF0cy5zaXplID4gRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgb3ZlcnNpemVkIGZpbGUgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH06IGAgK1xuICAgICAgICAgICAgICBgJHtzb3VyY2VTdGF0cy5zaXplfSBieXRlcyAobWF4OiAke0ZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkV9IGJ5dGVzKWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsIFxuICAgICAgICAgICAgICAgIHNpemU6IHNvdXJjZVN0YXRzLnNpemUsXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3B5IHRoZSBmaWxlIHdpdGggdmVyaWZpY2F0aW9uXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgICAgIGNvcGllZENvdW50Kys7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7ZWxlbWVudFR5cGV9OiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWApO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZWFjaCBmaWxlIGNvcGllZFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlFbGVtZW50RmlsZXMnLFxuICAgICAgICAgICAgZGV0YWlsczogYENvcGllZCBkZWZhdWx0ICR7ZWxlbWVudFR5cGV9IGZpbGU6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgIGRlc3RQYXRoLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVNpemU6IChhd2FpdCBmcy5zdGF0KGRlc3RQYXRoKSkuc2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRmFpbGVkIHRvIGNvcHkgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgZXJyb3I6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgICBzb3VyY2VQYXRoLFxuICAgICAgICAgICAgICBkZXN0UGF0aCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXMgaW5zdGVhZCBvZiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY29waWVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7Y29waWVkQ291bnR9ICR7ZWxlbWVudFR5cGV9IGZpbGUocylgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjb3B5aW5nICR7ZWxlbWVudFR5cGV9IGZpbGVzOmAsIGVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvcGllZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhIGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gICAqIEVuc3VyZXMgdGhlIGZpbGUgd2FzIGNvcGllZCBjb3JyZWN0bHkgYnkgY29tcGFyaW5nIHNpemVzXG4gICAqL1xuICAvKipcbiAgICogQ2FsY3VsYXRlIGNoZWNrc3VtIG9mIGEgZmlsZSBmb3IgaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZVxuICAgKiBAcmV0dXJucyBIZXgtZW5jb2RlZCBjaGVja3N1bVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVDaGVja3N1bShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChGSUxFX0NPTlNUQU5UUy5DSEVDS1NVTV9BTEdPUklUSE0pO1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhGSUxFX0NPTlNUQU5UUy5DSFVOS19TSVpFKTtcbiAgICAgIGxldCBieXRlc1JlYWQ6IG51bWJlcjtcbiAgICAgIFxuICAgICAgZG8ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW0ucmVhZChidWZmZXIsIDAsIEZJTEVfQ09OU1RBTlRTLkNIVU5LX1NJWkUpO1xuICAgICAgICBieXRlc1JlYWQgPSByZXN1bHQuYnl0ZXNSZWFkO1xuICAgICAgICBcbiAgICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHtcbiAgICAgICAgICBoYXNoLnVwZGF0ZShidWZmZXIuc3ViYXJyYXkoMCwgYnl0ZXNSZWFkKSk7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKGJ5dGVzUmVhZCA+IDApO1xuICAgICAgXG4gICAgICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBzdHJlYW0uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29weSBmaWxlIHdpdGggaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiBhbmQgcmV0cnkgbG9naWNcbiAgICogQHBhcmFtIHNvdXJjZVBhdGggU291cmNlIGZpbGUgcGF0aFxuICAgKiBAcGFyYW0gZGVzdFBhdGggRGVzdGluYXRpb24gZmlsZSBwYXRoXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgY29weSBmYWlscyBhZnRlciBhbGwgcmV0cnkgYXR0ZW1wdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoVmVyaWZpY2F0aW9uKHNvdXJjZVBhdGg6IHN0cmluZywgZGVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gQ09QWV9SRVRSWV9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDb3B5IHRoZSBmaWxlXG4gICAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBzaXplIG1hdGNoZXNcbiAgICAgICAgY29uc3QgW3NvdXJjZVN0YXRzLCBkZXN0U3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGZzLnN0YXQoc291cmNlUGF0aCksXG4gICAgICAgICAgZnMuc3RhdChkZXN0UGF0aClcbiAgICAgICAgXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc291cmNlU3RhdHMuc2l6ZSAhPT0gZGVzdFN0YXRzLnNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2l6ZSBtaXNtYXRjaCBhZnRlciBjb3B5IC0gc291cmNlOiAke3NvdXJjZVN0YXRzLnNpemV9IGJ5dGVzLCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0U3RhdHMuc2l6ZX0gYnl0ZXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IGNoZWNrc3VtIG1hdGNoZXMgZm9yIGNvbXBsZXRlIGludGVncml0eVxuICAgICAgICBjb25zdCBbc291cmNlQ2hlY2tzdW0sIGRlc3RDaGVja3N1bV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDaGVja3N1bShzb3VyY2VQYXRoKSxcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNoZWNrc3VtKGRlc3RQYXRoKVxuICAgICAgICBdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChzb3VyY2VDaGVja3N1bSAhPT0gZGVzdENoZWNrc3VtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENoZWNrc3VtIG1pc21hdGNoIGFmdGVyIGNvcHkgLSBzb3VyY2U6ICR7c291cmNlQ2hlY2tzdW19LCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0Q2hlY2tzdW19YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFNldCBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5jaG1vZChkZXN0UGF0aCwgRklMRV9DT05TVEFOVFMuRklMRV9QRVJNSVNTSU9OUyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3Qgc2V0IHBlcm1pc3Npb25zIG9uICR7ZGVzdFBhdGh9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBhdHRlbXB0IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTdWNjZXNzIC0gZmlsZSBjb3BpZWQgYW5kIHZlcmlmaWVkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN1Y2Nlc3NmdWxseSBjb3BpZWQgYW5kIHZlcmlmaWVkOiAke3BhdGguYmFzZW5hbWUoc291cmNlUGF0aCl9YCxcbiAgICAgICAgICB7IHNpemU6IHNvdXJjZVN0YXRzLnNpemUsIGNoZWNrc3VtOiBzb3VyY2VDaGVja3N1bS5zdWJzdHJpbmcoMCwgOCkgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhbiB1cCBmYWlsZWQgY29weVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLnVubGluayhkZXN0UGF0aCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoYXR0ZW1wdCA8IENPUFlfUkVUUllfQVRURU1QVFMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcHkgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZCwgcmV0cnlpbmcuLi5gLFxuICAgICAgICAgICAgeyBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIHNvdXJjZVBhdGgsIGRlc3RQYXRoIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBDT1BZX1JFVFJZX0RFTEFZICogYXR0ZW1wdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNvcHkgJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfSBhZnRlciAke0NPUFlfUkVUUllfQVRURU1QVFN9IGF0dGVtcHRzOiBgICtcbiAgICAgIGAke2xhc3RFcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YFxuICAgICk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSB0aGUgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICAgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgcG9ydGZvbGlvIGluaXRpYWxpemF0aW9uIGZvciBuZXcgaW5zdGFsbGF0aW9uc1xuICAgKiBQcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IGNhbGxzIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9wdWxhdGVEZWZhdWx0cyhwb3J0Zm9saW9CYXNlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBwb3B1bGF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgcG9ydGZvbGlvXG4gICAgY29uc3QgZXhpc3RpbmdQb3B1bGF0aW9uID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuZ2V0KHBvcnRmb2xpb0Jhc2VEaXIpO1xuICAgIGlmIChleGlzdGluZ1BvcHVsYXRpb24pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQb3B1bGF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHBvcnRmb2xpbywgd2FpdGluZy4uLicsXG4gICAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUG9wdWxhdGlvbjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyBwb3B1bGF0aW9uIHByb21pc2VcbiAgICBjb25zdCBwb3B1bGF0aW9uUHJvbWlzZSA9IHRoaXMucGVyZm9ybVBvcHVsYXRpb24ocG9ydGZvbGlvQmFzZURpcilcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgd2hlbiBkb25lXG4gICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmRlbGV0ZShwb3J0Zm9saW9CYXNlRGlyKTtcbiAgICAgIH0pO1xuICAgIFxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLnNldChwb3J0Zm9saW9CYXNlRGlyLCBwb3B1bGF0aW9uUHJvbWlzZSk7XG4gICAgcmV0dXJuIHBvcHVsYXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHBvcHVsYXRpb24gb2YgZGVmYXVsdCBlbGVtZW50c1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvQmFzZURpciBCYXNlIGRpcmVjdG9yeSBvZiB0aGUgcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1Qb3B1bGF0aW9uKHBvcnRmb2xpb0Jhc2VEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTdGFydGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbicsXG4gICAgICB7IHBvcnRmb2xpb0Jhc2VEaXIgfVxuICAgICk7XG4gICAgXG4gICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBwb3J0Zm9saW8gaW5pdGlhbGl6YXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIucGVyZm9ybVBvcHVsYXRpb24nLFxuICAgICAgZGV0YWlsczogYFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uIGZvciBwb3J0Zm9saW86ICR7cG9ydGZvbGlvQmFzZURpcn1gXG4gICAgfSk7XG4gICAgXG4gICAgLy8gRmluZCB0aGUgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeVxuICAgIGNvbnN0IGRhdGFEaXIgPSBhd2FpdCB0aGlzLmZpbmREYXRhRGlyZWN0b3J5KCk7XG4gICAgaWYgKCFkYXRhRGlyKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGZvdW5kIC0gcG9ydGZvbGlvIHdpbGwgc3RhcnQgZW1wdHknLFxuICAgICAgICB7IFxuICAgICAgICAgIHNlYXJjaFBhdGhzOiB0aGlzLmRhdGFTZWFyY2hQYXRocy5zbGljZSgwLCAzKSwgLy8gTG9nIGZpcnN0IGZldyBwYXRocyBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIGRpcm5hbWU6IHRoaXMuX19kaXJuYW1lXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFRyYWNrIHRvdGFsIGZpbGVzIGNvcGllZFxuICAgIGxldCB0b3RhbENvcGllZCA9IDA7XG4gICAgY29uc3QgY29waWVkQ291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgXG4gICAgLy8gTWFwIG9mIGRhdGEgc3ViZGlyZWN0b3J5IG5hbWVzIChwbHVyYWwpIHRvIHBvcnRmb2xpbyBkaXJlY3RvcnkgbmFtZXMgKHNpbmd1bGFyKVxuICAgIGNvbnN0IGVsZW1lbnRNYXBwaW5nczogUmVjb3JkPHN0cmluZywgRWxlbWVudFR5cGU+ID0ge1xuICAgICAgJ3BlcnNvbmFzJzogRWxlbWVudFR5cGUuUEVSU09OQSxcbiAgICAgICdza2lsbHMnOiBFbGVtZW50VHlwZS5TS0lMTCxcbiAgICAgICd0ZW1wbGF0ZXMnOiBFbGVtZW50VHlwZS5URU1QTEFURSxcbiAgICAgICdhZ2VudHMnOiBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICdtZW1vcmllcyc6IEVsZW1lbnRUeXBlLk1FTU9SWSxcbiAgICAgICdlbnNlbWJsZXMnOiBFbGVtZW50VHlwZS5FTlNFTUJMRVxuICAgIH07XG4gICAgXG4gICAgLy8gQ29weSBlYWNoIGVsZW1lbnQgdHlwZVxuICAgIGZvciAoY29uc3QgW2RhdGFTdWJkaXIsIGVsZW1lbnRUeXBlXSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50TWFwcGluZ3MpKSB7XG4gICAgICBjb25zdCBzb3VyY2VEaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YVN1YmRpcik7XG4gICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5qb2luKHBvcnRmb2xpb0Jhc2VEaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgc291cmNlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHNvdXJjZURpcik7XG4gICAgICAgIGNvbnN0IGNvcGllZENvdW50ID0gYXdhaXQgdGhpcy5jb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpciwgZGVzdERpciwgZGF0YVN1YmRpcik7XG4gICAgICAgIGNvcGllZENvdW50c1tkYXRhU3ViZGlyXSA9IGNvcGllZENvdW50O1xuICAgICAgICB0b3RhbENvcGllZCArPSBjb3BpZWRDb3VudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNvdXJjZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgc2tpcFxuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyAke2RhdGFTdWJkaXJ9IGRpcmVjdG9yeSBpbiBidW5kbGVkIGRhdGFgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKHRvdGFsQ29waWVkID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3VjY2Vzc2Z1bGx5IHBvcHVsYXRlZCBwb3J0Zm9saW8gd2l0aCAke3RvdGFsQ29waWVkfSBkZWZhdWx0IGVsZW1lbnQocylgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGJyZWFrZG93bjogT2JqZWN0LmVudHJpZXMoZWxlbWVudE1hcHBpbmdzKS5yZWR1Y2UoKGFjYywgW2RhdGFEaXIsIGVsZW1lbnRUeXBlXSkgPT4ge1xuICAgICAgICAgICAgYWNjW2VsZW1lbnRUeXBlXSA9IGNvcGllZENvdW50c1tkYXRhRGlyXSB8fCAwO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHN1Y2Nlc3NmdWwgcG9wdWxhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX1BPUFVMQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBTdWNjZXNzZnVsbHkgcG9wdWxhdGVkIHBvcnRmb2xpbyB3aXRoICR7dG90YWxDb3BpZWR9IGRlZmF1bHQgZWxlbWVudHNgLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHBvcnRmb2xpb0Jhc2VEaXIsXG4gICAgICAgICAgZGF0YURpcixcbiAgICAgICAgICBjb3BpZWRDb3VudHNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gbmV3IGVsZW1lbnRzIHRvIGNvcHkgLSBwb3J0Zm9saW8gbWF5IGFscmVhZHkgaGF2ZSBjb250ZW50Jyk7XG4gICAgfVxuICB9XG59Il19
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztBQUVYLHFCQUFxQjtBQUNyQixNQUFNLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0FBQ2hELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSztBQVNuQyxN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biAqIERlZmF1bHRFbGVtZW50UHJvdmlkZXIgLSBQb3B1bGF0ZXMgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICogXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgY29weWluZyBkZWZhdWx0IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYW5kIG90aGVyIGVsZW1lbnRzXG4gKiBmcm9tIHRoZSBOUE0gcGFja2FnZSBvciBHaXQgcmVwb3NpdG9yeSB0byB0aGUgdXNlcidzIHBvcnRmb2xpbyBvbiBmaXJzdCBydW4uXG4gKiBJdCBlbnN1cmVzIHVzZXJzIGhhdmUgZXhhbXBsZSBjb250ZW50IHRvIHdvcmsgd2l0aCBpbW1lZGlhdGVseSBhZnRlciBpbnN0YWxsYXRpb24uXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcblxuLy8gRmlsZSBvcGVyYXRpb24gY29uc3RhbnRzXG5leHBvcnQgY29uc3QgRklMRV9DT05TVEFOVFMgPSB7XG4gIEVMRU1FTlRfRVhURU5TSU9OOiAnLm1kJyxcbiAgWUFNTF9FWFRFTlNJT046ICcueWFtbCcsXG4gIFlNTF9FWFRFTlNJT046ICcueW1sJyxcbiAgSlNPTl9FWFRFTlNJT046ICcuanNvbicsXG4gIE1BWF9GSUxFX1NJWkU6IDEwICogMTAyNCAqIDEwMjQsIC8vIDEwTUIgbWF4IGZpbGUgc2l6ZSBmb3Igc2FmZXR5XG4gIENIRUNLU1VNX0FMR09SSVRITTogJ3NoYTI1NicsXG4gIEZJTEVfUEVSTUlTU0lPTlM6IDBvNjQ0LFxuICBDSFVOS19TSVpFOiA2NCAqIDEwMjQgLy8gNjRLQiBjaHVua3MgZm9yIHJlYWRpbmcgbGFyZ2UgZmlsZXNcbn0gYXMgY29uc3Q7XG5cbi8vIEludGVybmFsIGNvbnN0YW50c1xuY29uc3QgREFUQV9ESVJfQ0FDSEVfS0VZID0gJ2RvbGxob3VzZV9kYXRhX2Rpcic7XG5jb25zdCBDT1BZX1JFVFJZX0FUVEVNUFRTID0gMztcbmNvbnN0IENPUFlfUkVUUllfREVMQVkgPSAxMDA7IC8vIG1zXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZyB7XG4gIC8qKiBDdXN0b20gZGF0YSBkaXJlY3RvcnkgcGF0aHMgdG8gc2VhcmNoIChjaGVja2VkIGJlZm9yZSBkZWZhdWx0IHBhdGhzKSAqL1xuICBjdXN0b21EYXRhUGF0aHM/OiBzdHJpbmdbXTtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlZmF1bHQgc2VhcmNoIHBhdGhzIGFmdGVyIGN1c3RvbSBwYXRocyAqL1xuICB1c2VEZWZhdWx0UGF0aHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX19kaXJuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlZERhdGFEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBwb3B1bGF0ZUluUHJvZ3Jlc3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZztcbiAgXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWcpIHtcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgIHRoaXMuX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdXNlRGVmYXVsdFBhdGhzOiB0cnVlLFxuICAgICAgLi4uY29uZmlnXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNlYXJjaCBwYXRocyBmb3IgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeVxuICAgKiBPcmRlcmVkIGJ5IHByaW9yaXR5IC0gY3VzdG9tIHBhdGhzIGZpcnN0LCB0aGVuIGRldmVsb3BtZW50L2dpdCwgdGhlbiBOUE0gbG9jYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGdldCBkYXRhU2VhcmNoUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIC8vIEFkZCBjdXN0b20gcGF0aHMgZmlyc3QgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAgaWYgKHRoaXMuY29uZmlnLmN1c3RvbURhdGFQYXRocykge1xuICAgICAgcGF0aHMucHVzaCguLi50aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgZGVmYXVsdCBwYXRocyBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLnVzZURlZmF1bHRQYXRocyAhPT0gZmFsc2UpIHtcbiAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgIC8vIERldmVsb3BtZW50L0dpdCBpbnN0YWxsYXRpb24gKHJlbGF0aXZlIHRvIHRoaXMgZmlsZSlcbiAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vZGF0YScpLFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLi8uLi8uLi9kYXRhJyksXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIG1hY09TIEhvbWVicmV3XG4gICAgICAgICcvb3B0L2hvbWVicmV3L2xpYi9ub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyL2RhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBzdGFuZGFyZCBVbml4L0xpbnV4XG4gICAgICAgICcvdXNyL2xvY2FsL2xpYi9ub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyL2RhdGEnLFxuICAgICAgICAnL3Vzci9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gV2luZG93c1xuICAgICAgICAnQzpcXFxcUHJvZ3JhbSBGaWxlc1xcXFxub2RlanNcXFxcbm9kZV9tb2R1bGVzXFxcXEBkb2xsaG91c2VtY3BcXFxcbWNwLXNlcnZlclxcXFxkYXRhJyxcbiAgICAgICAgJ0M6XFxcXFByb2dyYW0gRmlsZXMgKHg4NilcXFxcbm9kZWpzXFxcXG5vZGVfbW9kdWxlc1xcXFxAZG9sbGhvdXNlbWNwXFxcXG1jcC1zZXJ2ZXJcXFxcZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIFdpbmRvd3Mgd2l0aCBudm1cbiAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuZW52LkFQUERBVEEgfHwgJycsICducG0nLCAnbm9kZV9tb2R1bGVzJywgJ0Bkb2xsaG91c2VtY3AnLCAnbWNwLXNlcnZlcicsICdkYXRhJyksXG4gICAgICAgIFxuICAgICAgICAvLyBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChsYXN0IHJlc29ydClcbiAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdkYXRhJylcbiAgICAgICk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBwYXRocztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZpbmQgdGhlIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgYnkgY2hlY2tpbmcgZWFjaCBzZWFyY2ggcGF0aFxuICAgKiBVc2VzIFByb21pc2UuYWxsU2V0dGxlZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBjYWNoZXMgdGhlIHJlc3VsdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRGF0YURpcmVjdG9yeSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZVxuICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXI7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGFsbCBwYXRocyBpbiBwYXJhbGxlbCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgY29uc3QgY2hlY2tQcm9taXNlcyA9IHRoaXMuZGF0YVNlYXJjaFBhdGhzLm1hcChhc3luYyAoc2VhcmNoUGF0aCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNlYXJjaFBhdGgpO1xuICAgICAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIC8vIFZlcmlmeSBpdCBjb250YWlucyBleHBlY3RlZCBzdWJkaXJlY3Rvcmllc1xuICAgICAgICAgIGNvbnN0IGhhc1BlcnNvbmFzID0gYXdhaXQgdGhpcy5kaXJlY3RvcnlFeGlzdHMocGF0aC5qb2luKHNlYXJjaFBhdGgsICdwZXJzb25hcycpKTtcbiAgICAgICAgICBjb25zdCBoYXNTa2lsbHMgPSBhd2FpdCB0aGlzLmRpcmVjdG9yeUV4aXN0cyhwYXRoLmpvaW4oc2VhcmNoUGF0aCwgJ3NraWxscycpKTtcbiAgICAgICAgICBpZiAoaGFzUGVyc29uYXMgfHwgaGFzU2tpbGxzKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VhcmNoUGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIGFjY2Vzc2VkXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjaGVja1Byb21pc2VzKTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJlc3VsdFxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBGb3VuZCBkYXRhIGRpcmVjdG9yeSBhdDogJHtyZXN1bHQudmFsdWV9YCk7XG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIud2FybignW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgaW4gYW55IHNlYXJjaCBwYXRoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gY2hlY2sgaWYgYSBkaXJlY3RvcnkgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpcmVjdG9yeUV4aXN0cyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGRpclBhdGgpO1xuICAgICAgcmV0dXJuIHN0YXRzLmlzRGlyZWN0b3J5KCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhbGwgZmlsZXMgZnJvbSBzb3VyY2UgZGlyZWN0b3J5IHRvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeVxuICAgKiBTa2lwcyBmaWxlcyB0aGF0IGFscmVhZHkgZXhpc3QgdG8gcHJlc2VydmUgdXNlciBtb2RpZmljYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlFbGVtZW50RmlsZXMoc291cmNlRGlyOiBzdHJpbmcsIGRlc3REaXI6IHN0cmluZywgZWxlbWVudFR5cGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IGNvcGllZENvdW50ID0gMDtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGRlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICAvLyBSZWFkIHNvdXJjZSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihzb3VyY2VEaXIpO1xuICAgICAgXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgLy8gT25seSBjb3B5IG1hcmtkb3duIGZpbGVzXG4gICAgICAgIGlmICghZmlsZS5lbmRzV2l0aChGSUxFX0NPTlNUQU5UUy5FTEVNRU5UX0VYVEVOU0lPTikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTm9ybWFsaXplIGZpbGVuYW1lIGZvciBzZWN1cml0eVxuICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGZpbGUpO1xuICAgICAgICBpZiAoIW5vcm1hbGl6ZWRGaWxlLmlzVmFsaWQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIGZpbGUgd2l0aCBpbnZhbGlkIFVuaWNvZGU6ICR7ZmlsZX1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VEaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBkZXN0aW5hdGlvbiBmaWxlIGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGRlc3RQYXRoKTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBleGlzdGluZyBmaWxlOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHByb2NlZWQgd2l0aCBjb3B5XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVmFsaWRhdGUgc291cmNlIGZpbGUgYmVmb3JlIGNvcHlpbmdcbiAgICAgICAgICBjb25zdCBzb3VyY2VTdGF0cyA9IGF3YWl0IGZzLnN0YXQoc291cmNlUGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ2hlY2sgZmlsZSBzaXplIGxpbWl0XG4gICAgICAgICAgaWYgKHNvdXJjZVN0YXRzLnNpemUgPiBGSUxFX0NPTlNUQU5UUy5NQVhfRklMRV9TSVpFKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBvdmVyc2l6ZWQgZmlsZSAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fTogYCArXG4gICAgICAgICAgICAgIGAke3NvdXJjZVN0YXRzLnNpemV9IGJ5dGVzIChtYXg6ICR7RklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRX0gYnl0ZXMpYCxcbiAgICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgICBmaWxlOiBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCwgXG4gICAgICAgICAgICAgICAgc2l6ZTogc291cmNlU3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgICBtYXhTaXplOiBGSUxFX0NPTlNUQU5UUy5NQVhfRklMRV9TSVpFLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIENvcHkgdGhlIGZpbGUgd2l0aCB2ZXJpZmljYXRpb25cbiAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlV2l0aFZlcmlmaWNhdGlvbihzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gICAgICAgICAgY29waWVkQ291bnQrKztcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3BpZWQgJHtlbGVtZW50VHlwZX06ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBlYWNoIGZpbGUgY29waWVkXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ0ZJTEVfQ09QSUVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29weUVsZW1lbnRGaWxlcycsXG4gICAgICAgICAgICBkZXRhaWxzOiBgQ29waWVkIGRlZmF1bHQgJHtlbGVtZW50VHlwZX0gZmlsZTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgc291cmNlUGF0aCxcbiAgICAgICAgICAgICAgZGVzdFBhdGgsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBmaWxlU2l6ZTogKGF3YWl0IGZzLnN0YXQoZGVzdFBhdGgpKS5zaXplXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBGYWlsZWQgdG8gY29weSAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICB7IFxuICAgICAgICAgICAgICBlcnJvcjogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIHN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgIGRlc3RQYXRoLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gQ29udGludWUgd2l0aCBvdGhlciBmaWxlcyBpbnN0ZWFkIG9mIGZhaWxpbmcgY29tcGxldGVseVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjb3BpZWRDb3VudCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3BpZWQgJHtjb3BpZWRDb3VudH0gJHtlbGVtZW50VHlwZX0gZmlsZShzKWApO1xuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNvcHlpbmcgJHtlbGVtZW50VHlwZX0gZmlsZXM6YCwgZXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY29waWVkQ291bnQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3B5IGEgZmlsZSB3aXRoIGludGVncml0eSB2ZXJpZmljYXRpb25cbiAgICogRW5zdXJlcyB0aGUgZmlsZSB3YXMgY29waWVkIGNvcnJlY3RseSBieSBjb21wYXJpbmcgc2l6ZXNcbiAgICovXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgY2hlY2tzdW0gb2YgYSBmaWxlIGZvciBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBmaWxlXG4gICAqIEByZXR1cm5zIEhleC1lbmNvZGVkIGNoZWNrc3VtXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZUNoZWNrc3VtKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKEZJTEVfQ09OU1RBTlRTLkNIRUNLU1VNX0FMR09SSVRITSk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKEZJTEVfQ09OU1RBTlRTLkNIVU5LX1NJWkUpO1xuICAgICAgbGV0IGJ5dGVzUmVhZDogbnVtYmVyO1xuICAgICAgXG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmVhbS5yZWFkKGJ1ZmZlciwgMCwgRklMRV9DT05TVEFOVFMuQ0hVTktfU0laRSk7XG4gICAgICAgIGJ5dGVzUmVhZCA9IHJlc3VsdC5ieXRlc1JlYWQ7XG4gICAgICAgIFxuICAgICAgICBpZiAoYnl0ZXNSZWFkID4gMCkge1xuICAgICAgICAgIGhhc2gudXBkYXRlKGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKTtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoYnl0ZXNSZWFkID4gMCk7XG4gICAgICBcbiAgICAgIHJldHVybiBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHN0cmVhbS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uIGFuZCByZXRyeSBsb2dpY1xuICAgKiBAcGFyYW0gc291cmNlUGF0aCBTb3VyY2UgZmlsZSBwYXRoXG4gICAqIEBwYXJhbSBkZXN0UGF0aCBEZXN0aW5hdGlvbiBmaWxlIHBhdGhcbiAgICogQHRocm93cyBFcnJvciBpZiBjb3B5IGZhaWxzIGFmdGVyIGFsbCByZXRyeSBhdHRlbXB0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aDogc3RyaW5nLCBkZXN0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBDT1BZX1JFVFJZX0FUVEVNUFRTOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENvcHkgdGhlIGZpbGVcbiAgICAgICAgYXdhaXQgZnMuY29weUZpbGUoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IHNpemUgbWF0Y2hlc1xuICAgICAgICBjb25zdCBbc291cmNlU3RhdHMsIGRlc3RTdGF0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgZnMuc3RhdChzb3VyY2VQYXRoKSxcbiAgICAgICAgICBmcy5zdGF0KGRlc3RQYXRoKVxuICAgICAgICBdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChzb3VyY2VTdGF0cy5zaXplICE9PSBkZXN0U3RhdHMuc2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTaXplIG1pc21hdGNoIGFmdGVyIGNvcHkgLSBzb3VyY2U6ICR7c291cmNlU3RhdHMuc2l6ZX0gYnl0ZXMsIGAgK1xuICAgICAgICAgICAgYGRlc3RpbmF0aW9uOiAke2Rlc3RTdGF0cy5zaXplfSBieXRlc2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBWZXJpZnkgY2hlY2tzdW0gbWF0Y2hlcyBmb3IgY29tcGxldGUgaW50ZWdyaXR5XG4gICAgICAgIGNvbnN0IFtzb3VyY2VDaGVja3N1bSwgZGVzdENoZWNrc3VtXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNoZWNrc3VtKHNvdXJjZVBhdGgpLFxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oZGVzdFBhdGgpXG4gICAgICAgIF0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKHNvdXJjZUNoZWNrc3VtICE9PSBkZXN0Q2hlY2tzdW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2hlY2tzdW0gbWlzbWF0Y2ggYWZ0ZXIgY29weSAtIHNvdXJjZTogJHtzb3VyY2VDaGVja3N1bX0sIGAgK1xuICAgICAgICAgICAgYGRlc3RpbmF0aW9uOiAke2Rlc3RDaGVja3N1bX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gU2V0IHByb3BlciBwZXJtaXNzaW9uc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLmNobW9kKGRlc3RQYXRoLCBGSUxFX0NPTlNUQU5UUy5GSUxFX1BFUk1JU1NJT05TKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvdWxkIG5vdCBzZXQgcGVybWlzc2lvbnMgb24gJHtkZXN0UGF0aH06ICR7ZXJyb3J9YCxcbiAgICAgICAgICAgIHsgc291cmNlUGF0aCwgZGVzdFBhdGgsIGF0dGVtcHQgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFN1Y2Nlc3MgLSBmaWxlIGNvcGllZCBhbmQgdmVyaWZpZWRcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3VjY2Vzc2Z1bGx5IGNvcGllZCBhbmQgdmVyaWZpZWQ6ICR7cGF0aC5iYXNlbmFtZShzb3VyY2VQYXRoKX1gLFxuICAgICAgICAgIHsgc2l6ZTogc291cmNlU3RhdHMuc2l6ZSwgY2hlY2tzdW06IHNvdXJjZUNoZWNrc3VtLnN1YnN0cmluZygwLCA4KSB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFuIHVwIGZhaWxlZCBjb3B5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMudW5saW5rKGRlc3RQYXRoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChhdHRlbXB0IDwgQ09QWV9SRVRSWV9BVFRFTVBUUykge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29weSBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkLCByZXRyeWluZy4uLmAsXG4gICAgICAgICAgICB7IGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSwgc291cmNlUGF0aCwgZGVzdFBhdGggfVxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIENPUFlfUkVUUllfREVMQVkgKiBhdHRlbXB0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWxsIGF0dGVtcHRzIGZhaWxlZFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gY29weSAke3BhdGguYmFzZW5hbWUoc291cmNlUGF0aCl9IGFmdGVyICR7Q09QWV9SRVRSWV9BVFRFTVBUU30gYXR0ZW1wdHM6IGAgK1xuICAgICAgYCR7bGFzdEVycm9yPy5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJ31gXG4gICAgKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFBvcHVsYXRlIHRoZSBwb3J0Zm9saW8gd2l0aCBkZWZhdWx0IGVsZW1lbnRzIGZyb20gYnVuZGxlZCBkYXRhXG4gICAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBwb3J0Zm9saW8gaW5pdGlhbGl6YXRpb24gZm9yIG5ldyBpbnN0YWxsYXRpb25zXG4gICAqIFByb3RlY3RlZCBhZ2FpbnN0IGNvbmN1cnJlbnQgY2FsbHMgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwb3B1bGF0ZURlZmF1bHRzKHBvcnRmb2xpb0Jhc2VEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHBvcHVsYXRpb24gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyBmb3IgdGhpcyBwb3J0Zm9saW9cbiAgICBjb25zdCBleGlzdGluZ1BvcHVsYXRpb24gPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5nZXQocG9ydGZvbGlvQmFzZURpcik7XG4gICAgaWYgKGV4aXN0aW5nUG9wdWxhdGlvbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFBvcHVsYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyBmb3IgcG9ydGZvbGlvLCB3YWl0aW5nLi4uJyxcbiAgICAgICAgeyBwb3J0Zm9saW9CYXNlRGlyIH1cbiAgICAgICk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdQb3B1bGF0aW9uO1xuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgbmV3IHBvcHVsYXRpb24gcHJvbWlzZVxuICAgIGNvbnN0IHBvcHVsYXRpb25Qcm9taXNlID0gdGhpcy5wZXJmb3JtUG9wdWxhdGlvbihwb3J0Zm9saW9CYXNlRGlyKVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCB3aGVuIGRvbmVcbiAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuZGVsZXRlKHBvcnRmb2xpb0Jhc2VEaXIpO1xuICAgICAgfSk7XG4gICAgXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3Muc2V0KHBvcnRmb2xpb0Jhc2VEaXIsIHBvcHVsYXRpb25Qcm9taXNlKTtcbiAgICByZXR1cm4gcG9wdWxhdGlvblByb21pc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgcG9wdWxhdGlvbiBvZiBkZWZhdWx0IGVsZW1lbnRzXG4gICAqIEBwYXJhbSBwb3J0Zm9saW9CYXNlRGlyIEJhc2UgZGlyZWN0b3J5IG9mIHRoZSBwb3J0Zm9saW9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVBvcHVsYXRpb24ocG9ydGZvbGlvQmFzZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uJyxcbiAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgKTtcbiAgICBcbiAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHBvcnRmb2xpbyBpbml0aWFsaXphdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICBkZXRhaWxzOiBgU3RhcnRpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24gZm9yIHBvcnRmb2xpbzogJHtwb3J0Zm9saW9CYXNlRGlyfWBcbiAgICB9KTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5XG4gICAgY29uc3QgZGF0YURpciA9IGF3YWl0IHRoaXMuZmluZERhdGFEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWRhdGFEaXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgLSBwb3J0Zm9saW8gd2lsbCBzdGFydCBlbXB0eScsXG4gICAgICAgIHsgXG4gICAgICAgICAgc2VhcmNoUGF0aHM6IHRoaXMuZGF0YVNlYXJjaFBhdGhzLnNsaWNlKDAsIDMpLCAvLyBMb2cgZmlyc3QgZmV3IHBhdGhzIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgZGlybmFtZTogdGhpcy5fX2Rpcm5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJhY2sgdG90YWwgZmlsZXMgY29waWVkXG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcbiAgICBjb25zdCBjb3BpZWRDb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICAvLyBDb3B5IGVhY2ggZWxlbWVudCB0eXBlIC0gZGlyZWN0b3JpZXMgbm93IG1hdGNoIGVudW0gdmFsdWVzIChhbGwgcGx1cmFsKVxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZURpciA9IHBhdGguam9pbihkYXRhRGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5qb2luKHBvcnRmb2xpb0Jhc2VEaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgc291cmNlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHNvdXJjZURpcik7XG4gICAgICAgIGNvbnN0IGNvcGllZENvdW50ID0gYXdhaXQgdGhpcy5jb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpciwgZGVzdERpciwgZWxlbWVudFR5cGUpO1xuICAgICAgICBjb3BpZWRDb3VudHNbZWxlbWVudFR5cGVdID0gY29waWVkQ291bnQ7XG4gICAgICAgIHRvdGFsQ29waWVkICs9IGNvcGllZENvdW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gU291cmNlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBza2lwXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vICR7ZWxlbWVudFR5cGV9IGRpcmVjdG9yeSBpbiBidW5kbGVkIGRhdGFgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKHRvdGFsQ29waWVkID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3VjY2Vzc2Z1bGx5IHBvcHVsYXRlZCBwb3J0Zm9saW8gd2l0aCAke3RvdGFsQ29waWVkfSBkZWZhdWx0IGVsZW1lbnQocylgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGJyZWFrZG93bjogY29waWVkQ291bnRzXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3Igc3VjY2Vzc2Z1bCBwb3B1bGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQT1JURk9MSU9fUE9QVUxBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBlcmZvcm1Qb3B1bGF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBwb3B1bGF0ZWQgcG9ydGZvbGlvIHdpdGggJHt0b3RhbENvcGllZH0gZGVmYXVsdCBlbGVtZW50c2AsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGNvcGllZENvdW50c1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBuZXcgZWxlbWVudHMgdG8gY29weSAtIHBvcnRmb2xpbyBtYXkgYWxyZWFkeSBoYXZlIGNvbnRlbnQnKTtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -57,5 +57,10 @@ export declare class PortfolioManager {
57
57
  * Get portfolio statistics
58
58
  */
59
59
  getStatistics(): Promise<Record<ElementType, number>>;
60
+ /**
61
+ * Migrate from v1.4.2 singular directory names to v1.4.3 plural names
62
+ * This handles the upgrade path for existing users
63
+ */
64
+ private migrateFromSingularDirectories;
60
65
  }
61
66
  //# sourceMappingURL=PortfolioManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PortfolioManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO1D,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IACpC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAC1C,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAA8B;IAClE,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;WA4BO,WAAW,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,gBAAgB;IAiBrE;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IAI/C;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBxC;;OAEG;YACW,qBAAqB;IAgCnC;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IASvC;;OAEG;IACU,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4C/D;;OAEG;IACI,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA0ClE;;OAEG;IACU,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASjF;;OAEG;IACI,oBAAoB,IAAI,MAAM;IAIrC;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUlD;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;CAUnE"}
1
+ {"version":3,"file":"PortfolioManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ1D,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IACpC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAC1C,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAA8B;IAClE,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;WA4BO,WAAW,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,gBAAgB;IAiBrE;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IAI/C;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBxC;;OAEG;YACW,qBAAqB;IAiDnC;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IASvC;;OAEG;IACU,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4C/D;;OAEG;IACI,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA0ClE;;OAEG;IACU,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASjF;;OAEG;IACI,oBAAoB,IAAI,MAAM;IAIrC;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUlD;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAWlE;;;OAGG;YACW,8BAA8B;CA+D7C"}