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