@projectcor/maia-components 2.49.0-beta.1 → 2.49.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) 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.helpers.js +37 -0
  6. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
  7. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  23. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  25. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  26. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  27. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  28. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  29. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  30. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  31. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  32. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  33. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  34. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  35. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
  36. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  37. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
  38. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  39. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  40. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  41. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
  42. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  43. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  44. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  45. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
  46. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  47. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
  48. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  49. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  50. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  51. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  52. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  53. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  54. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  55. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  56. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  57. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  58. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  59. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  60. package/lib/components/atoms/HelpButton.spec.js +87 -0
  61. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  62. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  63. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  64. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  65. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  66. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  67. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  68. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  70. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
  71. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  72. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
  73. package/lib/components/atoms/MAIAInput/MAIAInput.js +130 -177
  74. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
  75. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  76. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
  77. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  78. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
  79. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
  80. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  81. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  82. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  83. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  84. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  85. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  86. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  87. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  88. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  89. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  90. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  91. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  92. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
  93. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  94. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  95. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  96. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  97. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  98. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
  99. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  100. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
  101. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  102. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  103. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  104. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  105. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  106. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  107. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  108. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  109. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  110. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  111. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  112. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  113. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  114. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  115. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  116. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  117. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  118. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  119. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
  120. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  121. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
  122. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  123. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  124. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  125. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
  126. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  127. package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
  128. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  129. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  130. package/lib/components/atoms/WithAppCfg.spec.js +82 -0
  131. package/lib/components/index.js +2 -1
  132. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  133. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  134. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  135. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
  136. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  137. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
  138. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  139. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
  140. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  141. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
  142. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  143. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
  144. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  145. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  146. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  147. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  148. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  149. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  150. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  151. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  152. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  153. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  154. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  155. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  156. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  157. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  158. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  159. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  160. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  161. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
  162. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +285 -302
  163. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
  164. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  165. package/lib/components/molecules/ChatAIHome/styles.js +85 -78
  166. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  167. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  168. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
  169. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +235 -245
  170. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
  171. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  172. package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
  173. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +522 -4
  174. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
  175. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +250 -349
  176. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
  177. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  178. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  179. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  180. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  181. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  182. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  183. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  184. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  185. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  186. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
  187. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +100 -93
  188. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  189. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  190. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  191. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  192. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  193. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  194. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  195. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
  196. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  197. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
  198. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  199. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
  200. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  201. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
  202. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  203. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  204. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
  205. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  206. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  207. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
  208. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  209. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  210. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  211. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  212. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  213. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  214. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  215. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  216. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  217. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
  218. package/lib/components/molecules/Sidebar/Sidebar.js +65 -44
  219. package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
  220. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  221. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
  222. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +310 -644
  223. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
  224. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  225. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  226. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
  227. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  228. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
  229. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  230. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  231. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
  232. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  233. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  234. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  235. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  236. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
  237. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
  238. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
  239. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  240. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  241. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  242. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  243. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  244. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  245. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  246. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  247. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  248. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  249. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  250. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  251. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  252. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  253. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  254. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  255. package/lib/constants/formatExtensions.js +7 -8
  256. package/lib/constants/formatExtensions.spec.js +14 -0
  257. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  258. package/lib/constants/maiaFeatureAccess.spec.js +30 -0
  259. package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
  260. package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
  261. package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
  262. package/lib/constants/permissions/index.js +2 -2
  263. package/lib/constants/permissions/utils.js +4 -1
  264. package/lib/constants/permissions/utils.spec.js +128 -0
  265. package/lib/constants/plannerSyncEvents.spec.js +31 -0
  266. package/lib/constants/taskUrls.spec.js +9 -0
  267. package/lib/dev/DevMaiaPage.js +30 -0
  268. package/lib/dev/DevReasoningTimeline.js +75 -86
  269. package/lib/dev/Providers.js +5 -3
  270. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  271. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  272. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  273. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  274. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  275. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
  276. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  277. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
  278. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  279. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
  280. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  281. package/lib/hooks/useCaretPosition.spec.js +58 -0
  282. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  283. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
  284. package/lib/hooks/useChatManager/useChatManager.js +272 -745
  285. package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
  286. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  287. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
  288. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  289. package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
  290. package/lib/hooks/useChats/useChats.spec.js +208 -0
  291. package/lib/hooks/useClientSearch.helpers.js +36 -0
  292. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  293. package/lib/hooks/useClientSearch.js +4 -32
  294. package/lib/hooks/useClientSearch.spec.js +86 -0
  295. package/lib/hooks/useContextMentions.helpers.js +212 -0
  296. package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
  297. package/lib/hooks/useContextMentions.js +5 -223
  298. package/lib/hooks/useContextMentions.spec.js +338 -0
  299. package/lib/hooks/useContextMentions.types.js +2 -0
  300. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  301. package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
  302. package/lib/hooks/useContextPinPopover.js +16 -75
  303. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  304. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  305. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  306. package/lib/hooks/useDebounce.spec.js +42 -0
  307. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  308. package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
  309. package/lib/hooks/useEntitySearch.js +52 -436
  310. package/lib/hooks/useEntitySearch.spec.js +718 -0
  311. package/lib/hooks/useEvent.spec.js +45 -0
  312. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  313. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  314. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  315. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  316. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  317. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  318. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  319. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  320. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  321. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  322. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  323. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  324. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  325. package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
  326. package/lib/hooks/useMentionPopover.js +9 -35
  327. package/lib/hooks/useMentionPopover.spec.js +392 -0
  328. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  329. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
  330. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  331. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  332. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  333. package/lib/hooks/useModal/useModal.spec.js +73 -0
  334. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  335. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
  336. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  337. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
  338. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  339. package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
  340. package/lib/hooks/useProjectSearch.js +4 -58
  341. package/lib/hooks/useProjectSearch.spec.js +91 -0
  342. package/lib/hooks/useProjectSummary.spec.js +193 -0
  343. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  344. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
  345. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  346. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  347. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  348. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  349. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  350. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  351. package/lib/hooks/useRecentClientsSearch.js +4 -32
  352. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  353. package/lib/hooks/useRecentContexts.spec.js +139 -0
  354. package/lib/hooks/useResize.spec.js +37 -0
  355. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  356. package/lib/hooks/useSlashCommands.spec.js +139 -0
  357. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  358. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  359. package/lib/hooks/useStreamResponse.spec.js +199 -0
  360. package/lib/hooks/useT.spec.js +20 -0
  361. package/lib/hooks/useToggle.spec.js +33 -0
  362. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  363. package/lib/index.js +5 -2
  364. package/lib/lang/br/index.js +26 -7
  365. package/lib/lang/en/index.js +26 -7
  366. package/lib/lang/es/index.js +26 -7
  367. package/lib/lang/fr/index.js +26 -7
  368. package/lib/services/appcues.spec.js +37 -0
  369. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  370. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  371. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  372. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  373. package/lib/services/maia/Agents/connectors.spec.js +496 -0
  374. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  375. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  376. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  377. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  378. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  379. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  380. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  381. package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
  382. package/lib/services/maia/Agents/getAgents.js +90 -282
  383. package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
  384. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  385. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  386. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  387. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  388. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  389. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  390. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  391. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  392. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  393. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  394. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  395. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  396. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  397. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  398. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
  399. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  400. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  401. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  402. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  403. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  404. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  405. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  406. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  407. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  408. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  409. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  410. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  411. package/lib/services/maia/client.spec.js +56 -0
  412. package/lib/services/utils/fetchCOR.spec.js +211 -0
  413. package/lib/services/utils/getCookie.spec.js +20 -0
  414. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  415. package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
  416. package/lib/services/utils/mapChatMessages.js +25 -254
  417. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  418. package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
  419. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  420. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  421. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  422. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  423. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  424. package/lib/store/sessions/sessionNotifications.js +35 -41
  425. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  426. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  427. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
  428. package/lib/store/sessions/sessionStreamManager.js +209 -277
  429. package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
  430. package/lib/store/sessions/sessions.types.spec.js +16 -0
  431. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  432. package/lib/store/useChatsStore.spec.js +619 -0
  433. package/lib/store/useFaqsStore.spec.js +57 -0
  434. package/lib/styles/cascade.js +29 -3
  435. package/lib/styles/transitions.js +3 -1
  436. package/lib/test/mockSseStream.js +121 -0
  437. package/lib/test/streamdownCodeMock.js +6 -0
  438. package/lib/test/streamdownMock.js +12 -0
  439. package/lib/types/Chat.js +1 -1
  440. package/lib/types/agentModal.js +1 -1
  441. package/lib/types/global.d.js +1 -1
  442. package/lib/types/reasoning.js +1 -1
  443. package/lib/utils/actionCategoryMap.spec.js +18 -0
  444. package/lib/utils/agentDisplayName.spec.js +48 -0
  445. package/lib/utils/autoApproveStorage.spec.js +25 -0
  446. package/lib/utils/chatInputFiles.spec.js +39 -0
  447. package/lib/utils/contextMentionIcons.spec.js +41 -0
  448. package/lib/utils/contextMentionLabel.spec.js +13 -0
  449. package/lib/utils/contextMentionTriggers.spec.js +44 -0
  450. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  451. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  452. package/lib/utils/entityLinkRender.spec.js +72 -0
  453. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  454. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  455. package/lib/utils/formatUnreadCount.spec.js +12 -0
  456. package/lib/utils/getUnitFileSize.spec.js +18 -0
  457. package/lib/utils/hitlAnalytics.spec.js +136 -0
  458. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  459. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  460. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  461. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  462. package/lib/utils/imagePreprocessor.js +12 -37
  463. package/lib/utils/imagePreprocessor.spec.js +112 -0
  464. package/lib/utils/maiaPageRoute.js +24 -0
  465. package/lib/utils/maiaPageRoute.spec.js +23 -0
  466. package/lib/utils/mapBackendLang.spec.js +19 -0
  467. package/lib/utils/navigateContextEntity.spec.js +50 -0
  468. package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
  469. package/lib/utils/openTaskInCorPanel.spec.js +43 -0
  470. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  471. package/lib/utils/reasoningMappers.spec.js +103 -0
  472. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  473. package/lib/utils/renderContextMentions.helpers.js +110 -0
  474. package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
  475. package/lib/utils/renderContextMentions.js +4 -110
  476. package/lib/utils/renderContextMentions.spec.js +268 -0
  477. package/lib/utils/retryCompletion.spec.js +181 -0
  478. package/lib/utils/skillContentSize.spec.js +13 -0
  479. package/lib/utils/slashCommandMarker.spec.js +43 -0
  480. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  481. package/lib/utils/sseStreamContent.spec.js +31 -0
  482. package/lib/utils/streamActivityMessages.helpers.js +223 -0
  483. package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
  484. package/lib/utils/streamActivityMessages.js +33 -238
  485. package/lib/utils/streamActivityMessages.spec.js +336 -0
  486. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  487. package/package.json +2 -2
  488. package/README.md +0 -2
  489. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  490. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  491. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  492. package/lib/types/contextCompaction.js +0 -48
  493. package/lib/types/jest-dom.d.js +0 -2
