@projectcor/maia-components 2.45.0 → 2.45.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 (430) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +135 -0
  6. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  7. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +65 -0
  8. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +66 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +5 -51
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +211 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  12. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +55 -0
  13. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +41 -0
  14. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +18 -76
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +253 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +31 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +33 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +3 -31
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +25 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  23. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  25. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  26. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  27. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  28. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  29. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  30. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  31. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +88 -0
  32. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  33. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  34. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  35. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +77 -0
  36. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  37. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  38. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +31 -0
  39. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +48 -0
  40. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +5 -34
  41. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +231 -0
  42. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  43. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  44. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  45. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  46. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  47. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  48. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  49. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  50. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  51. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  52. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  53. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  54. package/lib/components/atoms/HelpButton.spec.js +87 -0
  55. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  56. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  57. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  58. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  59. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  60. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  61. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  62. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  63. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +12 -0
  64. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +26 -0
  65. package/lib/components/atoms/MAIAInput/MAIAInput.js +8 -12
  66. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +444 -0
  67. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +50 -0
  68. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +20 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +8 -60
  70. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +53 -0
  71. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +22 -0
  72. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  73. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  74. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  75. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  76. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  77. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  78. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  79. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  80. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  81. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  82. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  83. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  84. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +86 -0
  85. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  86. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  87. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  88. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  89. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  90. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
  91. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  92. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
  93. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  94. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  95. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  96. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  97. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  98. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  99. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  100. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  101. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  102. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  103. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  104. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  105. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  106. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  107. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  108. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  109. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  110. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +85 -0
  111. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  112. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  113. package/lib/components/atoms/TextArea/TextArea.spec.js +68 -0
  114. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  115. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  116. package/lib/components/atoms/WithAppCfg.spec.js +60 -0
  117. package/lib/components/index.js +2 -1
  118. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  119. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  120. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +5 -29
  121. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +371 -0
  122. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +39 -0
  123. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +57 -0
  124. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +6 -40
  125. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +227 -0
  126. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +86 -0
  127. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +108 -0
  128. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +18 -90
  129. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +254 -0
  130. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  131. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  132. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  133. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  134. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  135. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  136. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  137. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  138. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  139. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  140. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  141. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  142. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  143. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  144. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  145. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  146. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +21 -6
  147. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +246 -0
  148. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  149. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  150. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +54 -0
  151. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +77 -0
  152. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +19 -47
  153. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +410 -0
  154. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  155. package/lib/components/molecules/ChatAIMessages/newStyles.js +29 -26
  156. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +147 -4
  157. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +471 -0
  158. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +64 -108
  159. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +659 -0
  160. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  161. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  162. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  163. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  164. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  165. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  166. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  167. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +30 -0
  168. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +95 -0
  169. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +76 -86
  170. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  171. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  172. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  173. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  174. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  175. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  176. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +172 -0
  177. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +128 -0
  178. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  179. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  180. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
  181. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  182. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  183. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +82 -0
  184. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  185. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  186. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  187. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  188. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  189. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  190. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  191. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  192. package/lib/components/molecules/Sidebar/Sidebar.js +41 -23
  193. package/lib/components/molecules/Sidebar/Sidebar.spec.js +453 -0
  194. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +198 -0
  195. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +385 -0
  196. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +56 -171
  197. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1125 -0
  198. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  199. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +405 -0
  200. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  201. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  202. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +231 -0
  203. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  204. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  205. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  206. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  207. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
  208. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
  209. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
  210. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  211. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  212. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  213. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  214. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  215. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  216. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  217. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  218. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  219. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  220. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  221. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  222. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  223. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  224. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  225. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  226. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  227. package/lib/constants/permissions/index.js +2 -2
  228. package/lib/constants/permissions/utils.js +4 -1
  229. package/lib/constants/permissions/utils.spec.js +128 -0
  230. package/lib/dev/DevMaiaPage.js +30 -0
  231. package/lib/dev/DevReasoningTimeline.js +68 -37
  232. package/lib/dev/Providers.js +5 -3
  233. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  234. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  235. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  236. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  237. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +231 -0
  238. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  239. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +313 -0
  240. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  241. package/lib/hooks/useCaretPosition.spec.js +58 -0
  242. package/lib/hooks/useChatManager/useChatManager.helpers.js +353 -0
  243. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +506 -0
  244. package/lib/hooks/useChatManager/useChatManager.js +76 -351
  245. package/lib/hooks/useChatManager/useChatManager.spec.js +1261 -0
  246. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +109 -0
  247. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +176 -0
  248. package/lib/hooks/useChatMessages/useChatMessages.js +12 -82
  249. package/lib/hooks/useChatMessages/useChatMessages.spec.js +379 -0
  250. package/lib/hooks/useChats/useChats.spec.js +208 -0
  251. package/lib/hooks/useClientSearch.helpers.js +36 -0
  252. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  253. package/lib/hooks/useClientSearch.js +4 -32
  254. package/lib/hooks/useClientSearch.spec.js +86 -0
  255. package/lib/hooks/useContextMentions.helpers.js +152 -0
  256. package/lib/hooks/useContextMentions.helpers.spec.js +143 -0
  257. package/lib/hooks/useContextMentions.js +2 -163
  258. package/lib/hooks/useContextMentions.spec.js +239 -0
  259. package/lib/hooks/useContextMentions.types.js +2 -0
  260. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  261. package/lib/hooks/useContextPinPopover.helpers.spec.js +115 -0
  262. package/lib/hooks/useContextPinPopover.js +16 -75
  263. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  264. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  265. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  266. package/lib/hooks/useDebounce.spec.js +42 -0
  267. package/lib/hooks/useEntitySearch.helpers.js +359 -0
  268. package/lib/hooks/useEntitySearch.helpers.spec.js +321 -0
  269. package/lib/hooks/useEntitySearch.js +38 -391
  270. package/lib/hooks/useEntitySearch.spec.js +443 -0
  271. package/lib/hooks/useEvent.spec.js +45 -0
  272. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  273. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  274. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  275. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  276. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  277. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  278. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  279. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  280. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  281. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  282. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  283. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  284. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  285. package/lib/hooks/useMentionPopover.helpers.spec.js +71 -0
  286. package/lib/hooks/useMentionPopover.js +9 -35
  287. package/lib/hooks/useMentionPopover.spec.js +215 -0
  288. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  289. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +132 -0
  290. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  291. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  292. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  293. package/lib/hooks/useModal/useModal.spec.js +73 -0
  294. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +192 -0
  295. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  296. package/lib/hooks/useProjectSearch.helpers.spec.js +70 -0
  297. package/lib/hooks/useProjectSearch.js +4 -58
  298. package/lib/hooks/useProjectSearch.spec.js +91 -0
  299. package/lib/hooks/useProjectSummary.spec.js +193 -0
  300. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  301. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +92 -0
  302. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  303. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  304. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  305. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  306. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  307. package/lib/hooks/useRecentClientsSearch.js +4 -32
  308. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  309. package/lib/hooks/useRecentContexts.spec.js +139 -0
  310. package/lib/hooks/useResize.spec.js +37 -0
  311. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  312. package/lib/hooks/useSlashCommands.spec.js +139 -0
  313. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  314. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  315. package/lib/hooks/useStreamResponse.spec.js +199 -0
  316. package/lib/hooks/useT.spec.js +20 -0
  317. package/lib/hooks/useToggle.spec.js +33 -0
  318. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  319. package/lib/index.js +5 -2
  320. package/lib/lang/br/index.js +26 -1
  321. package/lib/lang/en/index.js +26 -1
  322. package/lib/lang/es/index.js +26 -1
  323. package/lib/lang/fr/index.js +26 -1
  324. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  325. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  326. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  327. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  328. package/lib/services/maia/Agents/connectors.spec.js +359 -0
  329. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  330. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  331. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  332. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  333. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  334. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  335. package/lib/services/maia/Agents/getAgents.helpers.js +181 -0
  336. package/lib/services/maia/Agents/getAgents.helpers.spec.js +211 -0
  337. package/lib/services/maia/Agents/getAgents.js +78 -242
  338. package/lib/services/maia/Agents/getAgents.spec.js +697 -0
  339. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  340. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  341. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  342. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  343. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  344. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  345. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  346. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  347. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  348. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  349. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  350. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  351. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  352. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  353. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +153 -0
  354. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  355. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  356. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  357. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  358. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  359. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  360. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  361. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  362. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  363. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  364. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  365. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  366. package/lib/services/maia/client.spec.js +56 -0
  367. package/lib/services/utils/fetchCOR.spec.js +211 -0
  368. package/lib/services/utils/getCookie.spec.js +20 -0
  369. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  370. package/lib/store/chatsSidebarOptimistic.spec.js +112 -0
  371. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  372. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  373. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  374. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  375. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  376. package/lib/store/sessions/sessionNotifications.js +35 -41
  377. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  378. package/lib/store/sessions/sessionStreamManager.js +40 -52
  379. package/lib/store/sessions/sessionStreamManager.spec.js +503 -0
  380. package/lib/store/sessions/sessions.types.spec.js +16 -0
  381. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  382. package/lib/store/useChatsStore.spec.js +619 -0
  383. package/lib/store/useFaqsStore.spec.js +57 -0
  384. package/lib/styles/cascade.js +29 -3
  385. package/lib/styles/transitions.js +3 -1
  386. package/lib/test/mockSseStream.js +121 -0
  387. package/lib/test/streamdownCodeMock.js +6 -0
  388. package/lib/test/streamdownMock.js +12 -0
  389. package/lib/types/agentModal.js +1 -1
  390. package/lib/types/global.d.js +1 -1
  391. package/lib/utils/actionCategoryMap.spec.js +18 -0
  392. package/lib/utils/agentDisplayName.spec.js +44 -0
  393. package/lib/utils/autoApproveStorage.spec.js +25 -0
  394. package/lib/utils/chatInputFiles.spec.js +39 -0
  395. package/lib/utils/contextMentionIcons.spec.js +41 -0
  396. package/lib/utils/contextMentionLabel.spec.js +13 -0
  397. package/lib/utils/contextMentionTriggers.spec.js +38 -0
  398. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  399. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  400. package/lib/utils/entityLinkRender.spec.js +72 -0
  401. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  402. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  403. package/lib/utils/formatUnreadCount.spec.js +12 -0
  404. package/lib/utils/getUnitFileSize.spec.js +18 -0
  405. package/lib/utils/hitlAnalytics.spec.js +100 -0
  406. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  407. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  408. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  409. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  410. package/lib/utils/imagePreprocessor.js +12 -37
  411. package/lib/utils/imagePreprocessor.spec.js +112 -0
  412. package/lib/utils/maiaPageRoute.js +24 -0
  413. package/lib/utils/maiaPageRoute.spec.js +23 -0
  414. package/lib/utils/mapBackendLang.spec.js +19 -0
  415. package/lib/utils/navigateContextEntity.spec.js +50 -0
  416. package/lib/utils/normalizeAgentConnectors.spec.js +107 -0
  417. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  418. package/lib/utils/reasoningMappers.spec.js +103 -0
  419. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  420. package/lib/utils/renderContextMentions.spec.js +158 -0
  421. package/lib/utils/retryCompletion.spec.js +99 -0
  422. package/lib/utils/skillContentSize.spec.js +13 -0
  423. package/lib/utils/slashCommandMarker.spec.js +43 -0
  424. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  425. package/lib/utils/sseStreamContent.spec.js +31 -0
  426. package/lib/utils/streamActivityMessages.js +32 -19
  427. package/lib/utils/streamActivityMessages.spec.js +229 -0
  428. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  429. package/package.json +1 -1
  430. package/README.md +0 -2
