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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
  6. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
  7. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  23. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  25. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  26. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  27. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  28. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  29. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  30. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  31. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  32. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  33. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  34. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  35. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
  36. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  37. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
  38. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  39. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  40. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  41. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
  42. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  43. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  44. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  45. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
  46. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  47. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
  48. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  49. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  50. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  51. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  52. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  53. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  54. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  55. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  56. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  57. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  58. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  59. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  60. package/lib/components/atoms/HelpButton.spec.js +87 -0
  61. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  62. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  63. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  64. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  65. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  66. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  67. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  68. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  70. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
  71. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  72. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
  73. package/lib/components/atoms/MAIAInput/MAIAInput.js +130 -177
  74. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
  75. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  76. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
  77. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  78. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
  79. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
  80. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  81. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  82. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  83. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  84. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  85. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  86. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  87. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  88. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  89. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  90. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  91. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  92. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
  93. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  94. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  95. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  96. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  97. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  98. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
  99. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  100. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
  101. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  102. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  103. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  104. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  105. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  106. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  107. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  108. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  109. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  110. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  111. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  112. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  113. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  114. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  115. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  116. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  117. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  118. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  119. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
  120. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  121. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
  122. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  123. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  124. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  125. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
  126. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  127. package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
  128. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  129. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  130. package/lib/components/atoms/WithAppCfg.spec.js +82 -0
  131. package/lib/components/index.js +2 -1
  132. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  133. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  134. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  135. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
  136. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  137. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
  138. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  139. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
  140. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  141. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
  142. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  143. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
  144. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  145. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  146. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  147. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  148. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  149. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  150. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  151. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  152. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  153. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  154. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  155. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  156. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  157. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  158. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  159. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  160. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  161. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
  162. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +285 -302
  163. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
  164. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  165. package/lib/components/molecules/ChatAIHome/styles.js +85 -78
  166. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  167. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  168. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
  169. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +235 -245
  170. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
  171. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  172. package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
  173. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +522 -4
  174. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
  175. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +250 -349
  176. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
  177. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  178. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  179. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  180. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  181. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  182. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  183. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  184. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  185. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  186. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
  187. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +100 -93
  188. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  189. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  190. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  191. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  192. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  193. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  194. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  195. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
  196. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  197. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
  198. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  199. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
  200. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  201. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
  202. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  203. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  204. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
  205. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  206. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  207. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
  208. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  209. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  210. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  211. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  212. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  213. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  214. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  215. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  216. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  217. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
  218. package/lib/components/molecules/Sidebar/Sidebar.js +65 -44
  219. package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
  220. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  221. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
  222. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +310 -644
  223. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
  224. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  225. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  226. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
  227. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  228. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
  229. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  230. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  231. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
  232. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  233. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  234. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  235. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  236. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
  237. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
  238. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
  239. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  240. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  241. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  242. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  243. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  244. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  245. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  246. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  247. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  248. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  249. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  250. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  251. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  252. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  253. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  254. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  255. package/lib/constants/formatExtensions.js +7 -8
  256. package/lib/constants/formatExtensions.spec.js +14 -0
  257. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  258. package/lib/constants/maiaFeatureAccess.spec.js +30 -0
  259. package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
  260. package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
  261. package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
  262. package/lib/constants/permissions/index.js +2 -2
  263. package/lib/constants/permissions/utils.js +4 -1
  264. package/lib/constants/permissions/utils.spec.js +128 -0
  265. package/lib/constants/plannerSyncEvents.spec.js +31 -0
  266. package/lib/constants/taskUrls.spec.js +9 -0
  267. package/lib/dev/DevMaiaPage.js +30 -0
  268. package/lib/dev/DevReasoningTimeline.js +75 -86
  269. package/lib/dev/Providers.js +5 -3
  270. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  271. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  272. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  273. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  274. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  275. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
  276. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  277. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
  278. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  279. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
  280. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  281. package/lib/hooks/useCaretPosition.spec.js +58 -0
  282. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  283. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
  284. package/lib/hooks/useChatManager/useChatManager.js +272 -745
  285. package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
  286. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  287. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
  288. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  289. package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
  290. package/lib/hooks/useChats/useChats.spec.js +208 -0
  291. package/lib/hooks/useClientSearch.helpers.js +36 -0
  292. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  293. package/lib/hooks/useClientSearch.js +4 -32
  294. package/lib/hooks/useClientSearch.spec.js +86 -0
  295. package/lib/hooks/useContextMentions.helpers.js +212 -0
  296. package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
  297. package/lib/hooks/useContextMentions.js +5 -223
  298. package/lib/hooks/useContextMentions.spec.js +338 -0
  299. package/lib/hooks/useContextMentions.types.js +2 -0
  300. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  301. package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
  302. package/lib/hooks/useContextPinPopover.js +16 -75
  303. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  304. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  305. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  306. package/lib/hooks/useDebounce.spec.js +42 -0
  307. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  308. package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
  309. package/lib/hooks/useEntitySearch.js +52 -436
  310. package/lib/hooks/useEntitySearch.spec.js +718 -0
  311. package/lib/hooks/useEvent.spec.js +45 -0
  312. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  313. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  314. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  315. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  316. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  317. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  318. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  319. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  320. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  321. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  322. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  323. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  324. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  325. package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
  326. package/lib/hooks/useMentionPopover.js +9 -35
  327. package/lib/hooks/useMentionPopover.spec.js +392 -0
  328. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  329. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
  330. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  331. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  332. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  333. package/lib/hooks/useModal/useModal.spec.js +73 -0
  334. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  335. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
  336. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  337. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
  338. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  339. package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
  340. package/lib/hooks/useProjectSearch.js +4 -58
  341. package/lib/hooks/useProjectSearch.spec.js +91 -0
  342. package/lib/hooks/useProjectSummary.spec.js +193 -0
  343. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  344. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
  345. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  346. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  347. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  348. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  349. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  350. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  351. package/lib/hooks/useRecentClientsSearch.js +4 -32
  352. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  353. package/lib/hooks/useRecentContexts.spec.js +139 -0
  354. package/lib/hooks/useResize.spec.js +37 -0
  355. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  356. package/lib/hooks/useSlashCommands.spec.js +139 -0
  357. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  358. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  359. package/lib/hooks/useStreamResponse.spec.js +199 -0
  360. package/lib/hooks/useT.spec.js +20 -0
  361. package/lib/hooks/useToggle.spec.js +33 -0
  362. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  363. package/lib/index.js +5 -2
  364. package/lib/lang/br/index.js +26 -7
  365. package/lib/lang/en/index.js +26 -7
  366. package/lib/lang/es/index.js +26 -7
  367. package/lib/lang/fr/index.js +26 -7
  368. package/lib/services/appcues.spec.js +37 -0
  369. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  370. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  371. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  372. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  373. package/lib/services/maia/Agents/connectors.spec.js +496 -0
  374. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  375. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  376. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  377. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  378. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  379. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  380. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  381. package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
  382. package/lib/services/maia/Agents/getAgents.js +90 -282
  383. package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
  384. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  385. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  386. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  387. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  388. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  389. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  390. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  391. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  392. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  393. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  394. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  395. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  396. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  397. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  398. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
  399. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  400. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  401. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  402. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  403. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  404. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  405. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  406. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  407. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  408. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  409. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  410. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  411. package/lib/services/maia/client.spec.js +56 -0
  412. package/lib/services/utils/fetchCOR.spec.js +211 -0
  413. package/lib/services/utils/getCookie.spec.js +20 -0
  414. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  415. package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
  416. package/lib/services/utils/mapChatMessages.js +25 -254
  417. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  418. package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
  419. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  420. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  421. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  422. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  423. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  424. package/lib/store/sessions/sessionNotifications.js +35 -41
  425. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  426. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  427. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
  428. package/lib/store/sessions/sessionStreamManager.js +209 -277
  429. package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
  430. package/lib/store/sessions/sessions.types.spec.js +16 -0
  431. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  432. package/lib/store/useChatsStore.spec.js +619 -0
  433. package/lib/store/useFaqsStore.spec.js +57 -0
  434. package/lib/styles/cascade.js +29 -3
  435. package/lib/styles/transitions.js +3 -1
  436. package/lib/test/mockSseStream.js +121 -0
  437. package/lib/test/streamdownCodeMock.js +6 -0
  438. package/lib/test/streamdownMock.js +12 -0
  439. package/lib/types/Chat.js +1 -1
  440. package/lib/types/agentModal.js +1 -1
  441. package/lib/types/global.d.js +1 -1
  442. package/lib/types/reasoning.js +1 -1
  443. package/lib/utils/actionCategoryMap.spec.js +18 -0
  444. package/lib/utils/agentDisplayName.spec.js +48 -0
  445. package/lib/utils/autoApproveStorage.spec.js +25 -0
  446. package/lib/utils/chatInputFiles.spec.js +39 -0
  447. package/lib/utils/contextMentionIcons.spec.js +41 -0
  448. package/lib/utils/contextMentionLabel.spec.js +13 -0
  449. package/lib/utils/contextMentionTriggers.spec.js +44 -0
  450. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  451. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  452. package/lib/utils/entityLinkRender.spec.js +72 -0
  453. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  454. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  455. package/lib/utils/formatUnreadCount.spec.js +12 -0
  456. package/lib/utils/getUnitFileSize.spec.js +18 -0
  457. package/lib/utils/hitlAnalytics.spec.js +136 -0
  458. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  459. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  460. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  461. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  462. package/lib/utils/imagePreprocessor.js +12 -37
  463. package/lib/utils/imagePreprocessor.spec.js +112 -0
  464. package/lib/utils/maiaPageRoute.js +24 -0
  465. package/lib/utils/maiaPageRoute.spec.js +23 -0
  466. package/lib/utils/mapBackendLang.spec.js +19 -0
  467. package/lib/utils/navigateContextEntity.spec.js +50 -0
  468. package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
  469. package/lib/utils/openTaskInCorPanel.spec.js +43 -0
  470. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  471. package/lib/utils/reasoningMappers.spec.js +103 -0
  472. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  473. package/lib/utils/renderContextMentions.helpers.js +110 -0
  474. package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
  475. package/lib/utils/renderContextMentions.js +4 -110
  476. package/lib/utils/renderContextMentions.spec.js +268 -0
  477. package/lib/utils/retryCompletion.spec.js +181 -0
  478. package/lib/utils/skillContentSize.spec.js +13 -0
  479. package/lib/utils/slashCommandMarker.spec.js +43 -0
  480. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  481. package/lib/utils/sseStreamContent.spec.js +31 -0
  482. package/lib/utils/streamActivityMessages.helpers.js +223 -0
  483. package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
  484. package/lib/utils/streamActivityMessages.js +33 -238
  485. package/lib/utils/streamActivityMessages.spec.js +336 -0
  486. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  487. package/package.json +2 -2
  488. package/README.md +0 -2
  489. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  490. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  491. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  492. package/lib/types/contextCompaction.js +0 -48
  493. package/lib/types/jest-dom.d.js +0 -2
@@ -1,9 +1,8 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
2
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
4
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
5
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
- import _regeneratorRuntime from "@babel/runtime/regenerator";
7
6
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
8
7
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
9
8
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -14,13 +13,14 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
14
13
  /* eslint-disable no-constant-condition */
15
14
  /* eslint-disable @typescript-eslint/no-explicit-any */
16
15
  import maia from '../../services/maia';