@@ -0,0 +1,1394 @@
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 { CORUserRole } from '../../../context/cor-user';
7
+ import { options } from './constants';
8
+ import { clampFloatingPanelPosition, dispatchSkillMentionInsert, ensureAgentsBeforeSkillUse, getMaiaHostPanelPresentation, hasAnyActiveSessionInMeta, isBannerFaqReadyToAutoSend, isLegacyContextEntity, resolveAiChatBackDestination, resolveComputedCurrentOption, resolveDefaultFloatingPanelPosition, resolveInitialCurrentOption, resolveLegacyContextSession, resolveSidebarAgentsNavActive, shouldRestoreExpandedPanel, shouldSkipFloatingDragTarget, validateAccessByFeature, resolveHostTakeoverEntityState, buildHostTakeoverPersistContext, buildMaiaPanelSessionPatch, resolveFloatingPanelDragPosition, resolveHostTakeoverAgentId, resolveMaiaModalI18nLang, resolveMinimizedRestoreTarget, resolveNextDragPosition, resolveUserHasAgentManagementPermissions, shouldBackClearPinnedContext, shouldBackStartNewChatPreservingContext, shouldMarkOrchestratorContextReset, shouldStartNewChatFromCatalog, resolveHasPinnedContext, resolveOrchestratorHomeNavFlags, shouldShowOrchestratorBackButton, shouldClearClientOnGoHomeFromChat, shouldResetAgentToFirstOnGoHome, shouldUseActiveChatSendHandler, buildLegacyContextMigrationPatch, findOrchestratorAgent, buildLegacyContextAgent, shouldMarkAgentAsLegacyContext, canOpenMaiaMarketplace, shouldSetChatViewHiddenOnMount, shouldPersistLastActiveChatId, hasBannerFaqTitle, shouldSyncPanelSessionOnPageHide, resolveCachedAgentsIfAvailable, shouldAttemptInitialAgentsFetch, findAgentForChatItem, shouldApplyClientOnHostTakeover, shouldSelectFirstAgentOnHostTakeover, shouldResetChatStateOnGoHome, shouldClearContextForCatalogOrSkillAgent, resolveOpenNewChatWithAgentContext, canContinueLegacyContextInNewChat, resolveSessionRestoreNavRoute, shouldSkipAgentsLoadOnSessionRestore, shouldFetchAgentDetailOnSessionRestore, shouldPassAgentToGetAgentsOnRestore, shouldSelectFetchedAgentAfterRestore, resolveSnapshotChipsProject, resolveChatModalSectionFlags, shouldRenderChatSidebar, resolveChatModalMainContentView, shouldShowChatModalFooter, shouldUseElevatedMaiaPanel, shouldReselectAgentAfterDelete, shouldClearDragPositionOnLayoutChange, shouldPersistDragPositionOnDragEnd, shouldStartFloatingPanelDrag, isActiveFloatingDragPointer, shouldOpenSkillsCatalog, shouldUseDragClampFallback, resolveLayoutDragPositionUpdate, resolvePersistedDragPositionOnEnd, buildUserInitialMessageFromStartChat, shouldResetSidebarErrorOnStartChat, shouldClearTaskOnGoHomeFromChat, shouldClearOrchestratorGlobalContextOnGoHome, shouldPrefetchAgentsForCatalogNewChat, isGlobalMaiaSection } from './ChatAIModal.helpers';
9
+ var baseUser = {
10
+ id: 1,
11
+ company_id: 10,
12
+ role_id: CORUserRole.PROJECT_MANAGER
13
+ };
14
+ var orchestratorAgent = {
15
+ id: '1',
16
+ name: 'MAIA',
17
+ type: 'orchestrator',
18
+ entity: 'global'
19
+ };
20
+ var agent = function agent(id) {
21
+ return {
22
+ id: id,
23
+ name: "Agent ".concat(id),
24
+ type: 'custom'
25
+ };
26
+ };
27
+ describe('ChatAIModal.helpers', function () {
28
+ var originalChatAccess = window.MAIA_CHAT_AI_FEATURE_ACCESS;
29
+ var originalMultiAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
30
+ var originalSkillsAccess = window.MAIA_SKILLS_ACCESS;
31
+ var originalProjectSummary = window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS;
32
+ afterEach(function () {
33
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = originalChatAccess;
34
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = originalMultiAgents;
35
+ window.MAIA_SKILLS_ACCESS = originalSkillsAccess;
36
+ window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS = originalProjectSummary;
37
+ });
38
+ describe('resolveAiChatBackDestination', function () {
39
+ it('returns global home for orchestrator on header home', function () {
40
+ expect(resolveAiChatBackDestination('header', 'orchestrator', options.home, options.home)).toBe('global_context_home');
41
+ });
42
+ it('maps section-specific homes', function () {
43
+ expect(resolveAiChatBackDestination('task', 'orchestrator', options.chat, options.home)).toBe('task_home');
44
+ expect(resolveAiChatBackDestination('planner', 'clone', options.chat, options.home)).toBe('planner_home');
45
+ expect(resolveAiChatBackDestination('project', 'clone', options.chat, options.home)).toBe('project_home');
46
+ expect(resolveAiChatBackDestination('client', 'clone', options.chat, options.home)).toBe('client_home');
47
+ });
48
+ it('falls back to global home for unsupported combinations', function () {
49
+ expect(resolveAiChatBackDestination('header', 'custom', options.chat, options.chat)).toBe('global_context_home');
50
+ });
51
+ });
52
+ describe('validateAccessByFeature', function () {
53
+ it('denies access without section or chat permission', function () {
54
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = true;
55
+ expect(validateAccessByFeature(null, baseUser)).toBe(false);
56
+ expect(validateAccessByFeature('header', _objectSpread(_objectSpread({}, baseUser), {}, {
57
+ role_id: CORUserRole.CLIENT
58
+ }))).toBe(false);
59
+ });
60
+ it('allows task and planner when chat AI is enabled for the user', function () {
61
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = false;
62
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
63
+ window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS = true;
64
+ expect(validateAccessByFeature('task', baseUser)).toBe(true);
65
+ expect(validateAccessByFeature('planner', baseUser)).toBe(true);
66
+ });
67
+ it('requires chat flags for header and project sections', function () {
68
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = false;
69
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
70
+ expect(validateAccessByFeature('header', baseUser)).toBe(false);
71
+ expect(validateAccessByFeature('project', baseUser)).toBe(false);
72
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
73
+ expect(validateAccessByFeature('header', baseUser)).toBe(true);
74
+ window.MAIA_CHAT_AI_FEATURE_ACCESS = true;
75
+ window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
76
+ expect(validateAccessByFeature('project', baseUser)).toBe(true);
77
+ });
78
+ });
79
+ describe('resolveComputedCurrentOption', function () {
80
+ it('falls back to the current option when myAgents is unavailable', function () {
81
+ expect(resolveComputedCurrentOption({
82
+ currentOption: options.myAgents,
83
+ agent: orchestratorAgent,
84
+ project: null,
85
+ client: null,
86
+ user: baseUser,
87
+ multiAgentsAccess: false
88
+ })).toBe(options.myAgents);
89
+ });
90
+ it('keeps myAgents and mySkills when feature access allows', function () {
91
+ window.MAIA_SKILLS_ACCESS = true;
92
+ expect(resolveComputedCurrentOption({
93
+ currentOption: options.myAgents,
94
+ agent: orchestratorAgent,
95
+ project: null,
96
+ client: null,
97
+ user: baseUser,
98
+ multiAgentsAccess: true
99
+ })).toBe(options.myAgents);
100
+ expect(resolveComputedCurrentOption({
101
+ currentOption: options.mySkills,
102
+ agent: orchestratorAgent,
103
+ project: null,
104
+ client: null,
105
+ user: baseUser,
106
+ multiAgentsAccess: false
107
+ })).toBe(options.mySkills);
108
+ });
109
+ it('redirects non-orchestrator global specialists from home to chat', function () {
110
+ var globalClone = {
111
+ id: '2',
112
+ name: 'Sales Bot',
113
+ type: 'clone',
114
+ entity: 'global'
115
+ };
116
+ expect(resolveComputedCurrentOption({
117
+ currentOption: options.home,
118
+ agent: globalClone,
119
+ project: null,
120
+ client: null,
121
+ user: baseUser,
122
+ multiAgentsAccess: false
123
+ })).toBe(options.chat);
124
+ });
125
+ it('keeps chat option when project or client context is already set', function () {
126
+ var projectAgent = {
127
+ id: '3',
128
+ name: 'Proj',
129
+ type: 'clone',
130
+ entity: 'project'
131
+ };
132
+ var clientAgent = {
133
+ id: '4',
134
+ name: 'Client',
135
+ type: 'clone',
136
+ entity: 'client'
137
+ };
138
+ expect(resolveComputedCurrentOption({
139
+ currentOption: options.home,
140
+ agent: projectAgent,
141
+ project: {
142
+ id: 10,
143
+ name: 'Alpha'
144
+ },
145
+ client: null,
146
+ user: baseUser,
147
+ multiAgentsAccess: false
148
+ })).toBe(options.home);
149
+ expect(resolveComputedCurrentOption({
150
+ currentOption: options.home,
151
+ agent: clientAgent,
152
+ project: null,
153
+ client: {
154
+ id: 5,
155
+ name: 'Beta'
156
+ },
157
+ user: baseUser,
158
+ multiAgentsAccess: false
159
+ })).toBe(options.home);
160
+ });
161
+ it('does not redirect orchestrator global clones from home', function () {
162
+ var orchestratorGlobal = {
163
+ id: '1',
164
+ name: 'MAIA',
165
+ type: 'orchestrator',
166
+ entity: 'global'
167
+ };
168
+ expect(resolveComputedCurrentOption({
169
+ currentOption: options.home,
170
+ agent: orchestratorGlobal,
171
+ project: null,
172
+ client: null,
173
+ user: baseUser,
174
+ multiAgentsAccess: false
175
+ })).toBe(options.home);
176
+ });
177
+ it('shows project and client selectors when context is missing', function () {
178
+ var projectAgent = {
179
+ id: '3',
180
+ name: 'Proj',
181
+ type: 'clone',
182
+ entity: 'project'
183
+ };
184
+ var clientAgent = {
185
+ id: '4',
186
+ name: 'Client',
187
+ type: 'clone',
188
+ entity: 'client'
189
+ };
190
+ expect(resolveComputedCurrentOption({
191
+ currentOption: options.home,
192
+ agent: projectAgent,
193
+ project: null,
194
+ client: null,
195
+ user: baseUser,
196
+ multiAgentsAccess: false
197
+ })).toBe(options.projectSelector);
198
+ expect(resolveComputedCurrentOption({
199
+ currentOption: options.home,
200
+ agent: clientAgent,
201
+ project: null,
202
+ client: null,
203
+ user: baseUser,
204
+ multiAgentsAccess: false
205
+ })).toBe(options.clientSelector);
206
+ });
207
+ });
208
+ describe('resolveSidebarAgentsNavActive', function () {
209
+ it('maps computed options and maiaker selection', function () {
210
+ expect(resolveSidebarAgentsNavActive(options.mySkills, false)).toBe('mySkills');
211
+ expect(resolveSidebarAgentsNavActive(options.myAgents, false)).toBe('myAgents');
212
+ expect(resolveSidebarAgentsNavActive(options.home, true)).toBe('maiaker');
213
+ expect(resolveSidebarAgentsNavActive(options.chat, false)).toBeNull();
214
+ });
215
+ });
216
+ describe('resolveInitialCurrentOption', function () {
217
+ it('restores saved nav and validates saved option', function () {
218
+ window.MAIA_SKILLS_ACCESS = true;
219
+ expect(resolveInitialCurrentOption('myAgents', null, baseUser)).toBe(options.myAgents);
220
+ expect(resolveInitialCurrentOption('mySkills', null, baseUser)).toBe(options.mySkills);
221
+ expect(resolveInitialCurrentOption(null, 'chat', baseUser)).toBe(options.chat);
222
+ expect(resolveInitialCurrentOption(null, 'invalid', baseUser)).toBe(options.home);
223
+ });
224
+ it('ignores saved mySkills when the user lacks skills access', function () {
225
+ window.MAIA_SKILLS_ACCESS = false;
226
+ expect(resolveInitialCurrentOption('mySkills', null, baseUser)).toBe(options.home);
227
+ });
228
+ });
229
+ describe('clampFloatingPanelPosition', function () {
230
+ it('keeps the panel inside the viewport with padding', function () {
231
+ expect(clampFloatingPanelPosition(0, 0, 400, 600, 1200, 800)).toEqual({
232
+ x: 16,
233
+ y: 16
234
+ });
235
+ expect(clampFloatingPanelPosition(2000, 2000, 400, 600, 1200, 800)).toEqual({
236
+ x: 784,
237
+ y: 184
238
+ });
239
+ });
240
+ });
241
+ describe('resolveLegacyContextSession', function () {
242
+ it('returns legacy clone context only on chat view', function () {
243
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
244
+ agentType: 'clone',
245
+ agentEntity: 'project',
246
+ projectName: 'Alpha'
247
+ })).toEqual({
248
+ entityType: 'project',
249
+ contextName: 'Alpha'
250
+ });
251
+ expect(resolveLegacyContextSession(options.home, options.chat, {
252
+ agentType: 'clone',
253
+ agentEntity: 'project',
254
+ projectName: 'Alpha'
255
+ })).toBeNull();
256
+ });
257
+ it('maps task and client names and ignores invalid entities', function () {
258
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
259
+ agentType: 'clone',
260
+ agentEntity: 'task'
261
+ })).toEqual({
262
+ entityType: 'task',
263
+ contextName: ''
264
+ });
265
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
266
+ agentType: 'clone',
267
+ agentEntity: 'task',
268
+ taskName: 'Bugfix'
269
+ })).toEqual({
270
+ entityType: 'task',
271
+ contextName: 'Bugfix'
272
+ });
273
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
274
+ agentType: 'clone',
275
+ agentEntity: 'client',
276
+ clientName: 'Acme'
277
+ })).toEqual({
278
+ entityType: 'client',
279
+ contextName: 'Acme'
280
+ });
281
+ expect(resolveLegacyContextSession(options.chat, options.chat, {
282
+ agentType: 'clone',
283
+ agentEntity: 'global',
284
+ projectName: 'Ignored'
285
+ })).toBeNull();
286
+ });
287
+ });
288
+ describe('hasAnyActiveSessionInMeta', function () {
289
+ it('detects thinking, writing and approval sessions', function () {
290
+ expect(hasAnyActiveSessionInMeta({
291
+ a: {
292
+ status: 'thinking'
293
+ },
294
+ b: {
295
+ status: 'complete'
296
+ }
297
+ })).toBe(true);
298
+ expect(hasAnyActiveSessionInMeta({
299
+ a: {
300
+ status: 'complete'
301
+ }
302
+ })).toBe(false);
303
+ });
304
+ });
305
+ describe('panel restore and floating helpers', function () {
306
+ it('restores expanded panels from saved session snapshots', function () {
307
+ expect(shouldRestoreExpandedPanel({
308
+ isExpanded: true
309
+ })).toBe(true);
310
+ expect(shouldRestoreExpandedPanel({
311
+ isExpanded: false
312
+ })).toBe(false);
313
+ expect(shouldRestoreExpandedPanel(undefined)).toBe(false);
314
+ });
315
+ it('anchors the default floating panel to the bottom-right corner', function () {
316
+ expect(resolveDefaultFloatingPanelPosition(1200, 480)).toEqual({
317
+ x: 704,
318
+ y: 16
319
+ });
320
+ });
321
+ it('skips drag on interactive targets', function () {
322
+ var button = document.createElement('button');
323
+ expect(shouldSkipFloatingDragTarget(button)).toBe(true);
324
+ expect(shouldSkipFloatingDragTarget(document.createElement('div'))).toBe(false);
325
+ });
326
+ });
327
+ describe('isBannerFaqReadyToAutoSend', function () {
328
+ it('blocks auto send when the FAQ is empty or already sent', function () {
329
+ expect(isBannerFaqReadyToAutoSend({
330
+ faqTitle: ' ',
331
+ alreadySent: false,
332
+ loading: false,
333
+ agentId: '1',
334
+ section: 'header'
335
+ })).toBe(false);
336
+ expect(isBannerFaqReadyToAutoSend({
337
+ faqTitle: 'Pregunta',
338
+ alreadySent: true,
339
+ loading: false,
340
+ agentId: '1',
341
+ section: 'header'
342
+ })).toBe(false);
343
+ });
344
+ it('waits for project and client context before auto sending', function () {
345
+ expect(isBannerFaqReadyToAutoSend({
346
+ faqTitle: 'Resumí el proyecto',
347
+ alreadySent: false,
348
+ loading: false,
349
+ agentId: '1',
350
+ section: 'project',
351
+ projectId: null
352
+ })).toBe(false);
353
+ expect(isBannerFaqReadyToAutoSend({
354
+ faqTitle: 'Resumí el proyecto',
355
+ alreadySent: false,
356
+ loading: false,
357
+ agentId: '1',
358
+ section: 'project',
359
+ projectId: 42
360
+ })).toBe(true);
361
+ });
362
+ it('requires client context for client sections and allows header FAQs', function () {
363
+ expect(isBannerFaqReadyToAutoSend({
364
+ faqTitle: 'Pregunta',
365
+ alreadySent: false,
366
+ loading: false,
367
+ agentId: '1',
368
+ section: 'client',
369
+ clientId: null
370
+ })).toBe(false);
371
+ expect(isBannerFaqReadyToAutoSend({
372
+ faqTitle: 'Pregunta',
373
+ alreadySent: false,
374
+ loading: false,
375
+ agentId: '1',
376
+ section: 'client',
377
+ clientId: 9
378
+ })).toBe(true);
379
+ expect(isBannerFaqReadyToAutoSend({
380
+ faqTitle: 'Pregunta',
381
+ alreadySent: false,
382
+ loading: false,
383
+ agentId: '1',
384
+ section: 'header'
385
+ })).toBe(true);
386
+ });
387
+ });
388
+ describe('isLegacyContextEntity', function () {
389
+ it('accepts only project, task and client entities', function () {
390
+ expect(isLegacyContextEntity('project')).toBe(true);
391
+ expect(isLegacyContextEntity('global')).toBe(false);
392
+ });
393
+ });
394
+ describe('getMaiaHostPanelPresentation', function () {
395
+ it('hides expanded panel on maia page route without showing the pill', function () {
396
+ expect(getMaiaHostPanelPresentation(false, true)).toEqual({
397
+ hidePanelContent: true,
398
+ showMinimizedPill: false
399
+ });
400
+ });
401
+ it('keeps the panel visible on other routes when expanded', function () {
402
+ expect(getMaiaHostPanelPresentation(false, false)).toEqual({
403
+ hidePanelContent: false,
404
+ showMinimizedPill: false
405
+ });
406
+ });
407
+ it('shows the pill only when minimized outside maia page', function () {
408
+ expect(getMaiaHostPanelPresentation(true, false)).toEqual({
409
+ hidePanelContent: true,
410
+ showMinimizedPill: true
411
+ });
412
+ expect(getMaiaHostPanelPresentation(true, true)).toEqual({
413
+ hidePanelContent: true,
414
+ showMinimizedPill: false
415
+ });
416
+ });
417
+ });
418
+ describe('ensureAgentsBeforeSkillUse', function () {
419
+ it('returns undefined when useFirstAgent is false', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
420
+ var ensureAgentsLoaded;
421
+ return _regeneratorRuntime.wrap(function (_context) {
422
+ while (1) switch (_context.prev = _context.next) {
423
+ case 0:
424
+ ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a1')]);
425
+ _context.next = 1;
426
+ return expect(ensureAgentsBeforeSkillUse({
427
+ useFirstAgent: false,
428
+ agents: [],
429
+ ensureAgentsLoaded: ensureAgentsLoaded
430
+ })).resolves.toBeUndefined();
431
+ case 1:
432
+ expect(ensureAgentsLoaded).not.toHaveBeenCalled();
433
+ case 2:
434
+ case "end":
435
+ return _context.stop();
436
+ }
437
+ }, _callee);
438
+ })));
439
+ it('uses the in-memory agents list when it is already populated', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
440
+ var ensureAgentsLoaded;
441
+ return _regeneratorRuntime.wrap(function (_context2) {
442
+ while (1) switch (_context2.prev = _context2.next) {
443
+ case 0:
444
+ ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a2')]);
445
+ _context2.next = 1;
446
+ return expect(ensureAgentsBeforeSkillUse({
447
+ useFirstAgent: true,
448
+ agents: [agent('a1')],
449
+ ensureAgentsLoaded: ensureAgentsLoaded
450
+ })).resolves.toEqual(agent('a1'));
451
+ case 1:
452
+ expect(ensureAgentsLoaded).not.toHaveBeenCalled();
453
+ case 2:
454
+ case "end":
455
+ return _context2.stop();
456
+ }
457
+ }, _callee2);
458
+ })));
459
+ it('loads agents when the list is empty', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
460
+ var ensureAgentsLoaded;
461
+ return _regeneratorRuntime.wrap(function (_context3) {
462
+ while (1) switch (_context3.prev = _context3.next) {
463
+ case 0:
464
+ ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a1'), agent('a2')]);
465
+ _context3.next = 1;
466
+ return expect(ensureAgentsBeforeSkillUse({
467
+ useFirstAgent: true,
468
+ agents: [],
469
+ ensureAgentsLoaded: ensureAgentsLoaded
470
+ })).resolves.toEqual(agent('a1'));
471
+ case 1:
472
+ expect(ensureAgentsLoaded).toHaveBeenCalledTimes(1);
473
+ case 2:
474
+ case "end":
475
+ return _context3.stop();
476
+ }
477
+ }, _callee3);
478
+ })));
479
+ it('returns undefined when agents cannot be loaded', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
480
+ var ensureAgentsLoaded;
481
+ return _regeneratorRuntime.wrap(function (_context4) {
482
+ while (1) switch (_context4.prev = _context4.next) {
483
+ case 0:
484
+ ensureAgentsLoaded = jest.fn().mockResolvedValue([]);
485
+ _context4.next = 1;
486
+ return expect(ensureAgentsBeforeSkillUse({
487
+ useFirstAgent: true,
488
+ agents: [],
489
+ ensureAgentsLoaded: ensureAgentsLoaded
490
+ })).resolves.toBeUndefined();
491
+ case 1:
492
+ case "end":
493
+ return _context4.stop();
494
+ }
495
+ }, _callee4);
496
+ })));
497
+ });
498
+ describe('host takeover context helpers', function () {
499
+ it('maps project/task sections to project and task entities', function () {
500
+ var project = {
501
+ id: 1,
502
+ name: 'Alpha'
503
+ };
504
+ var task = {
505
+ id: 9,
506
+ name: 'Bug'
507
+ };
508
+ expect(resolveHostTakeoverEntityState({
509
+ section: 'task',
510
+ project: project,
511
+ task: task
512
+ })).toMatchObject({
513
+ project: project,
514
+ task: task,
515
+ clearGlobalPinnedContext: false
516
+ });
517
+ expect(resolveHostTakeoverEntityState({
518
+ section: 'task',
519
+ project: project,
520
+ task: task
521
+ }).client).toBeUndefined();
522
+ });
523
+ it('clears client on header/planner takeover and sets client on client section', function () {
524
+ var client = {
525
+ id: 2,
526
+ name: 'Acme'
527
+ };
528
+ expect(resolveHostTakeoverEntityState({
529
+ section: 'header'
530
+ })).toMatchObject({
531
+ project: null,
532
+ client: null,
533
+ task: null,
534
+ clearGlobalPinnedContext: true
535
+ });
536
+ expect(resolveHostTakeoverEntityState({
537
+ section: 'client',
538
+ client: client
539
+ })).toMatchObject({
540
+ project: null,
541
+ client: client,
542
+ clearGlobalPinnedContext: false
543
+ });
544
+ });
545
+ it('builds persist host context for panel session patch', function () {
546
+ var project = {
547
+ id: 3,
548
+ name: 'Beta'
549
+ };
550
+ expect(buildHostTakeoverPersistContext({
551
+ section: 'project',
552
+ project: project
553
+ })).toEqual({
554
+ section: 'project',
555
+ project: project,
556
+ client: null,
557
+ task: null,
558
+ chipsProject: null
559
+ });
560
+ });
561
+ it('defaults missing project, client and task entities on takeover', function () {
562
+ expect(resolveHostTakeoverEntityState({
563
+ section: 'project'
564
+ })).toMatchObject({
565
+ project: null,
566
+ task: null
567
+ });
568
+ expect(resolveHostTakeoverEntityState({
569
+ section: 'client'
570
+ })).toMatchObject({
571
+ client: null
572
+ });
573
+ expect(resolveHostTakeoverEntityState({
574
+ section: 'task',
575
+ project: {
576
+ id: 1
577
+ }
578
+ })).toMatchObject({
579
+ task: null
580
+ });
581
+ expect(buildHostTakeoverPersistContext({
582
+ section: 'planner'
583
+ })).toMatchObject({
584
+ project: null,
585
+ client: null,
586
+ task: null
587
+ });
588
+ expect(buildHostTakeoverPersistContext({
589
+ section: 'client'
590
+ })).toMatchObject({
591
+ client: null
592
+ });
593
+ expect(buildHostTakeoverPersistContext({
594
+ section: 'client',
595
+ client: {
596
+ id: 9,
597
+ name: 'Client'
598
+ }
599
+ }).client).toEqual({
600
+ id: 9,
601
+ name: 'Client'
602
+ });
603
+ expect(buildHostTakeoverPersistContext({
604
+ section: 'task',
605
+ task: {
606
+ id: 1,
607
+ name: 'T'
608
+ }
609
+ }).task).toEqual({
610
+ id: 1,
611
+ name: 'T'
612
+ });
613
+ var project = {
614
+ id: 4,
615
+ name: 'P'
616
+ };
617
+ expect(buildHostTakeoverPersistContext({
618
+ section: 'task',
619
+ project: project,
620
+ task: {
621
+ id: 1,
622
+ name: 'T'
623
+ }
624
+ })).toMatchObject({
625
+ project: project,
626
+ task: {
627
+ id: 1,
628
+ name: 'T'
629
+ }
630
+ });
631
+ });
632
+ });
633
+ describe('modal navigation and session helpers', function () {
634
+ it('normalizes br to pt-br for modal i18n', function () {
635
+ expect(resolveMaiaModalI18nLang('br')).toBe('pt-br');
636
+ expect(resolveMaiaModalI18nLang('es')).toBe('es');
637
+ });
638
+ it('checks agent management permissions with multi-agents flag', function () {
639
+ expect(resolveUserHasAgentManagementPermissions({
640
+ ai_agents: {
641
+ create: true
642
+ }
643
+ }, true)).toBe(true);
644
+ expect(resolveUserHasAgentManagementPermissions({
645
+ ai_agents: {
646
+ edit: true
647
+ }
648
+ }, true)).toBe(true);
649
+ expect(resolveUserHasAgentManagementPermissions({
650
+ ai_agents: {
651
+ "delete": true
652
+ }
653
+ }, true)).toBe(true);
654
+ expect(resolveUserHasAgentManagementPermissions({
655
+ ai_agents: {
656
+ create: true
657
+ }
658
+ }, false)).toBe(false);
659
+ });
660
+ it('decides when to start a new chat from catalog views', function () {
661
+ expect(shouldStartNewChatFromCatalog(options.myAgents, false)).toBe(true);
662
+ expect(shouldStartNewChatFromCatalog(options.home, true)).toBe(true);
663
+ expect(shouldStartNewChatFromCatalog(options.home, false)).toBe(false);
664
+ });
665
+ it('handles back navigation branches', function () {
666
+ expect(shouldBackStartNewChatPreservingContext(options.chat, options.chat)).toBe(true);
667
+ expect(shouldBackClearPinnedContext(options.home, options.home, 'header', false)).toBe(true);
668
+ expect(shouldBackClearPinnedContext(options.home, options.home, 'project', false)).toBe(false);
669
+ });
670
+ it('marks orchestrator context reset on pinned-to-empty transition', function () {
671
+ expect(shouldMarkOrchestratorContextReset('project', 'orchestrator', true, false)).toBe(true);
672
+ expect(shouldMarkOrchestratorContextReset('header', 'orchestrator', true, false)).toBe(false);
673
+ });
674
+ it('prefers unread chats when restoring from minimized', function () {
675
+ var _resolveMinimizedRest, _resolveMinimizedRest2;
676
+ var chats = [{
677
+ sessionExternalId: 's1',
678
+ isRead: true
679
+ }, {
680
+ sessionExternalId: 's2',
681
+ isRead: false
682
+ }];
683
+ expect((_resolveMinimizedRest = resolveMinimizedRestoreTarget(chats, 's1')) === null || _resolveMinimizedRest === void 0 ? void 0 : _resolveMinimizedRest.sessionExternalId).toBe('s2');
684
+ expect((_resolveMinimizedRest2 = resolveMinimizedRestoreTarget([{
685
+ sessionExternalId: 's1',
686
+ isRead: true
687
+ }], 's1')) === null || _resolveMinimizedRest2 === void 0 ? void 0 : _resolveMinimizedRest2.sessionExternalId).toBe('s1');
688
+ expect(resolveMinimizedRestoreTarget([{
689
+ sessionExternalId: 's1',
690
+ isRead: true
691
+ }], undefined)).toBeUndefined();
692
+ });
693
+ it('resolves host takeover agent id', function () {
694
+ expect(resolveHostTakeoverAgentId(false, [agent('a1')], 'current')).toBe('current');
695
+ expect(resolveHostTakeoverAgentId(false, [agent('a1')], undefined)).toBeNull();
696
+ expect(resolveHostTakeoverAgentId(true, [agent('a1')], 'current')).toBe('a1');
697
+ expect(resolveHostTakeoverAgentId(true, [], 'current')).toBeNull();
698
+ });
699
+ it('builds panel session patch only when expanded', function () {
700
+ expect(buildMaiaPanelSessionPatch({
701
+ isMinimized: true,
702
+ currentOption: options.home,
703
+ agentsNavActive: null,
704
+ activeChatId: null,
705
+ agentId: null,
706
+ sidebarOpen: false,
707
+ layoutMode: 'floating',
708
+ dragPosition: {
709
+ x: 1,
710
+ y: 2
711
+ },
712
+ hostContext: {
713
+ section: 'header',
714
+ project: null,
715
+ client: null,
716
+ task: null,
717
+ chipsProject: null
718
+ }
719
+ })).toBeNull();
720
+ expect(buildMaiaPanelSessionPatch({
721
+ isMinimized: false,
722
+ currentOption: options.chat,
723
+ agentsNavActive: 'myAgents',
724
+ activeChatId: 'chat-1',
725
+ agentId: '1',
726
+ sidebarOpen: true,
727
+ layoutMode: 'sidebar',
728
+ dragPosition: {
729
+ x: 1,
730
+ y: 2
731
+ },
732
+ hostContext: {
733
+ section: 'header',
734
+ project: null,
735
+ client: null,
736
+ task: null,
737
+ chipsProject: null
738
+ }
739
+ })).toMatchObject({
740
+ activeChatId: 'chat-1',
741
+ dragPosition: null
742
+ });
743
+ expect(buildMaiaPanelSessionPatch({
744
+ isMinimized: false,
745
+ currentOption: options.chat,
746
+ agentsNavActive: null,
747
+ activeChatId: 'chat-1',
748
+ agentId: '1',
749
+ sidebarOpen: false,
750
+ layoutMode: 'floating',
751
+ dragPosition: {
752
+ x: 3,
753
+ y: 4
754
+ },
755
+ hostContext: {
756
+ section: 'header',
757
+ project: null,
758
+ client: null,
759
+ task: null,
760
+ chipsProject: null
761
+ }
762
+ })).toMatchObject({
763
+ dragPosition: {
764
+ x: 3,
765
+ y: 4
766
+ }
767
+ });
768
+ });
769
+ it('resolves floating drag position with clamp fallback', function () {
770
+ var clamp = function clamp(x, y) {
771
+ return {
772
+ x: x,
773
+ y: y
774
+ };
775
+ };
776
+ expect(resolveFloatingPanelDragPosition({
777
+ layoutMode: 'sidebar',
778
+ dragPosition: {
779
+ x: 5,
780
+ y: 6
781
+ },
782
+ viewportWidth: 1200,
783
+ panelWidth: 400,
784
+ clamp: clamp
785
+ })).toEqual({
786
+ x: 5,
787
+ y: 6
788
+ });
789
+ expect(resolveFloatingPanelDragPosition({
790
+ layoutMode: 'floating',
791
+ dragPosition: null,
792
+ viewportWidth: 1200,
793
+ panelWidth: 400,
794
+ clamp: clamp
795
+ })).toEqual({
796
+ x: 784,
797
+ y: 16
798
+ });
799
+ expect(resolveFloatingPanelDragPosition({
800
+ layoutMode: 'floating',
801
+ dragPosition: {
802
+ x: 40,
803
+ y: 50
804
+ },
805
+ viewportWidth: 1200,
806
+ panelWidth: 400,
807
+ clamp: clamp
808
+ })).toEqual({
809
+ x: 40,
810
+ y: 50
811
+ });
812
+ });
813
+ it('reuses previous drag position when unchanged', function () {
814
+ var prev = {
815
+ x: 10,
816
+ y: 20
817
+ };
818
+ expect(resolveNextDragPosition(prev, {
819
+ x: 10,
820
+ y: 20
821
+ })).toBe(prev);
822
+ expect(resolveNextDragPosition(prev, {
823
+ x: 11,
824
+ y: 20
825
+ })).toEqual({
826
+ x: 11,
827
+ y: 20
828
+ });
829
+ });
830
+ });
831
+ describe('navigation and legacy context helpers', function () {
832
+ it('resolves pinned context and back button visibility', function () {
833
+ expect(resolveHasPinnedContext({
834
+ taskId: 1
835
+ })).toBe(true);
836
+ expect(resolveHasPinnedContext({})).toBe(false);
837
+ var flags = resolveOrchestratorHomeNavFlags({
838
+ computedCurrentOption: options.chat,
839
+ homeOption: options.home,
840
+ chatOption: options.chat,
841
+ hasPinnedContext: true,
842
+ section: 'header',
843
+ didResetContextInSection: false
844
+ });
845
+ expect(flags.isChatView).toBe(true);
846
+ expect(shouldShowOrchestratorBackButton(_objectSpread({
847
+ agentType: 'orchestrator',
848
+ hasError: false,
849
+ loading: false
850
+ }, flags))).toBe(true);
851
+ var sectionResetFlags = resolveOrchestratorHomeNavFlags({
852
+ computedCurrentOption: options.home,
853
+ homeOption: options.home,
854
+ chatOption: options.chat,
855
+ hasPinnedContext: true,
856
+ section: 'project',
857
+ didResetContextInSection: true
858
+ });
859
+ expect(sectionResetFlags.isSectionResetHomeStep2).toBe(true);
860
+ expect(shouldShowOrchestratorBackButton(_objectSpread({
861
+ agentType: 'orchestrator',
862
+ hasError: true,
863
+ loading: false
864
+ }, sectionResetFlags))).toBe(false);
865
+ expect(shouldShowOrchestratorBackButton({
866
+ agentType: 'orchestrator',
867
+ hasError: false,
868
+ loading: true,
869
+ isChatView: true,
870
+ isHeaderHomeStep2: false,
871
+ isSectionResetHomeStep2: false
872
+ })).toBe(false);
873
+ expect(shouldShowOrchestratorBackButton({
874
+ agentType: 'orchestrator',
875
+ hasError: false,
876
+ loading: false,
877
+ isChatView: false,
878
+ isHeaderHomeStep2: false,
879
+ isSectionResetHomeStep2: true
880
+ })).toBe(true);
881
+ });
882
+ it('builds legacy migration patches for client, project and task entities', function () {
883
+ var _buildLegacyContextMi, _buildLegacyContextMi2, _buildLegacyContextMi3, _buildLegacyContextMi4, _buildLegacyContextMi5, _buildLegacyContextMi6, _buildLegacyContextMi7, _buildLegacyContextMi8, _buildLegacyContextMi9;
884
+ expect(buildLegacyContextMigrationPatch(null)).toBeNull();
885
+ expect(buildLegacyContextMigrationPatch({
886
+ agentEntity: 'client'
887
+ })).toBeNull();
888
+ expect((_buildLegacyContextMi = buildLegacyContextMigrationPatch({
889
+ agentEntity: 'client',
890
+ clientId: 3,
891
+ clientName: 'ACME'
892
+ })) === null || _buildLegacyContextMi === void 0 ? void 0 : _buildLegacyContextMi.client).toEqual({
893
+ id: 3,
894
+ name: 'ACME'
895
+ });
896
+ expect((_buildLegacyContextMi2 = buildLegacyContextMigrationPatch({
897
+ agentEntity: 'project',
898
+ projectId: 9,
899
+ projectName: 'P'
900
+ })) === null || _buildLegacyContextMi2 === void 0 || (_buildLegacyContextMi2 = _buildLegacyContextMi2.chipsProject) === null || _buildLegacyContextMi2 === void 0 ? void 0 : _buildLegacyContextMi2.projectId).toBe('9');
901
+ expect((_buildLegacyContextMi3 = buildLegacyContextMigrationPatch({
902
+ agentEntity: 'task',
903
+ taskId: 1,
904
+ taskName: 'T',
905
+ projectId: 2,
906
+ projectName: 'P',
907
+ clientId: 4,
908
+ clientName: 'C'
909
+ })) === null || _buildLegacyContextMi3 === void 0 ? void 0 : _buildLegacyContextMi3.task).toMatchObject({
910
+ id: 1,
911
+ name: 'T',
912
+ projectId: 2
913
+ });
914
+ expect((_buildLegacyContextMi4 = buildLegacyContextMigrationPatch({
915
+ agentEntity: 'project',
916
+ projectId: 9,
917
+ projectName: 'P',
918
+ clientId: 4,
919
+ clientName: 'C'
920
+ })) === null || _buildLegacyContextMi4 === void 0 ? void 0 : _buildLegacyContextMi4.project).toMatchObject({
921
+ clientId: 4
922
+ });
923
+ expect((_buildLegacyContextMi5 = buildLegacyContextMigrationPatch({
924
+ agentEntity: 'task',
925
+ taskId: 5,
926
+ taskName: 'Only task'
927
+ })) === null || _buildLegacyContextMi5 === void 0 ? void 0 : _buildLegacyContextMi5.task).toEqual({
928
+ id: 5,
929
+ name: 'Only task'
930
+ });
931
+ expect((_buildLegacyContextMi6 = buildLegacyContextMigrationPatch({
932
+ agentEntity: 'client',
933
+ clientId: 1
934
+ })) === null || _buildLegacyContextMi6 === void 0 ? void 0 : _buildLegacyContextMi6.client).toEqual({
935
+ id: 1,
936
+ name: ''
937
+ });
938
+ expect((_buildLegacyContextMi7 = buildLegacyContextMigrationPatch({
939
+ agentEntity: 'task',
940
+ taskId: 8,
941
+ taskName: 'T',
942
+ projectId: 2,
943
+ projectName: 'P'
944
+ })) === null || _buildLegacyContextMi7 === void 0 || (_buildLegacyContextMi7 = _buildLegacyContextMi7.chipsProject) === null || _buildLegacyContextMi7 === void 0 ? void 0 : _buildLegacyContextMi7.projectId).toBe('2');
945
+ expect((_buildLegacyContextMi8 = buildLegacyContextMigrationPatch({
946
+ agentEntity: 'task',
947
+ taskId: 6,
948
+ taskName: 'T',
949
+ clientId: 3,
950
+ clientName: 'C'
951
+ })) === null || _buildLegacyContextMi8 === void 0 ? void 0 : _buildLegacyContextMi8.client).toEqual({
952
+ id: 3,
953
+ name: 'C'
954
+ });
955
+ expect((_buildLegacyContextMi9 = buildLegacyContextMigrationPatch({
956
+ agentEntity: 'project',
957
+ projectId: 9,
958
+ projectName: 'P'
959
+ })) === null || _buildLegacyContextMi9 === void 0 ? void 0 : _buildLegacyContextMi9.project).not.toHaveProperty('clientId');
960
+ expect(buildLegacyContextMigrationPatch({
961
+ agentEntity: 'task',
962
+ taskId: 10,
963
+ taskName: 'Full task',
964
+ projectId: 11,
965
+ projectName: 'Proj',
966
+ clientId: 12,
967
+ clientName: 'Client'
968
+ })).toMatchObject({
969
+ task: {
970
+ id: 10,
971
+ name: 'Full task',
972
+ projectId: 11,
973
+ clientId: 12
974
+ },
975
+ client: {
976
+ id: 12,
977
+ name: 'Client'
978
+ },
979
+ chipsProject: {
980
+ projectId: '11',
981
+ projectName: 'Proj',
982
+ clientName: 'Client'
983
+ }
984
+ });
985
+ });
986
+ it('resolves floating drag clamp and layout position updates', function () {
987
+ expect(shouldUseDragClampFallback(null)).toBe(true);
988
+ var clamp = function clamp(x, y) {
989
+ return {
990
+ x: x,
991
+ y: y
992
+ };
993
+ };
994
+ expect(resolveLayoutDragPositionUpdate('floating', {
995
+ x: 4,
996
+ y: 8
997
+ }, clamp, {
998
+ innerWidth: 1000,
999
+ panelWidth: 400,
1000
+ pad: 16
1001
+ })).toEqual({
1002
+ x: 4,
1003
+ y: 8
1004
+ });
1005
+ expect(resolveLayoutDragPositionUpdate('floating', null, clamp, {
1006
+ innerWidth: 1000,
1007
+ panelWidth: 400,
1008
+ pad: 16
1009
+ })).toEqual({
1010
+ x: 584,
1011
+ y: 16
1012
+ });
1013
+ expect(resolveLayoutDragPositionUpdate('sidebar', null, clamp, {
1014
+ innerWidth: 0,
1015
+ panelWidth: 0,
1016
+ pad: 0
1017
+ })).toBeNull();
1018
+ expect(resolvePersistedDragPositionOnEnd('floating', {})).toBe(true);
1019
+ expect(resolvePersistedDragPositionOnEnd('sidebar', {})).toBe(false);
1020
+ });
1021
+ it('builds initial chat message payload from start chat args', function () {
1022
+ expect(buildUserInitialMessageFromStartChat({
1023
+ message: 'hola',
1024
+ faqId: 'f1'
1025
+ })).toMatchObject({
1026
+ message: 'hola',
1027
+ faqId: 'f1',
1028
+ attachments: []
1029
+ });
1030
+ expect(buildUserInitialMessageFromStartChat({
1031
+ attachments: [{
1032
+ id: '1'
1033
+ }],
1034
+ agentSuggestionId: 's1',
1035
+ mentions: [{
1036
+ id: 'm1'
1037
+ }],
1038
+ fuaId: 'fua',
1039
+ scId: 'sc',
1040
+ contextData: {
1041
+ taskId: 1
1042
+ }
1043
+ })).toMatchObject({
1044
+ message: '',
1045
+ attachments: [{
1046
+ id: '1'
1047
+ }],
1048
+ agentSuggestionId: 's1',
1049
+ mentions: [{
1050
+ id: 'm1'
1051
+ }],
1052
+ fuaId: 'fua',
1053
+ scId: 'sc',
1054
+ contextData: {
1055
+ taskId: 1
1056
+ }
1057
+ });
1058
+ expect(shouldResetSidebarErrorOnStartChat(true)).toBe(true);
1059
+ });
1060
+ it('supports go-home and send routing guards', function () {
1061
+ var _findOrchestratorAgen;
1062
+ expect(shouldClearClientOnGoHomeFromChat('client')).toBe(false);
1063
+ expect(shouldResetAgentToFirstOnGoHome({
1064
+ has_not_access: true
1065
+ }, 2)).toBe(true);
1066
+ expect(shouldResetAgentToFirstOnGoHome(null, 2)).toBe(true);
1067
+ expect(shouldResetAgentToFirstOnGoHome({
1068
+ is_deleted: true
1069
+ }, 1)).toBe(true);
1070
+ expect(shouldResetAgentToFirstOnGoHome({
1071
+ has_not_access: true
1072
+ }, 0)).toBe(false);
1073
+ expect(shouldUseActiveChatSendHandler(options.chat, options.chat, true)).toBe(true);
1074
+ expect(canOpenMaiaMarketplace(false)).toBe(false);
1075
+ expect((_findOrchestratorAgen = findOrchestratorAgent([agent('2'), orchestratorAgent])) === null || _findOrchestratorAgen === void 0 ? void 0 : _findOrchestratorAgen.type).toBe('orchestrator');
1076
+ expect(shouldMarkAgentAsLegacyContext({}, {
1077
+ id: '1'
1078
+ })).toBe(true);
1079
+ expect(shouldMarkAgentAsLegacyContext({}, {
1080
+ id: '1',
1081
+ is_legacy_context: true
1082
+ })).toBe(false);
1083
+ expect(buildLegacyContextAgent({
1084
+ id: '1',
1085
+ name: 'A',
1086
+ type: 'custom'
1087
+ }).is_legacy_context).toBe(true);
1088
+ });
1089
+ });
1090
+ describe('mount, banner and agents loading helpers', function () {
1091
+ it('controls chat visibility and last active chat persistence', function () {
1092
+ expect(shouldSetChatViewHiddenOnMount(false)).toBe(true);
1093
+ expect(shouldSetChatViewHiddenOnMount(true)).toBe(false);
1094
+ expect(shouldPersistLastActiveChatId('chat-1')).toBe(true);
1095
+ expect(shouldPersistLastActiveChatId(null)).toBe(false);
1096
+ expect(shouldSyncPanelSessionOnPageHide(false)).toBe(true);
1097
+ expect(shouldSyncPanelSessionOnPageHide(true)).toBe(false);
1098
+ });
1099
+ it('detects banner FAQ titles', function () {
1100
+ expect(hasBannerFaqTitle(' ')).toBe(false);
1101
+ expect(hasBannerFaqTitle('Pregunta')).toBe(true);
1102
+ });
1103
+ it('resolves cached agents and initial fetch attempts', function () {
1104
+ expect(resolveCachedAgentsIfAvailable([agent('1')])).toEqual([agent('1')]);
1105
+ expect(resolveCachedAgentsIfAvailable([])).toBeNull();
1106
+ expect(shouldAttemptInitialAgentsFetch(0, false)).toBe(true);
1107
+ expect(shouldAttemptInitialAgentsFetch(0, true)).toBe(false);
1108
+ expect(shouldAttemptInitialAgentsFetch(2, false)).toBe(false);
1109
+ });
1110
+ it('finds agents for chat items with numeric ids', function () {
1111
+ var _findAgentForChatItem;
1112
+ expect((_findAgentForChatItem = findAgentForChatItem([_objectSpread(_objectSpread({}, agent('7')), {}, {
1113
+ id: '7'
1114
+ })], 7)) === null || _findAgentForChatItem === void 0 ? void 0 : _findAgentForChatItem.id).toBe('7');
1115
+ expect(findAgentForChatItem([agent('1')], 99)).toBeUndefined();
1116
+ });
1117
+ });
1118
+ describe('host takeover and navigation guards', function () {
1119
+ it('applies client updates only when defined', function () {
1120
+ expect(shouldApplyClientOnHostTakeover(undefined)).toBe(false);
1121
+ expect(shouldApplyClientOnHostTakeover(null)).toBe(true);
1122
+ expect(shouldApplyClientOnHostTakeover({
1123
+ id: 1,
1124
+ name: 'Acme'
1125
+ })).toBe(true);
1126
+ });
1127
+ it('selects first agent on global host takeover', function () {
1128
+ expect(shouldSelectFirstAgentOnHostTakeover(true, agent('1'))).toBe(true);
1129
+ expect(shouldSelectFirstAgentOnHostTakeover(false, agent('1'))).toBe(false);
1130
+ expect(shouldSelectFirstAgentOnHostTakeover(true, undefined)).toBe(false);
1131
+ });
1132
+ it('covers go-home, catalog and skill agent guards', function () {
1133
+ expect(shouldResetChatStateOnGoHome(options.chat, options.chat)).toBe(true);
1134
+ expect(shouldResetChatStateOnGoHome(options.home, options.chat)).toBe(false);
1135
+ expect(shouldClearContextForCatalogOrSkillAgent(agent('1'))).toBe(true);
1136
+ expect(shouldClearContextForCatalogOrSkillAgent(undefined)).toBe(false);
1137
+ expect(shouldClearTaskOnGoHomeFromChat('task')).toBe(false);
1138
+ expect(shouldClearTaskOnGoHomeFromChat('header')).toBe(true);
1139
+ expect(shouldClearOrchestratorGlobalContextOnGoHome('header', 'orchestrator')).toBe(true);
1140
+ expect(shouldClearOrchestratorGlobalContextOnGoHome('project', 'orchestrator')).toBe(false);
1141
+ expect(shouldPrefetchAgentsForCatalogNewChat(options.myAgents, options.myAgents, options.mySkills)).toBe(true);
1142
+ expect(shouldPrefetchAgentsForCatalogNewChat(options.home, options.myAgents, options.mySkills)).toBe(false);
1143
+ });
1144
+ it('resolves open-new-chat-with-agent context patches', function () {
1145
+ expect(resolveOpenNewChatWithAgentContext({
1146
+ project: {
1147
+ id: 1,
1148
+ name: 'P'
1149
+ }
1150
+ })).toMatchObject({
1151
+ project: {
1152
+ id: 1,
1153
+ name: 'P'
1154
+ },
1155
+ shouldSetTask: false
1156
+ });
1157
+ expect(resolveOpenNewChatWithAgentContext({
1158
+ task: {
1159
+ id: 2,
1160
+ name: 'T'
1161
+ }
1162
+ }).shouldSetTask).toBe(true);
1163
+ });
1164
+ it('validates legacy context continuation', function () {
1165
+ expect(canContinueLegacyContextInNewChat({
1166
+ agentEntity: 'task'
1167
+ }, orchestratorAgent)).toBe(true);
1168
+ expect(canContinueLegacyContextInNewChat(null, orchestratorAgent)).toBe(false);
1169
+ });
1170
+ });
1171
+ describe('session restore routing', function () {
1172
+ it('maps snapshot nav routes', function () {
1173
+ expect(resolveSessionRestoreNavRoute({
1174
+ agentsNavActive: 'myAgents'
1175
+ })).toBe('myAgents');
1176
+ expect(resolveSessionRestoreNavRoute({
1177
+ agentsNavActive: 'mySkills'
1178
+ })).toBe('mySkills');
1179
+ expect(resolveSessionRestoreNavRoute({
1180
+ agentsNavActive: 'maiaker'
1181
+ })).toBe('maiaker');
1182
+ expect(resolveSessionRestoreNavRoute({
1183
+ currentOption: 'chat',
1184
+ activeChatId: 's-1'
1185
+ })).toBe('chat');
1186
+ expect(resolveSessionRestoreNavRoute({
1187
+ currentOption: 'home'
1188
+ })).toBe('savedOption');
1189
+ expect(resolveSessionRestoreNavRoute({
1190
+ currentOption: 'invalid'
1191
+ })).toBe('none');
1192
+ });
1193
+ it('controls agents load branches during restore', function () {
1194
+ expect(shouldSkipAgentsLoadOnSessionRestore('mySkills')).toBe(true);
1195
+ expect(shouldSkipAgentsLoadOnSessionRestore('myAgents')).toBe(false);
1196
+ expect(shouldFetchAgentDetailOnSessionRestore('a1', 'maiaker')).toBe(true);
1197
+ expect(shouldFetchAgentDetailOnSessionRestore('a1', 'myAgents')).toBe(false);
1198
+ expect(shouldPassAgentToGetAgentsOnRestore('myAgents')).toBe(false);
1199
+ expect(shouldPassAgentToGetAgentsOnRestore('maiaker')).toBe(true);
1200
+ expect(shouldSelectFetchedAgentAfterRestore(agent('1'), 'maiaker')).toBe(true);
1201
+ expect(shouldSelectFetchedAgentAfterRestore(agent('1'), 'myAgents')).toBe(false);
1202
+ });
1203
+ it('restores chips project from snapshot host context', function () {
1204
+ var _resolveSnapshotChips;
1205
+ expect((_resolveSnapshotChips = resolveSnapshotChipsProject({
1206
+ chipsProject: {
1207
+ projectId: '9',
1208
+ projectName: 'P',
1209
+ clientName: 'C'
1210
+ }
1211
+ })) === null || _resolveSnapshotChips === void 0 ? void 0 : _resolveSnapshotChips.projectId).toBe('9');
1212
+ expect(resolveSnapshotChipsProject(null)).toBeNull();
1213
+ });
1214
+ });
1215
+ describe('layout and modal visibility helpers', function () {
1216
+ it('resolves section flags and sidebar visibility', function () {
1217
+ expect(resolveChatModalSectionFlags(options.chat, false)).toMatchObject({
1218
+ showNewChat: false,
1219
+ isMyAgentsSection: false
1220
+ });
1221
+ expect(resolveChatModalSectionFlags(options.home, true)).toMatchObject({
1222
+ isMaiakerCreatorHome: true
1223
+ });
1224
+ expect(shouldRenderChatSidebar(true, false)).toBe(true);
1225
+ expect(shouldRenderChatSidebar(true, true)).toBe(false);
1226
+ });
1227
+ it('resolves main content view and footer visibility', function () {
1228
+ expect(resolveChatModalMainContentView(true, true)).toBe('error');
1229
+ expect(resolveChatModalMainContentView(false, true)).toBe('chat');
1230
+ expect(resolveChatModalMainContentView(false, false)).toBe('projectSummary');
1231
+ expect(shouldShowChatModalFooter({
1232
+ computedCurrentOption: options.chat,
1233
+ homeOption: options.home,
1234
+ chatOption: options.chat,
1235
+ agentsCount: 0,
1236
+ isMaiakerCreatorHome: false,
1237
+ hasError: false,
1238
+ loading: false,
1239
+ hasAccess: true
1240
+ })).toBe(true);
1241
+ expect(shouldShowChatModalFooter({
1242
+ computedCurrentOption: options.home,
1243
+ homeOption: options.home,
1244
+ chatOption: options.chat,
1245
+ agentsCount: 0,
1246
+ isMaiakerCreatorHome: false,
1247
+ hasError: false,
1248
+ loading: false,
1249
+ hasAccess: true
1250
+ })).toBe(false);
1251
+ expect(shouldShowChatModalFooter({
1252
+ computedCurrentOption: options.home,
1253
+ homeOption: options.home,
1254
+ chatOption: options.chat,
1255
+ agentsCount: 2,
1256
+ isMaiakerCreatorHome: false,
1257
+ hasError: false,
1258
+ loading: false,
1259
+ hasAccess: true
1260
+ })).toBe(true);
1261
+ });
1262
+ it('covers floating drag and elevated panel branches', function () {
1263
+ expect(shouldClearDragPositionOnLayoutChange('sidebar')).toBe(true);
1264
+ expect(shouldClearDragPositionOnLayoutChange('floating')).toBe(false);
1265
+ expect(shouldPersistDragPositionOnDragEnd('floating')).toBe(true);
1266
+ expect(shouldStartFloatingPanelDrag(true, 0)).toBe(true);
1267
+ expect(shouldStartFloatingPanelDrag(true, 1)).toBe(false);
1268
+ expect(isActiveFloatingDragPointer(1, 1)).toBe(true);
1269
+ expect(isActiveFloatingDragPointer(1, 2)).toBe(false);
1270
+ expect(shouldUseElevatedMaiaPanel('task')).toBe(true);
1271
+ expect(isGlobalMaiaSection('header')).toBe(true);
1272
+ });
1273
+ it('covers delete agent and skills catalog guards', function () {
1274
+ expect(shouldReselectAgentAfterDelete('a1', 'a1')).toBe(true);
1275
+ expect(shouldReselectAgentAfterDelete('a1', 'a2')).toBe(false);
1276
+ expect(shouldOpenSkillsCatalog(true)).toBe(true);
1277
+ expect(shouldOpenSkillsCatalog(false)).toBe(false);
1278
+ });
1279
+ it('hides the footer on maiaker home, errors, loading or missing access', function () {
1280
+ var base = {
1281
+ computedCurrentOption: options.chat,
1282
+ homeOption: options.home,
1283
+ chatOption: options.chat,
1284
+ agentsCount: 0,
1285
+ isMaiakerCreatorHome: false,
1286
+ hasError: false,
1287
+ loading: false,
1288
+ hasAccess: true
1289
+ };
1290
+ expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1291
+ isMaiakerCreatorHome: true
1292
+ }))).toBe(false);
1293
+ expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1294
+ hasError: true
1295
+ }))).toBe(false);
1296
+ expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1297
+ loading: true
1298
+ }))).toBe(false);
1299
+ expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1300
+ hasAccess: false
1301
+ }))).toBe(false);
1302
+ });
1303
+ it('builds start-chat payloads and drag position updates', function () {
1304
+ expect(buildUserInitialMessageFromStartChat({
1305
+ message: 'Hola',
1306
+ attachments: [{
1307
+ id: '1'
1308
+ }],
1309
+ faqId: 'faq-1',
1310
+ agentSuggestionId: 'sug-1',
1311
+ mentions: [{
1312
+ id: 'm1'
1313
+ }],
1314
+ fuaId: 'fua-1',
1315
+ scId: 'sc-1',
1316
+ contextData: {
1317
+ projectId: 1
1318
+ }
1319
+ })).toMatchObject({
1320
+ message: 'Hola',
1321
+ faqId: 'faq-1',
1322
+ agentSuggestionId: 'sug-1',
1323
+ mentions: [{
1324
+ id: 'm1'
1325
+ }],
1326
+ fuaId: 'fua-1',
1327
+ scId: 'sc-1',
1328
+ contextData: {
1329
+ projectId: 1
1330
+ }
1331
+ });
1332
+ expect(resolveLayoutDragPositionUpdate('sidebar', {
1333
+ x: 1,
1334
+ y: 2
1335
+ }, function (x, y) {
1336
+ return {
1337
+ x: x,
1338
+ y: y
1339
+ };
1340
+ }, {
1341
+ innerWidth: 1000,
1342
+ panelWidth: 400,
1343
+ pad: 16
1344
+ })).toBeNull();
1345
+ expect(resolveLayoutDragPositionUpdate('floating', null, function (x, y) {
1346
+ return {
1347
+ x: x,
1348
+ y: y
1349
+ };
1350
+ }, {
1351
+ innerWidth: 1000,
1352
+ panelWidth: 400,
1353
+ pad: 16
1354
+ })).toEqual({
1355
+ x: 584,
1356
+ y: 16
1357
+ });
1358
+ expect(resolvePersistedDragPositionOnEnd('floating', document.createElement('div'))).toBe(true);
1359
+ expect(resolvePersistedDragPositionOnEnd('sidebar', document.createElement('div'))).toBe(false);
1360
+ });
1361
+ });
1362
+ describe('dispatchSkillMentionInsert', function () {
1363
+ it('dispatches the skill mention after two animation frames', function () {
1364
+ jest.useFakeTimers();
1365
+ var raf = jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (callback) {
1366
+ return window.setTimeout(function () {
1367
+ return callback(0);
1368
+ }, 0);
1369
+ });
1370
+ var onInsert = jest.fn();
1371
+ var onRefocus = jest.fn();
1372
+ document.addEventListener('maia-insert-skill-mention', onInsert);
1373
+ document.addEventListener('maia-input-refocus', onRefocus);
1374
+ dispatchSkillMentionInsert({
1375
+ id: 'sk1',
1376
+ name: 'Resumir'
1377
+ });
1378
+ expect(onInsert).not.toHaveBeenCalled();
1379
+ jest.runAllTimers();
1380
+ expect(onInsert).toHaveBeenCalledTimes(1);
1381
+ expect(onRefocus).toHaveBeenCalledTimes(1);
1382
+ var event = onInsert.mock.calls[0][0];
1383
+ expect(event.detail.skill).toEqual({
1384
+ id: 'sk1',
1385
+ name: 'Resumir'
1386
+ });
1387
+ document.removeEventListener('maia-insert-skill-mention', onInsert);
1388
+ document.removeEventListener('maia-input-refocus', onRefocus);
1389
+ raf.mockRestore();
1390
+ jest.useRealTimers();
1391
+ });
1392
+ });
1393
+ });
1394
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JVc2VyUm9sZSIsIm9wdGlvbnMiLCJjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbiIsImRpc3BhdGNoU2tpbGxNZW50aW9uSW5zZXJ0IiwiZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2UiLCJnZXRNYWlhSG9zdFBhbmVsUHJlc2VudGF0aW9uIiwiaGFzQW55QWN0aXZlU2Vzc2lvbkluTWV0YSIsImlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kIiwiaXNMZWdhY3lDb250ZXh0RW50aXR5IiwicmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbiIsInJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24iLCJyZXNvbHZlRGVmYXVsdEZsb2F0aW5nUGFuZWxQb3NpdGlvbiIsInJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbiIsInJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbiIsInJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlIiwic2hvdWxkUmVzdG9yZUV4cGFuZGVkUGFuZWwiLCJzaG91bGRTa2lwRmxvYXRpbmdEcmFnVGFyZ2V0IiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUiLCJidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0IiwiYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2giLCJyZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbiIsInJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkIiwicmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nIiwicmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQiLCJyZXNvbHZlTmV4dERyYWdQb3NpdGlvbiIsInJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMiLCJzaG91bGRCYWNrQ2xlYXJQaW5uZWRDb250ZXh0Iiwic2hvdWxkQmFja1N0YXJ0TmV3Q2hhdFByZXNlcnZpbmdDb250ZXh0Iiwic2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCIsInNob3VsZFN0YXJ0TmV3Q2hhdEZyb21DYXRhbG9nIiwicmVzb2x2ZUhhc1Bpbm5lZENvbnRleHQiLCJyZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzIiwic2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24iLCJzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lIiwic2hvdWxkVXNlQWN0aXZlQ2hhdFNlbmRIYW5kbGVyIiwiYnVpbGRMZWdhY3lDb250ZXh0TWlncmF0aW9uUGF0Y2giLCJmaW5kT3JjaGVzdHJhdG9yQWdlbnQiLCJidWlsZExlZ2FjeUNvbnRleHRBZ2VudCIsInNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dCIsImNhbk9wZW5NYWlhTWFya2V0cGxhY2UiLCJzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQiLCJzaG91bGRQZXJzaXN0TGFzdEFjdGl2ZUNoYXRJZCIsImhhc0Jhbm5lckZhcVRpdGxlIiwic2hvdWxkU3luY1BhbmVsU2Vzc2lvbk9uUGFnZUhpZGUiLCJyZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUiLCJzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoIiwiZmluZEFnZW50Rm9yQ2hhdEl0ZW0iLCJzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyIiwic2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyIiwic2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZSIsInNob3VsZENsZWFyQ29udGV4dEZvckNhdGFsb2dPclNraWxsQWdlbnQiLCJyZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0IiwiY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0IiwicmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUiLCJzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUiLCJzaG91bGRGZXRjaEFnZW50RGV0YWlsT25TZXNzaW9uUmVzdG9yZSIsInNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlIiwic2hvdWxkU2VsZWN0RmV0Y2hlZEFnZW50QWZ0ZXJSZXN0b3JlIiwicmVzb2x2ZVNuYXBzaG90Q2hpcHNQcm9qZWN0IiwicmVzb2x2ZUNoYXRNb2RhbFNlY3Rpb25GbGFncyIsInNob3VsZFJlbmRlckNoYXRTaWRlYmFyIiwicmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyIsInNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIiLCJzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCIsInNob3VsZFJlc2VsZWN0QWdlbnRBZnRlckRlbGV0ZSIsInNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UiLCJzaG91bGRQZXJzaXN0RHJhZ1Bvc2l0aW9uT25EcmFnRW5kIiwic2hvdWxkU3RhcnRGbG9hdGluZ1BhbmVsRHJhZyIsImlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlciIsInNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nIiwic2hvdWxkVXNlRHJhZ0NsYW1wRmFsbGJhY2siLCJyZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlIiwicmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kIiwiYnVpbGRVc2VySW5pdGlhbE1lc3NhZ2VGcm9tU3RhcnRDaGF0Iiwic2hvdWxkUmVzZXRTaWRlYmFyRXJyb3JPblN0YXJ0Q2hhdCIsInNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZSIsInNob3VsZFByZWZldGNoQWdlbnRzRm9yQ2F0YWxvZ05ld0NoYXQiLCJpc0dsb2JhbE1haWFTZWN0aW9uIiwiYmFzZVVzZXIiLCJpZCIsImNvbXBhbnlfaWQiLCJyb2xlX2lkIiwiUFJPSkVDVF9NQU5BR0VSIiwib3JjaGVzdHJhdG9yQWdlbnQiLCJuYW1lIiwidHlwZSIsImVudGl0eSIsImFnZW50IiwiY29uY2F0IiwiZGVzY3JpYmUiLCJvcmlnaW5hbENoYXRBY2Nlc3MiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJvcmlnaW5hbE11bHRpQWdlbnRzIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIm9yaWdpbmFsU2tpbGxzQWNjZXNzIiwiTUFJQV9TS0lMTFNfQUNDRVNTIiwib3JpZ2luYWxQcm9qZWN0U3VtbWFyeSIsIk1BSUFfUFJPSkVDVF9TVU1NQVJZX0ZFQVRVUkVfQUNDRVNTIiwiYWZ0ZXJFYWNoIiwiaXQiLCJleHBlY3QiLCJob21lIiwidG9CZSIsImNoYXQiLCJfb2JqZWN0U3ByZWFkIiwiQ0xJRU5UIiwiY3VycmVudE9wdGlvbiIsIm15QWdlbnRzIiwicHJvamVjdCIsImNsaWVudCIsInVzZXIiLCJtdWx0aUFnZW50c0FjY2VzcyIsIm15U2tpbGxzIiwiZ2xvYmFsQ2xvbmUiLCJwcm9qZWN0QWdlbnQiLCJjbGllbnRBZ2VudCIsIm9yY2hlc3RyYXRvckdsb2JhbCIsInByb2plY3RTZWxlY3RvciIsImNsaWVudFNlbGVjdG9yIiwidG9CZU51bGwiLCJ0b0VxdWFsIiwieCIsInkiLCJhZ2VudFR5cGUiLCJhZ2VudEVudGl0eSIsInByb2plY3ROYW1lIiwiZW50aXR5VHlwZSIsImNvbnRleHROYW1lIiwidGFza05hbWUiLCJjbGllbnROYW1lIiwiYSIsInN0YXR1cyIsImIiLCJpc0V4cGFuZGVkIiwidW5kZWZpbmVkIiwiYnV0dG9uIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZmFxVGl0bGUiLCJhbHJlYWR5U2VudCIsImxvYWRpbmciLCJhZ2VudElkIiwic2VjdGlvbiIsInByb2plY3RJZCIsImNsaWVudElkIiwiaGlkZVBhbmVsQ29udGVudCIsInNob3dNaW5pbWl6ZWRQaWxsIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJlbnN1cmVBZ2VudHNMb2FkZWQiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImplc3QiLCJmbiIsIm1vY2tSZXNvbHZlZFZhbHVlIiwidXNlRmlyc3RBZ2VudCIsImFnZW50cyIsInJlc29sdmVzIiwidG9CZVVuZGVmaW5lZCIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJzdG9wIiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJfY2FsbGVlMyIsIl9jb250ZXh0MyIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIl9jYWxsZWU0IiwiX2NvbnRleHQ0IiwidGFzayIsInRvTWF0Y2hPYmplY3QiLCJjbGVhckdsb2JhbFBpbm5lZENvbnRleHQiLCJjaGlwc1Byb2plY3QiLCJhaV9hZ2VudHMiLCJjcmVhdGUiLCJlZGl0IiwiX3Jlc29sdmVNaW5pbWl6ZWRSZXN0IiwiX3Jlc29sdmVNaW5pbWl6ZWRSZXN0MiIsImNoYXRzIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJpc1JlYWQiLCJpc01pbmltaXplZCIsImFnZW50c05hdkFjdGl2ZSIsImFjdGl2ZUNoYXRJZCIsInNpZGViYXJPcGVuIiwibGF5b3V0TW9kZSIsImRyYWdQb3NpdGlvbiIsImhvc3RDb250ZXh0IiwiY2xhbXAiLCJ2aWV3cG9ydFdpZHRoIiwicGFuZWxXaWR0aCIsInRhc2tJZCIsImZsYWdzIiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwiaG9tZU9wdGlvbiIsImNoYXRPcHRpb24iLCJoYXNQaW5uZWRDb250ZXh0IiwiZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uIiwiaXNDaGF0VmlldyIsImhhc0Vycm9yIiwic2VjdGlvblJlc2V0RmxhZ3MiLCJpc1NlY3Rpb25SZXNldEhvbWVTdGVwMiIsImlzSGVhZGVySG9tZVN0ZXAyIiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pIiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pMiIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTMiLCJfYnVpbGRMZWdhY3lDb250ZXh0TWk0IiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pNSIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTYiLCJfYnVpbGRMZWdhY3lDb250ZXh0TWk3IiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pOCIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTkiLCJ0b0hhdmVQcm9wZXJ0eSIsImlubmVyV2lkdGgiLCJwYWQiLCJtZXNzYWdlIiwiZmFxSWQiLCJhdHRhY2htZW50cyIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJjb250ZXh0RGF0YSIsIl9maW5kT3JjaGVzdHJhdG9yQWdlbiIsImhhc19ub3RfYWNjZXNzIiwiaXNfZGVsZXRlZCIsImlzX2xlZ2FjeV9jb250ZXh0IiwiX2ZpbmRBZ2VudEZvckNoYXRJdGVtIiwic2hvdWxkU2V0VGFzayIsIl9yZXNvbHZlU25hcHNob3RDaGlwcyIsInNob3dOZXdDaGF0IiwiaXNNeUFnZW50c1NlY3Rpb24iLCJpc01haWFrZXJDcmVhdG9ySG9tZSIsImFnZW50c0NvdW50IiwiaGFzQWNjZXNzIiwiYmFzZSIsInVzZUZha2VUaW1lcnMiLCJyYWYiLCJzcHlPbiIsIm1vY2tJbXBsZW1lbnRhdGlvbiIsImNhbGxiYWNrIiwic2V0VGltZW91dCIsIm9uSW5zZXJ0Iiwib25SZWZvY3VzIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJ1bkFsbFRpbWVycyIsImV2ZW50IiwibW9jayIsImNhbGxzIiwiZGV0YWlsIiwic2tpbGwiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibW9ja1Jlc3RvcmUiLCJ1c2VSZWFsVGltZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1vZGFsL0NoYXRBSU1vZGFsLmhlbHBlcnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT1JVc2VyUm9sZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQge1xuICBjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgZGlzcGF0Y2hTa2lsbE1lbnRpb25JbnNlcnQsXG4gIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlLFxuICBnZXRNYWlhSG9zdFBhbmVsUHJlc2VudGF0aW9uLFxuICBoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhLFxuICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCxcbiAgaXNMZWdhY3lDb250ZXh0RW50aXR5LFxuICByZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uLFxuICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlRGVmYXVsdEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgcmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24sXG4gIHJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlLFxuICBzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCxcbiAgc2hvdWxkU2tpcEZsb2F0aW5nRHJhZ1RhcmdldCxcbiAgdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUsXG4gIHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSxcbiAgYnVpbGRIb3N0VGFrZW92ZXJQZXJzaXN0Q29udGV4dCxcbiAgYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2gsXG4gIHJlc29sdmVGbG9hdGluZ1BhbmVsRHJhZ1Bvc2l0aW9uLFxuICByZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZCxcbiAgcmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nLFxuICByZXNvbHZlTWluaW1pemVkUmVzdG9yZVRhcmdldCxcbiAgcmVzb2x2ZU5leHREcmFnUG9zaXRpb24sXG4gIHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMsXG4gIHNob3VsZEJhY2tDbGVhclBpbm5lZENvbnRleHQsXG4gIHNob3VsZEJhY2tTdGFydE5ld0NoYXRQcmVzZXJ2aW5nQ29udGV4dCxcbiAgc2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCxcbiAgc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2csXG4gIHJlc29sdmVIYXNQaW5uZWRDb250ZXh0LFxuICByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzLFxuICBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbixcbiAgc2hvdWxkQ2xlYXJDbGllbnRPbkdvSG9tZUZyb21DaGF0LFxuICBzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lLFxuICBzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIsXG4gIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoLFxuICBmaW5kT3JjaGVzdHJhdG9yQWdlbnQsXG4gIGJ1aWxkTGVnYWN5Q29udGV4dEFnZW50LFxuICBzaG91bGRNYXJrQWdlbnRBc0xlZ2FjeUNvbnRleHQsXG4gIGNhbk9wZW5NYWlhTWFya2V0cGxhY2UsXG4gIHNob3VsZFNldENoYXRWaWV3SGlkZGVuT25Nb3VudCxcbiAgc2hvdWxkUGVyc2lzdExhc3RBY3RpdmVDaGF0SWQsXG4gIGhhc0Jhbm5lckZhcVRpdGxlLFxuICBzaG91bGRTeW5jUGFuZWxTZXNzaW9uT25QYWdlSGlkZSxcbiAgcmVzb2x2ZUNhY2hlZEFnZW50c0lmQXZhaWxhYmxlLFxuICBzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoLFxuICBmaW5kQWdlbnRGb3JDaGF0SXRlbSxcbiAgc2hvdWxkQXBwbHlDbGllbnRPbkhvc3RUYWtlb3ZlcixcbiAgc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyLFxuICBzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lLFxuICBzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50LFxuICByZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0LFxuICBjYW5Db250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQsXG4gIHJlc29sdmVTZXNzaW9uUmVzdG9yZU5hdlJvdXRlLFxuICBzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUsXG4gIHNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlLFxuICBzaG91bGRQYXNzQWdlbnRUb0dldEFnZW50c09uUmVzdG9yZSxcbiAgc2hvdWxkU2VsZWN0RmV0Y2hlZEFnZW50QWZ0ZXJSZXN0b3JlLFxuICByZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QsXG4gIHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3MsXG4gIHNob3VsZFJlbmRlckNoYXRTaWRlYmFyLFxuICByZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3LFxuICBzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyLFxuICBzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCxcbiAgc2hvdWxkUmVzZWxlY3RBZ2VudEFmdGVyRGVsZXRlLFxuICBzaG91bGRDbGVhckRyYWdQb3NpdGlvbk9uTGF5b3V0Q2hhbmdlLFxuICBzaG91bGRQZXJzaXN0RHJhZ1Bvc2l0aW9uT25EcmFnRW5kLFxuICBzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnLFxuICBpc0FjdGl2ZUZsb2F0aW5nRHJhZ1BvaW50ZXIsXG4gIHNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nLFxuICBzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayxcbiAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSxcbiAgcmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kLFxuICBidWlsZFVzZXJJbml0aWFsTWVzc2FnZUZyb21TdGFydENoYXQsXG4gIHNob3VsZFJlc2V0U2lkZWJhckVycm9yT25TdGFydENoYXQsXG4gIHNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQsXG4gIHNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lLFxuICBzaG91bGRQcmVmZXRjaEFnZW50c0ZvckNhdGFsb2dOZXdDaGF0LFxuICBpc0dsb2JhbE1haWFTZWN0aW9uLFxufSBmcm9tICcuL0NoYXRBSU1vZGFsLmhlbHBlcnMnXG5cbmNvbnN0IGJhc2VVc2VyID0ge1xuICBpZDogMSxcbiAgY29tcGFueV9pZDogMTAsXG4gIHJvbGVfaWQ6IENPUlVzZXJSb2xlLlBST0pFQ1RfTUFOQUdFUixcbn1cblxuY29uc3Qgb3JjaGVzdHJhdG9yQWdlbnQ6IEFnZW50ID0ge1xuICBpZDogJzEnLFxuICBuYW1lOiAnTUFJQScsXG4gIHR5cGU6ICdvcmNoZXN0cmF0b3InLFxuICBlbnRpdHk6ICdnbG9iYWwnLFxufVxuXG5jb25zdCBhZ2VudCA9IChpZDogc3RyaW5nKTogQWdlbnQgPT5cbiAgKHtcbiAgICBpZCxcbiAgICBuYW1lOiBgQWdlbnQgJHtpZH1gLFxuICAgIHR5cGU6ICdjdXN0b20nLFxuICB9KSBhcyBBZ2VudFxuXG5kZXNjcmliZSgnQ2hhdEFJTW9kYWwuaGVscGVycycsICgpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxDaGF0QWNjZXNzID0gd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU1xuICBjb25zdCBvcmlnaW5hbE11bHRpQWdlbnRzID0gd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcbiAgY29uc3Qgb3JpZ2luYWxTa2lsbHNBY2Nlc3MgPSB3aW5kb3cuTUFJQV9TS0lMTFNfQUNDRVNTXG4gIGNvbnN0IG9yaWdpbmFsUHJvamVjdFN1bW1hcnkgPSB3aW5kb3cuTUFJQV9QUk9KRUNUX1NVTU1BUllfRkVBVFVSRV9BQ0NFU1NcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSBvcmlnaW5hbENoYXRBY2Nlc3NcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IG9yaWdpbmFsTXVsdGlBZ2VudHNcbiAgICB3aW5kb3cuTUFJQV9TS0lMTFNfQUNDRVNTID0gb3JpZ2luYWxTa2lsbHNBY2Nlc3NcbiAgICB3aW5kb3cuTUFJQV9QUk9KRUNUX1NVTU1BUllfRkVBVFVSRV9BQ0NFU1MgPSBvcmlnaW5hbFByb2plY3RTdW1tYXJ5XG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgZ2xvYmFsIGhvbWUgZm9yIG9yY2hlc3RyYXRvciBvbiBoZWFkZXIgaG9tZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJywgb3B0aW9ucy5ob21lLCBvcHRpb25zLmhvbWUpKS50b0JlKFxuICAgICAgICAnZ2xvYmFsX2NvbnRleHRfaG9tZSdcbiAgICAgIClcbiAgICB9KVxuXG4gICAgaXQoJ21hcHMgc2VjdGlvbi1zcGVjaWZpYyBob21lcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCd0YXNrJywgJ29yY2hlc3RyYXRvcicsIG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5ob21lKSkudG9CZSgndGFza19ob21lJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCdwbGFubmVyJywgJ2Nsb25lJywgb3B0aW9ucy5jaGF0LCBvcHRpb25zLmhvbWUpKS50b0JlKCdwbGFubmVyX2hvbWUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24oJ3Byb2plY3QnLCAnY2xvbmUnLCBvcHRpb25zLmNoYXQsIG9wdGlvbnMuaG9tZSkpLnRvQmUoJ3Byb2plY3RfaG9tZScpXG4gICAgICBleHBlY3QocmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbignY2xpZW50JywgJ2Nsb25lJywgb3B0aW9ucy5jaGF0LCBvcHRpb25zLmhvbWUpKS50b0JlKCdjbGllbnRfaG9tZScpXG4gICAgfSlcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGdsb2JhbCBob21lIGZvciB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbignaGVhZGVyJywgJ2N1c3RvbScsIG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0KSkudG9CZSgnZ2xvYmFsX2NvbnRleHRfaG9tZScpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUnLCAoKSA9PiB7XG4gICAgaXQoJ2RlbmllcyBhY2Nlc3Mgd2l0aG91dCBzZWN0aW9uIG9yIGNoYXQgcGVybWlzc2lvbicsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QodmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUobnVsbCwgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdoZWFkZXInLCB7IC4uLmJhc2VVc2VyLCByb2xlX2lkOiBDT1JVc2VyUm9sZS5DTElFTlQgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbGxvd3MgdGFzayBhbmQgcGxhbm5lciB3aGVuIGNoYXQgQUkgaXMgZW5hYmxlZCBmb3IgdGhlIHVzZXInLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX1BST0pFQ1RfU1VNTUFSWV9GRUFUVVJFX0FDQ0VTUyA9IHRydWVcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgndGFzaycsIGJhc2VVc2VyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdwbGFubmVyJywgYmFzZVVzZXIpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXF1aXJlcyBjaGF0IGZsYWdzIGZvciBoZWFkZXIgYW5kIHByb2plY3Qgc2VjdGlvbnMnLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gZmFsc2VcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgnaGVhZGVyJywgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdwcm9qZWN0JywgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuXG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgnaGVhZGVyJywgYmFzZVVzZXIpKS50b0JlKHRydWUpXG5cbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSB0cnVlXG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IGZhbHNlXG4gICAgICBleHBlY3QodmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoJ3Byb2plY3QnLCBiYXNlVXNlcikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdmYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IG9wdGlvbiB3aGVuIG15QWdlbnRzIGlzIHVuYXZhaWxhYmxlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLm15QWdlbnRzLFxuICAgICAgICAgIGFnZW50OiBvcmNoZXN0cmF0b3JBZ2VudCxcbiAgICAgICAgICBwcm9qZWN0OiBudWxsLFxuICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5teUFnZW50cylcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIG15QWdlbnRzIGFuZCBteVNraWxscyB3aGVuIGZlYXR1cmUgYWNjZXNzIGFsbG93cycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMubXlBZ2VudHMsXG4gICAgICAgICAgYWdlbnQ6IG9yY2hlc3RyYXRvckFnZW50LFxuICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICAgIHVzZXI6IGJhc2VVc2VyLFxuICAgICAgICAgIG11bHRpQWdlbnRzQWNjZXNzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMubXlBZ2VudHMpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5teVNraWxscyxcbiAgICAgICAgICBhZ2VudDogb3JjaGVzdHJhdG9yQWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMubXlTa2lsbHMpXG4gICAgfSlcblxuICAgIGl0KCdyZWRpcmVjdHMgbm9uLW9yY2hlc3RyYXRvciBnbG9iYWwgc3BlY2lhbGlzdHMgZnJvbSBob21lIHRvIGNoYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBnbG9iYWxDbG9uZTogQWdlbnQgPSB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICAgIG5hbWU6ICdTYWxlcyBCb3QnLFxuICAgICAgICB0eXBlOiAnY2xvbmUnLFxuICAgICAgICBlbnRpdHk6ICdnbG9iYWwnLFxuICAgICAgfVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBhZ2VudDogZ2xvYmFsQ2xvbmUsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuY2hhdClcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIGNoYXQgb3B0aW9uIHdoZW4gcHJvamVjdCBvciBjbGllbnQgY29udGV4dCBpcyBhbHJlYWR5IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3RBZ2VudDogQWdlbnQgPSB7IGlkOiAnMycsIG5hbWU6ICdQcm9qJywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAncHJvamVjdCcgfVxuICAgICAgY29uc3QgY2xpZW50QWdlbnQ6IEFnZW50ID0geyBpZDogJzQnLCBuYW1lOiAnQ2xpZW50JywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAnY2xpZW50JyB9XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50OiBwcm9qZWN0QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogeyBpZDogMTAsIG5hbWU6ICdBbHBoYScgfSBhcyBuZXZlcixcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuaG9tZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgYWdlbnQ6IGNsaWVudEFnZW50LFxuICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgY2xpZW50OiB7IGlkOiA1LCBuYW1lOiAnQmV0YScgfSBhcyBuZXZlcixcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG5cbiAgICBpdCgnZG9lcyBub3QgcmVkaXJlY3Qgb3JjaGVzdHJhdG9yIGdsb2JhbCBjbG9uZXMgZnJvbSBob21lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3JjaGVzdHJhdG9yR2xvYmFsOiBBZ2VudCA9IHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgbmFtZTogJ01BSUEnLFxuICAgICAgICB0eXBlOiAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgZW50aXR5OiAnZ2xvYmFsJyxcbiAgICAgIH1cblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgYWdlbnQ6IG9yY2hlc3RyYXRvckdsb2JhbCxcbiAgICAgICAgICBwcm9qZWN0OiBudWxsLFxuICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvd3MgcHJvamVjdCBhbmQgY2xpZW50IHNlbGVjdG9ycyB3aGVuIGNvbnRleHQgaXMgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3RBZ2VudDogQWdlbnQgPSB7IGlkOiAnMycsIG5hbWU6ICdQcm9qJywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAncHJvamVjdCcgfVxuICAgICAgY29uc3QgY2xpZW50QWdlbnQ6IEFnZW50ID0geyBpZDogJzQnLCBuYW1lOiAnQ2xpZW50JywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAnY2xpZW50JyB9XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50OiBwcm9qZWN0QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMucHJvamVjdFNlbGVjdG9yKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBhZ2VudDogY2xpZW50QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuY2xpZW50U2VsZWN0b3IpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUnLCAoKSA9PiB7XG4gICAgaXQoJ21hcHMgY29tcHV0ZWQgb3B0aW9ucyBhbmQgbWFpYWtlciBzZWxlY3Rpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5teVNraWxscywgZmFsc2UpKS50b0JlKCdteVNraWxscycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5teUFnZW50cywgZmFsc2UpKS50b0JlKCdteUFnZW50cycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5ob21lLCB0cnVlKSkudG9CZSgnbWFpYWtlcicpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5jaGF0LCBmYWxzZSkpLnRvQmVOdWxsKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Jlc3RvcmVzIHNhdmVkIG5hdiBhbmQgdmFsaWRhdGVzIHNhdmVkIG9wdGlvbicsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QocmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uKCdteUFnZW50cycsIG51bGwsIGJhc2VVc2VyKSkudG9CZShvcHRpb25zLm15QWdlbnRzKVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbignbXlTa2lsbHMnLCBudWxsLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5teVNraWxscylcbiAgICAgIGV4cGVjdChyZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24obnVsbCwgJ2NoYXQnLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5jaGF0KVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbihudWxsLCAnaW52YWxpZCcsIGJhc2VVc2VyKSkudG9CZShvcHRpb25zLmhvbWUpXG4gICAgfSlcblxuICAgIGl0KCdpZ25vcmVzIHNhdmVkIG15U2tpbGxzIHdoZW4gdGhlIHVzZXIgbGFja3Mgc2tpbGxzIGFjY2VzcycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSBmYWxzZVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbignbXlTa2lsbHMnLCBudWxsLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2NsYW1wRmxvYXRpbmdQYW5lbFBvc2l0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdrZWVwcyB0aGUgcGFuZWwgaW5zaWRlIHRoZSB2aWV3cG9ydCB3aXRoIHBhZGRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2xhbXBGbG9hdGluZ1BhbmVsUG9zaXRpb24oMCwgMCwgNDAwLCA2MDAsIDEyMDAsIDgwMCkpLnRvRXF1YWwoeyB4OiAxNiwgeTogMTYgfSlcbiAgICAgIGV4cGVjdChjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbigyMDAwLCAyMDAwLCA0MDAsIDYwMCwgMTIwMCwgODAwKSkudG9FcXVhbCh7IHg6IDc4NCwgeTogMTg0IH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGxlZ2FjeSBjbG9uZSBjb250ZXh0IG9ubHkgb24gY2hhdCB2aWV3JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24ob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQsIHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdjbG9uZScsXG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ0FscGhhJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGVudGl0eVR5cGU6ICdwcm9qZWN0JywgY29udGV4dE5hbWU6ICdBbHBoYScgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24ob3B0aW9ucy5ob21lLCBvcHRpb25zLmNoYXQsIHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdjbG9uZScsXG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ0FscGhhJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnbWFwcyB0YXNrIGFuZCBjbGllbnQgbmFtZXMgYW5kIGlnbm9yZXMgaW52YWxpZCBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uKG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0LCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnY2xvbmUnLFxuICAgICAgICAgIGFnZW50RW50aXR5OiAndGFzaycsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBlbnRpdHlUeXBlOiAndGFzaycsIGNvbnRleHROYW1lOiAnJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCwge1xuICAgICAgICAgIGFnZW50VHlwZTogJ2Nsb25lJyxcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tOYW1lOiAnQnVnZml4JyxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGVudGl0eVR5cGU6ICd0YXNrJywgY29udGV4dE5hbWU6ICdCdWdmaXgnIH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uKG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0LCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnY2xvbmUnLFxuICAgICAgICAgIGFnZW50RW50aXR5OiAnY2xpZW50JyxcbiAgICAgICAgICBjbGllbnROYW1lOiAnQWNtZScsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBlbnRpdHlUeXBlOiAnY2xpZW50JywgY29udGV4dE5hbWU6ICdBY21lJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCwge1xuICAgICAgICAgIGFnZW50VHlwZTogJ2Nsb25lJyxcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ2dsb2JhbCcsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdJZ25vcmVkJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hhc0FueUFjdGl2ZVNlc3Npb25Jbk1ldGEnLCAoKSA9PiB7XG4gICAgaXQoJ2RldGVjdHMgdGhpbmtpbmcsIHdyaXRpbmcgYW5kIGFwcHJvdmFsIHNlc3Npb25zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhKHtcbiAgICAgICAgICBhOiB7IHN0YXR1czogJ3RoaW5raW5nJyB9LFxuICAgICAgICAgIGI6IHsgc3RhdHVzOiAnY29tcGxldGUnIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhKHsgYTogeyBzdGF0dXM6ICdjb21wbGV0ZScgfSB9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdwYW5lbCByZXN0b3JlIGFuZCBmbG9hdGluZyBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdyZXN0b3JlcyBleHBhbmRlZCBwYW5lbHMgZnJvbSBzYXZlZCBzZXNzaW9uIHNuYXBzaG90cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCh7IGlzRXhwYW5kZWQ6IHRydWUgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCh7IGlzRXhwYW5kZWQ6IGZhbHNlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc3RvcmVFeHBhbmRlZFBhbmVsKHVuZGVmaW5lZCkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbmNob3JzIHRoZSBkZWZhdWx0IGZsb2F0aW5nIHBhbmVsIHRvIHRoZSBib3R0b20tcmlnaHQgY29ybmVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVEZWZhdWx0RmxvYXRpbmdQYW5lbFBvc2l0aW9uKDEyMDAsIDQ4MCkpLnRvRXF1YWwoeyB4OiA3MDQsIHk6IDE2IH0pXG4gICAgfSlcblxuICAgIGl0KCdza2lwcyBkcmFnIG9uIGludGVyYWN0aXZlIHRhcmdldHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQoYnV0dG9uKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2lzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kJywgKCkgPT4ge1xuICAgIGl0KCdibG9ja3MgYXV0byBzZW5kIHdoZW4gdGhlIEZBUSBpcyBlbXB0eSBvciBhbHJlYWR5IHNlbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJyAgICcsXG4gICAgICAgICAgYWxyZWFkeVNlbnQ6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGFnZW50SWQ6ICcxJyxcbiAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCh7XG4gICAgICAgICAgZmFxVGl0bGU6ICdQcmVndW50YScsXG4gICAgICAgICAgYWxyZWFkeVNlbnQ6IHRydWUsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnd2FpdHMgZm9yIHByb2plY3QgYW5kIGNsaWVudCBjb250ZXh0IGJlZm9yZSBhdXRvIHNlbmRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1Jlc3Vtw60gZWwgcHJveWVjdG8nLFxuICAgICAgICAgIGFscmVhZHlTZW50OiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2VjdGlvbjogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCh7XG4gICAgICAgICAgZmFxVGl0bGU6ICdSZXN1bcOtIGVsIHByb3llY3RvJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDQyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXF1aXJlcyBjbGllbnQgY29udGV4dCBmb3IgY2xpZW50IHNlY3Rpb25zIGFuZCBhbGxvd3MgaGVhZGVyIEZBUXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1ByZWd1bnRhJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudElkOiBudWxsLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1ByZWd1bnRhJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudElkOiA5LFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgaXNCYW5uZXJGYXFSZWFkeVRvQXV0b1NlbmQoe1xuICAgICAgICAgIGZhcVRpdGxlOiAnUHJlZ3VudGEnLFxuICAgICAgICAgIGFscmVhZHlTZW50OiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2VjdGlvbjogJ2hlYWRlcicsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdpc0xlZ2FjeUNvbnRleHRFbnRpdHknLCAoKSA9PiB7XG4gICAgaXQoJ2FjY2VwdHMgb25seSBwcm9qZWN0LCB0YXNrIGFuZCBjbGllbnQgZW50aXRpZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNMZWdhY3lDb250ZXh0RW50aXR5KCdwcm9qZWN0JykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0xlZ2FjeUNvbnRleHRFbnRpdHkoJ2dsb2JhbCcpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2dldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hpZGVzIGV4cGFuZGVkIHBhbmVsIG9uIG1haWEgcGFnZSByb3V0ZSB3aXRob3V0IHNob3dpbmcgdGhlIHBpbGwnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWFpYUhvc3RQYW5lbFByZXNlbnRhdGlvbihmYWxzZSwgdHJ1ZSkpLnRvRXF1YWwoe1xuICAgICAgICBoaWRlUGFuZWxDb250ZW50OiB0cnVlLFxuICAgICAgICBzaG93TWluaW1pemVkUGlsbDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgna2VlcHMgdGhlIHBhbmVsIHZpc2libGUgb24gb3RoZXIgcm91dGVzIHdoZW4gZXhwYW5kZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWFpYUhvc3RQYW5lbFByZXNlbnRhdGlvbihmYWxzZSwgZmFsc2UpKS50b0VxdWFsKHtcbiAgICAgICAgaGlkZVBhbmVsQ29udGVudDogZmFsc2UsXG4gICAgICAgIHNob3dNaW5pbWl6ZWRQaWxsOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG93cyB0aGUgcGlsbCBvbmx5IHdoZW4gbWluaW1pemVkIG91dHNpZGUgbWFpYSBwYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24odHJ1ZSwgZmFsc2UpKS50b0VxdWFsKHtcbiAgICAgICAgaGlkZVBhbmVsQ29udGVudDogdHJ1ZSxcbiAgICAgICAgc2hvd01pbmltaXplZFBpbGw6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KGdldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24odHJ1ZSwgdHJ1ZSkpLnRvRXF1YWwoe1xuICAgICAgICBoaWRlUGFuZWxDb250ZW50OiB0cnVlLFxuICAgICAgICBzaG93TWluaW1pemVkUGlsbDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2Vuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHVzZUZpcnN0QWdlbnQgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW2FnZW50KCdhMScpXSlcblxuICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICBlbnN1cmVBZ2VudHNCZWZvcmVTa2lsbFVzZSh7XG4gICAgICAgICAgdXNlRmlyc3RBZ2VudDogZmFsc2UsXG4gICAgICAgICAgYWdlbnRzOiBbXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKVxuXG4gICAgICBleHBlY3QoZW5zdXJlQWdlbnRzTG9hZGVkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgfSlcblxuICAgIGl0KCd1c2VzIHRoZSBpbi1tZW1vcnkgYWdlbnRzIGxpc3Qgd2hlbiBpdCBpcyBhbHJlYWR5IHBvcHVsYXRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVuc3VyZUFnZW50c0xvYWRlZCA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbYWdlbnQoJ2EyJyldKVxuXG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgICB1c2VGaXJzdEFnZW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50czogW2FnZW50KCdhMScpXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoYWdlbnQoJ2ExJykpXG5cbiAgICAgIGV4cGVjdChlbnN1cmVBZ2VudHNMb2FkZWQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICB9KVxuXG4gICAgaXQoJ2xvYWRzIGFnZW50cyB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW5zdXJlQWdlbnRzTG9hZGVkID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFthZ2VudCgnYTEnKSwgYWdlbnQoJ2EyJyldKVxuXG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgICB1c2VGaXJzdEFnZW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50czogW10sXG4gICAgICAgICAgZW5zdXJlQWdlbnRzTG9hZGVkLFxuICAgICAgICB9KVxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKGFnZW50KCdhMScpKVxuXG4gICAgICBleHBlY3QoZW5zdXJlQWdlbnRzTG9hZGVkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICB9KVxuXG4gICAgaXQoJ3JldHVybnMgdW5kZWZpbmVkIHdoZW4gYWdlbnRzIGNhbm5vdCBiZSBsb2FkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pXG5cbiAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2Uoe1xuICAgICAgICAgIHVzZUZpcnN0QWdlbnQ6IHRydWUsXG4gICAgICAgICAgYWdlbnRzOiBbXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hvc3QgdGFrZW92ZXIgY29udGV4dCBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdtYXBzIHByb2plY3QvdGFzayBzZWN0aW9ucyB0byBwcm9qZWN0IGFuZCB0YXNrIGVudGl0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvamVjdCA9IHsgaWQ6IDEsIG5hbWU6ICdBbHBoYScgfSBhcyBjb25zdFxuICAgICAgY29uc3QgdGFzayA9IHsgaWQ6IDksIG5hbWU6ICdCdWcnIH0gYXMgY29uc3RcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoe1xuICAgICAgICAgIHNlY3Rpb246ICd0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRhc2ssXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwcm9qZWN0LFxuICAgICAgICB0YXNrLFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoeyBzZWN0aW9uOiAndGFzaycsIHByb2plY3QsIHRhc2sgfSkuY2xpZW50KS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuXG4gICAgaXQoJ2NsZWFycyBjbGllbnQgb24gaGVhZGVyL3BsYW5uZXIgdGFrZW92ZXIgYW5kIHNldHMgY2xpZW50IG9uIGNsaWVudCBzZWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0geyBpZDogMiwgbmFtZTogJ0FjbWUnIH0gYXMgY29uc3RcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoe1xuICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IHRydWUsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSh7XG4gICAgICAgICAgc2VjdGlvbjogJ2NsaWVudCcsXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBwZXJzaXN0IGhvc3QgY29udGV4dCBmb3IgcGFuZWwgc2Vzc2lvbiBwYXRjaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3QgPSB7IGlkOiAzLCBuYW1lOiAnQmV0YScgfSBhcyBjb25zdFxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAncHJvamVjdCcsXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7XG4gICAgICAgIHNlY3Rpb246ICdwcm9qZWN0JyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnZGVmYXVsdHMgbWlzc2luZyBwcm9qZWN0LCBjbGllbnQgYW5kIHRhc2sgZW50aXRpZXMgb24gdGFrZW92ZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlKHsgc2VjdGlvbjogJ3Byb2plY3QnIH0pKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgdGFzazogbnVsbCxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlKHsgc2VjdGlvbjogJ2NsaWVudCcgfSkpLnRvTWF0Y2hPYmplY3QoeyBjbGllbnQ6IG51bGwgfSlcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoeyBzZWN0aW9uOiAndGFzaycsIHByb2plY3Q6IHsgaWQ6IDEgfSBhcyBuZXZlciB9KSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIHRhc2s6IG51bGwsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAncGxhbm5lcicsXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBwcm9qZWN0OiBudWxsLCBjbGllbnQ6IG51bGwsIHRhc2s6IG51bGwgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAnY2xpZW50JyxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGNsaWVudDogbnVsbCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQoe1xuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudDogeyBpZDogOSwgbmFtZTogJ0NsaWVudCcgfSBhcyBuZXZlcixcbiAgICAgICAgfSkuY2xpZW50XG4gICAgICApLnRvRXF1YWwoeyBpZDogOSwgbmFtZTogJ0NsaWVudCcgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAndGFzaycsXG4gICAgICAgICAgdGFzazogeyBpZDogMSwgbmFtZTogJ1QnIH0gYXMgbmV2ZXIsXG4gICAgICAgIH0pLnRhc2tcbiAgICAgICkudG9FcXVhbCh7IGlkOiAxLCBuYW1lOiAnVCcgfSlcblxuICAgICAgY29uc3QgcHJvamVjdCA9IHsgaWQ6IDQsIG5hbWU6ICdQJyB9IGFzIGNvbnN0XG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQoe1xuICAgICAgICAgIHNlY3Rpb246ICd0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRhc2s6IHsgaWQ6IDEsIG5hbWU6ICdUJyB9IGFzIG5ldmVyLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHsgcHJvamVjdCwgdGFzazogeyBpZDogMSwgbmFtZTogJ1QnIH0gfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdtb2RhbCBuYXZpZ2F0aW9uIGFuZCBzZXNzaW9uIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ25vcm1hbGl6ZXMgYnIgdG8gcHQtYnIgZm9yIG1vZGFsIGkxOG4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKCdicicpKS50b0JlKCdwdC1icicpXG4gICAgICBleHBlY3QocmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKCdlcycpKS50b0JlKCdlcycpXG4gICAgfSlcblxuICAgIGl0KCdjaGVja3MgYWdlbnQgbWFuYWdlbWVudCBwZXJtaXNzaW9ucyB3aXRoIG11bHRpLWFnZW50cyBmbGFnJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMoeyBhaV9hZ2VudHM6IHsgY3JlYXRlOiB0cnVlIH0gfSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zKHsgYWlfYWdlbnRzOiB7IGVkaXQ6IHRydWUgfSB9LCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMoeyBhaV9hZ2VudHM6IHsgZGVsZXRlOiB0cnVlIH0gfSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zKHsgYWlfYWdlbnRzOiB7IGNyZWF0ZTogdHJ1ZSB9IH0sIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2RlY2lkZXMgd2hlbiB0byBzdGFydCBhIG5ldyBjaGF0IGZyb20gY2F0YWxvZyB2aWV3cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyhvcHRpb25zLm15QWdlbnRzLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyhvcHRpb25zLmhvbWUsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2cob3B0aW9ucy5ob21lLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdoYW5kbGVzIGJhY2sgbmF2aWdhdGlvbiBicmFuY2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRCYWNrU3RhcnROZXdDaGF0UHJlc2VydmluZ0NvbnRleHQob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQmFja0NsZWFyUGlubmVkQ29udGV4dChvcHRpb25zLmhvbWUsIG9wdGlvbnMuaG9tZSwgJ2hlYWRlcicsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEJhY2tDbGVhclBpbm5lZENvbnRleHQob3B0aW9ucy5ob21lLCBvcHRpb25zLmhvbWUsICdwcm9qZWN0JywgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnbWFya3Mgb3JjaGVzdHJhdG9yIGNvbnRleHQgcmVzZXQgb24gcGlubmVkLXRvLWVtcHR5IHRyYW5zaXRpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCgncHJvamVjdCcsICdvcmNoZXN0cmF0b3InLCB0cnVlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRNYXJrT3JjaGVzdHJhdG9yQ29udGV4dFJlc2V0KCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJywgdHJ1ZSwgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncHJlZmVycyB1bnJlYWQgY2hhdHMgd2hlbiByZXN0b3JpbmcgZnJvbSBtaW5pbWl6ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGF0cyA9IFtcbiAgICAgICAgeyBzZXNzaW9uRXh0ZXJuYWxJZDogJ3MxJywgaXNSZWFkOiB0cnVlIH0sXG4gICAgICAgIHsgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMicsIGlzUmVhZDogZmFsc2UgfSxcbiAgICAgIF1cbiAgICAgIGV4cGVjdChyZXNvbHZlTWluaW1pemVkUmVzdG9yZVRhcmdldChjaGF0cywgJ3MxJyk/LnNlc3Npb25FeHRlcm5hbElkKS50b0JlKCdzMicpXG4gICAgICBleHBlY3QocmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoW3sgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMScsIGlzUmVhZDogdHJ1ZSB9XSwgJ3MxJyk/LnNlc3Npb25FeHRlcm5hbElkKS50b0JlKFxuICAgICAgICAnczEnXG4gICAgICApXG4gICAgICBleHBlY3QocmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoW3sgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMScsIGlzUmVhZDogdHJ1ZSB9XSwgdW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBob3N0IHRha2VvdmVyIGFnZW50IGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKGZhbHNlLCBbYWdlbnQoJ2ExJyldLCAnY3VycmVudCcpKS50b0JlKCdjdXJyZW50JylcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZChmYWxzZSwgW2FnZW50KCdhMScpXSwgdW5kZWZpbmVkKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKHRydWUsIFthZ2VudCgnYTEnKV0sICdjdXJyZW50JykpLnRvQmUoJ2ExJylcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZCh0cnVlLCBbXSwgJ2N1cnJlbnQnKSkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnYnVpbGRzIHBhbmVsIHNlc3Npb24gcGF0Y2ggb25seSB3aGVuIGV4cGFuZGVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCh7XG4gICAgICAgICAgaXNNaW5pbWl6ZWQ6IHRydWUsXG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICBhY3RpdmVDaGF0SWQ6IG51bGwsXG4gICAgICAgICAgYWdlbnRJZDogbnVsbCxcbiAgICAgICAgICBzaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBkcmFnUG9zaXRpb246IHsgeDogMSwgeTogMiB9LFxuICAgICAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICAgICAgY2hpcHNQcm9qZWN0OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvQmVOdWxsKClcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCh7XG4gICAgICAgICAgaXNNaW5pbWl6ZWQ6IGZhbHNlLFxuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNOYXZBY3RpdmU6ICdteUFnZW50cycsXG4gICAgICAgICAgYWN0aXZlQ2hhdElkOiAnY2hhdC0xJyxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2lkZWJhck9wZW46IHRydWUsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ3NpZGViYXInLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiAxLCB5OiAyIH0sXG4gICAgICAgICAgaG9zdENvbnRleHQ6IHtcbiAgICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICAgIHRhc2s6IG51bGwsXG4gICAgICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGFjdGl2ZUNoYXRJZDogJ2NoYXQtMScsIGRyYWdQb3NpdGlvbjogbnVsbCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTWFpYVBhbmVsU2Vzc2lvblBhdGNoKHtcbiAgICAgICAgICBpc01pbmltaXplZDogZmFsc2UsXG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICBhY3RpdmVDaGF0SWQ6ICdjaGF0LTEnLFxuICAgICAgICAgIGFnZW50SWQ6ICcxJyxcbiAgICAgICAgICBzaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBkcmFnUG9zaXRpb246IHsgeDogMywgeTogNCB9LFxuICAgICAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICAgICAgY2hpcHNQcm9qZWN0OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBkcmFnUG9zaXRpb246IHsgeDogMywgeTogNCB9IH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBmbG9hdGluZyBkcmFnIHBvc2l0aW9uIHdpdGggY2xhbXAgZmFsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjbGFtcCA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gKHsgeCwgeSB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbih7XG4gICAgICAgICAgbGF5b3V0TW9kZTogJ3NpZGViYXInLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiA1LCB5OiA2IH0sXG4gICAgICAgICAgdmlld3BvcnRXaWR0aDogMTIwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgY2xhbXAsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyB4OiA1LCB5OiA2IH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUZsb2F0aW5nUGFuZWxEcmFnUG9zaXRpb24oe1xuICAgICAgICAgIGxheW91dE1vZGU6ICdmbG9hdGluZycsXG4gICAgICAgICAgZHJhZ1Bvc2l0aW9uOiBudWxsLFxuICAgICAgICAgIHZpZXdwb3J0V2lkdGg6IDEyMDAsXG4gICAgICAgICAgcGFuZWxXaWR0aDogNDAwLFxuICAgICAgICAgIGNsYW1wLFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNzg0LCB5OiAxNiB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVGbG9hdGluZ1BhbmVsRHJhZ1Bvc2l0aW9uKHtcbiAgICAgICAgICBsYXlvdXRNb2RlOiAnZmxvYXRpbmcnLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiA0MCwgeTogNTAgfSxcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoOiAxMjAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBjbGFtcCxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDQwLCB5OiA1MCB9KVxuICAgIH0pXG5cbiAgICBpdCgncmV1c2VzIHByZXZpb3VzIGRyYWcgcG9zaXRpb24gd2hlbiB1bmNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0geyB4OiAxMCwgeTogMjAgfVxuICAgICAgZXhwZWN0KHJlc29sdmVOZXh0RHJhZ1Bvc2l0aW9uKHByZXYsIHsgeDogMTAsIHk6IDIwIH0pKS50b0JlKHByZXYpXG4gICAgICBleHBlY3QocmVzb2x2ZU5leHREcmFnUG9zaXRpb24ocHJldiwgeyB4OiAxMSwgeTogMjAgfSkpLnRvRXF1YWwoeyB4OiAxMSwgeTogMjAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCduYXZpZ2F0aW9uIGFuZCBsZWdhY3kgY29udGV4dCBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdyZXNvbHZlcyBwaW5uZWQgY29udGV4dCBhbmQgYmFjayBidXR0b24gdmlzaWJpbGl0eScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlSGFzUGlubmVkQ29udGV4dCh7IHRhc2tJZDogMSB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVIYXNQaW5uZWRDb250ZXh0KHt9KSkudG9CZShmYWxzZSlcblxuICAgICAgY29uc3QgZmxhZ3MgPSByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzKHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBoYXNQaW5uZWRDb250ZXh0OiB0cnVlLFxuICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QoZmxhZ3MuaXNDaGF0VmlldykudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbih7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcblxuICAgICAgY29uc3Qgc2VjdGlvblJlc2V0RmxhZ3MgPSByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzKHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBoYXNQaW5uZWRDb250ZXh0OiB0cnVlLFxuICAgICAgICBzZWN0aW9uOiAncHJvamVjdCcsXG4gICAgICAgIGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbjogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3Qoc2VjdGlvblJlc2V0RmxhZ3MuaXNTZWN0aW9uUmVzZXRIb21lU3RlcDIpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24oe1xuICAgICAgICAgIGFnZW50VHlwZTogJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgaGFzRXJyb3I6IHRydWUsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgLi4uc2VjdGlvblJlc2V0RmxhZ3MsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24oe1xuICAgICAgICAgIGFnZW50VHlwZTogJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgaXNDaGF0VmlldzogdHJ1ZSxcbiAgICAgICAgICBpc0hlYWRlckhvbWVTdGVwMjogZmFsc2UsXG4gICAgICAgICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDI6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dPcmNoZXN0cmF0b3JCYWNrQnV0dG9uKHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0NoYXRWaWV3OiBmYWxzZSxcbiAgICAgICAgICBpc0hlYWRlckhvbWVTdGVwMjogZmFsc2UsXG4gICAgICAgICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDI6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBsZWdhY3kgbWlncmF0aW9uIHBhdGNoZXMgZm9yIGNsaWVudCwgcHJvamVjdCBhbmQgdGFzayBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaChudWxsKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnIH0pKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnLCBjbGllbnRJZDogMywgY2xpZW50TmFtZTogJ0FDTUUnIH0pPy5jbGllbnRcbiAgICAgICkudG9FcXVhbCh7XG4gICAgICAgIGlkOiAzLFxuICAgICAgICBuYW1lOiAnQUNNRScsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7IGFnZW50RW50aXR5OiAncHJvamVjdCcsIHByb2plY3RJZDogOSwgcHJvamVjdE5hbWU6ICdQJyB9KT8uY2hpcHNQcm9qZWN0XG4gICAgICAgICAgPy5wcm9qZWN0SWRcbiAgICAgICkudG9CZSgnOScpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tJZDogMSxcbiAgICAgICAgICB0YXNrTmFtZTogJ1QnLFxuICAgICAgICAgIHByb2plY3RJZDogMixcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICAgIGNsaWVudElkOiA0LFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LnRhc2tcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGlkOiAxLCBuYW1lOiAnVCcsIHByb2plY3RJZDogMiB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogOSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICAgIGNsaWVudElkOiA0LFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LnByb2plY3RcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGNsaWVudElkOiA0IH0pXG5cbiAgICAgIGV4cGVjdChidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7IGFnZW50RW50aXR5OiAndGFzaycsIHRhc2tJZDogNSwgdGFza05hbWU6ICdPbmx5IHRhc2snIH0pPy50YXNrKS50b0VxdWFsKFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDUsXG4gICAgICAgICAgbmFtZTogJ09ubHkgdGFzaycsXG4gICAgICAgIH1cbiAgICAgIClcblxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnLCBjbGllbnRJZDogMSB9KT8uY2xpZW50KS50b0VxdWFsKHtcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICd0YXNrJyxcbiAgICAgICAgICB0YXNrSWQ6IDgsXG4gICAgICAgICAgdGFza05hbWU6ICdUJyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDIsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdQJyxcbiAgICAgICAgfSk/LmNoaXBzUHJvamVjdD8ucHJvamVjdElkXG4gICAgICApLnRvQmUoJzInKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tJZDogNixcbiAgICAgICAgICB0YXNrTmFtZTogJ1QnLFxuICAgICAgICAgIGNsaWVudElkOiAzLFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LmNsaWVudFxuICAgICAgKS50b0VxdWFsKHsgaWQ6IDMsIG5hbWU6ICdDJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogOSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICB9KT8ucHJvamVjdFxuICAgICAgKS5ub3QudG9IYXZlUHJvcGVydHkoJ2NsaWVudElkJylcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICd0YXNrJyxcbiAgICAgICAgICB0YXNrSWQ6IDEwLFxuICAgICAgICAgIHRhc2tOYW1lOiAnRnVsbCB0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDExLFxuICAgICAgICAgIHByb2plY3ROYW1lOiAnUHJvaicsXG4gICAgICAgICAgY2xpZW50SWQ6IDEyLFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDbGllbnQnLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgdGFzazogeyBpZDogMTAsIG5hbWU6ICdGdWxsIHRhc2snLCBwcm9qZWN0SWQ6IDExLCBjbGllbnRJZDogMTIgfSxcbiAgICAgICAgY2xpZW50OiB7IGlkOiAxMiwgbmFtZTogJ0NsaWVudCcgfSxcbiAgICAgICAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZDogJzExJywgcHJvamVjdE5hbWU6ICdQcm9qJywgY2xpZW50TmFtZTogJ0NsaWVudCcgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBmbG9hdGluZyBkcmFnIGNsYW1wIGFuZCBsYXlvdXQgcG9zaXRpb24gdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayhudWxsKSkudG9CZSh0cnVlKVxuICAgICAgY29uc3QgY2xhbXAgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+ICh7IHgsIHkgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnZmxvYXRpbmcnLCB7IHg6IDQsIHk6IDggfSwgY2xhbXAsIHtcbiAgICAgICAgICBpbm5lcldpZHRoOiAxMDAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBwYWQ6IDE2LFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNCwgeTogOCB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlKCdmbG9hdGluZycsIG51bGwsIGNsYW1wLCB7XG4gICAgICAgICAgaW5uZXJXaWR0aDogMTAwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgcGFkOiAxNixcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDU4NCwgeTogMTYgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnc2lkZWJhcicsIG51bGwsIGNsYW1wLCB7IGlubmVyV2lkdGg6IDAsIHBhbmVsV2lkdGg6IDAsIHBhZDogMCB9KVxuICAgICAgKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kKCdmbG9hdGluZycsIHt9IGFzIEhUTUxFbGVtZW50KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCgnc2lkZWJhcicsIHt9IGFzIEhUTUxFbGVtZW50KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBpbml0aWFsIGNoYXQgbWVzc2FnZSBwYXlsb2FkIGZyb20gc3RhcnQgY2hhdCBhcmdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGJ1aWxkVXNlckluaXRpYWxNZXNzYWdlRnJvbVN0YXJ0Q2hhdCh7IG1lc3NhZ2U6ICdob2xhJywgZmFxSWQ6ICdmMScgfSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiAnaG9sYScsXG4gICAgICAgIGZhcUlkOiAnZjEnLFxuICAgICAgICBhdHRhY2htZW50czogW10sXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZFVzZXJJbml0aWFsTWVzc2FnZUZyb21TdGFydENoYXQoe1xuICAgICAgICAgIGF0dGFjaG1lbnRzOiBbeyBpZDogJzEnIH1dLFxuICAgICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiAnczEnLFxuICAgICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgICBmdWFJZDogJ2Z1YScsXG4gICAgICAgICAgc2NJZDogJ3NjJyxcbiAgICAgICAgICBjb250ZXh0RGF0YTogeyB0YXNrSWQ6IDEgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICBhdHRhY2htZW50czogW3sgaWQ6ICcxJyB9XSxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ6ICdzMScsXG4gICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgZnVhSWQ6ICdmdWEnLFxuICAgICAgICBzY0lkOiAnc2MnLFxuICAgICAgICBjb250ZXh0RGF0YTogeyB0YXNrSWQ6IDEgfSxcbiAgICAgIH0pXG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZXRTaWRlYmFyRXJyb3JPblN0YXJ0Q2hhdCh0cnVlKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnc3VwcG9ydHMgZ28taG9tZSBhbmQgc2VuZCByb3V0aW5nIGd1YXJkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQoJ2NsaWVudCcpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUoeyBoYXNfbm90X2FjY2VzczogdHJ1ZSB9IGFzIEFnZW50LCAyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUobnVsbCwgMikpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lKHsgaXNfZGVsZXRlZDogdHJ1ZSB9IGFzIEFnZW50LCAxKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUoeyBoYXNfbm90X2FjY2VzczogdHJ1ZSB9IGFzIEFnZW50LCAwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoY2FuT3Blbk1haWFNYXJrZXRwbGFjZShmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoZmluZE9yY2hlc3RyYXRvckFnZW50KFthZ2VudCgnMicpLCBvcmNoZXN0cmF0b3JBZ2VudF0pPy50eXBlKS50b0JlKCdvcmNoZXN0cmF0b3InKVxuICAgICAgZXhwZWN0KHNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dCh7fSwgeyBpZDogJzEnIH0gYXMgQWdlbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkTWFya0FnZW50QXNMZWdhY3lDb250ZXh0KHt9LCB7IGlkOiAnMScsIGlzX2xlZ2FjeV9jb250ZXh0OiB0cnVlIH0gYXMgQWdlbnQpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dEFnZW50KHsgaWQ6ICcxJywgbmFtZTogJ0EnLCB0eXBlOiAnY3VzdG9tJyB9IGFzIEFnZW50KS5pc19sZWdhY3lfY29udGV4dCkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ21vdW50LCBiYW5uZXIgYW5kIGFnZW50cyBsb2FkaW5nIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NvbnRyb2xzIGNoYXQgdmlzaWJpbGl0eSBhbmQgbGFzdCBhY3RpdmUgY2hhdCBwZXJzaXN0ZW5jZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQoZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2V0Q2hhdFZpZXdIaWRkZW5Pbk1vdW50KHRydWUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKCdjaGF0LTEnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKG51bGwpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKHRydWUpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyBiYW5uZXIgRkFRIHRpdGxlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChoYXNCYW5uZXJGYXFUaXRsZSgnICAnKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChoYXNCYW5uZXJGYXFUaXRsZSgnUHJlZ3VudGEnKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgY2FjaGVkIGFnZW50cyBhbmQgaW5pdGlhbCBmZXRjaCBhdHRlbXB0cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUoW2FnZW50KCcxJyldKSkudG9FcXVhbChbYWdlbnQoJzEnKV0pXG4gICAgICBleHBlY3QocmVzb2x2ZUNhY2hlZEFnZW50c0lmQXZhaWxhYmxlKFtdKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHNob3VsZEF0dGVtcHRJbml0aWFsQWdlbnRzRmV0Y2goMCwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQXR0ZW1wdEluaXRpYWxBZ2VudHNGZXRjaCgwLCB0cnVlKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoKDIsIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2ZpbmRzIGFnZW50cyBmb3IgY2hhdCBpdGVtcyB3aXRoIG51bWVyaWMgaWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZpbmRBZ2VudEZvckNoYXRJdGVtKFt7IC4uLmFnZW50KCc3JyksIGlkOiAnNycgfSBhcyBBZ2VudF0sIDcpPy5pZCkudG9CZSgnNycpXG4gICAgICBleHBlY3QoZmluZEFnZW50Rm9yQ2hhdEl0ZW0oW2FnZW50KCcxJyldLCA5OSkpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hvc3QgdGFrZW92ZXIgYW5kIG5hdmlnYXRpb24gZ3VhcmRzJywgKCkgPT4ge1xuICAgIGl0KCdhcHBsaWVzIGNsaWVudCB1cGRhdGVzIG9ubHkgd2hlbiBkZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEFwcGx5Q2xpZW50T25Ib3N0VGFrZW92ZXIodW5kZWZpbmVkKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyKG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQXBwbHlDbGllbnRPbkhvc3RUYWtlb3Zlcih7IGlkOiAxLCBuYW1lOiAnQWNtZScgfSBhcyBuZXZlcikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3NlbGVjdHMgZmlyc3QgYWdlbnQgb24gZ2xvYmFsIGhvc3QgdGFrZW92ZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyKHRydWUsIGFnZW50KCcxJykpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyKGZhbHNlLCBhZ2VudCgnMScpKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTZWxlY3RGaXJzdEFnZW50T25Ib3N0VGFrZW92ZXIodHJ1ZSwgdW5kZWZpbmVkKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NvdmVycyBnby1ob21lLCBjYXRhbG9nIGFuZCBza2lsbCBhZ2VudCBndWFyZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZShvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lKG9wdGlvbnMuaG9tZSwgb3B0aW9ucy5jaGF0KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50KGFnZW50KCcxJykpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQ2xlYXJDb250ZXh0Rm9yQ2F0YWxvZ09yU2tpbGxBZ2VudCh1bmRlZmluZWQpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQoJ3Rhc2snKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhclRhc2tPbkdvSG9tZUZyb21DaGF0KCdoZWFkZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lKCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZSgncHJvamVjdCcsICdvcmNoZXN0cmF0b3InKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRQcmVmZXRjaEFnZW50c0ZvckNhdGFsb2dOZXdDaGF0KG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlTa2lsbHMpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUHJlZmV0Y2hBZ2VudHNGb3JDYXRhbG9nTmV3Q2hhdChvcHRpb25zLmhvbWUsIG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlTa2lsbHMpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgb3Blbi1uZXctY2hhdC13aXRoLWFnZW50IGNvbnRleHQgcGF0Y2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0KHsgcHJvamVjdDogeyBpZDogMSwgbmFtZTogJ1AnIH0gYXMgbmV2ZXIgfSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAnUCcgfSxcbiAgICAgICAgc2hvdWxkU2V0VGFzazogZmFsc2UsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc29sdmVPcGVuTmV3Q2hhdFdpdGhBZ2VudENvbnRleHQoeyB0YXNrOiB7IGlkOiAyLCBuYW1lOiAnVCcgfSBhcyBuZXZlciB9KS5zaG91bGRTZXRUYXNrKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCd2YWxpZGF0ZXMgbGVnYWN5IGNvbnRleHQgY29udGludWF0aW9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNhbkNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCh7IGFnZW50RW50aXR5OiAndGFzaycgfSwgb3JjaGVzdHJhdG9yQWdlbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0KG51bGwsIG9yY2hlc3RyYXRvckFnZW50KSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdzZXNzaW9uIHJlc3RvcmUgcm91dGluZycsICgpID0+IHtcbiAgICBpdCgnbWFwcyBzbmFwc2hvdCBuYXYgcm91dGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVTZXNzaW9uUmVzdG9yZU5hdlJvdXRlKHsgYWdlbnRzTmF2QWN0aXZlOiAnbXlBZ2VudHMnIH0pKS50b0JlKCdteUFnZW50cycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoeyBhZ2VudHNOYXZBY3RpdmU6ICdteVNraWxscycgfSkpLnRvQmUoJ215U2tpbGxzJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGFnZW50c05hdkFjdGl2ZTogJ21haWFrZXInIH0pKS50b0JlKCdtYWlha2VyJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGN1cnJlbnRPcHRpb246ICdjaGF0JywgYWN0aXZlQ2hhdElkOiAncy0xJyB9KSkudG9CZSgnY2hhdCcpXG4gICAgICBleHBlY3QocmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoeyBjdXJyZW50T3B0aW9uOiAnaG9tZScgfSkpLnRvQmUoJ3NhdmVkT3B0aW9uJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGN1cnJlbnRPcHRpb246ICdpbnZhbGlkJyB9KSkudG9CZSgnbm9uZScpXG4gICAgfSlcblxuICAgIGl0KCdjb250cm9scyBhZ2VudHMgbG9hZCBicmFuY2hlcyBkdXJpbmcgcmVzdG9yZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUoJ215U2tpbGxzJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUoJ215QWdlbnRzJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkRmV0Y2hBZ2VudERldGFpbE9uU2Vzc2lvblJlc3RvcmUoJ2ExJywgJ21haWFrZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlKCdhMScsICdteUFnZW50cycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlKCdteUFnZW50cycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlKCdtYWlha2VyJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTZWxlY3RGZXRjaGVkQWdlbnRBZnRlclJlc3RvcmUoYWdlbnQoJzEnKSwgJ21haWFrZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNlbGVjdEZldGNoZWRBZ2VudEFmdGVyUmVzdG9yZShhZ2VudCgnMScpLCAnbXlBZ2VudHMnKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc3RvcmVzIGNoaXBzIHByb2plY3QgZnJvbSBzbmFwc2hvdCBob3N0IGNvbnRleHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVTbmFwc2hvdENoaXBzUHJvamVjdCh7XG4gICAgICAgICAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZDogJzknLCBwcm9qZWN0TmFtZTogJ1AnLCBjbGllbnROYW1lOiAnQycgfSxcbiAgICAgICAgfSk/LnByb2plY3RJZFxuICAgICAgKS50b0JlKCc5JylcbiAgICAgIGV4cGVjdChyZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QobnVsbCkpLnRvQmVOdWxsKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdsYXlvdXQgYW5kIG1vZGFsIHZpc2liaWxpdHkgaGVscGVycycsICgpID0+IHtcbiAgICBpdCgncmVzb2x2ZXMgc2VjdGlvbiBmbGFncyBhbmQgc2lkZWJhciB2aXNpYmlsaXR5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3Mob3B0aW9ucy5jaGF0LCBmYWxzZSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBzaG93TmV3Q2hhdDogZmFsc2UsXG4gICAgICAgIGlzTXlBZ2VudHNTZWN0aW9uOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzb2x2ZUNoYXRNb2RhbFNlY3Rpb25GbGFncyhvcHRpb25zLmhvbWUsIHRydWUpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIHRydWUpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgbWFpbiBjb250ZW50IHZpZXcgYW5kIGZvb3RlciB2aXNpYmlsaXR5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVDaGF0TW9kYWxNYWluQ29udGVudFZpZXcodHJ1ZSwgdHJ1ZSkpLnRvQmUoJ2Vycm9yJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3KGZhbHNlLCB0cnVlKSkudG9CZSgnY2hhdCcpXG4gICAgICBleHBlY3QocmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyhmYWxzZSwgZmFsc2UpKS50b0JlKCdwcm9qZWN0U3VtbWFyeScpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7XG4gICAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgICAgaG9tZU9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGNoYXRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNDb3VudDogMCxcbiAgICAgICAgICBpc01haWFrZXJDcmVhdG9ySG9tZTogZmFsc2UsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGhhc0FjY2VzczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoe1xuICAgICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBjaGF0T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgICAgYWdlbnRzQ291bnQ6IDAsXG4gICAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IGZhbHNlLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBoYXNBY2Nlc3M6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7XG4gICAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgaG9tZU9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGNoYXRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNDb3VudDogMixcbiAgICAgICAgICBpc01haWFrZXJDcmVhdG9ySG9tZTogZmFsc2UsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGhhc0FjY2VzczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnY292ZXJzIGZsb2F0aW5nIGRyYWcgYW5kIGVsZXZhdGVkIHBhbmVsIGJyYW5jaGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UoJ3NpZGViYXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UoJ2Zsb2F0aW5nJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkUGVyc2lzdERyYWdQb3NpdGlvbk9uRHJhZ0VuZCgnZmxvYXRpbmcnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFN0YXJ0RmxvYXRpbmdQYW5lbERyYWcodHJ1ZSwgMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnKHRydWUsIDEpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlcigxLCAxKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlcigxLCAyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCgndGFzaycpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNHbG9iYWxNYWlhU2VjdGlvbignaGVhZGVyJykpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NvdmVycyBkZWxldGUgYWdlbnQgYW5kIHNraWxscyBjYXRhbG9nIGd1YXJkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRSZXNlbGVjdEFnZW50QWZ0ZXJEZWxldGUoJ2ExJywgJ2ExJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNlbGVjdEFnZW50QWZ0ZXJEZWxldGUoJ2ExJywgJ2EyJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkT3BlblNraWxsc0NhdGFsb2codHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRPcGVuU2tpbGxzQ2F0YWxvZyhmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdoaWRlcyB0aGUgZm9vdGVyIG9uIG1haWFrZXIgaG9tZSwgZXJyb3JzLCBsb2FkaW5nIG9yIG1pc3NpbmcgYWNjZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBhZ2VudHNDb3VudDogMCxcbiAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IGZhbHNlLFxuICAgICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBoYXNBY2Nlc3M6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIGV4cGVjdChzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyKHsgLi4uYmFzZSwgaXNNYWlha2VyQ3JlYXRvckhvbWU6IHRydWUgfSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7IC4uLmJhc2UsIGhhc0Vycm9yOiB0cnVlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoeyAuLi5iYXNlLCBsb2FkaW5nOiB0cnVlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoeyAuLi5iYXNlLCBoYXNBY2Nlc3M6IGZhbHNlIH0pKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnYnVpbGRzIHN0YXJ0LWNoYXQgcGF5bG9hZHMgYW5kIGRyYWcgcG9zaXRpb24gdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgYnVpbGRVc2VySW5pdGlhbE1lc3NhZ2VGcm9tU3RhcnRDaGF0KHtcbiAgICAgICAgICBtZXNzYWdlOiAnSG9sYScsXG4gICAgICAgICAgYXR0YWNobWVudHM6IFt7IGlkOiAnMScgfV0sXG4gICAgICAgICAgZmFxSWQ6ICdmYXEtMScsXG4gICAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ6ICdzdWctMScsXG4gICAgICAgICAgbWVudGlvbnM6IFt7IGlkOiAnbTEnIH1dLFxuICAgICAgICAgIGZ1YUlkOiAnZnVhLTEnLFxuICAgICAgICAgIHNjSWQ6ICdzYy0xJyxcbiAgICAgICAgICBjb250ZXh0RGF0YTogeyBwcm9qZWN0SWQ6IDEgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdIb2xhJyxcbiAgICAgICAgZmFxSWQ6ICdmYXEtMScsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiAnc3VnLTEnLFxuICAgICAgICBtZW50aW9uczogW3sgaWQ6ICdtMScgfV0sXG4gICAgICAgIGZ1YUlkOiAnZnVhLTEnLFxuICAgICAgICBzY0lkOiAnc2MtMScsXG4gICAgICAgIGNvbnRleHREYXRhOiB7IHByb2plY3RJZDogMSB9LFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlKCdzaWRlYmFyJywgeyB4OiAxLCB5OiAyIH0sICh4LCB5KSA9PiAoeyB4LCB5IH0pLCB7XG4gICAgICAgICAgaW5uZXJXaWR0aDogMTAwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgcGFkOiAxNixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMYXlvdXREcmFnUG9zaXRpb25VcGRhdGUoJ2Zsb2F0aW5nJywgbnVsbCwgKHgsIHkpID0+ICh7IHgsIHkgfSksIHtcbiAgICAgICAgICBpbm5lcldpZHRoOiAxMDAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBwYWQ6IDE2LFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNTg0LCB5OiAxNiB9KVxuXG4gICAgICBleHBlY3QocmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kKCdmbG9hdGluZycsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCgnc2lkZWJhcicsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdkaXNwYXRjaFNraWxsTWVudGlvbkluc2VydCcsICgpID0+IHtcbiAgICBpdCgnZGlzcGF0Y2hlcyB0aGUgc2tpbGwgbWVudGlvbiBhZnRlciB0d28gYW5pbWF0aW9uIGZyYW1lcycsICgpID0+IHtcbiAgICAgIGplc3QudXNlRmFrZVRpbWVycygpXG4gICAgICBjb25zdCByYWYgPSBqZXN0XG4gICAgICAgIC5zcHlPbih3aW5kb3csICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnKVxuICAgICAgICAubW9ja0ltcGxlbWVudGF0aW9uKGNhbGxiYWNrID0+IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKDApLCAwKSBhcyB1bmtub3duIGFzIG51bWJlcilcblxuICAgICAgY29uc3Qgb25JbnNlcnQgPSBqZXN0LmZuKClcbiAgICAgIGNvbnN0IG9uUmVmb2N1cyA9IGplc3QuZm4oKVxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1pbnNlcnQtc2tpbGwtbWVudGlvbicsIG9uSW5zZXJ0KVxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1pbnB1dC1yZWZvY3VzJywgb25SZWZvY3VzKVxuXG4gICAgICBkaXNwYXRjaFNraWxsTWVudGlvbkluc2VydCh7IGlkOiAnc2sxJywgbmFtZTogJ1Jlc3VtaXInIH0pXG5cbiAgICAgIGV4cGVjdChvbkluc2VydCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG5cbiAgICAgIGV4cGVjdChvbkluc2VydCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgICBleHBlY3Qob25SZWZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICAgIGNvbnN0IGV2ZW50ID0gb25JbnNlcnQubW9jay5jYWxsc1swXVswXSBhcyBDdXN0b21FdmVudFxuICAgICAgZXhwZWN0KGV2ZW50LmRldGFpbC5za2lsbCkudG9FcXVhbCh7IGlkOiAnc2sxJywgbmFtZTogJ1Jlc3VtaXInIH0pXG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCBvbkluc2VydClcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5wdXQtcmVmb2N1cycsIG9uUmVmb2N1cylcbiAgICAgIHJhZi5tb2NrUmVzdG9yZSgpXG4gICAgICBqZXN0LnVzZVJlYWxUaW1lcnMoKVxuICAgIH0pXG4gIH0pXG59KVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLFNBQVNBLFdBQVcsUUFBUSwyQkFBMkI7QUFFdkQsU0FBU0MsT0FBTyxRQUFRLGFBQWE7QUFDckMsU0FDRUMsMEJBQTBCLEVBQzFCQywwQkFBMEIsRUFDMUJDLDBCQUEwQixFQUMxQkMsNEJBQTRCLEVBQzVCQyx5QkFBeUIsRUFDekJDLDBCQUEwQixFQUMxQkMscUJBQXFCLEVBQ3JCQyw0QkFBNEIsRUFDNUJDLDRCQUE0QixFQUM1QkMsbUNBQW1DLEVBQ25DQywyQkFBMkIsRUFDM0JDLDJCQUEyQixFQUMzQkMsNkJBQTZCLEVBQzdCQywwQkFBMEIsRUFDMUJDLDRCQUE0QixFQUM1QkMsdUJBQXVCLEVBQ3ZCQyw4QkFBOEIsRUFDOUJDLCtCQUErQixFQUMvQkMsMEJBQTBCLEVBQzFCQyxnQ0FBZ0MsRUFDaENDLDBCQUEwQixFQUMxQkMsd0JBQXdCLEVBQ3hCQyw2QkFBNkIsRUFDN0JDLHVCQUF1QixFQUN2QkMsd0NBQXdD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