@projectcor/maia-components 2.44.4 → 2.44.5-1

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 (427) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +135 -0
  6. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  7. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +65 -0
  8. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +66 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +5 -51
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +211 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  12. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +55 -0
  13. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +41 -0
  14. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +18 -76
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +253 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +31 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +33 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +3 -31
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +25 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  23. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  25. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  26. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  27. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  28. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  29. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  30. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  31. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +88 -0
  32. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  33. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  34. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  35. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +77 -0
  36. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  37. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  38. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +31 -0
  39. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +48 -0
  40. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +5 -34
  41. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +231 -0
  42. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  43. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  44. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  45. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  46. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  47. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  48. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  49. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  50. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  51. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  52. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  53. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  54. package/lib/components/atoms/HelpButton.spec.js +87 -0
  55. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  56. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  57. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  58. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  59. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  60. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  61. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  62. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  63. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +12 -0
  64. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +26 -0
  65. package/lib/components/atoms/MAIAInput/MAIAInput.js +4 -10
  66. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +430 -0
  67. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +50 -0
  68. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +20 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +8 -60
  70. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +53 -0
  71. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +22 -0
  72. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  73. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  74. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  75. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  76. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  77. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  78. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  79. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  80. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  81. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  82. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  83. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  84. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +86 -0
  85. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  86. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  87. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  88. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  89. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +21 -16
  90. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +7 -5
  91. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  92. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +72 -52
  93. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +132 -0
  94. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +162 -0
  95. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  96. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  97. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  98. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  99. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +4 -0
  100. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  101. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  102. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  103. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  104. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  105. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  106. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  107. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +85 -0
  108. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  109. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  110. package/lib/components/atoms/TextArea/TextArea.spec.js +68 -0
  111. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  112. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  113. package/lib/components/atoms/WithAppCfg.spec.js +60 -0
  114. package/lib/components/index.js +2 -1
  115. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  116. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  117. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +5 -29
  118. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +371 -0
  119. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +39 -0
  120. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +57 -0
  121. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +6 -40
  122. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +227 -0
  123. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +86 -0
  124. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +108 -0
  125. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +18 -90
  126. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +254 -0
  127. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  128. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  129. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  130. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  131. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  132. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  133. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  134. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  135. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  136. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  137. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  138. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  139. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  140. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  141. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  142. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  143. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +21 -6
  144. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +246 -0
  145. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  146. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  147. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +54 -0
  148. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +77 -0
  149. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +19 -47
  150. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +410 -0
  151. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  152. package/lib/components/molecules/ChatAIMessages/newStyles.js +29 -26
  153. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +147 -4
  154. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +471 -0
  155. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +64 -108
  156. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +659 -0
  157. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  158. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  159. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  160. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  161. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  162. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  163. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  164. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +30 -0
  165. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +95 -0
  166. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +76 -86
  167. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  168. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  169. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  170. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  171. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  172. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  173. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +172 -0
  174. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +128 -0
  175. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  176. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -3
  177. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +355 -0
  178. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  179. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  180. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +82 -0
  181. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  182. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  183. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  184. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  185. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  186. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  187. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  188. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  189. package/lib/components/molecules/Sidebar/Sidebar.js +41 -23
  190. package/lib/components/molecules/Sidebar/Sidebar.spec.js +453 -0
  191. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +198 -0
  192. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +385 -0
  193. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +56 -171
  194. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1125 -0
  195. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  196. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +405 -0
  197. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  198. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  199. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +231 -0
  200. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  201. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  202. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  203. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  204. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +272 -0
  205. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
  206. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
  207. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  208. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  209. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  210. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  211. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  212. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  213. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  214. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  215. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  216. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  217. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  218. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  219. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  220. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  221. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  222. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  223. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  224. package/lib/constants/permissions/index.js +2 -2
  225. package/lib/constants/permissions/utils.js +4 -1
  226. package/lib/constants/permissions/utils.spec.js +128 -0
  227. package/lib/dev/DevMaiaPage.js +30 -0
  228. package/lib/dev/DevReasoningTimeline.js +68 -37
  229. package/lib/dev/Providers.js +5 -3
  230. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  231. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  232. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  233. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  234. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +231 -0
  235. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  236. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +313 -0
  237. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  238. package/lib/hooks/useCaretPosition.spec.js +58 -0
  239. package/lib/hooks/useChatManager/useChatManager.helpers.js +353 -0
  240. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +506 -0
  241. package/lib/hooks/useChatManager/useChatManager.js +76 -351
  242. package/lib/hooks/useChatManager/useChatManager.spec.js +1261 -0
  243. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +109 -0
  244. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +176 -0
  245. package/lib/hooks/useChatMessages/useChatMessages.js +12 -82
  246. package/lib/hooks/useChatMessages/useChatMessages.spec.js +379 -0
  247. package/lib/hooks/useChats/useChats.spec.js +208 -0
  248. package/lib/hooks/useClientSearch.helpers.js +36 -0
  249. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  250. package/lib/hooks/useClientSearch.js +4 -32
  251. package/lib/hooks/useClientSearch.spec.js +86 -0
  252. package/lib/hooks/useContextMentions.helpers.js +152 -0
  253. package/lib/hooks/useContextMentions.helpers.spec.js +143 -0
  254. package/lib/hooks/useContextMentions.js +2 -163
  255. package/lib/hooks/useContextMentions.spec.js +239 -0
  256. package/lib/hooks/useContextMentions.types.js +2 -0
  257. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  258. package/lib/hooks/useContextPinPopover.helpers.spec.js +115 -0
  259. package/lib/hooks/useContextPinPopover.js +16 -75
  260. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  261. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  262. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  263. package/lib/hooks/useDebounce.spec.js +42 -0
  264. package/lib/hooks/useEntitySearch.helpers.js +359 -0
  265. package/lib/hooks/useEntitySearch.helpers.spec.js +321 -0
  266. package/lib/hooks/useEntitySearch.js +38 -391
  267. package/lib/hooks/useEntitySearch.spec.js +443 -0
  268. package/lib/hooks/useEvent.spec.js +45 -0
  269. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  270. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  271. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  272. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  273. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  274. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  275. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  276. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  277. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  278. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  279. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  280. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  281. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  282. package/lib/hooks/useMentionPopover.helpers.spec.js +71 -0
  283. package/lib/hooks/useMentionPopover.js +9 -35
  284. package/lib/hooks/useMentionPopover.spec.js +215 -0
  285. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  286. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +132 -0
  287. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  288. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  289. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  290. package/lib/hooks/useModal/useModal.spec.js +73 -0
  291. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +192 -0
  292. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  293. package/lib/hooks/useProjectSearch.helpers.spec.js +70 -0
  294. package/lib/hooks/useProjectSearch.js +4 -58
  295. package/lib/hooks/useProjectSearch.spec.js +91 -0
  296. package/lib/hooks/useProjectSummary.spec.js +193 -0
  297. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  298. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +92 -0
  299. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  300. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  301. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  302. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  303. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  304. package/lib/hooks/useRecentClientsSearch.js +4 -32
  305. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  306. package/lib/hooks/useRecentContexts.spec.js +139 -0
  307. package/lib/hooks/useResize.spec.js +37 -0
  308. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  309. package/lib/hooks/useSlashCommands.spec.js +139 -0
  310. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  311. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  312. package/lib/hooks/useStreamResponse.spec.js +199 -0
  313. package/lib/hooks/useT.spec.js +20 -0
  314. package/lib/hooks/useToggle.spec.js +33 -0
  315. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  316. package/lib/index.js +5 -2
  317. package/lib/lang/br/index.js +34 -1
  318. package/lib/lang/en/index.js +34 -1
  319. package/lib/lang/es/index.js +34 -1
  320. package/lib/lang/fr/index.js +34 -1
  321. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  322. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  323. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  324. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  325. package/lib/services/maia/Agents/connectors.spec.js +359 -0
  326. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  327. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  328. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  329. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  330. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  331. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  332. package/lib/services/maia/Agents/getAgents.helpers.js +181 -0
  333. package/lib/services/maia/Agents/getAgents.helpers.spec.js +211 -0
  334. package/lib/services/maia/Agents/getAgents.js +78 -242
  335. package/lib/services/maia/Agents/getAgents.spec.js +697 -0
  336. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  337. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  338. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  339. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  340. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  341. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  342. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  343. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  344. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  345. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  346. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  347. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  348. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  349. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  350. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +153 -0
  351. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  352. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  353. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  354. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  355. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  356. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  357. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  358. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  359. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  360. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  361. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  362. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  363. package/lib/services/maia/client.spec.js +56 -0
  364. package/lib/services/utils/fetchCOR.spec.js +211 -0
  365. package/lib/services/utils/getCookie.spec.js +20 -0
  366. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  367. package/lib/store/chatsSidebarOptimistic.spec.js +112 -0
  368. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  369. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  370. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  371. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  372. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  373. package/lib/store/sessions/sessionNotifications.js +35 -41
  374. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  375. package/lib/store/sessions/sessionStreamManager.js +40 -52
  376. package/lib/store/sessions/sessionStreamManager.spec.js +503 -0
  377. package/lib/store/sessions/sessions.types.spec.js +16 -0
  378. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  379. package/lib/store/useChatsStore.spec.js +619 -0
  380. package/lib/store/useFaqsStore.spec.js +57 -0
  381. package/lib/styles/cascade.js +29 -3
  382. package/lib/styles/transitions.js +3 -1
  383. package/lib/test/mockSseStream.js +121 -0
  384. package/lib/test/streamdownCodeMock.js +6 -0
  385. package/lib/test/streamdownMock.js +12 -0
  386. package/lib/types/agentModal.js +1 -1
  387. package/lib/types/global.d.js +1 -1
  388. package/lib/utils/actionCategoryMap.spec.js +18 -0
  389. package/lib/utils/agentDisplayName.spec.js +44 -0
  390. package/lib/utils/autoApproveStorage.spec.js +25 -0
  391. package/lib/utils/chatInputFiles.spec.js +39 -0
  392. package/lib/utils/contextMentionIcons.spec.js +41 -0
  393. package/lib/utils/contextMentionLabel.spec.js +13 -0
  394. package/lib/utils/contextMentionTriggers.spec.js +38 -0
  395. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  396. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  397. package/lib/utils/entityLinkRender.spec.js +72 -0
  398. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  399. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  400. package/lib/utils/formatUnreadCount.spec.js +12 -0
  401. package/lib/utils/getUnitFileSize.spec.js +18 -0
  402. package/lib/utils/hitlAnalytics.spec.js +100 -0
  403. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  404. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  405. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  406. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  407. package/lib/utils/imagePreprocessor.js +12 -37
  408. package/lib/utils/imagePreprocessor.spec.js +112 -0
  409. package/lib/utils/maiaPageRoute.js +24 -0
  410. package/lib/utils/maiaPageRoute.spec.js +23 -0
  411. package/lib/utils/mapBackendLang.spec.js +19 -0
  412. package/lib/utils/navigateContextEntity.spec.js +50 -0
  413. package/lib/utils/normalizeAgentConnectors.spec.js +107 -0
  414. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  415. package/lib/utils/reasoningMappers.spec.js +103 -0
  416. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  417. package/lib/utils/renderContextMentions.spec.js +158 -0
  418. package/lib/utils/retryCompletion.spec.js +99 -0
  419. package/lib/utils/skillContentSize.spec.js +13 -0
  420. package/lib/utils/slashCommandMarker.spec.js +43 -0
  421. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  422. package/lib/utils/sseStreamContent.spec.js +31 -0
  423. package/lib/utils/streamActivityMessages.js +34 -19
  424. package/lib/utils/streamActivityMessages.spec.js +229 -0
  425. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  426. package/package.json +1 -1
  427. package/README.md +0 -2