@@ -0,0 +1,143 @@
1
+ import { detectCharTrigger, detectMentionTrigger } from './useContextMentions.helpers';
2
+ var mountEditor = function mountEditor(text, caret) {
3
+ var editor = document.createElement('div');
4
+ var textNode = document.createTextNode(text);
5
+ editor.appendChild(textNode);
6
+ document.body.appendChild(editor);
7
+ var range = document.createRange();
8
+ range.setStart(textNode, caret);
9
+ range.collapse(true);
10
+ var selection = window.getSelection();
11
+ selection === null || selection === void 0 || selection.removeAllRanges();
12
+ selection === null || selection === void 0 || selection.addRange(range);
13
+ return {
14
+ editor: editor,
15
+ textNode: textNode,
16
+ cleanup: function cleanup() {
17
+ return editor.remove();
18
+ }
19
+ };
20
+ };
21
+ describe('useContextMentions.helpers', function () {
22
+ afterEach(function () {
23
+ document.body.innerHTML = '';
24
+ });
25
+ describe('detectMentionTrigger', function () {
26
+ it('detects a simple @ query', function () {
27
+ var _window$getSelection;
28
+ var _mountEditor = mountEditor('Hola @ana', 9),
29
+ editor = _mountEditor.editor,
30
+ cleanup = _mountEditor.cleanup;
31
+ var range = (_window$getSelection = window.getSelection()) === null || _window$getSelection === void 0 ? void 0 : _window$getSelection.getRangeAt(0);
32
+ expect(detectMentionTrigger(editor, range)).toMatchObject({
33
+ active: true,
34
+ query: 'ana',
35
+ atRunLength: 1
36
+ });
37
+ cleanup();
38
+ });
39
+ it('detects @@ tab overflow in query', function () {
40
+ var _window$getSelection2;
41
+ var _mountEditor2 = mountEditor('@@juan', 6),
42
+ editor = _mountEditor2.editor,
43
+ cleanup = _mountEditor2.cleanup;
44
+ var range = (_window$getSelection2 = window.getSelection()) === null || _window$getSelection2 === void 0 ? void 0 : _window$getSelection2.getRangeAt(0);
45
+ expect(detectMentionTrigger(editor, range)).toMatchObject({
46
+ active: true,
47
+ query: 'juan',
48
+ atRunLength: 2
49
+ });
50
+ cleanup();
51
+ });
52
+ it('ignores email-like boundaries', function () {
53
+ var _window$getSelection3;
54
+ var _mountEditor3 = mountEditor('mail@corp.com', 13),
55
+ editor = _mountEditor3.editor,
56
+ cleanup = _mountEditor3.cleanup;
57
+ var range = (_window$getSelection3 = window.getSelection()) === null || _window$getSelection3 === void 0 ? void 0 : _window$getSelection3.getRangeAt(0);
58
+ expect(detectMentionTrigger(editor, range)).toMatchObject({
59
+ active: false
60
+ });
61
+ cleanup();
62
+ });
63
+ it('detects @/ skill triggers with negative atRunLength', function () {
64
+ var _window$getSelection4;
65
+ var _mountEditor4 = mountEditor('@/resu', 6),
66
+ editor = _mountEditor4.editor,
67
+ cleanup = _mountEditor4.cleanup;
68
+ var range = (_window$getSelection4 = window.getSelection()) === null || _window$getSelection4 === void 0 ? void 0 : _window$getSelection4.getRangeAt(0);
69
+ expect(detectMentionTrigger(editor, range)).toMatchObject({
70
+ active: true,
71
+ query: 'resu',
72
+ atRunLength: -1
73
+ });
74
+ cleanup();
75
+ });
76
+ it('rejects queries with double spaces or newlines', function () {
77
+ var _window$getSelection5, _window$getSelection6;
78
+ var doubleSpace = mountEditor('@a b', 5);
79
+ expect(detectMentionTrigger(doubleSpace.editor, (_window$getSelection5 = window.getSelection()) === null || _window$getSelection5 === void 0 ? void 0 : _window$getSelection5.getRangeAt(0))).toMatchObject({
80
+ active: false
81
+ });
82
+ doubleSpace.cleanup();
83
+ var newline = mountEditor('@a\nb', 4);
84
+ expect(detectMentionTrigger(newline.editor, (_window$getSelection6 = window.getSelection()) === null || _window$getSelection6 === void 0 ? void 0 : _window$getSelection6.getRangeAt(0))).toMatchObject({
85
+ active: false
86
+ });
87
+ newline.cleanup();
88
+ });
89
+ it('returns inactive when the range is outside the editor', function () {
90
+ var _mountEditor5 = mountEditor('@ana', 4),
91
+ editor = _mountEditor5.editor,
92
+ cleanup = _mountEditor5.cleanup;
93
+ var outside = document.createTextNode('x');
94
+ document.body.appendChild(outside);
95
+ var range = document.createRange();
96
+ range.setStart(outside, 1);
97
+ range.collapse(true);
98
+ expect(detectMentionTrigger(editor, range)).toMatchObject({
99
+ active: false
100
+ });
101
+ outside.remove();
102
+ cleanup();
103
+ });
104
+ });
105
+ describe('detectCharTrigger', function () {
106
+ it('detects slash commands', function () {
107
+ var _window$getSelection7;
108
+ var _mountEditor6 = mountEditor('/resu', 5),
109
+ editor = _mountEditor6.editor,
110
+ cleanup = _mountEditor6.cleanup;
111
+ var range = (_window$getSelection7 = window.getSelection()) === null || _window$getSelection7 === void 0 ? void 0 : _window$getSelection7.getRangeAt(0);
112
+ expect(detectCharTrigger(editor, range, '/')).toMatchObject({
113
+ active: true,
114
+ query: 'resu'
115
+ });
116
+ cleanup();
117
+ });
118
+ it('detects hash skill triggers', function () {
119
+ var _window$getSelection8;
120
+ var _mountEditor7 = mountEditor('#skill', 6),
121
+ editor = _mountEditor7.editor,
122
+ cleanup = _mountEditor7.cleanup;
123
+ var range = (_window$getSelection8 = window.getSelection()) === null || _window$getSelection8 === void 0 ? void 0 : _window$getSelection8.getRangeAt(0);
124
+ expect(detectCharTrigger(editor, range, '#')).toMatchObject({
125
+ active: true,
126
+ query: 'skill'
127
+ });
128
+ cleanup();
129
+ });
130
+ it('rejects slash queries with double spaces', function () {
131
+ var _window$getSelection9;
132
+ var _mountEditor8 = mountEditor('/a b', 5),
133
+ editor = _mountEditor8.editor,
134
+ cleanup = _mountEditor8.cleanup;
135
+ var range = (_window$getSelection9 = window.getSelection()) === null || _window$getSelection9 === void 0 ? void 0 : _window$getSelection9.getRangeAt(0);
136
+ expect(detectCharTrigger(editor, range, '/')).toMatchObject({
137
+ active: false
138
+ });
139
+ cleanup();
140
+ });
141
+ });
142
+ });
143
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXRlY3RDaGFyVHJpZ2dlciIsImRldGVjdE1lbnRpb25UcmlnZ2VyIiwibW91bnRFZGl0b3IiLCJ0ZXh0IiwiY2FyZXQiLCJlZGl0b3IiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwiYXBwZW5kQ2hpbGQiLCJib2R5IiwicmFuZ2UiLCJjcmVhdGVSYW5nZSIsInNldFN0YXJ0IiwiY29sbGFwc2UiLCJzZWxlY3Rpb24iLCJ3aW5kb3ciLCJnZXRTZWxlY3Rpb24iLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsImNsZWFudXAiLCJyZW1vdmUiLCJkZXNjcmliZSIsImFmdGVyRWFjaCIsImlubmVySFRNTCIsIml0IiwiX3dpbmRvdyRnZXRTZWxlY3Rpb24iLCJfbW91bnRFZGl0b3IiLCJnZXRSYW5nZUF0IiwiZXhwZWN0IiwidG9NYXRjaE9iamVjdCIsImFjdGl2ZSIsInF1ZXJ5IiwiYXRSdW5MZW5ndGgiLCJfd2luZG93JGdldFNlbGVjdGlvbjIiLCJfbW91bnRFZGl0b3IyIiwiX3dpbmRvdyRnZXRTZWxlY3Rpb24zIiwiX21vdW50RWRpdG9yMyIsIl93aW5kb3ckZ2V0U2VsZWN0aW9uNCIsIl9tb3VudEVkaXRvcjQiLCJfd2luZG93JGdldFNlbGVjdGlvbjUiLCJfd2luZG93JGdldFNlbGVjdGlvbjYiLCJkb3VibGVTcGFjZSIsIm5ld2xpbmUiLCJfbW91bnRFZGl0b3I1Iiwib3V0c2lkZSIsIl93aW5kb3ckZ2V0U2VsZWN0aW9uNyIsIl9tb3VudEVkaXRvcjYiLCJfd2luZG93JGdldFNlbGVjdGlvbjgiLCJfbW91bnRFZGl0b3I3IiwiX3dpbmRvdyRnZXRTZWxlY3Rpb245IiwiX21vdW50RWRpdG9yOCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDb250ZXh0TWVudGlvbnMuaGVscGVycy5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRldGVjdENoYXJUcmlnZ2VyLCBkZXRlY3RNZW50aW9uVHJpZ2dlciB9IGZyb20gJy4vdXNlQ29udGV4dE1lbnRpb25zLmhlbHBlcnMnXG5cbmNvbnN0IG1vdW50RWRpdG9yID0gKHRleHQ6IHN0cmluZywgY2FyZXQ6IG51bWJlcikgPT4ge1xuICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpXG4gIGVkaXRvci5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSlcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlZGl0b3IpXG5cbiAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gIHJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCBjYXJldClcbiAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSlcblxuICByZXR1cm4geyBlZGl0b3IsIHRleHROb2RlLCBjbGVhbnVwOiAoKSA9PiBlZGl0b3IucmVtb3ZlKCkgfVxufVxuXG5kZXNjcmliZSgndXNlQ29udGV4dE1lbnRpb25zLmhlbHBlcnMnLCAoKSA9PiB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJ1xuICB9KVxuXG4gIGRlc2NyaWJlKCdkZXRlY3RNZW50aW9uVHJpZ2dlcicsICgpID0+IHtcbiAgICBpdCgnZGV0ZWN0cyBhIHNpbXBsZSBAIHF1ZXJ5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBlZGl0b3IsIGNsZWFudXAgfSA9IG1vdW50RWRpdG9yKCdIb2xhIEBhbmEnLCA5KVxuICAgICAgY29uc3QgcmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCkgYXMgUmFuZ2VcblxuICAgICAgZXhwZWN0KGRldGVjdE1lbnRpb25UcmlnZ2VyKGVkaXRvciwgcmFuZ2UpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICBxdWVyeTogJ2FuYScsXG4gICAgICAgIGF0UnVuTGVuZ3RoOiAxLFxuICAgICAgfSlcblxuICAgICAgY2xlYW51cCgpXG4gICAgfSlcblxuICAgIGl0KCdkZXRlY3RzIEBAIHRhYiBvdmVyZmxvdyBpbiBxdWVyeScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZWRpdG9yLCBjbGVhbnVwIH0gPSBtb3VudEVkaXRvcignQEBqdWFuJywgNilcbiAgICAgIGNvbnN0IHJhbmdlID0gd2luZG93LmdldFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApIGFzIFJhbmdlXG5cbiAgICAgIGV4cGVjdChkZXRlY3RNZW50aW9uVHJpZ2dlcihlZGl0b3IsIHJhbmdlKSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgcXVlcnk6ICdqdWFuJyxcbiAgICAgICAgYXRSdW5MZW5ndGg6IDIsXG4gICAgICB9KVxuXG4gICAgICBjbGVhbnVwKClcbiAgICB9KVxuXG4gICAgaXQoJ2lnbm9yZXMgZW1haWwtbGlrZSBib3VuZGFyaWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBlZGl0b3IsIGNsZWFudXAgfSA9IG1vdW50RWRpdG9yKCdtYWlsQGNvcnAuY29tJywgMTMpXG4gICAgICBjb25zdCByYW5nZSA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8uZ2V0UmFuZ2VBdCgwKSBhcyBSYW5nZVxuXG4gICAgICBleHBlY3QoZGV0ZWN0TWVudGlvblRyaWdnZXIoZWRpdG9yLCByYW5nZSkpLnRvTWF0Y2hPYmplY3QoeyBhY3RpdmU6IGZhbHNlIH0pXG5cbiAgICAgIGNsZWFudXAoKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyBALyBza2lsbCB0cmlnZ2VycyB3aXRoIG5lZ2F0aXZlIGF0UnVuTGVuZ3RoJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBlZGl0b3IsIGNsZWFudXAgfSA9IG1vdW50RWRpdG9yKCdAL3Jlc3UnLCA2KVxuICAgICAgY29uc3QgcmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCkgYXMgUmFuZ2VcblxuICAgICAgZXhwZWN0KGRldGVjdE1lbnRpb25UcmlnZ2VyKGVkaXRvciwgcmFuZ2UpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICBxdWVyeTogJ3Jlc3UnLFxuICAgICAgICBhdFJ1bkxlbmd0aDogLTEsXG4gICAgICB9KVxuXG4gICAgICBjbGVhbnVwKClcbiAgICB9KVxuXG4gICAgaXQoJ3JlamVjdHMgcXVlcmllcyB3aXRoIGRvdWJsZSBzcGFjZXMgb3IgbmV3bGluZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkb3VibGVTcGFjZSA9IG1vdW50RWRpdG9yKCdAYSAgYicsIDUpXG4gICAgICBleHBlY3QoZGV0ZWN0TWVudGlvblRyaWdnZXIoZG91YmxlU3BhY2UuZWRpdG9yLCB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCkgYXMgUmFuZ2UpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBkb3VibGVTcGFjZS5jbGVhbnVwKClcblxuICAgICAgY29uc3QgbmV3bGluZSA9IG1vdW50RWRpdG9yKCdAYVxcbmInLCA0KVxuICAgICAgZXhwZWN0KGRldGVjdE1lbnRpb25UcmlnZ2VyKG5ld2xpbmUuZWRpdG9yLCB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCkgYXMgUmFuZ2UpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBuZXdsaW5lLmNsZWFudXAoKVxuICAgIH0pXG5cbiAgICBpdCgncmV0dXJucyBpbmFjdGl2ZSB3aGVuIHRoZSByYW5nZSBpcyBvdXRzaWRlIHRoZSBlZGl0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGVkaXRvciwgY2xlYW51cCB9ID0gbW91bnRFZGl0b3IoJ0BhbmEnLCA0KVxuICAgICAgY29uc3Qgb3V0c2lkZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCd4JylcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0c2lkZSlcbiAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgcmFuZ2Uuc2V0U3RhcnQob3V0c2lkZSwgMSlcbiAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgIGV4cGVjdChkZXRlY3RNZW50aW9uVHJpZ2dlcihlZGl0b3IsIHJhbmdlKSkudG9NYXRjaE9iamVjdCh7IGFjdGl2ZTogZmFsc2UgfSlcblxuICAgICAgb3V0c2lkZS5yZW1vdmUoKVxuICAgICAgY2xlYW51cCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnZGV0ZWN0Q2hhclRyaWdnZXInLCAoKSA9PiB7XG4gICAgaXQoJ2RldGVjdHMgc2xhc2ggY29tbWFuZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGVkaXRvciwgY2xlYW51cCB9ID0gbW91bnRFZGl0b3IoJy9yZXN1JywgNSlcbiAgICAgIGNvbnN0IHJhbmdlID0gd2luZG93LmdldFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApIGFzIFJhbmdlXG5cbiAgICAgIGV4cGVjdChkZXRlY3RDaGFyVHJpZ2dlcihlZGl0b3IsIHJhbmdlLCAnLycpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICBxdWVyeTogJ3Jlc3UnLFxuICAgICAgfSlcblxuICAgICAgY2xlYW51cCgpXG4gICAgfSlcblxuICAgIGl0KCdkZXRlY3RzIGhhc2ggc2tpbGwgdHJpZ2dlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGVkaXRvciwgY2xlYW51cCB9ID0gbW91bnRFZGl0b3IoJyNza2lsbCcsIDYpXG4gICAgICBjb25zdCByYW5nZSA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8uZ2V0UmFuZ2VBdCgwKSBhcyBSYW5nZVxuXG4gICAgICBleHBlY3QoZGV0ZWN0Q2hhclRyaWdnZXIoZWRpdG9yLCByYW5nZSwgJyMnKSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgcXVlcnk6ICdza2lsbCcsXG4gICAgICB9KVxuXG4gICAgICBjbGVhbnVwKClcbiAgICB9KVxuXG4gICAgaXQoJ3JlamVjdHMgc2xhc2ggcXVlcmllcyB3aXRoIGRvdWJsZSBzcGFjZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGVkaXRvciwgY2xlYW51cCB9ID0gbW91bnRFZGl0b3IoJy9hICBiJywgNSlcbiAgICAgIGNvbnN0IHJhbmdlID0gd2luZG93LmdldFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApIGFzIFJhbmdlXG5cbiAgICAgIGV4cGVjdChkZXRlY3RDaGFyVHJpZ2dlcihlZGl0b3IsIHJhbmdlLCAnLycpKS50b01hdGNoT2JqZWN0KHsgYWN0aXZlOiBmYWxzZSB9KVxuXG4gICAgICBjbGVhbnVwKClcbiAgICB9KVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsaUJBQWlCLEVBQUVDLG9CQUFvQixRQUFRLDhCQUE4QjtBQUV0RixJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBSUMsSUFBWSxFQUFFQyxLQUFhLEVBQUs7RUFDbkQsSUFBTUMsTUFBTSxHQUFHQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxLQUFLLENBQUM7RUFDNUMsSUFBTUMsUUFBUSxHQUFHRixRQUFRLENBQUNHLGNBQWMsQ0FBQ04sSUFBSSxDQUFDO0VBQzlDRSxNQUFNLENBQUNLLFdBQVcsQ0FBQ0YsUUFBUSxDQUFDO0VBQzVCRixRQUFRLENBQUNLLElBQUksQ0FBQ0QsV0FBVyxDQUFDTCxNQUFNLENBQUM7RUFFakMsSUFBTU8sS0FBSyxHQUFHTixRQUFRLENBQUNPLFdBQVcsQ0FBQyxDQUFDO0VBQ3BD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
@@ -2,168 +2,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import { useCallback, useRef, useState } from 'react';
3
3
  import { serializeMention } from '../utils/renderContextMentions';