17
- import { getInitialStreamActivity, getThinkingLoadingMessage, getUsingSkillActivity, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity, resolveToolActionLabel } from '../../utils/streamActivityMessages';
16
+ import { getInitialStreamActivity, getThinkingStreamActivity, getUsingSkillActivity, getWritingStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
18
17
  import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
19
18
  import { reasoningStore } from '../../hooks/useReasoningTrace';
20
19
  import { sessionStreamingText } from './sessionStreamingText';
21
20
  import { useSessionsStore } from './useSessionsStore';
22
21
  import { ensureSessionNotificationsInitialized } from './sessionNotifications';
23
22
  import { sessionHitlContext } from './sessionHitlContext';
23
+ import { buildSessionFinishPayload, isAgentTransferNode, isApprovalPreApproved, isRetryTurnNotFoundResponse, parseSseBlock, patchMetaAgentFields, resolveNodeStreamMessage, resolveReasoningStepTool, resolveReasoningStepType, resolveStartStreamGuard, resolveStreamTextChunk, resolveThinkingDelta, shouldAbortSessionStreamOnStop, shouldApplyReasoningStepIndex, shouldAppendThinkingStep, shouldResumeHitlAfterPreApproval, shouldSetIdleOnSilentAbort, shouldShowReasoningToolActivity, splitSseBuffer } from './sessionStreamManager.helpers';
24
24
 
25
25
  /** Compatible con el `t` de i18next (uso de una sola key). */
26
26
 
@@ -42,13 +42,12 @@ var getActiveStreamCount = function getActiveStreamCount() {
42
42
  };
43
43
  var parseSessionSSE = /*#__PURE__*/function () {
44
44
  var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response, active, params) {
45
- var _params$hitlExecution, _response$body, _data$error, _data$error2, _callbacks$onError, _data$error3, _data$error4;
46
- var sessionId, placeholderId, callbacks, t, hitlExecutionContext, pendingContent, throttleTimer, flushToStores, emitThrottled, flushPending, reader, decoder, buffer, accumulatedContent, hasStartedWriting, isUsingSkill, ensureWritingStarted, applyStreamChunk, clearStreamLikeAnswerReset, applyStreamComplete, _yield$reader$read, done, value, lines, _iterator, _step, line, _line$split, _line$split2, eventLine, dataLine, eventType, dataStr, data, thinkingDelta, stepTool, stepType, label, _data$args, chunk, _chunk, _callbacks$onApproval, isPreApproved, _ref3, _t, _t2, _t3;
45
+ var _response$body, _data$error, _data$error2, _callbacks$onError, _data$error3, _data$error4;
46
+ var sessionId, placeholderId, callbacks, t, pendingContent, throttleTimer, flushToStores, emitThrottled, flushPending, reader, decoder, buffer, accumulatedContent, hasStartedWriting, isUsingSkill, setThinkingActivity, ensureWritingStarted, applyStreamChunk, clearStreamLikeAnswerReset, applyStreamComplete, _yield$reader$read, done, value, _splitSseBuffer, blocks, remainder, _iterator, _step, line, parsedBlock, eventType, dataStr, data, _resolveThinkingDelta, index, thinkingDelta, stepTool, stepType, _data$args, stepIndex, chunk, _chunk, _callbacks$onApproval, isPreApproved, _ref2, _t, _t2, _t3;
47
47
  return _regeneratorRuntime.wrap(function (_context) {
48
48
  while (1) switch (_context.prev = _context.next) {
49
49
  case 0:
50
50
  sessionId = params.sessionId, placeholderId = params.placeholderId, callbacks = params.callbacks, t = params.t;
51
- hitlExecutionContext = (_params$hitlExecution = params.hitlExecutionContext) !== null && _params$hitlExecution !== void 0 ? _params$hitlExecution : sessionHitlContext.get(sessionId);
52
51
  pendingContent = null;
53
52
  throttleTimer = null;
54
53
  flushToStores = function flushToStores(content) {
@@ -92,17 +91,39 @@ var parseSessionSSE = /*#__PURE__*/function () {
92
91
  hasStartedWriting = false; // "Usando Skill" queda visible mientras el modelo piensa con la skill cargada;
93
92
  // los deltas de `thinking` no lo pisan hasta la próxima acción o el primer token.
94
93
  isUsingSkill = false;
95
- ensureWritingStarted = function ensureWritingStarted() {
96
- var _callbacks$onStartWri;
97
- if (hasStartedWriting) return;
98
- hasStartedWriting = true;
94
+ setThinkingActivity = function setThinkingActivity() {
95
+ var _store$getMeta;
96
+ var thinkingActivity = getThinkingStreamActivity(t);
97
+ var current = (_store$getMeta = store().getMeta(sessionId)) === null || _store$getMeta === void 0 ? void 0 : _store$getMeta.streamActivity;
98
+ if ((current === null || current === void 0 ? void 0 : current.phase) === 'thinking' && current.message === thinkingActivity.message) return;
99
99
  store().patchMeta(sessionId, {
100
- isLoading: true,
101
- isWriting: true
100
+ isLoading: true
102
101
  });
103
- store().setStatus(sessionId, 'writing');
104
- store().setActivity(sessionId, getWritingStreamActivity(t));
105
- (_callbacks$onStartWri = callbacks.onStartWriting) === null || _callbacks$onStartWri === void 0 || _callbacks$onStartWri.call(callbacks);
102
+ store().setStatus(sessionId, 'thinking');
103
+ store().setActivity(sessionId, thinkingActivity);
104
+ };
105
+ ensureWritingStarted = function ensureWritingStarted() {
106
+ var _store$getMeta2;
107
+ // Cualquier token corta "Usando Skill": el indicador vuelve a alternar pensando / escribiendo.
108
+ isUsingSkill = false;
109
+ if (!hasStartedWriting) {
110
+ var _callbacks$onStartWri;
111
+ hasStartedWriting = true;
112
+ store().patchMeta(sessionId, {
113
+ isLoading: true,
114
+ isWriting: true
115
+ });
116
+ (_callbacks$onStartWri = callbacks.onStartWriting) === null || _callbacks$onStartWri === void 0 || _callbacks$onStartWri.call(callbacks);
117
+ }
118
+ var current = (_store$getMeta2 = store().getMeta(sessionId)) === null || _store$getMeta2 === void 0 ? void 0 : _store$getMeta2.streamActivity;
119
+ if ((current === null || current === void 0 ? void 0 : current.phase) !== 'writing') {
120
+ store().patchMeta(sessionId, {
121
+ isLoading: true,
122
+ isWriting: true
123
+ });
124
+ store().setStatus(sessionId, 'writing');
125
+ store().setActivity(sessionId, getWritingStreamActivity(t));
126
+ }
106
127
  };
107
128
  applyStreamChunk = function applyStreamChunk(chunk) {
108
129
  if (!chunk) return;
@@ -121,23 +142,9 @@ var parseSessionSSE = /*#__PURE__*/function () {
121
142
  reasoningStore.markAnswerReset(placeholderId);
122
143
  };
123
144
  applyStreamComplete = function applyStreamComplete(payload) {
124
- var _payload$agent_id, _subagentRaw$resolved, _ref2, _callbacks$onFinishSt;
125
- var finalContent = payload.content || accumulatedContent;
126
- var sources = payload.sources || null;
127
- var memorySessionId = payload.memory_session_id || '';
128
- var attachments = Array.isArray(payload.attachments) ? payload.attachments : null;
129
- var suggestions = null;
130
- if (Array.isArray(payload.suggest_reply)) {
131
- suggestions = payload.suggest_reply;
132
- } else if (Array.isArray(payload.suggestions)) {
133
- suggestions = payload.suggestions;
134
- }
135
- var agentIdRaw = (_payload$agent_id = payload.agent_id) !== null && _payload$agent_id !== void 0 ? _payload$agent_id : payload.agentId;
136
- var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
137
- var subagentRaw = payload.subagent;
138
- var resolvedContext = (_subagentRaw$resolved = subagentRaw === null || subagentRaw === void 0 ? void 0 : subagentRaw.resolved_context) !== null && _subagentRaw$resolved !== void 0 ? _subagentRaw$resolved : null;
139
- var reasoning = (_ref2 = payload.reasoning) !== null && _ref2 !== void 0 ? _ref2 : null;
140
- reasoningStore.finish(placeholderId, reasoning);
145
+ var _callbacks$onFinishSt;
146
+ var finishPayload = buildSessionFinishPayload(payload, accumulatedContent);
147
+ reasoningStore.finish(placeholderId, finishPayload.reasoning);
141
148
  flushPending();
142
149
  store().patchMeta(sessionId, {
143
150
  isLoading: false,
@@ -145,16 +152,6 @@ var parseSessionSSE = /*#__PURE__*/function () {
145
152
  });
146
153
  store().setActivity(sessionId, null);
147
154
  store().setStatus(sessionId, 'complete');
148
- var finishPayload = {
149
- content: finalContent,
150
- sources: sources,
151
- memorySessionId: memorySessionId,
152
- attachments: attachments,
153
- suggestions: suggestions,
154
- completedAgentId: completedAgentId,
155
- resolvedContext: resolvedContext,
156
- reasoning: reasoning
157
- };
158
155
  (_callbacks$onFinishSt = callbacks.onFinishStream) === null || _callbacks$onFinishSt === void 0 || _callbacks$onFinishSt.call(callbacks, finishPayload);
159
156
 
160
157
  // El texto en vivo NO se limpia acá a propósito. El placeholder se va con el
@@ -168,15 +165,15 @@ var parseSessionSSE = /*#__PURE__*/function () {
168
165
  _context.prev = 2;
169
166
  case 3:
170
167
  if (!true) {
171
- _context.next = 32;
168
+ _context.next = 30;
172
169
  break;
173
170
  }
174
- if (!active.isStopped) {
171
+ if (!shouldAbortSessionStreamOnStop(active.isStopped)) {
175
172
  _context.next = 4;
176
173
  break;
177
174
  }
178
175
  reader.cancel();
179
- return _context.abrupt("continue", 32);
176
+ return _context.abrupt("continue", 30);
180
177
  case 4:
181
178
  _context.next = 5;
182
179
  return reader.read();
@@ -188,68 +185,53 @@ var parseSessionSSE = /*#__PURE__*/function () {
188
185
  _context.next = 6;
189
186
  break;
190
187
  }
191
- return _context.abrupt("continue", 32);
188
+ return _context.abrupt("continue", 30);
192
189
  case 6:
193
- if (!active.isStopped) {
190
+ if (!shouldAbortSessionStreamOnStop(active.isStopped)) {
194
191
  _context.next = 7;
195
192
  break;
196
193
  }
197
194
  reader.cancel();
198
- return _context.abrupt("continue", 32);
195
+ return _context.abrupt("continue", 30);
199
196
  case 7:
200
197
  buffer += decoder.decode(value, {
201
198
  stream: true
202
199
  });
203
- lines = buffer.split('\n\n');
204
- buffer = lines.pop() || '';
205
- _iterator = _createForOfIteratorHelper(lines);
200
+ _splitSseBuffer = splitSseBuffer(buffer), blocks = _splitSseBuffer.blocks, remainder = _splitSseBuffer.remainder;
201
+ buffer = remainder;
202
+ _iterator = _createForOfIteratorHelper(blocks);
206
203
  _context.prev = 8;
207
204
  _iterator.s();
208
205
  case 9:
209
206
  if ((_step = _iterator.n()).done) {
210
- _context.next = 28;
207
+ _context.next = 26;
211
208
  break;
212
209
  }
213
210
  line = _step.value;
214
- if (!(line.trim() === '')) {
211
+ parsedBlock = parseSseBlock(line);
212
+ if (parsedBlock) {
215
213
  _context.next = 10;
216
214
  break;
217
215
  }
218
- return _context.abrupt("continue", 27);
216
+ return _context.abrupt("continue", 25);
219
217
  case 10:
220
- _line$split = line.split('\n'), _line$split2 = _slicedToArray(_line$split, 2), eventLine = _line$split2[0], dataLine = _line$split2[1];
221
- if (!(!eventLine || !dataLine)) {
222
- _context.next = 11;
223
- break;
224
- }
225
- return _context.abrupt("continue", 27);
226
- case 11:
227
- eventType = eventLine.replace('event: ', '').trim();
228
- dataStr = dataLine.replace('data: ', '').trim();
229
- _context.prev = 12;
218
+ eventType = parsedBlock.eventType, dataStr = parsedBlock.dataStr;
219
+ _context.prev = 11;
230
220
  data = JSON.parse(dataStr);
231
221
  _t = eventType;
232
- _context.next = _t === 'thinking' ? 13 : _t === 'using_skill' ? 14 : _t === 'answer_reset' ? 15 : _t === 'context_compacted' ? 16 : _t === 'reasoning_step' ? 17 : _t === 'token' ? 18 : _t === 'content' ? 19 : _t === 'node' ? 20 : _t === 'complete' ? 21 : _t === 'approval_required' ? 22 : _t === 'error' ? 23 : 24;
222
+ _context.next = _t === 'thinking' ? 12 : _t === 'using_skill' ? 13 : _t === 'answer_reset' ? 14 : _t === 'reasoning_step' ? 15 : _t === 'token' ? 16 : _t === 'content' ? 17 : _t === 'node' ? 18 : _t === 'complete' ? 19 : _t === 'approval_required' ? 20 : _t === 'error' ? 21 : 22;
233
223
  break;
234
- case 13:
235
- thinkingDelta = typeof data.delta === 'string' ? data.delta : '';
236
- if (typeof data.i === 'number' && thinkingDelta) {
237
- reasoningStore.appendThinking(placeholderId, data.i, thinkingDelta);
224
+ case 12:
225
+ _resolveThinkingDelta = resolveThinkingDelta(data), index = _resolveThinkingDelta.index, thinkingDelta = _resolveThinkingDelta.delta;
226
+ if (shouldAppendThinkingStep(index, thinkingDelta)) {
227
+ reasoningStore.appendThinking(placeholderId, index, thinkingDelta);
238
228
  }
239
- if (!hasStartedWriting) {
240
- store().patchMeta(sessionId, {
241
- isLoading: true
242
- });
243
- store().setStatus(sessionId, 'thinking');
244
- if (!isUsingSkill) {
245
- store().setActivity(sessionId, {
246
- phase: 'thinking',
247
- message: getThinkingLoadingMessage(0, t)
248
- });
249
- }
229
+ // Mientras dura "Usando Skill" los deltas de thinking no pisan la actividad.
230
+ if (!isUsingSkill) {
231
+ setThinkingActivity();
250
232
  }
251
- return _context.abrupt("continue", 25);
252
- case 14:
233
+ return _context.abrupt("continue", 23);
234
+ case 13:
253
235
  if (!hasStartedWriting) {
254
236
  isUsingSkill = true;
255
237
  store().patchMeta(sessionId, {
@@ -258,79 +240,69 @@ var parseSessionSSE = /*#__PURE__*/function () {
258
240
  store().setStatus(sessionId, 'thinking');
259
241
  store().setActivity(sessionId, getUsingSkillActivity(t, data.skill));
260
242
  }
261
- return _context.abrupt("continue", 25);
262
- case 15:
243
+ return _context.abrupt("continue", 23);
244
+ case 14:
263
245
  clearStreamLikeAnswerReset();
264
- return _context.abrupt("continue", 25);
265
- case 16:
266
- reasoningStore.setCompaction(placeholderId, data);
267
- return _context.abrupt("continue", 25);
268
- case 17:
269
- stepTool = typeof data.tool === 'string' ? data.tool : '';
270
- stepType = typeof data.type === 'string' ? data.type : '';
271
- if (stepTool && stepType !== 'handoff' && data.status === 'running') {
272
- label = resolveToolActionLabel(stepTool, t, 'present');
273
- if (label) {
274
- isUsingSkill = stepTool === 'get_skill';
246
+ return _context.abrupt("continue", 23);
247
+ case 15:
248
+ stepTool = resolveReasoningStepTool(data);
249
+ stepType = resolveReasoningStepType(data);
250
+ if (shouldShowReasoningToolActivity(stepTool, stepType, data.status)) {
251
+ isUsingSkill = stepTool === 'get_skill';
252
+ if (isUsingSkill) {
253
+ // El step de `get_skill` llega justo después de `using_skill`: mantiene el nombre.
275
254
  store().patchMeta(sessionId, {
276
255
  isLoading: true
277
256
  });
278
- // El step de `get_skill` llega justo después de `using_skill`: mantiene el nombre.
279
- store().setActivity(sessionId, isUsingSkill ? getUsingSkillActivity(t, (_data$args = data.args) === null || _data$args === void 0 ? void 0 : _data$args.name) : {
280
- phase: 'action',
281
- message: label
282
- });
257
+ store().setStatus(sessionId, 'thinking');
258
+ store().setActivity(sessionId, getUsingSkillActivity(t, (_data$args = data.args) === null || _data$args === void 0 ? void 0 : _data$args.name));
259
+ } else {
260
+ setThinkingActivity();
283
261
  }
284
262
  }
285
- if (typeof data.i === 'number') {
263
+ if (shouldApplyReasoningStepIndex(data.i)) {
264
+ stepIndex = data.i;
286
265
  reasoningStore.captureLeadingFromBody(placeholderId, accumulatedContent);
287
- reasoningStore.applyStep(placeholderId, data);
266
+ reasoningStore.applyStep(placeholderId, _objectSpread(_objectSpread({}, data), {}, {
267
+ i: stepIndex
268
+ }));
288
269
  if (reasoningStore.shouldClearStreamForLeading(placeholderId, accumulatedContent)) {
289
270
  clearStreamLikeAnswerReset();
290
271
  }
291
272
  }
292
- return _context.abrupt("continue", 25);
293
- case 18:
294
- chunk = typeof data.content === 'string' ? data.content : '';
273
+ return _context.abrupt("continue", 23);
274
+ case 16:
275
+ chunk = resolveStreamTextChunk(data);
295
276
  ensureWritingStarted();
296
277
  applyStreamChunk(chunk);
297
- return _context.abrupt("continue", 25);
298
- case 19:
299
- _chunk = typeof data.content === 'string' ? data.content : '';
278
+ return _context.abrupt("continue", 23);
279
+ case 17:
280
+ _chunk = resolveStreamTextChunk(data);
300
281
  ensureWritingStarted();
301
282
  applyStreamChunk(_chunk);
302
283
  if (isCompleteLikeSsePayload(data)) {
303
284
  applyStreamComplete(data);
304
285
  }
305
- return _context.abrupt("continue", 25);
306
- case 20:
286
+ return _context.abrupt("continue", 23);
287
+ case 18:
307
288
  isUsingSkill = false;
308
- if (data.node === 'agent_transfer') {
309
- store().patchMeta(sessionId, {
310
- isLoading: true
311
- });
312
- store().setStatus(sessionId, 'thinking');
313
- } else if (data.message && typeof data.message === 'string') {
314
- store().patchMeta(sessionId, {
315
- isLoading: true
316
- });
317
- store().setStatus(sessionId, 'thinking');
318
- store().setActivity(sessionId, resolveHitlNodeStreamActivity(data.message, t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined, typeof data.thread_id === 'string' ? data.thread_id : undefined));
289
+ if (isAgentTransferNode(data) || resolveNodeStreamMessage(data)) {
290
+ setThinkingActivity();
319
291
  }
320
- return _context.abrupt("continue", 25);
321
- case 21:
292
+ return _context.abrupt("continue", 23);
293
+ case 19:
322
294
  applyStreamComplete(data);
323
- return _context.abrupt("continue", 25);
324
- case 22:
295
+ return _context.abrupt("continue", 23);
296
+ case 20:
325
297
  flushPending();
326
298
  // Preaprobado (auto-approve o detección manual): el stream no se corta,
327
299
  // sigue ejecutando las acciones sin esperar decisión del usuario.
328
- isPreApproved = data.manual_approval_detected === true || data.auto_approved === true || data.approval_status === 'approved';
300
+ isPreApproved = isApprovalPreApproved(data);
329
301
  store().patchMeta(sessionId, {
330
302
  isWriting: false
331
303
  });
332
304
  if (!isPreApproved) {
333
- reasoningStore.finish(placeholderId, (_ref3 = data.reasoning) !== null && _ref3 !== void 0 ? _ref3 : null);
305
+ reasoningStore.finish(placeholderId, (_ref2 = data.reasoning) !== null && _ref2 !== void 0 ? _ref2 : null);
334
306
  store().patchMeta(sessionId, {
335
307
  isLoading: false
336
308
  });
@@ -339,15 +311,11 @@ var parseSessionSSE = /*#__PURE__*/function () {
339
311
  }
340
312
  store().setStatus(sessionId, 'awaiting_approval');
341
313
  (_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, data, accumulatedContent);
342
- if (isPreApproved && Array.isArray(data.pending_actions) && data.pending_actions.length > 0) {
343
- store().patchMeta(sessionId, {
344
- isLoading: true
345
- });
346
- store().setStatus(sessionId, 'thinking');
347
- store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined));
314
+ if (shouldResumeHitlAfterPreApproval(isPreApproved, data.pending_actions)) {
315
+ setThinkingActivity();
348
316
  }
349
- return _context.abrupt("continue", 25);
350
- case 23:
317
+ return _context.abrupt("continue", 23);
318
+ case 21:
351
319
  console.error('SSE Error:', data.error);
352
320
  flushPending();
353
321
  sessionStreamingText.clear(sessionId);
@@ -362,43 +330,43 @@ var parseSessionSSE = /*#__PURE__*/function () {
362
330
  });
363
331
  store().setStatus(sessionId, 'error');
364
332
  (_callbacks$onError = callbacks.onError) === null || _callbacks$onError === void 0 || _callbacks$onError.call(callbacks, (_data$error3 = data.error) === null || _data$error3 === void 0 ? void 0 : _data$error3.type, (_data$error4 = data.error) === null || _data$error4 === void 0 ? void 0 : _data$error4.message);
365
- return _context.abrupt("continue", 25);
366
- case 24:
333
+ return _context.abrupt("continue", 23);
334
+ case 22:
367
335
  console.warn('Unknown SSE event type:', eventType);
368
- return _context.abrupt("continue", 25);
369
- case 25:
370
- _context.next = 27;
336
+ return _context.abrupt("continue", 23);
337
+ case 23:
338
+ _context.next = 25;
371
339
  break;
372
- case 26:
373
- _context.prev = 26;
374
- _t2 = _context["catch"](12);
340
+ case 24:
341
+ _context.prev = 24;
342
+ _t2 = _context["catch"](11);
375
343
  console.error('Error parsing SSE data:', _t2, dataStr);
376
- case 27:
344
+ case 25:
377
345
  _context.next = 9;
378
346
  break;
379
- case 28:
380
- _context.next = 30;
347
+ case 26:
348
+ _context.next = 28;
381
349
  break;
382
- case 29:
383
- _context.prev = 29;
350
+ case 27:
351
+ _context.prev = 27;
384
352
  _t3 = _context["catch"](8);
385
353
  _iterator.e(_t3);
386
- case 30:
387
- _context.prev = 30;
354
+ case 28:
355
+ _context.prev = 28;
388
356
  _iterator.f();
389
- return _context.finish(30);
390
- case 31:
357
+ return _context.finish(28);
358
+ case 29:
391
359
  _context.next = 3;
392
360
  break;
393
- case 32:
394
- _context.prev = 32;
361
+ case 30:
362
+ _context.prev = 30;
395
363
  flushPending();
396
- return _context.finish(32);
397
- case 33:
364
+ return _context.finish(30);
365
+ case 31:
398
366
  case "end":
399
367
  return _context.stop();
400
368
  }
401
- }, _callee, null, [[2,, 32, 33], [8, 29, 30, 31], [12, 26]]);
369
+ }, _callee, null, [[2,, 30, 31], [8, 27, 28, 29], [11, 24]]);
402
370
  }));
403
371
  return function parseSessionSSE(_x, _x2, _x3) {
404
372
  return _ref.apply(this, arguments);
@@ -419,30 +387,22 @@ export var sessionStreamManager = {
419
387
  },
420
388
  startStream: function startStream(params) {
421
389
  return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
422
- var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, controller, active, response, _callbacks$onError2, _t4;
390
+ var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, startGuard, controller, active, response, _callbacks$onError2, _t4;
423
391
  return _regeneratorRuntime.wrap(function (_context2) {
424
392
  while (1) switch (_context2.prev = _context2.next) {
425
393
  case 0:
426
394
  ensureSessionNotificationsInitialized();
427
395
  sessionId = params.sessionId, placeholderId = params.placeholderId, request = params.request, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
428
- if (!isStreamActive(sessionId)) {
396
+ startGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
397
+ if (startGuard.allowed) {
429
398
  _context2.next = 1;
430
399
  break;
431
400
  }
432
401
  return _context2.abrupt("return", {
433
402
  started: false,
434
- reason: 'already_active'
403
+ reason: startGuard.reason
435
404
  });
436
405
  case 1:
437
- if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
438
- _context2.next = 2;
439
- break;
440
- }
441
- return _context2.abrupt("return", {
442
- started: false,
443
- reason: 'limit'
444
- });
445
- case 2:
446
406
  controller = new AbortController();
447
407
  active = {
448
408
  sessionId: sessionId,
@@ -451,33 +411,29 @@ export var sessionStreamManager = {
451
411
  };
452
412
  activeStreams.set(sessionId, active);
453
413
  store().ensureSession(sessionId);
454
- store().patchMeta(sessionId, _objectSpread(_objectSpread({
414
+ store().patchMeta(sessionId, _objectSpread({
455
415
  placeholderId: placeholderId,
456
416
  error: null,
457
417
  isLoading: true,
458
418
  isWriting: false
459
- }, agentId != null ? {
460
- agentId: agentId
461
- } : {}), agentName != null ? {
462
- agentName: agentName
463
- } : {}));
419
+ }, patchMetaAgentFields(agentId, agentName)));
464
420
  store().setStatus(sessionId, 'thinking');
465
421
  sessionStreamingText.start(sessionId, placeholderId);
466
422
  reasoningStore.start(placeholderId);
467
423
  store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
468
- _context2.prev = 3;
469
- _context2.next = 4;
424
+ _context2.prev = 2;
425
+ _context2.next = 3;
470
426
  return maia.Orchestrator.orchestrator(request, controller.signal);
471
- case 4:
427
+ case 3:
472
428
  response = _context2.sent;
473
- _context2.next = 5;
429
+ _context2.next = 4;
474
430
  return parseSessionSSE(response, active, params);
475
- case 5:
476
- _context2.next = 7;
431
+ case 4:
432
+ _context2.next = 6;
477
433
  break;
478
- case 6:
479
- _context2.prev = 6;
480
- _t4 = _context2["catch"](3);
434
+ case 5:
435
+ _context2.prev = 5;
436
+ _t4 = _context2["catch"](2);
481
437
  if (!active.isStopped) {
482
438
  sessionStreamingText.clear(sessionId);
483
439
  store().patchMeta(sessionId, {
@@ -488,48 +444,40 @@ export var sessionStreamManager = {
488
444
  store().setStatus(sessionId, 'error');
489
445
  (_callbacks$onError2 = callbacks.onError) === null || _callbacks$onError2 === void 0 || _callbacks$onError2.call(callbacks);
490
446
  }
491
- case 7:
492
- _context2.prev = 7;
447
+ case 6:
448
+ _context2.prev = 6;
493
449
  activeStreams["delete"](sessionId);
494
- return _context2.finish(7);
495
- case 8:
450
+ return _context2.finish(6);
451
+ case 7:
496
452
  return _context2.abrupt("return", {
497
453
  started: true
498
454
  });
499
- case 9:
455
+ case 8:
500
456
  case "end":
501
457
  return _context2.stop();
502
458
  }
503
- }, _callee2, null, [[3, 6, 7, 8]]);
459
+ }, _callee2, null, [[2, 5, 6, 7]]);
504
460
  }))();
505
461
  },
506
462
  /** Resume HITL (`continue-thread`) keyed por sessionId — mismo motor que orchestrator. */startContinueStream: function startContinueStream(params) {
507
463
  return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
508
- var _ref4;
509
- var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, controller, active, sseParams, response, _callbacks$onError3, _t5;
464
+ var _ref3;
465
+ var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, continueGuard, controller, active, sseParams, response, _callbacks$onError3, _t5;
510
466
  return _regeneratorRuntime.wrap(function (_context3) {
511
467
  while (1) switch (_context3.prev = _context3.next) {
512
468
  case 0:
513
469
  ensureSessionNotificationsInitialized();
514
470
  sessionId = params.sessionId, placeholderId = params.placeholderId, continueRequest = params.continueRequest, callbacks = params.callbacks, t = params.t, hitlExecutionContext = params.hitlExecutionContext, agentId = params.agentId, agentName = params.agentName;
515
- if (!isStreamActive(sessionId)) {
471
+ continueGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
472
+ if (continueGuard.allowed) {
516
473
  _context3.next = 1;
517
474
  break;
518
475
  }
519
476
  return _context3.abrupt("return", {
520
477
  started: false,
521
- reason: 'already_active'
478
+ reason: continueGuard.reason
522
479
  });
523
480
  case 1:
524
- if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
525
- _context3.next = 2;
526
- break;
527
- }
528
- return _context3.abrupt("return", {
529
- started: false,
530
- reason: 'limit'
531
- });
532
- case 2:
533
481
  if (hitlExecutionContext) {
534
482
  sessionHitlContext.set(sessionId, hitlExecutionContext);
535
483
  }
@@ -541,19 +489,15 @@ export var sessionStreamManager = {
541
489
  };
542
490
  activeStreams.set(sessionId, active);
543
491
  store().ensureSession(sessionId);
544
- store().patchMeta(sessionId, _objectSpread(_objectSpread({
492
+ store().patchMeta(sessionId, _objectSpread({
545
493
  placeholderId: placeholderId,
546
494
  error: null,
547
495
  isLoading: true,
548
496
  isWriting: false
549
- }, agentId != null ? {
550
- agentId: agentId
551
- } : {}), agentName != null ? {
552
- agentName: agentName
553
- } : {}));
497
+ }, patchMetaAgentFields(agentId, agentName)));
554
498
  store().setStatus(sessionId, 'thinking');
555
499
  sessionStreamingText.start(sessionId, placeholderId);
556
- store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (_ref4 = hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId)) !== null && _ref4 !== void 0 ? _ref4 : undefined));
500
+ store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (_ref3 = hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId)) !== null && _ref3 !== void 0 ? _ref3 : undefined));
557
501
  sseParams = {
558
502
  sessionId: sessionId,
559
503
  placeholderId: placeholderId,
@@ -564,25 +508,25 @@ export var sessionStreamManager = {
564
508
  agentId: agentId,
565
509
  agentName: agentName
566
510
  };
567
- _context3.prev = 3;
568
- _context3.next = 4;
511
+ _context3.prev = 2;
512
+ _context3.next = 3;
569
513
  return maia.Orchestrator.continueThread(continueRequest, controller.signal);
570
- case 4:
514
+ case 3:
571
515
  response = _context3.sent;
572
516
  if (response.ok) {
573
- _context3.next = 5;
517
+ _context3.next = 4;
574
518
  break;
575
519
  }
576
520
  throw new Error("continue-thread failed: ".concat(response.status));
577
- case 5:
578
- _context3.next = 6;
521
+ case 4:
522
+ _context3.next = 5;
579
523
  return parseSessionSSE(response, active, sseParams);
580
- case 6:
581
- _context3.next = 8;
524
+ case 5:
525
+ _context3.next = 7;
582
526
  break;
583
- case 7:
584
- _context3.prev = 7;
585
- _t5 = _context3["catch"](3);
527
+ case 6:
528
+ _context3.prev = 6;
529
+ _t5 = _context3["catch"](2);
586
530
  if (!active.isStopped) {
587
531
  sessionStreamingText.clear(sessionId);
588
532
  store().patchMeta(sessionId, {
@@ -593,48 +537,40 @@ export var sessionStreamManager = {
593
537
  store().setStatus(sessionId, 'error');
594
538
  (_callbacks$onError3 = callbacks.onError) === null || _callbacks$onError3 === void 0 || _callbacks$onError3.call(callbacks);
595
539
  }
596
- case 8:
597
- _context3.prev = 8;
540
+ case 7:
541
+ _context3.prev = 7;
598
542
  activeStreams["delete"](sessionId);
599
543
  sessionHitlContext.clear(sessionId);
600
- return _context3.finish(8);
601
- case 9:
544
+ return _context3.finish(7);
545
+ case 8:
602
546
  return _context3.abrupt("return", {
603
547
  started: true
604
548
  });
605
- case 10:
549
+ case 9:
606
550
  case "end":
607
551
  return _context3.stop();
608
552
  }
609
- }, _callee3, null, [[3, 7, 8, 9]]);
553
+ }, _callee3, null, [[2, 6, 7, 8]]);
610
554
  }))();
611
555
  },
612
556
  /** Regenera la respuesta de un turno (`retry_completion`) — mismo motor SSE que orchestrator. */startRetryStream: function startRetryStream(params) {
613
557
  return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
614
- var sessionId, placeholderId, retryRequest, callbacks, t, activityOptions, agentId, agentName, controller, active, sseParams, response, detail, data, _callbacks$onError4, _t6, _t7;
558
+ var sessionId, placeholderId, retryRequest, callbacks, t, activityOptions, agentId, agentName, retryGuard, controller, active, sseParams, response, detail, data, _callbacks$onError4, _t6, _t7;
615
559
  return _regeneratorRuntime.wrap(function (_context4) {
616
560
  while (1) switch (_context4.prev = _context4.next) {
617
561
  case 0:
618
562
  ensureSessionNotificationsInitialized();
619
563
  sessionId = params.sessionId, placeholderId = params.placeholderId, retryRequest = params.retryRequest, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
620
- if (!isStreamActive(sessionId)) {
564
+ retryGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
565
+ if (retryGuard.allowed) {
621
566
  _context4.next = 1;
622
567
  break;
623
568
  }
624
569
  return _context4.abrupt("return", {
625
570
  started: false,
626
- reason: 'already_active'
571
+ reason: retryGuard.reason
627
572
  });
628
573
  case 1:
629
- if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
630
- _context4.next = 2;
631
- break;
632
- }
633
- return _context4.abrupt("return", {
634
- started: false,
635
- reason: 'limit'
636
- });
637
- case 2:
638
574
  controller = new AbortController();
639
575
  active = {
640
576
  sessionId: sessionId,
@@ -643,16 +579,12 @@ export var sessionStreamManager = {
643
579
  };
644
580
  activeStreams.set(sessionId, active);
645
581
  store().ensureSession(sessionId);
646
- store().patchMeta(sessionId, _objectSpread(_objectSpread({
582
+ store().patchMeta(sessionId, _objectSpread({
647
583
  placeholderId: placeholderId,
648
584
  error: null,
649
585
  isLoading: true,
650
586
  isWriting: false
651
- }, agentId != null ? {
652
- agentId: agentId
653
- } : {}), agentName != null ? {
654
- agentName: agentName
655
- } : {}));
587
+ }, patchMetaAgentFields(agentId, agentName)));
656
588
  store().setStatus(sessionId, 'thinking');
657
589
  sessionStreamingText.start(sessionId, placeholderId);
658
590
  store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
@@ -666,34 +598,34 @@ export var sessionStreamManager = {
666
598
  agentId: agentId,
667
599
  agentName: agentName
668
600
  };
669
- _context4.prev = 3;
670
- _context4.next = 4;
601
+ _context4.prev = 2;
602
+ _context4.next = 3;
671
603
  return maia.Orchestrator.retryCompletion(retryRequest, controller.signal);
672
- case 4:
604
+ case 3:
673
605
  response = _context4.sent;
674
606
  if (response.ok) {
675
- _context4.next = 10;
607
+ _context4.next = 9;
676
608
  break;
677
609
  }
678
610
  if (!(response.status === 404)) {
679
- _context4.next = 9;
611
+ _context4.next = 8;
680
612
  break;
681
613
  }
682
- _context4.prev = 5;
683
- _context4.next = 6;
614
+ _context4.prev = 4;
615
+ _context4.next = 5;
684
616
  return response.json();
685
- case 6:
617
+ case 5:
686
618
  data = _context4.sent;
687
619
  detail = typeof data.detail === 'string' ? data.detail : undefined;
688
- _context4.next = 8;
620
+ _context4.next = 7;
689
621
  break;
690
- case 7:
691
- _context4.prev = 7;
692
- _t6 = _context4["catch"](5);
622
+ case 6:
623
+ _context4.prev = 6;
624
+ _t6 = _context4["catch"](4);
693
625
  detail = undefined;
694
- case 8:
695
- if (!(detail === 'Turn not found')) {
696
- _context4.next = 9;
626
+ case 7:
627
+ if (!isRetryTurnNotFoundResponse(response.status, detail)) {
628
+ _context4.next = 8;
697
629
  break;
698
630
  }
699
631
  sessionStreamingText.clear(sessionId);
@@ -709,17 +641,17 @@ export var sessionStreamManager = {
709
641
  started: false,
710
642
  reason: 'turn_not_found'
711
643
  });
712
- case 9:
644
+ case 8:
713
645
  throw new Error("retry_completion failed: ".concat(response.status));
714
- case 10:
715
- _context4.next = 11;
646
+ case 9:
647
+ _context4.next = 10;
716
648
  return parseSessionSSE(response, active, sseParams);
717
- case 11:
718
- _context4.next = 13;
649
+ case 10:
650
+ _context4.next = 12;
719
651
  break;
720
- case 12:
721
- _context4.prev = 12;
722
- _t7 = _context4["catch"](3);
652
+ case 11:
653
+ _context4.prev = 11;
654
+ _t7 = _context4["catch"](2);
723
655
  if (!active.isStopped) {
724
656
  sessionStreamingText.clear(sessionId);
725
657
  store().patchMeta(sessionId, {
@@ -730,19 +662,19 @@ export var sessionStreamManager = {
730
662
  store().setStatus(sessionId, 'error');
731
663
  (_callbacks$onError4 = callbacks.onError) === null || _callbacks$onError4 === void 0 || _callbacks$onError4.call(callbacks);
732
664
  }
733
- case 13:
734
- _context4.prev = 13;
665
+ case 12:
666
+ _context4.prev = 12;
735
667
  activeStreams["delete"](sessionId);
736
- return _context4.finish(13);
737
- case 14:
668
+ return _context4.finish(12);
669
+ case 13:
738
670
  return _context4.abrupt("return", {
739
671
  started: true
740
672
  });
741
- case 15:
673
+ case 14:
742
674
  case "end":
743
675
  return _context4.stop();
744
676
  }
745
- }, _callee4, null, [[3, 12, 13, 14], [5, 7]]);
677
+ }, _callee4, null, [[2, 11, 12, 13], [4, 6]]);
746
678
  }))();
747
679
  },
748
680
  /** Cancelación explícita del usuario (mensaje "cancelado"). */stopStream: function stopStream(sessionId, callbacks) {
@@ -765,7 +697,7 @@ export var sessionStreamManager = {
765
697
  callbacks === null || callbacks === void 0 || (_callbacks$onStop = callbacks.onStop) === null || _callbacks$onStop === void 0 || _callbacks$onStop.call(callbacks, partialText);
766
698
  },
767
699
  /** Aborta sin marcar "cancelado" (uso interno / limpieza). */abortSilently: function abortSilently(sessionId) {
768
- var _store$getMeta;
700
+ var _store$getMeta3;
769
701
  var active = activeStreams.get(sessionId);
770
702
  if (!active) return;
771
703
  active.isStopped = true;
@@ -777,7 +709,7 @@ export var sessionStreamManager = {
777
709
  isWriting: false
778
710
  });
779
711
  store().setActivity(sessionId, null);
780
- if (((_store$getMeta = store().getMeta(sessionId)) === null || _store$getMeta === void 0 ? void 0 : _store$getMeta.status) !== 'complete') {
712
+ if (shouldSetIdleOnSilentAbort((_store$getMeta3 = store().getMeta(sessionId)) === null || _store$getMeta3 === void 0 ? void 0 : _store$getMeta3.status)) {
781
713
  store().setStatus(sessionId, 'idle');
782
714
  }
783
715
  },
@@ -788,4 +720,4 @@ export var sessionStreamManager = {
788
720
  });
789
721
  }
790
722
  };
791
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSIsImdldFVzaW5nU2tpbGxBY3Rpdml0eSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJyZXNvbHZlVG9vbEFjdGlvbkxhYmVsIiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsInJlYXNvbmluZ1N0b3JlIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsInNlc3Npb25IaXRsQ29udGV4dCIsIk1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCJTVFJFQU1fVEhST1RUTEVfTVMiLCJhY3RpdmVTdHJlYW1zIiwiTWFwIiwic3RvcmUiLCJnZXRTdGF0ZSIsImlzU3RyZWFtQWN0aXZlIiwic2Vzc2lvbklkIiwiaGFzIiwiZ2V0QWN0aXZlU3RyZWFtQ291bnQiLCJzaXplIiwicGFyc2VTZXNzaW9uU1NFIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJhY3RpdmUiLCJwYXJhbXMiLCJfcGFyYW1zJGhpdGxFeGVjdXRpb24iLCJfcmVzcG9uc2UkYm9keSIsIl9kYXRhJGVycm9yIiwiX2RhdGEkZXJyb3IyIiwiX2NhbGxiYWNrcyRvbkVycm9yIiwiX2RhdGEkZXJyb3IzIiwiX2RhdGEkZXJyb3I0IiwicGxhY2Vob2xkZXJJZCIsImNhbGxiYWNrcyIsInQiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsInBlbmRpbmdDb250ZW50IiwidGhyb3R0bGVUaW1lciIsImZsdXNoVG9TdG9yZXMiLCJlbWl0VGhyb3R0bGVkIiwiZmx1c2hQZW5kaW5nIiwicmVhZGVyIiwiZGVjb2RlciIsImJ1ZmZlciIsImFjY3VtdWxhdGVkQ29udGVudCIsImhhc1N0YXJ0ZWRXcml0aW5nIiwiaXNVc2luZ1NraWxsIiwiZW5zdXJlV3JpdGluZ1N0YXJ0ZWQiLCJhcHBseVN0cmVhbUNodW5rIiwiY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQiLCJhcHBseVN0cmVhbUNvbXBsZXRlIiwiX3lpZWxkJHJlYWRlciRyZWFkIiwiZG9uZSIsInZhbHVlIiwibGluZXMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImxpbmUiLCJfbGluZSRzcGxpdCIsIl9saW5lJHNwbGl0MiIsImV2ZW50TGluZSIsImRhdGFMaW5lIiwiZXZlbnRUeXBlIiwiZGF0YVN0ciIsImRhdGEiLCJ0aGlua2luZ0RlbHRhIiwic3RlcFRvb2wiLCJzdGVwVHlwZSIsImxhYmVsIiwiX2RhdGEkYXJncyIsImNodW5rIiwiX2NodW5rIiwiX2NhbGxiYWNrcyRvbkFwcHJvdmFsIiwiaXNQcmVBcHByb3ZlZCIsIl9yZWYzIiwiX3QiLCJfdDIiLCJfdDMiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImdldCIsImNvbnRlbnQiLCJfY2FsbGJhY2tzJG9uU3RyZWFtVXAiLCJzZXRUZXh0Iiwib25TdHJlYW1VcGRhdGUiLCJjYWxsIiwid2luZG93Iiwic2V0VGltZW91dCIsInRvRW1pdCIsImNsZWFyVGltZW91dCIsImJvZHkiLCJnZXRSZWFkZXIiLCJFcnJvciIsIlRleHREZWNvZGVyIiwiX2NhbGxiYWNrcyRvblN0YXJ0V3JpIiwicGF0Y2hNZXRhIiwiaXNMb2FkaW5nIiwiaXNXcml0aW5nIiwic2V0U3RhdHVzIiwic2V0QWN0aXZpdHkiLCJvblN0YXJ0V3JpdGluZyIsInN5bmNMaXZlTmFycmF0aW9uIiwibWFya0Fuc3dlclJlc2V0IiwicGF5bG9hZCIsIl9wYXlsb2FkJGFnZW50X2lkIiwiX3N1YmFnZW50UmF3JHJlc29sdmVkIiwiX3JlZjIiLCJfY2FsbGJhY2tzJG9uRmluaXNoU3QiLCJmaW5hbENvbnRlbnQiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwibWVtb3J5X3Nlc3Npb25faWQiLCJhdHRhY2htZW50cyIsIkFycmF5IiwiaXNBcnJheSIsInN1Z2dlc3Rpb25zIiwic3VnZ2VzdF9yZXBseSIsImFnZW50SWRSYXciLCJhZ2VudF9pZCIsImFnZW50SWQiLCJjb21wbGV0ZWRBZ2VudElkIiwiU3RyaW5nIiwidHJpbSIsInN1YmFnZW50UmF3Iiwic3ViYWdlbnQiLCJyZXNvbHZlZENvbnRleHQiLCJyZXNvbHZlZF9jb250ZXh0IiwicmVhc29uaW5nIiwiZmluaXNoIiwiZmluaXNoUGF5bG9hZCIsIm9uRmluaXNoU3RyZWFtIiwiaXNTdG9wcGVkIiwiY2FuY2VsIiwiYWJydXB0IiwicmVhZCIsInNlbnQiLCJkZWNvZGUiLCJzdHJlYW0iLCJzcGxpdCIsInBvcCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJfc2xpY2VkVG9BcnJheSIsInJlcGxhY2UiLCJKU09OIiwicGFyc2UiLCJkZWx0YSIsImkiLCJhcHBlbmRUaGlua2luZyIsInBoYXNlIiwibWVzc2FnZSIsInNraWxsIiwic2V0Q29tcGFjdGlvbiIsInRvb2wiLCJ0eXBlIiwic3RhdHVzIiwiYXJncyIsIm5hbWUiLCJjYXB0dXJlTGVhZGluZ0Zyb21Cb2R5IiwiYXBwbHlTdGVwIiwic2hvdWxkQ2xlYXJTdHJlYW1Gb3JMZWFkaW5nIiwibm9kZSIsInVuZGVmaW5lZCIsInRocmVhZF9pZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsImF1dG9fYXBwcm92ZWQiLCJhcHByb3ZhbF9zdGF0dXMiLCJjbGVhciIsIm9uQXBwcm92YWxSZXF1aXJlZCIsInBlbmRpbmdfYWN0aW9ucyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsInNldEVycm9yIiwib25FcnJvciIsIndhcm4iLCJlIiwiZiIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsImFwcGx5IiwiYXJndW1lbnRzIiwic2Vzc2lvblN0cmVhbU1hbmFnZXIiLCJpc0FjdGl2ZSIsImdldEFjdGl2ZUNvdW50IiwiZ2V0QWN0aXZlU2Vzc2lvbklkcyIsImZyb20iLCJrZXlzIiwic3RhcnRTdHJlYW0iLCJfY2FsbGVlMiIsInJlcXVlc3QiLCJhY3Rpdml0eU9wdGlvbnMiLCJhZ2VudE5hbWUiLCJjb250cm9sbGVyIiwiX2NhbGxiYWNrcyRvbkVycm9yMiIsIl90NCIsIl9jb250ZXh0MiIsInN0YXJ0ZWQiLCJyZWFzb24iLCJBYm9ydENvbnRyb2xsZXIiLCJzZXQiLCJlbnN1cmVTZXNzaW9uIiwiX29iamVjdFNwcmVhZCIsInN0YXJ0IiwiT3JjaGVzdHJhdG9yIiwib3JjaGVzdHJhdG9yIiwic2lnbmFsIiwic3RhcnRDb250aW51ZVN0cmVhbSIsIl9jYWxsZWUzIiwiX3JlZjQiLCJjb250aW51ZVJlcXVlc3QiLCJzc2VQYXJhbXMiLCJfY2FsbGJhY2tzJG9uRXJyb3IzIiwiX3Q1IiwiX2NvbnRleHQzIiwiY29udGludWVUaHJlYWQiLCJvayIsImNvbmNhdCIsInN0YXJ0UmV0cnlTdHJlYW0iLCJfY2FsbGVlNCIsInJldHJ5UmVxdWVzdCIsImRldGFpbCIsIl9jYWxsYmFja3Mkb25FcnJvcjQiLCJfdDYiLCJfdDciLCJfY29udGV4dDQiLCJyZXRyeUNvbXBsZXRpb24iLCJqc29uIiwic3RvcFN0cmVhbSIsIl9jYWxsYmFja3Mkb25TdG9wIiwiYWJvcnQiLCJwYXJ0aWFsVGV4dCIsImdldFNuYXBzaG90IiwidGV4dCIsIm9uU3RvcCIsImFib3J0U2lsZW50bHkiLCJfc3RvcmUkZ2V0TWV0YSIsImdldE1ldGEiLCJhYm9ydEFsbCIsIl90aGlzIiwiZm9yRWFjaCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uU3RyZWFtTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250aW51ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IG1haWEgZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYSdcbmltcG9ydCB0eXBlIHsgQXBwcm92YWxSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7XG4gIGdldEluaXRpYWxTdHJlYW1BY3Rpdml0eSxcbiAgZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSxcbiAgZ2V0VXNpbmdTa2lsbEFjdGl2aXR5LFxuICBnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5LFxuICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZVRvb2xBY3Rpb25MYWJlbCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB0eXBlIHsgSGl0bEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkLCBtZXJnZVN0cmVhbUNodW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3NlU3RyZWFtQ29udGVudCdcbmltcG9ydCB7IHJlYXNvbmluZ1N0b3JlIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgdHlwZSB7IFJlYXNvbmluZ1N0ZXBQYXlsb2FkLCBSZWFzb25pbmdUcmFjZVBheWxvYWQgfSBmcm9tICcuLi8uLi90eXBlcy9yZWFzb25pbmcnXG5pbXBvcnQgdHlwZSB7IENvbnRleHRDb21wYWN0aW9uUGF5bG9hZCB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRDb21wYWN0aW9uJ1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbWluZ1RleHQgfSBmcm9tICcuL3Nlc3Npb25TdHJlYW1pbmdUZXh0J1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4vdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQgfSBmcm9tICcuL3Nlc3Npb25Ob3RpZmljYXRpb25zJ1xuaW1wb3J0IHsgc2Vzc2lvbkhpdGxDb250ZXh0IH0gZnJvbSAnLi9zZXNzaW9uSGl0bENvbnRleHQnXG5pbXBvcnQgdHlwZSB7IFNlc3Npb25GaW5pc2hQYXlsb2FkLCBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzLCBTdGFydFN0cmVhbVJlc3VsdCB9IGZyb20gJy4vc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgT3JjaGVzdHJhdG9yUmVxdWVzdCA9IFBhcmFtZXRlcnM8dHlwZW9mIG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcj5bMF1cbnR5cGUgQ29udGludWVUaHJlYWRSZXF1ZXN0ID0gUGFyYW1ldGVyczx0eXBlb2YgbWFpYS5PcmNoZXN0cmF0b3IuY29udGludWVUaHJlYWQ+WzBdXG50eXBlIFJldHJ5Q29tcGxldGlvblJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24+WzBdXG5cbi8qKiBDb21wYXRpYmxlIGNvbiBlbCBgdGAgZGUgaTE4bmV4dCAodXNvIGRlIHVuYSBzb2xhIGtleSkuICovXG50eXBlIFRyYW5zbGF0ZUZuID0gKGtleTogc3RyaW5nKSA9PiBzdHJpbmdcblxudHlwZSBTdGFydFN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIHJlcXVlc3Q6IE9yY2hlc3RyYXRvclJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGFjdGl2aXR5T3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4gIGhpdGxFeGVjdXRpb25Db250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsXG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgU3RhcnRDb250aW51ZVN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIGNvbnRpbnVlUmVxdWVzdDogQ29udGludWVUaHJlYWRSZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBoaXRsRXhlY3V0aW9uQ29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbFxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xufVxuXG50eXBlIFN0YXJ0UmV0cnlTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICByZXRyeVJlcXVlc3Q6IFJldHJ5Q29tcGxldGlvblJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGFjdGl2aXR5T3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgQWN0aXZlU3RyZWFtID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgaXNTdG9wcGVkOiBib29sZWFuXG59XG5cbi8qKlxuICogTcOheGltbyBkZSBzZXNpb25lcyBnZW5lcmFuZG8gZW4gcGFyYWxlbG8uIFByb3RlZ2UgcmVkL3JlY3Vyc29zIGRlbCBjbGllbnRlLlxuICogQWp1c3RhYmxlIGEgZnV0dXJvIHbDrWEgZmxhZyBkZWwgaG9zdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgPSA0XG5cbmNvbnN0IFNUUkVBTV9USFJPVFRMRV9NUyA9IDE2XG5cbmNvbnN0IGFjdGl2ZVN0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgQWN0aXZlU3RyZWFtPigpXG5cbmNvbnN0IHN0b3JlID0gKCkgPT4gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG5cbmNvbnN0IGlzU3RyZWFtQWN0aXZlID0gKHNlc3Npb25JZDogc3RyaW5nKTogYm9vbGVhbiA9PiBhY3RpdmVTdHJlYW1zLmhhcyhzZXNzaW9uSWQpXG5cbmNvbnN0IGdldEFjdGl2ZVN0cmVhbUNvdW50ID0gKCk6IG51bWJlciA9PiBhY3RpdmVTdHJlYW1zLnNpemVcblxuY29uc3QgcGFyc2VTZXNzaW9uU1NFID0gYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSwgYWN0aXZlOiBBY3RpdmVTdHJlYW0sIHBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNhbGxiYWNrcywgdCB9ID0gcGFyYW1zXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0ID0gcGFyYW1zLmhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKVxuXG4gIGxldCBwZW5kaW5nQ29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IHRocm90dGxlVGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgY29uc3QgZmx1c2hUb1N0b3JlcyA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zZXRUZXh0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGVudClcbiAgICBjYWxsYmFja3Mub25TdHJlYW1VcGRhdGU/Lihjb250ZW50KVxuICB9XG5cbiAgY29uc3QgZW1pdFRocm90dGxlZCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBwZW5kaW5nQ29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSByZXR1cm5cbiAgICB0aHJvdHRsZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICAgIGlmIChwZW5kaW5nQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICBmbHVzaFRvU3RvcmVzKHRvRW1pdClcbiAgICAgIH1cbiAgICB9LCBTVFJFQU1fVEhST1RUTEVfTVMpXG4gIH1cblxuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAoKSA9PiB7XG4gICAgaWYgKHRocm90dGxlVGltZXIgIT0gbnVsbCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aHJvdHRsZVRpbWVyKVxuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpXG4gIGlmICghcmVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWFkZXIgYXZhaWxhYmxlJylcbiAgfVxuXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICBsZXQgYnVmZmVyID0gJydcbiAgbGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gIGxldCBoYXNTdGFydGVkV3JpdGluZyA9IGZhbHNlXG4gIC8vIFwiVXNhbmRvIFNraWxsXCIgcXVlZGEgdmlzaWJsZSBtaWVudHJhcyBlbCBtb2RlbG8gcGllbnNhIGNvbiBsYSBza2lsbCBjYXJnYWRhO1xuICAvLyBsb3MgZGVsdGFzIGRlIGB0aGlua2luZ2Agbm8gbG8gcGlzYW4gaGFzdGEgbGEgcHLDs3hpbWEgYWNjacOzbiBvIGVsIHByaW1lciB0b2tlbi5cbiAgbGV0IGlzVXNpbmdTa2lsbCA9IGZhbHNlXG5cbiAgY29uc3QgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQgPSAoKSA9PiB7XG4gICAgaWYgKGhhc1N0YXJ0ZWRXcml0aW5nKSByZXR1cm5cbiAgICBoYXNTdGFydGVkV3JpdGluZyA9IHRydWVcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlLCBpc1dyaXRpbmc6IHRydWUgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd3cml0aW5nJylcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgIGNhbGxiYWNrcy5vblN0YXJ0V3JpdGluZz8uKClcbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ2h1bmsgPSAoY2h1bms6IHN0cmluZykgPT4ge1xuICAgIGlmICghY2h1bmspIHJldHVyblxuICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjaHVuaylcbiAgICByZWFzb25pbmdTdG9yZS5zeW5jTGl2ZU5hcnJhdGlvbihwbGFjZWhvbGRlcklkLCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgZW1pdFRocm90dGxlZChhY2N1bXVsYXRlZENvbnRlbnQpXG4gIH1cblxuICBjb25zdCBjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCA9ICgpID0+IHtcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRocm90dGxlVGltZXIpXG4gICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgIH1cbiAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICBhY2N1bXVsYXRlZENvbnRlbnQgPSAnJ1xuICAgIGZsdXNoVG9TdG9yZXMoJycpXG4gICAgcmVhc29uaW5nU3RvcmUubWFya0Fuc3dlclJlc2V0KHBsYWNlaG9sZGVySWQpXG4gIH1cblxuICBjb25zdCBhcHBseVN0cmVhbUNvbXBsZXRlID0gKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY29uc3QgZmluYWxDb250ZW50ID0gKHBheWxvYWQuY29udGVudCBhcyBzdHJpbmcpIHx8IGFjY3VtdWxhdGVkQ29udGVudFxuICAgIGNvbnN0IHNvdXJjZXMgPSBwYXlsb2FkLnNvdXJjZXMgfHwgbnVsbFxuICAgIGNvbnN0IG1lbW9yeVNlc3Npb25JZCA9IChwYXlsb2FkLm1lbW9yeV9zZXNzaW9uX2lkIGFzIHN0cmluZykgfHwgJydcbiAgICBjb25zdCBhdHRhY2htZW50cyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdHRhY2htZW50cykgPyBwYXlsb2FkLmF0dGFjaG1lbnRzIDogbnVsbFxuICAgIGxldCBzdWdnZXN0aW9uczogc3RyaW5nW10gfCBudWxsID0gbnVsbFxuICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdF9yZXBseSkpIHtcbiAgICAgIHN1Z2dlc3Rpb25zID0gcGF5bG9hZC5zdWdnZXN0X3JlcGx5IGFzIHN0cmluZ1tdXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdGlvbnMpKSB7XG4gICAgICBzdWdnZXN0aW9ucyA9IHBheWxvYWQuc3VnZ2VzdGlvbnMgYXMgc3RyaW5nW11cbiAgICB9XG4gICAgY29uc3QgYWdlbnRJZFJhdyA9IHBheWxvYWQuYWdlbnRfaWQgPz8gcGF5bG9hZC5hZ2VudElkXG4gICAgY29uc3QgY29tcGxldGVkQWdlbnRJZCA9IGFnZW50SWRSYXcgIT0gbnVsbCAmJiBTdHJpbmcoYWdlbnRJZFJhdykudHJpbSgpICE9PSAnJyA/IFN0cmluZyhhZ2VudElkUmF3KS50cmltKCkgOiBudWxsXG4gICAgY29uc3Qgc3ViYWdlbnRSYXcgPSBwYXlsb2FkLnN1YmFnZW50IGFzIHsgcmVzb2x2ZWRfY29udGV4dD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWRcbiAgICBjb25zdCByZXNvbHZlZENvbnRleHQgPSBzdWJhZ2VudFJhdz8ucmVzb2x2ZWRfY29udGV4dCA/PyBudWxsXG4gICAgY29uc3QgcmVhc29uaW5nID0gKHBheWxvYWQucmVhc29uaW5nIGFzIFJlYXNvbmluZ1RyYWNlUGF5bG9hZCB8IG51bGwpID8/IG51bGxcblxuICAgIHJlYXNvbmluZ1N0b3JlLmZpbmlzaChwbGFjZWhvbGRlcklkLCByZWFzb25pbmcpXG4gICAgZmx1c2hQZW5kaW5nKClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2NvbXBsZXRlJylcblxuICAgIGNvbnN0IGZpbmlzaFBheWxvYWQ6IFNlc3Npb25GaW5pc2hQYXlsb2FkID0ge1xuICAgICAgY29udGVudDogZmluYWxDb250ZW50LFxuICAgICAgc291cmNlcyxcbiAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgc3VnZ2VzdGlvbnMsXG4gICAgICBjb21wbGV0ZWRBZ2VudElkLFxuICAgICAgcmVzb2x2ZWRDb250ZXh0LFxuICAgICAgcmVhc29uaW5nLFxuICAgIH1cbiAgICBjYWxsYmFja3Mub25GaW5pc2hTdHJlYW0/LihmaW5pc2hQYXlsb2FkKVxuXG4gICAgLy8gRWwgdGV4dG8gZW4gdml2byBOTyBzZSBsaW1waWEgYWPDoSBhIHByb3DDs3NpdG8uIEVsIHBsYWNlaG9sZGVyIHNlIHZhIGNvbiBlbFxuICAgIC8vIGBkcm9wYCBxdWUgaGFjZSBlbCBjb25zdW1pZG9yLCB5IGNvbiDDqWwgc3Ugc3VzY3JpcGNpw7NuOyB2YWNpYXJsbyBhbnRlcyBsb1xuICAgIC8vIGRlamFiYSBtb250YWRvIHkgc2luIHRleHRvIChhbHR1cmEgMCkgZHVyYW50ZSB+MjVtczogZWwgZmxpY2tlciBkZSBmaW4gZGVcbiAgICAvLyBzdHJlYW0uIE5vIGFsY2FuemEgY29uIGRpZmVyaXJsbywgcG9ycXVlIGVzdGUgY2xlYXIgdmlhamEgZW4gU3luY0xhbmVcbiAgICAvLyAoc3RvcmUgZXh0ZXJubykgeSBlbCBzd2FwIGRlIG1lbnNhamVzIGVuIERlZmF1bHRMYW5lLCBhc8OtIHF1ZSBzaWVtcHJlIHNlXG4gICAgLy8gY3VlbGEgZW4gZWwgbWVkaW8uIEVsIHNsb3Qgc2UgbGliZXJhIGVuIGVsIHByw7N4aW1vIGBzdGFydCgpYCBkZSBsYSBzZXNpw7NuLFxuICAgIC8vIHkgZW4gc3RvcC9lcnJvci9hcHByb3ZhbC9jYW1iaW8gZGUgc2VzacOzbiwgcXVlIHPDrSBsbGFtYW4gYGNsZWFyYC5cbiAgfVxuXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG4gICAgICBpZiAoZG9uZSkgYnJlYWtcblxuICAgICAgaWYgKGFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSlcbiAgICAgIGNvbnN0IGxpbmVzID0gYnVmZmVyLnNwbGl0KCdcXG5cXG4nKVxuICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJydcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLnRyaW0oKSA9PT0gJycpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgW2V2ZW50TGluZSwgZGF0YUxpbmVdID0gbGluZS5zcGxpdCgnXFxuJylcbiAgICAgICAgaWYgKCFldmVudExpbmUgfHwgIWRhdGFMaW5lKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGV2ZW50TGluZS5yZXBsYWNlKCdldmVudDogJywgJycpLnRyaW0oKVxuICAgICAgICBjb25zdCBkYXRhU3RyID0gZGF0YUxpbmUucmVwbGFjZSgnZGF0YTogJywgJycpLnRyaW0oKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZGF0YVN0cilcblxuICAgICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICd0aGlua2luZyc6IHtcbiAgICAgICAgICAgICAgY29uc3QgdGhpbmtpbmdEZWx0YSA9IHR5cGVvZiBkYXRhLmRlbHRhID09PSAnc3RyaW5nJyA/IGRhdGEuZGVsdGEgOiAnJ1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuaSA9PT0gJ251bWJlcicgJiYgdGhpbmtpbmdEZWx0YSkge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmFwcGVuZFRoaW5raW5nKHBsYWNlaG9sZGVySWQsIGRhdGEuaSwgdGhpbmtpbmdEZWx0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWhhc1N0YXJ0ZWRXcml0aW5nKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBpZiAoIWlzVXNpbmdTa2lsbCkge1xuICAgICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIHsgcGhhc2U6ICd0aGlua2luZycsIG1lc3NhZ2U6IGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UoMCwgdCkgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpbGwgQC1tZW5jaW9uYWRhIChhbCBhYnJpciBlbCBzdHJlYW0pIG8gbGxhbWFkYSBhIGBnZXRfc2tpbGxgLlxuICAgICAgICAgICAgY2FzZSAndXNpbmdfc2tpbGwnOlxuICAgICAgICAgICAgICBpZiAoIWhhc1N0YXJ0ZWRXcml0aW5nKSB7XG4gICAgICAgICAgICAgICAgaXNVc2luZ1NraWxsID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIGdldFVzaW5nU2tpbGxBY3Rpdml0eSh0LCBkYXRhLnNraWxsKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAvLyBFbCBiYWNrZW5kIGRlc2NhcnRhIGxvIGVtaXRpZG8geSByZWluaWNpYSBsYSByZXNwdWVzdGEgZGVzZGUgY2Vyby5cbiAgICAgICAgICAgIGNhc2UgJ2Fuc3dlcl9yZXNldCc6XG4gICAgICAgICAgICAgIGNsZWFyU3RyZWFtTGlrZUFuc3dlclJlc2V0KClcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gTUFJQSByZWNvcnTDsyBlbCBjb250ZXh0byBwYXJhIHF1ZSBlbCByZXF1ZXN0IGVudHJhcmEuIFPDs2xvIGxsZWdhXG4gICAgICAgICAgICAvLyBjdWFuZG8gZWwgcmVjb3J0ZSBzZSBub3RhIChpbcOhZ2VuZXMgdmllamFzLCB0dXJub3MgZW50ZXJvcyBvIGVsXG4gICAgICAgICAgICAvLyB0ZXh0byBsaXRlcmFsIGRlIHR1cm5vcyB2aWVqb3MpLCB5IHZpYWphIGp1bnRvIGEgbGEgdHJhemEgcG9ycXVlXG4gICAgICAgICAgICAvLyBjb21wYXJ0ZSBzdSBjaWNsbyBkZSB2aWRhOiBtaXNtbyBwbGFjZWhvbGRlciwgbWlzbW8gcmVuYW1lLlxuICAgICAgICAgICAgY2FzZSAnY29udGV4dF9jb21wYWN0ZWQnOlxuICAgICAgICAgICAgICByZWFzb25pbmdTdG9yZS5zZXRDb21wYWN0aW9uKHBsYWNlaG9sZGVySWQsIGRhdGEgYXMgQ29udGV4dENvbXBhY3Rpb25QYXlsb2FkKVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdyZWFzb25pbmdfc3RlcCc6IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2wgPSB0eXBlb2YgZGF0YS50b29sID09PSAnc3RyaW5nJyA/IGRhdGEudG9vbCA6ICcnXG4gICAgICAgICAgICAgIGNvbnN0IHN0ZXBUeXBlID0gdHlwZW9mIGRhdGEudHlwZSA9PT0gJ3N0cmluZycgPyBkYXRhLnR5cGUgOiAnJ1xuICAgICAgICAgICAgICBpZiAoc3RlcFRvb2wgJiYgc3RlcFR5cGUgIT09ICdoYW5kb2ZmJyAmJiBkYXRhLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSByZXNvbHZlVG9vbEFjdGlvbkxhYmVsKHN0ZXBUb29sLCB0LCAncHJlc2VudCcpXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSBzdGVwVG9vbCA9PT0gJ2dldF9za2lsbCdcbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICAgIC8vIEVsIHN0ZXAgZGUgYGdldF9za2lsbGAgbGxlZ2EganVzdG8gZGVzcHXDqXMgZGUgYHVzaW5nX3NraWxsYDogbWFudGllbmUgZWwgbm9tYnJlLlxuICAgICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPyBnZXRVc2luZ1NraWxsQWN0aXZpdHkodCwgZGF0YS5hcmdzPy5uYW1lKSA6IHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiBsYWJlbCB9XG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5pID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmNhcHR1cmVMZWFkaW5nRnJvbUJvZHkocGxhY2Vob2xkZXJJZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmFwcGx5U3RlcChwbGFjZWhvbGRlcklkLCBkYXRhIGFzIFJlYXNvbmluZ1N0ZXBQYXlsb2FkKVxuICAgICAgICAgICAgICAgIGlmIChyZWFzb25pbmdTdG9yZS5zaG91bGRDbGVhclN0cmVhbUZvckxlYWRpbmcocGxhY2Vob2xkZXJJZCwgYWNjdW11bGF0ZWRDb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICd0b2tlbic6IHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGRhdGEuY29udGVudCA6ICcnXG4gICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgYXBwbHlTdHJlYW1DaHVuayhjaHVuaylcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnY29udGVudCc6IHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGRhdGEuY29udGVudCA6ICcnXG4gICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgYXBwbHlTdHJlYW1DaHVuayhjaHVuaylcbiAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZChkYXRhKSkge1xuICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgICAgICAgaXNVc2luZ1NraWxsID0gZmFsc2VcbiAgICAgICAgICAgICAgaWYgKGRhdGEubm9kZSA9PT0gJ2FnZW50X3RyYW5zZmVyJykge1xuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlICYmIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KFxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkoXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS50aHJlYWRfaWQgPT09ICdzdHJpbmcnID8gZGF0YS50aHJlYWRfaWQgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNvbXBsZXRlKGRhdGEpXG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgJ2FwcHJvdmFsX3JlcXVpcmVkJzoge1xuICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgICAgICAvLyBQcmVhcHJvYmFkbyAoYXV0by1hcHByb3ZlIG8gZGV0ZWNjacOzbiBtYW51YWwpOiBlbCBzdHJlYW0gbm8gc2UgY29ydGEsXG4gICAgICAgICAgICAgIC8vIHNpZ3VlIGVqZWN1dGFuZG8gbGFzIGFjY2lvbmVzIHNpbiBlc3BlcmFyIGRlY2lzacOzbiBkZWwgdXN1YXJpby5cbiAgICAgICAgICAgICAgY29uc3QgaXNQcmVBcHByb3ZlZCA9XG4gICAgICAgICAgICAgICAgZGF0YS5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICBkYXRhLmF1dG9fYXBwcm92ZWQgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICBkYXRhLmFwcHJvdmFsX3N0YXR1cyA9PT0gJ2FwcHJvdmVkJ1xuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBpZiAoIWlzUHJlQXBwcm92ZWQpIHtcbiAgICAgICAgICAgICAgICByZWFzb25pbmdTdG9yZS5maW5pc2gocGxhY2Vob2xkZXJJZCwgKGRhdGEucmVhc29uaW5nIGFzIFJlYXNvbmluZ1RyYWNlUGF5bG9hZCB8IG51bGwpID8/IG51bGwpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UgfSlcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnYXdhaXRpbmdfYXBwcm92YWwnKVxuICAgICAgICAgICAgICBjYWxsYmFja3Mub25BcHByb3ZhbFJlcXVpcmVkPy4oZGF0YSBhcyBBcHByb3ZhbFJlcXVlc3QsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICAgICAgICAgICAgaWYgKGlzUHJlQXBwcm92ZWQgJiYgQXJyYXkuaXNBcnJheShkYXRhLnBlbmRpbmdfYWN0aW9ucykgJiYgZGF0YS5wZW5kaW5nX2FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5KHQsIGhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTU0UgRXJyb3I6JywgZGF0YS5lcnJvcilcbiAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nKClcbiAgICAgICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRFcnJvcihzZXNzaW9uSWQsIHsgdHlwZTogZGF0YS5lcnJvcj8udHlwZSwgbWVzc2FnZTogZGF0YS5lcnJvcj8ubWVzc2FnZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oZGF0YS5lcnJvcj8udHlwZSwgZGF0YS5lcnJvcj8ubWVzc2FnZSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIFNTRSBldmVudCB0eXBlOicsIGV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hQZW5kaW5nKClcbiAgfVxufVxuXG4vKipcbiAqIE1hbmFnZXIgc2luZ2xldG9uIChtb2R1bGUtbGV2ZWwpIHF1ZSBjb3JyZSBOIHN0cmVhbXMgZGVsIG9yY2hlc3RyYXRvciBlblxuICogcGFyYWxlbG8sIHVubyBwb3IgYHNlc3Npb25JZGAuIFNvYnJldml2ZSBhIGNhbWJpb3MgZGUgdmlzdGEgeSBhbCBjaWVycmUgZGVsXG4gKiBtb2RhbDogbG9zIHN0cmVhbXMgc29sbyBzZSBjYW5jZWxhbiBjb24gc3RvcCBleHBsw61jaXRvIGRlbCB1c3VhcmlvIG8gYWxcbiAqIGNvbXBsZXRhci9lcnJvcmFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vzc2lvblN0cmVhbU1hbmFnZXIgPSB7XG4gIGlzQWN0aXZlOiBpc1N0cmVhbUFjdGl2ZSxcbiAgZ2V0QWN0aXZlQ291bnQ6IGdldEFjdGl2ZVN0cmVhbUNvdW50LFxuICBnZXRBY3RpdmVTZXNzaW9uSWRzOiAoKTogc3RyaW5nW10gPT4gQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSksXG5cbiAgYXN5bmMgc3RhcnRTdHJlYW0ocGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+IHtcbiAgICBlbnN1cmVTZXNzaW9uTm90aWZpY2F0aW9uc0luaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCByZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICByZWFzb25pbmdTdG9yZS5zdGFydChwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwgYWN0aXZpdHlPcHRpb25zID8/IHt9KSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcihyZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBwYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIFJlc3VtZSBISVRMIChgY29udGludWUtdGhyZWFkYCkga2V5ZWQgcG9yIHNlc3Npb25JZCDigJQgbWlzbW8gbW90b3IgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRDb250aW51ZVN0cmVhbShwYXJhbXM6IFN0YXJ0Q29udGludWVTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGludWVSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGhpdGxFeGVjdXRpb25Db250ZXh0LCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgaWYgKGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCkpIHtcbiAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICdhbHJlYWR5X2FjdGl2ZScgfVxuICAgIH1cbiAgICBpZiAoZ2V0QWN0aXZlU3RyZWFtQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnbGltaXQnIH1cbiAgICB9XG5cbiAgICBpZiAoaGl0bEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHNlc3Npb25IaXRsQ29udGV4dC5zZXQoc2Vzc2lvbklkLCBoaXRsRXhlY3V0aW9uQ29udGV4dClcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgYWN0aXZlOiBBY3RpdmVTdHJlYW0gPSB7IHNlc3Npb25JZCwgY29udHJvbGxlciwgaXNTdG9wcGVkOiBmYWxzZSB9XG4gICAgYWN0aXZlU3RyZWFtcy5zZXQoc2Vzc2lvbklkLCBhY3RpdmUpXG5cbiAgICBzdG9yZSgpLmVuc3VyZVNlc3Npb24oc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwge1xuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgIC4uLihhZ2VudElkICE9IG51bGwgPyB7IGFnZW50SWQgfSA6IHt9KSxcbiAgICAgIC4uLihhZ2VudE5hbWUgIT0gbnVsbCA/IHsgYWdlbnROYW1lIH0gOiB7fSksXG4gICAgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSh0LCBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyBzZXNzaW9uSGl0bENvbnRleHQuZ2V0KHNlc3Npb25JZCkgPz8gdW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IHNzZVBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgcmVxdWVzdDoge30gYXMgT3JjaGVzdHJhdG9yUmVxdWVzdCxcbiAgICAgIGNhbGxiYWNrcyxcbiAgICAgIHQsXG4gICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dDogaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gc2Vzc2lvbkhpdGxDb250ZXh0LmdldChzZXNzaW9uSWQpLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZChjb250aW51ZVJlcXVlc3QsIGNvbnRyb2xsZXIuc2lnbmFsKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbnRpbnVlLXRocmVhZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgc3NlUGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgICAgc2Vzc2lvbkhpdGxDb250ZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogUmVnZW5lcmEgbGEgcmVzcHVlc3RhIGRlIHVuIHR1cm5vIChgcmV0cnlfY29tcGxldGlvbmApIOKAlCBtaXNtbyBtb3RvciBTU0UgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRSZXRyeVN0cmVhbShwYXJhbXM6IFN0YXJ0UmV0cnlTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgcmV0cnlSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICBjb25zdCBzc2VQYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIHJlcXVlc3Q6IHt9IGFzIE9yY2hlc3RyYXRvclJlcXVlc3QsXG4gICAgICBjYWxsYmFja3MsXG4gICAgICB0LFxuICAgICAgYWN0aXZpdHlPcHRpb25zLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24ocmV0cnlSZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgbGV0IGRldGFpbDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRldGFpbD86IHN0cmluZyB9XG4gICAgICAgICAgICBkZXRhaWwgPSB0eXBlb2YgZGF0YS5kZXRhaWwgPT09ICdzdHJpbmcnID8gZGF0YS5kZXRhaWwgOiB1bmRlZmluZWRcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGV0YWlsID09PSAnVHVybiBub3QgZm91bmQnKSB7XG4gICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSwgcGxhY2Vob2xkZXJJZDogbnVsbCB9KVxuICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICd0dXJuX25vdF9mb3VuZCcgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJldHJ5X2NvbXBsZXRpb24gZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuICAgICAgYXdhaXQgcGFyc2VTZXNzaW9uU1NFKHJlc3BvbnNlLCBhY3RpdmUsIHNzZVBhcmFtcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LigpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogQ2FuY2VsYWNpw7NuIGV4cGzDrWNpdGEgZGVsIHVzdWFyaW8gKG1lbnNhamUgXCJjYW5jZWxhZG9cIikuICovXG4gIHN0b3BTdHJlYW0oc2Vzc2lvbklkOiBzdHJpbmcsIGNhbGxiYWNrcz86IFNlc3Npb25TdHJlYW1DYWxsYmFja3MpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAvLyBFbCBwYXJjaWFsIHNlIHJlc2NhdGEgYW50ZXMgZGUgbGltcGlhcjogZWwgYmFja2VuZCBsbyBwZXJzaXN0ZSwgcGVybyBzaSBubyBsb1xuICAgIC8vIHBhc2Ftb3MgYWwgY2FsbGJhY2sgZGVzYXBhcmVjZSBkZSBwYW50YWxsYSBoYXN0YSBlbCBwcsOzeGltbyBmZXRjaCBkZSBsYSBzZXNpw7NuLlxuICAgIGNvbnN0IHBhcnRpYWxUZXh0ID0gc2Vzc2lvblN0cmVhbWluZ1RleHQuZ2V0U25hcHNob3Qoc2Vzc2lvbklkKS50ZXh0XG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnY2FuY2VsbGVkJylcbiAgICBjYWxsYmFja3M/Lm9uU3RvcD8uKHBhcnRpYWxUZXh0KVxuICB9LFxuXG4gIC8qKiBBYm9ydGEgc2luIG1hcmNhciBcImNhbmNlbGFkb1wiICh1c28gaW50ZXJubyAvIGxpbXBpZXphKS4gKi9cbiAgYWJvcnRTaWxlbnRseShzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuZ2V0KHNlc3Npb25JZClcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuXG4gICAgYWN0aXZlLmlzU3RvcHBlZCA9IHRydWVcbiAgICBhY3RpdmUuY29udHJvbGxlci5hYm9ydCgpXG4gICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIGlmIChzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RhdHVzICE9PSAnY29tcGxldGUnKSB7XG4gICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICB9XG4gIH0sXG5cbiAgYWJvcnRBbGwoKSB7XG4gICAgQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSkuZm9yRWFjaChzZXNzaW9uSWQgPT4gdGhpcy5hYm9ydFNpbGVudGx5KHNlc3Npb25JZCkpXG4gIH0sXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FDRUMsd0JBQXdCLEVBQ3hCQyx5QkFBeUIsRUFDekJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyw2QkFBNkIsRUFDN0JDLGdDQUFnQyxFQUNoQ0Msc0JBQXNCLFFBQ2pCLG9DQUFvQztBQUUzQyxTQUFTQyx3QkFBd0IsRUFBRUMsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQ3pGLFNBQVNDLGNBQWMsUUFBUSwrQkFBK0I7QUFHOUQsU0FBU0Msb0JBQW9CLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNyRCxTQUFTQyxxQ0FBcUMsUUFBUSx3QkFBd0I7QUFDOUUsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQXNCOztBQU96RDs7QUFxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQU1DLHNCQUFzQixHQUFHLENBQUM7QUFFdkMsSUFBTUMsa0JBQWtCLEdBQUcsRUFBRTtBQUU3QixJQUFNQyxhQUFhLEdBQUcsSUFBSUMsR0FBRyxDQUF1QixDQUFDO0FBRXJELElBQU1DLEtBQUssR0FBRyxTQUFSQSxLQUFL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
723
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdTdHJlYW1BY3Rpdml0eSIsImdldFVzaW5nU2tpbGxBY3Rpdml0eSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5IiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsInJlYXNvbmluZ1N0b3JlIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsInNlc3Npb25IaXRsQ29udGV4dCIsImJ1aWxkU2Vzc2lvbkZpbmlzaFBheWxvYWQiLCJpc0FnZW50VHJhbnNmZXJOb2RlIiwiaXNBcHByb3ZhbFByZUFwcHJvdmVkIiwiaXNSZXRyeVR1cm5Ob3RGb3VuZFJlc3BvbnNlIiwicGFyc2VTc2VCbG9jayIsInBhdGNoTWV0YUFnZW50RmllbGRzIiwicmVzb2x2ZU5vZGVTdHJlYW1NZXNzYWdlIiwicmVzb2x2ZVJlYXNvbmluZ1N0ZXBUb29sIiwicmVzb2x2ZVJlYXNvbmluZ1N0ZXBUeXBlIiwicmVzb2x2ZVN0YXJ0U3RyZWFtR3VhcmQiLCJyZXNvbHZlU3RyZWFtVGV4dENodW5rIiwicmVzb2x2ZVRoaW5raW5nRGVsdGEiLCJzaG91bGRBYm9ydFNlc3Npb25TdHJlYW1PblN0b3AiLCJzaG91bGRBcHBseVJlYXNvbmluZ1N0ZXBJbmRleCIsInNob3VsZEFwcGVuZFRoaW5raW5nU3RlcCIsInNob3VsZFJlc3VtZUhpdGxBZnRlclByZUFwcHJvdmFsIiwic2hvdWxkU2V0SWRsZU9uU2lsZW50QWJvcnQiLCJzaG91bGRTaG93UmVhc29uaW5nVG9vbEFjdGl2aXR5Iiwic3BsaXRTc2VCdWZmZXIiLCJNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TIiwiU1RSRUFNX1RIUk9UVExFX01TIiwiYWN0aXZlU3RyZWFtcyIsIk1hcCIsInN0b3JlIiwiZ2V0U3RhdGUiLCJpc1N0cmVhbUFjdGl2ZSIsInNlc3Npb25JZCIsImhhcyIsImdldEFjdGl2ZVN0cmVhbUNvdW50Iiwic2l6ZSIsInBhcnNlU2Vzc2lvblNTRSIsIl9yZWYiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsInJlc3BvbnNlIiwiYWN0aXZlIiwicGFyYW1zIiwiX3Jlc3BvbnNlJGJvZHkiLCJfZGF0YSRlcnJvciIsIl9kYXRhJGVycm9yMiIsIl9jYWxsYmFja3Mkb25FcnJvciIsIl9kYXRhJGVycm9yMyIsIl9kYXRhJGVycm9yNCIsInBsYWNlaG9sZGVySWQiLCJjYWxsYmFja3MiLCJ0IiwicGVuZGluZ0NvbnRlbnQiLCJ0aHJvdHRsZVRpbWVyIiwiZmx1c2hUb1N0b3JlcyIsImVtaXRUaHJvdHRsZWQiLCJmbHVzaFBlbmRpbmciLCJyZWFkZXIiLCJkZWNvZGVyIiwiYnVmZmVyIiwiYWNjdW11bGF0ZWRDb250ZW50IiwiaGFzU3RhcnRlZFdyaXRpbmciLCJpc1VzaW5nU2tpbGwiLCJzZXRUaGlua2luZ0FjdGl2aXR5IiwiZW5zdXJlV3JpdGluZ1N0YXJ0ZWQiLCJhcHBseVN0cmVhbUNodW5rIiwiY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQiLCJhcHBseVN0cmVhbUNvbXBsZXRlIiwiX3lpZWxkJHJlYWRlciRyZWFkIiwiZG9uZSIsInZhbHVlIiwiX3NwbGl0U3NlQnVmZmVyIiwiYmxvY2tzIiwicmVtYWluZGVyIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJsaW5lIiwicGFyc2VkQmxvY2siLCJldmVudFR5cGUiLCJkYXRhU3RyIiwiZGF0YSIsIl9yZXNvbHZlVGhpbmtpbmdEZWx0YSIsImluZGV4IiwidGhpbmtpbmdEZWx0YSIsInN0ZXBUb29sIiwic3RlcFR5cGUiLCJfZGF0YSRhcmdzIiwic3RlcEluZGV4IiwiY2h1bmsiLCJfY2h1bmsiLCJfY2FsbGJhY2tzJG9uQXBwcm92YWwiLCJpc1ByZUFwcHJvdmVkIiwiX3JlZjIiLCJfdCIsIl90MiIsIl90MyIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiY29udGVudCIsIl9jYWxsYmFja3Mkb25TdHJlYW1VcCIsInNldFRleHQiLCJvblN0cmVhbVVwZGF0ZSIsImNhbGwiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwidG9FbWl0IiwiY2xlYXJUaW1lb3V0IiwiYm9keSIsImdldFJlYWRlciIsIkVycm9yIiwiVGV4dERlY29kZXIiLCJfc3RvcmUkZ2V0TWV0YSIsInRoaW5raW5nQWN0aXZpdHkiLCJjdXJyZW50IiwiZ2V0TWV0YSIsInN0cmVhbUFjdGl2aXR5IiwicGhhc2UiLCJtZXNzYWdlIiwicGF0Y2hNZXRhIiwiaXNMb2FkaW5nIiwic2V0U3RhdHVzIiwic2V0QWN0aXZpdHkiLCJfc3RvcmUkZ2V0TWV0YTIiLCJfY2FsbGJhY2tzJG9uU3RhcnRXcmkiLCJpc1dyaXRpbmciLCJvblN0YXJ0V3JpdGluZyIsInN5bmNMaXZlTmFycmF0aW9uIiwibWFya0Fuc3dlclJlc2V0IiwicGF5bG9hZCIsIl9jYWxsYmFja3Mkb25GaW5pc2hTdCIsImZpbmlzaFBheWxvYWQiLCJmaW5pc2giLCJyZWFzb25pbmciLCJvbkZpbmlzaFN0cmVhbSIsImlzU3RvcHBlZCIsImNhbmNlbCIsImFicnVwdCIsInJlYWQiLCJzZW50IiwiZGVjb2RlIiwic3RyZWFtIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJzIiwibiIsIkpTT04iLCJwYXJzZSIsImRlbHRhIiwiYXBwZW5kVGhpbmtpbmciLCJza2lsbCIsInN0YXR1cyIsImFyZ3MiLCJuYW1lIiwiaSIsImNhcHR1cmVMZWFkaW5nRnJvbUJvZHkiLCJhcHBseVN0ZXAiLCJfb2JqZWN0U3ByZWFkIiwic2hvdWxkQ2xlYXJTdHJlYW1Gb3JMZWFkaW5nIiwiY2xlYXIiLCJvbkFwcHJvdmFsUmVxdWlyZWQiLCJwZW5kaW5nX2FjdGlvbnMiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRFcnJvciIsInR5cGUiLCJvbkVycm9yIiwid2FybiIsImUiLCJmIiwic3RvcCIsIl94IiwiX3gyIiwiX3gzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJzZXNzaW9uU3RyZWFtTWFuYWdlciIsImlzQWN0aXZlIiwiZ2V0QWN0aXZlQ291bnQiLCJnZXRBY3RpdmVTZXNzaW9uSWRzIiwiQXJyYXkiLCJmcm9tIiwia2V5cyIsInN0YXJ0U3RyZWFtIiwiX2NhbGxlZTIiLCJyZXF1ZXN0IiwiYWN0aXZpdHlPcHRpb25zIiwiYWdlbnRJZCIsImFnZW50TmFtZSIsInN0YXJ0R3VhcmQiLCJjb250cm9sbGVyIiwiX2NhbGxiYWNrcyRvbkVycm9yMiIsIl90NCIsIl9jb250ZXh0MiIsImFsbG93ZWQiLCJzdGFydGVkIiwicmVhc29uIiwiQWJvcnRDb250cm9sbGVyIiwic2V0IiwiZW5zdXJlU2Vzc2lvbiIsInN0YXJ0IiwiT3JjaGVzdHJhdG9yIiwib3JjaGVzdHJhdG9yIiwic2lnbmFsIiwic3RhcnRDb250aW51ZVN0cmVhbSIsIl9jYWxsZWUzIiwiX3JlZjMiLCJjb250aW51ZVJlcXVlc3QiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsImNvbnRpbnVlR3VhcmQiLCJzc2VQYXJhbXMiLCJfY2FsbGJhY2tzJG9uRXJyb3IzIiwiX3Q1IiwiX2NvbnRleHQzIiwiZ2V0IiwidW5kZWZpbmVkIiwiY29udGludWVUaHJlYWQiLCJvayIsImNvbmNhdCIsInN0YXJ0UmV0cnlTdHJlYW0iLCJfY2FsbGVlNCIsInJldHJ5UmVxdWVzdCIsInJldHJ5R3VhcmQiLCJkZXRhaWwiLCJfY2FsbGJhY2tzJG9uRXJyb3I0IiwiX3Q2IiwiX3Q3IiwiX2NvbnRleHQ0IiwicmV0cnlDb21wbGV0aW9uIiwianNvbiIsInN0b3BTdHJlYW0iLCJfY2FsbGJhY2tzJG9uU3RvcCIsImFib3J0IiwicGFydGlhbFRleHQiLCJnZXRTbmFwc2hvdCIsInRleHQiLCJvblN0b3AiLCJhYm9ydFNpbGVudGx5IiwiX3N0b3JlJGdldE1ldGEzIiwiYWJvcnRBbGwiLCJfdGhpcyIsImZvckVhY2giXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29udGludWUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zdGFudC1jb25kaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgdHlwZSB7IEFwcHJvdmFsUmVxdWVzdCB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQge1xuICBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHksXG4gIGdldFRoaW5raW5nU3RyZWFtQWN0aXZpdHksXG4gIGdldFVzaW5nU2tpbGxBY3Rpdml0eSxcbiAgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5LFxuICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB0eXBlIHsgSGl0bEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkLCBtZXJnZVN0cmVhbUNodW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3NlU3RyZWFtQ29udGVudCdcbmltcG9ydCB7IHJlYXNvbmluZ1N0b3JlIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgdHlwZSB7IFJlYXNvbmluZ1N0ZXBQYXlsb2FkLCBSZWFzb25pbmdUcmFjZVBheWxvYWQgfSBmcm9tICcuLi8uLi90eXBlcy9yZWFzb25pbmcnXG5pbXBvcnQgeyBzZXNzaW9uU3RyZWFtaW5nVGV4dCB9IGZyb20gJy4vc2Vzc2lvblN0cmVhbWluZ1RleHQnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCB9IGZyb20gJy4vc2Vzc2lvbk5vdGlmaWNhdGlvbnMnXG5pbXBvcnQgeyBzZXNzaW9uSGl0bENvbnRleHQgfSBmcm9tICcuL3Nlc3Npb25IaXRsQ29udGV4dCdcbmltcG9ydCB0eXBlIHsgU2Vzc2lvblN0cmVhbUNhbGxiYWNrcywgU3RhcnRTdHJlYW1SZXN1bHQgfSBmcm9tICcuL3Nlc3Npb25zLnR5cGVzJ1xuaW1wb3J0IHtcbiAgYnVpbGRTZXNzaW9uRmluaXNoUGF5bG9hZCxcbiAgaXNBZ2VudFRyYW5zZmVyTm9kZSxcbiAgaXNBcHByb3ZhbFByZUFwcHJvdmVkLFxuICBpc1JldHJ5VHVybk5vdEZvdW5kUmVzcG9uc2UsXG4gIHBhcnNlU3NlQmxvY2ssXG4gIHBhdGNoTWV0YUFnZW50RmllbGRzLFxuICByZXNvbHZlTm9kZVN0cmVhbU1lc3NhZ2UsXG4gIHJlc29sdmVSZWFzb25pbmdTdGVwVG9vbCxcbiAgcmVzb2x2ZVJlYXNvbmluZ1N0ZXBUeXBlLFxuICByZXNvbHZlU3RhcnRTdHJlYW1HdWFyZCxcbiAgcmVzb2x2ZVN0cmVhbVRleHRDaHVuayxcbiAgcmVzb2x2ZVRoaW5raW5nRGVsdGEsXG4gIHNob3VsZEFib3J0U2Vzc2lvblN0cmVhbU9uU3RvcCxcbiAgc2hvdWxkQXBwbHlSZWFzb25pbmdTdGVwSW5kZXgsXG4gIHNob3VsZEFwcGVuZFRoaW5raW5nU3RlcCxcbiAgc2hvdWxkUmVzdW1lSGl0bEFmdGVyUHJlQXBwcm92YWwsXG4gIHNob3VsZFNldElkbGVPblNpbGVudEFib3J0LFxuICBzaG91bGRTaG93UmVhc29uaW5nVG9vbEFjdGl2aXR5LFxuICBzcGxpdFNzZUJ1ZmZlcixcbn0gZnJvbSAnLi9zZXNzaW9uU3RyZWFtTWFuYWdlci5oZWxwZXJzJ1xuXG50eXBlIE9yY2hlc3RyYXRvclJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5vcmNoZXN0cmF0b3I+WzBdXG50eXBlIENvbnRpbnVlVGhyZWFkUmVxdWVzdCA9IFBhcmFtZXRlcnM8dHlwZW9mIG1haWEuT3JjaGVzdHJhdG9yLmNvbnRpbnVlVGhyZWFkPlswXVxudHlwZSBSZXRyeUNvbXBsZXRpb25SZXF1ZXN0ID0gUGFyYW1ldGVyczx0eXBlb2YgbWFpYS5PcmNoZXN0cmF0b3IucmV0cnlDb21wbGV0aW9uPlswXVxuXG4vKiogQ29tcGF0aWJsZSBjb24gZWwgYHRgIGRlIGkxOG5leHQgKHVzbyBkZSB1bmEgc29sYSBrZXkpLiAqL1xudHlwZSBUcmFuc2xhdGVGbiA9IChrZXk6IHN0cmluZykgPT4gc3RyaW5nXG5cbnR5cGUgU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICByZXF1ZXN0OiBPcmNoZXN0cmF0b3JSZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBhY3Rpdml0eU9wdGlvbnM/OiB7XG4gICAgaXNXZWJTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGhhc0F0dGFjaG1lbnRzPzogYm9vbGVhblxuICAgIGF0dGFjaG1lbnRzQ291bnQ/OiBudW1iZXJcbiAgfVxuICBoaXRsRXhlY3V0aW9uQ29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbFxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xufVxuXG50eXBlIFN0YXJ0Q29udGludWVTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICBjb250aW51ZVJlcXVlc3Q6IENvbnRpbnVlVGhyZWFkUmVxdWVzdFxuICBjYWxsYmFja3M6IFNlc3Npb25TdHJlYW1DYWxsYmFja3NcbiAgdDogVHJhbnNsYXRlRm5cbiAgaGl0bEV4ZWN1dGlvbkNvbnRleHQ/OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGxcbiAgYWdlbnRJZD86IHN0cmluZyB8IG51bWJlclxuICBhZ2VudE5hbWU/OiBzdHJpbmdcbn1cblxudHlwZSBTdGFydFJldHJ5U3RyZWFtUGFyYW1zID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBwbGFjZWhvbGRlcklkOiBzdHJpbmdcbiAgcmV0cnlSZXF1ZXN0OiBSZXRyeUNvbXBsZXRpb25SZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBhY3Rpdml0eU9wdGlvbnM/OiB7XG4gICAgaXNXZWJTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGhhc0F0dGFjaG1lbnRzPzogYm9vbGVhblxuICAgIGF0dGFjaG1lbnRzQ291bnQ/OiBudW1iZXJcbiAgfVxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xufVxuXG50eXBlIEFjdGl2ZVN0cmVhbSA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyXG4gIGlzU3RvcHBlZDogYm9vbGVhblxufVxuXG4vKipcbiAqIE3DoXhpbW8gZGUgc2VzaW9uZXMgZ2VuZXJhbmRvIGVuIHBhcmFsZWxvLiBQcm90ZWdlIHJlZC9yZWN1cnNvcyBkZWwgY2xpZW50ZS5cbiAqIEFqdXN0YWJsZSBhIGZ1dHVybyB2w61hIGZsYWcgZGVsIGhvc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TID0gNFxuXG5jb25zdCBTVFJFQU1fVEhST1RUTEVfTVMgPSAxNlxuXG5jb25zdCBhY3RpdmVTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIEFjdGl2ZVN0cmVhbT4oKVxuXG5jb25zdCBzdG9yZSA9ICgpID0+IHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKVxuXG5jb25zdCBpc1N0cmVhbUFjdGl2ZSA9IChzZXNzaW9uSWQ6IHN0cmluZyk6IGJvb2xlYW4gPT4gYWN0aXZlU3RyZWFtcy5oYXMoc2Vzc2lvbklkKVxuXG5jb25zdCBnZXRBY3RpdmVTdHJlYW1Db3VudCA9ICgpOiBudW1iZXIgPT4gYWN0aXZlU3RyZWFtcy5zaXplXG5cbmNvbnN0IHBhcnNlU2Vzc2lvblNTRSA9IGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UsIGFjdGl2ZTogQWN0aXZlU3RyZWFtLCBwYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCBjYWxsYmFja3MsIHQgfSA9IHBhcmFtc1xuXG4gIGxldCBwZW5kaW5nQ29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IHRocm90dGxlVGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgY29uc3QgZmx1c2hUb1N0b3JlcyA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zZXRUZXh0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGVudClcbiAgICBjYWxsYmFja3Mub25TdHJlYW1VcGRhdGU/Lihjb250ZW50KVxuICB9XG5cbiAgY29uc3QgZW1pdFRocm90dGxlZCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBwZW5kaW5nQ29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSByZXR1cm5cbiAgICB0aHJvdHRsZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICAgIGlmIChwZW5kaW5nQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICBmbHVzaFRvU3RvcmVzKHRvRW1pdClcbiAgICAgIH1cbiAgICB9LCBTVFJFQU1fVEhST1RUTEVfTVMpXG4gIH1cblxuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAoKSA9PiB7XG4gICAgaWYgKHRocm90dGxlVGltZXIgIT0gbnVsbCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aHJvdHRsZVRpbWVyKVxuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpXG4gIGlmICghcmVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWFkZXIgYXZhaWxhYmxlJylcbiAgfVxuXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICBsZXQgYnVmZmVyID0gJydcbiAgbGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gIGxldCBoYXNTdGFydGVkV3JpdGluZyA9IGZhbHNlXG4gIC8vIFwiVXNhbmRvIFNraWxsXCIgcXVlZGEgdmlzaWJsZSBtaWVudHJhcyBlbCBtb2RlbG8gcGllbnNhIGNvbiBsYSBza2lsbCBjYXJnYWRhO1xuICAvLyBsb3MgZGVsdGFzIGRlIGB0aGlua2luZ2Agbm8gbG8gcGlzYW4gaGFzdGEgbGEgcHLDs3hpbWEgYWNjacOzbiBvIGVsIHByaW1lciB0b2tlbi5cbiAgbGV0IGlzVXNpbmdTa2lsbCA9IGZhbHNlXG5cbiAgY29uc3Qgc2V0VGhpbmtpbmdBY3Rpdml0eSA9ICgpID0+IHtcbiAgICBjb25zdCB0aGlua2luZ0FjdGl2aXR5ID0gZ2V0VGhpbmtpbmdTdHJlYW1BY3Rpdml0eSh0KVxuICAgIGNvbnN0IGN1cnJlbnQgPSBzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RyZWFtQWN0aXZpdHlcbiAgICBpZiAoY3VycmVudD8ucGhhc2UgPT09ICd0aGlua2luZycgJiYgY3VycmVudC5tZXNzYWdlID09PSB0aGlua2luZ0FjdGl2aXR5Lm1lc3NhZ2UpIHJldHVyblxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIHRoaW5raW5nQWN0aXZpdHkpXG4gIH1cblxuICBjb25zdCBlbnN1cmVXcml0aW5nU3RhcnRlZCA9ICgpID0+IHtcbiAgICAvLyBDdWFscXVpZXIgdG9rZW4gY29ydGEgXCJVc2FuZG8gU2tpbGxcIjogZWwgaW5kaWNhZG9yIHZ1ZWx2ZSBhIGFsdGVybmFyIHBlbnNhbmRvIC8gZXNjcmliaWVuZG8uXG4gICAgaXNVc2luZ1NraWxsID0gZmFsc2VcbiAgICBpZiAoIWhhc1N0YXJ0ZWRXcml0aW5nKSB7XG4gICAgICBoYXNTdGFydGVkV3JpdGluZyA9IHRydWVcbiAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUsIGlzV3JpdGluZzogdHJ1ZSB9KVxuICAgICAgY2FsbGJhY2tzLm9uU3RhcnRXcml0aW5nPy4oKVxuICAgIH1cbiAgICBjb25zdCBjdXJyZW50ID0gc3RvcmUoKS5nZXRNZXRhKHNlc3Npb25JZCk/LnN0cmVhbUFjdGl2aXR5XG4gICAgaWYgKGN1cnJlbnQ/LnBoYXNlICE9PSAnd3JpdGluZycpIHtcbiAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUsIGlzV3JpdGluZzogdHJ1ZSB9KVxuICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnd3JpdGluZycpXG4gICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ2h1bmsgPSAoY2h1bms6IHN0cmluZykgPT4ge1xuICAgIGlmICghY2h1bmspIHJldHVyblxuICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjaHVuaylcbiAgICByZWFzb25pbmdTdG9yZS5zeW5jTGl2ZU5hcnJhdGlvbihwbGFjZWhvbGRlcklkLCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgZW1pdFRocm90dGxlZChhY2N1bXVsYXRlZENvbnRlbnQpXG4gIH1cblxuICBjb25zdCBjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCA9ICgpID0+IHtcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRocm90dGxlVGltZXIpXG4gICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgIH1cbiAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICBhY2N1bXVsYXRlZENvbnRlbnQgPSAnJ1xuICAgIGZsdXNoVG9TdG9yZXMoJycpXG4gICAgcmVhc29uaW5nU3RvcmUubWFya0Fuc3dlclJlc2V0KHBsYWNlaG9sZGVySWQpXG4gIH1cblxuICBjb25zdCBhcHBseVN0cmVhbUNvbXBsZXRlID0gKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY29uc3QgZmluaXNoUGF5bG9hZCA9IGJ1aWxkU2Vzc2lvbkZpbmlzaFBheWxvYWQocGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuXG4gICAgcmVhc29uaW5nU3RvcmUuZmluaXNoKHBsYWNlaG9sZGVySWQsIGZpbmlzaFBheWxvYWQucmVhc29uaW5nKVxuICAgIGZsdXNoUGVuZGluZygpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdjb21wbGV0ZScpXG5cbiAgICBjYWxsYmFja3Mub25GaW5pc2hTdHJlYW0/LihmaW5pc2hQYXlsb2FkKVxuXG4gICAgLy8gRWwgdGV4dG8gZW4gdml2byBOTyBzZSBsaW1waWEgYWPDoSBhIHByb3DDs3NpdG8uIEVsIHBsYWNlaG9sZGVyIHNlIHZhIGNvbiBlbFxuICAgIC8vIGBkcm9wYCBxdWUgaGFjZSBlbCBjb25zdW1pZG9yLCB5IGNvbiDDqWwgc3Ugc3VzY3JpcGNpw7NuOyB2YWNpYXJsbyBhbnRlcyBsb1xuICAgIC8vIGRlamFiYSBtb250YWRvIHkgc2luIHRleHRvIChhbHR1cmEgMCkgZHVyYW50ZSB+MjVtczogZWwgZmxpY2tlciBkZSBmaW4gZGVcbiAgICAvLyBzdHJlYW0uIE5vIGFsY2FuemEgY29uIGRpZmVyaXJsbywgcG9ycXVlIGVzdGUgY2xlYXIgdmlhamEgZW4gU3luY0xhbmVcbiAgICAvLyAoc3RvcmUgZXh0ZXJubykgeSBlbCBzd2FwIGRlIG1lbnNhamVzIGVuIERlZmF1bHRMYW5lLCBhc8OtIHF1ZSBzaWVtcHJlIHNlXG4gICAgLy8gY3VlbGEgZW4gZWwgbWVkaW8uIEVsIHNsb3Qgc2UgbGliZXJhIGVuIGVsIHByw7N4aW1vIGBzdGFydCgpYCBkZSBsYSBzZXNpw7NuLFxuICAgIC8vIHkgZW4gc3RvcC9lcnJvci9hcHByb3ZhbC9jYW1iaW8gZGUgc2VzacOzbiwgcXVlIHPDrSBsbGFtYW4gYGNsZWFyYC5cbiAgfVxuXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChzaG91bGRBYm9ydFNlc3Npb25TdHJlYW1PblN0b3AoYWN0aXZlLmlzU3RvcHBlZCkpIHtcbiAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICAgIGlmIChkb25lKSBicmVha1xuXG4gICAgICBpZiAoc2hvdWxkQWJvcnRTZXNzaW9uU3RyZWFtT25TdG9wKGFjdGl2ZS5pc1N0b3BwZWQpKSB7XG4gICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICBjb25zdCB7IGJsb2NrcywgcmVtYWluZGVyIH0gPSBzcGxpdFNzZUJ1ZmZlcihidWZmZXIpXG4gICAgICBidWZmZXIgPSByZW1haW5kZXJcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGJsb2Nrcykge1xuICAgICAgICBjb25zdCBwYXJzZWRCbG9jayA9IHBhcnNlU3NlQmxvY2sobGluZSlcbiAgICAgICAgaWYgKCFwYXJzZWRCbG9jaykgY29udGludWVcblxuICAgICAgICBjb25zdCB7IGV2ZW50VHlwZSwgZGF0YVN0ciB9ID0gcGFyc2VkQmxvY2tcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGRhdGFTdHIpXG5cbiAgICAgICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAndGhpbmtpbmcnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGRlbHRhOiB0aGlua2luZ0RlbHRhIH0gPSByZXNvbHZlVGhpbmtpbmdEZWx0YShkYXRhKVxuICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kVGhpbmtpbmdTdGVwKGluZGV4LCB0aGlua2luZ0RlbHRhKSkge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmFwcGVuZFRoaW5raW5nKHBsYWNlaG9sZGVySWQsIGluZGV4LCB0aGlua2luZ0RlbHRhKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIE1pZW50cmFzIGR1cmEgXCJVc2FuZG8gU2tpbGxcIiBsb3MgZGVsdGFzIGRlIHRoaW5raW5nIG5vIHBpc2FuIGxhIGFjdGl2aWRhZC5cbiAgICAgICAgICAgICAgaWYgKCFpc1VzaW5nU2tpbGwpIHtcbiAgICAgICAgICAgICAgICBzZXRUaGlua2luZ0FjdGl2aXR5KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lsbCBALW1lbmNpb25hZGEgKGFsIGFicmlyIGVsIHN0cmVhbSkgbyBsbGFtYWRhIGEgYGdldF9za2lsbGAuXG4gICAgICAgICAgICBjYXNlICd1c2luZ19za2lsbCc6XG4gICAgICAgICAgICAgIGlmICghaGFzU3RhcnRlZFdyaXRpbmcpIHtcbiAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSB0cnVlXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0VXNpbmdTa2lsbEFjdGl2aXR5KHQsIGRhdGEuc2tpbGwpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIC8vIEVsIGJhY2tlbmQgZGVzY2FydGEgbG8gZW1pdGlkbyB5IHJlaW5pY2lhIGxhIHJlc3B1ZXN0YSBkZXNkZSBjZXJvLlxuICAgICAgICAgICAgY2FzZSAnYW5zd2VyX3Jlc2V0JzpcbiAgICAgICAgICAgICAgY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQoKVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdyZWFzb25pbmdfc3RlcCc6IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2wgPSByZXNvbHZlUmVhc29uaW5nU3RlcFRvb2woZGF0YSlcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcFR5cGUgPSByZXNvbHZlUmVhc29uaW5nU3RlcFR5cGUoZGF0YSlcbiAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3dSZWFzb25pbmdUb29sQWN0aXZpdHkoc3RlcFRvb2wsIHN0ZXBUeXBlLCBkYXRhLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSBzdGVwVG9vbCA9PT0gJ2dldF9za2lsbCdcbiAgICAgICAgICAgICAgICBpZiAoaXNVc2luZ1NraWxsKSB7XG4gICAgICAgICAgICAgICAgICAvLyBFbCBzdGVwIGRlIGBnZXRfc2tpbGxgIGxsZWdhIGp1c3RvIGRlc3B1w6lzIGRlIGB1c2luZ19za2lsbGA6IG1hbnRpZW5lIGVsIG5vbWJyZS5cbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRVc2luZ1NraWxsQWN0aXZpdHkodCwgZGF0YS5hcmdzPy5uYW1lKSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2V0VGhpbmtpbmdBY3Rpdml0eSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzaG91bGRBcHBseVJlYXNvbmluZ1N0ZXBJbmRleChkYXRhLmkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcEluZGV4ID0gZGF0YS5pXG4gICAgICAgICAgICAgICAgcmVhc29uaW5nU3RvcmUuY2FwdHVyZUxlYWRpbmdGcm9tQm9keShwbGFjZWhvbGRlcklkLCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICAgICAgICAgICAgcmVhc29uaW5nU3RvcmUuYXBwbHlTdGVwKHBsYWNlaG9sZGVySWQsIHsgLi4uZGF0YSwgaTogc3RlcEluZGV4IH0gYXMgUmVhc29uaW5nU3RlcFBheWxvYWQpXG4gICAgICAgICAgICAgICAgaWYgKHJlYXNvbmluZ1N0b3JlLnNob3VsZENsZWFyU3RyZWFtRm9yTGVhZGluZyhwbGFjZWhvbGRlcklkLCBhY2N1bXVsYXRlZENvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICBjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3Rva2VuJzoge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHJlc29sdmVTdHJlYW1UZXh0Q2h1bmsoZGF0YSlcbiAgICAgICAgICAgICAgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQoKVxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdjb250ZW50Jzoge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHJlc29sdmVTdHJlYW1UZXh0Q2h1bmsoZGF0YSlcbiAgICAgICAgICAgICAgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQoKVxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Db21wbGV0ZShkYXRhKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSBmYWxzZVxuICAgICAgICAgICAgICBpZiAoaXNBZ2VudFRyYW5zZmVyTm9kZShkYXRhKSB8fCByZXNvbHZlTm9kZVN0cmVhbU1lc3NhZ2UoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBzZXRUaGlua2luZ0FjdGl2aXR5KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnYXBwcm92YWxfcmVxdWlyZWQnOiB7XG4gICAgICAgICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgICAgICAgIC8vIFByZWFwcm9iYWRvIChhdXRvLWFwcHJvdmUgbyBkZXRlY2Npw7NuIG1hbnVhbCk6IGVsIHN0cmVhbSBubyBzZSBjb3J0YSxcbiAgICAgICAgICAgICAgLy8gc2lndWUgZWplY3V0YW5kbyBsYXMgYWNjaW9uZXMgc2luIGVzcGVyYXIgZGVjaXNpw7NuIGRlbCB1c3VhcmlvLlxuICAgICAgICAgICAgICBjb25zdCBpc1ByZUFwcHJvdmVkID0gaXNBcHByb3ZhbFByZUFwcHJvdmVkKGRhdGEpXG4gICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIGlmICghaXNQcmVBcHByb3ZlZCkge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmZpbmlzaChwbGFjZWhvbGRlcklkLCAoZGF0YS5yZWFzb25pbmcgYXMgUmVhc29uaW5nVHJhY2VQYXlsb2FkIHwgbnVsbCkgPz8gbnVsbClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdhd2FpdGluZ19hcHByb3ZhbCcpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkFwcHJvdmFsUmVxdWlyZWQ/LihkYXRhIGFzIEFwcHJvdmFsUmVxdWVzdCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICBpZiAoc2hvdWxkUmVzdW1lSGl0bEFmdGVyUHJlQXBwcm92YWwoaXNQcmVBcHByb3ZlZCwgZGF0YS5wZW5kaW5nX2FjdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgc2V0VGhpbmtpbmdBY3Rpdml0eSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTU0UgRXJyb3I6JywgZGF0YS5lcnJvcilcbiAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nKClcbiAgICAgICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRFcnJvcihzZXNzaW9uSWQsIHsgdHlwZTogZGF0YS5lcnJvcj8udHlwZSwgbWVzc2FnZTogZGF0YS5lcnJvcj8ubWVzc2FnZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oZGF0YS5lcnJvcj8udHlwZSwgZGF0YS5lcnJvcj8ubWVzc2FnZSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIFNTRSBldmVudCB0eXBlOicsIGV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hQZW5kaW5nKClcbiAgfVxufVxuXG4vKipcbiAqIE1hbmFnZXIgc2luZ2xldG9uIChtb2R1bGUtbGV2ZWwpIHF1ZSBjb3JyZSBOIHN0cmVhbXMgZGVsIG9yY2hlc3RyYXRvciBlblxuICogcGFyYWxlbG8sIHVubyBwb3IgYHNlc3Npb25JZGAuIFNvYnJldml2ZSBhIGNhbWJpb3MgZGUgdmlzdGEgeSBhbCBjaWVycmUgZGVsXG4gKiBtb2RhbDogbG9zIHN0cmVhbXMgc29sbyBzZSBjYW5jZWxhbiBjb24gc3RvcCBleHBsw61jaXRvIGRlbCB1c3VhcmlvIG8gYWxcbiAqIGNvbXBsZXRhci9lcnJvcmFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vzc2lvblN0cmVhbU1hbmFnZXIgPSB7XG4gIGlzQWN0aXZlOiBpc1N0cmVhbUFjdGl2ZSxcbiAgZ2V0QWN0aXZlQ291bnQ6IGdldEFjdGl2ZVN0cmVhbUNvdW50LFxuICBnZXRBY3RpdmVTZXNzaW9uSWRzOiAoKTogc3RyaW5nW10gPT4gQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSksXG5cbiAgYXN5bmMgc3RhcnRTdHJlYW0ocGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+IHtcbiAgICBlbnN1cmVTZXNzaW9uTm90aWZpY2F0aW9uc0luaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCByZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGNvbnN0IHN0YXJ0R3VhcmQgPSByZXNvbHZlU3RhcnRTdHJlYW1HdWFyZChcbiAgICAgIGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCksXG4gICAgICBnZXRBY3RpdmVTdHJlYW1Db3VudCgpLFxuICAgICAgTUFYX0NPTkNVUlJFTlRfU1RSRUFNU1xuICAgIClcbiAgICBpZiAoIXN0YXJ0R3VhcmQuYWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogc3RhcnRHdWFyZC5yZWFzb24gfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBjb25zdCBhY3RpdmU6IEFjdGl2ZVN0cmVhbSA9IHsgc2Vzc2lvbklkLCBjb250cm9sbGVyLCBpc1N0b3BwZWQ6IGZhbHNlIH1cbiAgICBhY3RpdmVTdHJlYW1zLnNldChzZXNzaW9uSWQsIGFjdGl2ZSlcblxuICAgIHN0b3JlKCkuZW5zdXJlU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7XG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICBpc1dyaXRpbmc6IGZhbHNlLFxuICAgICAgLi4ucGF0Y2hNZXRhQWdlbnRGaWVsZHMoYWdlbnRJZCwgYWdlbnROYW1lKSxcbiAgICB9KVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQpXG4gICAgcmVhc29uaW5nU3RvcmUuc3RhcnQocGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5vcmNoZXN0cmF0b3IocmVxdWVzdCwgY29udHJvbGxlci5zaWduYWwpXG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgcGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXJ0ZWQ6IHRydWUgfVxuICB9LFxuXG4gIC8qKiBSZXN1bWUgSElUTCAoYGNvbnRpbnVlLXRocmVhZGApIGtleWVkIHBvciBzZXNzaW9uSWQg4oCUIG1pc21vIG1vdG9yIHF1ZSBvcmNoZXN0cmF0b3IuICovXG4gIGFzeW5jIHN0YXJ0Q29udGludWVTdHJlYW0ocGFyYW1zOiBTdGFydENvbnRpbnVlU3RyZWFtUGFyYW1zKTogUHJvbWlzZTxTdGFydFN0cmVhbVJlc3VsdD4ge1xuICAgIGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNvbnRpbnVlUmVxdWVzdCwgY2FsbGJhY2tzLCB0LCBoaXRsRXhlY3V0aW9uQ29udGV4dCwgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGNvbnN0IGNvbnRpbnVlR3VhcmQgPSByZXNvbHZlU3RhcnRTdHJlYW1HdWFyZChcbiAgICAgIGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCksXG4gICAgICBnZXRBY3RpdmVTdHJlYW1Db3VudCgpLFxuICAgICAgTUFYX0NPTkNVUlJFTlRfU1RSRUFNU1xuICAgIClcbiAgICBpZiAoIWNvbnRpbnVlR3VhcmQuYWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogY29udGludWVHdWFyZC5yZWFzb24gfVxuICAgIH1cblxuICAgIGlmIChoaXRsRXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgc2Vzc2lvbkhpdGxDb250ZXh0LnNldChzZXNzaW9uSWQsIGhpdGxFeGVjdXRpb25Db250ZXh0KVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBjb25zdCBhY3RpdmU6IEFjdGl2ZVN0cmVhbSA9IHsgc2Vzc2lvbklkLCBjb250cm9sbGVyLCBpc1N0b3BwZWQ6IGZhbHNlIH1cbiAgICBhY3RpdmVTdHJlYW1zLnNldChzZXNzaW9uSWQsIGFjdGl2ZSlcblxuICAgIHN0b3JlKCkuZW5zdXJlU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7XG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICBpc1dyaXRpbmc6IGZhbHNlLFxuICAgICAgLi4ucGF0Y2hNZXRhQWdlbnRGaWVsZHMoYWdlbnRJZCwgYWdlbnROYW1lKSxcbiAgICB9KVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQpXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5KHQsIGhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKSA/PyB1bmRlZmluZWQpXG4gICAgKVxuXG4gICAgY29uc3Qgc3NlUGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyA9IHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICByZXF1ZXN0OiB7fSBhcyBPcmNoZXN0cmF0b3JSZXF1ZXN0LFxuICAgICAgY2FsbGJhY2tzLFxuICAgICAgdCxcbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0OiBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyBzZXNzaW9uSGl0bENvbnRleHQuZ2V0KHNlc3Npb25JZCksXG4gICAgICBhZ2VudElkLFxuICAgICAgYWdlbnROYW1lLFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLmNvbnRpbnVlVGhyZWFkKGNvbnRpbnVlUmVxdWVzdCwgY29udHJvbGxlci5zaWduYWwpXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29udGludWUtdGhyZWFkIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBzc2VQYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgICBzZXNzaW9uSGl0bENvbnRleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXJ0ZWQ6IHRydWUgfVxuICB9LFxuXG4gIC8qKiBSZWdlbmVyYSBsYSByZXNwdWVzdGEgZGUgdW4gdHVybm8gKGByZXRyeV9jb21wbGV0aW9uYCkg4oCUIG1pc21vIG1vdG9yIFNTRSBxdWUgb3JjaGVzdHJhdG9yLiAqL1xuICBhc3luYyBzdGFydFJldHJ5U3RyZWFtKHBhcmFtczogU3RhcnRSZXRyeVN0cmVhbVBhcmFtcyk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+IHtcbiAgICBlbnN1cmVTZXNzaW9uTm90aWZpY2F0aW9uc0luaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCByZXRyeVJlcXVlc3QsIGNhbGxiYWNrcywgdCwgYWN0aXZpdHlPcHRpb25zLCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgY29uc3QgcmV0cnlHdWFyZCA9IHJlc29sdmVTdGFydFN0cmVhbUd1YXJkKFxuICAgICAgaXNTdHJlYW1BY3RpdmUoc2Vzc2lvbklkKSxcbiAgICAgIGdldEFjdGl2ZVN0cmVhbUNvdW50KCksXG4gICAgICBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TXG4gICAgKVxuICAgIGlmICghcmV0cnlHdWFyZC5hbGxvd2VkKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiByZXRyeUd1YXJkLnJlYXNvbiB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi5wYXRjaE1ldGFBZ2VudEZpZWxkcyhhZ2VudElkLCBhZ2VudE5hbWUpLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICBjb25zdCBzc2VQYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIHJlcXVlc3Q6IHt9IGFzIE9yY2hlc3RyYXRvclJlcXVlc3QsXG4gICAgICBjYWxsYmFja3MsXG4gICAgICB0LFxuICAgICAgYWN0aXZpdHlPcHRpb25zLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24ocmV0cnlSZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgbGV0IGRldGFpbDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRldGFpbD86IHN0cmluZyB9XG4gICAgICAgICAgICBkZXRhaWwgPSB0eXBlb2YgZGF0YS5kZXRhaWwgPT09ICdzdHJpbmcnID8gZGF0YS5kZXRhaWwgOiB1bmRlZmluZWRcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNSZXRyeVR1cm5Ob3RGb3VuZFJlc3BvbnNlKHJlc3BvbnNlLnN0YXR1cywgZGV0YWlsKSkge1xuICAgICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UsIHBsYWNlaG9sZGVySWQ6IG51bGwgfSlcbiAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnaWRsZScpXG4gICAgICAgICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgICAgICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAndHVybl9ub3RfZm91bmQnIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXRyeV9jb21wbGV0aW9uIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBzc2VQYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIENhbmNlbGFjacOzbiBleHBsw61jaXRhIGRlbCB1c3VhcmlvIChtZW5zYWplIFwiY2FuY2VsYWRvXCIpLiAqL1xuICBzdG9wU3RyZWFtKHNlc3Npb25JZDogc3RyaW5nLCBjYWxsYmFja3M/OiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzKSB7XG4gICAgY29uc3QgYWN0aXZlID0gYWN0aXZlU3RyZWFtcy5nZXQoc2Vzc2lvbklkKVxuICAgIGlmICghYWN0aXZlKSByZXR1cm5cbiAgICBhY3RpdmUuaXNTdG9wcGVkID0gdHJ1ZVxuICAgIGFjdGl2ZS5jb250cm9sbGVyLmFib3J0KClcbiAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgLy8gRWwgcGFyY2lhbCBzZSByZXNjYXRhIGFudGVzIGRlIGxpbXBpYXI6IGVsIGJhY2tlbmQgbG8gcGVyc2lzdGUsIHBlcm8gc2kgbm8gbG9cbiAgICAvLyBwYXNhbW9zIGFsIGNhbGxiYWNrIGRlc2FwYXJlY2UgZGUgcGFudGFsbGEgaGFzdGEgZWwgcHLDs3hpbW8gZmV0Y2ggZGUgbGEgc2VzacOzbi5cbiAgICBjb25zdCBwYXJ0aWFsVGV4dCA9IHNlc3Npb25TdHJlYW1pbmdUZXh0LmdldFNuYXBzaG90KHNlc3Npb25JZCkudGV4dFxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2NhbmNlbGxlZCcpXG4gICAgY2FsbGJhY2tzPy5vblN0b3A/LihwYXJ0aWFsVGV4dClcbiAgfSxcblxuICAvKiogQWJvcnRhIHNpbiBtYXJjYXIgXCJjYW5jZWxhZG9cIiAodXNvIGludGVybm8gLyBsaW1waWV6YSkuICovXG4gIGFib3J0U2lsZW50bHkoc2Vzc2lvbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICBpZiAoc2hvdWxkU2V0SWRsZU9uU2lsZW50QWJvcnQoc3RvcmUoKS5nZXRNZXRhKHNlc3Npb25JZCk/LnN0YXR1cykpIHtcbiAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2lkbGUnKVxuICAgIH1cbiAgfSxcblxuICBhYm9ydEFsbCgpIHtcbiAgICBBcnJheS5mcm9tKGFjdGl2ZVN0cmVhbXMua2V5cygpKS5mb3JFYWNoKHNlc3Npb25JZCA9PiB0aGlzLmFib3J0U2lsZW50bHkoc2Vzc2lvbklkKSlcbiAgfSxcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPQSxJQUFJLE1BQU0scUJBQXFCO0FBRXRDLFNBQ0VDLHdCQUF3QixFQUN4QkMseUJBQXlCLEVBQ3pCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsZ0NBQWdDLFFBQzNCLG9DQUFvQztBQUUzQyxTQUFTQyx3QkFBd0IsRUFBRUMsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQ3pGLFNBQVNDLGNBQWMsUUFBUSwrQkFBK0I7QUFFOUQsU0FBU0Msb0JBQW9CLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNyRCxTQUFTQyxxQ0FBcUMsUUFBUSx3QkFBd0I7QUFDOUUsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQXNCO0FBRXpELFNBQ0VDLHlCQUF5QixFQUN6QkMs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