@@ -0,0 +1,1125 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
+ import { act, fireEvent, renderWithProviders, screen, waitFor } from '../../../test/test-utils';
7
+ import { ensurePortalRoot } from '../../../test/portalRoot';
8
+ import { GlobalContextTestProvider } from '../../../test/global-context';
9
+ import { AbmAgentModal } from './AbmAgentModal';
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ var handleCreateAgent = jest.fn();
12
+ var handleUpdateAgent = jest.fn();
13
+ var handleSnackbarError = jest.fn();
14
+ var handleSnackbarSuccess = jest.fn();
15
+ var handleAccessClient = jest.fn();
16
+ var accessClientHook = {
17
+ success: false,
18
+ resetSuccessUpdateAccess: jest.fn(function () {
19
+ accessClientHook.success = false;
20
+ })
21
+ };
22
+ var createAgentHook = {
23
+ isLoading: false,
24
+ success: false,
25
+ resetSuccess: jest.fn(function () {
26
+ createAgentHook.success = false;
27
+ })
28
+ };
29
+ var deleteAgentHook = {
30
+ success: false,
31
+ resetSuccess: jest.fn(function () {
32
+ deleteAgentHook.success = false;
33
+ })
34
+ };
35
+ var updateAgentHook = {
36
+ success: false,
37
+ resetSuccess: jest.fn(function () {
38
+ updateAgentHook.success = false;
39
+ })
40
+ };
41
+ jest.mock('@projectcor/cor-commons/lib/components/spinner-lottie', function () {
42
+ return {
43
+ SpinnerLottie: function SpinnerLottie() {
44
+ return /*#__PURE__*/_jsx("div", {
45
+ children: "spinner"
46
+ });
47
+ }
48
+ };
49
+ });
50
+ jest.mock('../../../hooks/useEvent', function () {
51
+ return {
52
+ EVENTS: {
53
+ confirmAction: 'AI_CHAT_ABM_CONFIRM',
54
+ "delete": 'AI_CHAT_ABM_DELETE_AGENT'
55
+ },
56
+ useEvent: function useEvent() {
57
+ return jest.fn();
58
+ }
59
+ };
60
+ });
61
+ jest.mock('../../../hooks/useSnackBarManager/useSnackBarManager', function () {
62
+ return {
63
+ useSnackBarManager: function useSnackBarManager() {
64
+ return {
65
+ handleSnackbarError: handleSnackbarError,
66
+ handleSnackbarSuccess: handleSnackbarSuccess
67
+ };
68
+ }
69
+ };
70
+ });
71
+ jest.mock('../../../context/cor-user', function () {
72
+ return {
73
+ useUser: function useUser() {
74
+ return {
75
+ id: 99,
76
+ permissions: {
77
+ ai_agents: {
78
+ create: true,
79
+ edit: true,
80
+ "delete": true
81
+ }
82
+ }
83
+ };
84
+ }
85
+ };
86
+ });
87
+ jest.mock('../../../hooks/useMaiaTaskPanelZIndex', function () {
88
+ return {
89
+ useMaiaTaskPanelZIndex: function useMaiaTaskPanelZIndex() {
90
+ return 1200;
91
+ }
92
+ };
93
+ });
94
+ jest.mock('../../../services/maia/Agents/getAgentById', function () {
95
+ return {
96
+ useGetAgentById: function useGetAgentById() {
97
+ return {
98
+ loading: false,
99
+ handleGetAgentById: jest.fn(),
100
+ agent: null,
101
+ handleCleanAgent: jest.fn(),
102
+ error: null
103
+ };
104
+ }
105
+ };
106
+ });
107
+ jest.mock('../../../hooks/useAgentModel/useAgentModel', function () {
108
+ var agentModels = [{
109
+ id: 1,
110
+ display_name: 'GPT',
111
+ model_name: 'gpt'
112
+ }];
113
+ return {
114
+ useAgentModel: function useAgentModel() {
115
+ return {
116
+ agentModels: agentModels,
117
+ getAllAgentModels: jest.fn()
118
+ };
119
+ }
120
+ };
121
+ });
122
+ jest.mock('../../../hooks/useAgentModel/useCreateAgent', function () {
123
+ return {
124
+ useCreateAgent: function useCreateAgent() {
125
+ return {
126
+ handleCreateAgent: handleCreateAgent,
127
+ isLoading: createAgentHook.isLoading,
128
+ success: createAgentHook.success,
129
+ resetSuccess: createAgentHook.resetSuccess
130
+ };
131
+ }
132
+ };
133
+ });
134
+ jest.mock('../../../hooks/useAgentModel/useUpdateAgent', function () {
135
+ return {
136
+ useUpdateAgent: function useUpdateAgent() {
137
+ return {
138
+ handleUpdateAgent: handleUpdateAgent,
139
+ success: updateAgentHook.success,
140
+ resetSuccess: updateAgentHook.resetSuccess
141
+ };
142
+ }
143
+ };
144
+ });
145
+ jest.mock('../../../hooks/useAgentModel/useDeleteAgent', function () {
146
+ return {
147
+ useDeleteAgent: function useDeleteAgent() {
148
+ return {
149
+ handleDeleteAgent: jest.fn(),
150
+ success: deleteAgentHook.success,
151
+ resetSuccess: deleteAgentHook.resetSuccess
152
+ };
153
+ }
154
+ };
155
+ });
156
+ jest.mock('../../../hooks/useKnowledge', function () {
157
+ return {
158
+ useKnowledgeOperations: function useKnowledgeOperations() {
159
+ return {
160
+ handleCreateKnowledges: jest.fn(),
161
+ handleDeleteKnowledges: jest.fn(),
162
+ handleDeleteAndCreateKnowledges: jest.fn(),
163
+ isLoading: false,
164
+ error: null,
165
+ successDelete: false,
166
+ handleResetSuccessSave: jest.fn(),
167
+ handleResetSuccessDelete: jest.fn()
168
+ };
169
+ }
170
+ };
171
+ });
172
+ jest.mock('../../../hooks/useAccessClient/useAccessClient', function () {
173
+ return {
174
+ useAccessClient: function useAccessClient() {
175
+ return {
176
+ handleAccessClient: handleAccessClient,
177
+ isLoading: false,
178
+ success: accessClientHook.success,
179
+ handleResetSuccess: accessClientHook.resetSuccessUpdateAccess
180
+ };
181
+ }
182
+ };
183
+ });
184
+ jest.mock('../../../hooks', function () {
185
+ return {
186
+ useToggleFavorite: function useToggleFavorite() {
187
+ return {
188
+ toggleFavorite: jest.fn()
189
+ };
190
+ }
191
+ };
192
+ });
193
+ jest.mock('../../molecules/AbmSection', function () {
194
+ return {
195
+ AbmGeneralSection: function AbmGeneralSection(_ref) {
196
+ var values = _ref.values,
197
+ handleSetAgentValues = _ref.handleSetAgentValues;
198
+ return /*#__PURE__*/_jsxs("div", {
199
+ children: [/*#__PURE__*/_jsx("input", {
200
+ "aria-label": "agent-name",
201
+ value: values.general.name || '',
202
+ onChange: function onChange(event) {
203
+ return handleSetAgentValues({
204
+ key: 'name',
205
+ value: event.target.value
206
+ });
207
+ }
208
+ }), /*#__PURE__*/_jsx("textarea", {
209
+ "aria-label": "agent-prompt",
210
+ value: values.general.userPrompt || '',
211
+ onChange: function onChange(event) {
212
+ return handleSetAgentValues({
213
+ key: 'userPrompt',
214
+ value: event.target.value
215
+ });
216
+ }
217
+ })]
218
+ });
219
+ },
220
+ AbmKnowledgeSection: function AbmKnowledgeSection(_ref2) {
221
+ var handleSetAgentValues = _ref2.handleSetAgentValues;
222
+ return /*#__PURE__*/_jsxs("div", {
223
+ children: ["knowledge", /*#__PURE__*/_jsx("button", {
224
+ type: "button",
225
+ onClick: function onClick() {
226
+ return handleSetAgentValues({
227
+ key: 'knowledge',
228
+ value: [{
229
+ id: 'file-1',
230
+ name: 'guide.pdf',
231
+ size: 10,
232
+ type: 'application/pdf',
233
+ status: 'pending',
234
+ file: new File([], 'guide.pdf')
235
+ }]
236
+ });
237
+ },
238
+ children: "add-knowledge-file"
239
+ })]
240
+ });
241
+ }
242
+ };
243
+ });
244
+ jest.mock('../../molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection', function () {
245
+ return {
246
+ AbmAccessibilitySection: function AbmAccessibilitySection(_ref3) {
247
+ var handleSetAgentValues = _ref3.handleSetAgentValues;
248
+ return /*#__PURE__*/_jsxs("div", {
249
+ children: ["accessibility", /*#__PURE__*/_jsx("button", {
250
+ type: "button",
251
+ onClick: function onClick() {
252
+ return handleSetAgentValues({
253
+ key: 'accessibility',
254
+ value: {
255
+ accessType: 'clients',
256
+ clients: [{
257
+ id: '1',
258
+ name: 'Active Co',
259
+ is_active: true,
260
+ is_deleted: false
261
+ }],
262
+ corAccess: {
263
+ clientes: true,
264
+ proyectos: false,
265
+ tareas: false
266
+ }
267
+ }
268
+ });
269
+ },
270
+ children: "set-client-access"
271
+ })]
272
+ });
273
+ }
274
+ };
275
+ });
276
+ jest.mock('../../molecules/AbmSection/AbmLoaderFiles', function () {
277
+ return {
278
+ AbmLoaderFiles: function AbmLoaderFiles(_ref4) {
279
+ var onTimeout = _ref4.onTimeout;
280
+ return /*#__PURE__*/_jsxs("div", {
281
+ children: ["loader-files", /*#__PURE__*/_jsx("button", {
282
+ type: "button",
283
+ onClick: onTimeout,
284
+ children: "files-timeout"
285
+ })]
286
+ });
287
+ }
288
+ };
289
+ });
290
+ jest.mock('../DeleteQuestionModal/DeleteQuestionModal', function () {
291
+ return {
292
+ DeleteQuestionModal: function DeleteQuestionModal() {
293
+ return /*#__PURE__*/_jsx("div", {
294
+ children: "delete-modal"
295
+ });
296
+ }
297
+ };
298
+ });
299
+ var hasMaiaExternalConnectorsAccessMock = jest.fn(function () {
300
+ return false;
301
+ });
302
+ jest.mock('../../../constants/maiaExternalConnectorsAccess', function () {
303
+ return {
304
+ hasMaiaExternalConnectorsAccess: function hasMaiaExternalConnectorsAccess() {
305
+ return hasMaiaExternalConnectorsAccessMock();
306
+ }
307
+ };
308
+ });
309
+ var getAgentConnectorsMock = jest.fn();
310
+ jest.mock('../../../services/maia/Agents/connectors', function () {
311
+ return {
312
+ getAgentConnectors: function getAgentConnectors() {
313
+ return getAgentConnectorsMock.apply(void 0, arguments);
314
+ }
315
+ };
316
+ });
317
+ var flags = window;
318
+ var openAgent = function openAgent() {
319
+ var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
320
+ values = _ref5.values,
321
+ initialSection = _ref5.initialSection,
322
+ prefetchedAgentById = _ref5.prefetchedAgentById;
323
+ act(function () {
324
+ document.dispatchEvent(new CustomEvent('abm-agent-modal-set-values', {
325
+ detail: {
326
+ agentValues: {
327
+ values: values !== null && values !== void 0 ? values : {
328
+ isEditing: false,
329
+ general: {
330
+ name: '',
331
+ userPrompt: ''
332
+ }
333
+ },
334
+ initialSection: initialSection,
335
+ prefetchedAgentById: prefetchedAgentById
336
+ }
337
+ }
338
+ }));
339
+ });
340
+ };
341
+ var prefetchedCustomAgent = {
342
+ type: 'custom',
343
+ emoji: '🤖',
344
+ name: 'Support',
345
+ introduction: 'Hi',
346
+ inputPlaceholder: 'Ask',
347
+ isActive: true,
348
+ modelAiId: 1,
349
+ id: 'agent-1',
350
+ userPrompt: 'You help users',
351
+ is_favorite: false,
352
+ createdBy: 99,
353
+ knowledgeBases: [],
354
+ access: 'company',
355
+ clients: [],
356
+ toolGroupSlugs: []
357
+ };
358
+ var clickModalClose = function clickModalClose() {
359
+ var _title$parentElement;
360
+ var title = screen.getByText(/newAgent|editAgent/);
361
+ var header = (_title$parentElement = title.parentElement) === null || _title$parentElement === void 0 ? void 0 : _title$parentElement.parentElement;
362
+ var closeButton = header === null || header === void 0 ? void 0 : header.lastElementChild;
363
+ if (!closeButton) {
364
+ throw new Error('Close button not found');
365
+ }
366
+ fireEvent.click(closeButton);
367
+ };
368
+ var agentProps = {
369
+ addAgent: jest.fn(),
370
+ removeAgent: jest.fn(),
371
+ updateAgent: jest.fn(),
372
+ updateAgentFavorite: jest.fn(),
373
+ selectFirstAgent: jest.fn()
374
+ };
375
+ describe('AbmAgentModal', function () {
376
+ var cleanupPortal;
377
+ beforeEach(function () {
378
+ cleanupPortal = ensurePortalRoot('abm-agent-modal');
379
+ handleCreateAgent.mockClear();
380
+ handleUpdateAgent.mockClear();
381
+ handleSnackbarError.mockClear();
382
+ handleSnackbarSuccess.mockClear();
383
+ handleAccessClient.mockClear();
384
+ accessClientHook.success = false;
385
+ accessClientHook.resetSuccessUpdateAccess.mockClear();
386
+ createAgentHook.isLoading = false;
387
+ createAgentHook.success = false;
388
+ deleteAgentHook.success = false;
389
+ updateAgentHook.success = false;
390
+ delete flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
391
+ hasMaiaExternalConnectorsAccessMock.mockReturnValue(false);
392
+ getAgentConnectorsMock.mockReset();
393
+ jest.spyOn(window, 'confirm').mockReturnValue(true);
394
+ });
395
+ afterEach(function () {
396
+ jest.restoreAllMocks();
397
+ cleanupPortal();
398
+ });
399
+ it('stays closed until the open event', function () {
400
+ var _renderWithProviders = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
401
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
402
+ })),
403
+ container = _renderWithProviders.container;
404
+ expect(container).toBeEmptyDOMElement();
405
+ });
406
+ it('keeps save disabled without name or prompt', function () {
407
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
408
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
409
+ }));
410
+ openAgent();
411
+ expect(screen.getByRole('button', {
412
+ name: 'createAgentLabelButton'
413
+ })).toBeDisabled();
414
+ });
415
+ it('does not create without the multi-agents flag', function () {
416
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
417
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
418
+ }));
419
+ openAgent();
420
+ fireEvent.change(screen.getByLabelText('agent-name'), {
421
+ target: {
422
+ value: 'Custom'
423
+ }
424
+ });
425
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
426
+ target: {
427
+ value: 'Sos un agente'
428
+ }
429
+ });
430
+ fireEvent.click(screen.getByRole('button', {
431
+ name: 'createAgentLabelButton'
432
+ }));
433
+ expect(handleCreateAgent).not.toHaveBeenCalled();
434
+ });
435
+ it('creates the agent when the flag is on and the form is valid', function () {
436
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
437
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
438
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
439
+ }));
440
+ openAgent();
441
+ fireEvent.change(screen.getByLabelText('agent-name'), {
442
+ target: {
443
+ value: 'Custom'
444
+ }
445
+ });
446
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
447
+ target: {
448
+ value: 'Sos un agente'
449
+ }
450
+ });
451
+ fireEvent.click(screen.getByRole('button', {
452
+ name: 'createAgentLabelButton'
453
+ }));
454
+ expect(handleCreateAgent).toHaveBeenCalled();
455
+ });
456
+ it('blocks edit when the multi-agents flag is off', function () {
457
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
458
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
459
+ }));
460
+ openAgent({
461
+ values: {
462
+ isEditing: true,
463
+ general: {
464
+ id: 'a1',
465
+ name: 'X',
466
+ userPrompt: 'Y'
467
+ }
468
+ }
469
+ });
470
+ expect(handleSnackbarError).toHaveBeenCalledWith('errorAccessDenied');
471
+ expect(screen.queryByRole('button', {
472
+ name: 'saveChanges'
473
+ })).not.toBeInTheDocument();
474
+ });
475
+ it('switches sidebar sections', function () {
476
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
477
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
478
+ }));
479
+ openAgent();
480
+ expect(screen.getByLabelText('agent-name')).toBeInTheDocument();
481
+ fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
482
+ expect(screen.getByText('knowledge')).toBeInTheDocument();
483
+ expect(screen.queryByLabelText('agent-name')).not.toBeInTheDocument();
484
+ fireEvent.click(document.getElementById('abm-agent-modal-accessibility'));
485
+ expect(screen.getByText('accessibility')).toBeInTheDocument();
486
+ });
487
+ it('opens on the requested initial section', function () {
488
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
489
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
490
+ }));
491
+ openAgent({
492
+ initialSection: 'knowledge'
493
+ });
494
+ expect(screen.getByText('knowledge')).toBeInTheDocument();
495
+ });
496
+ it('closes the modal when there are no pending changes', function () {
497
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
498
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
499
+ }));
500
+ openAgent();
501
+ clickModalClose();
502
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
503
+ expect(window.confirm).not.toHaveBeenCalled();
504
+ });
505
+ it('closes the modal when pending changes are confirmed on close', function () {
506
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
507
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
508
+ }));
509
+ openAgent();
510
+ fireEvent.change(screen.getByLabelText('agent-name'), {
511
+ target: {
512
+ value: 'Draft'
513
+ }
514
+ });
515
+ clickModalClose();
516
+ expect(window.confirm).toHaveBeenCalled();
517
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
518
+ });
519
+ it('keeps the modal open when closing with pending changes is cancelled', function () {
520
+ jest.spyOn(window, 'confirm').mockReturnValue(false);
521
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
522
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
523
+ }));
524
+ openAgent();
525
+ fireEvent.change(screen.getByLabelText('agent-name'), {
526
+ target: {
527
+ value: 'Draft'
528
+ }
529
+ });
530
+ clickModalClose();
531
+ expect(window.confirm).toHaveBeenCalled();
532
+ expect(screen.getByText('newAgent')).toBeInTheDocument();
533
+ });
534
+ it('loads edit mode from prefetched agent data when the flag is on', function () {
535
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
536
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
537
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
538
+ }));
539
+ openAgent({
540
+ values: {
541
+ isEditing: true,
542
+ general: {
543
+ id: 'agent-1'
544
+ }
545
+ },
546
+ prefetchedAgentById: prefetchedCustomAgent
547
+ });
548
+ expect(screen.getByText('editAgent')).toBeInTheDocument();
549
+ expect(screen.getByLabelText('agent-name')).toHaveValue('Support');
550
+ expect(screen.getByRole('button', {
551
+ name: 'saveChanges'
552
+ })).toBeDisabled();
553
+ expect(screen.getByRole('button', {
554
+ name: 'deleteAgent'
555
+ })).toBeInTheDocument();
556
+ });
557
+ it('fetches external connectors when opening edit mode with the connectors feature', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
558
+ return _regeneratorRuntime.wrap(function (_context) {
559
+ while (1) switch (_context.prev = _context.next) {
560
+ case 0:
561
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
562
+ hasMaiaExternalConnectorsAccessMock.mockReturnValue(true);
563
+ getAgentConnectorsMock.mockResolvedValue([{
564
+ slug: 'jira_cloud',
565
+ requires_auth: false,
566
+ enabled_for_agent: true,
567
+ user_authorized: false
568
+ }]);
569
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
570
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
571
+ }));
572
+ openAgent({
573
+ values: {
574
+ isEditing: true,
575
+ general: {
576
+ id: 'agent-1'
577
+ }
578
+ },
579
+ prefetchedAgentById: prefetchedCustomAgent
580
+ });
581
+ _context.next = 1;
582
+ return waitFor(function () {
583
+ expect(getAgentConnectorsMock).toHaveBeenCalledWith('agent-1');
584
+ });
585
+ case 1:
586
+ case "end":
587
+ return _context.stop();
588
+ }
589
+ }, _callee);
590
+ })));
591
+ it('updates the agent after editing prefetched data', function () {
592
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
593
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
594
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
595
+ }));
596
+ openAgent({
597
+ values: {
598
+ isEditing: true,
599
+ general: {
600
+ id: 'agent-1'
601
+ }
602
+ },
603
+ prefetchedAgentById: prefetchedCustomAgent
604
+ });
605
+ fireEvent.change(screen.getByLabelText('agent-name'), {
606
+ target: {
607
+ value: 'Support v2'
608
+ }
609
+ });
610
+ fireEvent.click(screen.getByRole('button', {
611
+ name: 'saveChanges'
612
+ }));
613
+ expect(handleUpdateAgent).toHaveBeenCalled();
614
+ });
615
+ it('keeps save disabled when selected clients are inactive', function () {
616
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
617
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
618
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
619
+ }));
620
+ openAgent({
621
+ values: {
622
+ isEditing: true,
623
+ general: {
624
+ id: 'agent-1',
625
+ name: 'Support',
626
+ userPrompt: 'Help'
627
+ },
628
+ accessibility: {
629
+ accessType: 'clients',
630
+ clients: [{
631
+ id: '1',
632
+ name: 'Inactive Co',
633
+ is_active: false,
634
+ is_deleted: false
635
+ }]
636
+ }
637
+ },
638
+ prefetchedAgentById: _objectSpread(_objectSpread({}, prefetchedCustomAgent), {}, {
639
+ access: 'clients',
640
+ clients: [{
641
+ id: 1,
642
+ name: 'Inactive Co',
643
+ is_active: false,
644
+ is_deleted: false
645
+ }]
646
+ })
647
+ });
648
+ fireEvent.change(screen.getByLabelText('agent-name'), {
649
+ target: {
650
+ value: 'Support v2'
651
+ }
652
+ });
653
+ expect(screen.getByRole('button', {
654
+ name: 'saveChanges'
655
+ })).toBeDisabled();
656
+ });
657
+ it('opens the delete confirmation modal from edit mode', function () {
658
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
659
+ renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
660
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
661
+ }));
662
+ openAgent({
663
+ values: {
664
+ isEditing: true,
665
+ general: {
666
+ id: 'agent-1'
667
+ }
668
+ },
669
+ prefetchedAgentById: prefetchedCustomAgent
670
+ });
671
+ fireEvent.click(screen.getByRole('button', {
672
+ name: 'deleteAgent'
673
+ }));
674
+ expect(screen.getByText('delete-modal')).toBeInTheDocument();
675
+ });
676
+ it('finishes the happy path after update succeeds', function () {
677
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
678
+ var updateAgent = jest.fn();
679
+ var selectAgent = jest.fn();
680
+ var onRefetchSession = jest.fn();
681
+ document.addEventListener('refetch-session', onRefetchSession);
682
+ var selectedAgent = {
683
+ id: 'agent-1',
684
+ name: 'Support',
685
+ type: 'custom'
686
+ };
687
+ var _renderWithProviders2 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
688
+ value: {
689
+ agent: selectedAgent,
690
+ selectAgent: selectAgent
691
+ },
692
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
693
+ updateAgent: updateAgent
694
+ }))
695
+ })),
696
+ rerender = _renderWithProviders2.rerender;
697
+ openAgent({
698
+ values: {
699
+ isEditing: true,
700
+ general: {
701
+ id: 'agent-1'
702
+ }
703
+ },
704
+ prefetchedAgentById: prefetchedCustomAgent
705
+ });
706
+ fireEvent.change(screen.getByLabelText('agent-name'), {
707
+ target: {
708
+ value: 'Support v2'
709
+ }
710
+ });
711
+ fireEvent.click(screen.getByRole('button', {
712
+ name: 'saveChanges'
713
+ }));
714
+ expect(handleUpdateAgent).toHaveBeenCalled();
715
+ updateAgentHook.success = {
716
+ id: 'agent-1',
717
+ type: 'custom',
718
+ name: 'Support v2'
719
+ };
720
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
721
+ value: {
722
+ agent: selectedAgent,
723
+ selectAgent: selectAgent
724
+ },
725
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
726
+ updateAgent: updateAgent
727
+ }))
728
+ }));
729
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
730
+ expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
731
+ id: 'agent-1',
732
+ name: 'Support v2'
733
+ }));
734
+ expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
735
+ id: 'agent-1'
736
+ }));
737
+ expect(updateAgentHook.resetSuccess).toHaveBeenCalled();
738
+ expect(onRefetchSession).toHaveBeenCalledTimes(1);
739
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
740
+ document.removeEventListener('refetch-session', onRefetchSession);
741
+ });
742
+ it('finishes the happy path after create succeeds', function () {
743
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
744
+ var addAgent = jest.fn();
745
+ var selectAgent = jest.fn();
746
+ var _renderWithProviders3 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
747
+ value: {
748
+ selectAgent: selectAgent
749
+ },
750
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
751
+ addAgent: addAgent
752
+ }))
753
+ })),
754
+ rerender = _renderWithProviders3.rerender;
755
+ openAgent();
756
+ fireEvent.change(screen.getByLabelText('agent-name'), {
757
+ target: {
758
+ value: 'Custom'
759
+ }
760
+ });
761
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
762
+ target: {
763
+ value: 'Sos un agente'
764
+ }
765
+ });
766
+ fireEvent.click(screen.getByRole('button', {
767
+ name: 'createAgentLabelButton'
768
+ }));
769
+ expect(handleCreateAgent).toHaveBeenCalled();
770
+ createAgentHook.success = {
771
+ id: 'created-1',
772
+ type: 'custom'
773
+ };
774
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
775
+ value: {
776
+ selectAgent: selectAgent
777
+ },
778
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
779
+ addAgent: addAgent
780
+ }))
781
+ }));
782
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
783
+ expect(addAgent).toHaveBeenCalledWith(expect.objectContaining({
784
+ id: 'created-1'
785
+ }));
786
+ expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
787
+ id: 'created-1'
788
+ }));
789
+ expect(createAgentHook.resetSuccess).toHaveBeenCalled();
790
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
791
+ });
792
+ it('closes and removes the agent after delete succeeds', function () {
793
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
794
+ var removeAgent = jest.fn();
795
+ var _renderWithProviders4 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
796
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
797
+ removeAgent: removeAgent
798
+ }))
799
+ })),
800
+ rerender = _renderWithProviders4.rerender;
801
+ openAgent({
802
+ values: {
803
+ isEditing: true,
804
+ general: {
805
+ id: 'agent-1'
806
+ }
807
+ },
808
+ prefetchedAgentById: prefetchedCustomAgent
809
+ });
810
+ deleteAgentHook.success = true;
811
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
812
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
813
+ removeAgent: removeAgent
814
+ }))
815
+ }));
816
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentDeleted');
817
+ expect(removeAgent).toHaveBeenCalledWith('agent-1');
818
+ expect(deleteAgentHook.resetSuccess).toHaveBeenCalled();
819
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
820
+ });
821
+ it('requests client access after create when visibility is not company', function () {
822
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
823
+ var _renderWithProviders5 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
824
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
825
+ })),
826
+ rerender = _renderWithProviders5.rerender;
827
+ openAgent({
828
+ values: {
829
+ isEditing: false,
830
+ general: {
831
+ name: '',
832
+ userPrompt: ''
833
+ },
834
+ accessibility: {
835
+ accessType: 'clients',
836
+ clients: [{
837
+ id: '1',
838
+ name: 'Active Co',
839
+ is_active: true,
840
+ is_deleted: false
841
+ }]
842
+ }
843
+ }
844
+ });
845
+ fireEvent.change(screen.getByLabelText('agent-name'), {
846
+ target: {
847
+ value: 'Custom'
848
+ }
849
+ });
850
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
851
+ target: {
852
+ value: 'Sos un agente'
853
+ }
854
+ });
855
+ fireEvent.click(screen.getByRole('button', {
856
+ name: 'createAgentLabelButton'
857
+ }));
858
+ createAgentHook.success = {
859
+ id: 'created-1',
860
+ type: 'custom'
861
+ };
862
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
863
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
864
+ }));
865
+ expect(handleAccessClient).toHaveBeenCalledWith('created-1', expect.objectContaining({
866
+ accessType: 'clients'
867
+ }));
868
+ expect(handleSnackbarSuccess).not.toHaveBeenCalledWith('confirmAgentCreated');
869
+ expect(screen.getByText('newAgent')).toBeInTheDocument();
870
+ });
871
+ it('closes edit after client access succeeds on update', function () {
872
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
873
+ var updateAgent = jest.fn();
874
+ var selectAgent = jest.fn();
875
+ var _renderWithProviders6 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
876
+ value: {
877
+ agent: {
878
+ id: 'agent-1',
879
+ name: 'Support',
880
+ type: 'custom'
881
+ },
882
+ selectAgent: selectAgent
883
+ },
884
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
885
+ updateAgent: updateAgent
886
+ }))
887
+ })),
888
+ rerender = _renderWithProviders6.rerender;
889
+ openAgent({
890
+ values: {
891
+ isEditing: true,
892
+ general: {
893
+ id: 'agent-1'
894
+ }
895
+ },
896
+ prefetchedAgentById: prefetchedCustomAgent
897
+ });
898
+ fireEvent.change(screen.getByLabelText('agent-name'), {
899
+ target: {
900
+ value: 'Support v2'
901
+ }
902
+ });
903
+ fireEvent.click(document.getElementById('abm-agent-modal-accessibility'));
904
+ fireEvent.click(screen.getByRole('button', {
905
+ name: 'set-client-access'
906
+ }));
907
+ fireEvent.click(screen.getByRole('button', {
908
+ name: 'saveChanges'
909
+ }));
910
+ expect(handleUpdateAgent).toHaveBeenCalled();
911
+ updateAgentHook.success = {
912
+ id: 'agent-1',
913
+ type: 'custom',
914
+ name: 'Support v2'
915
+ };
916
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
917
+ value: {
918
+ agent: {
919
+ id: 'agent-1',
920
+ name: 'Support',
921
+ type: 'custom'
922
+ },
923
+ selectAgent: selectAgent
924
+ },
925
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
926
+ updateAgent: updateAgent
927
+ }))
928
+ }));
929
+ expect(handleAccessClient).toHaveBeenCalledWith('agent-1', expect.objectContaining({
930
+ accessType: 'clients'
931
+ }));
932
+ accessClientHook.success = {
933
+ ok: true
934
+ };
935
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
936
+ value: {
937
+ agent: {
938
+ id: 'agent-1',
939
+ name: 'Support',
940
+ type: 'custom'
941
+ },
942
+ selectAgent: selectAgent
943
+ },
944
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
945
+ updateAgent: updateAgent
946
+ }))
947
+ }));
948
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
949
+ expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
950
+ id: 'agent-1'
951
+ }));
952
+ expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
953
+ id: 'agent-1'
954
+ }));
955
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
956
+ });
957
+ it('closes create after client access succeeds', function () {
958
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
959
+ var addAgent = jest.fn();
960
+ var selectAgent = jest.fn();
961
+ var _renderWithProviders7 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
962
+ value: {
963
+ selectAgent: selectAgent
964
+ },
965
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
966
+ addAgent: addAgent
967
+ }))
968
+ })),
969
+ rerender = _renderWithProviders7.rerender;
970
+ openAgent({
971
+ values: {
972
+ isEditing: false,
973
+ general: {
974
+ name: '',
975
+ userPrompt: ''
976
+ },
977
+ accessibility: {
978
+ accessType: 'clients',
979
+ clients: [{
980
+ id: '1',
981
+ name: 'Active Co',
982
+ is_active: true,
983
+ is_deleted: false
984
+ }]
985
+ }
986
+ }
987
+ });
988
+ fireEvent.change(screen.getByLabelText('agent-name'), {
989
+ target: {
990
+ value: 'Custom'
991
+ }
992
+ });
993
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
994
+ target: {
995
+ value: 'Sos un agente'
996
+ }
997
+ });
998
+ fireEvent.click(screen.getByRole('button', {
999
+ name: 'createAgentLabelButton'
1000
+ }));
1001
+ createAgentHook.success = {
1002
+ id: 'created-1',
1003
+ type: 'custom'
1004
+ };
1005
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1006
+ value: {
1007
+ selectAgent: selectAgent
1008
+ },
1009
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1010
+ addAgent: addAgent
1011
+ }))
1012
+ }));
1013
+ accessClientHook.success = {
1014
+ ok: true
1015
+ };
1016
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1017
+ value: {
1018
+ selectAgent: selectAgent
1019
+ },
1020
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1021
+ addAgent: addAgent
1022
+ }))
1023
+ }));
1024
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
1025
+ expect(addAgent).toHaveBeenCalledWith(expect.objectContaining({
1026
+ id: 'created-1'
1027
+ }));
1028
+ expect(selectAgent).toHaveBeenCalledWith(expect.objectContaining({
1029
+ id: 'created-1'
1030
+ }));
1031
+ expect(accessClientHook.resetSuccessUpdateAccess).toHaveBeenCalled();
1032
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
1033
+ });
1034
+ it('closes create after knowledge processing times out', function () {
1035
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1036
+ var _renderWithProviders8 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1037
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1038
+ })),
1039
+ rerender = _renderWithProviders8.rerender;
1040
+ openAgent();
1041
+ fireEvent.change(screen.getByLabelText('agent-name'), {
1042
+ target: {
1043
+ value: 'Custom'
1044
+ }
1045
+ });
1046
+ fireEvent.change(screen.getByLabelText('agent-prompt'), {
1047
+ target: {
1048
+ value: 'Sos un agente'
1049
+ }
1050
+ });
1051
+ fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
1052
+ fireEvent.click(screen.getByRole('button', {
1053
+ name: 'add-knowledge-file'
1054
+ }));
1055
+ fireEvent.click(screen.getByRole('button', {
1056
+ name: 'createAgentLabelButton'
1057
+ }));
1058
+ createAgentHook.success = {
1059
+ id: 'created-1',
1060
+ type: 'custom'
1061
+ };
1062
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1063
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread({}, agentProps))
1064
+ }));
1065
+ expect(screen.getByText('loader-files')).toBeInTheDocument();
1066
+ fireEvent.click(screen.getByRole('button', {
1067
+ name: 'files-timeout'
1068
+ }));
1069
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentCreated');
1070
+ expect(createAgentHook.resetSuccess).toHaveBeenCalled();
1071
+ expect(screen.queryByText('newAgent')).not.toBeInTheDocument();
1072
+ });
1073
+ it('closes edit after knowledge processing times out', function () {
1074
+ flags.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
1075
+ var updateAgent = jest.fn();
1076
+ var _renderWithProviders9 = renderWithProviders(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1077
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1078
+ updateAgent: updateAgent
1079
+ }))
1080
+ })),
1081
+ rerender = _renderWithProviders9.rerender;
1082
+ openAgent({
1083
+ values: {
1084
+ isEditing: true,
1085
+ general: {
1086
+ id: 'agent-1'
1087
+ }
1088
+ },
1089
+ prefetchedAgentById: prefetchedCustomAgent
1090
+ });
1091
+ fireEvent.change(screen.getByLabelText('agent-name'), {
1092
+ target: {
1093
+ value: 'Support v2'
1094
+ }
1095
+ });
1096
+ fireEvent.click(document.getElementById('abm-agent-modal-knowledge'));
1097
+ fireEvent.click(screen.getByRole('button', {
1098
+ name: 'add-knowledge-file'
1099
+ }));
1100
+ fireEvent.click(screen.getByRole('button', {
1101
+ name: 'saveChanges'
1102
+ }));
1103
+ updateAgentHook.success = {
1104
+ id: 'agent-1',
1105
+ type: 'custom',
1106
+ name: 'Support v2'
1107
+ };
1108
+ rerender(/*#__PURE__*/_jsx(GlobalContextTestProvider, {
1109
+ children: /*#__PURE__*/_jsx(AbmAgentModal, _objectSpread(_objectSpread({}, agentProps), {}, {
1110
+ updateAgent: updateAgent
1111
+ }))
1112
+ }));
1113
+ expect(screen.getByText('loader-files')).toBeInTheDocument();
1114
+ fireEvent.click(screen.getByRole('button', {
1115
+ name: 'files-timeout'
1116
+ }));
1117
+ expect(handleSnackbarSuccess).toHaveBeenCalledWith('confirmAgentUpdated');
1118
+ expect(updateAgent).toHaveBeenCalledWith(expect.objectContaining({
1119
+ id: 'agent-1'
1120
+ }));
1121
+ expect(updateAgentHook.resetSuccess).toHaveBeenCalled();
1122
+ expect(screen.queryByText('editAgent')).not.toBeInTheDocument();
1123
+ });
1124
+ });
1125
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3QiLCJmaXJlRXZlbnQiLCJyZW5kZXJXaXRoUHJvdmlkZXJzIiwic2NyZWVuIiwid2FpdEZvciIsImVuc3VyZVBvcnRhbFJvb3QiLCJHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIiwiQWJtQWdlbnRNb2RhbCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJoYW5kbGVDcmVhdGVBZ2VudCIsImplc3QiLCJmbiIsImhhbmRsZVVwZGF0ZUFnZW50IiwiaGFuZGxlU25hY2tiYXJFcnJvciIsImhhbmRsZVNuYWNrYmFyU3VjY2VzcyIsImhhbmRsZUFjY2Vzc0NsaWVudCIsImFjY2Vzc0NsaWVudEhvb2siLCJzdWNjZXNzIiwicmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzIiwiY3JlYXRlQWdlbnRIb29rIiwiaXNMb2FkaW5nIiwicmVzZXRTdWNjZXNzIiwiZGVsZXRlQWdlbnRIb29rIiwidXBkYXRlQWdlbnRIb29rIiwibW9jayIsIlNwaW5uZXJMb3R0aWUiLCJjaGlsZHJlbiIsIkVWRU5UUyIsImNvbmZpcm1BY3Rpb24iLCJ1c2VFdmVudCIsInVzZVNuYWNrQmFyTWFuYWdlciIsInVzZVVzZXIiLCJpZCIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiY3JlYXRlIiwiZWRpdCIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJ1c2VHZXRBZ2VudEJ5SWQiLCJsb2FkaW5nIiwiaGFuZGxlR2V0QWdlbnRCeUlkIiwiYWdlbnQiLCJoYW5kbGVDbGVhbkFnZW50IiwiZXJyb3IiLCJhZ2VudE1vZGVscyIsImRpc3BsYXlfbmFtZSIsIm1vZGVsX25hbWUiLCJ1c2VBZ2VudE1vZGVsIiwiZ2V0QWxsQWdlbnRNb2RlbHMiLCJ1c2VDcmVhdGVBZ2VudCIsInVzZVVwZGF0ZUFnZW50IiwidXNlRGVsZXRlQWdlbnQiLCJoYW5kbGVEZWxldGVBZ2VudCIsInVzZUtub3dsZWRnZU9wZXJhdGlvbnMiLCJoYW5kbGVDcmVhdGVLbm93bGVkZ2VzIiwiaGFuZGxlRGVsZXRlS25vd2xlZGdlcyIsImhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMiLCJzdWNjZXNzRGVsZXRlIiwiaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZSIsImhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSIsInVzZUFjY2Vzc0NsaWVudCIsImhhbmRsZVJlc2V0U3VjY2VzcyIsInVzZVRvZ2dsZUZhdm9yaXRlIiwidG9nZ2xlRmF2b3JpdGUiLCJBYm1HZW5lcmFsU2VjdGlvbiIsIl9yZWYiLCJ2YWx1ZXMiLCJoYW5kbGVTZXRBZ2VudFZhbHVlcyIsInZhbHVlIiwiZ2VuZXJhbCIsIm5hbWUiLCJvbkNoYW5nZSIsImV2ZW50Iiwia2V5IiwidGFyZ2V0IiwidXNlclByb21wdCIsIkFibUtub3dsZWRnZVNlY3Rpb24iLCJfcmVmMiIsInR5cGUiLCJvbkNsaWNrIiwic2l6ZSIsInN0YXR1cyIsImZpbGUiLCJGaWxlIiwiQWJtQWNjZXNzaWJpbGl0eVNlY3Rpb24iLCJfcmVmMyIsImFjY2Vzc1R5cGUiLCJjbGllbnRzIiwiaXNfYWN0aXZlIiwiaXNfZGVsZXRlZCIsImNvckFjY2VzcyIsImNsaWVudGVzIiwicHJveWVjdG9zIiwidGFyZWFzIiwiQWJtTG9hZGVyRmlsZXMiLCJfcmVmNCIsIm9uVGltZW91dCIsIkRlbGV0ZVF1ZXN0aW9uTW9kYWwiLCJoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzTW9jayIsImhhc01haWFFeHRlcm5hbENvbm5lY3RvcnNBY2Nlc3MiLCJnZXRBZ2VudENvbm5lY3RvcnNNb2NrIiwiZ2V0QWdlbnRDb25uZWN0b3JzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJmbGFncyIsIndpbmRvdyIsIm9wZW5BZ2VudCIsIl9yZWY1IiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiaW5pdGlhbFNlY3Rpb24iLCJwcmVmZXRjaGVkQWdlbnRCeUlkIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJhZ2VudFZhbHVlcyIsImlzRWRpdGluZyIsInByZWZldGNoZWRDdXN0b21BZ2VudCIsImVtb2ppIiwiaW50cm9kdWN0aW9uIiwiaW5wdXRQbGFjZWhvbGRlciIsImlzQWN0aXZlIiwibW9kZWxBaUlkIiwiaXNfZmF2b3JpdGUiLCJjcmVhdGVkQnkiLCJrbm93bGVkZ2VCYXNlcyIsImFjY2VzcyIsInRvb2xHcm91cFNsdWdzIiwiY2xpY2tNb2RhbENsb3NlIiwiX3RpdGxlJHBhcmVudEVsZW1lbnQiLCJ0aXRsZSIsImdldEJ5VGV4dCIsImhlYWRlciIsInBhcmVudEVsZW1lbnQiLCJjbG9zZUJ1dHRvbiIsImxhc3RFbGVtZW50Q2hpbGQiLCJFcnJvciIsImNsaWNrIiwiYWdlbnRQcm9wcyIsImFkZEFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzZWxlY3RGaXJzdEFnZW50IiwiZGVzY3JpYmUiLCJjbGVhbnVwUG9ydGFsIiwiYmVmb3JlRWFjaCIsIm1vY2tDbGVhciIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJtb2NrUmV0dXJuVmFsdWUiLCJtb2NrUmVzZXQiLCJzcHlPbiIsImFmdGVyRWFjaCIsInJlc3RvcmVBbGxNb2NrcyIsIml0IiwiX3JlbmRlcldpdGhQcm92aWRlcnMiLCJfb2JqZWN0U3ByZWFkIiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZUVtcHR5RE9NRWxlbWVudCIsImdldEJ5Um9sZSIsInRvQmVEaXNhYmxlZCIsImNoYW5nZSIsImdldEJ5TGFiZWxUZXh0Iiwibm90IiwidG9IYXZlQmVlbkNhbGxlZCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwicXVlcnlCeVJvbGUiLCJ0b0JlSW5UaGVEb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwicXVlcnlCeUxhYmVsVGV4dCIsInF1ZXJ5QnlUZXh0IiwiY29uZmlybSIsInRvSGF2ZVZhbHVlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIm1vY2tSZXNvbHZlZFZhbHVlIiwic2x1ZyIsInJlcXVpcmVzX2F1dGgiLCJlbmFibGVkX2Zvcl9hZ2VudCIsInVzZXJfYXV0aG9yaXplZCIsInN0b3AiLCJhY2Nlc3NpYmlsaXR5Iiwic2VsZWN0QWdlbnQiLCJvblJlZmV0Y2hTZXNzaW9uIiwiYWRkRXZlbnRMaXN0ZW5lciIsInNlbGVjdGVkQWdlbnQiLCJfcmVuZGVyV2l0aFByb3ZpZGVyczIiLCJyZXJlbmRlciIsIm9iamVjdENvbnRhaW5pbmciLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX3JlbmRlcldpdGhQcm92aWRlcnMzIiwiX3JlbmRlcldpdGhQcm92aWRlcnM0IiwiX3JlbmRlcldpdGhQcm92aWRlcnM1IiwiX3JlbmRlcldpdGhQcm92aWRlcnM2Iiwib2siLCJfcmVuZGVyV2l0aFByb3ZpZGVyczciLCJfcmVuZGVyV2l0aFByb3ZpZGVyczgiLCJfcmVuZGVyV2l0aFByb3ZpZGVyczkiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9vcmdhbmlzbXMvQWJtQWdlbnRNb2RhbC9BYm1BZ2VudE1vZGFsLnNwZWMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFjdCwgZmlyZUV2ZW50LCByZW5kZXJXaXRoUHJvdmlkZXJzLCBzY3JlZW4sIHdhaXRGb3IgfSBmcm9tICcuLi8uLi8uLi90ZXN0L3Rlc3QtdXRpbHMnXG5pbXBvcnQgeyBlbnN1cmVQb3J0YWxSb290IH0gZnJvbSAnLi4vLi4vLi4vdGVzdC9wb3J0YWxSb290J1xuaW1wb3J0IHsgR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3Rlc3QvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBYm1BZ2VudE1vZGFsIH0gZnJvbSAnLi9BYm1BZ2VudE1vZGFsJ1xuXG5jb25zdCBoYW5kbGVDcmVhdGVBZ2VudCA9IGplc3QuZm4oKVxuY29uc3QgaGFuZGxlVXBkYXRlQWdlbnQgPSBqZXN0LmZuKClcbmNvbnN0IGhhbmRsZVNuYWNrYmFyRXJyb3IgPSBqZXN0LmZuKClcbmNvbnN0IGhhbmRsZVNuYWNrYmFyU3VjY2VzcyA9IGplc3QuZm4oKVxuY29uc3QgaGFuZGxlQWNjZXNzQ2xpZW50ID0gamVzdC5mbigpXG5cbmNvbnN0IGFjY2Vzc0NsaWVudEhvb2sgPSB7XG4gIHN1Y2Nlc3M6IGZhbHNlIGFzIGZhbHNlIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2VzczogamVzdC5mbigoKSA9PiB7XG4gICAgYWNjZXNzQ2xpZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgfSksXG59XG5cbmNvbnN0IGNyZWF0ZUFnZW50SG9vayA9IHtcbiAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgc3VjY2VzczogZmFsc2UgYXMgZmFsc2UgfCB7IGlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9LFxuICByZXNldFN1Y2Nlc3M6IGplc3QuZm4oKCkgPT4ge1xuICAgIGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgfSksXG59XG5cbmNvbnN0IGRlbGV0ZUFnZW50SG9vayA9IHtcbiAgc3VjY2VzczogZmFsc2UsXG4gIHJlc2V0U3VjY2VzczogamVzdC5mbigoKSA9PiB7XG4gICAgZGVsZXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSBmYWxzZVxuICB9KSxcbn1cblxuY29uc3QgdXBkYXRlQWdlbnRIb29rID0ge1xuICBzdWNjZXNzOiBmYWxzZSBhcyBmYWxzZSB8IHsgaWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfSxcbiAgcmVzZXRTdWNjZXNzOiBqZXN0LmZuKCgpID0+IHtcbiAgICB1cGRhdGVBZ2VudEhvb2suc3VjY2VzcyA9IGZhbHNlXG4gIH0pLFxufVxuXG5qZXN0Lm1vY2soJ0Bwcm9qZWN0Y29yL2Nvci1jb21tb25zL2xpYi9jb21wb25lbnRzL3NwaW5uZXItbG90dGllJywgKCkgPT4gKHtcbiAgU3Bpbm5lckxvdHRpZTogKCkgPT4gPGRpdj5zcGlubmVyPC9kaXY+LFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vaG9va3MvdXNlRXZlbnQnLCAoKSA9PiAoe1xuICBFVkVOVFM6IHsgY29uZmlybUFjdGlvbjogJ0FJX0NIQVRfQUJNX0NPTkZJUk0nLCBkZWxldGU6ICdBSV9DSEFUX0FCTV9ERUxFVEVfQUdFTlQnIH0sXG4gIHVzZUV2ZW50OiAoKSA9PiBqZXN0LmZuKCksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VTbmFja0Jhck1hbmFnZXIvdXNlU25hY2tCYXJNYW5hZ2VyJywgKCkgPT4gKHtcbiAgdXNlU25hY2tCYXJNYW5hZ2VyOiAoKSA9PiAoe1xuICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IsXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInLCAoKSA9PiAoe1xuICB1c2VVc2VyOiAoKSA9PiAoe1xuICAgIGlkOiA5OSxcbiAgICBwZXJtaXNzaW9uczogeyBhaV9hZ2VudHM6IHsgY3JlYXRlOiB0cnVlLCBlZGl0OiB0cnVlLCBkZWxldGU6IHRydWUgfSB9LFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnLCAoKSA9PiAoe1xuICB1c2VNYWlhVGFza1BhbmVsWkluZGV4OiAoKSA9PiAxMjAwLFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRCeUlkJywgKCkgPT4gKHtcbiAgdXNlR2V0QWdlbnRCeUlkOiAoKSA9PiAoe1xuICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgIGhhbmRsZUdldEFnZW50QnlJZDogamVzdC5mbigpLFxuICAgIGFnZW50OiBudWxsLFxuICAgIGhhbmRsZUNsZWFuQWdlbnQ6IGplc3QuZm4oKSxcbiAgICBlcnJvcjogbnVsbCxcbiAgfSksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZUFnZW50TW9kZWwnLCAoKSA9PiB7XG4gIGNvbnN0IGFnZW50TW9kZWxzID0gW3sgaWQ6IDEsIGRpc3BsYXlfbmFtZTogJ0dQVCcsIG1vZGVsX25hbWU6ICdncHQnIH1dXG4gIHJldHVybiB7XG4gICAgdXNlQWdlbnRNb2RlbDogKCkgPT4gKHtcbiAgICAgIGFnZW50TW9kZWxzLFxuICAgICAgZ2V0QWxsQWdlbnRNb2RlbHM6IGplc3QuZm4oKSxcbiAgICB9KSxcbiAgfVxufSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZUNyZWF0ZUFnZW50JywgKCkgPT4gKHtcbiAgdXNlQ3JlYXRlQWdlbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlQ3JlYXRlQWdlbnQsXG4gICAgaXNMb2FkaW5nOiBjcmVhdGVBZ2VudEhvb2suaXNMb2FkaW5nLFxuICAgIHN1Y2Nlc3M6IGNyZWF0ZUFnZW50SG9vay5zdWNjZXNzLFxuICAgIHJlc2V0U3VjY2VzczogY3JlYXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcyxcbiAgfSksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZVVwZGF0ZUFnZW50JywgKCkgPT4gKHtcbiAgdXNlVXBkYXRlQWdlbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlVXBkYXRlQWdlbnQsXG4gICAgc3VjY2VzczogdXBkYXRlQWdlbnRIb29rLnN1Y2Nlc3MsXG4gICAgcmVzZXRTdWNjZXNzOiB1cGRhdGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZUFnZW50TW9kZWwvdXNlRGVsZXRlQWdlbnQnLCAoKSA9PiAoe1xuICB1c2VEZWxldGVBZ2VudDogKCkgPT4gKHtcbiAgICBoYW5kbGVEZWxldGVBZ2VudDogamVzdC5mbigpLFxuICAgIHN1Y2Nlc3M6IGRlbGV0ZUFnZW50SG9vay5zdWNjZXNzLFxuICAgIHJlc2V0U3VjY2VzczogZGVsZXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcyxcbiAgfSksXG59KSlcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9ob29rcy91c2VLbm93bGVkZ2UnLCAoKSA9PiAoe1xuICB1c2VLbm93bGVkZ2VPcGVyYXRpb25zOiAoKSA9PiAoe1xuICAgIGhhbmRsZUNyZWF0ZUtub3dsZWRnZXM6IGplc3QuZm4oKSxcbiAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzOiBqZXN0LmZuKCksXG4gICAgaGFuZGxlRGVsZXRlQW5kQ3JlYXRlS25vd2xlZGdlczogamVzdC5mbigpLFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgZXJyb3I6IG51bGwsXG4gICAgc3VjY2Vzc0RlbGV0ZTogZmFsc2UsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZTogamVzdC5mbigpLFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZTogamVzdC5mbigpLFxuICB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uLy4uL2hvb2tzL3VzZUFjY2Vzc0NsaWVudC91c2VBY2Nlc3NDbGllbnQnLCAoKSA9PiAoe1xuICB1c2VBY2Nlc3NDbGllbnQ6ICgpID0+ICh7XG4gICAgaGFuZGxlQWNjZXNzQ2xpZW50LFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgc3VjY2VzczogYWNjZXNzQ2xpZW50SG9vay5zdWNjZXNzLFxuICAgIGhhbmRsZVJlc2V0U3VjY2VzczogYWNjZXNzQ2xpZW50SG9vay5yZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gIH0pLFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vaG9va3MnLCAoKSA9PiAoe1xuICB1c2VUb2dnbGVGYXZvcml0ZTogKCkgPT4gKHsgdG9nZ2xlRmF2b3JpdGU6IGplc3QuZm4oKSB9KSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uJywgKCkgPT4gKHtcbiAgQWJtR2VuZXJhbFNlY3Rpb246ICh7XG4gICAgdmFsdWVzLFxuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzLFxuICB9OiB7XG4gICAgdmFsdWVzOiB7IGdlbmVyYWw6IHsgbmFtZT86IHN0cmluZzsgdXNlclByb21wdD86IHN0cmluZyB8IG51bGwgfSB9XG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXM6IChwYXlsb2FkOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkXG4gIH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAgPGlucHV0XG4gICAgICAgIGFyaWEtbGFiZWw9XCJhZ2VudC1uYW1lXCJcbiAgICAgICAgdmFsdWU9e3ZhbHVlcy5nZW5lcmFsLm5hbWUgfHwgJyd9XG4gICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7IGtleTogJ25hbWUnLCB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pfVxuICAgICAgLz5cbiAgICAgIDx0ZXh0YXJlYVxuICAgICAgICBhcmlhLWxhYmVsPVwiYWdlbnQtcHJvbXB0XCJcbiAgICAgICAgdmFsdWU9e3ZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQgfHwgJyd9XG4gICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiBoYW5kbGVTZXRBZ2VudFZhbHVlcyh7IGtleTogJ3VzZXJQcm9tcHQnLCB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pfVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKSxcbiAgQWJtS25vd2xlZGdlU2VjdGlvbjogKHtcbiAgICBoYW5kbGVTZXRBZ2VudFZhbHVlcyxcbiAgfToge1xuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzOiAocGF5bG9hZDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd25bXTsgZGVsZXRlS25vd2xlZGdlPzogYm9vbGVhbiB9KSA9PiB2b2lkXG4gIH0pID0+IChcbiAgICA8ZGl2PlxuICAgICAga25vd2xlZGdlXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgIGhhbmRsZVNldEFnZW50VmFsdWVzKHtcbiAgICAgICAgICAgIGtleTogJ2tub3dsZWRnZScsXG4gICAgICAgICAgICB2YWx1ZTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdmaWxlLTEnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdndWlkZS5wZGYnLFxuICAgICAgICAgICAgICAgIHNpemU6IDEwLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCAnZ3VpZGUucGRmJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgYWRkLWtub3dsZWRnZS1maWxlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKVxuXG5qZXN0Lm1vY2soJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uJywgKCkgPT4gKHtcbiAgQWJtQWNjZXNzaWJpbGl0eVNlY3Rpb246ICh7XG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXMsXG4gIH06IHtcbiAgICBoYW5kbGVTZXRBZ2VudFZhbHVlczogKHBheWxvYWQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pID0+IHZvaWRcbiAgfSkgPT4gKFxuICAgIDxkaXY+XG4gICAgICBhY2Nlc3NpYmlsaXR5XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgIGhhbmRsZVNldEFnZW50VmFsdWVzKHtcbiAgICAgICAgICAgIGtleTogJ2FjY2Vzc2liaWxpdHknLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgYWNjZXNzVHlwZTogJ2NsaWVudHMnLFxuICAgICAgICAgICAgICBjbGllbnRzOiBbeyBpZDogJzEnLCBuYW1lOiAnQWN0aXZlIENvJywgaXNfYWN0aXZlOiB0cnVlLCBpc19kZWxldGVkOiBmYWxzZSB9XSxcbiAgICAgICAgICAgICAgY29yQWNjZXNzOiB7IGNsaWVudGVzOiB0cnVlLCBwcm95ZWN0b3M6IGZhbHNlLCB0YXJlYXM6IGZhbHNlIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgc2V0LWNsaWVudC1hY2Nlc3NcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApLFxufSkpXG5cbmplc3QubW9jaygnLi4vLi4vbW9sZWN1bGVzL0FibVNlY3Rpb24vQWJtTG9hZGVyRmlsZXMnLCAoKSA9PiAoe1xuICBBYm1Mb2FkZXJGaWxlczogKHsgb25UaW1lb3V0IH06IHsgb25UaW1lb3V0PzogKCkgPT4gdm9pZCB9KSA9PiAoXG4gICAgPGRpdj5cbiAgICAgIGxvYWRlci1maWxlc1xuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17b25UaW1lb3V0fT5cbiAgICAgICAgZmlsZXMtdGltZW91dFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICksXG59KSlcblxuamVzdC5tb2NrKCcuLi9EZWxldGVRdWVzdGlvbk1vZGFsL0RlbGV0ZVF1ZXN0aW9uTW9kYWwnLCAoKSA9PiAoe1xuICBEZWxldGVRdWVzdGlvbk1vZGFsOiAoKSA9PiA8ZGl2PmRlbGV0ZS1tb2RhbDwvZGl2Pixcbn0pKVxuXG5jb25zdCBoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzTW9jayA9IGplc3QuZm4oKCkgPT4gZmFsc2UpXG5cbmplc3QubW9jaygnLi4vLi4vLi4vY29uc3RhbnRzL21haWFFeHRlcm5hbENvbm5lY3RvcnNBY2Nlc3MnLCAoKSA9PiAoe1xuICBoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzOiAoKSA9PiBoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzTW9jaygpLFxufSkpXG5cbmNvbnN0IGdldEFnZW50Q29ubmVjdG9yc01vY2sgPSBqZXN0LmZuKClcblxuamVzdC5tb2NrKCcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9jb25uZWN0b3JzJywgKCkgPT4gKHtcbiAgZ2V0QWdlbnRDb25uZWN0b3JzOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBnZXRBZ2VudENvbm5lY3RvcnNNb2NrKC4uLmFyZ3MpLFxufSkpXG5cbnR5cGUgTXVsdGlBZ2VudFdpbmRvdyA9IFdpbmRvdyAmIHsgTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUz86IGJvb2xlYW4gfVxuY29uc3QgZmxhZ3MgPSB3aW5kb3cgYXMgTXVsdGlBZ2VudFdpbmRvd1xuXG50eXBlIE9wZW5BZ2VudE9wdGlvbnMgPSB7XG4gIHZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGluaXRpYWxTZWN0aW9uPzogJ2dlbmVyYWwnIHwgJ2tub3dsZWRnZScgfCAnYWNjZXNzaWJpbGl0eSdcbiAgcHJlZmV0Y2hlZEFnZW50QnlJZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59XG5cbmNvbnN0IG9wZW5BZ2VudCA9ICh7IHZhbHVlcywgaW5pdGlhbFNlY3Rpb24sIHByZWZldGNoZWRBZ2VudEJ5SWQgfTogT3BlbkFnZW50T3B0aW9ucyA9IHt9KSA9PiB7XG4gIGFjdCgoKSA9PiB7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnYWJtLWFnZW50LW1vZGFsLXNldC12YWx1ZXMnLCB7XG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGFnZW50VmFsdWVzOiB7XG4gICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyA/PyB7IGlzRWRpdGluZzogZmFsc2UsIGdlbmVyYWw6IHsgbmFtZTogJycsIHVzZXJQcm9tcHQ6ICcnIH0gfSxcbiAgICAgICAgICAgIGluaXRpYWxTZWN0aW9uLFxuICAgICAgICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApXG4gIH0pXG59XG5cbmNvbnN0IHByZWZldGNoZWRDdXN0b21BZ2VudCA9IHtcbiAgdHlwZTogJ2N1c3RvbScsXG4gIGVtb2ppOiAn8J+klicsXG4gIG5hbWU6ICdTdXBwb3J0JyxcbiAgaW50cm9kdWN0aW9uOiAnSGknLFxuICBpbnB1dFBsYWNlaG9sZGVyOiAnQXNrJyxcbiAgaXNBY3RpdmU6IHRydWUsXG4gIG1vZGVsQWlJZDogMSxcbiAgaWQ6ICdhZ2VudC0xJyxcbiAgdXNlclByb21wdDogJ1lvdSBoZWxwIHVzZXJzJyxcbiAgaXNfZmF2b3JpdGU6IGZhbHNlLFxuICBjcmVhdGVkQnk6IDk5LFxuICBrbm93bGVkZ2VCYXNlczogW10sXG4gIGFjY2VzczogJ2NvbXBhbnknLFxuICBjbGllbnRzOiBbXSxcbiAgdG9vbEdyb3VwU2x1Z3M6IFtdLFxufVxuXG5jb25zdCBjbGlja01vZGFsQ2xvc2UgPSAoKSA9PiB7XG4gIGNvbnN0IHRpdGxlID0gc2NyZWVuLmdldEJ5VGV4dCgvbmV3QWdlbnR8ZWRpdEFnZW50LylcbiAgY29uc3QgaGVhZGVyID0gdGl0bGUucGFyZW50RWxlbWVudD8ucGFyZW50RWxlbWVudFxuICBjb25zdCBjbG9zZUJ1dHRvbiA9IGhlYWRlcj8ubGFzdEVsZW1lbnRDaGlsZFxuICBpZiAoIWNsb3NlQnV0dG9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDbG9zZSBidXR0b24gbm90IGZvdW5kJylcbiAgfVxuICBmaXJlRXZlbnQuY2xpY2soY2xvc2VCdXR0b24pXG59XG5cbmNvbnN0IGFnZW50UHJvcHMgPSB7XG4gIGFkZEFnZW50OiBqZXN0LmZuKCksXG4gIHJlbW92ZUFnZW50OiBqZXN0LmZuKCksXG4gIHVwZGF0ZUFnZW50OiBqZXN0LmZuKCksXG4gIHVwZGF0ZUFnZW50RmF2b3JpdGU6IGplc3QuZm4oKSxcbiAgc2VsZWN0Rmlyc3RBZ2VudDogamVzdC5mbigpLFxufVxuXG5kZXNjcmliZSgnQWJtQWdlbnRNb2RhbCcsICgpID0+IHtcbiAgbGV0IGNsZWFudXBQb3J0YWw6ICgpID0+IHZvaWRcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjbGVhbnVwUG9ydGFsID0gZW5zdXJlUG9ydGFsUm9vdCgnYWJtLWFnZW50LW1vZGFsJylcbiAgICBoYW5kbGVDcmVhdGVBZ2VudC5tb2NrQ2xlYXIoKVxuICAgIGhhbmRsZVVwZGF0ZUFnZW50Lm1vY2tDbGVhcigpXG4gICAgaGFuZGxlU25hY2tiYXJFcnJvci5tb2NrQ2xlYXIoKVxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcy5tb2NrQ2xlYXIoKVxuICAgIGhhbmRsZUFjY2Vzc0NsaWVudC5tb2NrQ2xlYXIoKVxuICAgIGFjY2Vzc0NsaWVudEhvb2suc3VjY2VzcyA9IGZhbHNlXG4gICAgYWNjZXNzQ2xpZW50SG9vay5yZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MubW9ja0NsZWFyKClcbiAgICBjcmVhdGVBZ2VudEhvb2suaXNMb2FkaW5nID0gZmFsc2VcbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IGZhbHNlXG4gICAgZGVsZXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSBmYWxzZVxuICAgIHVwZGF0ZUFnZW50SG9vay5zdWNjZXNzID0gZmFsc2VcbiAgICBkZWxldGUgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuICAgIGhhc01haWFFeHRlcm5hbENvbm5lY3RvcnNBY2Nlc3NNb2NrLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSlcbiAgICBnZXRBZ2VudENvbm5lY3RvcnNNb2NrLm1vY2tSZXNldCgpXG4gICAgamVzdC5zcHlPbih3aW5kb3csICdjb25maXJtJykubW9ja1JldHVyblZhbHVlKHRydWUpXG4gIH0pXG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBqZXN0LnJlc3RvcmVBbGxNb2NrcygpXG4gICAgY2xlYW51cFBvcnRhbCgpXG4gIH0pXG5cbiAgaXQoJ3N0YXlzIGNsb3NlZCB1bnRpbCB0aGUgb3BlbiBldmVudCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoY29udGFpbmVyKS50b0JlRW1wdHlET01FbGVtZW50KClcbiAgfSlcblxuICBpdCgna2VlcHMgc2F2ZSBkaXNhYmxlZCB3aXRob3V0IG5hbWUgb3IgcHJvbXB0JywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnY3JlYXRlQWdlbnRMYWJlbEJ1dHRvbicgfSkpLnRvQmVEaXNhYmxlZCgpXG4gIH0pXG5cbiAgaXQoJ2RvZXMgbm90IGNyZWF0ZSB3aXRob3V0IHRoZSBtdWx0aS1hZ2VudHMgZmxhZycsICgpID0+IHtcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcbiAgICBvcGVuQWdlbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdDdXN0b20nIH0gfSlcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtcHJvbXB0JyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU29zIHVuIGFnZW50ZScgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVDcmVhdGVBZ2VudCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxuXG4gIGl0KCdjcmVhdGVzIHRoZSBhZ2VudCB3aGVuIHRoZSBmbGFnIGlzIG9uIGFuZCB0aGUgZm9ybSBpcyB2YWxpZCcsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ0N1c3RvbScgfSB9KVxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1wcm9tcHQnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTb3MgdW4gYWdlbnRlJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2NyZWF0ZUFnZW50TGFiZWxCdXR0b24nIH0pKVxuXG4gICAgZXhwZWN0KGhhbmRsZUNyZWF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgfSlcblxuICBpdCgnYmxvY2tzIGVkaXQgd2hlbiB0aGUgbXVsdGktYWdlbnRzIGZsYWcgaXMgb2ZmJywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHsgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2ExJywgbmFtZTogJ1gnLCB1c2VyUHJvbXB0OiAnWScgfSB9IH0pXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJFcnJvcikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yQWNjZXNzRGVuaWVkJylcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ3N3aXRjaGVzIHNpZGViYXIgc2VjdGlvbnMnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwta25vd2xlZGdlJykhKVxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdrbm93bGVkZ2UnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwtYWNjZXNzaWJpbGl0eScpISlcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnYWNjZXNzaWJpbGl0eScpKS50b0JlSW5UaGVEb2N1bWVudCgpXG4gIH0pXG5cbiAgaXQoJ29wZW5zIG9uIHRoZSByZXF1ZXN0ZWQgaW5pdGlhbCBzZWN0aW9uJywgKCkgPT4ge1xuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHsgaW5pdGlhbFNlY3Rpb246ICdrbm93bGVkZ2UnIH0pXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgna25vd2xlZGdlJykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIHRoZSBtb2RhbCB3aGVuIHRoZXJlIGFyZSBubyBwZW5kaW5nIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGNsaWNrTW9kYWxDbG9zZSgpXG5cbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGV4cGVjdCh3aW5kb3cuY29uZmlybSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgdGhlIG1vZGFsIHdoZW4gcGVuZGluZyBjaGFuZ2VzIGFyZSBjb25maXJtZWQgb24gY2xvc2UnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG4gICAgb3BlbkFnZW50KClcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnRHJhZnQnIH0gfSlcbiAgICBjbGlja01vZGFsQ2xvc2UoKVxuXG4gICAgZXhwZWN0KHdpbmRvdy5jb25maXJtKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdrZWVwcyB0aGUgbW9kYWwgb3BlbiB3aGVuIGNsb3Npbmcgd2l0aCBwZW5kaW5nIGNoYW5nZXMgaXMgY2FuY2VsbGVkJywgKCkgPT4ge1xuICAgIGplc3Quc3B5T24od2luZG93LCAnY29uZmlybScpLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSlcblxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuICAgIG9wZW5BZ2VudCgpXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ0RyYWZ0JyB9IH0pXG4gICAgY2xpY2tNb2RhbENsb3NlKClcblxuICAgIGV4cGVjdCh3aW5kb3cuY29uZmlybSkudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ25ld0FnZW50JykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnbG9hZHMgZWRpdCBtb2RlIGZyb20gcHJlZmV0Y2hlZCBhZ2VudCBkYXRhIHdoZW4gdGhlIGZsYWcgaXMgb24nLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHsgaXNFZGl0aW5nOiB0cnVlLCBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScgfSB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDogcHJlZmV0Y2hlZEN1c3RvbUFnZW50LFxuICAgIH0pXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnZWRpdEFnZW50JykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJykpLnRvSGF2ZVZhbHVlKCdTdXBwb3J0JylcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2F2ZUNoYW5nZXMnIH0pKS50b0JlRGlzYWJsZWQoKVxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdkZWxldGVBZ2VudCcgfSkpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnZmV0Y2hlcyBleHRlcm5hbCBjb25uZWN0b3JzIHdoZW4gb3BlbmluZyBlZGl0IG1vZGUgd2l0aCB0aGUgY29ubmVjdG9ycyBmZWF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgaGFzTWFpYUV4dGVybmFsQ29ubmVjdG9yc0FjY2Vzc01vY2subW9ja1JldHVyblZhbHVlKHRydWUpXG4gICAgZ2V0QWdlbnRDb25uZWN0b3JzTW9jay5tb2NrUmVzb2x2ZWRWYWx1ZShbXG4gICAgICB7IHNsdWc6ICdqaXJhX2Nsb3VkJywgcmVxdWlyZXNfYXV0aDogZmFsc2UsIGVuYWJsZWRfZm9yX2FnZW50OiB0cnVlLCB1c2VyX2F1dGhvcml6ZWQ6IGZhbHNlIH0sXG4gICAgXSlcblxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEFnZW50Q29ubmVjdG9yc01vY2spLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdhZ2VudC0xJylcbiAgICB9KVxuICB9KVxuXG4gIGl0KCd1cGRhdGVzIHRoZSBhZ2VudCBhZnRlciBlZGl0aW5nIHByZWZldGNoZWQgZGF0YScsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU3VwcG9ydCB2MicgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpXG5cbiAgICBleHBlY3QoaGFuZGxlVXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxuXG4gIGl0KCdrZWVwcyBzYXZlIGRpc2FibGVkIHdoZW4gc2VsZWN0ZWQgY2xpZW50cyBhcmUgaW5hY3RpdmUnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgaXNFZGl0aW5nOiB0cnVlLFxuICAgICAgICBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScsIG5hbWU6ICdTdXBwb3J0JywgdXNlclByb21wdDogJ0hlbHAnIH0sXG4gICAgICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgICAgICBhY2Nlc3NUeXBlOiAnY2xpZW50cycsXG4gICAgICAgICAgY2xpZW50czogW3sgaWQ6ICcxJywgbmFtZTogJ0luYWN0aXZlIENvJywgaXNfYWN0aXZlOiBmYWxzZSwgaXNfZGVsZXRlZDogZmFsc2UgfV0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDoge1xuICAgICAgICAuLi5wcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgICAgIGFjY2VzczogJ2NsaWVudHMnLFxuICAgICAgICBjbGllbnRzOiBbeyBpZDogMSwgbmFtZTogJ0luYWN0aXZlIENvJywgaXNfYWN0aXZlOiBmYWxzZSwgaXNfZGVsZXRlZDogZmFsc2UgfV0sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1N1cHBvcnQgdjInIH0gfSlcbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2F2ZUNoYW5nZXMnIH0pKS50b0JlRGlzYWJsZWQoKVxuICB9KVxuXG4gIGl0KCdvcGVucyB0aGUgZGVsZXRlIGNvbmZpcm1hdGlvbiBtb2RhbCBmcm9tIGVkaXQgbW9kZScsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdkZWxldGVBZ2VudCcgfSkpXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnZGVsZXRlLW1vZGFsJykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnZmluaXNoZXMgdGhlIGhhcHB5IHBhdGggYWZ0ZXIgdXBkYXRlIHN1Y2NlZWRzJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgdXBkYXRlQWdlbnQgPSBqZXN0LmZuKClcbiAgICBjb25zdCBzZWxlY3RBZ2VudCA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uUmVmZXRjaFNlc3Npb24gPSBqZXN0LmZuKClcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWZldGNoLXNlc3Npb24nLCBvblJlZmV0Y2hTZXNzaW9uKVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRBZ2VudCA9IHsgaWQ6ICdhZ2VudC0xJywgbmFtZTogJ1N1cHBvcnQnLCB0eXBlOiAnY3VzdG9tJyBhcyBjb25zdCB9XG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgYWdlbnQ6IHNlbGVjdGVkQWdlbnQsIHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHsgaXNFZGl0aW5nOiB0cnVlLCBnZW5lcmFsOiB7IGlkOiAnYWdlbnQtMScgfSB9LFxuICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZDogcHJlZmV0Y2hlZEN1c3RvbUFnZW50LFxuICAgIH0pXG5cbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtbmFtZScpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1N1cHBvcnQgdjInIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2F2ZUNoYW5nZXMnIH0pKVxuXG4gICAgZXhwZWN0KGhhbmRsZVVwZGF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkKClcblxuICAgIHVwZGF0ZUFnZW50SG9vay5zdWNjZXNzID0geyBpZDogJ2FnZW50LTEnLCB0eXBlOiAnY3VzdG9tJywgbmFtZTogJ1N1cHBvcnQgdjInIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IGFnZW50OiBzZWxlY3RlZEFnZW50LCBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50VXBkYXRlZCcpXG4gICAgZXhwZWN0KHVwZGF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGlkOiAnYWdlbnQtMScsIG5hbWU6ICdTdXBwb3J0IHYyJyB9KSlcbiAgICBleHBlY3Qoc2VsZWN0QWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdhZ2VudC0xJyB9KSlcbiAgICBleHBlY3QodXBkYXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KG9uUmVmZXRjaFNlc3Npb24pLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ2VkaXRBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVmZXRjaC1zZXNzaW9uJywgb25SZWZldGNoU2Vzc2lvbilcbiAgfSlcblxuICBpdCgnZmluaXNoZXMgdGhlIGhhcHB5IHBhdGggYWZ0ZXIgY3JlYXRlIHN1Y2NlZWRzJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgYWRkQWdlbnQgPSBqZXN0LmZuKClcbiAgICBjb25zdCBzZWxlY3RBZ2VudCA9IGplc3QuZm4oKVxuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gYWRkQWdlbnQ9e2FkZEFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCgpXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdDdXN0b20nIH0gfSlcbiAgICBmaXJlRXZlbnQuY2hhbmdlKHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnYWdlbnQtcHJvbXB0JyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnU29zIHVuIGFnZW50ZScgfSB9KVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVDcmVhdGVBZ2VudCkudG9IYXZlQmVlbkNhbGxlZCgpXG5cbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdjcmVhdGVkLTEnLCB0eXBlOiAnY3VzdG9tJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IGFkZEFnZW50PXthZGRBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50Q3JlYXRlZCcpXG4gICAgZXhwZWN0KGFkZEFnZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGlkOiAnY3JlYXRlZC0xJyB9KSlcbiAgICBleHBlY3Qoc2VsZWN0QWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdjcmVhdGVkLTEnIH0pKVxuICAgIGV4cGVjdChjcmVhdGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgYW5kIHJlbW92ZXMgdGhlIGFnZW50IGFmdGVyIGRlbGV0ZSBzdWNjZWVkcycsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuICAgIGNvbnN0IHJlbW92ZUFnZW50ID0gamVzdC5mbigpXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSByZW1vdmVBZ2VudD17cmVtb3ZlQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgb3BlbkFnZW50KHtcbiAgICAgIHZhbHVlczogeyBpc0VkaXRpbmc6IHRydWUsIGdlbmVyYWw6IHsgaWQ6ICdhZ2VudC0xJyB9IH0sXG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkOiBwcmVmZXRjaGVkQ3VzdG9tQWdlbnQsXG4gICAgfSlcblxuICAgIGRlbGV0ZUFnZW50SG9vay5zdWNjZXNzID0gdHJ1ZVxuICAgIHJlcmVuZGVyKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSByZW1vdmVBZ2VudD17cmVtb3ZlQWdlbnR9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KGhhbmRsZVNuYWNrYmFyU3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2NvbmZpcm1BZ2VudERlbGV0ZWQnKVxuICAgIGV4cGVjdChyZW1vdmVBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2FnZW50LTEnKVxuICAgIGV4cGVjdChkZWxldGVBZ2VudEhvb2sucmVzZXRTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCdlZGl0QWdlbnQnKSkubm90LnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgncmVxdWVzdHMgY2xpZW50IGFjY2VzcyBhZnRlciBjcmVhdGUgd2hlbiB2aXNpYmlsaXR5IGlzIG5vdCBjb21wYW55JywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgZ2VuZXJhbDogeyBuYW1lOiAnJywgdXNlclByb21wdDogJycgfSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgIGFjY2Vzc1R5cGU6ICdjbGllbnRzJyxcbiAgICAgICAgICBjbGllbnRzOiBbeyBpZDogJzEnLCBuYW1lOiAnQWN0aXZlIENvJywgaXNfYWN0aXZlOiB0cnVlLCBpc19kZWxldGVkOiBmYWxzZSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQ3VzdG9tJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LXByb21wdCcpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1NvcyB1biBhZ2VudGUnIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnY3JlYXRlQWdlbnRMYWJlbEJ1dHRvbicgfSkpXG5cbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdjcmVhdGVkLTEnLCB0eXBlOiAnY3VzdG9tJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgKVxuXG4gICAgZXhwZWN0KGhhbmRsZUFjY2Vzc0NsaWVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2NyZWF0ZWQtMScsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgYWNjZXNzVHlwZTogJ2NsaWVudHMnIH0pKVxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLm5vdC50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50Q3JlYXRlZCcpXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ25ld0FnZW50JykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIGVkaXQgYWZ0ZXIgY2xpZW50IGFjY2VzcyBzdWNjZWVkcyBvbiB1cGRhdGUnLCAoKSA9PiB7XG4gICAgZmxhZ3MuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICBjb25zdCB1cGRhdGVBZ2VudCA9IGplc3QuZm4oKVxuICAgIGNvbnN0IHNlbGVjdEFnZW50ID0gamVzdC5mbigpXG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXJXaXRoUHJvdmlkZXJzKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgYWdlbnQ6IHsgaWQ6ICdhZ2VudC0xJywgbmFtZTogJ1N1cHBvcnQnLCB0eXBlOiAnY3VzdG9tJyB9LCBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoe1xuICAgICAgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2FnZW50LTEnIH0gfSxcbiAgICAgIHByZWZldGNoZWRBZ2VudEJ5SWQ6IHByZWZldGNoZWRDdXN0b21BZ2VudCxcbiAgICB9KVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTdXBwb3J0IHYyJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwtYWNjZXNzaWJpbGl0eScpISlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnc2V0LWNsaWVudC1hY2Nlc3MnIH0pKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpXG5cbiAgICBleHBlY3QoaGFuZGxlVXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuXG4gICAgdXBkYXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSB7IGlkOiAnYWdlbnQtMScsIHR5cGU6ICdjdXN0b20nLCBuYW1lOiAnU3VwcG9ydCB2MicgfVxuICAgIHJlcmVuZGVyKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXIgdmFsdWU9e3sgYWdlbnQ6IHsgaWQ6ICdhZ2VudC0xJywgbmFtZTogJ1N1cHBvcnQnLCB0eXBlOiAnY3VzdG9tJyB9LCBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3QoaGFuZGxlQWNjZXNzQ2xpZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnYWdlbnQtMScsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgYWNjZXNzVHlwZTogJ2NsaWVudHMnIH0pKVxuXG4gICAgYWNjZXNzQ2xpZW50SG9vay5zdWNjZXNzID0geyBvazogdHJ1ZSB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBhZ2VudDogeyBpZDogJ2FnZW50LTEnLCBuYW1lOiAnU3VwcG9ydCcsIHR5cGU6ICdjdXN0b20nIH0sIHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRVcGRhdGVkJylcbiAgICBleHBlY3QodXBkYXRlQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdhZ2VudC0xJyB9KSlcbiAgICBleHBlY3Qoc2VsZWN0QWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdhZ2VudC0xJyB9KSlcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCdlZGl0QWdlbnQnKSkubm90LnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIGNyZWF0ZSBhZnRlciBjbGllbnQgYWNjZXNzIHN1Y2NlZWRzJywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgYWRkQWdlbnQgPSBqZXN0LmZuKClcbiAgICBjb25zdCBzZWxlY3RBZ2VudCA9IGplc3QuZm4oKVxuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gYWRkQWdlbnQ9e2FkZEFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIG9wZW5BZ2VudCh7XG4gICAgICB2YWx1ZXM6IHtcbiAgICAgICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgZ2VuZXJhbDogeyBuYW1lOiAnJywgdXNlclByb21wdDogJycgfSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgIGFjY2Vzc1R5cGU6ICdjbGllbnRzJyxcbiAgICAgICAgICBjbGllbnRzOiBbeyBpZDogJzEnLCBuYW1lOiAnQWN0aXZlIENvJywgaXNfYWN0aXZlOiB0cnVlLCBpc19kZWxldGVkOiBmYWxzZSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQ3VzdG9tJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LXByb21wdCcpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1NvcyB1biBhZ2VudGUnIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnY3JlYXRlQWdlbnRMYWJlbEJ1dHRvbicgfSkpXG5cbiAgICBjcmVhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdjcmVhdGVkLTEnLCB0eXBlOiAnY3VzdG9tJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlciB2YWx1ZT17eyBzZWxlY3RBZ2VudCB9fT5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IGFkZEFnZW50PXthZGRBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBhY2Nlc3NDbGllbnRIb29rLnN1Y2Nlc3MgPSB7IG9rOiB0cnVlIH1cbiAgICByZXJlbmRlcihcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyIHZhbHVlPXt7IHNlbGVjdEFnZW50IH19PlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gYWRkQWdlbnQ9e2FkZEFnZW50fSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRDcmVhdGVkJylcbiAgICBleHBlY3QoYWRkQWdlbnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaWQ6ICdjcmVhdGVkLTEnIH0pKVxuICAgIGV4cGVjdChzZWxlY3RBZ2VudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBpZDogJ2NyZWF0ZWQtMScgfSkpXG4gICAgZXhwZWN0KGFjY2Vzc0NsaWVudEhvb2sucmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCduZXdBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxuXG4gIGl0KCdjbG9zZXMgY3JlYXRlIGFmdGVyIGtub3dsZWRnZSBwcm9jZXNzaW5nIHRpbWVzIG91dCcsICgpID0+IHtcbiAgICBmbGFncy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gdHJ1ZVxuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyV2l0aFByb3ZpZGVycyhcbiAgICAgIDxHbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgICAgICA8QWJtQWdlbnRNb2RhbCB7Li4uYWdlbnRQcm9wc30gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoKVxuICAgIGZpcmVFdmVudC5jaGFuZ2Uoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdhZ2VudC1uYW1lJyksIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQ3VzdG9tJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LXByb21wdCcpLCB7IHRhcmdldDogeyB2YWx1ZTogJ1NvcyB1biBhZ2VudGUnIH0gfSlcbiAgICBmaXJlRXZlbnQuY2xpY2soZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FibS1hZ2VudC1tb2RhbC1rbm93bGVkZ2UnKSEpXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2FkZC1rbm93bGVkZ2UtZmlsZScgfSkpXG4gICAgZmlyZUV2ZW50LmNsaWNrKHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogJ2NyZWF0ZUFnZW50TGFiZWxCdXR0b24nIH0pKVxuXG4gICAgY3JlYXRlQWdlbnRIb29rLnN1Y2Nlc3MgPSB7IGlkOiAnY3JlYXRlZC0xJywgdHlwZTogJ2N1c3RvbScgfVxuICAgIHJlcmVuZGVyKFxuICAgICAgPEdsb2JhbENvbnRleHRUZXN0UHJvdmlkZXI+XG4gICAgICAgIDxBYm1BZ2VudE1vZGFsIHsuLi5hZ2VudFByb3BzfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0VGVzdFByb3ZpZGVyPlxuICAgIClcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdsb2FkZXItZmlsZXMnKSkudG9CZUluVGhlRG9jdW1lbnQoKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdmaWxlcy10aW1lb3V0JyB9KSlcblxuICAgIGV4cGVjdChoYW5kbGVTbmFja2JhclN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb25maXJtQWdlbnRDcmVhdGVkJylcbiAgICBleHBlY3QoY3JlYXRlQWdlbnRIb29rLnJlc2V0U3VjY2VzcykudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KHNjcmVlbi5xdWVyeUJ5VGV4dCgnbmV3QWdlbnQnKSkubm90LnRvQmVJblRoZURvY3VtZW50KClcbiAgfSlcblxuICBpdCgnY2xvc2VzIGVkaXQgYWZ0ZXIga25vd2xlZGdlIHByb2Nlc3NpbmcgdGltZXMgb3V0JywgKCkgPT4ge1xuICAgIGZsYWdzLk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgPSB0cnVlXG4gICAgY29uc3QgdXBkYXRlQWdlbnQgPSBqZXN0LmZuKClcblxuICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcldpdGhQcm92aWRlcnMoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBvcGVuQWdlbnQoe1xuICAgICAgdmFsdWVzOiB7IGlzRWRpdGluZzogdHJ1ZSwgZ2VuZXJhbDogeyBpZDogJ2FnZW50LTEnIH0gfSxcbiAgICAgIHByZWZldGNoZWRBZ2VudEJ5SWQ6IHByZWZldGNoZWRDdXN0b21BZ2VudCxcbiAgICB9KVxuXG4gICAgZmlyZUV2ZW50LmNoYW5nZShzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ2FnZW50LW5hbWUnKSwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdTdXBwb3J0IHYyJyB9IH0pXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhYm0tYWdlbnQtbW9kYWwta25vd2xlZGdlJykhKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdhZGQta25vd2xlZGdlLWZpbGUnIH0pKVxuICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdzYXZlQ2hhbmdlcycgfSkpXG5cbiAgICB1cGRhdGVBZ2VudEhvb2suc3VjY2VzcyA9IHsgaWQ6ICdhZ2VudC0xJywgdHlwZTogJ2N1c3RvbScsIG5hbWU6ICdTdXBwb3J0IHYyJyB9XG4gICAgcmVyZW5kZXIoXG4gICAgICA8R2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICAgICAgPEFibUFnZW50TW9kYWwgey4uLmFnZW50UHJvcHN9IHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH0gLz5cbiAgICAgIDwvR2xvYmFsQ29udGV4dFRlc3RQcm92aWRlcj5cbiAgICApXG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnbG9hZGVyLWZpbGVzJykpLnRvQmVJblRoZURvY3VtZW50KClcbiAgICBmaXJlRXZlbnQuY2xpY2soc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnZmlsZXMtdGltZW91dCcgfSkpXG5cbiAgICBleHBlY3QoaGFuZGxlU25hY2tiYXJTdWNjZXNzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY29uZmlybUFnZW50VXBkYXRlZCcpXG4gICAgZXhwZWN0KHVwZGF0ZUFnZW50KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGlkOiAnYWdlbnQtMScgfSkpXG4gICAgZXhwZWN0KHVwZGF0ZUFnZW50SG9vay5yZXNldFN1Y2Nlc3MpLnRvSGF2ZUJlZW5DYWxsZWQoKVxuICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJ2VkaXRBZ2VudCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxTQUFTQSxHQUFHLEVBQUVDLFNBQVMsRUFBRUMsbUJBQW1CLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxRQUFRLDBCQUEwQjtBQUMvRixTQUFTQyxnQkFBZ0IsUUFBUSwwQkFBMEI7QUFDM0QsU0FBU0MseUJBQXlCLFFBQVEsOEJBQThCO0FBQ3hFLFNBQVNDLGFBQWEsUUFBUSxpQkFBaUI7QUFBQSxTQUFBQyxHQUFBLElBQUFDLElBQUEsRUFBQUMsSUFBQSxJQUFBQyxLQUFBO0FBRS9DLElBQU1DLGlCQUFpQixHQUFHQyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLElBQU1DLGlCQUFpQixHQUFHRixJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLElBQU1FLG1CQUFtQixHQUFHSCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLElBQU1HLHFCQUFxQixHQUFHSixJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLElBQU1JLGtCQUFrQixHQUFHTCxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0FBRXBDLElBQU1LLGdCQUFnQixHQUFHO0VBQ3ZCQyxPQUFPLEVBQUUsS0FBd0M7RUFDakRDLHdCQUF3QixFQUFFUixJQUFJLENBQUNDLEVBQUUsQ0FBQyxZQUFNO0lBQ3RDSyxnQkFBZ0IsQ0FBQ0MsT0FBTyxHQUFHLEtBQUs7RUFDbEMsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFNRSxlQUFlLEdBQUc7RUFDdEJDLFNBQVMsRUFBRSxLQUFLO0VBQ2hCSCxPQUFPLEVBQUUsS0FBNkM7RUFDdERJLFlBQVksRUFBRVgsSUFBSSxDQUFDQyxFQUFF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