4
4
  import { serializeSlashCommand } from '../utils/slashCommandMarker';
5
-
6
- /** Trigger `#` que abre el listado de skills. Misma forma que el de slash. */
7
-
8
- /**
9
- * Inspecciona la selección actual. Formato: [límite de palabra] @+ query hasta el caret.
10
- * Permite espacios simples dentro del query (p. ej. "@Juan Perez") y cierra
11
- * el trigger cuando detecta dos espacios consecutivos.
12
- * La tab objetivo es la que corresponde al número de `@` (1 = primera tab visible, etc.).
13
- */
14
- var detectMentionTrigger = function detectMentionTrigger(editorEl, range) {
15
- if (!editorEl || !editorEl.contains(range.startContainer)) {
16
- return {
17
- active: false,
18
- query: '',
19
- atRunLength: 0,
20
- anchor: null
21
- };
22
- }
23
- var node = range.startContainer;
24
- if (node.nodeType !== Node.TEXT_NODE) {
25
- return {
26
- active: false,
27
- query: '',
28
- atRunLength: 0,
29
- anchor: null
30
- };
31
- }
32
- var text = node.data;
33
- var caret = range.startOffset;
34
- var i = caret - 1;
35
- if (i < 0) {
36
- return {
37
- active: false,
38
- query: '',
39
- atRunLength: 0,
40
- anchor: null
41
- };
42
- }
43
- while (i >= 0 && text[i] !== '@') i -= 1;
44
- if (i < 0 || text[i] !== '@') {
45
- return {
46
- active: false,
47
- query: '',
48
- atRunLength: 0,
49
- anchor: null
50
- };
51
- }
52
- var runEnd = i;
53
- while (i >= 0 && text[i] === '@') {
54
- i -= 1;
55
- }
56
- var runStart = i + 1;
57
- var atRunLength = runEnd - runStart + 1;
58
- var prev = runStart > 0 ? text.charAt(runStart - 1) : '';
59
- var isBoundary = !prev || /[\s([{]/.test(prev);
60
- if (!isBoundary) {
61
- return {
62
- active: false,
63
- query: '',
64
- atRunLength: 0,
65
- anchor: null
66
- };
67
- }
68
- var hasSlashSuffix = text[runEnd + 1] === '/';
69
- var queryStart = hasSlashSuffix ? runEnd + 2 : runEnd + 1;
70
- var query = text.slice(queryStart, caret);
71
- if (/\n|\r/.test(query)) {
72
- return {
73
- active: false,
74
- query: '',
75
- atRunLength: 0,
76
- anchor: null
77
- };
78
- }
79
- if (query.includes(' ')) {
80
- return {
81
- active: false,
82
- query: '',
83
- atRunLength: 0,
84
- anchor: null
85
- };
86
- }
87
- return {
88
- active: true,
89
- query: query,
90
- atRunLength: hasSlashSuffix ? -atRunLength : atRunLength,
91
- anchor: {
92
- node: node,
93
- offset: runStart
94
- }
95
- };
96
- };
97
-
98
- /** Detecta un trigger de un solo caracter (`/` o `#`) en límite de palabra, con query hasta el caret. */
99
- var detectCharTrigger = function detectCharTrigger(editorEl, range, _char) {
100
- if (!editorEl || !editorEl.contains(range.startContainer)) {
101
- return {
102
- active: false,
103
- query: '',
104
- anchor: null
105
- };
106
- }
107
- var node = range.startContainer;
108
- if (node.nodeType !== Node.TEXT_NODE) {
109
- return {
110
- active: false,
111
- query: '',
112
- anchor: null
113
- };
114
- }
115
- var text = node.data;
116
- var caret = range.startOffset;
117
- var i = caret - 1;
118
- if (i < 0) {
119
- return {
120
- active: false,
121
- query: '',
122
- anchor: null
123
- };
124
- }
125
- while (i >= 0 && text[i] !== _char) i -= 1;
126
- if (i < 0 || text[i] !== _char) {
127
- return {
128
- active: false,
129
- query: '',
130
- anchor: null
131
- };
132
- }
133
- var triggerIndex = i;
134
- var prev = triggerIndex > 0 ? text.charAt(triggerIndex - 1) : '';
135
- var isBoundary = !prev || /[\s([{]/.test(prev);
136
- if (!isBoundary) {
137
- return {
138
- active: false,
139
- query: '',
140
- anchor: null
141
- };
142
- }
143
- var query = text.slice(triggerIndex + 1, caret);
144
- if (/\n|\r/.test(query)) {
145
- return {
146
- active: false,
147
- query: '',
148
- anchor: null
149
- };
150
- }
151
- if (query.includes(' ')) {
152
- return {
153
- active: false,
154
- query: '',
155
- anchor: null
156
- };
157
- }
158
- return {
159
- active: true,
160
- query: query,
161
- anchor: {
162
- node: node,
163
- offset: triggerIndex
164
- }
165
- };
166
- };
5
+ import { detectCharTrigger, detectMentionTrigger } from './useContextMentions.helpers';
167
6
  export var useContextMentions = function useContextMentions() {
168
7
  var editorRef = useRef(null);
169
8
  var _useState = useState({
@@ -500,4 +339,4 @@ export var useContextMentions = function useContextMentions() {
500
339
  focus: focus
501
340
  };
502
341
  };
503
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZVN0YXRlIiwic2VyaWFsaXplTWVudGlvbiIsInNlcmlhbGl6ZVNsYXNoQ29tbWFuZCIsImRldGVjdE1lbnRpb25UcmlnZ2VyIiwiZWRpdG9yRWwiLCJyYW5nZSIsImNvbnRhaW5zIiwic3RhcnRDb250YWluZXIiLCJhY3RpdmUiLCJxdWVyeSIsImF0UnVuTGVuZ3RoIiwiYW5jaG9yIiwibm9kZSIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInRleHQiLCJkYXRhIiwiY2FyZXQiLCJzdGFydE9mZnNldCIsImkiLCJydW5FbmQiLCJydW5TdGFydCIsInByZXYiLCJjaGFyQXQiLCJpc0JvdW5kYXJ5IiwidGVzdCIsImhhc1NsYXNoU3VmZml4IiwicXVlcnlTdGFydCIsInNsaWNlIiwiaW5jbHVkZXMiLCJvZmZzZXQiLCJkZXRlY3RDaGFyVHJpZ2dlciIsImNoYXIiLCJ0cmlnZ2VySW5kZXgiLCJ1c2VDb250ZXh0TWVudGlvbnMiLCJlZGl0b3JSZWYiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJ0cmlnZ2VyIiwic2V0VHJpZ2dlciIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0Iiwic2xhc2hUcmlnZ2VyIiwic2V0U2xhc2hUcmlnZ2VyIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJoYXNoVHJpZ2dlciIsInNldEhhc2hUcmlnZ2VyIiwiZGV0ZWN0VHJpZ2dlciIsInNlbGVjdGlvbiIsIndpbmRvdyIsImdldFNlbGVjdGlvbiIsInJhbmdlQ291bnQiLCJjdXJyZW50IiwiZ2V0UmFuZ2VBdCIsImRldGVjdFNsYXNoIiwiZGV0ZWN0SGFzaCIsInVwZGF0ZVRyaWdnZXIiLCJuZXh0IiwiY2xvc2VUcmlnZ2VyIiwidXBkYXRlU2xhc2hUcmlnZ2VyIiwiY2xvc2VTbGFzaFRyaWdnZXIiLCJ1cGRhdGVIYXNoVHJpZ2dlciIsImNsb3NlSGFzaFRyaWdnZXIiLCJzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoIiwibmV4dEF0UnVuTGVuZ3RoIiwibmV4dEhhc1NsYXNoIiwic2FmZU5leHQiLCJNYXRoIiwibWF4IiwiZmxvb3IiLCJhYnMiLCJfY3VycmVudCRhbmNob3IiLCJ0ZXh0Tm9kZSIsImZ1bGwiLCJjdXJyZW50UnVuTGVuIiwiY3VycmVudEhhc1NsYXNoIiwicXVlcnlMZW4iLCJsZW5ndGgiLCJiZWZvcmUiLCJhZnRlciIsIm5leHRSdW4iLCJjb25jYXQiLCJyZXBlYXQiLCJjbGVhblF1ZXJ5Iiwic3RhcnRzV2l0aCIsIm5leHRWYWx1ZSIsImRvY3VtZW50IiwiY3JlYXRlUmFuZ2UiLCJjYXJldE9mZnNldCIsInNldFN0YXJ0IiwibWluIiwiY29sbGFwc2UiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInVwZGF0ZWQiLCJyZXBsYWNlVHJpZ2dlcldpdGhDaGlwIiwiY2hpcE5vZGUiLCJtZW50aW9uIiwiX2N1cnJlbnQkYW5jaG9yMiIsInNldEF0dHJpYnV0ZSIsIlN0cmluZyIsImlkIiwidHlwZSIsImxhYmVsIiwicGFyZW50IiwicGFyZW50Tm9kZSIsInNwYWNlTm9kZSIsImNyZWF0ZVRleHROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJyZW1vdmUiLCJyZXBsYWNlVHJpZ2dlcldpdGhTbGFzaENoaXAiLCJzbGFzaENvbW1hbmQiLCJfY3VycmVudCRhbmNob3IzIiwidHJpZ2dlckxlbiIsInJlcGxhY2VUcmlnZ2VyV2l0aFNraWxsQ2hpcCIsIl9jdXJyZW50JGFuY2hvcjQiLCJzZXJpYWxpemUiLCJlbCIsIm1lbnRpb25zIiwic2xhc2hDb21tYW5kcyIsIndhbGsiLCJFTEVNRU5UX05PREUiLCJfZWxOb2RlJGRhdGFzZXQiLCJfZWxOb2RlJGRhdGFzZXQyIiwiZWxOb2RlIiwiZGF0YXNldCIsIl9lbE5vZGUkZGF0YXNldCRtZW50aSIsIl9yZWYiLCJfcmVmMiIsIl9lbE5vZGUkZGF0YXNldCRtZW50aTIiLCJtZW50aW9uSWQiLCJtZW50aW9uVHlwZSIsIm1lbnRpb25MYWJlbCIsInRleHRDb250ZW50IiwicHVzaCIsIl9lbE5vZGUkZGF0YXNldCRzbGFzaCIsIl9yZWYzIiwiX2VsTm9kZSRkYXRhc2V0JHNsYXNoMiIsIl9lbE5vZGUkdGV4dENvbnRlbnQiLCJzbGFzaCIsInNsYXNoSWQiLCJzbGFzaExhYmVsIiwicmVwbGFjZSIsInRhZ05hbWUiLCJjaGlsZE5vZGVzIiwiZm9yRWFjaCIsImNsZWFyIiwiaW5uZXJIVE1MIiwiZm9jdXMiLCJfZWRpdG9yUmVmJGN1cnJlbnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXNlQ29udGV4dE1lbnRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgc2VyaWFsaXplTWVudGlvbiB9IGZyb20gJy4uL3V0aWxzL3JlbmRlckNvbnRleHRNZW50aW9ucydcbmltcG9ydCB7IHNlcmlhbGl6ZVNsYXNoQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NsYXNoQ29tbWFuZE1hcmtlcidcbmltcG9ydCB0eXBlIHsgU2xhc2hDb21tYW5kQ2hpcERhdGEgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL1NsYXNoQ29tbWFuZENoaXAvYnVpbGRTbGFzaENoaXBFbGVtZW50J1xuXG5leHBvcnQgdHlwZSBNZW50aW9uVHJpZ2dlclN0YXRlID0ge1xuICBhY3RpdmU6IGJvb2xlYW5cbiAgcXVlcnk6IHN0cmluZ1xuICAvKiogQ2FudGlkYWQgZGUgYEBgIGNvbnNlY3V0aXZvcyBkZWwgdHJpZ2dlciAoYEBgIOKGkiAxLCBgQEBgIOKGkiAyKS4gTWFwZWEgYSBsYSB0YWIgZW4gb3JkZW4uICovXG4gIGF0UnVuTGVuZ3RoOiBudW1iZXJcbiAgLyoqIFBvc2ljacOzbiBkZWwgcHJpbWVyIGBAYCBkZWwgcnVuIChyZWVtcGxhem8gZGVsIGNoaXApLiAqL1xuICBhbmNob3I6IHsgbm9kZTogTm9kZTsgb2Zmc2V0OiBudW1iZXIgfSB8IG51bGxcbn1cblxuZXhwb3J0IHR5cGUgU2xhc2hUcmlnZ2VyU3RhdGUgPSB7XG4gIGFjdGl2ZTogYm9vbGVhblxuICBxdWVyeTogc3RyaW5nXG4gIGFuY2hvcjogeyBub2RlOiBOb2RlOyBvZmZzZXQ6IG51bWJlciB9IHwgbnVsbFxufVxuXG4vKiogVHJpZ2dlciBgI2AgcXVlIGFicmUgZWwgbGlzdGFkbyBkZSBza2lsbHMuIE1pc21hIGZvcm1hIHF1ZSBlbCBkZSBzbGFzaC4gKi9cbmV4cG9ydCB0eXBlIEhhc2hUcmlnZ2VyU3RhdGUgPSBTbGFzaFRyaWdnZXJTdGF0ZVxuXG4vKipcbiAqIEluc3BlY2Npb25hIGxhIHNlbGVjY2nDs24gYWN0dWFsLiBGb3JtYXRvOiBbbMOtbWl0ZSBkZSBwYWxhYnJhXSBAKyBxdWVyeSBoYXN0YSBlbCBjYXJldC5cbiAqIFBlcm1pdGUgZXNwYWNpb3Mgc2ltcGxlcyBkZW50cm8gZGVsIHF1ZXJ5IChwLiBlai4gXCJASnVhbiBQZXJlelwiKSB5IGNpZXJyYVxuICogZWwgdHJpZ2dlciBjdWFuZG8gZGV0ZWN0YSBkb3MgZXNwYWNpb3MgY29uc2VjdXRpdm9zLlxuICogTGEgdGFiIG9iamV0aXZvIGVzIGxhIHF1ZSBjb3JyZXNwb25kZSBhbCBuw7ptZXJvIGRlIGBAYCAoMSA9IHByaW1lcmEgdGFiIHZpc2libGUsIGV0Yy4pLlxuICovXG5jb25zdCBkZXRlY3RNZW50aW9uVHJpZ2dlciA9IChlZGl0b3JFbDogSFRNTEVsZW1lbnQgfCBudWxsLCByYW5nZTogUmFuZ2UpOiBNZW50aW9uVHJpZ2dlclN0YXRlID0+IHtcbiAgaWYgKCFlZGl0b3JFbCB8fCAhZWRpdG9yRWwuY29udGFpbnMocmFuZ2Uuc3RhcnRDb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCBub2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXJcbiAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCB0ZXh0ID0gKG5vZGUgYXMgVGV4dCkuZGF0YVxuICBjb25zdCBjYXJldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG4gIGxldCBpID0gY2FyZXQgLSAxXG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICB3aGlsZSAoaSA+PSAwICYmIHRleHRbaV0gIT09ICdAJykgaSAtPSAxXG4gIGlmIChpIDwgMCB8fCB0ZXh0W2ldICE9PSAnQCcpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgY29uc3QgcnVuRW5kID0gaVxuICB3aGlsZSAoaSA+PSAwICYmIHRleHRbaV0gPT09ICdAJykge1xuICAgIGkgLT0gMVxuICB9XG4gIGNvbnN0IHJ1blN0YXJ0ID0gaSArIDFcbiAgY29uc3QgYXRSdW5MZW5ndGggPSBydW5FbmQgLSBydW5TdGFydCArIDFcbiAgY29uc3QgcHJldiA9IHJ1blN0YXJ0ID4gMCA/IHRleHQuY2hhckF0KHJ1blN0YXJ0IC0gMSkgOiAnJ1xuICBjb25zdCBpc0JvdW5kYXJ5ID0gIXByZXYgfHwgL1tcXHMoW3tdLy50ZXN0KHByZXYpXG4gIGlmICghaXNCb3VuZGFyeSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICBjb25zdCBoYXNTbGFzaFN1ZmZpeCA9IHRleHRbcnVuRW5kICsgMV0gPT09ICcvJ1xuICBjb25zdCBxdWVyeVN0YXJ0ID0gaGFzU2xhc2hTdWZmaXggPyBydW5FbmQgKyAyIDogcnVuRW5kICsgMVxuICBjb25zdCBxdWVyeSA9IHRleHQuc2xpY2UocXVlcnlTdGFydCwgY2FyZXQpXG4gIGlmICgvXFxufFxcci8udGVzdChxdWVyeSkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICB9XG4gIGlmIChxdWVyeS5pbmNsdWRlcygnICAnKSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICBxdWVyeSxcbiAgICBhdFJ1bkxlbmd0aDogaGFzU2xhc2hTdWZmaXggPyAtYXRSdW5MZW5ndGggOiBhdFJ1bkxlbmd0aCxcbiAgICBhbmNob3I6IHsgbm9kZSwgb2Zmc2V0OiBydW5TdGFydCB9LFxuICB9XG59XG5cbi8qKiBEZXRlY3RhIHVuIHRyaWdnZXIgZGUgdW4gc29sbyBjYXJhY3RlciAoYC9gIG8gYCNgKSBlbiBsw61taXRlIGRlIHBhbGFicmEsIGNvbiBxdWVyeSBoYXN0YSBlbCBjYXJldC4gKi9cbmNvbnN0IGRldGVjdENoYXJUcmlnZ2VyID0gKGVkaXRvckVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHJhbmdlOiBSYW5nZSwgY2hhcjogc3RyaW5nKTogU2xhc2hUcmlnZ2VyU3RhdGUgPT4ge1xuICBpZiAoIWVkaXRvckVsIHx8ICFlZGl0b3JFbC5jb250YWlucyhyYW5nZS5zdGFydENvbnRhaW5lcikpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gIH1cbiAgY29uc3Qgbm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgfVxuICBjb25zdCB0ZXh0ID0gKG5vZGUgYXMgVGV4dCkuZGF0YVxuICBjb25zdCBjYXJldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG4gIGxldCBpID0gY2FyZXQgLSAxXG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgfVxuXG4gIHdoaWxlIChpID49IDAgJiYgdGV4dFtpXSAhPT0gY2hhcikgaSAtPSAxXG4gIGlmIChpIDwgMCB8fCB0ZXh0W2ldICE9PSBjaGFyKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgY29uc3QgdHJpZ2dlckluZGV4ID0gaVxuICBjb25zdCBwcmV2ID0gdHJpZ2dlckluZGV4ID4gMCA/IHRleHQuY2hhckF0KHRyaWdnZXJJbmRleCAtIDEpIDogJydcbiAgY29uc3QgaXNCb3VuZGFyeSA9ICFwcmV2IHx8IC9bXFxzKFt7XS8udGVzdChwcmV2KVxuICBpZiAoIWlzQm91bmRhcnkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gIH1cblxuICBjb25zdCBxdWVyeSA9IHRleHQuc2xpY2UodHJpZ2dlckluZGV4ICsgMSwgY2FyZXQpXG4gIGlmICgvXFxufFxcci8udGVzdChxdWVyeSkpIHtcbiAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gIH1cbiAgaWYgKHF1ZXJ5LmluY2x1ZGVzKCcgICcpKSB7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWN0aXZlOiB0cnVlLCBxdWVyeSwgYW5jaG9yOiB7IG5vZGUsIG9mZnNldDogdHJpZ2dlckluZGV4IH0gfVxufVxuXG5leHBvcnQgY29uc3QgdXNlQ29udGV4dE1lbnRpb25zID0gKCkgPT4ge1xuICBjb25zdCBlZGl0b3JSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBbdHJpZ2dlciwgc2V0VHJpZ2dlcl0gPSB1c2VTdGF0ZTxNZW50aW9uVHJpZ2dlclN0YXRlPih7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBxdWVyeTogJycsXG4gICAgYXRSdW5MZW5ndGg6IDAsXG4gICAgYW5jaG9yOiBudWxsLFxuICB9KVxuICBjb25zdCBbc2xhc2hUcmlnZ2VyLCBzZXRTbGFzaFRyaWdnZXJdID0gdXNlU3RhdGU8U2xhc2hUcmlnZ2VyU3RhdGU+KHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHF1ZXJ5OiAnJyxcbiAgICBhbmNob3I6IG51bGwsXG4gIH0pXG4gIGNvbnN0IFtoYXNoVHJpZ2dlciwgc2V0SGFzaFRyaWdnZXJdID0gdXNlU3RhdGU8SGFzaFRyaWdnZXJTdGF0ZT4oe1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgcXVlcnk6ICcnLFxuICAgIGFuY2hvcjogbnVsbCxcbiAgfSlcblxuICBjb25zdCBkZXRlY3RUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCk6IE1lbnRpb25UcmlnZ2VyU3RhdGUgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwIHx8ICFlZGl0b3JSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH1cbiAgICB9XG4gICAgcmV0dXJuIGRldGVjdE1lbnRpb25UcmlnZ2VyKGVkaXRvclJlZi5jdXJyZW50LCBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKSlcbiAgfSwgW10pXG5cbiAgY29uc3QgZGV0ZWN0U2xhc2ggPSB1c2VDYWxsYmFjaygoKTogU2xhc2hUcmlnZ2VyU3RhdGUgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwIHx8ICFlZGl0b3JSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfVxuICAgIH1cbiAgICByZXR1cm4gZGV0ZWN0Q2hhclRyaWdnZXIoZWRpdG9yUmVmLmN1cnJlbnQsIHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLCAnLycpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGRldGVjdEhhc2ggPSB1c2VDYWxsYmFjaygoKTogSGFzaFRyaWdnZXJTdGF0ZSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDAgfHwgIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gICAgfVxuICAgIHJldHVybiBkZXRlY3RDaGFyVHJpZ2dlcihlZGl0b3JSZWYuY3VycmVudCwgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCksICcjJylcbiAgfSwgW10pXG5cbiAgY29uc3QgdXBkYXRlVHJpZ2dlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gZGV0ZWN0VHJpZ2dlcigpXG4gICAgc2V0VHJpZ2dlcihuZXh0KVxuICAgIHJldHVybiBuZXh0XG4gIH0sIFtkZXRlY3RUcmlnZ2VyXSlcblxuICBjb25zdCBjbG9zZVRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0VHJpZ2dlcih7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAsIGFuY2hvcjogbnVsbCB9KVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVTbGFzaFRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IGRldGVjdFNsYXNoKClcbiAgICBzZXRTbGFzaFRyaWdnZXIobmV4dClcbiAgICByZXR1cm4gbmV4dFxuICB9LCBbZGV0ZWN0U2xhc2hdKVxuXG4gIGNvbnN0IGNsb3NlU2xhc2hUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFNsYXNoVHJpZ2dlcih7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUhhc2hUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBkZXRlY3RIYXNoKClcbiAgICBzZXRIYXNoVHJpZ2dlcihuZXh0KVxuICAgIHJldHVybiBuZXh0XG4gIH0sIFtkZXRlY3RIYXNoXSlcblxuICBjb25zdCBjbG9zZUhhc2hUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEhhc2hUcmlnZ2VyKHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfSlcbiAgfSwgW10pXG5cbiAgLyoqXG4gICAqIEFqdXN0YSBsYSBjYW50aWRhZCBkZSBgQGAgZGVsIHRyaWdnZXIgYWN0aXZvIHNpbiBwZXJkZXIgZWwgcXVlcnkgYWN0dWFsLlxuICAgKiBFai46IGBAQGFiY2AgLT4gYEBhYmNgIGFsIGNhbWJpYXIgZGUgdGFiLlxuICAgKi9cbiAgY29uc3Qgc3luY1RyaWdnZXJBdFJ1bkxlbmd0aCA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0QXRSdW5MZW5ndGg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbmV4dEhhc1NsYXNoID0gbmV4dEF0UnVuTGVuZ3RoIDwgMFxuICAgICAgY29uc3Qgc2FmZU5leHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKE1hdGguYWJzKG5leHRBdFJ1bkxlbmd0aCkpKVxuICAgICAgY29uc3QgY3VycmVudCA9IGRldGVjdFRyaWdnZXIoKVxuICAgICAgaWYgKCFjdXJyZW50LmFjdGl2ZSB8fCAhY3VycmVudC5hbmNob3IpIHJldHVyblxuXG4gICAgICBjb25zdCB7IG5vZGUsIG9mZnNldCB9ID0gY3VycmVudC5hbmNob3JcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IGN1cnJlbnRSdW5MZW4gPSBNYXRoLmFicyhjdXJyZW50LmF0UnVuTGVuZ3RoKVxuICAgICAgY29uc3QgY3VycmVudEhhc1NsYXNoID0gY3VycmVudC5hdFJ1bkxlbmd0aCA8IDBcbiAgICAgIGNvbnN0IHF1ZXJ5TGVuID0gY3VycmVudFJ1bkxlbiArIChjdXJyZW50SGFzU2xhc2ggPyAxIDogMCkgKyBjdXJyZW50LnF1ZXJ5Lmxlbmd0aFxuICAgICAgY29uc3QgYmVmb3JlID0gZnVsbC5zbGljZSgwLCBvZmZzZXQpXG4gICAgICBjb25zdCBhZnRlciA9IGZ1bGwuc2xpY2Uob2Zmc2V0ICsgcXVlcnlMZW4pXG4gICAgICBjb25zdCBuZXh0UnVuID0gbmV4dEhhc1NsYXNoID8gYCR7J0AnLnJlcGVhdChzYWZlTmV4dCl9L2AgOiAnQCcucmVwZWF0KHNhZmVOZXh0KVxuICAgICAgLy8gU2kgdmVuaW1vcyBkZWwgdGFiIHNraWxsLCBlbCBxdWVyeSB0aWVuZSAnLycgY29tbyBwcmVmaWpvIOKAlCBsaW1waWFybG8gYWwgY2FtYmlhciBkZSB0YWIuXG4gICAgICBjb25zdCBjbGVhblF1ZXJ5ID0gY3VycmVudC5xdWVyeS5zdGFydHNXaXRoKCcvJykgPyBjdXJyZW50LnF1ZXJ5LnNsaWNlKDEpIDogY3VycmVudC5xdWVyeVxuICAgICAgY29uc3QgbmV4dFZhbHVlID0gYCR7YmVmb3JlfSR7bmV4dFJ1bn0ke2NsZWFuUXVlcnl9JHthZnRlcn1gXG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgdGV4dE5vZGUuZGF0YSA9IG5leHRWYWx1ZVxuXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gYmVmb3JlLmxlbmd0aCArIG5leHRSdW4ubGVuZ3RoICsgY2xlYW5RdWVyeS5sZW5ndGhcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUsIE1hdGgubWluKGNhcmV0T2Zmc2V0LCB0ZXh0Tm9kZS5kYXRhLmxlbmd0aCkpXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICAgIHNldFRyaWdnZXIodXBkYXRlZClcbiAgICB9LFxuICAgIFtkZXRlY3RUcmlnZ2VyXVxuICApXG5cbiAgLyoqXG4gICAqIFJlZW1wbGF6YSBlbCBgQHF1ZXJ5YCBwZW5kaWVudGUgcG9yIHVuIGNoaXAgYXTDs21pY28gY29uIGxhIG1lbnRpb24uXG4gICAqIFJlcXVpZXJlIHF1ZSBlbCBjYWxsZXIgcHJvdmVhIGVsIERPTSBkZWwgY2hpcCAoc2UgaW5zZXJ0YSB0YWwgY3VhbCkuXG4gICAqL1xuICBjb25zdCByZXBsYWNlVHJpZ2dlcldpdGhDaGlwID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoaXBOb2RlOiBIVE1MRWxlbWVudCwgbWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICAgIGlmICghY3VycmVudC5hY3RpdmUgfHwgIWN1cnJlbnQuYW5jaG9yKSByZXR1cm5cblxuICAgICAgY29uc3QgeyBub2RlLCBvZmZzZXQgfSA9IGN1cnJlbnQuYW5jaG9yXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IGN1cnJlbnRSdW5MZW4gPSBNYXRoLmFicyhjdXJyZW50LmF0UnVuTGVuZ3RoKVxuICAgICAgY29uc3QgY3VycmVudEhhc1NsYXNoID0gY3VycmVudC5hdFJ1bkxlbmd0aCA8IDBcbiAgICAgIGNvbnN0IHF1ZXJ5TGVuID0gY3VycmVudFJ1bkxlbiArIChjdXJyZW50SGFzU2xhc2ggPyAxIDogMCkgKyBjdXJyZW50LnF1ZXJ5Lmxlbmd0aFxuICAgICAgY29uc3QgYWZ0ZXIgPSBmdWxsLnNsaWNlKG9mZnNldCArIHF1ZXJ5TGVuKVxuXG4gICAgICAvLyBUcnVuY2FyIGVsIHRleHRvIGhhc3RhIGFudGVzIGRlbCBydW4gZGUgYEDigKZgXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIHRleHROb2RlLmRhdGEgPSBmdWxsLnNsaWNlKDAsIG9mZnNldClcblxuICAgICAgLy8gSW5zZXJ0YXIgZWwgY2hpcCBqdXN0byBkZXNwdcOpcyBkZWwgbm9kbyBkZSB0ZXh0b1xuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24nLCAndHJ1ZScpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi1pZCcsIFN0cmluZyhtZW50aW9uLmlkKSlcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLXR5cGUnLCBtZW50aW9uLnR5cGUpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi1sYWJlbCcsIG1lbnRpb24ubGFiZWwpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpXG5cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRleHROb2RlLnBhcmVudE5vZGVcbiAgICAgIGlmICghcGFyZW50KSByZXR1cm5cblxuICAgICAgY29uc3Qgc3BhY2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYFxcdTAwYTAke2FmdGVyfWApXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaXBOb2RlLCB0ZXh0Tm9kZS5uZXh0U2libGluZylcbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoc3BhY2VOb2RlLCBjaGlwTm9kZS5uZXh0U2libGluZylcblxuICAgICAgLy8gUmVwb3NpY2lvbmFyIGNhcmV0IGRlc3B1w6lzIGRlbCBjaGlwIChhbnRlcyBkZWwgZXNwYWNpbyBub24tYnJlYWtpbmcpXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KHNwYWNlTm9kZSwgMSlcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRleHROb2RlLmRhdGEgPT09ICcnKSB0ZXh0Tm9kZS5yZW1vdmUoKVxuXG4gICAgICBjbG9zZVRyaWdnZXIoKVxuICAgIH0sXG4gICAgW2RldGVjdFRyaWdnZXIsIGNsb3NlVHJpZ2dlcl1cbiAgKVxuXG4gIGNvbnN0IHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCA9IHVzZUNhbGxiYWNrKFxuICAgIChjaGlwTm9kZTogSFRNTEVsZW1lbnQsIHNsYXNoQ29tbWFuZDogU2xhc2hDb21tYW5kQ2hpcERhdGEpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkZXRlY3RTbGFzaCgpXG4gICAgICBpZiAoIWN1cnJlbnQuYWN0aXZlIHx8ICFjdXJyZW50LmFuY2hvcikgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHsgbm9kZSwgb2Zmc2V0IH0gPSBjdXJyZW50LmFuY2hvclxuICAgICAgY29uc3QgdGV4dE5vZGUgPSBub2RlIGFzIFRleHRcbiAgICAgIGNvbnN0IGZ1bGwgPSB0ZXh0Tm9kZS5kYXRhXG4gICAgICBjb25zdCB0cmlnZ2VyTGVuID0gMSArIGN1cnJlbnQucXVlcnkubGVuZ3RoXG4gICAgICBjb25zdCBhZnRlciA9IGZ1bGwuc2xpY2Uob2Zmc2V0ICsgdHJpZ2dlckxlbilcblxuICAgICAgdGV4dE5vZGUuZGF0YSA9IGZ1bGwuc2xpY2UoMCwgb2Zmc2V0KVxuXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2xhc2gtY29tbWFuZCcsICd0cnVlJylcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1zbGFzaC1pZCcsIFN0cmluZyhzbGFzaENvbW1hbmQuaWQpKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLXNsYXNoLWxhYmVsJywgc2xhc2hDb21tYW5kLmxhYmVsKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlXG4gICAgICBpZiAoIXBhcmVudCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHNwYWNlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAgJHthZnRlcn1gKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlwTm9kZSwgdGV4dE5vZGUubmV4dFNpYmxpbmcpXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHNwYWNlTm9kZSwgY2hpcE5vZGUubmV4dFNpYmxpbmcpXG5cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoc3BhY2VOb2RlLCAxKVxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGV4dE5vZGUuZGF0YSA9PT0gJycpIHRleHROb2RlLnJlbW92ZSgpXG5cbiAgICAgIGNsb3NlU2xhc2hUcmlnZ2VyKClcbiAgICB9LFxuICAgIFtkZXRlY3RTbGFzaCwgY2xvc2VTbGFzaFRyaWdnZXJdXG4gIClcblxuICAvKipcbiAgICogUmVlbXBsYXphIGVsIGAjcXVlcnlgIHBlbmRpZW50ZSBwb3IgdW4gY2hpcCBkZSBza2lsbC4gTGEgc2tpbGwgc2lndWUgdmlhamFuZG9cbiAgICogY29tbyBtZW50aW9uIChgZGF0YS1tZW50aW9uKmApIHBhcmEgcXVlIGVsIGJhY2tlbmQgbGEgcmVzdWVsdmEgcG9yIGlkLlxuICAgKi9cbiAgY29uc3QgcmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoaXBOb2RlOiBIVE1MRWxlbWVudCwgbWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkZXRlY3RIYXNoKClcbiAgICAgIGlmICghY3VycmVudC5hY3RpdmUgfHwgIWN1cnJlbnQuYW5jaG9yKSByZXR1cm5cblxuICAgICAgY29uc3QgeyBub2RlLCBvZmZzZXQgfSA9IGN1cnJlbnQuYW5jaG9yXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IHRyaWdnZXJMZW4gPSAxICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyB0cmlnZ2VyTGVuKVxuXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gZnVsbC5zbGljZSgwLCBvZmZzZXQpXG5cbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uJywgJ3RydWUnKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24taWQnLCBTdHJpbmcobWVudGlvbi5pZCkpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi10eXBlJywgbWVudGlvbi50eXBlKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tbGFiZWwnLCBtZW50aW9uLmxhYmVsKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlXG4gICAgICBpZiAoIXBhcmVudCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHNwYWNlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGBcXHUwMGEwJHthZnRlcn1gKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlwTm9kZSwgdGV4dE5vZGUubmV4dFNpYmxpbmcpXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHNwYWNlTm9kZSwgY2hpcE5vZGUubmV4dFNpYmxpbmcpXG5cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoc3BhY2VOb2RlLCAxKVxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGV4dE5vZGUuZGF0YSA9PT0gJycpIHRleHROb2RlLnJlbW92ZSgpXG5cbiAgICAgIGNsb3NlSGFzaFRyaWdnZXIoKVxuICAgIH0sXG4gICAgW2RldGVjdEhhc2gsIGNsb3NlSGFzaFRyaWdnZXJdXG4gIClcblxuICBjb25zdCBzZXJpYWxpemUgPSB1c2VDYWxsYmFjaygoKToge1xuICAgIHRleHQ6IHN0cmluZ1xuICAgIG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdXG4gICAgc2xhc2hDb21tYW5kczogU2xhc2hDb21tYW5kQ2hpcERhdGFbXVxuICB9ID0+IHtcbiAgICBjb25zdCBlbCA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgaWYgKCFlbCkgcmV0dXJuIHsgdGV4dDogJycsIG1lbnRpb25zOiBbXSwgc2xhc2hDb21tYW5kczogW10gfVxuICAgIGNvbnN0IG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdID0gW11cbiAgICBjb25zdCBzbGFzaENvbW1hbmRzOiBTbGFzaENvbW1hbmRDaGlwRGF0YVtdID0gW11cbiAgICBsZXQgdGV4dCA9ICcnXG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICB0ZXh0ICs9IChub2RlIGFzIFRleHQpLmRhdGFcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgY29uc3QgZWxOb2RlID0gbm9kZSBhcyBIVE1MRWxlbWVudFxuICAgICAgICBpZiAoZWxOb2RlLmRhdGFzZXQ/Lm1lbnRpb24gPT09ICd0cnVlJykge1xuICAgICAgICAgIGNvbnN0IG1lbnRpb246IENvbnRleHRNZW50aW9uID0ge1xuICAgICAgICAgICAgaWQ6IGVsTm9kZS5kYXRhc2V0Lm1lbnRpb25JZCA/PyAnJyxcbiAgICAgICAgICAgIHR5cGU6IChlbE5vZGUuZGF0YXNldC5tZW50aW9uVHlwZSBhcyBDb250ZXh0TWVudGlvblsndHlwZSddKSA/PyAndXNlcicsXG4gICAgICAgICAgICBsYWJlbDogZWxOb2RlLmRhdGFzZXQubWVudGlvbkxhYmVsID8/IGVsTm9kZS50ZXh0Q29udGVudCA/PyAnJyxcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVudGlvbnMucHVzaChtZW50aW9uKVxuICAgICAgICAgIHRleHQgKz0gc2VyaWFsaXplTWVudGlvbihtZW50aW9uKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChlbE5vZGUuZGF0YXNldD8uc2xhc2hDb21tYW5kID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBjb25zdCBzbGFzaDogU2xhc2hDb21tYW5kQ2hpcERhdGEgPSB7XG4gICAgICAgICAgICBpZDogZWxOb2RlLmRhdGFzZXQuc2xhc2hJZCA/PyAnJyxcbiAgICAgICAgICAgIGxhYmVsOiBlbE5vZGUuZGF0YXNldC5zbGFzaExhYmVsID8/IGVsTm9kZS50ZXh0Q29udGVudD8ucmVwbGFjZSgvXlxcLy8sICcnKSA/PyAnJyxcbiAgICAgICAgICB9XG4gICAgICAgICAgc2xhc2hDb21tYW5kcy5wdXNoKHNsYXNoKVxuICAgICAgICAgIHRleHQgKz0gc2VyaWFsaXplU2xhc2hDb21tYW5kKHNsYXNoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChlbE5vZGUudGFnTmFtZSA9PT0gJ0JSJykge1xuICAgICAgICAgIHRleHQgKz0gJ1xcbidcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBlbE5vZGUuY2hpbGROb2Rlcy5mb3JFYWNoKHdhbGspXG4gICAgICAgIGlmIChlbE5vZGUudGFnTmFtZSA9PT0gJ0RJVicgfHwgZWxOb2RlLnRhZ05hbWUgPT09ICdQJykgdGV4dCArPSAnXFxuJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsLmNoaWxkTm9kZXMuZm9yRWFjaCh3YWxrKVxuICAgIHJldHVybiB7IHRleHQ6IHRleHQucmVwbGFjZSgvXFxuKyQvLCAnJyksIG1lbnRpb25zLCBzbGFzaENvbW1hbmRzIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGVkaXRvclJlZi5jdXJyZW50KSBlZGl0b3JSZWYuY3VycmVudC5pbm5lckhUTUwgPSAnJ1xuICAgIGNsb3NlVHJpZ2dlcigpXG4gICAgY2xvc2VTbGFzaFRyaWdnZXIoKVxuICAgIGNsb3NlSGFzaFRyaWdnZXIoKVxuICB9LCBbY2xvc2VUcmlnZ2VyLCBjbG9zZVNsYXNoVHJpZ2dlciwgY2xvc2VIYXNoVHJpZ2dlcl0pXG5cbiAgY29uc3QgZm9jdXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgfSwgW10pXG5cbiAgcmV0dXJuIHtcbiAgICBlZGl0b3JSZWYsXG4gICAgdHJpZ2dlcixcbiAgICB1cGRhdGVUcmlnZ2VyLFxuICAgIGNsb3NlVHJpZ2dlcixcbiAgICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoLFxuICAgIHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAsXG4gICAgc2xhc2hUcmlnZ2VyLFxuICAgIHVwZGF0ZVNsYXNoVHJpZ2dlcixcbiAgICBjbG9zZVNsYXNoVHJpZ2dlcixcbiAgICByZXBsYWNlVHJpZ2dlcldpdGhTbGFzaENoaXAsXG4gICAgaGFzaFRyaWdnZXIsXG4gICAgdXBkYXRlSGFzaFRyaWdnZXIsXG4gICAgY2xvc2VIYXNoVHJpZ2dlcixcbiAgICByZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAsXG4gICAgc2VyaWFsaXplLFxuICAgIGNsZWFy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
342
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZVN0YXRlIiwic2VyaWFsaXplTWVudGlvbiIsInNlcmlhbGl6ZVNsYXNoQ29tbWFuZCIsImRldGVjdENoYXJUcmlnZ2VyIiwiZGV0ZWN0TWVudGlvblRyaWdnZXIiLCJ1c2VDb250ZXh0TWVudGlvbnMiLCJlZGl0b3JSZWYiLCJfdXNlU3RhdGUiLCJhY3RpdmUiLCJxdWVyeSIsImF0UnVuTGVuZ3RoIiwiYW5jaG9yIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwidHJpZ2dlciIsInNldFRyaWdnZXIiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsInNsYXNoVHJpZ2dlciIsInNldFNsYXNoVHJpZ2dlciIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwiaGFzaFRyaWdnZXIiLCJzZXRIYXNoVHJpZ2dlciIsImRldGVjdFRyaWdnZXIiLCJzZWxlY3Rpb24iLCJ3aW5kb3ciLCJnZXRTZWxlY3Rpb24iLCJyYW5nZUNvdW50IiwiY3VycmVudCIsImdldFJhbmdlQXQiLCJkZXRlY3RTbGFzaCIsImRldGVjdEhhc2giLCJ1cGRhdGVUcmlnZ2VyIiwibmV4dCIsImNsb3NlVHJpZ2dlciIsInVwZGF0ZVNsYXNoVHJpZ2dlciIsImNsb3NlU2xhc2hUcmlnZ2VyIiwidXBkYXRlSGFzaFRyaWdnZXIiLCJjbG9zZUhhc2hUcmlnZ2VyIiwic3luY1RyaWdnZXJBdFJ1bkxlbmd0aCIsIm5leHRBdFJ1bkxlbmd0aCIsIm5leHRIYXNTbGFzaCIsInNhZmVOZXh0IiwiTWF0aCIsIm1heCIsImZsb29yIiwiYWJzIiwiX2N1cnJlbnQkYW5jaG9yIiwibm9kZSIsIm9mZnNldCIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInRleHROb2RlIiwiZnVsbCIsImRhdGEiLCJjdXJyZW50UnVuTGVuIiwiY3VycmVudEhhc1NsYXNoIiwicXVlcnlMZW4iLCJsZW5ndGgiLCJiZWZvcmUiLCJzbGljZSIsImFmdGVyIiwibmV4dFJ1biIsImNvbmNhdCIsInJlcGVhdCIsImNsZWFuUXVlcnkiLCJzdGFydHNXaXRoIiwibmV4dFZhbHVlIiwicmFuZ2UiLCJkb2N1bWVudCIsImNyZWF0ZVJhbmdlIiwiY2FyZXRPZmZzZXQiLCJzZXRTdGFydCIsIm1pbiIsImNvbGxhcHNlIiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJ1cGRhdGVkIiwicmVwbGFjZVRyaWdnZXJXaXRoQ2hpcCIsImNoaXBOb2RlIiwibWVudGlvbiIsIl9jdXJyZW50JGFuY2hvcjIiLCJzZXRBdHRyaWJ1dGUiLCJTdHJpbmciLCJpZCIsInR5cGUiLCJsYWJlbCIsInBhcmVudCIsInBhcmVudE5vZGUiLCJzcGFjZU5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsImluc2VydEJlZm9yZSIsIm5leHRTaWJsaW5nIiwicmVtb3ZlIiwicmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwIiwic2xhc2hDb21tYW5kIiwiX2N1cnJlbnQkYW5jaG9yMyIsInRyaWdnZXJMZW4iLCJyZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAiLCJfY3VycmVudCRhbmNob3I0Iiwic2VyaWFsaXplIiwiZWwiLCJ0ZXh0IiwibWVudGlvbnMiLCJzbGFzaENvbW1hbmRzIiwid2FsayIsIkVMRU1FTlRfTk9ERSIsIl9lbE5vZGUkZGF0YXNldCIsIl9lbE5vZGUkZGF0YXNldDIiLCJlbE5vZGUiLCJkYXRhc2V0IiwiX2VsTm9kZSRkYXRhc2V0JG1lbnRpIiwiX3JlZiIsIl9yZWYyIiwiX2VsTm9kZSRkYXRhc2V0JG1lbnRpMiIsIm1lbnRpb25JZCIsIm1lbnRpb25UeXBlIiwibWVudGlvbkxhYmVsIiwidGV4dENvbnRlbnQiLCJwdXNoIiwiX2VsTm9kZSRkYXRhc2V0JHNsYXNoIiwiX3JlZjMiLCJfZWxOb2RlJGRhdGFzZXQkc2xhc2gyIiwiX2VsTm9kZSR0ZXh0Q29udGVudCIsInNsYXNoIiwic2xhc2hJZCIsInNsYXNoTGFiZWwiLCJyZXBsYWNlIiwidGFnTmFtZSIsImNoaWxkTm9kZXMiLCJmb3JFYWNoIiwiY2xlYXIiLCJpbm5lckhUTUwiLCJmb2N1cyIsIl9lZGl0b3JSZWYkY3VycmVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDb250ZXh0TWVudGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uIH0gZnJvbSAnLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBzZXJpYWxpemVNZW50aW9uIH0gZnJvbSAnLi4vdXRpbHMvcmVuZGVyQ29udGV4dE1lbnRpb25zJ1xuaW1wb3J0IHsgc2VyaWFsaXplU2xhc2hDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2xhc2hDb21tYW5kTWFya2VyJ1xuaW1wb3J0IHR5cGUgeyBTbGFzaENvbW1hbmRDaGlwRGF0YSB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXRvbXMvU2xhc2hDb21tYW5kQ2hpcC9idWlsZFNsYXNoQ2hpcEVsZW1lbnQnXG5pbXBvcnQgeyBkZXRlY3RDaGFyVHJpZ2dlciwgZGV0ZWN0TWVudGlvblRyaWdnZXIgfSBmcm9tICcuL3VzZUNvbnRleHRNZW50aW9ucy5oZWxwZXJzJ1xuaW1wb3J0IHR5cGUgeyBIYXNoVHJpZ2dlclN0YXRlLCBNZW50aW9uVHJpZ2dlclN0YXRlLCBTbGFzaFRyaWdnZXJTdGF0ZSB9IGZyb20gJy4vdXNlQ29udGV4dE1lbnRpb25zLnR5cGVzJ1xuXG5leHBvcnQgdHlwZSB7IEhhc2hUcmlnZ2VyU3RhdGUsIE1lbnRpb25UcmlnZ2VyU3RhdGUsIFNsYXNoVHJpZ2dlclN0YXRlIH0gZnJvbSAnLi91c2VDb250ZXh0TWVudGlvbnMudHlwZXMnXG5cbmV4cG9ydCBjb25zdCB1c2VDb250ZXh0TWVudGlvbnMgPSAoKSA9PiB7XG4gIGNvbnN0IGVkaXRvclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFt0cmlnZ2VyLCBzZXRUcmlnZ2VyXSA9IHVzZVN0YXRlPE1lbnRpb25UcmlnZ2VyU3RhdGU+KHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHF1ZXJ5OiAnJyxcbiAgICBhdFJ1bkxlbmd0aDogMCxcbiAgICBhbmNob3I6IG51bGwsXG4gIH0pXG4gIGNvbnN0IFtzbGFzaFRyaWdnZXIsIHNldFNsYXNoVHJpZ2dlcl0gPSB1c2VTdGF0ZTxTbGFzaFRyaWdnZXJTdGF0ZT4oe1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgcXVlcnk6ICcnLFxuICAgIGFuY2hvcjogbnVsbCxcbiAgfSlcbiAgY29uc3QgW2hhc2hUcmlnZ2VyLCBzZXRIYXNoVHJpZ2dlcl0gPSB1c2VTdGF0ZTxIYXNoVHJpZ2dlclN0YXRlPih7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBxdWVyeTogJycsXG4gICAgYW5jaG9yOiBudWxsLFxuICB9KVxuXG4gIGNvbnN0IGRldGVjdFRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKTogTWVudGlvblRyaWdnZXJTdGF0ZSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDAgfHwgIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwLCBhbmNob3I6IG51bGwgfVxuICAgIH1cbiAgICByZXR1cm4gZGV0ZWN0TWVudGlvblRyaWdnZXIoZWRpdG9yUmVmLmN1cnJlbnQsIHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApKVxuICB9LCBbXSlcblxuICBjb25zdCBkZXRlY3RTbGFzaCA9IHVzZUNhbGxiYWNrKCgpOiBTbGFzaFRyaWdnZXJTdGF0ZSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDAgfHwgIWVkaXRvclJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9XG4gICAgfVxuICAgIHJldHVybiBkZXRlY3RDaGFyVHJpZ2dlcihlZGl0b3JSZWYuY3VycmVudCwgc2VsZWN0aW9uLmdldFJhbmdlQXQoMCksICcvJylcbiAgfSwgW10pXG5cbiAgY29uc3QgZGV0ZWN0SGFzaCA9IHVzZUNhbGxiYWNrKCgpOiBIYXNoVHJpZ2dlclN0YXRlID0+IHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCB8fCAhZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYW5jaG9yOiBudWxsIH1cbiAgICB9XG4gICAgcmV0dXJuIGRldGVjdENoYXJUcmlnZ2VyKGVkaXRvclJlZi5jdXJyZW50LCBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKSwgJyMnKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVUcmlnZ2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBkZXRlY3RUcmlnZ2VyKClcbiAgICBzZXRUcmlnZ2VyKG5leHQpXG4gICAgcmV0dXJuIG5leHRcbiAgfSwgW2RldGVjdFRyaWdnZXJdKVxuXG4gIGNvbnN0IGNsb3NlVHJpZ2dlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRUcmlnZ2VyKHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCwgYW5jaG9yOiBudWxsIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZVNsYXNoVHJpZ2dlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gZGV0ZWN0U2xhc2goKVxuICAgIHNldFNsYXNoVHJpZ2dlcihuZXh0KVxuICAgIHJldHVybiBuZXh0XG4gIH0sIFtkZXRlY3RTbGFzaF0pXG5cbiAgY29uc3QgY2xvc2VTbGFzaFRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2xhc2hUcmlnZ2VyKHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhbmNob3I6IG51bGwgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgdXBkYXRlSGFzaFRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IGRldGVjdEhhc2goKVxuICAgIHNldEhhc2hUcmlnZ2VyKG5leHQpXG4gICAgcmV0dXJuIG5leHRcbiAgfSwgW2RldGVjdEhhc2hdKVxuXG4gIGNvbnN0IGNsb3NlSGFzaFRyaWdnZXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SGFzaFRyaWdnZXIoeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGFuY2hvcjogbnVsbCB9KVxuICB9LCBbXSlcblxuICAvKipcbiAgICogQWp1c3RhIGxhIGNhbnRpZGFkIGRlIGBAYCBkZWwgdHJpZ2dlciBhY3Rpdm8gc2luIHBlcmRlciBlbCBxdWVyeSBhY3R1YWwuXG4gICAqIEVqLjogYEBAYWJjYCAtPiBgQGFiY2AgYWwgY2FtYmlhciBkZSB0YWIuXG4gICAqL1xuICBjb25zdCBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoID0gdXNlQ2FsbGJhY2soXG4gICAgKG5leHRBdFJ1bkxlbmd0aDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZXh0SGFzU2xhc2ggPSBuZXh0QXRSdW5MZW5ndGggPCAwXG4gICAgICBjb25zdCBzYWZlTmV4dCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoTWF0aC5hYnMobmV4dEF0UnVuTGVuZ3RoKSkpXG4gICAgICBjb25zdCBjdXJyZW50ID0gZGV0ZWN0VHJpZ2dlcigpXG4gICAgICBpZiAoIWN1cnJlbnQuYWN0aXZlIHx8ICFjdXJyZW50LmFuY2hvcikgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHsgbm9kZSwgb2Zmc2V0IH0gPSBjdXJyZW50LmFuY2hvclxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSByZXR1cm5cbiAgICAgIGNvbnN0IHRleHROb2RlID0gbm9kZSBhcyBUZXh0XG4gICAgICBjb25zdCBmdWxsID0gdGV4dE5vZGUuZGF0YVxuICAgICAgY29uc3QgY3VycmVudFJ1bkxlbiA9IE1hdGguYWJzKGN1cnJlbnQuYXRSdW5MZW5ndGgpXG4gICAgICBjb25zdCBjdXJyZW50SGFzU2xhc2ggPSBjdXJyZW50LmF0UnVuTGVuZ3RoIDwgMFxuICAgICAgY29uc3QgcXVlcnlMZW4gPSBjdXJyZW50UnVuTGVuICsgKGN1cnJlbnRIYXNTbGFzaCA/IDEgOiAwKSArIGN1cnJlbnQucXVlcnkubGVuZ3RoXG4gICAgICBjb25zdCBiZWZvcmUgPSBmdWxsLnNsaWNlKDAsIG9mZnNldClcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyBxdWVyeUxlbilcbiAgICAgIGNvbnN0IG5leHRSdW4gPSBuZXh0SGFzU2xhc2ggPyBgJHsnQCcucmVwZWF0KHNhZmVOZXh0KX0vYCA6ICdAJy5yZXBlYXQoc2FmZU5leHQpXG4gICAgICAvLyBTaSB2ZW5pbW9zIGRlbCB0YWIgc2tpbGwsIGVsIHF1ZXJ5IHRpZW5lICcvJyBjb21vIHByZWZpam8g4oCUIGxpbXBpYXJsbyBhbCBjYW1iaWFyIGRlIHRhYi5cbiAgICAgIGNvbnN0IGNsZWFuUXVlcnkgPSBjdXJyZW50LnF1ZXJ5LnN0YXJ0c1dpdGgoJy8nKSA/IGN1cnJlbnQucXVlcnkuc2xpY2UoMSkgOiBjdXJyZW50LnF1ZXJ5XG4gICAgICBjb25zdCBuZXh0VmFsdWUgPSBgJHtiZWZvcmV9JHtuZXh0UnVufSR7Y2xlYW5RdWVyeX0ke2FmdGVyfWBcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gbmV4dFZhbHVlXG5cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgY29uc3QgY2FyZXRPZmZzZXQgPSBiZWZvcmUubGVuZ3RoICsgbmV4dFJ1bi5sZW5ndGggKyBjbGVhblF1ZXJ5Lmxlbmd0aFxuICAgICAgICByYW5nZS5zZXRTdGFydCh0ZXh0Tm9kZSwgTWF0aC5taW4oY2FyZXRPZmZzZXQsIHRleHROb2RlLmRhdGEubGVuZ3RoKSlcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZCA9IGRldGVjdFRyaWdnZXIoKVxuICAgICAgc2V0VHJpZ2dlcih1cGRhdGVkKVxuICAgIH0sXG4gICAgW2RldGVjdFRyaWdnZXJdXG4gIClcblxuICAvKipcbiAgICogUmVlbXBsYXphIGVsIGBAcXVlcnlgIHBlbmRpZW50ZSBwb3IgdW4gY2hpcCBhdMOzbWljbyBjb24gbGEgbWVudGlvbi5cbiAgICogUmVxdWllcmUgcXVlIGVsIGNhbGxlciBwcm92ZWEgZWwgRE9NIGRlbCBjaGlwIChzZSBpbnNlcnRhIHRhbCBjdWFsKS5cbiAgICovXG4gIGNvbnN0IHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hpcE5vZGU6IEhUTUxFbGVtZW50LCBtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IGRldGVjdFRyaWdnZXIoKVxuICAgICAgaWYgKCFjdXJyZW50LmFjdGl2ZSB8fCAhY3VycmVudC5hbmNob3IpIHJldHVyblxuXG4gICAgICBjb25zdCB7IG5vZGUsIG9mZnNldCB9ID0gY3VycmVudC5hbmNob3JcbiAgICAgIGNvbnN0IHRleHROb2RlID0gbm9kZSBhcyBUZXh0XG4gICAgICBjb25zdCBmdWxsID0gdGV4dE5vZGUuZGF0YVxuICAgICAgY29uc3QgY3VycmVudFJ1bkxlbiA9IE1hdGguYWJzKGN1cnJlbnQuYXRSdW5MZW5ndGgpXG4gICAgICBjb25zdCBjdXJyZW50SGFzU2xhc2ggPSBjdXJyZW50LmF0UnVuTGVuZ3RoIDwgMFxuICAgICAgY29uc3QgcXVlcnlMZW4gPSBjdXJyZW50UnVuTGVuICsgKGN1cnJlbnRIYXNTbGFzaCA/IDEgOiAwKSArIGN1cnJlbnQucXVlcnkubGVuZ3RoXG4gICAgICBjb25zdCBhZnRlciA9IGZ1bGwuc2xpY2Uob2Zmc2V0ICsgcXVlcnlMZW4pXG5cbiAgICAgIC8vIFRydW5jYXIgZWwgdGV4dG8gaGFzdGEgYW50ZXMgZGVsIHJ1biBkZSBgQOKApmBcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgdGV4dE5vZGUuZGF0YSA9IGZ1bGwuc2xpY2UoMCwgb2Zmc2V0KVxuXG4gICAgICAvLyBJbnNlcnRhciBlbCBjaGlwIGp1c3RvIGRlc3B1w6lzIGRlbCBub2RvIGRlIHRleHRvXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbicsICd0cnVlJylcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWlkJywgU3RyaW5nKG1lbnRpb24uaWQpKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tdHlwZScsIG1lbnRpb24udHlwZSlcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWxhYmVsJywgbWVudGlvbi5sYWJlbClcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJylcblxuICAgICAgY29uc3QgcGFyZW50ID0gdGV4dE5vZGUucGFyZW50Tm9kZVxuICAgICAgaWYgKCFwYXJlbnQpIHJldHVyblxuXG4gICAgICBjb25zdCBzcGFjZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgXFx1MDBhMCR7YWZ0ZXJ9YClcbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpcE5vZGUsIHRleHROb2RlLm5leHRTaWJsaW5nKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzcGFjZU5vZGUsIGNoaXBOb2RlLm5leHRTaWJsaW5nKVxuXG4gICAgICAvLyBSZXBvc2ljaW9uYXIgY2FyZXQgZGVzcHXDqXMgZGVsIGNoaXAgKGFudGVzIGRlbCBlc3BhY2lvIG5vbi1icmVha2luZylcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoc3BhY2VOb2RlLCAxKVxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGV4dE5vZGUuZGF0YSA9PT0gJycpIHRleHROb2RlLnJlbW92ZSgpXG5cbiAgICAgIGNsb3NlVHJpZ2dlcigpXG4gICAgfSxcbiAgICBbZGV0ZWN0VHJpZ2dlciwgY2xvc2VUcmlnZ2VyXVxuICApXG5cbiAgY29uc3QgcmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwID0gdXNlQ2FsbGJhY2soXG4gICAgKGNoaXBOb2RlOiBIVE1MRWxlbWVudCwgc2xhc2hDb21tYW5kOiBTbGFzaENvbW1hbmRDaGlwRGF0YSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IGRldGVjdFNsYXNoKClcbiAgICAgIGlmICghY3VycmVudC5hY3RpdmUgfHwgIWN1cnJlbnQuYW5jaG9yKSByZXR1cm5cblxuICAgICAgY29uc3QgeyBub2RlLCBvZmZzZXQgfSA9IGN1cnJlbnQuYW5jaG9yXG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUgYXMgVGV4dFxuICAgICAgY29uc3QgZnVsbCA9IHRleHROb2RlLmRhdGFcbiAgICAgIGNvbnN0IHRyaWdnZXJMZW4gPSAxICsgY3VycmVudC5xdWVyeS5sZW5ndGhcbiAgICAgIGNvbnN0IGFmdGVyID0gZnVsbC5zbGljZShvZmZzZXQgKyB0cmlnZ2VyTGVuKVxuXG4gICAgICB0ZXh0Tm9kZS5kYXRhID0gZnVsbC5zbGljZSgwLCBvZmZzZXQpXG5cbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1zbGFzaC1jb21tYW5kJywgJ3RydWUnKVxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLXNsYXNoLWlkJywgU3RyaW5nKHNsYXNoQ29tbWFuZC5pZCkpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2xhc2gtbGFiZWwnLCBzbGFzaENvbW1hbmQubGFiZWwpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpXG5cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRleHROb2RlLnBhcmVudE5vZGVcbiAgICAgIGlmICghcGFyZW50KSByZXR1cm5cblxuICAgICAgY29uc3Qgc3BhY2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYCAke2FmdGVyfWApXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaXBOb2RlLCB0ZXh0Tm9kZS5uZXh0U2libGluZylcbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoc3BhY2VOb2RlLCBjaGlwTm9kZS5uZXh0U2libGluZylcblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICByYW5nZS5zZXRTdGFydChzcGFjZU5vZGUsIDEpXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXh0Tm9kZS5kYXRhID09PSAnJykgdGV4dE5vZGUucmVtb3ZlKClcblxuICAgICAgY2xvc2VTbGFzaFRyaWdnZXIoKVxuICAgIH0sXG4gICAgW2RldGVjdFNsYXNoLCBjbG9zZVNsYXNoVHJpZ2dlcl1cbiAgKVxuXG4gIC8qKlxuICAgKiBSZWVtcGxhemEgZWwgYCNxdWVyeWAgcGVuZGllbnRlIHBvciB1biBjaGlwIGRlIHNraWxsLiBMYSBza2lsbCBzaWd1ZSB2aWFqYW5kb1xuICAgKiBjb21vIG1lbnRpb24gKGBkYXRhLW1lbnRpb24qYCkgcGFyYSBxdWUgZWwgYmFja2VuZCBsYSByZXN1ZWx2YSBwb3IgaWQuXG4gICAqL1xuICBjb25zdCByZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hpcE5vZGU6IEhUTUxFbGVtZW50LCBtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IGRldGVjdEhhc2goKVxuICAgICAgaWYgKCFjdXJyZW50LmFjdGl2ZSB8fCAhY3VycmVudC5hbmNob3IpIHJldHVyblxuXG4gICAgICBjb25zdCB7IG5vZGUsIG9mZnNldCB9ID0gY3VycmVudC5hbmNob3JcbiAgICAgIGNvbnN0IHRleHROb2RlID0gbm9kZSBhcyBUZXh0XG4gICAgICBjb25zdCBmdWxsID0gdGV4dE5vZGUuZGF0YVxuICAgICAgY29uc3QgdHJpZ2dlckxlbiA9IDEgKyBjdXJyZW50LnF1ZXJ5Lmxlbmd0aFxuICAgICAgY29uc3QgYWZ0ZXIgPSBmdWxsLnNsaWNlKG9mZnNldCArIHRyaWdnZXJMZW4pXG5cbiAgICAgIHRleHROb2RlLmRhdGEgPSBmdWxsLnNsaWNlKDAsIG9mZnNldClcblxuICAgICAgY2hpcE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24nLCAndHJ1ZScpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi1pZCcsIFN0cmluZyhtZW50aW9uLmlkKSlcbiAgICAgIGNoaXBOb2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLXR5cGUnLCBtZW50aW9uLnR5cGUpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbi1sYWJlbCcsIG1lbnRpb24ubGFiZWwpXG4gICAgICBjaGlwTm9kZS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpXG5cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRleHROb2RlLnBhcmVudE5vZGVcbiAgICAgIGlmICghcGFyZW50KSByZXR1cm5cblxuICAgICAgY29uc3Qgc3BhY2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYFxcdTAwYTAke2FmdGVyfWApXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaXBOb2RlLCB0ZXh0Tm9kZS5uZXh0U2libGluZylcbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoc3BhY2VOb2RlLCBjaGlwTm9kZS5uZXh0U2libGluZylcblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICByYW5nZS5zZXRTdGFydChzcGFjZU5vZGUsIDEpXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXh0Tm9kZS5kYXRhID09PSAnJykgdGV4dE5vZGUucmVtb3ZlKClcblxuICAgICAgY2xvc2VIYXNoVHJpZ2dlcigpXG4gICAgfSxcbiAgICBbZGV0ZWN0SGFzaCwgY2xvc2VIYXNoVHJpZ2dlcl1cbiAgKVxuXG4gIGNvbnN0IHNlcmlhbGl6ZSA9IHVzZUNhbGxiYWNrKCgpOiB7XG4gICAgdGV4dDogc3RyaW5nXG4gICAgbWVudGlvbnM6IENvbnRleHRNZW50aW9uW11cbiAgICBzbGFzaENvbW1hbmRzOiBTbGFzaENvbW1hbmRDaGlwRGF0YVtdXG4gIH0gPT4ge1xuICAgIGNvbnN0IGVsID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm4geyB0ZXh0OiAnJywgbWVudGlvbnM6IFtdLCBzbGFzaENvbW1hbmRzOiBbXSB9XG4gICAgY29uc3QgbWVudGlvbnM6IENvbnRleHRNZW50aW9uW10gPSBbXVxuICAgIGNvbnN0IHNsYXNoQ29tbWFuZHM6IFNsYXNoQ29tbWFuZENoaXBEYXRhW10gPSBbXVxuICAgIGxldCB0ZXh0ID0gJydcblxuICAgIGNvbnN0IHdhbGsgPSAobm9kZTogTm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgIHRleHQgKz0gKG5vZGUgYXMgVGV4dCkuZGF0YVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICBjb25zdCBlbE5vZGUgPSBub2RlIGFzIEhUTUxFbGVtZW50XG4gICAgICAgIGlmIChlbE5vZGUuZGF0YXNldD8ubWVudGlvbiA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgY29uc3QgbWVudGlvbjogQ29udGV4dE1lbnRpb24gPSB7XG4gICAgICAgICAgICBpZDogZWxOb2RlLmRhdGFzZXQubWVudGlvbklkID8/ICcnLFxuICAgICAgICAgICAgdHlwZTogKGVsTm9kZS5kYXRhc2V0Lm1lbnRpb25UeXBlIGFzIENvbnRleHRNZW50aW9uWyd0eXBlJ10pID8/ICd1c2VyJyxcbiAgICAgICAgICAgIGxhYmVsOiBlbE5vZGUuZGF0YXNldC5tZW50aW9uTGFiZWwgPz8gZWxOb2RlLnRleHRDb250ZW50ID8/ICcnLFxuICAgICAgICAgIH1cbiAgICAgICAgICBtZW50aW9ucy5wdXNoKG1lbnRpb24pXG4gICAgICAgICAgdGV4dCArPSBzZXJpYWxpemVNZW50aW9uKG1lbnRpb24pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsTm9kZS5kYXRhc2V0Py5zbGFzaENvbW1hbmQgPT09ICd0cnVlJykge1xuICAgICAgICAgIGNvbnN0IHNsYXNoOiBTbGFzaENvbW1hbmRDaGlwRGF0YSA9IHtcbiAgICAgICAgICAgIGlkOiBlbE5vZGUuZGF0YXNldC5zbGFzaElkID8/ICcnLFxuICAgICAgICAgICAgbGFiZWw6IGVsTm9kZS5kYXRhc2V0LnNsYXNoTGFiZWwgPz8gZWxOb2RlLnRleHRDb250ZW50Py5yZXBsYWNlKC9eXFwvLywgJycpID8/ICcnLFxuICAgICAgICAgIH1cbiAgICAgICAgICBzbGFzaENvbW1hbmRzLnB1c2goc2xhc2gpXG4gICAgICAgICAgdGV4dCArPSBzZXJpYWxpemVTbGFzaENvbW1hbmQoc2xhc2gpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsTm9kZS50YWdOYW1lID09PSAnQlInKSB7XG4gICAgICAgICAgdGV4dCArPSAnXFxuJ1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGVsTm9kZS5jaGlsZE5vZGVzLmZvckVhY2god2FsaylcbiAgICAgICAgaWYgKGVsTm9kZS50YWdOYW1lID09PSAnRElWJyB8fCBlbE5vZGUudGFnTmFtZSA9PT0gJ1AnKSB0ZXh0ICs9ICdcXG4nXG4gICAgICB9XG4gICAgfVxuXG4gICAgZWwuY2hpbGROb2Rlcy5mb3JFYWNoKHdhbGspXG4gICAgcmV0dXJuIHsgdGV4dDogdGV4dC5yZXBsYWNlKC9cXG4rJC8sICcnKSwgbWVudGlvbnMsIHNsYXNoQ29tbWFuZHMgfVxuICB9LCBbXSlcblxuICBjb25zdCBjbGVhciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoZWRpdG9yUmVmLmN1cnJlbnQpIGVkaXRvclJlZi5jdXJyZW50LmlubmVySFRNTCA9ICcnXG4gICAgY2xvc2VUcmlnZ2VyKClcbiAgICBjbG9zZVNsYXNoVHJpZ2dlcigpXG4gICAgY2xvc2VIYXNoVHJpZ2dlcigpXG4gIH0sIFtjbG9zZVRyaWdnZXIsIGNsb3NlU2xhc2hUcmlnZ2VyLCBjbG9zZUhhc2hUcmlnZ2VyXSlcblxuICBjb25zdCBmb2N1cyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKVxuICB9LCBbXSlcblxuICByZXR1cm4ge1xuICAgIGVkaXRvclJlZixcbiAgICB0cmlnZ2VyLFxuICAgIHVwZGF0ZVRyaWdnZXIsXG4gICAgY2xvc2VUcmlnZ2VyLFxuICAgIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgsXG4gICAgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcCxcbiAgICBzbGFzaFRyaWdnZXIsXG4gICAgdXBkYXRlU2xhc2hUcmlnZ2VyLFxuICAgIGNsb3NlU2xhc2hUcmlnZ2VyLFxuICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCxcbiAgICBoYXNoVHJpZ2dlcixcbiAgICB1cGRhdGVIYXNoVHJpZ2dlcixcbiAgICBjbG9zZUhhc2hUcmlnZ2VyLFxuICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNraWxsQ2hpcCxcbiAgICBzZXJpYWxpemUsXG4gICAgY2xlYXIsXG4gICAgZm9jdXMsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUVyRCxTQUFTQyxnQkFBZ0IsUUFBUSxnQ0FBZ0M7QUFDakUsU0FBU0MscUJBQXFCLFFBQVEsNkJBQTZCO0FBRW5FLFNBQVNDLGlCQUFp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